mcp-ticketer 0.4.2__tar.gz → 0.4.3__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.2 → mcp_ticketer-0.4.3}/.env.example +11 -4
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/CHANGELOG.md +72 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/PKG-INFO +61 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/README.md +59 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/API_REFERENCE.md +103 -0
- mcp_ticketer-0.4.3/docs/ATTACHMENTS.md +564 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/QUICK_START.md +64 -4
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/pyproject.toml +3 -3
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/pytest.ini +1 -0
- mcp_ticketer-0.4.3/src/mcp_ticketer/__init__.py +18 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/__version__.py +1 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/aitrackdown.py +243 -11
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/github.py +15 -14
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/hybrid.py +11 -11
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/jira.py +22 -25
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/adapter.py +9 -21
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/client.py +2 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/mappers.py +2 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cache/memory.py +6 -5
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/adapter_diagnostics.py +4 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/codex_configure.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/configure.py +7 -14
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/diagnostics.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/discover.py +6 -11
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/gemini_configure.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/linear_commands.py +6 -7
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/main.py +218 -242
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/mcp_configure.py +1 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/ticket_commands.py +27 -30
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/utils.py +23 -22
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/__init__.py +3 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/adapter.py +82 -13
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/config.py +27 -29
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/env_discovery.py +10 -10
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/env_loader.py +8 -8
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/http_client.py +16 -16
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/mappers.py +10 -10
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/models.py +50 -20
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/project_config.py +40 -34
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/registry.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/dto.py +32 -32
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/response_builder.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/server.py +17 -37
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/server_sdk.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/__init__.py +7 -9
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/attachment_tools.py +3 -4
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/comment_tools.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/hierarchy_tools.py +8 -8
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/pr_tools.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/search_tools.py +6 -6
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/ticket_tools.py +12 -12
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/health_monitor.py +4 -4
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/manager.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/queue.py +16 -16
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/ticket_registry.py +7 -7
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/worker.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/PKG-INFO +61 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/SOURCES.txt +2 -12
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_client.py +2 -5
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_mappers.py +9 -13
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_queries.py +8 -24
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_types.py +9 -11
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_aitrackdown.py +2 -8
- mcp_ticketer-0.4.3/tests/adapters/test_aitrackdown_security.py +338 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_github.py +2 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_jira_direct.py +2 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_linear_config.py +0 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_linear_native.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/conftest.py +2 -8
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_env_discovery.py +3 -6
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_unified_env_loading.py +2 -5
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_complete_ticket_workflow.py +2 -8
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_all_adapters.py +4 -9
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_commenting_functionality.py +2 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_comprehensive.py +2 -8
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_hierarchy_and_workflow.py +2 -8
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_mcp_server_qa.py +2 -2
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_api_usage.py +2 -1
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_models.py +2 -8
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_cache_memory.py +2 -6
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_core_exceptions.py +6 -14
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_core_models.py +2 -9
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_core_registry.py +5 -5
- mcp_ticketer-0.4.2/CLI_RESTRUCTURING_SUMMARY.md +0 -272
- mcp_ticketer-0.4.2/LINEAR_ADAPTER_REVIEW.md +0 -477
- mcp_ticketer-0.4.2/LINEAR_FIX_RECOMMENDATION.md +0 -292
- mcp_ticketer-0.4.2/LINEAR_GRAPHQL_TYPE_ANALYSIS.md +0 -300
- mcp_ticketer-0.4.2/LINEAR_LABEL_FIX_SUMMARY.md +0 -262
- mcp_ticketer-0.4.2/LINEAR_PATTERN_COMPARISON.md +0 -441
- mcp_ticketer-0.4.2/LINEAR_QUERY_ALTERNATIVE_ANALYSIS.md +0 -278
- mcp_ticketer-0.4.2/LINEAR_RESEARCH_SUMMARY.md +0 -423
- mcp_ticketer-0.4.2/LINEAR_TAGS_FIX_SUMMARY.md +0 -238
- mcp_ticketer-0.4.2/QUICK_WINS_IMPLEMENTATION.md +0 -320
- mcp_ticketer-0.4.2/SECURITY_SCAN_REPORT_v0.1.24.md +0 -668
- mcp_ticketer-0.4.2/V0.3.2_RELEASE_FIXES_SUMMARY.md +0 -472
- mcp_ticketer-0.4.2/src/mcp_ticketer/__init__.py +0 -27
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.claude.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.coveragerc +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.cursor/mcp.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.github/workflows/docs.yml +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.github/workflows/publish.yml +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.github/workflows/test.yml +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.mcp/config.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.pre-commit-config.yaml +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.python-version +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.readthedocs.yaml +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/CLAUDE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/LICENSE +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/MANIFEST.in +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/Makefile +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/debug_epic_creation.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/debug_full_flow.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/debug_worker_epic.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/ADAPTERS.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/AI_CLIENT_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/CONFIGURATION.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/DEVELOPER_GUIDE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/ENV_DISCOVERY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/MCP_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/MIGRATION_GUIDE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/PROJECT_CONFIG.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/PR_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/QUEUE_SYSTEM.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/QUICK_START_ENV.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/README.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/USER_GUIDE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_archive/README.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/adapters/github.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/adapters.rst.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/api.rst.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/cli.rst.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/development.rst.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/examples.rst.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/index.rst.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/installation.rst.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/adapters/github.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/adapters.rst +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/api.rst +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/cli.rst +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/conf.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/CODE_STRUCTURE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/CONTRIBUTING.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/RELEASE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/RELEASING.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development.rst +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/examples.rst +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/index.rst +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/installation.rst +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/prd/mcp-ticketer-prd.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.4.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.5.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/CONFIG_RESOLUTION_FIX.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/VERIFICATION_RESULTS.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/requirements.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/CLAUDE_DESKTOP_SETUP.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/CODEX_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/JIRA_SETUP.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/LINEAR_SETUP.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/mcp-ticketer +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/mcp-ticketer-server +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/requirements-dev.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/requirements.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/README.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/install.sh +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/manage_version.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/mcp_server.sh +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/test_set_command.sh +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/setup.cfg +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/setup.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/types.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cache/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/migrate_config.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/platform_commands.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/queue_commands.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/simple_health.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/exceptions.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/constants.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/bulk_tools.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/py.typed +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/__main__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/run_worker.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/requires.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/test-tickets/tickets/task-20250924002724.json +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/test_linear_fixes.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/test_worker_persistence.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/README.md +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_adapter.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_github_token.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_jira.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_jira_projects.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_linear.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/debug_credential_validation.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_actual_worker_execution.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_config_resolution.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_environment_handoff.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_queue_processing.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_queue_system.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_adapter_cache.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_cli_config.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_cli_vs_simulation.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_linear_teams.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_search.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_test.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_worker_adapter.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_worker_simulation.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_worker_subprocess.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_comments_and_attachments.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_complete_workflow.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_hierarchy_validation.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_state_transitions.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_aitrackdown_commenting.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_jira_github_adapters.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_pr_functionality.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_serve_config.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_user_assignment.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/performance/test_optimizations.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/performance/test_performance.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/run_comprehensive_tests.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_base_adapter.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_basic.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_codex_config.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_comprehensive_qa.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_error_handling.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_linear_teams.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_queue.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/__init__.py +0 -0
- {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tox.ini +0 -0
|
@@ -14,10 +14,17 @@
|
|
|
14
14
|
# Get your API key from: https://linear.app/settings/api
|
|
15
15
|
LINEAR_API_KEY=lin_api_YOUR_KEY_HERE
|
|
16
16
|
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
# Linear Team Identification - Choose ONE of the following:
|
|
18
|
+
# Option 1: Team key (recommended - short code like 'ENG', 'DESIGN', 'PRODUCT')
|
|
19
|
+
LINEAR_TEAM_KEY=ENG
|
|
20
|
+
|
|
21
|
+
# Option 2: Team UUID (for advanced use cases)
|
|
22
|
+
# LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
|
|
23
|
+
|
|
24
|
+
# How to find your team key:
|
|
25
|
+
# 1. Go to Linear Settings → Teams
|
|
26
|
+
# 2. Select your team
|
|
27
|
+
# 3. Look for the "Key" field (e.g., "ENG")
|
|
21
28
|
|
|
22
29
|
# Optional: Linear project ID
|
|
23
30
|
# LINEAR_PROJECT_ID=YOUR-PROJECT-ID
|
|
@@ -4,7 +4,78 @@ All notable changes to MCP Ticketer will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
-
## [
|
|
7
|
+
## [0.4.3] - 2025-10-27
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **LINEAR_TEAM_KEY Environment Variable**: Easier Linear configuration with team keys
|
|
11
|
+
- Added `LINEAR_TEAM_KEY` support as primary configuration option
|
|
12
|
+
- Team key (e.g., "ENG", "DESIGN") now recommended over team ID (UUID)
|
|
13
|
+
- Automatic resolution of team key to team ID in Linear adapter
|
|
14
|
+
- Updated `.env.example` with LINEAR_TEAM_KEY as default option
|
|
15
|
+
- CLI `init` command now prompts for team key by default
|
|
16
|
+
- **Command Synonyms**: Init, install, and setup commands are now fully synonymous
|
|
17
|
+
- `mcp-ticketer init` - Initialize configuration
|
|
18
|
+
- `mcp-ticketer install` - Install and configure (same as init)
|
|
19
|
+
- `mcp-ticketer setup` - Setup (same as init)
|
|
20
|
+
- All three commands accept identical parameters and behave identically
|
|
21
|
+
- **Attachment Model**: Universal file attachment support
|
|
22
|
+
- New `Attachment` model in core models for cross-adapter attachment representation
|
|
23
|
+
- Fields: id, ticket_id, filename, url, content_type, size_bytes, created_at, created_by, description, metadata
|
|
24
|
+
- Full documentation in new `docs/ATTACHMENTS.md` guide
|
|
25
|
+
- **AITrackdown Attachment Support**: Complete file attachment implementation
|
|
26
|
+
- `add_attachment()` - Upload files to local filesystem with security features
|
|
27
|
+
- `get_attachments()` - List all attachments for a ticket
|
|
28
|
+
- `delete_attachment()` - Remove specific attachments
|
|
29
|
+
- Local filesystem storage in `.aitrackdown/attachments/<ticket-id>/` directories
|
|
30
|
+
- Automatic filename sanitization to prevent security issues
|
|
31
|
+
- SHA256 checksumming for file integrity verification
|
|
32
|
+
- MIME type detection based on file extension
|
|
33
|
+
- Size validation with configurable limits (default 100MB)
|
|
34
|
+
- Organized per-ticket storage structure
|
|
35
|
+
- **MCP Attachment Tools**: AI agent attachment support with fallback
|
|
36
|
+
- `ticket_attach` - Add file attachments via MCP
|
|
37
|
+
- `ticket_attachments` - List attachments via MCP
|
|
38
|
+
- `ticket_delete_attachment` - Delete attachments via MCP
|
|
39
|
+
- Automatic fallback to comments for adapters without attachment support
|
|
40
|
+
- Graceful degradation for Linear, Jira, and GitHub adapters
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- **Linear Configuration**: LINEAR_TEAM_KEY is now the primary/recommended option
|
|
44
|
+
- Team ID (LINEAR_TEAM_ID) still supported for backward compatibility
|
|
45
|
+
- CLI init flow updated to prompt for team key first
|
|
46
|
+
- Documentation updated across README, QUICK_START, and setup guides
|
|
47
|
+
- **Environment Variable Priority**: LINEAR_TEAM_KEY takes precedence over LINEAR_TEAM_ID
|
|
48
|
+
- When both are present, LINEAR_TEAM_KEY is used
|
|
49
|
+
- Adapter automatically resolves team key to team ID via GraphQL
|
|
50
|
+
- **Documentation Structure**: New comprehensive attachment documentation
|
|
51
|
+
- Created `docs/ATTACHMENTS.md` (400+ lines)
|
|
52
|
+
- Updated README.md with attachment examples and LINEAR_TEAM_KEY info
|
|
53
|
+
- Updated QUICK_START.md with attachment usage and Linear team key setup
|
|
54
|
+
- Updated API_REFERENCE.md with complete Attachment model specification
|
|
55
|
+
- Added configuration section to README with Linear setup details
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
- **LINEAR_TEAM_KEY Environment Loading**: Proper loading from .env files
|
|
59
|
+
- Fixed `project_config.py` to check all LINEAR_* environment variables
|
|
60
|
+
- Environment variable discovery now detects LINEAR_TEAM_KEY
|
|
61
|
+
- Resolves issues where LINEAR_TEAM_KEY wasn't being recognized
|
|
62
|
+
|
|
63
|
+
### Documentation
|
|
64
|
+
- **New Files**:
|
|
65
|
+
- `docs/ATTACHMENTS.md` - Comprehensive attachment guide with examples, security notes, and roadmap
|
|
66
|
+
- **Updated Files**:
|
|
67
|
+
- `README.md` - Added attachment features, LINEAR_TEAM_KEY configuration, and command synonyms
|
|
68
|
+
- `docs/QUICK_START.md` - Added attachment examples and LINEAR_TEAM_KEY setup instructions
|
|
69
|
+
- `docs/API_REFERENCE.md` - Added Attachment model specification and adapter methods
|
|
70
|
+
- `.env.example` - Updated with LINEAR_TEAM_KEY as primary option with clear instructions
|
|
71
|
+
|
|
72
|
+
### Security
|
|
73
|
+
- **Attachment Security Features**:
|
|
74
|
+
- Filename sanitization prevents path traversal and injection attacks
|
|
75
|
+
- Path resolution validates files stay within allowed directories
|
|
76
|
+
- File size limits prevent disk exhaustion
|
|
77
|
+
- SHA256 checksums enable integrity verification
|
|
78
|
+
- Isolated per-ticket storage prevents cross-ticket access
|
|
8
79
|
|
|
9
80
|
## [0.3.6] - 2025-01-25
|
|
10
81
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
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>
|
|
@@ -30,7 +30,7 @@ Classifier: Topic :: Software Development :: Bug Tracking
|
|
|
30
30
|
Classifier: Topic :: System :: Monitoring
|
|
31
31
|
Classifier: Topic :: Internet :: WWW/HTTP
|
|
32
32
|
Classifier: Typing :: Typed
|
|
33
|
-
Requires-Python: >=3.
|
|
33
|
+
Requires-Python: >=3.10
|
|
34
34
|
Description-Content-Type: text/markdown
|
|
35
35
|
License-File: LICENSE
|
|
36
36
|
Requires-Dist: gql[httpx]>=3.0.0
|
|
@@ -104,6 +104,7 @@ Universal ticket management interface for AI agents with MCP (Model Context Prot
|
|
|
104
104
|
- **🎨 Rich CLI**: Beautiful terminal interface with colors and tables
|
|
105
105
|
- **📊 State Machine**: Built-in state transitions with validation
|
|
106
106
|
- **🔍 Advanced Search**: Full-text search with multiple filters
|
|
107
|
+
- **📎 File Attachments**: Upload, list, and manage ticket attachments (AITrackdown adapter)
|
|
107
108
|
- **📦 Easy Installation**: Available on PyPI with simple pip install
|
|
108
109
|
|
|
109
110
|
## 📦 Installation
|
|
@@ -183,6 +184,10 @@ mcp-ticketer install
|
|
|
183
184
|
mcp-ticketer init --adapter aitrackdown
|
|
184
185
|
|
|
185
186
|
# For Linear (requires API key)
|
|
187
|
+
# Option 1: Using team key (recommended)
|
|
188
|
+
mcp-ticketer init --adapter linear --team-key ENG
|
|
189
|
+
|
|
190
|
+
# Option 2: Using team ID
|
|
186
191
|
mcp-ticketer init --adapter linear --team-id YOUR_TEAM_ID
|
|
187
192
|
|
|
188
193
|
# For JIRA (requires server and credentials)
|
|
@@ -194,6 +199,11 @@ mcp-ticketer init --adapter jira \
|
|
|
194
199
|
mcp-ticketer init --adapter github --repo owner/repo
|
|
195
200
|
```
|
|
196
201
|
|
|
202
|
+
**Note:** The following commands are synonymous and can be used interchangeably:
|
|
203
|
+
- `mcp-ticketer init` - Initialize configuration
|
|
204
|
+
- `mcp-ticketer install` - Install and configure (same as init)
|
|
205
|
+
- `mcp-ticketer setup` - Setup (same as init)
|
|
206
|
+
|
|
197
207
|
### 2. Create Your First Ticket
|
|
198
208
|
|
|
199
209
|
```bash
|
|
@@ -222,6 +232,24 @@ mcp-ticketer transition TICKET-123 in_progress
|
|
|
222
232
|
mcp-ticketer search "login bug" --state open
|
|
223
233
|
```
|
|
224
234
|
|
|
235
|
+
### 4. Working with Attachments (AITrackdown)
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Add attachment via MCP tools
|
|
239
|
+
mcp-ticketer mcp call ticket_attach '{
|
|
240
|
+
"ticket_id": "task-123",
|
|
241
|
+
"file_path": "/path/to/document.pdf",
|
|
242
|
+
"description": "Project specification"
|
|
243
|
+
}'
|
|
244
|
+
|
|
245
|
+
# List attachments
|
|
246
|
+
mcp-ticketer mcp call ticket_attachments '{
|
|
247
|
+
"ticket_id": "task-123"
|
|
248
|
+
}'
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
For programmatic access, see the [Attachments Guide](docs/ATTACHMENTS.md).
|
|
252
|
+
|
|
225
253
|
## 🤖 MCP Server Integration
|
|
226
254
|
|
|
227
255
|
MCP Ticketer provides seamless integration with AI clients through automatic configuration:
|
|
@@ -266,6 +294,37 @@ mcp-ticketer uninstall auggie # Alias for remove
|
|
|
266
294
|
|
|
267
295
|
**See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for client-specific details.**
|
|
268
296
|
|
|
297
|
+
## ⚙️ Configuration
|
|
298
|
+
|
|
299
|
+
### Linear Configuration
|
|
300
|
+
|
|
301
|
+
Configure Linear using either a team **key** (recommended) or team **ID**:
|
|
302
|
+
|
|
303
|
+
**Option 1: Team Key** (Recommended)
|
|
304
|
+
```bash
|
|
305
|
+
# In .env or environment
|
|
306
|
+
LINEAR_API_KEY=lin_api_...
|
|
307
|
+
LINEAR_TEAM_KEY=ENG
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**Option 2: Team ID**
|
|
311
|
+
```bash
|
|
312
|
+
# In .env or environment
|
|
313
|
+
LINEAR_API_KEY=lin_api_...
|
|
314
|
+
LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**Finding your team key in Linear:**
|
|
318
|
+
1. Go to Linear Settings → Teams
|
|
319
|
+
2. Select your team
|
|
320
|
+
3. Look for the "Key" field (e.g., "ENG", "DESIGN", "PRODUCT")
|
|
321
|
+
|
|
322
|
+
The team key is a short, human-readable identifier that's easier to use than the UUID-based team ID.
|
|
323
|
+
|
|
324
|
+
### Environment Variables
|
|
325
|
+
|
|
326
|
+
See [.env.example](.env.example) for a complete list of supported environment variables for all adapters.
|
|
327
|
+
|
|
269
328
|
## 📚 Documentation
|
|
270
329
|
|
|
271
330
|
Full documentation is available at [https://mcp-ticketerer.readthedocs.io](https://mcp-ticketerer.readthedocs.io)
|
|
@@ -19,6 +19,7 @@ Universal ticket management interface for AI agents with MCP (Model Context Prot
|
|
|
19
19
|
- **🎨 Rich CLI**: Beautiful terminal interface with colors and tables
|
|
20
20
|
- **📊 State Machine**: Built-in state transitions with validation
|
|
21
21
|
- **🔍 Advanced Search**: Full-text search with multiple filters
|
|
22
|
+
- **📎 File Attachments**: Upload, list, and manage ticket attachments (AITrackdown adapter)
|
|
22
23
|
- **📦 Easy Installation**: Available on PyPI with simple pip install
|
|
23
24
|
|
|
24
25
|
## 📦 Installation
|
|
@@ -98,6 +99,10 @@ mcp-ticketer install
|
|
|
98
99
|
mcp-ticketer init --adapter aitrackdown
|
|
99
100
|
|
|
100
101
|
# For Linear (requires API key)
|
|
102
|
+
# Option 1: Using team key (recommended)
|
|
103
|
+
mcp-ticketer init --adapter linear --team-key ENG
|
|
104
|
+
|
|
105
|
+
# Option 2: Using team ID
|
|
101
106
|
mcp-ticketer init --adapter linear --team-id YOUR_TEAM_ID
|
|
102
107
|
|
|
103
108
|
# For JIRA (requires server and credentials)
|
|
@@ -109,6 +114,11 @@ mcp-ticketer init --adapter jira \
|
|
|
109
114
|
mcp-ticketer init --adapter github --repo owner/repo
|
|
110
115
|
```
|
|
111
116
|
|
|
117
|
+
**Note:** The following commands are synonymous and can be used interchangeably:
|
|
118
|
+
- `mcp-ticketer init` - Initialize configuration
|
|
119
|
+
- `mcp-ticketer install` - Install and configure (same as init)
|
|
120
|
+
- `mcp-ticketer setup` - Setup (same as init)
|
|
121
|
+
|
|
112
122
|
### 2. Create Your First Ticket
|
|
113
123
|
|
|
114
124
|
```bash
|
|
@@ -137,6 +147,24 @@ mcp-ticketer transition TICKET-123 in_progress
|
|
|
137
147
|
mcp-ticketer search "login bug" --state open
|
|
138
148
|
```
|
|
139
149
|
|
|
150
|
+
### 4. Working with Attachments (AITrackdown)
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Add attachment via MCP tools
|
|
154
|
+
mcp-ticketer mcp call ticket_attach '{
|
|
155
|
+
"ticket_id": "task-123",
|
|
156
|
+
"file_path": "/path/to/document.pdf",
|
|
157
|
+
"description": "Project specification"
|
|
158
|
+
}'
|
|
159
|
+
|
|
160
|
+
# List attachments
|
|
161
|
+
mcp-ticketer mcp call ticket_attachments '{
|
|
162
|
+
"ticket_id": "task-123"
|
|
163
|
+
}'
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For programmatic access, see the [Attachments Guide](docs/ATTACHMENTS.md).
|
|
167
|
+
|
|
140
168
|
## 🤖 MCP Server Integration
|
|
141
169
|
|
|
142
170
|
MCP Ticketer provides seamless integration with AI clients through automatic configuration:
|
|
@@ -181,6 +209,37 @@ mcp-ticketer uninstall auggie # Alias for remove
|
|
|
181
209
|
|
|
182
210
|
**See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for client-specific details.**
|
|
183
211
|
|
|
212
|
+
## ⚙️ Configuration
|
|
213
|
+
|
|
214
|
+
### Linear Configuration
|
|
215
|
+
|
|
216
|
+
Configure Linear using either a team **key** (recommended) or team **ID**:
|
|
217
|
+
|
|
218
|
+
**Option 1: Team Key** (Recommended)
|
|
219
|
+
```bash
|
|
220
|
+
# In .env or environment
|
|
221
|
+
LINEAR_API_KEY=lin_api_...
|
|
222
|
+
LINEAR_TEAM_KEY=ENG
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Option 2: Team ID**
|
|
226
|
+
```bash
|
|
227
|
+
# In .env or environment
|
|
228
|
+
LINEAR_API_KEY=lin_api_...
|
|
229
|
+
LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Finding your team key in Linear:**
|
|
233
|
+
1. Go to Linear Settings → Teams
|
|
234
|
+
2. Select your team
|
|
235
|
+
3. Look for the "Key" field (e.g., "ENG", "DESIGN", "PRODUCT")
|
|
236
|
+
|
|
237
|
+
The team key is a short, human-readable identifier that's easier to use than the UUID-based team ID.
|
|
238
|
+
|
|
239
|
+
### Environment Variables
|
|
240
|
+
|
|
241
|
+
See [.env.example](.env.example) for a complete list of supported environment variables for all adapters.
|
|
242
|
+
|
|
184
243
|
## 📚 Documentation
|
|
185
244
|
|
|
186
245
|
Full documentation is available at [https://mcp-ticketerer.readthedocs.io](https://mcp-ticketerer.readthedocs.io)
|
|
@@ -166,6 +166,71 @@ comment = Comment(
|
|
|
166
166
|
)
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
+
### Attachment
|
|
170
|
+
|
|
171
|
+
File attachments associated with tickets.
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
class Attachment(BaseModel):
|
|
175
|
+
"""File attachment metadata for tickets."""
|
|
176
|
+
|
|
177
|
+
id: Optional[str] = None
|
|
178
|
+
ticket_id: str
|
|
179
|
+
filename: str
|
|
180
|
+
url: Optional[str] = None
|
|
181
|
+
content_type: Optional[str] = None
|
|
182
|
+
size_bytes: Optional[int] = None
|
|
183
|
+
created_at: Optional[datetime] = None
|
|
184
|
+
created_by: Optional[str] = None
|
|
185
|
+
description: Optional[str] = None
|
|
186
|
+
metadata: Dict[str, Any] = {}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Fields:**
|
|
190
|
+
|
|
191
|
+
| Field | Type | Default | Description |
|
|
192
|
+
|-------|------|---------|-------------|
|
|
193
|
+
| `id` | `Optional[str]` | `None` | Attachment unique identifier |
|
|
194
|
+
| `ticket_id` | `str` | *Required* | Parent ticket identifier |
|
|
195
|
+
| `filename` | `str` | *Required* | Original filename |
|
|
196
|
+
| `url` | `Optional[str]` | `None` | Download URL or file:// path |
|
|
197
|
+
| `content_type` | `Optional[str]` | `None` | MIME type (e.g., 'application/pdf') |
|
|
198
|
+
| `size_bytes` | `Optional[int]` | `None` | File size in bytes |
|
|
199
|
+
| `created_at` | `Optional[datetime]` | `None` | Upload timestamp |
|
|
200
|
+
| `created_by` | `Optional[str]` | `None` | User who uploaded the attachment |
|
|
201
|
+
| `description` | `Optional[str]` | `None` | Attachment description or notes |
|
|
202
|
+
| `metadata` | `Dict[str, Any]` | `{}` | Adapter-specific attachment metadata |
|
|
203
|
+
|
|
204
|
+
**Example:**
|
|
205
|
+
```python
|
|
206
|
+
from datetime import datetime
|
|
207
|
+
|
|
208
|
+
attachment = Attachment(
|
|
209
|
+
id='20250127143000-document.pdf',
|
|
210
|
+
ticket_id='task-123',
|
|
211
|
+
filename='document.pdf',
|
|
212
|
+
url='file:///project/.aitrackdown/attachments/task-123/document.pdf',
|
|
213
|
+
content_type='application/pdf',
|
|
214
|
+
size_bytes=1048576,
|
|
215
|
+
created_at=datetime.now(),
|
|
216
|
+
created_by='user@example.com',
|
|
217
|
+
description='Project specification document',
|
|
218
|
+
metadata={
|
|
219
|
+
'checksum': 'a3c7f8d2e1b4c5f6...',
|
|
220
|
+
'sanitized_filename': 'document.pdf'
|
|
221
|
+
}
|
|
222
|
+
)
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Adapter Support:**
|
|
226
|
+
|
|
227
|
+
| Adapter | Support | Notes |
|
|
228
|
+
|---------|---------|-------|
|
|
229
|
+
| AITrackdown | ✅ Full | Local filesystem storage with security features |
|
|
230
|
+
| Jira | ❌ Planned | REST API v3 integration coming soon |
|
|
231
|
+
| Linear | ❌ Planned | GraphQL mutation support coming soon |
|
|
232
|
+
| GitHub | ❌ Not supported | GitHub Issues doesn't support direct attachments |
|
|
233
|
+
|
|
169
234
|
### SearchQuery
|
|
170
235
|
|
|
171
236
|
Query parameters for searching tickets.
|
|
@@ -364,6 +429,44 @@ class BaseAdapter(ABC, Generic[T]):
|
|
|
364
429
|
"""Get comments for a ticket."""
|
|
365
430
|
pass
|
|
366
431
|
|
|
432
|
+
# Attachment Operations
|
|
433
|
+
async def add_attachment(
|
|
434
|
+
self,
|
|
435
|
+
ticket_id: str,
|
|
436
|
+
file_path: str,
|
|
437
|
+
description: Optional[str] = None
|
|
438
|
+
) -> Attachment:
|
|
439
|
+
"""Add a file attachment to a ticket.
|
|
440
|
+
|
|
441
|
+
Default implementation raises NotImplementedError.
|
|
442
|
+
Adapters should override to provide attachment support.
|
|
443
|
+
"""
|
|
444
|
+
raise NotImplementedError(
|
|
445
|
+
f"{self.__class__.__name__} does not support attachments"
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
async def get_attachments(self, ticket_id: str) -> List[Attachment]:
|
|
449
|
+
"""Get all attachments for a ticket.
|
|
450
|
+
|
|
451
|
+
Default implementation returns empty list.
|
|
452
|
+
Adapters should override to provide attachment support.
|
|
453
|
+
"""
|
|
454
|
+
return []
|
|
455
|
+
|
|
456
|
+
async def delete_attachment(
|
|
457
|
+
self,
|
|
458
|
+
ticket_id: str,
|
|
459
|
+
attachment_id: str
|
|
460
|
+
) -> bool:
|
|
461
|
+
"""Delete a specific attachment.
|
|
462
|
+
|
|
463
|
+
Default implementation raises NotImplementedError.
|
|
464
|
+
Adapters should override to provide attachment support.
|
|
465
|
+
"""
|
|
466
|
+
raise NotImplementedError(
|
|
467
|
+
f"{self.__class__.__name__} does not support attachment deletion"
|
|
468
|
+
)
|
|
469
|
+
|
|
367
470
|
# State Mapping Utilities
|
|
368
471
|
def map_state_to_system(self, state: TicketState) -> str:
|
|
369
472
|
"""Map universal state to system-specific state."""
|