mcp-ticketer 0.4.0__tar.gz → 0.6.2__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.0 → mcp_ticketer-0.6.2}/.env.example +11 -4
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.github/workflows/publish.yml +1 -1
- mcp_ticketer-0.6.2/BEFORE_AFTER_COMPARISON.md +271 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/CHANGELOG.md +168 -1
- mcp_ticketer-0.6.2/CLI_RESTRUCTURE_REPORT.md +156 -0
- mcp_ticketer-0.6.2/CLI_RESTRUCTURE_TEST_REPORT.md +425 -0
- mcp_ticketer-0.6.2/ENV_LOADING_FIX.md +134 -0
- mcp_ticketer-0.6.2/FINAL_SUMMARY.md +291 -0
- mcp_ticketer-0.6.2/FINAL_VERIFICATION_REPORT.md +507 -0
- mcp_ticketer-0.6.2/FIXES_v0.4.10.md +282 -0
- mcp_ticketer-0.6.2/FIX_DISCOVERED_FLAG_BUG.md +145 -0
- mcp_ticketer-0.6.2/FIX_VERIFICATION_CHECKLIST.md +185 -0
- mcp_ticketer-0.6.2/IMPLEMENTATION_SUMMARY.md +300 -0
- mcp_ticketer-0.6.2/LINEAR_BUG_FIX_SUMMARY_FINAL.md +196 -0
- mcp_ticketer-0.6.2/LINEAR_INIT_BUG_FIX.md +202 -0
- mcp_ticketer-0.6.2/LINEAR_INIT_FIX_SUMMARY.md +200 -0
- mcp_ticketer-0.6.2/MCP_CONFIGURE_FIX.md +227 -0
- mcp_ticketer-0.6.2/MCP_INSTALLER_FIX_COMPLETE.md +124 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/Makefile +16 -2
- mcp_ticketer-0.6.2/PATH_TRAVERSAL_SECURITY_TEST_REPORT.md +285 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/PKG-INFO +134 -32
- mcp_ticketer-0.6.2/QA_REPORT_PLATFORM_DETECTION.md +509 -0
- mcp_ticketer-0.6.2/QA_TEST_REPORT.md +481 -0
- mcp_ticketer-0.6.2/QUALITY_GATE_REPORT.md +220 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/README.md +130 -28
- mcp_ticketer-0.6.2/SECURITY_RESCAN_REPORT.md +421 -0
- mcp_ticketer-0.6.2/TEST_RESULTS.txt +149 -0
- mcp_ticketer-0.6.2/VERIFICATION_COMPLETE.md +341 -0
- mcp_ticketer-0.6.2/VERIFICATION_REPORT.md +469 -0
- mcp_ticketer-0.6.2/VERIFICATION_SUMMARY.md +338 -0
- mcp_ticketer-0.6.2/VERIFICATION_v0.4.3.md +284 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/AI_CLIENT_INTEGRATION.md +347 -61
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/API_REFERENCE.md +103 -0
- mcp_ticketer-0.6.2/docs/ATTACHMENTS.md +564 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/CONFIGURATION.md +31 -1
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/MIGRATION_GUIDE.md +311 -10
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/QUICK_START.md +238 -28
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/USER_GUIDE.md +48 -3
- mcp_ticketer-0.6.2/docs/features/AUTOMATIC_VALIDATION.md +184 -0
- mcp_ticketer-0.6.2/docs/features/UPDATE_CHECKING.md +223 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +4 -2
- mcp_ticketer-0.6.2/docs/linear_parent_issue_fix.md +212 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/CONFIG_RESOLUTION_FIX.md +9 -10
- mcp_ticketer-0.6.2/docs/reports/MCP_COMMAND_SIMPLIFICATION_UPDATE.md +253 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/CLAUDE_DESKTOP_SETUP.md +16 -8
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/CODEX_INTEGRATION.md +31 -19
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/LINEAR_SETUP.md +119 -14
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +4 -3
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/pyproject.toml +12 -8
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/pytest.ini +1 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/__version__.py +1 -1
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/aitrackdown.py +254 -11
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/github.py +19 -19
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/hybrid.py +11 -11
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/jira.py +20 -24
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/adapter.py +210 -12
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/mappers.py +8 -2
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cache/memory.py +6 -5
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/adapter_diagnostics.py +1 -1
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/auggie_configure.py +104 -15
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/codex_configure.py +188 -32
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/configure.py +4 -5
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/diagnostics.py +2 -2
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/discover.py +4 -5
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/gemini_configure.py +107 -26
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/linear_commands.py +95 -12
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/main.py +1292 -246
- mcp_ticketer-0.6.2/src/mcp_ticketer/cli/mcp_configure.py +516 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/platform_commands.py +5 -15
- mcp_ticketer-0.6.2/src/mcp_ticketer/cli/platform_detection.py +412 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/cli/python_detection.py +126 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/ticket_commands.py +41 -34
- mcp_ticketer-0.6.2/src/mcp_ticketer/cli/update_checker.py +313 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/utils.py +24 -23
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/__init__.py +2 -1
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/adapter.py +82 -13
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/config.py +27 -29
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/env_discovery.py +10 -10
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/env_loader.py +8 -8
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/http_client.py +16 -16
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/mappers.py +10 -10
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/models.py +50 -20
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/project_config.py +40 -34
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/registry.py +2 -2
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/__init__.py +33 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/__main__.py +60 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/__init__.py +25 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/__main__.py +60 -0
- {mcp_ticketer-0.4.0/src/mcp_ticketer/mcp → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server}/dto.py +32 -32
- mcp_ticketer-0.4.0/src/mcp_ticketer/mcp/server.py → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/main.py +27 -25
- {mcp_ticketer-0.4.0/src/mcp_ticketer/mcp → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server}/response_builder.py +2 -2
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/server_sdk.py +93 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/__init__.py +38 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/attachment_tools.py +179 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/bulk_tools.py +273 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/comment_tools.py +90 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/hierarchy_tools.py +383 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/pr_tools.py +154 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/search_tools.py +206 -0
- mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/ticket_tools.py +277 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/__init__.py +1 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/health_monitor.py +4 -4
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/manager.py +11 -47
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/queue.py +16 -16
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/ticket_registry.py +12 -12
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/worker.py +2 -2
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/PKG-INFO +134 -32
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/SOURCES.txt +60 -16
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/requires.txt +2 -1
- mcp_ticketer-0.6.2/test_discovered_fix.py +234 -0
- mcp_ticketer-0.6.2/test_mcp_integration.py +312 -0
- mcp_ticketer-0.6.2/test_structure_validation.py +140 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_adapter.py +23 -23
- mcp_ticketer-0.6.2/tests/adapters/linear/test_adapter_validation.py +183 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_client.py +19 -19
- mcp_ticketer-0.6.2/tests/adapters/linear/test_issue_resolution.py +200 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_mappers.py +6 -6
- mcp_ticketer-0.6.2/tests/adapters/linear/test_project_resolution.py +295 -0
- mcp_ticketer-0.6.2/tests/adapters/test_aitrackdown_security.py +330 -0
- mcp_ticketer-0.6.2/tests/cli/test_python_detection.py +147 -0
- mcp_ticketer-0.6.2/tests/cli/test_update_checker.py +237 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/conftest.py +24 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_actual_worker_execution.py +3 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_config_resolution.py +21 -47
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_env_discovery.py +24 -8
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_unified_env_loading.py +3 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_complete_workflow.py +1 -0
- mcp_ticketer-0.6.2/tests/e2e/test_mcp_jsonrpc.py +548 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_all_adapters.py +5 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_mcp_server_qa.py +2 -2
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_base_adapter.py +4 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_codex_config.py +6 -9
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_core_registry.py +7 -7
- mcp_ticketer-0.6.2/verify_fixes.sh +73 -0
- mcp_ticketer-0.4.0/CLI_RESTRUCTURING_SUMMARY.md +0 -272
- mcp_ticketer-0.4.0/LINEAR_ADAPTER_REVIEW.md +0 -477
- mcp_ticketer-0.4.0/LINEAR_FIX_RECOMMENDATION.md +0 -292
- mcp_ticketer-0.4.0/LINEAR_GRAPHQL_TYPE_ANALYSIS.md +0 -300
- mcp_ticketer-0.4.0/LINEAR_LABEL_FIX_SUMMARY.md +0 -262
- mcp_ticketer-0.4.0/LINEAR_PATTERN_COMPARISON.md +0 -441
- mcp_ticketer-0.4.0/LINEAR_QUERY_ALTERNATIVE_ANALYSIS.md +0 -278
- mcp_ticketer-0.4.0/LINEAR_RESEARCH_SUMMARY.md +0 -423
- mcp_ticketer-0.4.0/LINEAR_TAGS_FIX_SUMMARY.md +0 -238
- mcp_ticketer-0.4.0/QUICK_WINS_IMPLEMENTATION.md +0 -320
- mcp_ticketer-0.4.0/SECURITY_SCAN_REPORT_v0.1.24.md +0 -668
- mcp_ticketer-0.4.0/V0.3.2_RELEASE_FIXES_SUMMARY.md +0 -472
- mcp_ticketer-0.4.0/src/mcp_ticketer/cli/mcp_configure.py +0 -309
- mcp_ticketer-0.4.0/src/mcp_ticketer/mcp/__init__.py +0 -5
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.claude.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.coveragerc +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.cursor/mcp.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.github/workflows/docs.yml +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.github/workflows/test.yml +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.mcp/config.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.pre-commit-config.yaml +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.python-version +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.readthedocs.yaml +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/CLAUDE.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/LICENSE +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/MANIFEST.in +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/debug_epic_creation.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/debug_full_flow.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/debug_worker_epic.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/ADAPTERS.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/DEVELOPER_GUIDE.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/ENV_DISCOVERY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/MCP_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/PROJECT_CONFIG.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/PR_INTEGRATION.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/QUEUE_SYSTEM.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/QUICK_START_ENV.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/README.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_archive/README.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/adapters/github.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/adapters.rst.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/api.rst.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/cli.rst.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/development.rst.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/examples.rst.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/index.rst.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/installation.rst.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/adapters/github.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/adapters.rst +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/api.rst +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/cli.rst +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/conf.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/CODE_STRUCTURE.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/CONTRIBUTING.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/RELEASE.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/RELEASING.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development.rst +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/examples.rst +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/index.rst +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/installation.rst +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/prd/mcp-ticketer-prd.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.4.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.5.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/TEST_REPORT.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/VERIFICATION_RESULTS.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/requirements.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/JIRA_SETUP.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/mcp-ticketer +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/mcp-ticketer-server +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/requirements-dev.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/requirements.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/README.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/install.sh +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/manage_version.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/mcp_server.sh +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/test_set_command.sh +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/setup.cfg +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/setup.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/client.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/types.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cache/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/migrate_config.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/queue_commands.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/simple_health.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/exceptions.py +0 -0
- {mcp_ticketer-0.4.0/src/mcp_ticketer/mcp → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server}/constants.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/py.typed +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/__main__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/run_worker.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/test-tickets/tickets/task-20250924002724.json +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/test_linear_fixes.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/test_worker_persistence.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/README.md +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_queries.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_types.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_aitrackdown.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_github.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_github_token.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_jira.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_jira_direct.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_jira_projects.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_linear.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_linear_config.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_linear_native.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/debug_credential_validation.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_environment_handoff.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_queue_processing.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_queue_system.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_adapter_cache.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_cli_config.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_cli_vs_simulation.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_linear_teams.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_search.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_test.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_worker_adapter.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_worker_simulation.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_worker_subprocess.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_comments_and_attachments.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_complete_ticket_workflow.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_hierarchy_validation.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_state_transitions.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_aitrackdown_commenting.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_commenting_functionality.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_comprehensive.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_hierarchy_and_workflow.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_jira_github_adapters.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_pr_functionality.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_serve_config.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_user_assignment.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/performance/test_optimizations.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/performance/test_performance.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/run_comprehensive_tests.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_api_usage.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_basic.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_comprehensive_qa.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_error_handling.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_linear_teams.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_models.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_queue.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/__init__.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_cache_memory.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_core_exceptions.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_core_models.py +0 -0
- {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/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
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Before/After Code Comparison - Linear Init Fix
|
|
2
|
+
|
|
3
|
+
## The Bug
|
|
4
|
+
|
|
5
|
+
When running `mcp-ticketer init` and selecting Linear from the interactive menu without environment variables, users would get an error instead of being prompted for credentials.
|
|
6
|
+
|
|
7
|
+
## Code Changes
|
|
8
|
+
|
|
9
|
+
### BEFORE (Lines 652-743) - BROKEN
|
|
10
|
+
|
|
11
|
+
```python
|
|
12
|
+
elif adapter_type == "linear":
|
|
13
|
+
# If not auto-discovered, build from CLI params or prompt
|
|
14
|
+
if adapter_type not in config["adapters"]:
|
|
15
|
+
linear_config = {} # ❌ Build dict too early
|
|
16
|
+
|
|
17
|
+
# API Key
|
|
18
|
+
linear_api_key = api_key or os.getenv("LINEAR_API_KEY")
|
|
19
|
+
if not linear_api_key and not discovered:
|
|
20
|
+
# ... prompt ...
|
|
21
|
+
linear_api_key = typer.prompt("Enter your Linear API key", hide_input=True)
|
|
22
|
+
|
|
23
|
+
if linear_api_key: # ❌ Only add if exists
|
|
24
|
+
linear_config["api_key"] = linear_api_key
|
|
25
|
+
|
|
26
|
+
# Team info collection...
|
|
27
|
+
linear_team_key = os.getenv("LINEAR_TEAM_KEY")
|
|
28
|
+
linear_team_id = team_id or os.getenv("LINEAR_TEAM_ID")
|
|
29
|
+
|
|
30
|
+
if not linear_team_key and not linear_team_id and not discovered:
|
|
31
|
+
# ... prompt ...
|
|
32
|
+
team_input = typer.prompt("Team URL, key, or ID")
|
|
33
|
+
# ... URL derivation logic ...
|
|
34
|
+
|
|
35
|
+
# Save whichever was provided
|
|
36
|
+
if linear_team_key:
|
|
37
|
+
linear_config["team_key"] = linear_team_key
|
|
38
|
+
if linear_team_id:
|
|
39
|
+
linear_config["team_id"] = linear_team_id
|
|
40
|
+
|
|
41
|
+
# ❌ EARLY VALIDATION - This would exit before saving!
|
|
42
|
+
if not linear_config.get("api_key") or (
|
|
43
|
+
not linear_config.get("team_id") and not linear_config.get("team_key")
|
|
44
|
+
):
|
|
45
|
+
console.print("[red]Error:[/red] Linear requires both API key and team ID/key")
|
|
46
|
+
console.print("Run 'mcp-ticketer init --adapter linear' with proper credentials")
|
|
47
|
+
raise typer.Exit(1)
|
|
48
|
+
|
|
49
|
+
linear_config["type"] = "linear"
|
|
50
|
+
config["adapters"]["linear"] = linear_config # Never reached if validation failed
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### AFTER (Lines 652-741) - FIXED
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
elif adapter_type == "linear":
|
|
57
|
+
# If not auto-discovered, build from CLI params or prompt
|
|
58
|
+
if adapter_type not in config["adapters"]:
|
|
59
|
+
# ✅ Collect variables first, no dict yet
|
|
60
|
+
|
|
61
|
+
# API Key
|
|
62
|
+
linear_api_key = api_key or os.getenv("LINEAR_API_KEY")
|
|
63
|
+
if not linear_api_key and not discovered:
|
|
64
|
+
console.print("\n[bold]Linear Configuration[/bold]")
|
|
65
|
+
console.print("You need a Linear API key to connect to Linear.")
|
|
66
|
+
console.print("[dim]Get your API key at: https://linear.app/settings/api[/dim]\n")
|
|
67
|
+
|
|
68
|
+
linear_api_key = typer.prompt("Enter your Linear API key", hide_input=True)
|
|
69
|
+
|
|
70
|
+
# Team ID or Team Key or Team URL
|
|
71
|
+
linear_team_key = os.getenv("LINEAR_TEAM_KEY")
|
|
72
|
+
linear_team_id = team_id or os.getenv("LINEAR_TEAM_ID")
|
|
73
|
+
|
|
74
|
+
if not linear_team_key and not linear_team_id and not discovered:
|
|
75
|
+
console.print("\n[bold]Linear Team Configuration[/bold]")
|
|
76
|
+
console.print("You can provide either:")
|
|
77
|
+
console.print(" 1. Team URL (e.g., https://linear.app/workspace/team/TEAMKEY/active)")
|
|
78
|
+
console.print(" 2. Team key (e.g., 'ENG', 'DESIGN', 'PRODUCT')")
|
|
79
|
+
console.print(" 3. Team ID (UUID)")
|
|
80
|
+
console.print("[dim]Find team URL or key in: Linear → Your Team → Team Issues Page[/dim]\n")
|
|
81
|
+
|
|
82
|
+
team_input = typer.prompt("Team URL, key, or ID")
|
|
83
|
+
|
|
84
|
+
# Check if input is a URL
|
|
85
|
+
if team_input.startswith("https://linear.app/"):
|
|
86
|
+
# ... URL derivation logic (unchanged) ...
|
|
87
|
+
else:
|
|
88
|
+
# Input is team key or ID
|
|
89
|
+
if len(team_input) > 20: # Likely a UUID
|
|
90
|
+
linear_team_id = team_input
|
|
91
|
+
else:
|
|
92
|
+
linear_team_key = team_input
|
|
93
|
+
|
|
94
|
+
# ✅ Validate AFTER collection (JIRA pattern)
|
|
95
|
+
if not linear_api_key:
|
|
96
|
+
console.print("[red]Error:[/red] Linear API key is required")
|
|
97
|
+
raise typer.Exit(1)
|
|
98
|
+
|
|
99
|
+
if not linear_team_id and not linear_team_key:
|
|
100
|
+
console.print("[red]Error:[/red] Linear requires either team ID or team key")
|
|
101
|
+
raise typer.Exit(1)
|
|
102
|
+
|
|
103
|
+
# ✅ Build config dict AFTER validation passes
|
|
104
|
+
linear_config = {
|
|
105
|
+
"api_key": linear_api_key,
|
|
106
|
+
"type": "linear",
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# Save whichever was provided
|
|
110
|
+
if linear_team_key:
|
|
111
|
+
linear_config["team_key"] = linear_team_key
|
|
112
|
+
if linear_team_id:
|
|
113
|
+
linear_config["team_id"] = linear_team_id
|
|
114
|
+
|
|
115
|
+
# ✅ Save config (only reached if validation passed)
|
|
116
|
+
config["adapters"]["linear"] = linear_config
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Key Differences
|
|
120
|
+
|
|
121
|
+
| Aspect | BEFORE (Broken) | AFTER (Fixed) |
|
|
122
|
+
|--------|-----------------|---------------|
|
|
123
|
+
| Dict Creation | Created `linear_config = {}` immediately | Created after validation passes |
|
|
124
|
+
| Validation Timing | Validated partial dict (line 731) | Validates collected variables (line 721) |
|
|
125
|
+
| Error Handling | Could exit before prompts completed | Exits only after all prompts run |
|
|
126
|
+
| Config Building | Built incrementally with `if` checks | Built once with all validated values |
|
|
127
|
+
| Pattern Match | Different from JIRA adapter | Matches JIRA adapter pattern |
|
|
128
|
+
|
|
129
|
+
## Execution Flow Comparison
|
|
130
|
+
|
|
131
|
+
### BEFORE - Broken Flow
|
|
132
|
+
```
|
|
133
|
+
1. User selects Linear from menu
|
|
134
|
+
2. linear_config = {} (empty dict created)
|
|
135
|
+
3. Prompt for API key
|
|
136
|
+
→ User enters key
|
|
137
|
+
→ linear_config["api_key"] = key
|
|
138
|
+
4. Prompt for team info
|
|
139
|
+
→ User enters team
|
|
140
|
+
→ linear_config["team_key"] = team
|
|
141
|
+
5. ❌ Validation checks linear_config
|
|
142
|
+
→ If any field missing: EXIT with error
|
|
143
|
+
→ Never saves config
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Problem:** Validation happened on a partially-built dict that might be incomplete due to prompt logic.
|
|
147
|
+
|
|
148
|
+
### AFTER - Fixed Flow
|
|
149
|
+
```
|
|
150
|
+
1. User selects Linear from menu
|
|
151
|
+
2. Collect API key → linear_api_key variable
|
|
152
|
+
3. Prompt if needed → linear_api_key = "user_input"
|
|
153
|
+
4. Collect team info → linear_team_id/key variables
|
|
154
|
+
5. Prompt if needed → linear_team_key = "user_input"
|
|
155
|
+
6. ✅ Validate collected variables
|
|
156
|
+
→ If missing: EXIT with clear error
|
|
157
|
+
→ If present: Continue
|
|
158
|
+
7. Build linear_config dict
|
|
159
|
+
8. Save config to adapters
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Solution:** Validation happens on collected variables, then config dict is built only if valid.
|
|
163
|
+
|
|
164
|
+
## Why This Pattern Works
|
|
165
|
+
|
|
166
|
+
The JIRA adapter (lines 745-803) demonstrates the correct pattern:
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
# 1. Collect into variables
|
|
170
|
+
server = jira_server or os.getenv("JIRA_SERVER")
|
|
171
|
+
email = jira_email or os.getenv("JIRA_EMAIL")
|
|
172
|
+
token = api_key or os.getenv("JIRA_API_TOKEN")
|
|
173
|
+
|
|
174
|
+
# 2. Prompt for missing values
|
|
175
|
+
if not server and not discovered:
|
|
176
|
+
server = typer.prompt("JIRA server URL")
|
|
177
|
+
if not email and not discovered:
|
|
178
|
+
email = typer.prompt("Your JIRA email address")
|
|
179
|
+
|
|
180
|
+
# 3. Validate collected variables
|
|
181
|
+
if not server:
|
|
182
|
+
console.print("[red]Error:[/red] JIRA server URL is required")
|
|
183
|
+
raise typer.Exit(1)
|
|
184
|
+
|
|
185
|
+
# 4. Build config dict (only if valid)
|
|
186
|
+
jira_config = {
|
|
187
|
+
"server": server,
|
|
188
|
+
"email": email,
|
|
189
|
+
"api_token": token,
|
|
190
|
+
"type": "jira",
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
# 5. Save config
|
|
194
|
+
config["adapters"]["jira"] = jira_config
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Linear now follows the same pattern.
|
|
198
|
+
|
|
199
|
+
## Impact
|
|
200
|
+
|
|
201
|
+
### User Experience
|
|
202
|
+
- **Before:** Confusing error message immediately after menu selection
|
|
203
|
+
- **After:** Smooth interactive prompting experience
|
|
204
|
+
|
|
205
|
+
### Code Consistency
|
|
206
|
+
- **Before:** Linear used different pattern than JIRA
|
|
207
|
+
- **After:** All adapters follow the same pattern
|
|
208
|
+
|
|
209
|
+
### Test Coverage
|
|
210
|
+
- No existing tests for this functionality (manual testing required)
|
|
211
|
+
- Future improvement: Add unit tests for init command
|
|
212
|
+
|
|
213
|
+
## Testing the Fix
|
|
214
|
+
|
|
215
|
+
### Manual Test 1: Interactive Selection
|
|
216
|
+
```bash
|
|
217
|
+
# Clean environment
|
|
218
|
+
unset LINEAR_API_KEY LINEAR_TEAM_KEY LINEAR_TEAM_ID
|
|
219
|
+
rm -rf ~/.mcp_ticketer
|
|
220
|
+
|
|
221
|
+
# Run init
|
|
222
|
+
mcp-ticketer init
|
|
223
|
+
|
|
224
|
+
# Expected:
|
|
225
|
+
# - No adapter detected
|
|
226
|
+
# - Shows menu: "1. Linear, 2. JIRA, 3. AitRackdown"
|
|
227
|
+
# - Select 1 (Linear)
|
|
228
|
+
# - Prompts: "Enter your Linear API key"
|
|
229
|
+
# - Prompts: "Team URL, key, or ID"
|
|
230
|
+
# - Success message
|
|
231
|
+
# - Config saved to ~/.mcp_ticketer/config.json
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Manual Test 2: Partial Credentials
|
|
235
|
+
```bash
|
|
236
|
+
# Set only API key
|
|
237
|
+
export LINEAR_API_KEY="test_key_123"
|
|
238
|
+
unset LINEAR_TEAM_KEY LINEAR_TEAM_ID
|
|
239
|
+
|
|
240
|
+
# Run init
|
|
241
|
+
mcp-ticketer init
|
|
242
|
+
|
|
243
|
+
# Expected:
|
|
244
|
+
# - Detects Linear from environment
|
|
245
|
+
# - Prompts ONLY for team info (not API key)
|
|
246
|
+
# - Success
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Manual Test 3: Validation Works
|
|
250
|
+
```bash
|
|
251
|
+
# Try to bypass prompts (hit Enter without input)
|
|
252
|
+
# This should fail with clear error message
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Verification Checklist
|
|
256
|
+
|
|
257
|
+
- [x] Code compiles (Python syntax valid)
|
|
258
|
+
- [x] Follows JIRA adapter pattern
|
|
259
|
+
- [x] Validation moved after collection
|
|
260
|
+
- [x] Config dict built after validation
|
|
261
|
+
- [x] Error messages are clear
|
|
262
|
+
- [x] All features preserved (URL derivation, discovery)
|
|
263
|
+
- [x] No regressions in CLI parameters
|
|
264
|
+
- [ ] Manual testing completed (requires user interaction)
|
|
265
|
+
- [ ] Unit tests added (future work)
|
|
266
|
+
|
|
267
|
+
## Related Documentation
|
|
268
|
+
|
|
269
|
+
- See `LINEAR_INIT_FIX_SUMMARY.md` for detailed implementation notes
|
|
270
|
+
- See `/src/mcp_ticketer/cli/main.py` lines 652-741 for actual code
|
|
271
|
+
- Compare with JIRA adapter (lines 743-803) for reference pattern
|
|
@@ -4,7 +4,174 @@ 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.15] - 2025-11-07
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- **Linear Task Creation with Parent Issues**: Fixed Linear adapter to resolve issue identifiers to UUIDs
|
|
11
|
+
- Task creation with `parent_issue` parameter now works with both issue identifiers (e.g., "ENG-842") and UUIDs
|
|
12
|
+
- Added automatic identifier resolution via GraphQL query
|
|
13
|
+
- Eliminates "Variable '$issueId' of non-null type 'UUID!' must not be null" errors
|
|
14
|
+
- Resolves validation failures when creating tasks under parent issues
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- **Linear Issue Resolution Method**: Added `_resolve_issue_id()` for automatic identifier resolution
|
|
18
|
+
- Resolves issue identifiers (like "ENG-842") to UUIDs via GraphQL
|
|
19
|
+
- Provides clear error messages when issues cannot be found
|
|
20
|
+
- Enables flexible parent issue specification in task creation
|
|
21
|
+
- Comprehensive test coverage with 13 new tests
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- **Code Quality**: Import formatting standardization across codebase
|
|
25
|
+
- Applied consistent import ordering to 38 files
|
|
26
|
+
- Improved code consistency and maintainability
|
|
27
|
+
- No functional changes to core logic
|
|
28
|
+
|
|
29
|
+
### Testing
|
|
30
|
+
- **Issue Resolution Tests**: Added comprehensive test suite for Linear issue resolution
|
|
31
|
+
- Created `tests/adapters/linear/test_issue_resolution.py` with 13 tests
|
|
32
|
+
- Tests cover identifier resolution, UUID handling, and error cases
|
|
33
|
+
- Validates task creation with parent issues
|
|
34
|
+
- 100% test coverage for new resolution functionality
|
|
35
|
+
|
|
36
|
+
### Documentation
|
|
37
|
+
- **Linear Parent Issue Fix**: Added detailed documentation in `docs/linear_parent_issue_fix.md`
|
|
38
|
+
- Explains the root cause of the issue
|
|
39
|
+
- Documents the resolution approach
|
|
40
|
+
- Provides examples and testing guidance
|
|
41
|
+
|
|
42
|
+
## [0.4.11] - 2025-10-28
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
- **CRITICAL: MCP Installer Command Structure**: Fixed all MCP installers to use Python module invocation pattern
|
|
46
|
+
- Changed from: `command: {venv}/bin/mcp-ticketer`, `args: ["mcp", project_path]`
|
|
47
|
+
- Changed to: `command: {venv}/bin/python`, `args: ["-m", "mcp_ticketer.mcp.server", project_path]`
|
|
48
|
+
- Affects: Claude Code, Auggie CLI, Gemini CLI, and Codex CLI installers
|
|
49
|
+
- Impact: Installer now works with any Python environment (pip, pipx, editable installs)
|
|
50
|
+
- Matches established pattern from mcp-vector-search and other MCP servers
|
|
51
|
+
|
|
52
|
+
### Files Modified
|
|
53
|
+
- `src/mcp_ticketer/cli/mcp_configure.py` - Claude Code/Desktop installer
|
|
54
|
+
- `src/mcp_ticketer/cli/auggie_configure.py` - Auggie CLI installer
|
|
55
|
+
- `src/mcp_ticketer/cli/gemini_configure.py` - Gemini CLI installer
|
|
56
|
+
- `src/mcp_ticketer/cli/codex_configure.py` - Codex CLI installer
|
|
57
|
+
|
|
58
|
+
### Technical Details
|
|
59
|
+
- Uses Python executable directly with `-m` module flag
|
|
60
|
+
- No longer depends on `mcp-ticketer` binary existing in target venv
|
|
61
|
+
- Works across all installation methods and Python environments
|
|
62
|
+
- Provides consistent behavior with other MCP ecosystem tools
|
|
63
|
+
|
|
64
|
+
## [0.4.10] - 2025-10-28
|
|
65
|
+
|
|
66
|
+
### Fixed
|
|
67
|
+
- **CRITICAL: MCP Installer Configuration**: Fixed Claude Code MCP installer to write to correct config location
|
|
68
|
+
- Changed config path from `.claude/settings.local.json` to `~/.claude.json`
|
|
69
|
+
- Updated to use project-specific structure: `.projects[path].mcpServers["mcp-ticketer"]`
|
|
70
|
+
- Added backward compatibility with `.claude/mcp.local.json`
|
|
71
|
+
- Enhanced error handling for invalid JSON and empty config files
|
|
72
|
+
- Added `type: "stdio"` field required by Claude Code
|
|
73
|
+
- Uses absolute project paths with `Path.cwd().resolve()`
|
|
74
|
+
- Matches working pattern from mcp-vector-search installation
|
|
75
|
+
- Resolves issue where mcp-ticketer server failed to connect in Claude Code
|
|
76
|
+
|
|
77
|
+
### Technical Details
|
|
78
|
+
- Updated `find_claude_mcp_config()` to return `~/.claude.json` for Claude Code
|
|
79
|
+
- Enhanced `load_claude_mcp_config()` with platform-specific structure support
|
|
80
|
+
- Refactored `configure_claude_mcp()` to write to both primary and legacy locations
|
|
81
|
+
- Updated `remove_claude_mcp()` to clean up both config locations
|
|
82
|
+
- Added comprehensive JSON parsing and empty file handling
|
|
83
|
+
|
|
84
|
+
## [0.4.4] - 2025-10-27
|
|
85
|
+
|
|
86
|
+
### Changed
|
|
87
|
+
- **CLI restructure**: `install <platform>` for platform installation (claude-code, claude-desktop, gemini, codex, auggie)
|
|
88
|
+
- **MCP commands**: Reserved `mcp` namespace for MCP server actions (serve, status, stop)
|
|
89
|
+
- Platform names now positional arguments instead of flags for better UX
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
- **mcp status**: New command showing configuration status for all platforms
|
|
93
|
+
- **mcp stop**: New command with informational message about MCP architecture
|
|
94
|
+
|
|
95
|
+
### Improved
|
|
96
|
+
- Better command structure (install for platforms, mcp for actions)
|
|
97
|
+
- Clearer error messages with available options
|
|
98
|
+
- Maintained full backward compatibility with legacy commands
|
|
99
|
+
|
|
100
|
+
### Testing
|
|
101
|
+
- 19/19 CLI tests passed (100% success rate)
|
|
102
|
+
|
|
103
|
+
## [0.4.3] - 2025-10-27
|
|
104
|
+
|
|
105
|
+
### Added
|
|
106
|
+
- **LINEAR_TEAM_KEY Environment Variable**: Easier Linear configuration with team keys
|
|
107
|
+
- Added `LINEAR_TEAM_KEY` support as primary configuration option
|
|
108
|
+
- Team key (e.g., "ENG", "DESIGN") now recommended over team ID (UUID)
|
|
109
|
+
- Automatic resolution of team key to team ID in Linear adapter
|
|
110
|
+
- Updated `.env.example` with LINEAR_TEAM_KEY as default option
|
|
111
|
+
- CLI `init` command now prompts for team key by default
|
|
112
|
+
- **Command Synonyms**: Init, install, and setup commands are now fully synonymous
|
|
113
|
+
- `mcp-ticketer init` - Initialize configuration
|
|
114
|
+
- `mcp-ticketer install` - Install and configure (same as init)
|
|
115
|
+
- `mcp-ticketer setup` - Setup (same as init)
|
|
116
|
+
- All three commands accept identical parameters and behave identically
|
|
117
|
+
- **Attachment Model**: Universal file attachment support
|
|
118
|
+
- New `Attachment` model in core models for cross-adapter attachment representation
|
|
119
|
+
- Fields: id, ticket_id, filename, url, content_type, size_bytes, created_at, created_by, description, metadata
|
|
120
|
+
- Full documentation in new `docs/ATTACHMENTS.md` guide
|
|
121
|
+
- **AITrackdown Attachment Support**: Complete file attachment implementation
|
|
122
|
+
- `add_attachment()` - Upload files to local filesystem with security features
|
|
123
|
+
- `get_attachments()` - List all attachments for a ticket
|
|
124
|
+
- `delete_attachment()` - Remove specific attachments
|
|
125
|
+
- Local filesystem storage in `.aitrackdown/attachments/<ticket-id>/` directories
|
|
126
|
+
- Automatic filename sanitization to prevent security issues
|
|
127
|
+
- SHA256 checksumming for file integrity verification
|
|
128
|
+
- MIME type detection based on file extension
|
|
129
|
+
- Size validation with configurable limits (default 100MB)
|
|
130
|
+
- Organized per-ticket storage structure
|
|
131
|
+
- **MCP Attachment Tools**: AI agent attachment support with fallback
|
|
132
|
+
- `ticket_attach` - Add file attachments via MCP
|
|
133
|
+
- `ticket_attachments` - List attachments via MCP
|
|
134
|
+
- `ticket_delete_attachment` - Delete attachments via MCP
|
|
135
|
+
- Automatic fallback to comments for adapters without attachment support
|
|
136
|
+
- Graceful degradation for Linear, Jira, and GitHub adapters
|
|
137
|
+
|
|
138
|
+
### Changed
|
|
139
|
+
- **Linear Configuration**: LINEAR_TEAM_KEY is now the primary/recommended option
|
|
140
|
+
- Team ID (LINEAR_TEAM_ID) still supported for backward compatibility
|
|
141
|
+
- CLI init flow updated to prompt for team key first
|
|
142
|
+
- Documentation updated across README, QUICK_START, and setup guides
|
|
143
|
+
- **Environment Variable Priority**: LINEAR_TEAM_KEY takes precedence over LINEAR_TEAM_ID
|
|
144
|
+
- When both are present, LINEAR_TEAM_KEY is used
|
|
145
|
+
- Adapter automatically resolves team key to team ID via GraphQL
|
|
146
|
+
- **Documentation Structure**: New comprehensive attachment documentation
|
|
147
|
+
- Created `docs/ATTACHMENTS.md` (400+ lines)
|
|
148
|
+
- Updated README.md with attachment examples and LINEAR_TEAM_KEY info
|
|
149
|
+
- Updated QUICK_START.md with attachment usage and Linear team key setup
|
|
150
|
+
- Updated API_REFERENCE.md with complete Attachment model specification
|
|
151
|
+
- Added configuration section to README with Linear setup details
|
|
152
|
+
|
|
153
|
+
### Fixed
|
|
154
|
+
- **LINEAR_TEAM_KEY Environment Loading**: Proper loading from .env files
|
|
155
|
+
- Fixed `project_config.py` to check all LINEAR_* environment variables
|
|
156
|
+
- Environment variable discovery now detects LINEAR_TEAM_KEY
|
|
157
|
+
- Resolves issues where LINEAR_TEAM_KEY wasn't being recognized
|
|
158
|
+
|
|
159
|
+
### Documentation
|
|
160
|
+
- **New Files**:
|
|
161
|
+
- `docs/ATTACHMENTS.md` - Comprehensive attachment guide with examples, security notes, and roadmap
|
|
162
|
+
- **Updated Files**:
|
|
163
|
+
- `README.md` - Added attachment features, LINEAR_TEAM_KEY configuration, and command synonyms
|
|
164
|
+
- `docs/QUICK_START.md` - Added attachment examples and LINEAR_TEAM_KEY setup instructions
|
|
165
|
+
- `docs/API_REFERENCE.md` - Added Attachment model specification and adapter methods
|
|
166
|
+
- `.env.example` - Updated with LINEAR_TEAM_KEY as primary option with clear instructions
|
|
167
|
+
|
|
168
|
+
### Security
|
|
169
|
+
- **Attachment Security Features**:
|
|
170
|
+
- Filename sanitization prevents path traversal and injection attacks
|
|
171
|
+
- Path resolution validates files stay within allowed directories
|
|
172
|
+
- File size limits prevent disk exhaustion
|
|
173
|
+
- SHA256 checksums enable integrity verification
|
|
174
|
+
- Isolated per-ticket storage prevents cross-ticket access
|
|
8
175
|
|
|
9
176
|
## [0.3.6] - 2025-01-25
|
|
10
177
|
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# CLI Command Restructure Report
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
Successfully restructured CLI commands to have clearer separation between platform installation and MCP server operations.
|
|
5
|
+
|
|
6
|
+
## Changes Made
|
|
7
|
+
|
|
8
|
+
### 1. Install Command Restructure
|
|
9
|
+
**Old Behavior:**
|
|
10
|
+
```bash
|
|
11
|
+
# Platform installation via flag
|
|
12
|
+
mcp-ticketer install --platform claude-code
|
|
13
|
+
mcp-ticketer install --platform claude-desktop
|
|
14
|
+
|
|
15
|
+
# Adapter setup (default)
|
|
16
|
+
mcp-ticketer install
|
|
17
|
+
mcp-ticketer install --adapter linear
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**New Behavior:**
|
|
21
|
+
```bash
|
|
22
|
+
# Platform installation via positional argument (NEW)
|
|
23
|
+
mcp-ticketer install claude-code
|
|
24
|
+
mcp-ticketer install claude-desktop
|
|
25
|
+
mcp-ticketer install gemini
|
|
26
|
+
mcp-ticketer install codex
|
|
27
|
+
mcp-ticketer install auggie
|
|
28
|
+
|
|
29
|
+
# Adapter setup (unchanged - backward compatible)
|
|
30
|
+
mcp-ticketer install
|
|
31
|
+
mcp-ticketer install --adapter linear
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. MCP Command Group Enhancement
|
|
35
|
+
**Added Commands:**
|
|
36
|
+
```bash
|
|
37
|
+
mcp-ticketer mcp status # Check MCP configuration status
|
|
38
|
+
mcp-ticketer mcp stop # Placeholder (explains MCP is on-demand)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Existing Commands (unchanged):**
|
|
42
|
+
```bash
|
|
43
|
+
mcp-ticketer mcp serve # Start MCP server
|
|
44
|
+
mcp-ticketer mcp claude # Configure Claude (legacy)
|
|
45
|
+
mcp-ticketer mcp gemini # Configure Gemini (legacy)
|
|
46
|
+
mcp-ticketer mcp codex # Configure Codex (legacy)
|
|
47
|
+
mcp-ticketer mcp auggie # Configure Auggie (legacy)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Command Structure Comparison
|
|
51
|
+
|
|
52
|
+
### Platform Installation
|
|
53
|
+
| Old Syntax | New Syntax (Recommended) | Legacy Support |
|
|
54
|
+
|------------|-------------------------|----------------|
|
|
55
|
+
| `mcp-ticketer install --platform claude-code` | `mcp-ticketer install claude-code` | ✓ (still works) |
|
|
56
|
+
| `mcp-ticketer mcp claude` | `mcp-ticketer install claude-code` | ✓ (still works) |
|
|
57
|
+
| N/A | `mcp-ticketer install claude-desktop` | ✓ (new) |
|
|
58
|
+
| `mcp-ticketer mcp gemini` | `mcp-ticketer install gemini` | ✓ (still works) |
|
|
59
|
+
|
|
60
|
+
### MCP Server Operations
|
|
61
|
+
| Command | Purpose | Status |
|
|
62
|
+
|---------|---------|--------|
|
|
63
|
+
| `mcp-ticketer mcp serve` | Start MCP server | Existing |
|
|
64
|
+
| `mcp-ticketer mcp status` | Check configuration | **NEW** |
|
|
65
|
+
| `mcp-ticketer mcp stop` | Stop server (placeholder) | **NEW** |
|
|
66
|
+
|
|
67
|
+
## Test Results
|
|
68
|
+
|
|
69
|
+
### ✓ Help Text
|
|
70
|
+
```bash
|
|
71
|
+
$ mcp-ticketer install --help
|
|
72
|
+
# Shows platform as positional argument ✓
|
|
73
|
+
|
|
74
|
+
$ mcp-ticketer mcp --help
|
|
75
|
+
# Shows serve, status, stop, claude, gemini, codex, auggie ✓
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### ✓ Install Command
|
|
79
|
+
```bash
|
|
80
|
+
$ mcp-ticketer install claude-code --dry-run
|
|
81
|
+
# DRY RUN - Would install for Claude Code ✓
|
|
82
|
+
|
|
83
|
+
$ mcp-ticketer install
|
|
84
|
+
# Runs adapter setup wizard (backward compatible) ✓
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### ✓ MCP Commands
|
|
88
|
+
```bash
|
|
89
|
+
$ mcp-ticketer mcp status
|
|
90
|
+
# Shows configuration status for all platforms ✓
|
|
91
|
+
|
|
92
|
+
$ mcp-ticketer mcp stop
|
|
93
|
+
# Explains MCP is on-demand (no persistent server) ✓
|
|
94
|
+
|
|
95
|
+
$ mcp-ticketer mcp claude --help
|
|
96
|
+
# Still works for backward compatibility ✓
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Backward Compatibility
|
|
100
|
+
|
|
101
|
+
### ✓ Maintained
|
|
102
|
+
1. `mcp-ticketer install` (no args) - Still runs adapter setup
|
|
103
|
+
2. `mcp-ticketer install --adapter linear` - Still works
|
|
104
|
+
3. `mcp-ticketer mcp claude` - Still configures Claude Code
|
|
105
|
+
4. `mcp-ticketer mcp gemini` - Still configures Gemini
|
|
106
|
+
5. `mcp-ticketer mcp codex` - Still configures Codex
|
|
107
|
+
6. `mcp-ticketer mcp auggie` - Still configures Auggie
|
|
108
|
+
7. `mcp-ticketer mcp serve` - Still starts MCP server
|
|
109
|
+
|
|
110
|
+
### ✓ Enhanced
|
|
111
|
+
1. `mcp-ticketer install <platform>` - New, clearer syntax
|
|
112
|
+
2. `mcp-ticketer mcp status` - New status command
|
|
113
|
+
3. `mcp-ticketer mcp stop` - New stop command (informational)
|
|
114
|
+
|
|
115
|
+
## Benefits
|
|
116
|
+
|
|
117
|
+
1. **Clearer Command Structure**: Platform names as positional arguments make the command more intuitive
|
|
118
|
+
2. **Better Discoverability**: `mcp-ticketer install --help` now clearly shows available platforms
|
|
119
|
+
3. **Consistent Patterns**: Follows common CLI patterns (e.g., `git remote add <name>`)
|
|
120
|
+
4. **Backward Compatible**: All old command paths still work
|
|
121
|
+
5. **Status Visibility**: New `mcp status` command shows configuration state across all platforms
|
|
122
|
+
|
|
123
|
+
## Files Modified
|
|
124
|
+
- `/Users/masa/Projects/mcp-ticketer/src/mcp_ticketer/cli/main.py`
|
|
125
|
+
- Modified `install()` command to accept platform as positional argument
|
|
126
|
+
- Added `mcp_status()` command
|
|
127
|
+
- Added `mcp_stop()` command
|
|
128
|
+
- Updated help text in `_show_next_steps()`
|
|
129
|
+
|
|
130
|
+
## Next Steps
|
|
131
|
+
1. Update documentation to reflect new command structure
|
|
132
|
+
2. Add migration guide for users using old syntax
|
|
133
|
+
3. Consider deprecation warnings for `--platform` flag (optional)
|
|
134
|
+
4. Update examples in README and docs
|
|
135
|
+
|
|
136
|
+
## Success Criteria
|
|
137
|
+
- [x] `mcp-ticketer install claude-code` works for platform installation
|
|
138
|
+
- [x] `mcp-ticketer mcp status` shows MCP configuration status
|
|
139
|
+
- [x] `mcp-ticketer mcp serve` works for MCP server
|
|
140
|
+
- [x] Old command paths still work for backward compatibility
|
|
141
|
+
- [x] Help text clearly explains command structure
|
|
142
|
+
- [x] All tests pass
|
|
143
|
+
|
|
144
|
+
## Migration Path for Users
|
|
145
|
+
```bash
|
|
146
|
+
# Old way (still works)
|
|
147
|
+
mcp-ticketer install --platform claude-code
|
|
148
|
+
mcp-ticketer mcp claude
|
|
149
|
+
|
|
150
|
+
# New way (recommended)
|
|
151
|
+
mcp-ticketer install claude-code
|
|
152
|
+
|
|
153
|
+
# Check configuration
|
|
154
|
+
mcp-ticketer mcp status
|
|
155
|
+
```
|
|
156
|
+
|