mcp-ticketer 0.4.11__py3-none-any.whl → 2.0.1__py3-none-any.whl
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/__init__.py +10 -10
- mcp_ticketer/__version__.py +3 -3
- mcp_ticketer/adapters/__init__.py +2 -0
- mcp_ticketer/adapters/aitrackdown.py +394 -9
- mcp_ticketer/adapters/asana/__init__.py +15 -0
- mcp_ticketer/adapters/asana/adapter.py +1416 -0
- mcp_ticketer/adapters/asana/client.py +292 -0
- mcp_ticketer/adapters/asana/mappers.py +348 -0
- mcp_ticketer/adapters/asana/types.py +146 -0
- mcp_ticketer/adapters/github.py +836 -105
- mcp_ticketer/adapters/hybrid.py +47 -5
- mcp_ticketer/adapters/jira.py +772 -1
- mcp_ticketer/adapters/linear/adapter.py +2293 -108
- mcp_ticketer/adapters/linear/client.py +146 -12
- mcp_ticketer/adapters/linear/mappers.py +105 -11
- mcp_ticketer/adapters/linear/queries.py +168 -1
- mcp_ticketer/adapters/linear/types.py +80 -4
- mcp_ticketer/analysis/__init__.py +56 -0
- mcp_ticketer/analysis/dependency_graph.py +255 -0
- mcp_ticketer/analysis/health_assessment.py +304 -0
- mcp_ticketer/analysis/orphaned.py +218 -0
- mcp_ticketer/analysis/project_status.py +594 -0
- mcp_ticketer/analysis/similarity.py +224 -0
- mcp_ticketer/analysis/staleness.py +266 -0
- mcp_ticketer/automation/__init__.py +11 -0
- mcp_ticketer/automation/project_updates.py +378 -0
- mcp_ticketer/cache/memory.py +3 -3
- mcp_ticketer/cli/adapter_diagnostics.py +4 -2
- mcp_ticketer/cli/auggie_configure.py +18 -6
- mcp_ticketer/cli/codex_configure.py +175 -60
- mcp_ticketer/cli/configure.py +884 -146
- mcp_ticketer/cli/cursor_configure.py +314 -0
- mcp_ticketer/cli/diagnostics.py +31 -28
- mcp_ticketer/cli/discover.py +293 -21
- mcp_ticketer/cli/gemini_configure.py +18 -6
- mcp_ticketer/cli/init_command.py +880 -0
- mcp_ticketer/cli/instruction_commands.py +435 -0
- mcp_ticketer/cli/linear_commands.py +99 -15
- mcp_ticketer/cli/main.py +109 -2055
- mcp_ticketer/cli/mcp_configure.py +673 -99
- mcp_ticketer/cli/mcp_server_commands.py +415 -0
- mcp_ticketer/cli/migrate_config.py +12 -8
- mcp_ticketer/cli/platform_commands.py +6 -6
- mcp_ticketer/cli/platform_detection.py +477 -0
- mcp_ticketer/cli/platform_installer.py +536 -0
- mcp_ticketer/cli/project_update_commands.py +350 -0
- mcp_ticketer/cli/queue_commands.py +15 -15
- mcp_ticketer/cli/setup_command.py +639 -0
- mcp_ticketer/cli/simple_health.py +13 -11
- mcp_ticketer/cli/ticket_commands.py +277 -36
- mcp_ticketer/cli/update_checker.py +313 -0
- mcp_ticketer/cli/utils.py +45 -41
- mcp_ticketer/core/__init__.py +35 -1
- mcp_ticketer/core/adapter.py +170 -5
- mcp_ticketer/core/config.py +38 -31
- mcp_ticketer/core/env_discovery.py +33 -3
- mcp_ticketer/core/env_loader.py +7 -6
- mcp_ticketer/core/exceptions.py +10 -4
- mcp_ticketer/core/http_client.py +10 -10
- mcp_ticketer/core/instructions.py +405 -0
- mcp_ticketer/core/label_manager.py +732 -0
- mcp_ticketer/core/mappers.py +32 -20
- mcp_ticketer/core/models.py +136 -1
- mcp_ticketer/core/onepassword_secrets.py +379 -0
- mcp_ticketer/core/priority_matcher.py +463 -0
- mcp_ticketer/core/project_config.py +148 -14
- mcp_ticketer/core/registry.py +1 -1
- mcp_ticketer/core/session_state.py +171 -0
- mcp_ticketer/core/state_matcher.py +592 -0
- mcp_ticketer/core/url_parser.py +425 -0
- mcp_ticketer/core/validators.py +69 -0
- mcp_ticketer/defaults/ticket_instructions.md +644 -0
- mcp_ticketer/mcp/__init__.py +2 -2
- mcp_ticketer/mcp/server/__init__.py +2 -2
- mcp_ticketer/mcp/server/diagnostic_helper.py +175 -0
- mcp_ticketer/mcp/server/main.py +187 -93
- mcp_ticketer/mcp/server/routing.py +655 -0
- mcp_ticketer/mcp/server/server_sdk.py +58 -0
- mcp_ticketer/mcp/server/tools/__init__.py +37 -9
- mcp_ticketer/mcp/server/tools/analysis_tools.py +854 -0
- mcp_ticketer/mcp/server/tools/attachment_tools.py +65 -20
- mcp_ticketer/mcp/server/tools/bulk_tools.py +259 -202
- mcp_ticketer/mcp/server/tools/comment_tools.py +74 -12
- mcp_ticketer/mcp/server/tools/config_tools.py +1429 -0
- mcp_ticketer/mcp/server/tools/diagnostic_tools.py +211 -0
- mcp_ticketer/mcp/server/tools/hierarchy_tools.py +878 -319
- mcp_ticketer/mcp/server/tools/instruction_tools.py +295 -0
- mcp_ticketer/mcp/server/tools/label_tools.py +942 -0
- mcp_ticketer/mcp/server/tools/pr_tools.py +3 -7
- mcp_ticketer/mcp/server/tools/project_status_tools.py +158 -0
- mcp_ticketer/mcp/server/tools/project_update_tools.py +473 -0
- mcp_ticketer/mcp/server/tools/search_tools.py +180 -97
- mcp_ticketer/mcp/server/tools/session_tools.py +308 -0
- mcp_ticketer/mcp/server/tools/ticket_tools.py +1182 -82
- mcp_ticketer/mcp/server/tools/user_ticket_tools.py +364 -0
- mcp_ticketer/queue/health_monitor.py +1 -0
- mcp_ticketer/queue/manager.py +4 -4
- mcp_ticketer/queue/queue.py +3 -3
- mcp_ticketer/queue/run_worker.py +1 -1
- mcp_ticketer/queue/ticket_registry.py +2 -2
- mcp_ticketer/queue/worker.py +15 -13
- mcp_ticketer/utils/__init__.py +5 -0
- mcp_ticketer/utils/token_utils.py +246 -0
- mcp_ticketer-2.0.1.dist-info/METADATA +1366 -0
- mcp_ticketer-2.0.1.dist-info/RECORD +122 -0
- mcp_ticketer-0.4.11.dist-info/METADATA +0 -496
- mcp_ticketer-0.4.11.dist-info/RECORD +0 -77
- {mcp_ticketer-0.4.11.dist-info → mcp_ticketer-2.0.1.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.4.11.dist-info → mcp_ticketer-2.0.1.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.4.11.dist-info → mcp_ticketer-2.0.1.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.4.11.dist-info → mcp_ticketer-2.0.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,1366 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mcp-ticketer
|
|
3
|
+
Version: 2.0.1
|
|
4
|
+
Summary: Universal ticket management interface for AI agents with MCP support
|
|
5
|
+
Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
6
|
+
Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/mcp-ticketer/mcp-ticketer
|
|
9
|
+
Project-URL: Documentation, https://mcp-ticketer.readthedocs.io
|
|
10
|
+
Project-URL: Repository, https://github.com/mcp-ticketer/mcp-ticketer
|
|
11
|
+
Project-URL: Issues, https://github.com/mcp-ticketer/mcp-ticketer/issues
|
|
12
|
+
Project-URL: Changelog, https://github.com/mcp-ticketer/mcp-ticketer/blob/main/CHANGELOG.md
|
|
13
|
+
Keywords: mcp,tickets,jira,linear,github,issue-tracking,project-management,ai,automation,agent,ticketing
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: System Administrators
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
26
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
27
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
28
|
+
Classifier: Topic :: Software Development :: Bug Tracking
|
|
29
|
+
Classifier: Topic :: System :: Monitoring
|
|
30
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
31
|
+
Classifier: Typing :: Typed
|
|
32
|
+
Requires-Python: >=3.10
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
License-File: LICENSE
|
|
35
|
+
Requires-Dist: gql[httpx]>=3.0.0
|
|
36
|
+
Requires-Dist: httpx>=0.25.0
|
|
37
|
+
Requires-Dist: mcp>=1.2.0
|
|
38
|
+
Requires-Dist: psutil>=5.9.0
|
|
39
|
+
Requires-Dist: pydantic>=2.0
|
|
40
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
41
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
42
|
+
Requires-Dist: rich>=13.0.0
|
|
43
|
+
Requires-Dist: tomli>=2.0.0; python_version < "3.11"
|
|
44
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
45
|
+
Requires-Dist: typer>=0.9.0
|
|
46
|
+
Requires-Dist: typing-extensions>=4.8.0
|
|
47
|
+
Provides-Extra: all
|
|
48
|
+
Requires-Dist: mcp-ticketer[analysis,github,jira,linear,mcp]; extra == "all"
|
|
49
|
+
Provides-Extra: dev
|
|
50
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
51
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
52
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
53
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
|
|
54
|
+
Requires-Dist: pytest-mock>=3.12.0; extra == "dev"
|
|
55
|
+
Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
|
|
56
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
57
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
58
|
+
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
59
|
+
Requires-Dist: tox>=4.11.0; extra == "dev"
|
|
60
|
+
Requires-Dist: pre-commit>=3.5.0; extra == "dev"
|
|
61
|
+
Requires-Dist: bump2version>=1.0.1; extra == "dev"
|
|
62
|
+
Provides-Extra: docs
|
|
63
|
+
Requires-Dist: sphinx>=7.2.0; extra == "docs"
|
|
64
|
+
Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == "docs"
|
|
65
|
+
Requires-Dist: sphinx-autodoc-typehints>=1.25.0; extra == "docs"
|
|
66
|
+
Requires-Dist: sphinx-click>=5.1.0; extra == "docs"
|
|
67
|
+
Requires-Dist: myst-parser>=2.0.0; extra == "docs"
|
|
68
|
+
Provides-Extra: mcp
|
|
69
|
+
Requires-Dist: mcp>=1.2.0; extra == "mcp"
|
|
70
|
+
Provides-Extra: jira
|
|
71
|
+
Requires-Dist: jira>=3.5.0; extra == "jira"
|
|
72
|
+
Requires-Dist: ai-trackdown-pytools>=1.5.0; extra == "jira"
|
|
73
|
+
Provides-Extra: linear
|
|
74
|
+
Requires-Dist: gql[httpx]>=3.0.0; extra == "linear"
|
|
75
|
+
Provides-Extra: github
|
|
76
|
+
Requires-Dist: PyGithub>=2.1.0; extra == "github"
|
|
77
|
+
Provides-Extra: analysis
|
|
78
|
+
Requires-Dist: scikit-learn>=1.3.0; extra == "analysis"
|
|
79
|
+
Requires-Dist: rapidfuzz>=3.0.0; extra == "analysis"
|
|
80
|
+
Requires-Dist: numpy>=1.24.0; extra == "analysis"
|
|
81
|
+
Provides-Extra: test
|
|
82
|
+
Requires-Dist: pytest>=7.4.0; extra == "test"
|
|
83
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
|
|
84
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "test"
|
|
85
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "test"
|
|
86
|
+
Requires-Dist: pytest-mock>=3.12.0; extra == "test"
|
|
87
|
+
Requires-Dist: pytest-xdist>=3.0.0; extra == "test"
|
|
88
|
+
Requires-Dist: responses>=0.24.0; extra == "test"
|
|
89
|
+
Dynamic: license-file
|
|
90
|
+
|
|
91
|
+
# MCP Ticketer
|
|
92
|
+
|
|
93
|
+
[](https://pypi.org/project/mcp-ticketer)
|
|
94
|
+
[](https://pypi.org/project/mcp-ticketer)
|
|
95
|
+
[](https://mcp-ticketer.readthedocs.io/en/latest/?badge=latest)
|
|
96
|
+
[](https://github.com/mcp-ticketer/mcp-ticketer/actions)
|
|
97
|
+
[](https://codecov.io/gh/mcp-ticketer/mcp-ticketer)
|
|
98
|
+
[](https://opensource.org/licenses/MIT)
|
|
99
|
+
[](https://github.com/psf/black)
|
|
100
|
+
|
|
101
|
+
Universal ticket management interface for AI agents with MCP (Model Context Protocol) support.
|
|
102
|
+
|
|
103
|
+
## 🚀 Features
|
|
104
|
+
|
|
105
|
+
- **🎯 Universal Ticket Model**: Simplified to Epic, Task, and Comment types
|
|
106
|
+
- **🔌 Multiple Adapters**: Support for JIRA, Linear, GitHub Issues, and AI-Trackdown
|
|
107
|
+
- **🤖 MCP Integration**: Native support for AI agent interactions
|
|
108
|
+
- **⚡ High Performance**: Smart caching and async operations
|
|
109
|
+
- **🎨 Rich CLI**: Beautiful terminal interface with colors and tables
|
|
110
|
+
- **📊 State Machine**: Built-in state transitions with validation
|
|
111
|
+
- **🔍 Advanced Search**: Full-text search with multiple filters
|
|
112
|
+
- **🔗 Hierarchy Navigation**: Parent issue lookup and filtered sub-issue retrieval
|
|
113
|
+
- **👤 Smart Assignment**: Dedicated assignment tool with URL support and audit trails
|
|
114
|
+
- **🏷️ Label Management**: Intelligent label organization, deduplication, and cleanup with fuzzy matching
|
|
115
|
+
- **📎 File Attachments**: Upload, list, and manage ticket attachments (AITrackdown adapter)
|
|
116
|
+
- **📝 Custom Instructions**: Customize ticket writing guidelines for your team
|
|
117
|
+
- **🔬 PM Monitoring Tools**: Detect duplicate tickets, identify stale work, and find orphaned tickets
|
|
118
|
+
- **📦 Easy Installation**: Available on PyPI with simple pip install
|
|
119
|
+
- **🚀 Auto-Dependency Install**: Automatic adapter dependency detection and installation
|
|
120
|
+
- **💾 Compact Mode**: 70% token reduction for AI agent ticket list queries (v0.15.0+)
|
|
121
|
+
|
|
122
|
+
## ⚡ Token Efficiency
|
|
123
|
+
|
|
124
|
+
MCP Ticketer is optimized for AI agent usage with built-in token management:
|
|
125
|
+
|
|
126
|
+
- **20k Token Limit**: All tool responses stay under 20,000 tokens
|
|
127
|
+
- **Automatic Pagination**: Tools that could exceed limits support pagination
|
|
128
|
+
- **Compact Mode**: Minimal responses (15 tokens vs 185 per ticket)
|
|
129
|
+
- **Progressive Disclosure**: Summary first, details on demand
|
|
130
|
+
|
|
131
|
+
See [📄 Token Pagination](#-token-pagination-v131) section below for quick start, or [docs/user-docs/features/TOKEN_PAGINATION.md](docs/user-docs/features/TOKEN_PAGINATION.md) for detailed technical guide.
|
|
132
|
+
|
|
133
|
+
## 📦 Installation
|
|
134
|
+
|
|
135
|
+
### From PyPI (Recommended)
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
pip install mcp-ticketer
|
|
139
|
+
|
|
140
|
+
# Install with specific adapters
|
|
141
|
+
pip install mcp-ticketer[jira] # JIRA support
|
|
142
|
+
pip install mcp-ticketer[linear] # Linear support
|
|
143
|
+
pip install mcp-ticketer[github] # GitHub Issues support
|
|
144
|
+
pip install mcp-ticketer[analysis] # PM monitoring tools
|
|
145
|
+
pip install mcp-ticketer[all] # All adapters and features
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Note (v0.15.0+)**: The `setup` command now automatically detects and installs adapter dependencies! When you run `mcp-ticketer setup`, it will prompt you to install any missing adapter-specific dependencies, eliminating the need for manual `pip install mcp-ticketer[adapter]` after setup.
|
|
149
|
+
|
|
150
|
+
### From Source
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
git clone https://github.com/mcp-ticketer/mcp-ticketer.git
|
|
154
|
+
cd mcp-ticketer
|
|
155
|
+
pip install -e .
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Requirements
|
|
159
|
+
|
|
160
|
+
- Python 3.9+
|
|
161
|
+
- Virtual environment (recommended)
|
|
162
|
+
|
|
163
|
+
## 🤖 Supported AI Clients
|
|
164
|
+
|
|
165
|
+
MCP Ticketer integrates with multiple AI clients via the Model Context Protocol (MCP):
|
|
166
|
+
|
|
167
|
+
| AI Client | Support | Config Type | Project-Level | Setup Command |
|
|
168
|
+
|-----------|---------|-------------|---------------|---------------|
|
|
169
|
+
| **Claude Code** | ✅ Native | JSON | ✅ Yes | `mcp-ticketer install claude-code` |
|
|
170
|
+
| **Claude Desktop** | ✅ Full | JSON | ❌ Global only | `mcp-ticketer install claude-desktop` |
|
|
171
|
+
| **Gemini CLI** | ✅ Full | JSON | ✅ Yes | `mcp-ticketer install gemini` |
|
|
172
|
+
| **Codex CLI** | ✅ Full | TOML | ❌ Global only | `mcp-ticketer install codex` |
|
|
173
|
+
| **Auggie** | ✅ Full | JSON | ❌ Global only | `mcp-ticketer install auggie` |
|
|
174
|
+
|
|
175
|
+
### Quick MCP Setup
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Initialize adapter first (required)
|
|
179
|
+
mcp-ticketer init --adapter aitrackdown
|
|
180
|
+
|
|
181
|
+
# Auto-detection (Recommended) - Interactive platform selection
|
|
182
|
+
mcp-ticketer install # Auto-detect and prompt for platform
|
|
183
|
+
|
|
184
|
+
# See all detected platforms
|
|
185
|
+
mcp-ticketer install --auto-detect # Show what's installed on your system
|
|
186
|
+
|
|
187
|
+
# Install for all detected platforms at once
|
|
188
|
+
mcp-ticketer install --all # Configure all detected code editors
|
|
189
|
+
|
|
190
|
+
# Or install for specific platform
|
|
191
|
+
mcp-ticketer install claude-code # Claude Code (project-level)
|
|
192
|
+
mcp-ticketer install claude-desktop # Claude Desktop (global)
|
|
193
|
+
mcp-ticketer install gemini # Gemini CLI
|
|
194
|
+
mcp-ticketer install codex # Codex CLI
|
|
195
|
+
mcp-ticketer install auggie # Auggie
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
#### Installation Scope (v1.4+)
|
|
199
|
+
|
|
200
|
+
By default, `mcp-ticketer install` focuses on **code editors only**:
|
|
201
|
+
- ✅ Claude Code
|
|
202
|
+
- ✅ Cursor
|
|
203
|
+
- ✅ Auggie
|
|
204
|
+
- ✅ Codex
|
|
205
|
+
- ✅ Gemini
|
|
206
|
+
|
|
207
|
+
**Why code editors only?** Code editors are project-scoped tools designed for working with codebases. Claude Desktop is a general-purpose AI assistant. This separation ensures mcp-ticketer is configured where it provides the most value.
|
|
208
|
+
|
|
209
|
+
**Including Claude Desktop**:
|
|
210
|
+
|
|
211
|
+
To also install for Claude Desktop (AI assistant), use the `--include-desktop` flag:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Install for all platforms including Claude Desktop
|
|
215
|
+
mcp-ticketer install --all --include-desktop
|
|
216
|
+
|
|
217
|
+
# Auto-detect including Claude Desktop
|
|
218
|
+
mcp-ticketer install --auto-detect --include-desktop
|
|
219
|
+
|
|
220
|
+
# Install ONLY Claude Desktop
|
|
221
|
+
mcp-ticketer install claude-desktop
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**See [AI Client Integration Guide](docs/integrations/AI_CLIENT_INTEGRATION.md) for detailed setup instructions.**
|
|
225
|
+
|
|
226
|
+
## 🚀 Quick Start
|
|
227
|
+
|
|
228
|
+
### 1. Initialize Configuration
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
# For AI-Trackdown (local file-based)
|
|
232
|
+
mcp-ticketer init --adapter aitrackdown
|
|
233
|
+
|
|
234
|
+
# For Linear (requires API key)
|
|
235
|
+
# Option 1: Using team URL (easiest - paste your Linear team issues URL)
|
|
236
|
+
mcp-ticketer init --adapter linear --team-url https://linear.app/your-org/team/ENG/active
|
|
237
|
+
|
|
238
|
+
# Option 2: Using team key
|
|
239
|
+
mcp-ticketer init --adapter linear --team-key ENG
|
|
240
|
+
|
|
241
|
+
# Option 3: Using team ID
|
|
242
|
+
mcp-ticketer init --adapter linear --team-id YOUR_TEAM_ID
|
|
243
|
+
|
|
244
|
+
# For JIRA (requires server and credentials)
|
|
245
|
+
mcp-ticketer init --adapter jira \
|
|
246
|
+
--jira-server https://company.atlassian.net \
|
|
247
|
+
--jira-email your.email@company.com
|
|
248
|
+
|
|
249
|
+
# For GitHub Issues
|
|
250
|
+
mcp-ticketer init --adapter github --repo owner/repo
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Note:** The following commands are synonymous and can be used interchangeably:
|
|
254
|
+
- `mcp-ticketer init` - Initialize configuration
|
|
255
|
+
- `mcp-ticketer install` - Install and configure (same as init)
|
|
256
|
+
- `mcp-ticketer setup` - Setup (same as init)
|
|
257
|
+
|
|
258
|
+
#### Automatic Validation
|
|
259
|
+
|
|
260
|
+
The init command now automatically validates your configuration after setup:
|
|
261
|
+
- Valid credentials → Setup completes immediately
|
|
262
|
+
- Invalid credentials → You'll be prompted to:
|
|
263
|
+
1. Re-enter configuration (up to 3 retries)
|
|
264
|
+
2. Continue anyway (skip validation)
|
|
265
|
+
3. Exit and fix manually
|
|
266
|
+
|
|
267
|
+
You can always re-validate later with: `mcp-ticketer doctor`
|
|
268
|
+
|
|
269
|
+
### 2. Create Your First Ticket
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
mcp-ticketer create "Fix login bug" \
|
|
273
|
+
--description "Users cannot login with OAuth" \
|
|
274
|
+
--priority high \
|
|
275
|
+
--assignee "john.doe"
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 3. Manage Tickets
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
# List open tickets
|
|
282
|
+
mcp-ticketer list --state open
|
|
283
|
+
|
|
284
|
+
# Show ticket details
|
|
285
|
+
mcp-ticketer show TICKET-123 --comments
|
|
286
|
+
|
|
287
|
+
# Update ticket
|
|
288
|
+
mcp-ticketer update TICKET-123 --priority critical
|
|
289
|
+
|
|
290
|
+
# Transition state
|
|
291
|
+
mcp-ticketer transition TICKET-123 in_progress
|
|
292
|
+
|
|
293
|
+
# Search tickets
|
|
294
|
+
mcp-ticketer search "login bug" --state open
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### 4. Working with Attachments (AITrackdown)
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# Working with attachments through MCP
|
|
301
|
+
# (Requires MCP server running - see MCP Server Integration section)
|
|
302
|
+
|
|
303
|
+
# Attachments are managed through your AI client when using MCP
|
|
304
|
+
# Ask your AI assistant: "Add the document.pdf as an attachment to task-123"
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
For programmatic access, see the [Attachments Guide](docs/integrations/ATTACHMENTS.md).
|
|
308
|
+
|
|
309
|
+
### 5. Customize Ticket Writing Instructions
|
|
310
|
+
|
|
311
|
+
Customize ticket guidelines to match your team's conventions:
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
# View current instructions
|
|
315
|
+
mcp-ticketer instructions show
|
|
316
|
+
|
|
317
|
+
# Add custom instructions from file
|
|
318
|
+
mcp-ticketer instructions add team_guidelines.md
|
|
319
|
+
|
|
320
|
+
# Edit instructions interactively
|
|
321
|
+
mcp-ticketer instructions edit
|
|
322
|
+
|
|
323
|
+
# Reset to defaults
|
|
324
|
+
mcp-ticketer instructions delete --yes
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Example custom instructions:**
|
|
328
|
+
```markdown
|
|
329
|
+
# Our Team's Ticket Guidelines
|
|
330
|
+
|
|
331
|
+
## Title Format
|
|
332
|
+
[TEAM-ID] [Type] Brief description
|
|
333
|
+
|
|
334
|
+
## Required Sections
|
|
335
|
+
1. Problem Statement
|
|
336
|
+
2. Acceptance Criteria (minimum 3)
|
|
337
|
+
3. Testing Notes
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
For details, see the [Ticket Instructions Guide](docs/user-docs/features/ticket_instructions.md).
|
|
341
|
+
|
|
342
|
+
### 6. PM Monitoring Tools
|
|
343
|
+
|
|
344
|
+
Maintain ticket health with automated analysis and cleanup tools:
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
# Install analysis dependencies first
|
|
348
|
+
pip install "mcp-ticketer[analysis]"
|
|
349
|
+
|
|
350
|
+
# Find duplicate or similar tickets
|
|
351
|
+
mcp-ticketer analyze similar --threshold 0.8
|
|
352
|
+
|
|
353
|
+
# Identify stale tickets that may need closing
|
|
354
|
+
mcp-ticketer analyze stale --age-days 90 --inactive-days 30
|
|
355
|
+
|
|
356
|
+
# Find orphaned tickets without parent epic/project
|
|
357
|
+
mcp-ticketer analyze orphaned
|
|
358
|
+
|
|
359
|
+
# Generate comprehensive cleanup report
|
|
360
|
+
mcp-ticketer analyze cleanup --format markdown
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**Available MCP tools:**
|
|
364
|
+
- `ticket_find_similar` - Detect duplicate tickets using TF-IDF and cosine similarity
|
|
365
|
+
- `ticket_find_stale` - Identify inactive tickets that may need closing
|
|
366
|
+
- `ticket_find_orphaned` - Find tickets without proper hierarchy
|
|
367
|
+
- `ticket_cleanup_report` - Generate comprehensive analysis report
|
|
368
|
+
|
|
369
|
+
**Key features:**
|
|
370
|
+
- **Similarity Detection**: TF-IDF vectorization with fuzzy matching and tag overlap
|
|
371
|
+
- **Staleness Scoring**: Multi-factor analysis (age, inactivity, priority, state)
|
|
372
|
+
- **Orphan Detection**: Identify tickets missing parent epics or projects
|
|
373
|
+
- **Actionable Insights**: Automated suggestions for merge, link, close, or assign actions
|
|
374
|
+
|
|
375
|
+
For complete documentation, see the [PM Monitoring Tools Guide](docs/PM_MONITORING_TOOLS.md).
|
|
376
|
+
|
|
377
|
+
### 7. Linear Practical Workflow CLI
|
|
378
|
+
|
|
379
|
+
Streamline your daily Linear workflow with command-line shortcuts for common operations:
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# Quick ticket creation with auto-tagging
|
|
383
|
+
./ops/scripts/linear/practical-workflow.sh create-bug "Login fails" "Error 500" --priority high
|
|
384
|
+
./ops/scripts/linear/practical-workflow.sh create-feature "Dark mode" "Add theme toggle"
|
|
385
|
+
./ops/scripts/linear/practical-workflow.sh create-task "Update docs" "Refresh API docs"
|
|
386
|
+
|
|
387
|
+
# Workflow shortcuts
|
|
388
|
+
./ops/scripts/linear/practical-workflow.sh start-work BTA-123
|
|
389
|
+
./ops/scripts/linear/practical-workflow.sh ready-review BTA-123
|
|
390
|
+
./ops/scripts/linear/practical-workflow.sh deployed BTA-123
|
|
391
|
+
|
|
392
|
+
# Comments
|
|
393
|
+
./ops/scripts/linear/practical-workflow.sh add-comment BTA-123 "Working on this now"
|
|
394
|
+
./ops/scripts/linear/practical-workflow.sh list-comments BTA-123
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Key features:**
|
|
398
|
+
- **Auto-Tagging**: Automatically applies `bug`, `feature`, or `task` labels
|
|
399
|
+
- **Quick Commands**: Common workflow actions as single commands
|
|
400
|
+
- **Comment Tracking**: Add and list comments directly from CLI
|
|
401
|
+
- **Environment Validation**: Built-in configuration checks
|
|
402
|
+
|
|
403
|
+
**Setup:**
|
|
404
|
+
```bash
|
|
405
|
+
# Copy configuration template
|
|
406
|
+
cp ops/scripts/linear/.env.example .env
|
|
407
|
+
|
|
408
|
+
# Edit with your Linear API key and team key
|
|
409
|
+
# LINEAR_API_KEY=lin_api_...
|
|
410
|
+
# LINEAR_TEAM_KEY=BTA
|
|
411
|
+
|
|
412
|
+
# Test configuration
|
|
413
|
+
./ops/scripts/linear/practical-workflow.sh --help
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
For complete documentation, see [Linear Workflow CLI Guide](ops/scripts/linear/README.md).
|
|
417
|
+
|
|
418
|
+
### 8. Project Status Updates
|
|
419
|
+
|
|
420
|
+
Track project progress with status updates across Linear, GitHub V2, and Asana:
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
# Create update with health indicator
|
|
424
|
+
mcp-ticketer project-update create "mcp-ticketer-eac28953c267" \
|
|
425
|
+
"Completed MCP tools implementation. CLI commands in progress." \
|
|
426
|
+
--health on_track
|
|
427
|
+
|
|
428
|
+
# Create update using full URL
|
|
429
|
+
mcp-ticketer project-update create \
|
|
430
|
+
"https://linear.app/1m-hyperdev/project/mcp-ticketer-eac28953c267/updates" \
|
|
431
|
+
"Sprint review completed successfully" \
|
|
432
|
+
--health on_track
|
|
433
|
+
|
|
434
|
+
# List recent updates
|
|
435
|
+
mcp-ticketer project-update list "mcp-ticketer-eac28953c267" --limit 10
|
|
436
|
+
|
|
437
|
+
# Get detailed update
|
|
438
|
+
mcp-ticketer project-update get "update-uuid-here"
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
**Key features:**
|
|
442
|
+
- **Health Indicators**: 5 status levels (on_track, at_risk, off_track, complete, inactive)
|
|
443
|
+
- **Flexible Project ID**: Supports UUID, slug ID, short ID, or full URLs
|
|
444
|
+
- **Rich Formatting**: Color-coded health indicators and formatted tables
|
|
445
|
+
- **MCP Tools**: Programmatic access via `project_update_create`, `project_update_list`, `project_update_get`
|
|
446
|
+
- **Cross-Platform**: Linear (native), GitHub V2, Asana, Jira (workaround)
|
|
447
|
+
|
|
448
|
+
For complete documentation, see [Linear Setup Guide](docs/integrations/setup/LINEAR_SETUP.md#project-status-updates).
|
|
449
|
+
|
|
450
|
+
## 📄 Token Pagination (v1.3.1)
|
|
451
|
+
|
|
452
|
+
### Overview
|
|
453
|
+
|
|
454
|
+
mcp-ticketer implements intelligent token pagination to prevent context overflow when working with large datasets. The MCP server automatically paginates responses that exceed 20,000 tokens, ensuring Claude conversations remain responsive and efficient.
|
|
455
|
+
|
|
456
|
+
### Why Pagination Matters
|
|
457
|
+
|
|
458
|
+
Working with large ticket systems can quickly consume your AI context window:
|
|
459
|
+
|
|
460
|
+
- **Context Protection**: Large ticket lists can consume 50k+ tokens, leaving little room for conversation
|
|
461
|
+
- **Performance**: Prevents timeout errors when fetching 100+ tickets
|
|
462
|
+
- **Reliability**: Guarantees predictable response sizes regardless of dataset size
|
|
463
|
+
- **Efficiency**: Enables working with projects containing 500+ tickets without context overflow
|
|
464
|
+
|
|
465
|
+
### Quick Start
|
|
466
|
+
|
|
467
|
+
Pagination is **automatic** - you don't need to configure anything. Tools intelligently paginate when responses approach 20k tokens:
|
|
468
|
+
|
|
469
|
+
```python
|
|
470
|
+
# Compact mode (default) - Minimal token usage
|
|
471
|
+
tickets = await ticket_list(limit=20, compact=True) # ~300 tokens
|
|
472
|
+
|
|
473
|
+
# Full mode - When you need all details
|
|
474
|
+
tickets = await ticket_list(limit=20, compact=False) # ~3,700 tokens
|
|
475
|
+
|
|
476
|
+
# Large datasets - Automatic pagination kicks in
|
|
477
|
+
labels = await label_list(limit=100) # ~1,500 tokens (safe)
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Paginated MCP Tools
|
|
481
|
+
|
|
482
|
+
The following tools support automatic token pagination with intelligent limits:
|
|
483
|
+
|
|
484
|
+
| Tool | Description | Default Limit | Max Safe Limit | Token Estimate |
|
|
485
|
+
|------|-------------|---------------|----------------|----------------|
|
|
486
|
+
| `ticket_list` | List tickets with filters | 20 tickets | 100 (compact) | 15-185 tokens/ticket |
|
|
487
|
+
| `ticket_search` | Search tickets by query | 10 tickets | 50 | 200-500 tokens/result |
|
|
488
|
+
| `label_list` | List all labels | 100 labels | 500 | 10-15 tokens/label |
|
|
489
|
+
| `ticket_find_similar` | Find duplicate tickets | 10 results | 50 results | 200-500 tokens/result |
|
|
490
|
+
| `ticket_cleanup_report` | Generate cleanup report | Summary mode | Full report | 1k-8k tokens |
|
|
491
|
+
|
|
492
|
+
**Note**: All tools stay under the 20,000 token limit per response.
|
|
493
|
+
|
|
494
|
+
### Usage Examples
|
|
495
|
+
|
|
496
|
+
#### Example 1: Basic Ticket Listing (Optimal)
|
|
497
|
+
|
|
498
|
+
```python
|
|
499
|
+
# Default settings optimized for AI agents
|
|
500
|
+
result = await ticket_list() # Uses limit=20, compact=True
|
|
501
|
+
# Returns ~300 tokens - perfect for conversations
|
|
502
|
+
|
|
503
|
+
# Response includes:
|
|
504
|
+
{
|
|
505
|
+
"items": [...], # Tickets with id, title, state, priority, assignee
|
|
506
|
+
"count": 20, # Items in this response
|
|
507
|
+
"total": 150, # Total tickets available
|
|
508
|
+
"has_more": True, # More pages exist
|
|
509
|
+
"estimated_tokens": 300 # Approximate token usage
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
#### Example 2: Fetching More Data (Continuation)
|
|
514
|
+
|
|
515
|
+
```python
|
|
516
|
+
# Get first page
|
|
517
|
+
page1 = await ticket_list(limit=50, offset=0, compact=True)
|
|
518
|
+
print(f"Showing {page1['count']} of {page1['total']} tickets")
|
|
519
|
+
# ~750 tokens (safe)
|
|
520
|
+
|
|
521
|
+
# Check if more pages exist
|
|
522
|
+
if page1['has_more']:
|
|
523
|
+
# Get next page
|
|
524
|
+
page2 = await ticket_list(limit=50, offset=50, compact=True)
|
|
525
|
+
# Continue paginating as needed...
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
#### Example 3: Handling Large Projects (500+ Tickets)
|
|
529
|
+
|
|
530
|
+
```python
|
|
531
|
+
# Progressive disclosure pattern for large projects
|
|
532
|
+
# 1. Start with summary (minimal tokens)
|
|
533
|
+
summary = await ticket_cleanup_report(summary_only=True) # ~1k tokens
|
|
534
|
+
print(f"Project has {summary['total_issues']} potential issues")
|
|
535
|
+
|
|
536
|
+
# 2. Get compact list to filter
|
|
537
|
+
tickets = await ticket_list(
|
|
538
|
+
state="in_progress",
|
|
539
|
+
priority="high",
|
|
540
|
+
limit=20,
|
|
541
|
+
compact=True # Only 300 tokens
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
# 3. Fetch full details only for selected tickets
|
|
545
|
+
for ticket_summary in tickets['items'][:5]: # Top 5 only
|
|
546
|
+
full_ticket = await ticket_read(ticket_summary['id']) # ~200 tokens each
|
|
547
|
+
# Process full ticket details...
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
#### Example 4: Search with Pagination
|
|
551
|
+
|
|
552
|
+
```python
|
|
553
|
+
# Search returns paginated results automatically
|
|
554
|
+
results = await ticket_search(
|
|
555
|
+
query="authentication bug",
|
|
556
|
+
state="open",
|
|
557
|
+
limit=10 # Safe limit for search results
|
|
558
|
+
)
|
|
559
|
+
# ~3k-5k tokens (includes relevance scoring)
|
|
560
|
+
|
|
561
|
+
# Access results
|
|
562
|
+
for ticket in results['items']:
|
|
563
|
+
print(f"{ticket['id']}: {ticket['title']} (score: {ticket['relevance_score']})")
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### Token Optimization Tips
|
|
567
|
+
|
|
568
|
+
**Use compact mode by default** (70% token reduction):
|
|
569
|
+
```python
|
|
570
|
+
# ✅ Good: Compact mode for browsing
|
|
571
|
+
tickets = await ticket_list(limit=50, compact=True) # ~750 tokens
|
|
572
|
+
|
|
573
|
+
# ❌ Avoid: Full mode with large limits
|
|
574
|
+
tickets = await ticket_list(limit=100, compact=False) # ~18,500 tokens (too close to limit!)
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
**Progressive disclosure** (fetch details on demand):
|
|
578
|
+
```python
|
|
579
|
+
# ✅ Good: Summary first, details on demand
|
|
580
|
+
summary = await ticket_list(limit=50, compact=True)
|
|
581
|
+
# Then fetch full details only for tickets you need
|
|
582
|
+
for ticket in important_tickets:
|
|
583
|
+
details = await ticket_read(ticket['id'])
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
**Paginate large datasets**:
|
|
587
|
+
```python
|
|
588
|
+
# ✅ Good: Process in batches
|
|
589
|
+
all_labels = []
|
|
590
|
+
offset = 0
|
|
591
|
+
while True:
|
|
592
|
+
batch = await label_list(limit=100, offset=offset)
|
|
593
|
+
all_labels.extend(batch['labels'])
|
|
594
|
+
if not batch['has_more']:
|
|
595
|
+
break
|
|
596
|
+
offset += 100
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### Configuration
|
|
600
|
+
|
|
601
|
+
Pagination is automatic and requires no configuration. However, you can control response size through parameters:
|
|
602
|
+
|
|
603
|
+
```python
|
|
604
|
+
# Adjust limit per tool (within safe maximums)
|
|
605
|
+
tickets = await ticket_list(limit=50) # Increase from default 20
|
|
606
|
+
|
|
607
|
+
# Use compact mode to maximize items per response
|
|
608
|
+
tickets = await ticket_list(limit=100, compact=True) # Safe with compact mode
|
|
609
|
+
|
|
610
|
+
# Use summary_only for analysis tools
|
|
611
|
+
report = await ticket_cleanup_report(summary_only=True) # Minimal tokens
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
### Response Fields
|
|
615
|
+
|
|
616
|
+
All paginated tools return these metadata fields:
|
|
617
|
+
|
|
618
|
+
```python
|
|
619
|
+
{
|
|
620
|
+
"status": "completed",
|
|
621
|
+
"items": [...], # Results (tickets, labels, etc.)
|
|
622
|
+
"count": 20, # Items in this response
|
|
623
|
+
"total": 150, # Total items available (if known)
|
|
624
|
+
"offset": 0, # Offset used for this page
|
|
625
|
+
"limit": 20, # Limit used for this page
|
|
626
|
+
"has_more": true, # Whether more pages exist
|
|
627
|
+
"truncated_by_tokens": false, # Whether token limit was hit before item limit
|
|
628
|
+
"estimated_tokens": 2500 # Approximate tokens in response
|
|
629
|
+
}
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
### Learn More
|
|
633
|
+
|
|
634
|
+
- **Comprehensive Guide**: [docs/user-docs/features/TOKEN_PAGINATION.md](docs/user-docs/features/TOKEN_PAGINATION.md) - Detailed technical documentation
|
|
635
|
+
- Token estimation algorithms
|
|
636
|
+
- Per-tool optimization strategies
|
|
637
|
+
- Advanced pagination patterns
|
|
638
|
+
- Troubleshooting guide
|
|
639
|
+
- **Code Examples**: [examples/token_pagination_examples.py](examples/token_pagination_examples.py) - Runnable examples
|
|
640
|
+
- **Migration from v1.2.x**: No breaking changes - existing code works with automatic pagination
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## 🎯 Project Status Analysis (NEW in v1.3.0)
|
|
645
|
+
|
|
646
|
+
Get intelligent project health assessments and actionable work plans with automated dependency analysis, blocker detection, and smart recommendations.
|
|
647
|
+
|
|
648
|
+
### Overview
|
|
649
|
+
|
|
650
|
+
The Project Status Analysis feature provides PM agents with comprehensive project insights:
|
|
651
|
+
|
|
652
|
+
- **Health Assessment**: Automated scoring (on_track, at_risk, off_track)
|
|
653
|
+
- **Dependency Analysis**: Critical path detection and blocker identification
|
|
654
|
+
- **Smart Recommendations**: Top 3 tickets to start next with reasoning
|
|
655
|
+
- **Work Distribution**: Team workload analysis and balance checking
|
|
656
|
+
- **Progress Tracking**: Completion rates and timeline risk assessment
|
|
657
|
+
|
|
658
|
+
### Quick Start
|
|
659
|
+
|
|
660
|
+
```python
|
|
661
|
+
# Get project status analysis (uses default_project from config)
|
|
662
|
+
result = await project_status()
|
|
663
|
+
|
|
664
|
+
# Analyze specific project
|
|
665
|
+
result = await project_status(project_id="eac28953c267")
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
**Example response:**
|
|
669
|
+
```json
|
|
670
|
+
{
|
|
671
|
+
"status": "success",
|
|
672
|
+
"project_id": "eac28953c267",
|
|
673
|
+
"project_name": "MCP Ticketer",
|
|
674
|
+
"health": "at_risk",
|
|
675
|
+
"summary": {
|
|
676
|
+
"total": 12,
|
|
677
|
+
"open": 5,
|
|
678
|
+
"in_progress": 4,
|
|
679
|
+
"done": 3
|
|
680
|
+
},
|
|
681
|
+
"recommended_next": [
|
|
682
|
+
{
|
|
683
|
+
"ticket_id": "1M-317",
|
|
684
|
+
"title": "Fix critical bug",
|
|
685
|
+
"priority": "critical",
|
|
686
|
+
"reason": "Critical priority, Unblocks 2 tickets",
|
|
687
|
+
"blocks": ["1M-315", "1M-316"]
|
|
688
|
+
}
|
|
689
|
+
],
|
|
690
|
+
"recommendations": [
|
|
691
|
+
"🔓 Resolve 1M-317 first (critical) - Unblocks 2 tickets",
|
|
692
|
+
"⚡ Project is AT RISK - Monitor closely"
|
|
693
|
+
]
|
|
694
|
+
}
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
### Features
|
|
698
|
+
|
|
699
|
+
#### 🏥 Health Assessment
|
|
700
|
+
Automated project health scoring based on:
|
|
701
|
+
- **Completion Rate**: % of tickets done
|
|
702
|
+
- **Progress Rate**: % of tickets actively worked
|
|
703
|
+
- **Blocker Rate**: % of tickets blocked (negative factor)
|
|
704
|
+
- **Priority Balance**: Critical/high priority completion
|
|
705
|
+
|
|
706
|
+
**Health Levels:**
|
|
707
|
+
- `on_track`: Project progressing well (health score ≥ 0.7)
|
|
708
|
+
- `at_risk`: Some concerns, needs monitoring (0.4-0.7)
|
|
709
|
+
- `off_track`: Serious issues, intervention needed (< 0.4)
|
|
710
|
+
|
|
711
|
+
#### 🔗 Dependency Analysis
|
|
712
|
+
Automatic dependency graph construction from ticket descriptions:
|
|
713
|
+
|
|
714
|
+
**Supported patterns:**
|
|
715
|
+
- "Depends on TICKET-123"
|
|
716
|
+
- "Blocks #456"
|
|
717
|
+
- "Related to PROJ-789"
|
|
718
|
+
- "1M-316: Feature name" (inline references)
|
|
719
|
+
|
|
720
|
+
**Insights:**
|
|
721
|
+
- **Critical Path**: Longest dependency chain
|
|
722
|
+
- **High-Impact Tickets**: Tickets blocking the most work
|
|
723
|
+
- **Blockers**: Active blockers preventing progress
|
|
724
|
+
|
|
725
|
+
#### 🎯 Smart Recommendations
|
|
726
|
+
Intelligent ticket prioritization based on:
|
|
727
|
+
1. **Priority** (critical > high > medium > low)
|
|
728
|
+
2. **Impact** (tickets blocking others score higher)
|
|
729
|
+
3. **Critical Path** (tickets on longest chain prioritized)
|
|
730
|
+
4. **Blockers** (unblocked tickets preferred)
|
|
731
|
+
5. **State** (open/ready tickets ranked higher)
|
|
732
|
+
|
|
733
|
+
Returns top 3 tickets to start next with clear reasoning.
|
|
734
|
+
|
|
735
|
+
#### 👥 Work Distribution Analysis
|
|
736
|
+
Team workload analysis showing:
|
|
737
|
+
- Tickets per assignee
|
|
738
|
+
- State breakdown per assignee
|
|
739
|
+
- Workload imbalance detection
|
|
740
|
+
|
|
741
|
+
### Usage Examples
|
|
742
|
+
|
|
743
|
+
#### Basic Project Health Check
|
|
744
|
+
```python
|
|
745
|
+
# Get health of default project
|
|
746
|
+
status = await project_status()
|
|
747
|
+
|
|
748
|
+
print(f"Health: {status['health']}")
|
|
749
|
+
print(f"Total tickets: {status['summary']['total']}")
|
|
750
|
+
print(f"Completion: {status['health_metrics']['completion_rate']:.1%}")
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
#### Analyze Specific Project
|
|
754
|
+
```python
|
|
755
|
+
# Analyze by project ID
|
|
756
|
+
status = await project_status(project_id="eac28953c267")
|
|
757
|
+
|
|
758
|
+
# Check for critical issues
|
|
759
|
+
if status['health'] == 'off_track':
|
|
760
|
+
print("⚠️ Project needs immediate attention!")
|
|
761
|
+
for rec in status['recommendations']:
|
|
762
|
+
print(f" • {rec}")
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
#### Get Next Actions
|
|
766
|
+
```python
|
|
767
|
+
# Get recommended tickets to work on
|
|
768
|
+
status = await project_status()
|
|
769
|
+
|
|
770
|
+
print("Top priorities:")
|
|
771
|
+
for ticket in status['recommended_next']:
|
|
772
|
+
print(f" {ticket['ticket_id']}: {ticket['title']}")
|
|
773
|
+
print(f" Priority: {ticket['priority']}")
|
|
774
|
+
print(f" Reason: {ticket['reason']}")
|
|
775
|
+
if ticket['blocks']:
|
|
776
|
+
print(f" Unblocks: {', '.join(ticket['blocks'])}")
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
#### Identify Blockers
|
|
780
|
+
```python
|
|
781
|
+
# Find what's blocking progress
|
|
782
|
+
status = await project_status()
|
|
783
|
+
|
|
784
|
+
if status['blockers']:
|
|
785
|
+
print("🚧 Active blockers:")
|
|
786
|
+
for blocker in status['blockers']:
|
|
787
|
+
print(f" {blocker['ticket_id']}: {blocker['title']}")
|
|
788
|
+
print(f" Blocking {blocker['blocks_count']} tickets")
|
|
789
|
+
print(f" State: {blocker['state']}, Priority: {blocker['priority']}")
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
#### PM Daily Standup Workflow
|
|
793
|
+
```python
|
|
794
|
+
# Complete PM workflow for daily standup
|
|
795
|
+
async def daily_standup():
|
|
796
|
+
status = await project_status()
|
|
797
|
+
|
|
798
|
+
# 1. Overall health
|
|
799
|
+
print(f"📊 Project Health: {status['health'].upper()}")
|
|
800
|
+
print(f" Completion: {status['health_metrics']['completion_rate']:.0%}")
|
|
801
|
+
print(f" In Progress: {status['summary'].get('in_progress', 0)} tickets")
|
|
802
|
+
|
|
803
|
+
# 2. Blockers
|
|
804
|
+
if status['blockers']:
|
|
805
|
+
print(f"\n🚧 {len(status['blockers'])} Active Blockers:")
|
|
806
|
+
for blocker in status['blockers'][:3]:
|
|
807
|
+
print(f" • {blocker['ticket_id']}: {blocker['title']}")
|
|
808
|
+
|
|
809
|
+
# 3. Next actions
|
|
810
|
+
print(f"\n🎯 Top Priorities:")
|
|
811
|
+
for ticket in status['recommended_next']:
|
|
812
|
+
print(f" • {ticket['ticket_id']}: {ticket['reason']}")
|
|
813
|
+
|
|
814
|
+
# 4. Recommendations
|
|
815
|
+
print(f"\n💡 Recommendations:")
|
|
816
|
+
for rec in status['recommendations']:
|
|
817
|
+
print(f" • {rec}")
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
### Configuration
|
|
821
|
+
|
|
822
|
+
Set default project for automatic analysis:
|
|
823
|
+
|
|
824
|
+
```bash
|
|
825
|
+
# Via CLI
|
|
826
|
+
mcp-ticketer config set-project eac28953c267
|
|
827
|
+
|
|
828
|
+
# Via MCP tool
|
|
829
|
+
result = await config_set_default_project(project_id="eac28953c267")
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
### Advanced Usage
|
|
833
|
+
|
|
834
|
+
#### Health Metrics Deep Dive
|
|
835
|
+
```python
|
|
836
|
+
status = await project_status()
|
|
837
|
+
metrics = status['health_metrics']
|
|
838
|
+
|
|
839
|
+
print(f"Health Score: {metrics['health_score']:.2f}/1.00")
|
|
840
|
+
print(f"Completion Rate: {metrics['completion_rate']:.1%}")
|
|
841
|
+
print(f"Progress Rate: {metrics['progress_rate']:.1%}")
|
|
842
|
+
print(f"Blocked Rate: {metrics['blocked_rate']:.1%}")
|
|
843
|
+
print(f"Critical Tickets: {metrics['critical_count']}")
|
|
844
|
+
print(f"High Priority: {metrics['high_count']}")
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
#### Critical Path Analysis
|
|
848
|
+
```python
|
|
849
|
+
status = await project_status()
|
|
850
|
+
|
|
851
|
+
if status['critical_path']:
|
|
852
|
+
print("🛣️ Critical Path (longest dependency chain):")
|
|
853
|
+
for ticket_id in status['critical_path']:
|
|
854
|
+
print(f" → {ticket_id}")
|
|
855
|
+
print(f"\nLength: {len(status['critical_path'])} tickets")
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
#### Work Distribution
|
|
859
|
+
```python
|
|
860
|
+
status = await project_status()
|
|
861
|
+
|
|
862
|
+
print("👥 Work Distribution:")
|
|
863
|
+
for assignee, workload in status['work_distribution'].items():
|
|
864
|
+
print(f"\n{assignee}:")
|
|
865
|
+
print(f" Total: {workload['total']}")
|
|
866
|
+
for state, count in workload.items():
|
|
867
|
+
if state != 'total':
|
|
868
|
+
print(f" {state}: {count}")
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
### Integration with Other Features
|
|
872
|
+
|
|
873
|
+
#### Combine with Project Updates
|
|
874
|
+
```python
|
|
875
|
+
# 1. Analyze project status
|
|
876
|
+
status = await project_status(project_id="proj-123")
|
|
877
|
+
|
|
878
|
+
# 2. Create status update with health indicator
|
|
879
|
+
update = await project_update_create(
|
|
880
|
+
project_id="proj-123",
|
|
881
|
+
body=f"Sprint review: {status['summary']['done']} tickets completed",
|
|
882
|
+
health=status['health'] # Use analyzed health
|
|
883
|
+
)
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
#### Combine with Ticket Management
|
|
887
|
+
```python
|
|
888
|
+
# 1. Get recommendations
|
|
889
|
+
status = await project_status()
|
|
890
|
+
|
|
891
|
+
# 2. Auto-assign top priority ticket
|
|
892
|
+
if status['recommended_next']:
|
|
893
|
+
top_ticket = status['recommended_next'][0]
|
|
894
|
+
await ticket_assign(
|
|
895
|
+
ticket_id=top_ticket['ticket_id'],
|
|
896
|
+
assignee="john.doe@example.com",
|
|
897
|
+
comment=f"Priority: {top_ticket['reason']}"
|
|
898
|
+
)
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
### Learn More
|
|
902
|
+
|
|
903
|
+
- **Comprehensive Guide**: [docs/meta/PROJECT_STATUS.md](docs/meta/PROJECT_STATUS.md) - Full documentation
|
|
904
|
+
- **Runnable Examples**: [examples/project_status_examples.py](examples/project_status_examples.py) - Copy-paste code
|
|
905
|
+
- **PM Monitoring Tools**: [docs/PM_MONITORING_TOOLS.md](docs/PM_MONITORING_TOOLS.md) - Ticket cleanup features
|
|
906
|
+
- **Linear Setup**: [docs/integrations/setup/LINEAR_SETUP.md](docs/integrations/setup/LINEAR_SETUP.md) - Platform-specific guides
|
|
907
|
+
|
|
908
|
+
## 🤖 MCP Server Integration
|
|
909
|
+
|
|
910
|
+
MCP Ticketer provides seamless integration with AI clients through automatic configuration and platform detection:
|
|
911
|
+
|
|
912
|
+
```bash
|
|
913
|
+
# Auto-detection (Recommended)
|
|
914
|
+
mcp-ticketer install # Interactive: detect and prompt for platform
|
|
915
|
+
mcp-ticketer install --auto-detect # Show all detected AI platforms
|
|
916
|
+
mcp-ticketer install --all # Install for all detected platforms
|
|
917
|
+
mcp-ticketer install --all --dry-run # Preview what would be installed
|
|
918
|
+
|
|
919
|
+
# Platform-specific installation
|
|
920
|
+
mcp-ticketer install claude-code # For Claude Code (project-level)
|
|
921
|
+
mcp-ticketer install claude-desktop # For Claude Desktop (global)
|
|
922
|
+
mcp-ticketer install gemini # For Gemini CLI
|
|
923
|
+
mcp-ticketer install codex # For Codex CLI
|
|
924
|
+
mcp-ticketer install auggie # For Auggie
|
|
925
|
+
|
|
926
|
+
# Manual MCP server control (advanced)
|
|
927
|
+
mcp-ticketer mcp # Start MCP server in current directory
|
|
928
|
+
mcp-ticketer mcp --path /path/to/project # Start in specific directory
|
|
929
|
+
|
|
930
|
+
# Remove MCP configuration when needed
|
|
931
|
+
mcp-ticketer remove claude-code # Remove from Claude Code
|
|
932
|
+
mcp-ticketer uninstall auggie # Alias for remove
|
|
933
|
+
```
|
|
934
|
+
|
|
935
|
+
**Configuration is automatic** - the commands above will:
|
|
936
|
+
1. Detect your mcp-ticketer installation
|
|
937
|
+
2. Read your adapter configuration
|
|
938
|
+
3. Generate the appropriate MCP server config
|
|
939
|
+
4. Save it to the correct location for your AI client
|
|
940
|
+
|
|
941
|
+
#### Claude Code Installation
|
|
942
|
+
|
|
943
|
+
**Automatic (Recommended)**:
|
|
944
|
+
```bash
|
|
945
|
+
mcp-ticketer install --platform claude-code
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
The installer automatically detects if you have Claude CLI installed:
|
|
949
|
+
- **With Claude CLI**: Uses native `claude mcp add` command (recommended)
|
|
950
|
+
- **Without Claude CLI**: Falls back to JSON configuration
|
|
951
|
+
|
|
952
|
+
**Manual Installation** (if needed):
|
|
953
|
+
```bash
|
|
954
|
+
# If you have Claude CLI installed
|
|
955
|
+
claude mcp add --scope local --transport stdio mcp-ticketer \
|
|
956
|
+
-- mcp-ticketer mcp --path $(pwd)
|
|
957
|
+
|
|
958
|
+
# Or configure manually via JSON (legacy method)
|
|
959
|
+
# See manual configuration example below for details
|
|
960
|
+
```
|
|
961
|
+
|
|
962
|
+
**Note**: Claude CLI provides better validation and error handling.
|
|
963
|
+
Install it from: https://docs.claude.ai/cli
|
|
964
|
+
|
|
965
|
+
For comprehensive details on native CLI support, see [Claude Code Native CLI Feature Documentation](docs/features/claude-code-native-cli.md).
|
|
966
|
+
|
|
967
|
+
**Manual Configuration Example** (Claude Code):
|
|
968
|
+
|
|
969
|
+
Claude Code supports two configuration file locations with automatic detection:
|
|
970
|
+
|
|
971
|
+
**Option 1: Global Configuration** (`~/.config/claude/mcp.json`) - **Recommended**
|
|
972
|
+
|
|
973
|
+
```json
|
|
974
|
+
{
|
|
975
|
+
"mcpServers": {
|
|
976
|
+
"mcp-ticketer": {
|
|
977
|
+
"command": "/path/to/venv/bin/python",
|
|
978
|
+
"args": ["-m", "mcp_ticketer.mcp.server"],
|
|
979
|
+
"env": {
|
|
980
|
+
"MCP_TICKETER_ADAPTER": "linear",
|
|
981
|
+
"LINEAR_API_KEY": "your_key_here"
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
```
|
|
987
|
+
|
|
988
|
+
**Option 2: Project-Specific Configuration** (`~/.claude.json`)
|
|
989
|
+
|
|
990
|
+
```json
|
|
991
|
+
{
|
|
992
|
+
"projects": {
|
|
993
|
+
"/absolute/path/to/project": {
|
|
994
|
+
"mcpServers": {
|
|
995
|
+
"mcp-ticketer": {
|
|
996
|
+
"command": "/path/to/venv/bin/python",
|
|
997
|
+
"args": ["-m", "mcp_ticketer.mcp.server", "/absolute/path/to/project"],
|
|
998
|
+
"env": {
|
|
999
|
+
"PYTHONPATH": "/absolute/path/to/project",
|
|
1000
|
+
"MCP_TICKETER_ADAPTER": "aitrackdown"
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
**Configuration Priority:**
|
|
1010
|
+
- New location (`~/.config/claude/mcp.json`) checked first
|
|
1011
|
+
- Falls back to old location (`~/.claude.json`) if new location not found
|
|
1012
|
+
- Maintains full backward compatibility with existing configurations
|
|
1013
|
+
- Both locations fully supported
|
|
1014
|
+
|
|
1015
|
+
**Why this pattern?**
|
|
1016
|
+
- **More Reliable**: Uses venv Python directly instead of binary wrapper
|
|
1017
|
+
- **Consistent**: Matches proven mcp-vector-search pattern
|
|
1018
|
+
- **Universal**: Works across pipx, pip, and uv installations
|
|
1019
|
+
- **Better Errors**: Python module invocation provides clearer error messages
|
|
1020
|
+
|
|
1021
|
+
**Automatic Detection**: The `mcp-ticketer install` commands automatically detect your venv Python, configuration location, and generate the correct configuration format.
|
|
1022
|
+
|
|
1023
|
+
**See [AI Client Integration Guide](docs/integrations/AI_CLIENT_INTEGRATION.md) for client-specific details.**
|
|
1024
|
+
|
|
1025
|
+
## 💾 Compact Mode for AI Agents (v0.15.0+)
|
|
1026
|
+
|
|
1027
|
+
The `ticket_list` MCP tool supports compact mode, reducing token usage by **70%** when listing tickets - perfect for AI agents working with large ticket sets. Compact mode is part of the broader [Token Pagination](#-token-pagination-v131) system introduced in v1.3.1.
|
|
1028
|
+
|
|
1029
|
+
### Quick Reference
|
|
1030
|
+
|
|
1031
|
+
| Mode | Tokens (100 tickets) | Use Case |
|
|
1032
|
+
|------|---------------------|----------|
|
|
1033
|
+
| **Standard** | ~18,500 tokens | Detailed ticket views, individual ticket processing |
|
|
1034
|
+
| **Compact** | ~5,500 tokens | Dashboards, bulk operations, filtering |
|
|
1035
|
+
| **Savings** | **70% reduction** | Query 3x more tickets in same context window |
|
|
1036
|
+
|
|
1037
|
+
### Basic Usage
|
|
1038
|
+
|
|
1039
|
+
```python
|
|
1040
|
+
# Compact mode (recommended default)
|
|
1041
|
+
result = await ticket_list(limit=100, compact=True) # ~5,500 tokens
|
|
1042
|
+
|
|
1043
|
+
# Full mode (when you need all details)
|
|
1044
|
+
result = await ticket_list(limit=20, compact=False) # ~3,700 tokens
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
### Fields Returned
|
|
1048
|
+
|
|
1049
|
+
**Compact Mode (7 fields):**
|
|
1050
|
+
- `id`, `title`, `state`, `priority`, `assignee`, `tags`, `parent_epic`
|
|
1051
|
+
|
|
1052
|
+
**Standard Mode (16 fields):**
|
|
1053
|
+
- All compact fields plus: `description`, `created_at`, `updated_at`, `metadata`, `ticket_type`, `estimated_hours`, `actual_hours`, `children`, `parent_issue`
|
|
1054
|
+
|
|
1055
|
+
### Learn More
|
|
1056
|
+
|
|
1057
|
+
- **Token Pagination**: See [📄 Token Pagination](#-token-pagination-v131) section for comprehensive guide on pagination, token optimization, and best practices
|
|
1058
|
+
- **Technical Details**: [docs/user-docs/features/TOKEN_PAGINATION.md](docs/user-docs/features/TOKEN_PAGINATION.md) - Per-tool token estimates and optimization strategies
|
|
1059
|
+
- **Quick Summary**: [COMPACT_MODE_SUMMARY.md](COMPACT_MODE_SUMMARY.md) - Compact mode reference
|
|
1060
|
+
|
|
1061
|
+
## ⚙️ Configuration
|
|
1062
|
+
|
|
1063
|
+
### Quick Setup with MCP Tools (New in v1.x)
|
|
1064
|
+
|
|
1065
|
+
**Simplified Configuration**: New MCP tools reduce adapter setup time from 15-30 minutes to < 3 minutes.
|
|
1066
|
+
|
|
1067
|
+
```python
|
|
1068
|
+
# 1. List available adapters with configuration status
|
|
1069
|
+
result = await config_list_adapters()
|
|
1070
|
+
# Shows: linear, github, jira, aitrackdown - which are configured
|
|
1071
|
+
|
|
1072
|
+
# 2. Get requirements for your adapter
|
|
1073
|
+
requirements = await config_get_adapter_requirements("linear")
|
|
1074
|
+
# Shows: api_key (required), team_id (optional)
|
|
1075
|
+
|
|
1076
|
+
# 3. Configure adapter with one-call setup wizard
|
|
1077
|
+
result = await config_setup_wizard(
|
|
1078
|
+
adapter_type="linear",
|
|
1079
|
+
credentials={
|
|
1080
|
+
"api_key": "lin_api_...",
|
|
1081
|
+
"team_id": "ENG" # or team UUID
|
|
1082
|
+
}
|
|
1083
|
+
)
|
|
1084
|
+
# Validates, tests connection, and saves configuration
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
**Benefits:**
|
|
1088
|
+
- ✅ Automatic validation and connection testing
|
|
1089
|
+
- ✅ Clear error messages with actionable guidance
|
|
1090
|
+
- ✅ One-call setup (no chaining multiple commands)
|
|
1091
|
+
- ✅ < 3 minutes total setup time
|
|
1092
|
+
|
|
1093
|
+
For complete documentation, see [Configuration Guide](docs/user-docs/getting-started/CONFIGURATION.md#quick-setup-with-mcp-tools).
|
|
1094
|
+
|
|
1095
|
+
### Linear Configuration
|
|
1096
|
+
|
|
1097
|
+
Configure Linear using a team **URL** (easiest), team **key**, or team **ID**:
|
|
1098
|
+
|
|
1099
|
+
**Option 1: Team URL** (Easiest)
|
|
1100
|
+
```bash
|
|
1101
|
+
# Paste your Linear team issues URL during setup
|
|
1102
|
+
mcp-ticketer init --adapter linear --team-url https://linear.app/your-org/team/ENG/active
|
|
1103
|
+
|
|
1104
|
+
# The system automatically extracts the team key and resolves it to the team ID
|
|
1105
|
+
```
|
|
1106
|
+
|
|
1107
|
+
**Option 2: Team Key**
|
|
1108
|
+
```bash
|
|
1109
|
+
# In .env or environment
|
|
1110
|
+
LINEAR_API_KEY=lin_api_...
|
|
1111
|
+
LINEAR_TEAM_KEY=ENG
|
|
1112
|
+
```
|
|
1113
|
+
|
|
1114
|
+
**Option 3: Team ID**
|
|
1115
|
+
```bash
|
|
1116
|
+
# In .env or environment
|
|
1117
|
+
LINEAR_API_KEY=lin_api_...
|
|
1118
|
+
LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
|
|
1119
|
+
```
|
|
1120
|
+
|
|
1121
|
+
**Supported URL formats:**
|
|
1122
|
+
- `https://linear.app/your-org/team/ABC/active` (full issues page)
|
|
1123
|
+
- `https://linear.app/your-org/team/ABC/` (team page)
|
|
1124
|
+
- `https://linear.app/your-org/team/ABC` (short form)
|
|
1125
|
+
|
|
1126
|
+
**Understanding Linear URLs:**
|
|
1127
|
+
Linear project and issue URLs work with any path suffix (`/issues`, `/overview`, `/updates`). The adapter automatically extracts the identifier and uses Linear's GraphQL API. See [Linear URL Handling Guide](docs/developer-docs/adapters/LINEAR_URL_HANDLING.md) for details.
|
|
1128
|
+
|
|
1129
|
+
**Finding your team information:**
|
|
1130
|
+
1. **Easiest**: Copy the URL from your Linear team's issues page
|
|
1131
|
+
2. **Alternative**: Go to Linear Settings → Teams → Your Team → "Key" field (e.g., "ENG", "DESIGN", "PRODUCT")
|
|
1132
|
+
|
|
1133
|
+
### Environment Variables
|
|
1134
|
+
|
|
1135
|
+
See [.env.example](.env.example) for a complete list of supported environment variables for all adapters.
|
|
1136
|
+
|
|
1137
|
+
## 📚 Documentation
|
|
1138
|
+
|
|
1139
|
+
Full documentation is available at [https://mcp-ticketer.readthedocs.io](https://mcp-ticketer.readthedocs.io)
|
|
1140
|
+
|
|
1141
|
+
- [Getting Started Guide](https://mcp-ticketer.readthedocs.io/en/latest/getting-started/)
|
|
1142
|
+
- [API Reference](https://mcp-ticketer.readthedocs.io/en/latest/api/)
|
|
1143
|
+
- [Adapter Development](https://mcp-ticketer.readthedocs.io/en/latest/adapters/)
|
|
1144
|
+
- [MCP Integration](https://mcp-ticketer.readthedocs.io/en/latest/mcp/)
|
|
1145
|
+
|
|
1146
|
+
## 🏗️ Architecture
|
|
1147
|
+
|
|
1148
|
+
```
|
|
1149
|
+
mcp-ticketer/
|
|
1150
|
+
├── adapters/ # Ticket system adapters
|
|
1151
|
+
│ ├── jira/ # JIRA integration
|
|
1152
|
+
│ ├── linear/ # Linear integration
|
|
1153
|
+
│ ├── github/ # GitHub Issues
|
|
1154
|
+
│ └── aitrackdown/ # Local file storage
|
|
1155
|
+
├── core/ # Core models and interfaces
|
|
1156
|
+
├── cli/ # Command-line interface
|
|
1157
|
+
├── mcp/ # MCP server implementation
|
|
1158
|
+
├── cache/ # Caching layer
|
|
1159
|
+
└── queue/ # Queue system for async operations
|
|
1160
|
+
```
|
|
1161
|
+
|
|
1162
|
+
### State Machine
|
|
1163
|
+
|
|
1164
|
+
```mermaid
|
|
1165
|
+
graph LR
|
|
1166
|
+
OPEN --> IN_PROGRESS
|
|
1167
|
+
IN_PROGRESS --> READY
|
|
1168
|
+
IN_PROGRESS --> WAITING
|
|
1169
|
+
IN_PROGRESS --> BLOCKED
|
|
1170
|
+
WAITING --> IN_PROGRESS
|
|
1171
|
+
BLOCKED --> IN_PROGRESS
|
|
1172
|
+
READY --> TESTED
|
|
1173
|
+
TESTED --> DONE
|
|
1174
|
+
DONE --> CLOSED
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
## 🧪 Development
|
|
1178
|
+
|
|
1179
|
+
### Setup Development Environment
|
|
1180
|
+
|
|
1181
|
+
```bash
|
|
1182
|
+
# Clone repository
|
|
1183
|
+
git clone https://github.com/mcp-ticketer/mcp-ticketer.git
|
|
1184
|
+
cd mcp-ticketer
|
|
1185
|
+
|
|
1186
|
+
# Activate existing virtual environment
|
|
1187
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
1188
|
+
|
|
1189
|
+
# Install in development mode with all dependencies
|
|
1190
|
+
pip install -e ".[dev,test,docs]"
|
|
1191
|
+
|
|
1192
|
+
# Install pre-commit hooks
|
|
1193
|
+
pre-commit install
|
|
1194
|
+
```
|
|
1195
|
+
|
|
1196
|
+
**Note**: The project includes a pre-configured `.venv` with all dependencies. Just activate it to get started.
|
|
1197
|
+
|
|
1198
|
+
**Troubleshooting pytest issues?** See [Development Environment Guide](docs/DEVELOPMENT_ENVIRONMENT.md) for detailed setup instructions and common issue resolution.
|
|
1199
|
+
|
|
1200
|
+
### Modular Build System
|
|
1201
|
+
|
|
1202
|
+
mcp-ticketer uses a **modular Makefile architecture** for streamlined development workflows. The build system is organized into specialized modules for quality, testing, releases, documentation, and MCP-specific operations.
|
|
1203
|
+
|
|
1204
|
+
**Quick Start**:
|
|
1205
|
+
```bash
|
|
1206
|
+
# Show all available commands
|
|
1207
|
+
make help
|
|
1208
|
+
|
|
1209
|
+
# Complete development setup
|
|
1210
|
+
make setup
|
|
1211
|
+
|
|
1212
|
+
# Run tests in parallel (3-4x faster)
|
|
1213
|
+
make test-parallel
|
|
1214
|
+
|
|
1215
|
+
# Run all quality checks
|
|
1216
|
+
make quality
|
|
1217
|
+
|
|
1218
|
+
# View project information
|
|
1219
|
+
make info
|
|
1220
|
+
```
|
|
1221
|
+
|
|
1222
|
+
**Key Features**:
|
|
1223
|
+
- ⚡ **Parallel Testing**: 3-4x faster with `make test-parallel`
|
|
1224
|
+
- 📊 **Enhanced Help**: Categorized targets with descriptions
|
|
1225
|
+
- 🎯 **70+ Targets**: Organized by module (testing, quality, release, docs, MCP)
|
|
1226
|
+
- 🔧 **Build Metadata**: Generate build information with `make build-metadata`
|
|
1227
|
+
- 📋 **Module Introspection**: View loaded modules with `make modules`
|
|
1228
|
+
|
|
1229
|
+
**Common Commands**:
|
|
1230
|
+
```bash
|
|
1231
|
+
# Testing
|
|
1232
|
+
make test # Run all tests (serial)
|
|
1233
|
+
make test-parallel # Run tests in parallel (3-4x faster)
|
|
1234
|
+
make test-fast # Parallel tests with fail-fast
|
|
1235
|
+
make test-coverage # Tests with HTML coverage report
|
|
1236
|
+
|
|
1237
|
+
# Code Quality
|
|
1238
|
+
make lint # Run linters (Ruff + MyPy)
|
|
1239
|
+
make lint-fix # Auto-fix linting issues
|
|
1240
|
+
make format # Format code (Black + isort)
|
|
1241
|
+
make typecheck # Run MyPy type checking
|
|
1242
|
+
make quality # Run all quality checks
|
|
1243
|
+
|
|
1244
|
+
# Release
|
|
1245
|
+
make check-release # Validate release readiness
|
|
1246
|
+
make release-patch # Bump patch version and publish
|
|
1247
|
+
make release-minor # Bump minor version and publish
|
|
1248
|
+
|
|
1249
|
+
# Documentation
|
|
1250
|
+
make docs # Build documentation
|
|
1251
|
+
make docs-serve # Serve docs at localhost:8000
|
|
1252
|
+
make docs-open # Build and open in browser
|
|
1253
|
+
```
|
|
1254
|
+
|
|
1255
|
+
**Build System Details**:
|
|
1256
|
+
- See [.makefiles/README.md](.makefiles/README.md) for complete module documentation
|
|
1257
|
+
- See [.makefiles/QUICK_REFERENCE.md](.makefiles/QUICK_REFERENCE.md) for quick command reference
|
|
1258
|
+
- See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for comprehensive development guide
|
|
1259
|
+
|
|
1260
|
+
### Running Tests
|
|
1261
|
+
|
|
1262
|
+
```bash
|
|
1263
|
+
# Quick testing (recommended for development)
|
|
1264
|
+
make test-parallel # Parallel execution (3-4x faster)
|
|
1265
|
+
make test-fast # Parallel with fail-fast
|
|
1266
|
+
|
|
1267
|
+
# Standard pytest commands (still supported)
|
|
1268
|
+
pytest # Run all tests
|
|
1269
|
+
pytest --cov=mcp_ticketer --cov-report=html # With coverage
|
|
1270
|
+
pytest tests/test_adapters.py # Specific test file
|
|
1271
|
+
pytest -n auto # Manual parallel execution
|
|
1272
|
+
```
|
|
1273
|
+
|
|
1274
|
+
**Performance Comparison**:
|
|
1275
|
+
- Serial execution: ~30-60 seconds
|
|
1276
|
+
- Parallel (4 cores): ~8-15 seconds (**3-4x faster**)
|
|
1277
|
+
|
|
1278
|
+
### Code Quality
|
|
1279
|
+
|
|
1280
|
+
```bash
|
|
1281
|
+
# Using Makefile (recommended)
|
|
1282
|
+
make lint # Run Ruff and MyPy
|
|
1283
|
+
make lint-fix # Auto-fix issues
|
|
1284
|
+
make format # Format with Black and isort
|
|
1285
|
+
make typecheck # Type checking with MyPy
|
|
1286
|
+
make quality # All quality checks
|
|
1287
|
+
|
|
1288
|
+
# Direct commands (still supported)
|
|
1289
|
+
black src tests # Format code
|
|
1290
|
+
ruff check src tests # Lint code
|
|
1291
|
+
mypy src # Type checking
|
|
1292
|
+
tox # Run all checks
|
|
1293
|
+
```
|
|
1294
|
+
|
|
1295
|
+
### Building Documentation
|
|
1296
|
+
|
|
1297
|
+
```bash
|
|
1298
|
+
# Using Makefile (recommended)
|
|
1299
|
+
make docs # Build documentation
|
|
1300
|
+
make docs-serve # Serve at localhost:8000
|
|
1301
|
+
make docs-open # Build and open in browser
|
|
1302
|
+
|
|
1303
|
+
# Direct command (still supported)
|
|
1304
|
+
cd docs && make html # View at docs/_build/html/index.html
|
|
1305
|
+
```
|
|
1306
|
+
|
|
1307
|
+
## 📋 Roadmap
|
|
1308
|
+
|
|
1309
|
+
### ✅ v0.1.0 (Current)
|
|
1310
|
+
- Core ticket model and state machine
|
|
1311
|
+
- JIRA, Linear, GitHub, AITrackdown adapters
|
|
1312
|
+
- Rich CLI interface
|
|
1313
|
+
- MCP server for AI integration
|
|
1314
|
+
- Smart caching system
|
|
1315
|
+
- Comprehensive test suite
|
|
1316
|
+
|
|
1317
|
+
### 🚧 v0.2.0 (In Development)
|
|
1318
|
+
- [ ] Web UI Dashboard
|
|
1319
|
+
- [ ] Webhook Support
|
|
1320
|
+
- [ ] Advanced Search
|
|
1321
|
+
- [ ] Team Collaboration
|
|
1322
|
+
- [ ] Bulk Operations
|
|
1323
|
+
- [ ] API Rate Limiting
|
|
1324
|
+
|
|
1325
|
+
### 🔮 v0.3.0+ (Future)
|
|
1326
|
+
- [ ] GitLab Issues Adapter
|
|
1327
|
+
- [ ] Slack/Teams Integration
|
|
1328
|
+
- [ ] Custom Adapters SDK
|
|
1329
|
+
- [ ] Analytics Dashboard
|
|
1330
|
+
- [ ] Mobile Applications
|
|
1331
|
+
- [ ] Enterprise SSO
|
|
1332
|
+
|
|
1333
|
+
## 🤝 Contributing
|
|
1334
|
+
|
|
1335
|
+
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
|
|
1336
|
+
|
|
1337
|
+
1. Fork the repository
|
|
1338
|
+
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
|
1339
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
1340
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
1341
|
+
5. Open a Pull Request
|
|
1342
|
+
|
|
1343
|
+
## 📄 License
|
|
1344
|
+
|
|
1345
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
1346
|
+
|
|
1347
|
+
## 🙏 Acknowledgments
|
|
1348
|
+
|
|
1349
|
+
- Built with [Pydantic](https://pydantic-docs.helpmanual.io/) for data validation
|
|
1350
|
+
- CLI powered by [Typer](https://typer.tiangolo.com/) and [Rich](https://rich.readthedocs.io/)
|
|
1351
|
+
- MCP integration using the [Model Context Protocol](https://github.com/anthropics/model-context-protocol)
|
|
1352
|
+
|
|
1353
|
+
## 📞 Support
|
|
1354
|
+
|
|
1355
|
+
- 📧 Email: support@mcp-ticketer.io
|
|
1356
|
+
- 💬 Discord: [Join our community](https://discord.gg/mcp-ticketer)
|
|
1357
|
+
- 🐛 Issues: [GitHub Issues](https://github.com/mcp-ticketer/mcp-ticketer/issues)
|
|
1358
|
+
- 📖 Docs: [Read the Docs](https://mcp-ticketer.readthedocs.io)
|
|
1359
|
+
|
|
1360
|
+
## ⭐ Star History
|
|
1361
|
+
|
|
1362
|
+
[](https://star-history.com/#mcp-ticketer/mcp-ticketer&Date)
|
|
1363
|
+
|
|
1364
|
+
---
|
|
1365
|
+
|
|
1366
|
+
Made with ❤️ by the MCP Ticketer Team
|