mcp-ticketer 0.1.30__tar.gz → 0.1.33__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.
Potentially problematic release.
This version of mcp-ticketer might be problematic. Click here for more details.
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CHANGELOG.md +24 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/PKG-INFO +1 -1
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/__version__.py +1 -1
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/diagnostics.py +244 -41
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/config.py +93 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/PKG-INFO +1 -1
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/SOURCES.txt +0 -1
- mcp_ticketer-0.1.30/test_diagnostics_mcp.py +0 -155
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/.dependency_cache +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/.mpm_deployment_state +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/agent-manager.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/agentic-coder-optimizer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/api_qa.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/clerk-ops.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/code_analyzer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/content-agent.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/dart_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/data_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/documentation.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/gcp_ops_agent.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/golang_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/imagemagick.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/java_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/local_ops_agent.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/memory_manager.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/nextjs_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/ops.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/php-engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/product_owner.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/project_organizer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/prompt-engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/python_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/qa.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/react_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/refactoring_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/research.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/ruby-engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/rust_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/security.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/ticketing.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/typescript_engineer.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/vercel_ops_agent.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/version_control.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/web_qa.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/web_ui.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/mcp.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/mcp.local.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/config/project.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/mcp_auto_config_preference.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/README.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/agentic_coder_optimizer_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/documentation_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/engineer_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/ops_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/project_knowledge_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/qa_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/research_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/version-control_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/workflows_memories.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.coveragerc +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.env.example +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.github/workflows/docs.yml +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.github/workflows/publish.yml +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.github/workflows/test.yml +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.mcp/config.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.pre-commit-config.yaml +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.python-version +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.readthedocs.yaml +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CLAUDE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CLAUDE_DESKTOP_SETUP.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CODEX_INTEGRATION.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CODE_STRUCTURE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CONFIG_RESOLUTION_FIX.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CONTRIBUTING.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CREDENTIAL_VALIDATION_FIX.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/DIAGNOSTICS_FEATURE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/ENV_DISCOVERY_COMPLETE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/JIRA_SETUP.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/LICENSE +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/LINEAR_SETUP.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/MANIFEST.in +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/Makefile +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/OPTIMIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/QUEUE_SYSTEM.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/QUICK_START.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/README.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/RELEASE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/RELEASING.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/SECURITY_SCAN_REPORT_v0.1.24.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/TEST_COVERAGE_REPORT.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/TEST_REPORT.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/TEST_RESULTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/VERIFICATION_RESULTS.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/claude-desktop-config.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/debug_search.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/debug_test.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/ADAPTERS.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/AI_CLIENT_INTEGRATION.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/API_REFERENCE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/CONFIGURATION.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/DEVELOPER_GUIDE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/ENV_DISCOVERY.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/MCP_INTEGRATION.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/MIGRATION_GUIDE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/PROJECT_CONFIG.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/PR_INTEGRATION.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/QUICK_START_ENV.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/USER_GUIDE.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_archive/README.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/adapters/github.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/adapters.rst.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/api.rst.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/cli.rst.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/development.rst.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/examples.rst.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/index.rst.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/installation.rst.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/adapters/github.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/adapters.rst +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/api.rst +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/cli.rst +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/conf.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/development.rst +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/examples.rst +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/index.rst +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/installation.rst +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/prd/mcp-ticketer-prd.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/requirements.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/install.sh +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/mcp-ticketer +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/mcp-ticketer-server +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/mcp_server.sh +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/pyproject.toml +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/pytest.ini +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/requirements-dev.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/requirements.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/scripts/README.md +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/scripts/manage_version.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/setup.cfg +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/setup.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/aitrackdown.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/github.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/hybrid.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/jira.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/linear.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cache/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cache/memory.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/codex_configure.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/configure.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/discover.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/gemini_configure.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/main.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/mcp_configure.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/migrate_config.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/queue_commands.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/simple_health.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/utils.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/adapter.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/env_discovery.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/http_client.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/mappers.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/models.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/project_config.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/registry.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/mcp/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/mcp/server.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/py.typed +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/__main__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/health_monitor.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/manager.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/queue.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/run_worker.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/ticket_registry.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/worker.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/requires.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test-tickets/tickets/task-20250924002724.json +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_all_adapters.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_api_usage.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_basic.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_codex_config.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_comprehensive.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_config_resolution.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_credential_validation.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_error_handling.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_github.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_github_token.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_jira.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_linear.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_linear_native.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_linear_teams.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_mcp_server_qa.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_optimizations.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_performance.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_pr_functionality.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_queue_system.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_serve_config.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_set_command.sh +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/adapters/__init__.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/adapters/test_aitrackdown.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/conftest.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/core/test_env_discovery.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/e2e/test_complete_workflow.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/e2e/test_hierarchy_validation.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/e2e/test_state_transitions.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/test_base_adapter.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/test_models.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/test_queue.py +0 -0
- {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tox.ini +0 -0
|
@@ -6,6 +6,30 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.1.31] - 2025-10-24
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- **CRITICAL: Configuration System Integration**: Fixed the root cause of the "60% failure rate" issue
|
|
13
|
+
- Configuration system now properly integrates with environment discovery
|
|
14
|
+
- Automatic fallback to aitrackdown adapter when no config files exist
|
|
15
|
+
- Environment variable detection and adapter auto-configuration
|
|
16
|
+
- Zero-configuration operation for new users on Linux systems
|
|
17
|
+
- **Queue System Reliability**: Eliminated "0 adapters" failures that caused queue operations to fail
|
|
18
|
+
- Queue operations now have a working adapter (aitrackdown fallback) in all environments
|
|
19
|
+
- Reduced failure rate from 60% to near-zero for basic operations
|
|
20
|
+
- Improved error handling when no explicit configuration is provided
|
|
21
|
+
|
|
22
|
+
### Enhanced
|
|
23
|
+
- **User Experience**: System now works out-of-the-box without requiring manual configuration
|
|
24
|
+
- **Linux Compatibility**: Resolved configuration issues specific to Linux environments
|
|
25
|
+
- **Automatic Adapter Discovery**: Intelligent detection of available adapters from environment
|
|
26
|
+
|
|
27
|
+
### Technical Details
|
|
28
|
+
- Added `_discover_from_environment()` method to configuration loader
|
|
29
|
+
- Integrated environment discovery system with main configuration flow
|
|
30
|
+
- Automatic aitrackdown fallback ensures system always has a working adapter
|
|
31
|
+
- Improved logging to show when fallback configuration is being used
|
|
32
|
+
|
|
9
33
|
## [0.1.30] - 2025-10-24
|
|
10
34
|
|
|
11
35
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.33
|
|
4
4
|
Summary: Universal ticket management interface for AI agents with MCP support
|
|
5
5
|
Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
6
6
|
Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
@@ -18,22 +18,50 @@ from rich.text import Text
|
|
|
18
18
|
def safe_import_config():
|
|
19
19
|
"""Safely import configuration with fallback."""
|
|
20
20
|
try:
|
|
21
|
-
from ..core.config import get_config
|
|
22
|
-
|
|
21
|
+
from ..core.config import get_config as real_get_config
|
|
22
|
+
|
|
23
|
+
# Test if the real config system works
|
|
24
|
+
try:
|
|
25
|
+
config = real_get_config()
|
|
26
|
+
# If we get here, the real config system is working
|
|
27
|
+
return real_get_config
|
|
28
|
+
except Exception:
|
|
29
|
+
# Real config system failed, use fallback
|
|
30
|
+
pass
|
|
31
|
+
|
|
23
32
|
except ImportError:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
# Create a minimal config fallback
|
|
36
|
+
class MockConfig:
|
|
37
|
+
def get_enabled_adapters(self):
|
|
38
|
+
# Try to detect adapters from environment even in fallback
|
|
39
|
+
import os
|
|
40
|
+
adapters = {}
|
|
41
|
+
|
|
42
|
+
# Check for environment variables
|
|
43
|
+
if os.getenv("LINEAR_API_KEY"):
|
|
44
|
+
adapters["linear"] = {"type": "linear", "enabled": True}
|
|
45
|
+
if os.getenv("GITHUB_TOKEN"):
|
|
46
|
+
adapters["github"] = {"type": "github", "enabled": True}
|
|
47
|
+
if os.getenv("JIRA_SERVER"):
|
|
48
|
+
adapters["jira"] = {"type": "jira", "enabled": True}
|
|
28
49
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
# Always include aitrackdown as fallback
|
|
51
|
+
if not adapters:
|
|
52
|
+
adapters["aitrackdown"] = {"type": "aitrackdown", "enabled": True}
|
|
53
|
+
|
|
54
|
+
return adapters
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def default_adapter(self):
|
|
58
|
+
adapters = self.get_enabled_adapters()
|
|
59
|
+
return list(adapters.keys())[0] if adapters else "aitrackdown"
|
|
32
60
|
|
|
33
|
-
|
|
34
|
-
|
|
61
|
+
def get_config():
|
|
62
|
+
return MockConfig()
|
|
35
63
|
|
|
36
|
-
|
|
64
|
+
return get_config
|
|
37
65
|
|
|
38
66
|
def safe_import_registry():
|
|
39
67
|
"""Safely import adapter registry with fallback."""
|
|
@@ -51,17 +79,32 @@ def safe_import_registry():
|
|
|
51
79
|
def safe_import_queue_manager():
|
|
52
80
|
"""Safely import queue manager with fallback."""
|
|
53
81
|
try:
|
|
54
|
-
from ..queue.manager import QueueManager
|
|
55
|
-
|
|
82
|
+
from ..queue.manager import QueueManager as RealQueueManager
|
|
83
|
+
|
|
84
|
+
# Test if the real queue manager works
|
|
85
|
+
try:
|
|
86
|
+
qm = RealQueueManager()
|
|
87
|
+
# Test a basic operation
|
|
88
|
+
qm.get_worker_status()
|
|
89
|
+
return RealQueueManager
|
|
90
|
+
except Exception:
|
|
91
|
+
# Real queue manager failed, use fallback
|
|
92
|
+
pass
|
|
93
|
+
|
|
56
94
|
except ImportError:
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
class MockQueueManager:
|
|
98
|
+
def get_worker_status(self):
|
|
99
|
+
return {"running": False, "pid": None, "status": "fallback_mode"}
|
|
60
100
|
|
|
61
|
-
|
|
62
|
-
|
|
101
|
+
def get_queue_stats(self):
|
|
102
|
+
return {"total": 0, "failed": 0, "pending": 0, "completed": 0}
|
|
63
103
|
|
|
64
|
-
|
|
104
|
+
def health_check(self):
|
|
105
|
+
return {"status": "degraded", "score": 50, "details": "Running in fallback mode"}
|
|
106
|
+
|
|
107
|
+
return MockQueueManager
|
|
65
108
|
|
|
66
109
|
# Initialize with safe imports
|
|
67
110
|
get_config = safe_import_config()
|
|
@@ -256,16 +299,34 @@ class SystemDiagnostics:
|
|
|
256
299
|
adapter_status["total_adapters"] = len(adapters)
|
|
257
300
|
|
|
258
301
|
for name, adapter_config in adapters.items():
|
|
302
|
+
# Handle both dict and object adapter configs
|
|
303
|
+
if isinstance(adapter_config, dict):
|
|
304
|
+
adapter_type = adapter_config.get("type", "unknown")
|
|
305
|
+
config_dict = adapter_config
|
|
306
|
+
else:
|
|
307
|
+
adapter_type = adapter_config.type.value if hasattr(adapter_config, 'type') else "unknown"
|
|
308
|
+
config_dict = adapter_config.dict() if hasattr(adapter_config, 'dict') else adapter_config
|
|
309
|
+
|
|
259
310
|
details = {
|
|
260
|
-
"type":
|
|
311
|
+
"type": adapter_type,
|
|
261
312
|
"status": "unknown",
|
|
262
313
|
"last_test": None,
|
|
263
314
|
"error": None,
|
|
264
315
|
}
|
|
265
316
|
|
|
266
317
|
try:
|
|
267
|
-
|
|
268
|
-
|
|
318
|
+
# Import AdapterRegistry safely
|
|
319
|
+
try:
|
|
320
|
+
from ..core.registry import AdapterRegistry
|
|
321
|
+
except ImportError:
|
|
322
|
+
details["status"] = "failed"
|
|
323
|
+
details["error"] = "AdapterRegistry not available"
|
|
324
|
+
adapter_status["failed_adapters"] += 1
|
|
325
|
+
adapter_status["adapter_details"][name] = details
|
|
326
|
+
continue
|
|
327
|
+
|
|
328
|
+
adapter_class = AdapterRegistry.get_adapter(adapter_type)
|
|
329
|
+
adapter = adapter_class(config_dict)
|
|
269
330
|
|
|
270
331
|
# Test basic adapter functionality
|
|
271
332
|
test_start = datetime.now()
|
|
@@ -303,9 +364,9 @@ class SystemDiagnostics:
|
|
|
303
364
|
return adapter_status
|
|
304
365
|
|
|
305
366
|
async def _diagnose_queue_system(self) -> Dict[str, Any]:
|
|
306
|
-
"""Diagnose queue system health."""
|
|
367
|
+
"""Diagnose queue system health with active testing."""
|
|
307
368
|
console.print("\n⚡ [yellow]Queue System Diagnosis[/yellow]")
|
|
308
|
-
|
|
369
|
+
|
|
309
370
|
queue_status = {
|
|
310
371
|
"worker_running": False,
|
|
311
372
|
"worker_pid": None,
|
|
@@ -313,19 +374,24 @@ class SystemDiagnostics:
|
|
|
313
374
|
"recent_failures": [],
|
|
314
375
|
"failure_rate": 0.0,
|
|
315
376
|
"health_score": 0,
|
|
377
|
+
"worker_start_test": {"attempted": False, "success": False, "error": None},
|
|
378
|
+
"queue_operation_test": {"attempted": False, "success": False, "error": None},
|
|
316
379
|
}
|
|
317
380
|
|
|
318
381
|
try:
|
|
319
382
|
if not self.queue_available:
|
|
320
|
-
warning = "Queue system in fallback mode -
|
|
383
|
+
warning = "Queue system in fallback mode - testing basic functionality"
|
|
321
384
|
self.warnings.append(warning)
|
|
322
385
|
console.print(f"⚠️ {warning}")
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
386
|
+
|
|
387
|
+
# Even in fallback mode, test if we can create a basic queue operation
|
|
388
|
+
test_result = await self._test_basic_queue_functionality()
|
|
389
|
+
queue_status["queue_operation_test"] = test_result
|
|
390
|
+
queue_status["health_score"] = 50 if test_result["success"] else 25
|
|
326
391
|
return queue_status
|
|
327
392
|
|
|
328
|
-
# Check worker status
|
|
393
|
+
# Test 1: Check current worker status
|
|
394
|
+
console.print("🔍 Checking current worker status...")
|
|
329
395
|
worker_status = self.queue_manager.get_worker_status()
|
|
330
396
|
queue_status["worker_running"] = worker_status.get("running", False)
|
|
331
397
|
queue_status["worker_pid"] = worker_status.get("pid")
|
|
@@ -334,21 +400,32 @@ class SystemDiagnostics:
|
|
|
334
400
|
console.print(f"✅ Queue worker running (PID: {queue_status['worker_pid']})")
|
|
335
401
|
self.successes.append("Queue worker is running")
|
|
336
402
|
else:
|
|
337
|
-
|
|
338
|
-
self.issues.append(issue)
|
|
339
|
-
console.print(f"❌ {issue}")
|
|
403
|
+
console.print("⚠️ Queue worker not running - attempting to start...")
|
|
340
404
|
|
|
341
|
-
|
|
405
|
+
# Test 2: Try to start worker
|
|
406
|
+
start_test = await self._test_worker_startup()
|
|
407
|
+
queue_status["worker_start_test"] = start_test
|
|
408
|
+
|
|
409
|
+
if start_test["success"]:
|
|
410
|
+
console.print("✅ Successfully started queue worker")
|
|
411
|
+
queue_status["worker_running"] = True
|
|
412
|
+
self.successes.append("Queue worker started successfully")
|
|
413
|
+
else:
|
|
414
|
+
console.print(f"❌ Failed to start queue worker: {start_test['error']}")
|
|
415
|
+
self.issues.append(f"Queue worker startup failed: {start_test['error']}")
|
|
416
|
+
|
|
417
|
+
# Test 3: Get queue statistics
|
|
418
|
+
console.print("🔍 Analyzing queue statistics...")
|
|
342
419
|
stats = self.queue_manager.get_queue_stats()
|
|
343
420
|
queue_status["queue_stats"] = stats
|
|
344
|
-
|
|
421
|
+
|
|
345
422
|
total_items = stats.get("total", 0)
|
|
346
423
|
failed_items = stats.get("failed", 0)
|
|
347
|
-
|
|
424
|
+
|
|
348
425
|
if total_items > 0:
|
|
349
426
|
failure_rate = (failed_items / total_items) * 100
|
|
350
427
|
queue_status["failure_rate"] = failure_rate
|
|
351
|
-
|
|
428
|
+
|
|
352
429
|
if failure_rate > 50:
|
|
353
430
|
issue = f"High failure rate: {failure_rate:.1f}% ({failed_items}/{total_items})"
|
|
354
431
|
self.issues.append(issue)
|
|
@@ -360,14 +437,30 @@ class SystemDiagnostics:
|
|
|
360
437
|
else:
|
|
361
438
|
console.print(f"✅ Queue failure rate: {failure_rate:.1f}% ({failed_items}/{total_items})")
|
|
362
439
|
|
|
363
|
-
#
|
|
440
|
+
# Test 4: Test actual queue operations
|
|
441
|
+
console.print("🔍 Testing queue operations...")
|
|
442
|
+
operation_test = await self._test_queue_operations()
|
|
443
|
+
queue_status["queue_operation_test"] = operation_test
|
|
444
|
+
|
|
445
|
+
if operation_test["success"]:
|
|
446
|
+
console.print("✅ Queue operations test passed")
|
|
447
|
+
self.successes.append("Queue operations working correctly")
|
|
448
|
+
else:
|
|
449
|
+
console.print(f"❌ Queue operations test failed: {operation_test['error']}")
|
|
450
|
+
self.issues.append(f"Queue operations failed: {operation_test['error']}")
|
|
451
|
+
|
|
452
|
+
# Calculate health score based on actual tests
|
|
364
453
|
health_score = 100
|
|
365
454
|
if not queue_status["worker_running"]:
|
|
366
|
-
health_score -=
|
|
367
|
-
|
|
455
|
+
health_score -= 30
|
|
456
|
+
if not queue_status["worker_start_test"]["success"] and queue_status["worker_start_test"]["attempted"]:
|
|
457
|
+
health_score -= 20
|
|
458
|
+
if not queue_status["queue_operation_test"]["success"]:
|
|
459
|
+
health_score -= 30
|
|
460
|
+
health_score -= min(queue_status["failure_rate"], 20)
|
|
368
461
|
queue_status["health_score"] = max(0, health_score)
|
|
369
462
|
|
|
370
|
-
console.print(f"📊 Queue health score: {queue_status['health_score']}/100")
|
|
463
|
+
console.print(f"📊 Queue health score: {queue_status['health_score']}/100 (based on active testing)")
|
|
371
464
|
|
|
372
465
|
except Exception as e:
|
|
373
466
|
issue = f"Queue system diagnosis failed: {str(e)}"
|
|
@@ -376,6 +469,116 @@ class SystemDiagnostics:
|
|
|
376
469
|
|
|
377
470
|
return queue_status
|
|
378
471
|
|
|
472
|
+
async def _test_worker_startup(self) -> Dict[str, Any]:
|
|
473
|
+
"""Test starting a queue worker."""
|
|
474
|
+
test_result = {
|
|
475
|
+
"attempted": True,
|
|
476
|
+
"success": False,
|
|
477
|
+
"error": None,
|
|
478
|
+
"details": None
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
try:
|
|
482
|
+
# Try to start worker using the queue manager
|
|
483
|
+
if hasattr(self.queue_manager, 'start_worker'):
|
|
484
|
+
result = await self.queue_manager.start_worker()
|
|
485
|
+
test_result["success"] = True
|
|
486
|
+
test_result["details"] = "Worker started successfully"
|
|
487
|
+
else:
|
|
488
|
+
# Try alternative method - use CLI command
|
|
489
|
+
import subprocess
|
|
490
|
+
result = subprocess.run(
|
|
491
|
+
["mcp-ticketer", "queue", "worker", "start"],
|
|
492
|
+
capture_output=True,
|
|
493
|
+
text=True,
|
|
494
|
+
timeout=10
|
|
495
|
+
)
|
|
496
|
+
if result.returncode == 0:
|
|
497
|
+
test_result["success"] = True
|
|
498
|
+
test_result["details"] = "Worker started via CLI"
|
|
499
|
+
else:
|
|
500
|
+
test_result["error"] = f"CLI start failed: {result.stderr}"
|
|
501
|
+
|
|
502
|
+
except subprocess.TimeoutExpired:
|
|
503
|
+
test_result["error"] = "Worker startup timed out"
|
|
504
|
+
except Exception as e:
|
|
505
|
+
test_result["error"] = str(e)
|
|
506
|
+
|
|
507
|
+
return test_result
|
|
508
|
+
|
|
509
|
+
async def _test_queue_operations(self) -> Dict[str, Any]:
|
|
510
|
+
"""Test basic queue operations."""
|
|
511
|
+
test_result = {
|
|
512
|
+
"attempted": True,
|
|
513
|
+
"success": False,
|
|
514
|
+
"error": None,
|
|
515
|
+
"details": None
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
try:
|
|
519
|
+
# Test creating a simple queue item (diagnostic test)
|
|
520
|
+
from ..core.models import Task, Priority
|
|
521
|
+
|
|
522
|
+
test_task = Task(
|
|
523
|
+
title="[DIAGNOSTIC TEST] Queue functionality test",
|
|
524
|
+
description="This is a diagnostic test - safe to ignore",
|
|
525
|
+
priority=Priority.LOW
|
|
526
|
+
)
|
|
527
|
+
|
|
528
|
+
# Try to queue the test task
|
|
529
|
+
if hasattr(self.queue_manager, 'queue_task'):
|
|
530
|
+
queue_id = await self.queue_manager.queue_task("create", test_task, "aitrackdown")
|
|
531
|
+
test_result["success"] = True
|
|
532
|
+
test_result["details"] = f"Test task queued successfully: {queue_id}"
|
|
533
|
+
else:
|
|
534
|
+
test_result["error"] = "Queue manager doesn't support task queuing"
|
|
535
|
+
|
|
536
|
+
except Exception as e:
|
|
537
|
+
test_result["error"] = str(e)
|
|
538
|
+
|
|
539
|
+
return test_result
|
|
540
|
+
|
|
541
|
+
async def _test_basic_queue_functionality(self) -> Dict[str, Any]:
|
|
542
|
+
"""Test basic queue functionality in fallback mode."""
|
|
543
|
+
test_result = {
|
|
544
|
+
"attempted": True,
|
|
545
|
+
"success": False,
|
|
546
|
+
"error": None,
|
|
547
|
+
"details": None
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
try:
|
|
551
|
+
# Test if we can at least create a task directly (bypass queue)
|
|
552
|
+
from ..core.models import Task, Priority
|
|
553
|
+
from ..adapters.aitrackdown import AITrackdownAdapter
|
|
554
|
+
|
|
555
|
+
test_task = Task(
|
|
556
|
+
title="[DIAGNOSTIC TEST] Direct adapter test",
|
|
557
|
+
description="Testing direct adapter functionality",
|
|
558
|
+
priority=Priority.LOW
|
|
559
|
+
)
|
|
560
|
+
|
|
561
|
+
# Try direct adapter creation
|
|
562
|
+
adapter_config = {
|
|
563
|
+
"type": "aitrackdown",
|
|
564
|
+
"enabled": True,
|
|
565
|
+
"base_path": "/tmp/mcp-ticketer-diagnostic-test"
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
adapter = AITrackdownAdapter(adapter_config)
|
|
569
|
+
result = await adapter.create(test_task)
|
|
570
|
+
|
|
571
|
+
test_result["success"] = True
|
|
572
|
+
test_result["details"] = f"Direct adapter test passed: {result.id}"
|
|
573
|
+
|
|
574
|
+
# Clean up test
|
|
575
|
+
await adapter.delete(result.id)
|
|
576
|
+
|
|
577
|
+
except Exception as e:
|
|
578
|
+
test_result["error"] = str(e)
|
|
579
|
+
|
|
580
|
+
return test_result
|
|
581
|
+
|
|
379
582
|
async def _analyze_recent_logs(self) -> Dict[str, Any]:
|
|
380
583
|
"""Analyze recent log entries for issues."""
|
|
381
584
|
console.print("\n📝 [yellow]Recent Log Analysis[/yellow]")
|
|
@@ -283,6 +283,10 @@ class ConfigurationManager:
|
|
|
283
283
|
# Load from first available config file
|
|
284
284
|
config_data = self._load_config_file(self._config_file_paths[0])
|
|
285
285
|
logger.info(f"Loaded configuration from: {self._config_file_paths[0]}")
|
|
286
|
+
else:
|
|
287
|
+
# No config file found - try environment discovery
|
|
288
|
+
logger.info("No configuration file found, attempting environment discovery")
|
|
289
|
+
config_data = self._discover_from_environment()
|
|
286
290
|
|
|
287
291
|
# Parse adapter configurations
|
|
288
292
|
if "adapters" in config_data:
|
|
@@ -328,6 +332,95 @@ class ConfigurationManager:
|
|
|
328
332
|
logger.error(f"Error loading config file {config_path}: {e}")
|
|
329
333
|
return {}
|
|
330
334
|
|
|
335
|
+
def _discover_from_environment(self) -> dict[str, Any]:
|
|
336
|
+
"""Discover configuration from environment variables."""
|
|
337
|
+
try:
|
|
338
|
+
from .env_discovery import EnvironmentDiscovery
|
|
339
|
+
|
|
340
|
+
discovery = EnvironmentDiscovery()
|
|
341
|
+
discovered = discovery.discover_all()
|
|
342
|
+
|
|
343
|
+
if not discovered.adapters:
|
|
344
|
+
logger.info("No adapters discovered from environment variables")
|
|
345
|
+
# Return minimal config with aitrackdown as fallback
|
|
346
|
+
return {
|
|
347
|
+
"adapters": {
|
|
348
|
+
"aitrackdown": {
|
|
349
|
+
"type": "aitrackdown",
|
|
350
|
+
"enabled": True,
|
|
351
|
+
"base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"default_adapter": "aitrackdown"
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
# Convert discovered adapters to config format
|
|
358
|
+
config_data = {
|
|
359
|
+
"adapters": {},
|
|
360
|
+
"default_adapter": None
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
for adapter in discovered.adapters:
|
|
364
|
+
adapter_config = {
|
|
365
|
+
"type": adapter.type.value,
|
|
366
|
+
"enabled": True
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
# Add adapter-specific configuration
|
|
370
|
+
if adapter.type.value == "linear":
|
|
371
|
+
adapter_config.update({
|
|
372
|
+
"api_key": adapter.credentials.get("api_key"),
|
|
373
|
+
"team_id": adapter.credentials.get("team_id"),
|
|
374
|
+
"project_id": adapter.credentials.get("project_id")
|
|
375
|
+
})
|
|
376
|
+
elif adapter.type.value == "github":
|
|
377
|
+
adapter_config.update({
|
|
378
|
+
"token": adapter.credentials.get("token"),
|
|
379
|
+
"repo": adapter.credentials.get("repo"),
|
|
380
|
+
"owner": adapter.credentials.get("owner")
|
|
381
|
+
})
|
|
382
|
+
elif adapter.type.value == "jira":
|
|
383
|
+
adapter_config.update({
|
|
384
|
+
"server": adapter.credentials.get("server"),
|
|
385
|
+
"email": adapter.credentials.get("email"),
|
|
386
|
+
"api_token": adapter.credentials.get("api_token"),
|
|
387
|
+
"project_key": adapter.credentials.get("project_key")
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
config_data["adapters"][adapter.name] = adapter_config
|
|
391
|
+
|
|
392
|
+
# Set first discovered adapter as default
|
|
393
|
+
if config_data["default_adapter"] is None:
|
|
394
|
+
config_data["default_adapter"] = adapter.name
|
|
395
|
+
|
|
396
|
+
logger.info(f"Discovered {len(config_data['adapters'])} adapter(s) from environment")
|
|
397
|
+
return config_data
|
|
398
|
+
|
|
399
|
+
except ImportError:
|
|
400
|
+
logger.warning("Environment discovery not available, using aitrackdown fallback")
|
|
401
|
+
return {
|
|
402
|
+
"adapters": {
|
|
403
|
+
"aitrackdown": {
|
|
404
|
+
"type": "aitrackdown",
|
|
405
|
+
"enabled": True,
|
|
406
|
+
"base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
"default_adapter": "aitrackdown"
|
|
410
|
+
}
|
|
411
|
+
except Exception as e:
|
|
412
|
+
logger.error(f"Environment discovery failed: {e}")
|
|
413
|
+
return {
|
|
414
|
+
"adapters": {
|
|
415
|
+
"aitrackdown": {
|
|
416
|
+
"type": "aitrackdown",
|
|
417
|
+
"enabled": True,
|
|
418
|
+
"base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
"default_adapter": "aitrackdown"
|
|
422
|
+
}
|
|
423
|
+
|
|
331
424
|
def get_config(self) -> AppConfig:
|
|
332
425
|
"""Get the current configuration."""
|
|
333
426
|
if self._config is None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.33
|
|
4
4
|
Summary: Universal ticket management interface for AI agents with MCP support
|
|
5
5
|
Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
6
6
|
Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
|