mcp-ticketer 0.1.21__tar.gz → 0.1.22__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.22/.mcp/config.json +12 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/PKG-INFO +1 -1
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/pyproject.toml +1 -1
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/__init__.py +7 -7
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/__version__.py +4 -2
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/__init__.py +4 -4
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/aitrackdown.py +54 -38
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/github.py +175 -109
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/hybrid.py +90 -45
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/jira.py +139 -130
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/linear.py +374 -225
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cache/__init__.py +1 -1
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cache/memory.py +14 -15
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/__init__.py +1 -1
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/configure.py +69 -93
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/discover.py +43 -35
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/main.py +250 -293
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/mcp_configure.py +39 -15
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/migrate_config.py +10 -12
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/queue_commands.py +21 -58
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/utils.py +115 -60
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/__init__.py +2 -2
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/adapter.py +36 -30
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/config.py +113 -77
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/env_discovery.py +51 -19
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/http_client.py +46 -29
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/mappers.py +79 -35
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/models.py +29 -15
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/project_config.py +131 -66
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/registry.py +12 -12
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/mcp/__init__.py +1 -1
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/mcp/server.py +183 -129
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/__init__.py +2 -2
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/__main__.py +1 -1
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/manager.py +29 -25
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/queue.py +144 -82
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/run_worker.py +2 -3
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/worker.py +48 -33
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/PKG-INFO +1 -1
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/SOURCES.txt +3 -2
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/adapters/test_aitrackdown.py +42 -13
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/conftest.py +8 -5
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/core/test_env_discovery.py +11 -8
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/test_base_adapter.py +10 -5
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/test_queue.py +1 -4
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/.dependency_cache +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/.mpm_deployment_state +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/agent-manager.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/agentic-coder-optimizer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/api_qa.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/clerk-ops.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/code_analyzer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/content-agent.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/dart_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/data_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/documentation.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/gcp_ops_agent.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/golang_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/imagemagick.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/java_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/local_ops_agent.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/memory_manager.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/nextjs_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/ops.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/php-engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/product_owner.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/project_organizer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/prompt-engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/python_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/qa.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/react_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/refactoring_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/research.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/ruby-engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/rust_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/security.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/ticketing.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/typescript_engineer.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/vercel_ops_agent.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/version_control.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/web_qa.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/web_ui.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/mcp.json +0 -0
- mcp_ticketer-0.1.21/.mcp/config.json → mcp_ticketer-0.1.22/.claude/mcp.local.json +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/config/project.json +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/mcp_auto_config_preference.json +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/README.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/agentic_coder_optimizer_memories.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/documentation_memories.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/engineer_memories.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/ops_memories.md +0 -0
- mcp_ticketer-0.1.21/.claude-mpm/memories/project_knowledge.md → mcp_ticketer-0.1.22/.claude-mpm/memories/project_knowledge_memories.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/qa_memories.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/research_memories.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/version-control_memories.md +0 -0
- mcp_ticketer-0.1.21/.claude-mpm/memories/workflows.md → mcp_ticketer-0.1.22/.claude-mpm/memories/workflows_memories.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude.json +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.coveragerc +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.env.example +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.github/workflows/docs.yml +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.github/workflows/publish.yml +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.github/workflows/test.yml +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.pre-commit-config.yaml +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.python-version +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.readthedocs.yaml +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CHANGELOG.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CLAUDE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CLAUDE_DESKTOP_SETUP.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CODE_STRUCTURE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CONFIG_RESOLUTION_FIX.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CONTRIBUTING.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CREDENTIAL_VALIDATION_FIX.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/ENV_DISCOVERY_COMPLETE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/JIRA_SETUP.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/LICENSE +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/LINEAR_SETUP.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/MANIFEST.in +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/Makefile +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/OPTIMIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/QUEUE_SYSTEM.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/QUICK_START.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/README.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/RELEASE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/RELEASING.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/TEST_COVERAGE_REPORT.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/TEST_REPORT.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/TEST_RESULTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/VERIFICATION_RESULTS.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/claude-desktop-config.json +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/debug_search.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/debug_test.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/ADAPTERS.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/API_REFERENCE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/CONFIGURATION.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/DEVELOPER_GUIDE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/ENV_DISCOVERY.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/MCP_INTEGRATION.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/MIGRATION_GUIDE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/PROJECT_CONFIG.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/PR_INTEGRATION.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/QUICK_START_ENV.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/USER_GUIDE.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_archive/README.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/adapters/github.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/adapters.rst.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/api.rst.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/cli.rst.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/development.rst.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/examples.rst.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/index.rst.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/installation.rst.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/adapters/github.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/adapters.rst +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/api.rst +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/cli.rst +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/conf.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/development.rst +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/examples.rst +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/index.rst +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/installation.rst +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/prd/mcp-ticketer-prd.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/requirements.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/install.sh +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/mcp-ticketer +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/mcp-ticketer-server +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/mcp_server.sh +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/pytest.ini +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/requirements-dev.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/requirements.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/scripts/README.md +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/scripts/manage_version.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/setup.cfg +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/setup.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/py.typed +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/requires.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test-tickets/tickets/task-20250924002724.json +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_all_adapters.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_api_usage.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_basic.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_comprehensive.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_config_resolution.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_credential_validation.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_error_handling.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_github.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_github_token.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_jira.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_linear.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_linear_native.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_linear_teams.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_mcp_server_qa.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_optimizations.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_performance.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_pr_functionality.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_queue_system.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_serve_config.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_set_command.sh +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/adapters/__init__.py +0 -0
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/test_models.py +3 -3
- {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tox.ini +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"mcp-ticketer": {
|
|
4
|
+
"command": "/Users/masa/Projects/mcp-ticketer/.venv/bin/mcp-ticketer",
|
|
5
|
+
"args": ["serve"],
|
|
6
|
+
"cwd": "/Users/masa/Projects/mcp-ticketer",
|
|
7
|
+
"env": {
|
|
8
|
+
"PYTHONPATH": "/Users/masa/Projects/mcp-ticketer/src"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.22
|
|
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>
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"""MCP Ticketer - Universal ticket management interface."""
|
|
2
2
|
|
|
3
3
|
from .__version__ import (
|
|
4
|
-
__version__,
|
|
5
|
-
__version_info__,
|
|
6
|
-
__title__,
|
|
7
|
-
__description__,
|
|
8
4
|
__author__,
|
|
9
5
|
__author_email__,
|
|
10
|
-
__license__,
|
|
11
6
|
__copyright__,
|
|
12
|
-
|
|
7
|
+
__description__,
|
|
8
|
+
__license__,
|
|
9
|
+
__title__,
|
|
10
|
+
__version__,
|
|
11
|
+
__version_info__,
|
|
13
12
|
get_user_agent,
|
|
13
|
+
get_version,
|
|
14
14
|
)
|
|
15
15
|
|
|
16
16
|
__all__ = [
|
|
@@ -24,4 +24,4 @@ __all__ = [
|
|
|
24
24
|
"__copyright__",
|
|
25
25
|
"get_version",
|
|
26
26
|
"get_user_agent",
|
|
27
|
-
]
|
|
27
|
+
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Version information for mcp-ticketer package."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.1.
|
|
3
|
+
__version__ = "0.1.22"
|
|
4
4
|
__version_info__ = tuple(int(part) for part in __version__.split("."))
|
|
5
5
|
|
|
6
6
|
# Package metadata
|
|
@@ -26,6 +26,7 @@ __features__ = {
|
|
|
26
26
|
"queue_system": True,
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
|
|
29
30
|
def get_version():
|
|
30
31
|
"""Return the full version string with build metadata if available."""
|
|
31
32
|
version = __version__
|
|
@@ -35,6 +36,7 @@ def get_version():
|
|
|
35
36
|
version += f".{__commit__[:7]}"
|
|
36
37
|
return version
|
|
37
38
|
|
|
39
|
+
|
|
38
40
|
def get_user_agent():
|
|
39
41
|
"""Return a user agent string for API requests."""
|
|
40
|
-
return f"{__title__}/{__version__}"
|
|
42
|
+
return f"{__title__}/{__version__}"
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"""Adapter implementations for various ticket systems."""
|
|
2
2
|
|
|
3
3
|
from .aitrackdown import AITrackdownAdapter
|
|
4
|
-
from .linear import LinearAdapter
|
|
5
|
-
from .jira import JiraAdapter
|
|
6
4
|
from .github import GitHubAdapter
|
|
7
5
|
from .hybrid import HybridAdapter
|
|
6
|
+
from .jira import JiraAdapter
|
|
7
|
+
from .linear import LinearAdapter
|
|
8
8
|
|
|
9
9
|
__all__ = [
|
|
10
10
|
"AITrackdownAdapter",
|
|
11
11
|
"LinearAdapter",
|
|
12
12
|
"JiraAdapter",
|
|
13
13
|
"GitHubAdapter",
|
|
14
|
-
"HybridAdapter"
|
|
15
|
-
]
|
|
14
|
+
"HybridAdapter",
|
|
15
|
+
]
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
"""AI-Trackdown adapter implementation."""
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from typing import List, Optional, Dict, Any, Union
|
|
6
4
|
from datetime import datetime
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Dict, List, Optional, Union
|
|
7
7
|
|
|
8
8
|
from ..core.adapter import BaseAdapter
|
|
9
|
-
from ..core.models import
|
|
9
|
+
from ..core.models import Comment, Epic, Priority, SearchQuery, Task, TicketState
|
|
10
10
|
from ..core.registry import AdapterRegistry
|
|
11
11
|
|
|
12
12
|
# Import ai-trackdown-pytools when available
|
|
13
13
|
try:
|
|
14
|
-
from ai_trackdown_pytools import AITrackdown
|
|
14
|
+
from ai_trackdown_pytools import AITrackdown
|
|
15
|
+
from ai_trackdown_pytools import Ticket as AITicket
|
|
16
|
+
|
|
15
17
|
HAS_AITRACKDOWN = True
|
|
16
18
|
except ImportError:
|
|
17
19
|
HAS_AITRACKDOWN = False
|
|
@@ -27,6 +29,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
27
29
|
|
|
28
30
|
Args:
|
|
29
31
|
config: Configuration with 'base_path' for tickets directory
|
|
32
|
+
|
|
30
33
|
"""
|
|
31
34
|
super().__init__(config)
|
|
32
35
|
self.base_path = Path(config.get("base_path", ".aitrackdown"))
|
|
@@ -47,6 +50,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
47
50
|
|
|
48
51
|
Returns:
|
|
49
52
|
(is_valid, error_message) - Always returns (True, "") for AITrackdown
|
|
53
|
+
|
|
50
54
|
"""
|
|
51
55
|
# AITrackdown is file-based and doesn't require API credentials
|
|
52
56
|
# Just verify the base_path is accessible
|
|
@@ -92,10 +96,16 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
92
96
|
parent_issue=ai_ticket.get("parent_issue"),
|
|
93
97
|
parent_epic=ai_ticket.get("parent_epic"),
|
|
94
98
|
assignee=ai_ticket.get("assignee"),
|
|
95
|
-
created_at=
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
created_at=(
|
|
100
|
+
datetime.fromisoformat(ai_ticket["created_at"])
|
|
101
|
+
if "created_at" in ai_ticket
|
|
102
|
+
else None
|
|
103
|
+
),
|
|
104
|
+
updated_at=(
|
|
105
|
+
datetime.fromisoformat(ai_ticket["updated_at"])
|
|
106
|
+
if "updated_at" in ai_ticket
|
|
107
|
+
else None
|
|
108
|
+
),
|
|
99
109
|
metadata={"ai_trackdown": ai_ticket},
|
|
100
110
|
)
|
|
101
111
|
|
|
@@ -109,10 +119,16 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
109
119
|
priority=self._priority_from_ai(ai_ticket.get("priority", "medium")),
|
|
110
120
|
tags=ai_ticket.get("tags", []),
|
|
111
121
|
child_issues=ai_ticket.get("child_issues", []),
|
|
112
|
-
created_at=
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
122
|
+
created_at=(
|
|
123
|
+
datetime.fromisoformat(ai_ticket["created_at"])
|
|
124
|
+
if "created_at" in ai_ticket and ai_ticket["created_at"]
|
|
125
|
+
else None
|
|
126
|
+
),
|
|
127
|
+
updated_at=(
|
|
128
|
+
datetime.fromisoformat(ai_ticket["updated_at"])
|
|
129
|
+
if "updated_at" in ai_ticket and ai_ticket["updated_at"]
|
|
130
|
+
else None
|
|
131
|
+
),
|
|
116
132
|
metadata={"ai_trackdown": ai_ticket},
|
|
117
133
|
)
|
|
118
134
|
|
|
@@ -124,7 +140,9 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
124
140
|
state_value = self._get_state_mapping()[task.state]
|
|
125
141
|
elif isinstance(task.state, str):
|
|
126
142
|
# Already a string, map to AI-Trackdown format if needed
|
|
127
|
-
state_value = task.state.replace(
|
|
143
|
+
state_value = task.state.replace(
|
|
144
|
+
"_", "-"
|
|
145
|
+
) # Convert snake_case to kebab-case
|
|
128
146
|
|
|
129
147
|
return {
|
|
130
148
|
"id": task.id,
|
|
@@ -149,7 +167,9 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
149
167
|
state_value = self._get_state_mapping()[epic.state]
|
|
150
168
|
elif isinstance(epic.state, str):
|
|
151
169
|
# Already a string, map to AI-Trackdown format if needed
|
|
152
|
-
state_value = epic.state.replace(
|
|
170
|
+
state_value = epic.state.replace(
|
|
171
|
+
"_", "-"
|
|
172
|
+
) # Convert snake_case to kebab-case
|
|
153
173
|
|
|
154
174
|
return {
|
|
155
175
|
"id": epic.id,
|
|
@@ -168,7 +188,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
168
188
|
"""Read ticket from file system."""
|
|
169
189
|
ticket_file = self.tickets_dir / f"{ticket_id}.json"
|
|
170
190
|
if ticket_file.exists():
|
|
171
|
-
with open(ticket_file
|
|
191
|
+
with open(ticket_file) as f:
|
|
172
192
|
return json.load(f)
|
|
173
193
|
return None
|
|
174
194
|
|
|
@@ -230,9 +250,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
230
250
|
return None
|
|
231
251
|
|
|
232
252
|
async def update(
|
|
233
|
-
self,
|
|
234
|
-
ticket_id: str,
|
|
235
|
-
updates: Union[Dict[str, Any], Task]
|
|
253
|
+
self, ticket_id: str, updates: Union[Dict[str, Any], Task]
|
|
236
254
|
) -> Optional[Task]:
|
|
237
255
|
"""Update a task."""
|
|
238
256
|
# Read existing ticket
|
|
@@ -244,7 +262,11 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
244
262
|
if isinstance(updates, Task):
|
|
245
263
|
# If updates is a Task object, copy all fields except frozen ones
|
|
246
264
|
for field in updates.__fields__:
|
|
247
|
-
if
|
|
265
|
+
if (
|
|
266
|
+
field not in ["ticket_type"]
|
|
267
|
+
and hasattr(updates, field)
|
|
268
|
+
and getattr(updates, field) is not None
|
|
269
|
+
):
|
|
248
270
|
setattr(existing, field, getattr(updates, field))
|
|
249
271
|
else:
|
|
250
272
|
# If updates is a dictionary
|
|
@@ -275,10 +297,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
275
297
|
return False
|
|
276
298
|
|
|
277
299
|
async def list(
|
|
278
|
-
self,
|
|
279
|
-
limit: int = 10,
|
|
280
|
-
offset: int = 0,
|
|
281
|
-
filters: Optional[Dict[str, Any]] = None
|
|
300
|
+
self, limit: int = 10, offset: int = 0, filters: Optional[Dict[str, Any]] = None
|
|
282
301
|
) -> List[Task]:
|
|
283
302
|
"""List tasks with pagination."""
|
|
284
303
|
tasks = []
|
|
@@ -295,7 +314,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
295
314
|
# Direct file operation - read all files, filter, then paginate
|
|
296
315
|
ticket_files = sorted(self.tickets_dir.glob("*.json"))
|
|
297
316
|
for ticket_file in ticket_files:
|
|
298
|
-
with open(ticket_file
|
|
317
|
+
with open(ticket_file) as f:
|
|
299
318
|
ai_ticket = json.load(f)
|
|
300
319
|
task = self._task_from_ai_ticket(ai_ticket)
|
|
301
320
|
|
|
@@ -319,7 +338,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
319
338
|
tasks.append(task)
|
|
320
339
|
|
|
321
340
|
# Apply pagination after filtering
|
|
322
|
-
tasks = tasks[offset:offset + limit]
|
|
341
|
+
tasks = tasks[offset : offset + limit]
|
|
323
342
|
|
|
324
343
|
return tasks
|
|
325
344
|
|
|
@@ -340,8 +359,10 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
340
359
|
# Text search in title and description
|
|
341
360
|
if query.query:
|
|
342
361
|
search_text = query.query.lower()
|
|
343
|
-
if (
|
|
344
|
-
search_text not in (task.
|
|
362
|
+
if (
|
|
363
|
+
search_text not in (task.title or "").lower()
|
|
364
|
+
and search_text not in (task.description or "").lower()
|
|
365
|
+
):
|
|
345
366
|
continue
|
|
346
367
|
|
|
347
368
|
# Tag filtering
|
|
@@ -356,12 +377,10 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
356
377
|
results.append(task)
|
|
357
378
|
|
|
358
379
|
# Apply pagination
|
|
359
|
-
return results[query.offset:query.offset + query.limit]
|
|
380
|
+
return results[query.offset : query.offset + query.limit]
|
|
360
381
|
|
|
361
382
|
async def transition_state(
|
|
362
|
-
self,
|
|
363
|
-
ticket_id: str,
|
|
364
|
-
target_state: TicketState
|
|
383
|
+
self, ticket_id: str, target_state: TicketState
|
|
365
384
|
) -> Optional[Task]:
|
|
366
385
|
"""Transition task to new state."""
|
|
367
386
|
# Validate transition
|
|
@@ -390,10 +409,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
390
409
|
return comment
|
|
391
410
|
|
|
392
411
|
async def get_comments(
|
|
393
|
-
self,
|
|
394
|
-
ticket_id: str,
|
|
395
|
-
limit: int = 10,
|
|
396
|
-
offset: int = 0
|
|
412
|
+
self, ticket_id: str, limit: int = 10, offset: int = 0
|
|
397
413
|
) -> List[Comment]:
|
|
398
414
|
"""Get comments for a task."""
|
|
399
415
|
comments = []
|
|
@@ -401,8 +417,8 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
401
417
|
|
|
402
418
|
if comments_dir.exists():
|
|
403
419
|
comment_files = sorted(comments_dir.glob("*.json"))
|
|
404
|
-
for comment_file in comment_files[offset:offset + limit]:
|
|
405
|
-
with open(comment_file
|
|
420
|
+
for comment_file in comment_files[offset : offset + limit]:
|
|
421
|
+
with open(comment_file) as f:
|
|
406
422
|
data = json.load(f)
|
|
407
423
|
if data.get("ticket_id") == ticket_id:
|
|
408
424
|
comments.append(Comment(**data))
|
|
@@ -411,4 +427,4 @@ class AITrackdownAdapter(BaseAdapter[Task]):
|
|
|
411
427
|
|
|
412
428
|
|
|
413
429
|
# Register the adapter
|
|
414
|
-
AdapterRegistry.register("aitrackdown", AITrackdownAdapter)
|
|
430
|
+
AdapterRegistry.register("aitrackdown", AITrackdownAdapter)
|