mcp-ticketer 0.4.5__tar.gz → 0.4.8__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.4.5 → mcp_ticketer-0.4.8}/Makefile +16 -2
- {mcp_ticketer-0.4.5/src/mcp_ticketer.egg-info → mcp_ticketer-0.4.8}/PKG-INFO +1 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/pyproject.toml +1 -1
- mcp_ticketer-0.4.8/src/mcp_ticketer/__init__.py +18 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/__version__.py +1 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/aitrackdown.py +2 -9
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/github.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/jira.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/adapter.py +28 -25
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/client.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/mappers.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/adapter_diagnostics.py +4 -2
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/configure.py +3 -9
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/discover.py +2 -6
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/main.py +4 -3
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/__init__.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/mcp/__init__.py +3 -3
- mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/__init__.py +21 -0
- mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/__main__.py +60 -0
- mcp_ticketer-0.4.5/src/mcp_ticketer/mcp/server.py → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/main.py +15 -35
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/__init__.py +7 -9
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/__init__.py +2 -3
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/manager.py +1 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8/src/mcp_ticketer.egg-info}/PKG-INFO +1 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/SOURCES.txt +16 -13
- mcp_ticketer-0.4.8/tests/adapters/linear/test_adapter_validation.py +183 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_client.py +2 -5
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_mappers.py +3 -7
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_queries.py +8 -24
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_types.py +9 -11
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_aitrackdown.py +2 -8
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_github.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_jira_direct.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_linear_config.py +0 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_linear_native.py +2 -2
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/cli/test_python_detection.py +3 -5
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/conftest.py +2 -8
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_env_discovery.py +3 -6
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_unified_env_loading.py +2 -5
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_complete_ticket_workflow.py +2 -8
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_all_adapters.py +4 -9
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_commenting_functionality.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_comprehensive.py +2 -8
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_hierarchy_and_workflow.py +2 -8
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_api_usage.py +2 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_codex_config.py +0 -1
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_models.py +2 -8
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_cache_memory.py +2 -6
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_core_exceptions.py +6 -14
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_core_models.py +2 -9
- mcp_ticketer-0.4.5/src/mcp_ticketer/__init__.py +0 -27
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.claude.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.coveragerc +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.cursor/mcp.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.env.example +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.github/workflows/docs.yml +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.github/workflows/publish.yml +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.github/workflows/test.yml +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.mcp/config.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.pre-commit-config.yaml +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.python-version +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.readthedocs.yaml +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CHANGELOG.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CLAUDE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CLI_RESTRUCTURE_REPORT.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CLI_RESTRUCTURE_TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/LICENSE +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/MANIFEST.in +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/PATH_TRAVERSAL_SECURITY_TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/README.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/SECURITY_RESCAN_REPORT.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/VERIFICATION_v0.4.3.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/debug_epic_creation.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/debug_full_flow.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/debug_worker_epic.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/ADAPTERS.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/AI_CLIENT_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/API_REFERENCE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/ATTACHMENTS.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/CONFIGURATION.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/DEVELOPER_GUIDE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/ENV_DISCOVERY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/MCP_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/MIGRATION_GUIDE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/PROJECT_CONFIG.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/PR_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/QUEUE_SYSTEM.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/QUICK_START.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/QUICK_START_ENV.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/README.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/USER_GUIDE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_archive/README.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/adapters/github.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/adapters.rst.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/api.rst.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/cli.rst.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/development.rst.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/examples.rst.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/index.rst.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/installation.rst.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/adapters/github.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/adapters.rst +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/api.rst +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/cli.rst +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/conf.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/CODE_STRUCTURE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/CONTRIBUTING.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/RELEASE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/RELEASING.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development.rst +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/examples.rst +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/index.rst +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/installation.rst +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/prd/mcp-ticketer-prd.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.4.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.5.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/CONFIG_RESOLUTION_FIX.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/VERIFICATION_RESULTS.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/requirements.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/CLAUDE_DESKTOP_SETUP.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/CODEX_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/JIRA_SETUP.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/LINEAR_SETUP.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/mcp-ticketer +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/mcp-ticketer-server +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/pytest.ini +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/requirements-dev.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/requirements.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/README.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/install.sh +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/manage_version.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/mcp_server.sh +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/test_set_command.sh +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/setup.cfg +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/setup.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/__init__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/hybrid.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/types.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cache/__init__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cache/memory.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/__init__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/codex_configure.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/diagnostics.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/gemini_configure.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/linear_commands.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/mcp_configure.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/migrate_config.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/platform_commands.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/python_detection.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/queue_commands.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/simple_health.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/ticket_commands.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/utils.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/adapter.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/config.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/env_discovery.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/env_loader.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/exceptions.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/http_client.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/mappers.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/models.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/project_config.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/registry.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/mcp/__main__.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/constants.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/dto.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/response_builder.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/server_sdk.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/attachment_tools.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/bulk_tools.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/comment_tools.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/hierarchy_tools.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/pr_tools.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/search_tools.py +0 -0
- {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/ticket_tools.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/py.typed +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/__main__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/health_monitor.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/queue.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/run_worker.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/ticket_registry.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/worker.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/requires.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/test-tickets/tickets/task-20250924002724.json +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/test_linear_fixes.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/test_worker_persistence.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/README.md +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/__init__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_adapter.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_aitrackdown_security.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_github_token.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_jira.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_jira_projects.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_linear.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/debug_credential_validation.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_actual_worker_execution.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_config_resolution.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_environment_handoff.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_queue_processing.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_queue_system.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_adapter_cache.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_cli_config.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_cli_vs_simulation.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_linear_teams.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_search.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_test.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_adapter.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_simulation.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_subprocess.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_comments_and_attachments.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_complete_workflow.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_hierarchy_validation.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_state_transitions.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_aitrackdown_commenting.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_jira_github_adapters.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_mcp_server_qa.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_pr_functionality.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_serve_config.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_user_assignment.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/performance/test_optimizations.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/performance/test_performance.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/run_comprehensive_tests.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_base_adapter.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_basic.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_comprehensive_qa.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_error_handling.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_linear_teams.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_queue.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/__init__.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_core_registry.py +0 -0
- {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tox.ini +0 -0
|
@@ -118,12 +118,26 @@ build: clean-build ## Build distribution packages
|
|
|
118
118
|
|
|
119
119
|
publish-test: check-release format lint test test-e2e build ## Build and publish to TestPyPI
|
|
120
120
|
@echo "Publishing to TestPyPI..."
|
|
121
|
-
|
|
121
|
+
@if [ -f .env.local ]; then \
|
|
122
|
+
echo "Loading PyPI credentials from .env.local..."; \
|
|
123
|
+
export $$(grep -E '^(TWINE_USERNAME|TWINE_PASSWORD)=' .env.local | xargs) && \
|
|
124
|
+
twine upload --repository testpypi dist/*; \
|
|
125
|
+
else \
|
|
126
|
+
echo "No .env.local found, using default credentials (~/.pypirc or environment)..."; \
|
|
127
|
+
twine upload --repository testpypi dist/*; \
|
|
128
|
+
fi
|
|
122
129
|
@echo "Published to TestPyPI!"
|
|
123
130
|
|
|
124
131
|
publish-prod: check-release format lint test test-e2e build ## Build and publish to PyPI
|
|
125
132
|
@echo "Publishing to PyPI..."
|
|
126
|
-
|
|
133
|
+
@if [ -f .env.local ]; then \
|
|
134
|
+
echo "Loading PyPI credentials from .env.local..."; \
|
|
135
|
+
export $$(grep -E '^(TWINE_USERNAME|TWINE_PASSWORD)=' .env.local | xargs) && \
|
|
136
|
+
twine upload dist/*; \
|
|
137
|
+
else \
|
|
138
|
+
echo "No .env.local found, using default credentials (~/.pypirc or environment)..."; \
|
|
139
|
+
twine upload dist/*; \
|
|
140
|
+
fi
|
|
127
141
|
@echo "Published successfully!"
|
|
128
142
|
|
|
129
143
|
publish: publish-prod ## Alias for publish-prod
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.8
|
|
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,18 @@
|
|
|
1
|
+
"""MCP Ticketer - Universal ticket management interface."""
|
|
2
|
+
|
|
3
|
+
from .__version__ import (__author__, __author_email__, __copyright__,
|
|
4
|
+
__description__, __license__, __title__, __version__,
|
|
5
|
+
__version_info__, get_user_agent, get_version)
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"__version__",
|
|
9
|
+
"__version_info__",
|
|
10
|
+
"__title__",
|
|
11
|
+
"__description__",
|
|
12
|
+
"__author__",
|
|
13
|
+
"__author_email__",
|
|
14
|
+
"__license__",
|
|
15
|
+
"__copyright__",
|
|
16
|
+
"get_version",
|
|
17
|
+
"get_user_agent",
|
|
18
|
+
]
|
|
@@ -10,15 +10,8 @@ from typing import Any
|
|
|
10
10
|
from ..core.adapter import BaseAdapter
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
|
-
from ..core.models import (
|
|
14
|
-
|
|
15
|
-
Comment,
|
|
16
|
-
Epic,
|
|
17
|
-
Priority,
|
|
18
|
-
SearchQuery,
|
|
19
|
-
Task,
|
|
20
|
-
TicketState,
|
|
21
|
-
)
|
|
13
|
+
from ..core.models import (Attachment, Comment, Epic, Priority, SearchQuery,
|
|
14
|
+
Task, TicketState)
|
|
22
15
|
from ..core.registry import AdapterRegistry
|
|
23
16
|
|
|
24
17
|
# Import ai-trackdown-pytools when available
|
|
@@ -9,7 +9,8 @@ import httpx
|
|
|
9
9
|
|
|
10
10
|
from ..core.adapter import BaseAdapter
|
|
11
11
|
from ..core.env_loader import load_adapter_config, validate_adapter_config
|
|
12
|
-
from ..core.models import Comment, Epic, Priority, SearchQuery, Task,
|
|
12
|
+
from ..core.models import (Comment, Epic, Priority, SearchQuery, Task,
|
|
13
|
+
TicketState)
|
|
13
14
|
from ..core.registry import AdapterRegistry
|
|
14
15
|
|
|
15
16
|
|
|
@@ -13,7 +13,8 @@ from httpx import AsyncClient, HTTPStatusError, TimeoutException
|
|
|
13
13
|
|
|
14
14
|
from ..core.adapter import BaseAdapter
|
|
15
15
|
from ..core.env_loader import load_adapter_config, validate_adapter_config
|
|
16
|
-
from ..core.models import Comment, Epic, Priority, SearchQuery, Task,
|
|
16
|
+
from ..core.models import (Comment, Epic, Priority, SearchQuery, Task,
|
|
17
|
+
TicketState)
|
|
17
18
|
from ..core.registry import AdapterRegistry
|
|
18
19
|
|
|
19
20
|
logger = logging.getLogger(__name__)
|
|
@@ -20,27 +20,15 @@ from ...core.adapter import BaseAdapter
|
|
|
20
20
|
from ...core.models import Comment, Epic, SearchQuery, Task, TicketState
|
|
21
21
|
from ...core.registry import AdapterRegistry
|
|
22
22
|
from .client import LinearGraphQLClient
|
|
23
|
-
from .mappers import (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
)
|
|
30
|
-
from .
|
|
31
|
-
|
|
32
|
-
CREATE_ISSUE_MUTATION,
|
|
33
|
-
LIST_ISSUES_QUERY,
|
|
34
|
-
SEARCH_ISSUES_QUERY,
|
|
35
|
-
UPDATE_ISSUE_MUTATION,
|
|
36
|
-
WORKFLOW_STATES_QUERY,
|
|
37
|
-
)
|
|
38
|
-
from .types import (
|
|
39
|
-
LinearStateMapping,
|
|
40
|
-
build_issue_filter,
|
|
41
|
-
get_linear_priority,
|
|
42
|
-
get_linear_state_type,
|
|
43
|
-
)
|
|
23
|
+
from .mappers import (build_linear_issue_input,
|
|
24
|
+
build_linear_issue_update_input,
|
|
25
|
+
map_linear_comment_to_comment, map_linear_issue_to_task,
|
|
26
|
+
map_linear_project_to_epic)
|
|
27
|
+
from .queries import (ALL_FRAGMENTS, CREATE_ISSUE_MUTATION, LIST_ISSUES_QUERY,
|
|
28
|
+
SEARCH_ISSUES_QUERY, UPDATE_ISSUE_MUTATION,
|
|
29
|
+
WORKFLOW_STATES_QUERY)
|
|
30
|
+
from .types import (LinearStateMapping, build_issue_filter,
|
|
31
|
+
get_linear_priority, get_linear_state_type)
|
|
44
32
|
|
|
45
33
|
|
|
46
34
|
class LinearAdapter(BaseAdapter[Task]):
|
|
@@ -94,10 +82,25 @@ class LinearAdapter(BaseAdapter[Task]):
|
|
|
94
82
|
"Linear API key is required (api_key or LINEAR_API_KEY env var)"
|
|
95
83
|
)
|
|
96
84
|
|
|
97
|
-
# Clean API key - remove
|
|
98
|
-
# (The client will add
|
|
99
|
-
if self.api_key
|
|
100
|
-
|
|
85
|
+
# Clean API key - remove common prefixes if accidentally included in config
|
|
86
|
+
# (The client will add Bearer back when making requests)
|
|
87
|
+
if isinstance(self.api_key, str):
|
|
88
|
+
# Remove Bearer prefix
|
|
89
|
+
if self.api_key.startswith("Bearer "):
|
|
90
|
+
self.api_key = self.api_key.replace("Bearer ", "")
|
|
91
|
+
# Remove environment variable name prefix (e.g., "LINEAR_API_KEY=")
|
|
92
|
+
if "=" in self.api_key:
|
|
93
|
+
parts = self.api_key.split("=", 1)
|
|
94
|
+
if len(parts) == 2 and parts[0].upper() in ("LINEAR_API_KEY", "API_KEY"):
|
|
95
|
+
self.api_key = parts[1]
|
|
96
|
+
|
|
97
|
+
# Validate API key format (Linear keys start with "lin_api_")
|
|
98
|
+
if not self.api_key.startswith("lin_api_"):
|
|
99
|
+
raise ValueError(
|
|
100
|
+
f"Invalid Linear API key format. Expected key starting with 'lin_api_', "
|
|
101
|
+
f"got: {self.api_key[:15]}... "
|
|
102
|
+
f"Please check your configuration and ensure the API key is correct."
|
|
103
|
+
)
|
|
101
104
|
|
|
102
105
|
self.workspace = config.get("workspace", "")
|
|
103
106
|
self.team_key = config.get("team_key")
|
|
@@ -16,7 +16,8 @@ except ImportError:
|
|
|
16
16
|
HTTPXAsyncTransport = None
|
|
17
17
|
TransportError = Exception
|
|
18
18
|
|
|
19
|
-
from ...core.exceptions import AdapterError, AuthenticationError,
|
|
19
|
+
from ...core.exceptions import (AdapterError, AuthenticationError,
|
|
20
|
+
RateLimitError)
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
class LinearGraphQLClient:
|
|
@@ -6,7 +6,8 @@ from datetime import datetime
|
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
8
|
from ...core.models import Comment, Epic, Priority, Task, TicketState
|
|
9
|
-
from .types import extract_linear_metadata, get_universal_priority,
|
|
9
|
+
from .types import (extract_linear_metadata, get_universal_priority,
|
|
10
|
+
get_universal_state)
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
def map_linear_issue_to_task(issue_data: dict[str, Any]) -> Task:
|
|
@@ -197,7 +197,8 @@ def _test_adapter_instantiation(console: Console) -> None:
|
|
|
197
197
|
if primary:
|
|
198
198
|
adapter_type = primary.adapter_type
|
|
199
199
|
# Build config from discovery
|
|
200
|
-
from ..mcp.server import
|
|
200
|
+
from ..mcp.server import \
|
|
201
|
+
_build_adapter_config_from_env_vars
|
|
201
202
|
|
|
202
203
|
config = _build_adapter_config_from_env_vars(adapter_type, {})
|
|
203
204
|
else:
|
|
@@ -384,7 +385,8 @@ def get_adapter_status() -> dict[str, Any]:
|
|
|
384
385
|
adapter_type = primary.adapter_type
|
|
385
386
|
status["configuration_source"] = primary.found_in
|
|
386
387
|
# Build basic config
|
|
387
|
-
from ..mcp.server import
|
|
388
|
+
from ..mcp.server import \
|
|
389
|
+
_build_adapter_config_from_env_vars
|
|
388
390
|
|
|
389
391
|
config = _build_adapter_config_from_env_vars(adapter_type, {})
|
|
390
392
|
else:
|
|
@@ -8,15 +8,9 @@ from rich.panel import Panel
|
|
|
8
8
|
from rich.prompt import Confirm, Prompt
|
|
9
9
|
from rich.table import Table
|
|
10
10
|
|
|
11
|
-
from ..core.project_config import (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
ConfigResolver,
|
|
15
|
-
ConfigValidator,
|
|
16
|
-
HybridConfig,
|
|
17
|
-
SyncStrategy,
|
|
18
|
-
TicketerConfig,
|
|
19
|
-
)
|
|
11
|
+
from ..core.project_config import (AdapterConfig, AdapterType, ConfigResolver,
|
|
12
|
+
ConfigValidator, HybridConfig, SyncStrategy,
|
|
13
|
+
TicketerConfig)
|
|
20
14
|
|
|
21
15
|
console = Console()
|
|
22
16
|
|
|
@@ -6,12 +6,8 @@ import typer
|
|
|
6
6
|
from rich.console import Console
|
|
7
7
|
|
|
8
8
|
from ..core.env_discovery import DiscoveredAdapter, EnvDiscovery
|
|
9
|
-
from ..core.project_config import (
|
|
10
|
-
|
|
11
|
-
ConfigResolver,
|
|
12
|
-
ConfigValidator,
|
|
13
|
-
TicketerConfig,
|
|
14
|
-
)
|
|
9
|
+
from ..core.project_config import (AdapterConfig, ConfigResolver,
|
|
10
|
+
ConfigValidator, TicketerConfig)
|
|
15
11
|
|
|
16
12
|
console = Console()
|
|
17
13
|
app = typer.Typer(help="Auto-discover configuration from .env files")
|
|
@@ -20,7 +20,8 @@ from ..core.models import Comment, SearchQuery
|
|
|
20
20
|
from ..queue import Queue, QueueStatus, WorkerManager
|
|
21
21
|
from ..queue.health_monitor import HealthStatus, QueueHealthMonitor
|
|
22
22
|
from ..queue.ticket_registry import TicketRegistry
|
|
23
|
-
from .configure import configure_wizard, set_adapter_config,
|
|
23
|
+
from .configure import (configure_wizard, set_adapter_config,
|
|
24
|
+
show_current_config)
|
|
24
25
|
from .diagnostics import run_diagnostics
|
|
25
26
|
from .discover import app as discover_app
|
|
26
27
|
from .migrate_config import migrate_config_command
|
|
@@ -575,7 +576,7 @@ def init(
|
|
|
575
576
|
)
|
|
576
577
|
|
|
577
578
|
# First try our improved .env configuration loader
|
|
578
|
-
from ..mcp.server import _load_env_configuration
|
|
579
|
+
from ..mcp.server.main import _load_env_configuration
|
|
579
580
|
|
|
580
581
|
env_config = _load_env_configuration()
|
|
581
582
|
|
|
@@ -2225,7 +2226,7 @@ def mcp_serve(
|
|
|
2225
2226
|
adapter_config = adapters_config.get(adapter_type, {})
|
|
2226
2227
|
else:
|
|
2227
2228
|
# Priority 2: .env files
|
|
2228
|
-
from ..mcp.server import _load_env_configuration
|
|
2229
|
+
from ..mcp.server.main import _load_env_configuration
|
|
2229
2230
|
|
|
2230
2231
|
env_config = _load_env_configuration()
|
|
2231
2232
|
if env_config:
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""Core models and abstractions for MCP Ticketer."""
|
|
2
2
|
|
|
3
3
|
from .adapter import BaseAdapter
|
|
4
|
-
from .models import Attachment, Comment, Epic, Priority, Task, TicketState,
|
|
4
|
+
from .models import (Attachment, Comment, Epic, Priority, Task, TicketState,
|
|
5
|
+
TicketType)
|
|
5
6
|
from .registry import AdapterRegistry
|
|
6
7
|
|
|
7
8
|
__all__ = [
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
if TYPE_CHECKING:
|
|
6
|
-
from .server import MCPTicketServer
|
|
6
|
+
from .server.main import MCPTicketServer
|
|
7
7
|
|
|
8
8
|
__all__ = ["MCPTicketServer"]
|
|
9
9
|
|
|
@@ -23,11 +23,11 @@ def __getattr__(name: str):
|
|
|
23
23
|
This prevents the RuntimeWarning when running:
|
|
24
24
|
python -m mcp_ticketer.mcp.server
|
|
25
25
|
|
|
26
|
-
The warning occurred because __init__.py imported server
|
|
26
|
+
The warning occurred because __init__.py imported server before
|
|
27
27
|
runpy could execute it as __main__.
|
|
28
28
|
"""
|
|
29
29
|
if name == "MCPTicketServer":
|
|
30
|
-
from .server import MCPTicketServer
|
|
30
|
+
from .server.main import MCPTicketServer
|
|
31
31
|
|
|
32
32
|
return MCPTicketServer
|
|
33
33
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""MCP Server package for mcp-ticketer.
|
|
2
|
+
|
|
3
|
+
This package provides the FastMCP server implementation for ticket management
|
|
4
|
+
operations via the Model Context Protocol (MCP).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from .main import main
|
|
11
|
+
|
|
12
|
+
__all__ = ["main"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def __getattr__(name: str):
|
|
16
|
+
"""Lazy import to avoid premature module loading."""
|
|
17
|
+
if name == "main":
|
|
18
|
+
from .main import main
|
|
19
|
+
|
|
20
|
+
return main
|
|
21
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Main entry point for MCP server module invocation.
|
|
2
|
+
|
|
3
|
+
This module enables running the MCP server via:
|
|
4
|
+
python -m mcp_ticketer.mcp.server [project_path]
|
|
5
|
+
|
|
6
|
+
This is the preferred invocation method for MCP configurations as it:
|
|
7
|
+
- Works reliably across installation methods (pipx, pip, uv)
|
|
8
|
+
- Doesn't depend on binary path detection
|
|
9
|
+
- Follows the proven mcp-vector-search pattern
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
from .main import main
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def run_server() -> None:
|
|
20
|
+
"""Run the MCP server with optional project path argument.
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
python -m mcp_ticketer.mcp.server
|
|
24
|
+
python -m mcp_ticketer.mcp.server /path/to/project
|
|
25
|
+
|
|
26
|
+
Arguments:
|
|
27
|
+
project_path (optional): Path to project directory for context
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
# Check for project path argument
|
|
31
|
+
if len(sys.argv) > 1:
|
|
32
|
+
project_path = Path(sys.argv[1])
|
|
33
|
+
|
|
34
|
+
# Validate project path exists
|
|
35
|
+
if not project_path.exists():
|
|
36
|
+
sys.stderr.write(f"Error: Project path does not exist: {project_path}\n")
|
|
37
|
+
sys.exit(1)
|
|
38
|
+
|
|
39
|
+
# Change to project directory for context
|
|
40
|
+
try:
|
|
41
|
+
import os
|
|
42
|
+
|
|
43
|
+
os.chdir(project_path)
|
|
44
|
+
sys.stderr.write(f"[MCP Server] Working directory: {project_path}\n")
|
|
45
|
+
except OSError as e:
|
|
46
|
+
sys.stderr.write(f"Warning: Could not change to project directory: {e}\n")
|
|
47
|
+
|
|
48
|
+
# Run the async main function
|
|
49
|
+
try:
|
|
50
|
+
asyncio.run(main())
|
|
51
|
+
except KeyboardInterrupt:
|
|
52
|
+
sys.stderr.write("\n[MCP Server] Interrupted by user\n")
|
|
53
|
+
sys.exit(0)
|
|
54
|
+
except Exception as e:
|
|
55
|
+
sys.stderr.write(f"[MCP Server] Fatal error: {e}\n")
|
|
56
|
+
sys.exit(1)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
if __name__ == "__main__":
|
|
60
|
+
run_server()
|
|
@@ -11,41 +11,21 @@ from dotenv import load_dotenv
|
|
|
11
11
|
# Import adapters module to trigger registration
|
|
12
12
|
import mcp_ticketer.adapters # noqa: F401
|
|
13
13
|
|
|
14
|
-
from
|
|
15
|
-
from
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
MSG_MISSING_TITLE,
|
|
30
|
-
MSG_NO_TICKETS_PROVIDED,
|
|
31
|
-
MSG_NO_UPDATES_PROVIDED,
|
|
32
|
-
MSG_TICKET_NOT_FOUND,
|
|
33
|
-
MSG_TRANSITION_FAILED,
|
|
34
|
-
MSG_UNKNOWN_METHOD,
|
|
35
|
-
MSG_UNKNOWN_OPERATION,
|
|
36
|
-
MSG_UPDATE_FAILED,
|
|
37
|
-
SERVER_NAME,
|
|
38
|
-
SERVER_VERSION,
|
|
39
|
-
STATUS_COMPLETED,
|
|
40
|
-
STATUS_ERROR,
|
|
41
|
-
)
|
|
42
|
-
from .dto import (
|
|
43
|
-
CreateEpicRequest,
|
|
44
|
-
CreateIssueRequest,
|
|
45
|
-
CreateTaskRequest,
|
|
46
|
-
CreateTicketRequest,
|
|
47
|
-
ReadTicketRequest,
|
|
48
|
-
)
|
|
14
|
+
from ...core import AdapterRegistry
|
|
15
|
+
from ...core.models import (Comment, Epic, Priority, SearchQuery, Task,
|
|
16
|
+
TicketState)
|
|
17
|
+
from .constants import (DEFAULT_BASE_PATH, DEFAULT_LIMIT, DEFAULT_MAX_DEPTH,
|
|
18
|
+
DEFAULT_OFFSET, ERROR_INTERNAL, ERROR_METHOD_NOT_FOUND,
|
|
19
|
+
ERROR_PARSE, JSONRPC_VERSION, MCP_PROTOCOL_VERSION,
|
|
20
|
+
MSG_EPIC_NOT_FOUND, MSG_INTERNAL_ERROR,
|
|
21
|
+
MSG_MISSING_TICKET_ID, MSG_MISSING_TITLE,
|
|
22
|
+
MSG_NO_TICKETS_PROVIDED, MSG_NO_UPDATES_PROVIDED,
|
|
23
|
+
MSG_TICKET_NOT_FOUND, MSG_TRANSITION_FAILED,
|
|
24
|
+
MSG_UNKNOWN_METHOD, MSG_UNKNOWN_OPERATION,
|
|
25
|
+
MSG_UPDATE_FAILED, SERVER_NAME, SERVER_VERSION,
|
|
26
|
+
STATUS_COMPLETED, STATUS_ERROR)
|
|
27
|
+
from .dto import (CreateEpicRequest, CreateIssueRequest, CreateTaskRequest,
|
|
28
|
+
CreateTicketRequest, ReadTicketRequest)
|
|
49
29
|
from .response_builder import ResponseBuilder
|
|
50
30
|
|
|
51
31
|
# Load environment variables early (prioritize .env.local)
|
|
@@ -17,15 +17,13 @@ Modules:
|
|
|
17
17
|
|
|
18
18
|
# Import all tool modules to register them with FastMCP
|
|
19
19
|
# Order matters - import core functionality first
|
|
20
|
-
from . import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
ticket_tools, # noqa: F401
|
|
28
|
-
)
|
|
20
|
+
from . import attachment_tools # noqa: F401
|
|
21
|
+
from . import bulk_tools # noqa: F401
|
|
22
|
+
from . import comment_tools # noqa: F401
|
|
23
|
+
from . import hierarchy_tools # noqa: F401
|
|
24
|
+
from . import pr_tools # noqa: F401
|
|
25
|
+
from . import search_tools # noqa: F401
|
|
26
|
+
from . import ticket_tools # noqa: F401
|
|
29
27
|
|
|
30
28
|
__all__ = [
|
|
31
29
|
"ticket_tools",
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"""Async queue system for mcp-ticketer."""
|
|
2
2
|
|
|
3
|
-
from .queue import Queue, QueueItem, QueueStatus
|
|
4
|
-
from .worker import Worker
|
|
5
|
-
|
|
6
3
|
# Import manager last to avoid circular import
|
|
7
4
|
from .manager import WorkerManager
|
|
5
|
+
from .queue import Queue, QueueItem, QueueStatus
|
|
6
|
+
from .worker import Worker
|
|
8
7
|
|
|
9
8
|
__all__ = ["Queue", "QueueItem", "QueueStatus", "Worker", "WorkerManager"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.8
|
|
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>
|
|
@@ -191,19 +191,21 @@ src/mcp_ticketer/core/project_config.py
|
|
|
191
191
|
src/mcp_ticketer/core/registry.py
|
|
192
192
|
src/mcp_ticketer/mcp/__init__.py
|
|
193
193
|
src/mcp_ticketer/mcp/__main__.py
|
|
194
|
-
src/mcp_ticketer/mcp/
|
|
195
|
-
src/mcp_ticketer/mcp/
|
|
196
|
-
src/mcp_ticketer/mcp/
|
|
197
|
-
src/mcp_ticketer/mcp/server.py
|
|
198
|
-
src/mcp_ticketer/mcp/
|
|
199
|
-
src/mcp_ticketer/mcp/
|
|
200
|
-
src/mcp_ticketer/mcp/
|
|
201
|
-
src/mcp_ticketer/mcp/tools/
|
|
202
|
-
src/mcp_ticketer/mcp/tools/
|
|
203
|
-
src/mcp_ticketer/mcp/tools/
|
|
204
|
-
src/mcp_ticketer/mcp/tools/
|
|
205
|
-
src/mcp_ticketer/mcp/tools/
|
|
206
|
-
src/mcp_ticketer/mcp/tools/
|
|
194
|
+
src/mcp_ticketer/mcp/server/__init__.py
|
|
195
|
+
src/mcp_ticketer/mcp/server/__main__.py
|
|
196
|
+
src/mcp_ticketer/mcp/server/constants.py
|
|
197
|
+
src/mcp_ticketer/mcp/server/dto.py
|
|
198
|
+
src/mcp_ticketer/mcp/server/main.py
|
|
199
|
+
src/mcp_ticketer/mcp/server/response_builder.py
|
|
200
|
+
src/mcp_ticketer/mcp/server/server_sdk.py
|
|
201
|
+
src/mcp_ticketer/mcp/server/tools/__init__.py
|
|
202
|
+
src/mcp_ticketer/mcp/server/tools/attachment_tools.py
|
|
203
|
+
src/mcp_ticketer/mcp/server/tools/bulk_tools.py
|
|
204
|
+
src/mcp_ticketer/mcp/server/tools/comment_tools.py
|
|
205
|
+
src/mcp_ticketer/mcp/server/tools/hierarchy_tools.py
|
|
206
|
+
src/mcp_ticketer/mcp/server/tools/pr_tools.py
|
|
207
|
+
src/mcp_ticketer/mcp/server/tools/search_tools.py
|
|
208
|
+
src/mcp_ticketer/mcp/server/tools/ticket_tools.py
|
|
207
209
|
src/mcp_ticketer/queue/__init__.py
|
|
208
210
|
src/mcp_ticketer/queue/__main__.py
|
|
209
211
|
src/mcp_ticketer/queue/health_monitor.py
|
|
@@ -238,6 +240,7 @@ tests/adapters/test_linear_config.py
|
|
|
238
240
|
tests/adapters/test_linear_native.py
|
|
239
241
|
tests/adapters/linear/__init__.py
|
|
240
242
|
tests/adapters/linear/test_adapter.py
|
|
243
|
+
tests/adapters/linear/test_adapter_validation.py
|
|
241
244
|
tests/adapters/linear/test_client.py
|
|
242
245
|
tests/adapters/linear/test_mappers.py
|
|
243
246
|
tests/adapters/linear/test_queries.py
|