mcp-ticketer 0.2.0__tar.gz → 0.3.1__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.2.0/src/mcp_ticketer.egg-info → mcp_ticketer-0.3.1}/PKG-INFO +1 -1
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/__version__.py +1 -1
- mcp_ticketer-0.3.1/src/mcp_ticketer/cli/adapter_diagnostics.py +384 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/main.py +364 -81
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/env_discovery.py +31 -3
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/mcp/server.py +172 -37
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1/src/mcp_ticketer.egg-info}/PKG-INFO +1 -1
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer.egg-info/SOURCES.txt +1 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/.dependency_cache +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/.mpm_deployment_state +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/agent-manager.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/agentic-coder-optimizer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/api_qa.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/clerk-ops.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/code_analyzer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/content-agent.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/dart_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/data_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/documentation.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/gcp_ops_agent.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/golang_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/imagemagick.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/java_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/local_ops_agent.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/memory_manager.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/nextjs_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/ops.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/php-engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/product_owner.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/project_organizer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/prompt-engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/python_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/qa.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/react_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/refactoring_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/research.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/ruby-engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/rust_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/security.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/ticketing.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/typescript_engineer.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/vercel_ops_agent.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/version_control.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/web_qa.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/agents/web_ui.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/mcp.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude/mcp.local.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/config/project.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/mcp_auto_config_preference.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/README.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/agentic_coder_optimizer_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/documentation_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/engineer_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/ops_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/project_knowledge_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/qa_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/research_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/version-control_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude-mpm/memories/workflows_memories.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.claude.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.coveragerc +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.env.example +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.github/workflows/docs.yml +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.github/workflows/publish.yml +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.github/workflows/test.yml +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.mcp/config.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.pre-commit-config.yaml +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.python-version +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/.readthedocs.yaml +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/CHANGELOG.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/CLAUDE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/LICENSE +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/MANIFEST.in +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/Makefile +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/PROJECT_CLEANUP_SUMMARY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/README.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/SECURITY_SCAN_REPORT_v0.1.24.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/ADAPTERS.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/AI_CLIENT_INTEGRATION.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/API_REFERENCE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/CONFIGURATION.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/DEVELOPER_GUIDE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/ENV_DISCOVERY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/MCP_INTEGRATION.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/MIGRATION_GUIDE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/PROJECT_CONFIG.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/PR_INTEGRATION.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/QUEUE_SYSTEM.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/QUICK_START.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/QUICK_START_ENV.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/README.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/USER_GUIDE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_archive/README.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/adapters/github.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/adapters.rst.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/api.rst.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/cli.rst.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/development.rst.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/examples.rst.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/index.rst.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/installation.rst.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/adapters/github.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/adapters.rst +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/api.rst +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/cli.rst +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/conf.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/development/CODE_STRUCTURE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/development/CONTRIBUTING.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/development/RELEASE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/development/RELEASING.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/development.rst +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/examples.rst +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/index.rst +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/installation.rst +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/prd/mcp-ticketer-prd.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/CONFIG_RESOLUTION_FIX.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/TEST_REPORT.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/reports/VERIFICATION_RESULTS.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/requirements.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/setup/CLAUDE_DESKTOP_SETUP.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/setup/CODEX_INTEGRATION.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/setup/JIRA_SETUP.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/docs/setup/LINEAR_SETUP.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/mcp-ticketer +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/mcp-ticketer-server +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/pyproject.toml +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/pytest.ini +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/requirements-dev.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/requirements.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/scripts/README.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/scripts/install.sh +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/scripts/manage_version.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/scripts/mcp_server.sh +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/scripts/test_set_command.sh +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/setup.cfg +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/setup.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/aitrackdown.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/github.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/hybrid.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/jira.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/linear/adapter.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/linear/client.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/linear/mappers.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/linear/types.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/adapters/linear.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cache/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cache/memory.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/codex_configure.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/configure.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/diagnostics.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/discover.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/gemini_configure.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/linear_commands.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/mcp_configure.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/migrate_config.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/queue_commands.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/simple_health.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/cli/utils.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/adapter.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/config.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/env_loader.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/exceptions.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/http_client.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/mappers.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/models.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/project_config.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/core/registry.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/mcp/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/py.typed +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/__main__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/health_monitor.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/manager.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/queue.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/run_worker.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/ticket_registry.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer/queue/worker.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer.egg-info/requires.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/test-tickets/tickets/task-20250924002724.json +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/README.md +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/linear/test_adapter.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/linear/test_client.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/linear/test_mappers.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/linear/test_queries.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/linear/test_types.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_aitrackdown.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_github.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_github_token.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_jira.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_jira_direct.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_jira_projects.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_linear.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_linear_config.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/adapters/test_linear_native.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/conftest.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_actual_worker_execution.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_config_resolution.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_credential_validation.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_env_discovery.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_environment_handoff.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_queue_processing.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_queue_system.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/core/test_unified_env_loading.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_adapter_cache.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_cli_config.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_cli_vs_simulation.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_linear_teams.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_search.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_test.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_worker_adapter.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_worker_simulation.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/debug/debug_worker_subprocess.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/e2e/test_comments_and_attachments.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/e2e/test_complete_ticket_workflow.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/e2e/test_complete_workflow.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/e2e/test_hierarchy_validation.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/e2e/test_state_transitions.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_aitrackdown_commenting.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_all_adapters.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_commenting_functionality.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_comprehensive.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_hierarchy_and_workflow.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_jira_github_adapters.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_mcp_server_qa.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_pr_functionality.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_serve_config.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/integration/test_user_assignment.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/performance/test_optimizations.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/performance/test_performance.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/run_comprehensive_tests.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_api_usage.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_base_adapter.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_basic.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_codex_config.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_comprehensive_qa.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_error_handling.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_linear_teams.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_models.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tests/test_queue.py +0 -0
- {mcp_ticketer-0.2.0 → mcp_ticketer-0.3.1}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
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>
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
"""Adapter diagnostics and configuration validation."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
7
|
+
|
|
8
|
+
from rich.console import Console
|
|
9
|
+
from rich.panel import Panel
|
|
10
|
+
from rich.table import Table
|
|
11
|
+
from rich.text import Text
|
|
12
|
+
|
|
13
|
+
from ..core import AdapterRegistry
|
|
14
|
+
from ..core.env_discovery import discover_config
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def diagnose_adapter_configuration(console: Console) -> None:
|
|
18
|
+
"""Diagnose adapter configuration and provide recommendations.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
console: Rich console for output
|
|
22
|
+
"""
|
|
23
|
+
console.print("\n[bold blue]🔍 MCP Ticketer Adapter Configuration Diagnostics[/bold blue]\n")
|
|
24
|
+
|
|
25
|
+
# 1. Check .env files
|
|
26
|
+
_check_env_files(console)
|
|
27
|
+
|
|
28
|
+
# 2. Check configuration files
|
|
29
|
+
_check_configuration_files(console)
|
|
30
|
+
|
|
31
|
+
# 3. Check adapter discovery
|
|
32
|
+
_check_adapter_discovery(console)
|
|
33
|
+
|
|
34
|
+
# 4. Test adapter instantiation
|
|
35
|
+
_test_adapter_instantiation(console)
|
|
36
|
+
|
|
37
|
+
# 5. Provide recommendations
|
|
38
|
+
_provide_recommendations(console)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _check_env_files(console: Console) -> None:
|
|
42
|
+
"""Check .env files for configuration."""
|
|
43
|
+
console.print("[bold]1. .env File Configuration[/bold]")
|
|
44
|
+
|
|
45
|
+
# Load .env files
|
|
46
|
+
from ..mcp.server import _load_env_configuration
|
|
47
|
+
env_config = _load_env_configuration()
|
|
48
|
+
|
|
49
|
+
# Check for .env files
|
|
50
|
+
env_files = [".env.local", ".env"]
|
|
51
|
+
|
|
52
|
+
table = Table(show_header=True, header_style="bold magenta")
|
|
53
|
+
table.add_column("File", style="cyan")
|
|
54
|
+
table.add_column("Status", style="green")
|
|
55
|
+
table.add_column("Variables Found", style="yellow")
|
|
56
|
+
|
|
57
|
+
for env_file in env_files:
|
|
58
|
+
env_path = Path.cwd() / env_file
|
|
59
|
+
if env_path.exists():
|
|
60
|
+
try:
|
|
61
|
+
# Count variables in file
|
|
62
|
+
var_count = 0
|
|
63
|
+
with open(env_path, 'r') as f:
|
|
64
|
+
for line in f:
|
|
65
|
+
line = line.strip()
|
|
66
|
+
if line and not line.startswith('#') and '=' in line:
|
|
67
|
+
var_count += 1
|
|
68
|
+
|
|
69
|
+
status = "✅ Found"
|
|
70
|
+
variables = f"{var_count} variables"
|
|
71
|
+
except Exception:
|
|
72
|
+
status = "⚠️ Error reading"
|
|
73
|
+
variables = "Unknown"
|
|
74
|
+
else:
|
|
75
|
+
status = "❌ Missing"
|
|
76
|
+
variables = "N/A"
|
|
77
|
+
|
|
78
|
+
table.add_row(env_file, status, variables)
|
|
79
|
+
|
|
80
|
+
console.print(table)
|
|
81
|
+
|
|
82
|
+
# Show discovered configuration
|
|
83
|
+
if env_config:
|
|
84
|
+
console.print(f"\n[green]✅ Discovered adapter: {env_config['adapter_type']}[/green]")
|
|
85
|
+
config_keys = list(env_config['adapter_config'].keys())
|
|
86
|
+
console.print(f"[dim]Configuration keys: {config_keys}[/dim]")
|
|
87
|
+
else:
|
|
88
|
+
console.print("\n[yellow]⚠️ No adapter configuration found in .env files[/yellow]")
|
|
89
|
+
|
|
90
|
+
console.print()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _check_configuration_files(console: Console) -> None:
|
|
94
|
+
"""Check configuration files."""
|
|
95
|
+
console.print("[bold]2. Configuration Files[/bold]")
|
|
96
|
+
|
|
97
|
+
config_files = [
|
|
98
|
+
(".env.local", "Local environment file (highest priority)"),
|
|
99
|
+
(".env", "Environment file"),
|
|
100
|
+
(".mcp-ticketer/config.json", "Project configuration"),
|
|
101
|
+
(str(Path.home() / ".mcp-ticketer" / "config.json"), "Global configuration"),
|
|
102
|
+
]
|
|
103
|
+
|
|
104
|
+
table = Table(show_header=True, header_style="bold magenta")
|
|
105
|
+
table.add_column("File", style="cyan")
|
|
106
|
+
table.add_column("Description", style="white")
|
|
107
|
+
table.add_column("Status", style="green")
|
|
108
|
+
table.add_column("Size", style="yellow")
|
|
109
|
+
|
|
110
|
+
for file_path, description in config_files:
|
|
111
|
+
path = Path(file_path)
|
|
112
|
+
if path.exists():
|
|
113
|
+
try:
|
|
114
|
+
size = path.stat().st_size
|
|
115
|
+
status = "✅ Found"
|
|
116
|
+
size_str = f"{size} bytes"
|
|
117
|
+
except Exception:
|
|
118
|
+
status = "⚠️ Error"
|
|
119
|
+
size_str = "Unknown"
|
|
120
|
+
else:
|
|
121
|
+
status = "❌ Missing"
|
|
122
|
+
size_str = "N/A"
|
|
123
|
+
|
|
124
|
+
table.add_row(str(path), description, status, size_str)
|
|
125
|
+
|
|
126
|
+
console.print(table)
|
|
127
|
+
console.print()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _check_adapter_discovery(console: Console) -> None:
|
|
131
|
+
"""Check adapter discovery from configuration."""
|
|
132
|
+
console.print("[bold]3. Adapter Discovery[/bold]")
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
# Discover configuration
|
|
136
|
+
discovered = discover_config(Path.cwd())
|
|
137
|
+
|
|
138
|
+
if discovered and discovered.adapters:
|
|
139
|
+
primary = discovered.get_primary_adapter()
|
|
140
|
+
|
|
141
|
+
table = Table(show_header=True, header_style="bold magenta")
|
|
142
|
+
table.add_column("Adapter", style="cyan")
|
|
143
|
+
table.add_column("Confidence", style="white")
|
|
144
|
+
table.add_column("Source", style="green")
|
|
145
|
+
table.add_column("Status", style="yellow")
|
|
146
|
+
|
|
147
|
+
for adapter_info in discovered.adapters:
|
|
148
|
+
confidence = f"{adapter_info.confidence:.0%}"
|
|
149
|
+
status = "✅ Primary" if adapter_info == primary else "⚪ Available"
|
|
150
|
+
|
|
151
|
+
table.add_row(
|
|
152
|
+
adapter_info.adapter_type,
|
|
153
|
+
confidence,
|
|
154
|
+
adapter_info.found_in,
|
|
155
|
+
status
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
console.print(table)
|
|
159
|
+
|
|
160
|
+
if primary:
|
|
161
|
+
console.print(f"\n[green]✅ Primary adapter detected: {primary.adapter_type}[/green]")
|
|
162
|
+
console.print(f"[dim]Source: {primary.found_in}[/dim]")
|
|
163
|
+
console.print(f"[dim]Confidence: {primary.confidence:.0%}[/dim]")
|
|
164
|
+
else:
|
|
165
|
+
console.print("\n[yellow]⚠️ No primary adapter detected[/yellow]")
|
|
166
|
+
else:
|
|
167
|
+
console.print("[red]❌ No adapters discovered[/red]")
|
|
168
|
+
console.print("[dim]This usually means no credentials are configured[/dim]")
|
|
169
|
+
|
|
170
|
+
except Exception as e:
|
|
171
|
+
console.print(f"[red]❌ Error during discovery: {e}[/red]")
|
|
172
|
+
|
|
173
|
+
console.print()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _test_adapter_instantiation(console: Console) -> None:
|
|
177
|
+
"""Test adapter instantiation."""
|
|
178
|
+
console.print("[bold]4. Adapter Instantiation Test[/bold]")
|
|
179
|
+
|
|
180
|
+
# Determine which adapter to test from .env files
|
|
181
|
+
from ..mcp.server import _load_env_configuration
|
|
182
|
+
env_config = _load_env_configuration()
|
|
183
|
+
|
|
184
|
+
if env_config:
|
|
185
|
+
adapter_type = env_config["adapter_type"]
|
|
186
|
+
config = env_config["adapter_config"]
|
|
187
|
+
else:
|
|
188
|
+
# Try to discover from existing discovery system
|
|
189
|
+
try:
|
|
190
|
+
discovered = discover_config(Path.cwd())
|
|
191
|
+
if discovered and discovered.adapters:
|
|
192
|
+
primary = discovered.get_primary_adapter()
|
|
193
|
+
if primary:
|
|
194
|
+
adapter_type = primary.adapter_type
|
|
195
|
+
# Build config from discovery
|
|
196
|
+
from ..mcp.server import _build_adapter_config_from_env_vars
|
|
197
|
+
config = _build_adapter_config_from_env_vars(adapter_type, {})
|
|
198
|
+
else:
|
|
199
|
+
adapter_type = "aitrackdown"
|
|
200
|
+
config = {"base_path": ".aitrackdown"}
|
|
201
|
+
else:
|
|
202
|
+
adapter_type = "aitrackdown"
|
|
203
|
+
config = {"base_path": ".aitrackdown"}
|
|
204
|
+
except Exception:
|
|
205
|
+
adapter_type = "aitrackdown"
|
|
206
|
+
config = {"base_path": ".aitrackdown"}
|
|
207
|
+
|
|
208
|
+
console.print(f"Testing adapter: [cyan]{adapter_type}[/cyan]")
|
|
209
|
+
console.print(f"Configuration keys: [yellow]{list(config.keys())}[/yellow]")
|
|
210
|
+
|
|
211
|
+
try:
|
|
212
|
+
# Try to instantiate adapter
|
|
213
|
+
adapter = AdapterRegistry.get_adapter(adapter_type, config)
|
|
214
|
+
|
|
215
|
+
console.print(f"[green]✅ Adapter instantiated successfully: {adapter.__class__.__name__}[/green]")
|
|
216
|
+
|
|
217
|
+
# Test basic functionality
|
|
218
|
+
if hasattr(adapter, 'validate_credentials'):
|
|
219
|
+
try:
|
|
220
|
+
is_valid, error_msg = adapter.validate_credentials()
|
|
221
|
+
if is_valid:
|
|
222
|
+
console.print("[green]✅ Credentials validation passed[/green]")
|
|
223
|
+
else:
|
|
224
|
+
console.print(f"[red]❌ Credentials validation failed: {error_msg}[/red]")
|
|
225
|
+
except Exception as e:
|
|
226
|
+
console.print(f"[yellow]⚠️ Credentials validation error: {e}[/yellow]")
|
|
227
|
+
|
|
228
|
+
except Exception as e:
|
|
229
|
+
console.print(f"[red]❌ Adapter instantiation failed: {e}[/red]")
|
|
230
|
+
|
|
231
|
+
# Provide specific guidance based on adapter type
|
|
232
|
+
if adapter_type == "linear":
|
|
233
|
+
console.print("\n[yellow]Linear adapter requires in .env/.env.local:[/yellow]")
|
|
234
|
+
console.print("• LINEAR_API_KEY=your_api_key")
|
|
235
|
+
console.print("• LINEAR_TEAM_ID=your_team_id (or LINEAR_TEAM_KEY=your_team_key)")
|
|
236
|
+
elif adapter_type == "github":
|
|
237
|
+
console.print("\n[yellow]GitHub adapter requires in .env/.env.local:[/yellow]")
|
|
238
|
+
console.print("• GITHUB_TOKEN=your_token")
|
|
239
|
+
console.print("• GITHUB_OWNER=your_username")
|
|
240
|
+
console.print("• GITHUB_REPO=your_repository")
|
|
241
|
+
elif adapter_type == "jira":
|
|
242
|
+
console.print("\n[yellow]JIRA adapter requires in .env/.env.local:[/yellow]")
|
|
243
|
+
console.print("• JIRA_SERVER=your_server_url")
|
|
244
|
+
console.print("• JIRA_EMAIL=your_email")
|
|
245
|
+
console.print("• JIRA_API_TOKEN=your_token")
|
|
246
|
+
|
|
247
|
+
console.print()
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _provide_recommendations(console: Console) -> None:
|
|
251
|
+
"""Provide configuration recommendations."""
|
|
252
|
+
console.print("[bold]5. Recommendations[/bold]")
|
|
253
|
+
|
|
254
|
+
# Check .env configuration
|
|
255
|
+
from ..mcp.server import _load_env_configuration
|
|
256
|
+
env_config = _load_env_configuration()
|
|
257
|
+
|
|
258
|
+
recommendations = []
|
|
259
|
+
|
|
260
|
+
if not env_config:
|
|
261
|
+
recommendations.append(
|
|
262
|
+
"Create .env.local or .env file with adapter configuration"
|
|
263
|
+
)
|
|
264
|
+
recommendations.append(
|
|
265
|
+
"Add MCP_TICKETER_ADAPTER=linear (or github, jira) to specify adapter type"
|
|
266
|
+
)
|
|
267
|
+
else:
|
|
268
|
+
adapter_type = env_config["adapter_type"]
|
|
269
|
+
config = env_config["adapter_config"]
|
|
270
|
+
|
|
271
|
+
# Check for incomplete configurations
|
|
272
|
+
if adapter_type == "linear":
|
|
273
|
+
if not config.get("api_key"):
|
|
274
|
+
recommendations.append("Add LINEAR_API_KEY to .env file")
|
|
275
|
+
if not config.get("team_id") and not config.get("team_key"):
|
|
276
|
+
recommendations.append("Add LINEAR_TEAM_ID or LINEAR_TEAM_KEY to .env file")
|
|
277
|
+
|
|
278
|
+
elif adapter_type == "github":
|
|
279
|
+
missing = []
|
|
280
|
+
if not config.get("token"):
|
|
281
|
+
missing.append("GITHUB_TOKEN")
|
|
282
|
+
if not config.get("owner"):
|
|
283
|
+
missing.append("GITHUB_OWNER")
|
|
284
|
+
if not config.get("repo"):
|
|
285
|
+
missing.append("GITHUB_REPO")
|
|
286
|
+
if missing:
|
|
287
|
+
recommendations.append(f"Add missing GitHub variables to .env: {', '.join(missing)}")
|
|
288
|
+
|
|
289
|
+
elif adapter_type == "jira":
|
|
290
|
+
missing = []
|
|
291
|
+
if not config.get("server"):
|
|
292
|
+
missing.append("JIRA_SERVER")
|
|
293
|
+
if not config.get("email"):
|
|
294
|
+
missing.append("JIRA_EMAIL")
|
|
295
|
+
if not config.get("api_token"):
|
|
296
|
+
missing.append("JIRA_API_TOKEN")
|
|
297
|
+
if missing:
|
|
298
|
+
recommendations.append(f"Add missing JIRA variables to .env: {', '.join(missing)}")
|
|
299
|
+
|
|
300
|
+
if recommendations:
|
|
301
|
+
for i, rec in enumerate(recommendations, 1):
|
|
302
|
+
console.print(f"{i}. [yellow]{rec}[/yellow]")
|
|
303
|
+
else:
|
|
304
|
+
console.print("[green]✅ Configuration looks good![/green]")
|
|
305
|
+
|
|
306
|
+
# Show .env file examples
|
|
307
|
+
console.print("\n[bold].env File Examples:[/bold]")
|
|
308
|
+
console.print("• Linear: [cyan]echo 'MCP_TICKETER_ADAPTER=linear\\nLINEAR_API_KEY=your_key\\nLINEAR_TEAM_ID=your_team' > .env.local[/cyan]")
|
|
309
|
+
console.print("• GitHub: [cyan]echo 'MCP_TICKETER_ADAPTER=github\\nGITHUB_TOKEN=your_token\\nGITHUB_OWNER=user\\nGITHUB_REPO=repo' > .env.local[/cyan]")
|
|
310
|
+
|
|
311
|
+
console.print("\n[bold]Quick Setup Commands:[/bold]")
|
|
312
|
+
console.print("• For Linear: [cyan]mcp-ticketer init linear[/cyan]")
|
|
313
|
+
console.print("• For GitHub: [cyan]mcp-ticketer init github[/cyan]")
|
|
314
|
+
console.print("• For JIRA: [cyan]mcp-ticketer init jira[/cyan]")
|
|
315
|
+
console.print("• For local files: [cyan]mcp-ticketer init aitrackdown[/cyan]")
|
|
316
|
+
|
|
317
|
+
console.print("\n[bold]Test Configuration:[/bold]")
|
|
318
|
+
console.print("• Run diagnostics: [cyan]mcp-ticketer diagnose[/cyan]")
|
|
319
|
+
console.print("• Test ticket creation: [cyan]mcp-ticketer create 'Test ticket'[/cyan]")
|
|
320
|
+
console.print("• List tickets: [cyan]mcp-ticketer list[/cyan]")
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def get_adapter_status() -> Dict[str, Any]:
|
|
324
|
+
"""Get current adapter status for programmatic use.
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
Dictionary with adapter status information
|
|
328
|
+
"""
|
|
329
|
+
status = {
|
|
330
|
+
"adapter_type": None,
|
|
331
|
+
"configuration_source": None,
|
|
332
|
+
"credentials_valid": False,
|
|
333
|
+
"error_message": None,
|
|
334
|
+
"recommendations": []
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
try:
|
|
338
|
+
# Check .env files first
|
|
339
|
+
from ..mcp.server import _load_env_configuration
|
|
340
|
+
env_config = _load_env_configuration()
|
|
341
|
+
|
|
342
|
+
if env_config:
|
|
343
|
+
adapter_type = env_config["adapter_type"]
|
|
344
|
+
config = env_config["adapter_config"]
|
|
345
|
+
status["configuration_source"] = ".env files"
|
|
346
|
+
else:
|
|
347
|
+
# Try discovery system
|
|
348
|
+
discovered = discover_config(Path.cwd())
|
|
349
|
+
if discovered and discovered.adapters:
|
|
350
|
+
primary = discovered.get_primary_adapter()
|
|
351
|
+
if primary:
|
|
352
|
+
adapter_type = primary.adapter_type
|
|
353
|
+
status["configuration_source"] = primary.found_in
|
|
354
|
+
# Build basic config
|
|
355
|
+
from ..mcp.server import _build_adapter_config_from_env_vars
|
|
356
|
+
config = _build_adapter_config_from_env_vars(adapter_type, {})
|
|
357
|
+
else:
|
|
358
|
+
adapter_type = "aitrackdown"
|
|
359
|
+
config = {"base_path": ".aitrackdown"}
|
|
360
|
+
status["configuration_source"] = "default"
|
|
361
|
+
else:
|
|
362
|
+
adapter_type = "aitrackdown"
|
|
363
|
+
config = {"base_path": ".aitrackdown"}
|
|
364
|
+
status["configuration_source"] = "default"
|
|
365
|
+
|
|
366
|
+
status["adapter_type"] = adapter_type
|
|
367
|
+
|
|
368
|
+
# Test adapter instantiation
|
|
369
|
+
adapter = AdapterRegistry.get_adapter(adapter_type, config)
|
|
370
|
+
|
|
371
|
+
# Test credentials if possible
|
|
372
|
+
if hasattr(adapter, 'validate_credentials'):
|
|
373
|
+
is_valid, error_msg = adapter.validate_credentials()
|
|
374
|
+
status["credentials_valid"] = is_valid
|
|
375
|
+
if not is_valid:
|
|
376
|
+
status["error_message"] = error_msg
|
|
377
|
+
else:
|
|
378
|
+
status["credentials_valid"] = True # Assume valid if no validation method
|
|
379
|
+
|
|
380
|
+
except Exception as e:
|
|
381
|
+
status["error_message"] = str(e)
|
|
382
|
+
status["recommendations"].append("Check .env file configuration and credentials")
|
|
383
|
+
|
|
384
|
+
return status
|