mcp-ticketer 0.1.13__py3-none-any.whl → 0.1.14__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/__version__.py +1 -1
- mcp_ticketer/cli/main.py +307 -87
- mcp_ticketer/core/project_config.py +6 -6
- {mcp_ticketer-0.1.13.dist-info → mcp_ticketer-0.1.14.dist-info}/METADATA +1 -1
- {mcp_ticketer-0.1.13.dist-info → mcp_ticketer-0.1.14.dist-info}/RECORD +9 -9
- {mcp_ticketer-0.1.13.dist-info → mcp_ticketer-0.1.14.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.1.13.dist-info → mcp_ticketer-0.1.14.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.1.13.dist-info → mcp_ticketer-0.1.14.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.1.13.dist-info → mcp_ticketer-0.1.14.dist-info}/top_level.txt +0 -0
mcp_ticketer/__version__.py
CHANGED
mcp_ticketer/cli/main.py
CHANGED
|
@@ -160,11 +160,22 @@ def get_adapter(override_adapter: Optional[str] = None, override_config: Optiona
|
|
|
160
160
|
|
|
161
161
|
@app.command()
|
|
162
162
|
def init(
|
|
163
|
-
adapter:
|
|
164
|
-
|
|
163
|
+
adapter: Optional[str] = typer.Option(
|
|
164
|
+
None,
|
|
165
165
|
"--adapter",
|
|
166
166
|
"-a",
|
|
167
|
-
help="Adapter type to use"
|
|
167
|
+
help="Adapter type to use (auto-detected from .env if not specified)"
|
|
168
|
+
),
|
|
169
|
+
project_path: Optional[str] = typer.Option(
|
|
170
|
+
None,
|
|
171
|
+
"--path",
|
|
172
|
+
help="Project path (default: current directory)"
|
|
173
|
+
),
|
|
174
|
+
global_config: bool = typer.Option(
|
|
175
|
+
False,
|
|
176
|
+
"--global",
|
|
177
|
+
"-g",
|
|
178
|
+
help="Save to global config instead of project-specific"
|
|
168
179
|
),
|
|
169
180
|
base_path: Optional[str] = typer.Option(
|
|
170
181
|
None,
|
|
@@ -213,97 +224,306 @@ def init(
|
|
|
213
224
|
help="GitHub Personal Access Token"
|
|
214
225
|
),
|
|
215
226
|
) -> None:
|
|
216
|
-
"""Initialize
|
|
227
|
+
"""Initialize mcp-ticketer for the current project.
|
|
228
|
+
|
|
229
|
+
Creates .mcp-ticketer/config.json in the current directory with
|
|
230
|
+
auto-detected or specified adapter configuration.
|
|
231
|
+
|
|
232
|
+
Examples:
|
|
233
|
+
# Auto-detect from .env.local
|
|
234
|
+
mcp-ticketer init
|
|
235
|
+
|
|
236
|
+
# Force specific adapter
|
|
237
|
+
mcp-ticketer init --adapter linear
|
|
238
|
+
|
|
239
|
+
# Initialize for different project
|
|
240
|
+
mcp-ticketer init --path /path/to/project
|
|
241
|
+
|
|
242
|
+
# Save globally (not recommended)
|
|
243
|
+
mcp-ticketer init --global
|
|
244
|
+
"""
|
|
245
|
+
from pathlib import Path
|
|
246
|
+
from ..core.project_config import ConfigResolver
|
|
247
|
+
from ..core.env_discovery import discover_config
|
|
248
|
+
|
|
249
|
+
# Determine project path
|
|
250
|
+
proj_path = Path(project_path) if project_path else Path.cwd()
|
|
251
|
+
|
|
252
|
+
# Check if already initialized (unless using --global)
|
|
253
|
+
if not global_config:
|
|
254
|
+
config_path = proj_path / ".mcp-ticketer" / "config.json"
|
|
255
|
+
|
|
256
|
+
if config_path.exists():
|
|
257
|
+
if not typer.confirm(
|
|
258
|
+
f"Configuration already exists at {config_path}. Overwrite?",
|
|
259
|
+
default=False
|
|
260
|
+
):
|
|
261
|
+
console.print("[yellow]Initialization cancelled.[/yellow]")
|
|
262
|
+
raise typer.Exit(0)
|
|
263
|
+
|
|
264
|
+
# 1. Try auto-discovery if no adapter specified
|
|
265
|
+
discovered = None
|
|
266
|
+
adapter_type = adapter
|
|
267
|
+
|
|
268
|
+
if not adapter_type:
|
|
269
|
+
console.print("[cyan]🔍 Auto-discovering configuration from .env files...[/cyan]")
|
|
270
|
+
discovered = discover_config(proj_path)
|
|
271
|
+
|
|
272
|
+
if discovered and discovered.adapters:
|
|
273
|
+
primary = discovered.get_primary_adapter()
|
|
274
|
+
if primary:
|
|
275
|
+
adapter_type = primary.adapter_type
|
|
276
|
+
console.print(f"[green]✓ Detected {adapter_type} adapter from environment files[/green]")
|
|
277
|
+
|
|
278
|
+
# Show what was discovered
|
|
279
|
+
console.print(f"\n[dim]Configuration found in: {primary.found_in}[/dim]")
|
|
280
|
+
console.print(f"[dim]Confidence: {primary.confidence:.0%}[/dim]")
|
|
281
|
+
else:
|
|
282
|
+
adapter_type = "aitrackdown" # Fallback
|
|
283
|
+
console.print("[yellow]⚠ No credentials found, defaulting to aitrackdown[/yellow]")
|
|
284
|
+
else:
|
|
285
|
+
adapter_type = "aitrackdown" # Fallback
|
|
286
|
+
console.print("[yellow]⚠ No .env files found, defaulting to aitrackdown[/yellow]")
|
|
287
|
+
|
|
288
|
+
# 2. Create configuration based on adapter type
|
|
217
289
|
config = {
|
|
218
|
-
"default_adapter":
|
|
290
|
+
"default_adapter": adapter_type,
|
|
219
291
|
"adapters": {}
|
|
220
292
|
}
|
|
221
293
|
|
|
222
|
-
|
|
294
|
+
# 3. If discovered and matches adapter_type, use discovered config
|
|
295
|
+
if discovered and adapter_type != "aitrackdown":
|
|
296
|
+
discovered_adapter = discovered.get_adapter_by_type(adapter_type)
|
|
297
|
+
if discovered_adapter:
|
|
298
|
+
config["adapters"][adapter_type] = discovered_adapter.config
|
|
299
|
+
|
|
300
|
+
# 4. Handle manual configuration for specific adapters
|
|
301
|
+
if adapter_type == "aitrackdown":
|
|
223
302
|
config["adapters"]["aitrackdown"] = {"base_path": base_path or ".aitrackdown"}
|
|
224
|
-
elif adapter == AdapterType.LINEAR:
|
|
225
|
-
# For Linear, we need team_id and optionally api_key
|
|
226
|
-
if not team_id:
|
|
227
|
-
console.print("[red]Error:[/red] --team-id is required for Linear adapter")
|
|
228
|
-
raise typer.Exit(1)
|
|
229
|
-
|
|
230
|
-
config["adapters"]["linear"] = {"team_id": team_id}
|
|
231
|
-
|
|
232
|
-
# Check for API key in environment or parameter
|
|
233
|
-
linear_api_key = api_key or os.getenv("LINEAR_API_KEY")
|
|
234
|
-
if not linear_api_key:
|
|
235
|
-
console.print("[yellow]Warning:[/yellow] No Linear API key provided.")
|
|
236
|
-
console.print("Set LINEAR_API_KEY environment variable or use --api-key option")
|
|
237
|
-
else:
|
|
238
|
-
config["adapters"]["linear"]["api_key"] = linear_api_key
|
|
239
|
-
|
|
240
|
-
elif adapter == AdapterType.JIRA:
|
|
241
|
-
# For JIRA, we need server, email, and API token
|
|
242
|
-
server = jira_server or os.getenv("JIRA_SERVER")
|
|
243
|
-
email = jira_email or os.getenv("JIRA_EMAIL")
|
|
244
|
-
token = api_key or os.getenv("JIRA_API_TOKEN")
|
|
245
|
-
project = jira_project or os.getenv("JIRA_PROJECT_KEY")
|
|
246
|
-
|
|
247
|
-
if not server:
|
|
248
|
-
console.print("[red]Error:[/red] JIRA server URL is required")
|
|
249
|
-
console.print("Use --jira-server or set JIRA_SERVER environment variable")
|
|
250
|
-
raise typer.Exit(1)
|
|
251
|
-
|
|
252
|
-
if not email:
|
|
253
|
-
console.print("[red]Error:[/red] JIRA email is required")
|
|
254
|
-
console.print("Use --jira-email or set JIRA_EMAIL environment variable")
|
|
255
|
-
raise typer.Exit(1)
|
|
256
|
-
|
|
257
|
-
if not token:
|
|
258
|
-
console.print("[red]Error:[/red] JIRA API token is required")
|
|
259
|
-
console.print("Use --api-key or set JIRA_API_TOKEN environment variable")
|
|
260
|
-
console.print("[dim]Generate token at: https://id.atlassian.com/manage/api-tokens[/dim]")
|
|
261
|
-
raise typer.Exit(1)
|
|
262
|
-
|
|
263
|
-
config["adapters"]["jira"] = {
|
|
264
|
-
"server": server,
|
|
265
|
-
"email": email,
|
|
266
|
-
"api_token": token
|
|
267
|
-
}
|
|
268
303
|
|
|
269
|
-
|
|
270
|
-
|
|
304
|
+
elif adapter_type == "linear":
|
|
305
|
+
# If not auto-discovered, build from CLI params
|
|
306
|
+
if adapter_type not in config["adapters"]:
|
|
307
|
+
linear_config = {}
|
|
308
|
+
|
|
309
|
+
# Team ID
|
|
310
|
+
if team_id:
|
|
311
|
+
linear_config["team_id"] = team_id
|
|
312
|
+
|
|
313
|
+
# API Key
|
|
314
|
+
linear_api_key = api_key or os.getenv("LINEAR_API_KEY")
|
|
315
|
+
if linear_api_key:
|
|
316
|
+
linear_config["api_key"] = linear_api_key
|
|
317
|
+
elif not discovered:
|
|
318
|
+
console.print("[yellow]Warning:[/yellow] No Linear API key provided.")
|
|
319
|
+
console.print("Set LINEAR_API_KEY environment variable or use --api-key option")
|
|
320
|
+
|
|
321
|
+
if linear_config:
|
|
322
|
+
config["adapters"]["linear"] = linear_config
|
|
323
|
+
|
|
324
|
+
elif adapter_type == "jira":
|
|
325
|
+
# If not auto-discovered, build from CLI params
|
|
326
|
+
if adapter_type not in config["adapters"]:
|
|
327
|
+
server = jira_server or os.getenv("JIRA_SERVER")
|
|
328
|
+
email = jira_email or os.getenv("JIRA_EMAIL")
|
|
329
|
+
token = api_key or os.getenv("JIRA_API_TOKEN")
|
|
330
|
+
project = jira_project or os.getenv("JIRA_PROJECT_KEY")
|
|
331
|
+
|
|
332
|
+
if not server:
|
|
333
|
+
console.print("[red]Error:[/red] JIRA server URL is required")
|
|
334
|
+
console.print("Use --jira-server or set JIRA_SERVER environment variable")
|
|
335
|
+
raise typer.Exit(1)
|
|
336
|
+
|
|
337
|
+
if not email:
|
|
338
|
+
console.print("[red]Error:[/red] JIRA email is required")
|
|
339
|
+
console.print("Use --jira-email or set JIRA_EMAIL environment variable")
|
|
340
|
+
raise typer.Exit(1)
|
|
341
|
+
|
|
342
|
+
if not token:
|
|
343
|
+
console.print("[red]Error:[/red] JIRA API token is required")
|
|
344
|
+
console.print("Use --api-key or set JIRA_API_TOKEN environment variable")
|
|
345
|
+
console.print("[dim]Generate token at: https://id.atlassian.com/manage/api-tokens[/dim]")
|
|
346
|
+
raise typer.Exit(1)
|
|
347
|
+
|
|
348
|
+
jira_config = {
|
|
349
|
+
"server": server,
|
|
350
|
+
"email": email,
|
|
351
|
+
"api_token": token
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if project:
|
|
355
|
+
jira_config["project_key"] = project
|
|
356
|
+
|
|
357
|
+
config["adapters"]["jira"] = jira_config
|
|
358
|
+
|
|
359
|
+
elif adapter_type == "github":
|
|
360
|
+
# If not auto-discovered, build from CLI params
|
|
361
|
+
if adapter_type not in config["adapters"]:
|
|
362
|
+
owner = github_owner or os.getenv("GITHUB_OWNER")
|
|
363
|
+
repo = github_repo or os.getenv("GITHUB_REPO")
|
|
364
|
+
token = github_token or os.getenv("GITHUB_TOKEN")
|
|
365
|
+
|
|
366
|
+
if not owner:
|
|
367
|
+
console.print("[red]Error:[/red] GitHub repository owner is required")
|
|
368
|
+
console.print("Use --github-owner or set GITHUB_OWNER environment variable")
|
|
369
|
+
raise typer.Exit(1)
|
|
370
|
+
|
|
371
|
+
if not repo:
|
|
372
|
+
console.print("[red]Error:[/red] GitHub repository name is required")
|
|
373
|
+
console.print("Use --github-repo or set GITHUB_REPO environment variable")
|
|
374
|
+
raise typer.Exit(1)
|
|
375
|
+
|
|
376
|
+
if not token:
|
|
377
|
+
console.print("[red]Error:[/red] GitHub Personal Access Token is required")
|
|
378
|
+
console.print("Use --github-token or set GITHUB_TOKEN environment variable")
|
|
379
|
+
console.print("[dim]Create token at: https://github.com/settings/tokens/new[/dim]")
|
|
380
|
+
console.print("[dim]Required scopes: repo (for private repos) or public_repo (for public repos)[/dim]")
|
|
381
|
+
raise typer.Exit(1)
|
|
382
|
+
|
|
383
|
+
config["adapters"]["github"] = {
|
|
384
|
+
"owner": owner,
|
|
385
|
+
"repo": repo,
|
|
386
|
+
"token": token
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
# 5. Save to appropriate location
|
|
390
|
+
if global_config:
|
|
391
|
+
# Save to ~/.mcp-ticketer/config.json
|
|
392
|
+
resolver = ConfigResolver(project_path=proj_path)
|
|
393
|
+
config_file_path = resolver.GLOBAL_CONFIG_PATH
|
|
394
|
+
config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
395
|
+
|
|
396
|
+
with open(config_file_path, 'w') as f:
|
|
397
|
+
json.dump(config, f, indent=2)
|
|
398
|
+
|
|
399
|
+
console.print(f"[green]✓ Initialized with {adapter_type} adapter[/green]")
|
|
400
|
+
console.print(f"[dim]Global configuration saved to {config_file_path}[/dim]")
|
|
401
|
+
else:
|
|
402
|
+
# Save to ./.mcp-ticketer/config.json (PROJECT-SPECIFIC)
|
|
403
|
+
config_file_path = proj_path / ".mcp-ticketer" / "config.json"
|
|
404
|
+
config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
405
|
+
|
|
406
|
+
with open(config_file_path, 'w') as f:
|
|
407
|
+
json.dump(config, f, indent=2)
|
|
408
|
+
|
|
409
|
+
console.print(f"[green]✓ Initialized with {adapter_type} adapter[/green]")
|
|
410
|
+
console.print(f"[dim]Project configuration saved to {config_file_path}[/dim]")
|
|
411
|
+
|
|
412
|
+
# Add .mcp-ticketer to .gitignore if not already there
|
|
413
|
+
gitignore_path = proj_path / ".gitignore"
|
|
414
|
+
if gitignore_path.exists():
|
|
415
|
+
gitignore_content = gitignore_path.read_text()
|
|
416
|
+
if ".mcp-ticketer" not in gitignore_content:
|
|
417
|
+
with open(gitignore_path, 'a') as f:
|
|
418
|
+
f.write("\n# MCP Ticketer\n.mcp-ticketer/\n")
|
|
419
|
+
console.print("[dim]✓ Added .mcp-ticketer/ to .gitignore[/dim]")
|
|
271
420
|
else:
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
421
|
+
# Create .gitignore if it doesn't exist
|
|
422
|
+
with open(gitignore_path, 'w') as f:
|
|
423
|
+
f.write("# MCP Ticketer\n.mcp-ticketer/\n")
|
|
424
|
+
console.print("[dim]✓ Created .gitignore with .mcp-ticketer/[/dim]")
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
@app.command()
|
|
428
|
+
def install(
|
|
429
|
+
adapter: Optional[str] = typer.Option(
|
|
430
|
+
None,
|
|
431
|
+
"--adapter",
|
|
432
|
+
"-a",
|
|
433
|
+
help="Adapter type to use (auto-detected from .env if not specified)"
|
|
434
|
+
),
|
|
435
|
+
project_path: Optional[str] = typer.Option(
|
|
436
|
+
None,
|
|
437
|
+
"--path",
|
|
438
|
+
help="Project path (default: current directory)"
|
|
439
|
+
),
|
|
440
|
+
global_config: bool = typer.Option(
|
|
441
|
+
False,
|
|
442
|
+
"--global",
|
|
443
|
+
"-g",
|
|
444
|
+
help="Save to global config instead of project-specific"
|
|
445
|
+
),
|
|
446
|
+
base_path: Optional[str] = typer.Option(
|
|
447
|
+
None,
|
|
448
|
+
"--base-path",
|
|
449
|
+
"-p",
|
|
450
|
+
help="Base path for ticket storage (AITrackdown only)"
|
|
451
|
+
),
|
|
452
|
+
api_key: Optional[str] = typer.Option(
|
|
453
|
+
None,
|
|
454
|
+
"--api-key",
|
|
455
|
+
help="API key for Linear or API token for JIRA"
|
|
456
|
+
),
|
|
457
|
+
team_id: Optional[str] = typer.Option(
|
|
458
|
+
None,
|
|
459
|
+
"--team-id",
|
|
460
|
+
help="Linear team ID (required for Linear adapter)"
|
|
461
|
+
),
|
|
462
|
+
jira_server: Optional[str] = typer.Option(
|
|
463
|
+
None,
|
|
464
|
+
"--jira-server",
|
|
465
|
+
help="JIRA server URL (e.g., https://company.atlassian.net)"
|
|
466
|
+
),
|
|
467
|
+
jira_email: Optional[str] = typer.Option(
|
|
468
|
+
None,
|
|
469
|
+
"--jira-email",
|
|
470
|
+
help="JIRA user email for authentication"
|
|
471
|
+
),
|
|
472
|
+
jira_project: Optional[str] = typer.Option(
|
|
473
|
+
None,
|
|
474
|
+
"--jira-project",
|
|
475
|
+
help="Default JIRA project key"
|
|
476
|
+
),
|
|
477
|
+
github_owner: Optional[str] = typer.Option(
|
|
478
|
+
None,
|
|
479
|
+
"--github-owner",
|
|
480
|
+
help="GitHub repository owner"
|
|
481
|
+
),
|
|
482
|
+
github_repo: Optional[str] = typer.Option(
|
|
483
|
+
None,
|
|
484
|
+
"--github-repo",
|
|
485
|
+
help="GitHub repository name"
|
|
486
|
+
),
|
|
487
|
+
github_token: Optional[str] = typer.Option(
|
|
488
|
+
None,
|
|
489
|
+
"--github-token",
|
|
490
|
+
help="GitHub Personal Access Token"
|
|
491
|
+
),
|
|
492
|
+
) -> None:
|
|
493
|
+
"""Initialize mcp-ticketer for the current project (alias for init).
|
|
494
|
+
|
|
495
|
+
This command is synonymous with 'init' and provides the same functionality.
|
|
496
|
+
Creates .mcp-ticketer/config.json in the current directory with
|
|
497
|
+
auto-detected or specified adapter configuration.
|
|
498
|
+
|
|
499
|
+
Examples:
|
|
500
|
+
# Auto-detect from .env.local
|
|
501
|
+
mcp-ticketer install
|
|
502
|
+
|
|
503
|
+
# Force specific adapter
|
|
504
|
+
mcp-ticketer install --adapter linear
|
|
505
|
+
|
|
506
|
+
# Initialize for different project
|
|
507
|
+
mcp-ticketer install --path /path/to/project
|
|
508
|
+
|
|
509
|
+
# Save globally (not recommended)
|
|
510
|
+
mcp-ticketer install --global
|
|
511
|
+
"""
|
|
512
|
+
# Call init with all parameters
|
|
513
|
+
init(
|
|
514
|
+
adapter=adapter,
|
|
515
|
+
project_path=project_path,
|
|
516
|
+
global_config=global_config,
|
|
517
|
+
base_path=base_path,
|
|
518
|
+
api_key=api_key,
|
|
519
|
+
team_id=team_id,
|
|
520
|
+
jira_server=jira_server,
|
|
521
|
+
jira_email=jira_email,
|
|
522
|
+
jira_project=jira_project,
|
|
523
|
+
github_owner=github_owner,
|
|
524
|
+
github_repo=github_repo,
|
|
525
|
+
github_token=github_token,
|
|
526
|
+
)
|
|
307
527
|
|
|
308
528
|
|
|
309
529
|
@app.command("set")
|
|
@@ -414,7 +414,7 @@ class ConfigResolver:
|
|
|
414
414
|
) -> Dict[str, Any]:
|
|
415
415
|
"""Resolve adapter configuration with hierarchical precedence.
|
|
416
416
|
|
|
417
|
-
|
|
417
|
+
Resolution order (highest to lowest priority):
|
|
418
418
|
1. CLI overrides
|
|
419
419
|
2. Environment variables (os.getenv)
|
|
420
420
|
3. Project-specific config (.mcp-ticketer/config.json)
|
|
@@ -432,7 +432,7 @@ class ConfigResolver:
|
|
|
432
432
|
global_config = self.load_global_config()
|
|
433
433
|
project_config = self.load_project_config()
|
|
434
434
|
|
|
435
|
-
# Determine which adapter to use
|
|
435
|
+
# Determine which adapter to use (check project config first)
|
|
436
436
|
if adapter_name:
|
|
437
437
|
target_adapter = adapter_name
|
|
438
438
|
elif project_config and project_config.default_adapter:
|
|
@@ -452,7 +452,7 @@ class ConfigResolver:
|
|
|
452
452
|
# Start with empty config
|
|
453
453
|
resolved_config = {"adapter": target_adapter}
|
|
454
454
|
|
|
455
|
-
# 1. Apply global adapter config
|
|
455
|
+
# 1. Apply global adapter config (LOWEST PRIORITY)
|
|
456
456
|
if target_adapter in global_config.adapters:
|
|
457
457
|
global_adapter_config = global_config.adapters[target_adapter].to_dict()
|
|
458
458
|
resolved_config.update(global_adapter_config)
|
|
@@ -473,7 +473,7 @@ class ConfigResolver:
|
|
|
473
473
|
f"Applied auto-discovered config from {discovered_adapter.found_in}"
|
|
474
474
|
)
|
|
475
475
|
|
|
476
|
-
# 3. Apply project-specific config
|
|
476
|
+
# 3. Apply project-specific config (HIGHER PRIORITY - overrides global and .env)
|
|
477
477
|
if project_config:
|
|
478
478
|
# Check if this project has specific adapter config
|
|
479
479
|
project_path_str = str(self.project_path)
|
|
@@ -486,11 +486,11 @@ class ConfigResolver:
|
|
|
486
486
|
proj_global_adapter_config = project_config.adapters[target_adapter].to_dict()
|
|
487
487
|
resolved_config.update(proj_global_adapter_config)
|
|
488
488
|
|
|
489
|
-
# 4. Apply environment variable overrides (os.getenv)
|
|
489
|
+
# 4. Apply environment variable overrides (os.getenv - HIGHER PRIORITY)
|
|
490
490
|
env_overrides = self._get_env_overrides(target_adapter)
|
|
491
491
|
resolved_config.update(env_overrides)
|
|
492
492
|
|
|
493
|
-
# 5. Apply CLI overrides
|
|
493
|
+
# 5. Apply CLI overrides (HIGHEST PRIORITY)
|
|
494
494
|
if cli_overrides:
|
|
495
495
|
resolved_config.update(cli_overrides)
|
|
496
496
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.14
|
|
4
4
|
Summary: Universal ticket management interface for AI agents with MCP support
|
|
5
5
|
Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
6
6
|
Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
mcp_ticketer/__init__.py,sha256=ayPQdFr6msypD06_G96a1H0bdFCT1m1wDtv8MZBpY4I,496
|
|
2
|
-
mcp_ticketer/__version__.py,sha256=
|
|
2
|
+
mcp_ticketer/__version__.py,sha256=BR9V-DmEH6HYXFWNVQkJRJ36WxlCMQn4UvkIRrMi6_c,1115
|
|
3
3
|
mcp_ticketer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
mcp_ticketer/adapters/__init__.py,sha256=K_1egvhHb5F_7yFceUx2YzPGEoc7vX-q8dMVaS4K6gw,356
|
|
5
5
|
mcp_ticketer/adapters/aitrackdown.py,sha256=gqS_N6VGLoG5itUu17ANG5SefaAITYoW-t2xL9SrY-Y,15372
|
|
@@ -12,7 +12,7 @@ mcp_ticketer/cache/memory.py,sha256=gTzv-xF7qGfiYVUjG7lnzo0ZcqgXQajMl4NAYUcaytg,
|
|
|
12
12
|
mcp_ticketer/cli/__init__.py,sha256=YeljyLtv906TqkvRuEPhmKO-Uk0CberQ9I6kx1tx2UA,88
|
|
13
13
|
mcp_ticketer/cli/configure.py,sha256=etFutvc0QpaVDMOsZiiN7wKuaT98Od1Tj9W6lsEWw5A,16351
|
|
14
14
|
mcp_ticketer/cli/discover.py,sha256=putWrGcctUH8K0fOMtr9MZA9VnWoXzbtoe7mXSkDxhg,13156
|
|
15
|
-
mcp_ticketer/cli/main.py,sha256=
|
|
15
|
+
mcp_ticketer/cli/main.py,sha256=mhM7sYSVZ4kHhmsj5bNrK3jOTDjlWZwpSrXPAU2KjtI,38073
|
|
16
16
|
mcp_ticketer/cli/migrate_config.py,sha256=iZIstnlr9vkhiW_MlnSyJOkMi4KHQqrZ6Hz1ECD_VUk,6045
|
|
17
17
|
mcp_ticketer/cli/queue_commands.py,sha256=f3pEHKZ43dBHEIoCBvdfvjfMB9_WJltps9ATwTzorY0,8160
|
|
18
18
|
mcp_ticketer/cli/utils.py,sha256=NxsS91vKA8xZnDXKU2y0Gcyc4I_ctRyJj-wT7Xd1Q_Q,18589
|
|
@@ -23,7 +23,7 @@ mcp_ticketer/core/env_discovery.py,sha256=SPoyq_y5j-3gJG5gYNVjCIIrbdzimOdDbTYySm
|
|
|
23
23
|
mcp_ticketer/core/http_client.py,sha256=RM9CEMNcuRb-FxhAijmM_FeBMgxgh1OII9HIPBdJue0,13855
|
|
24
24
|
mcp_ticketer/core/mappers.py,sha256=8I4jcqDqoQEdWlteDMpVeVF3Wo0fDCkmFPRr8oNv8gA,16933
|
|
25
25
|
mcp_ticketer/core/models.py,sha256=GhuTitY6t_QlqfEUvWT6Q2zvY7qAtx_SQyCMMn8iYkk,6473
|
|
26
|
-
mcp_ticketer/core/project_config.py,sha256=
|
|
26
|
+
mcp_ticketer/core/project_config.py,sha256=VVSeCwuESuemL-iC4fqbPrJxR4i5k5fhUpujnY7MCZA,22389
|
|
27
27
|
mcp_ticketer/core/registry.py,sha256=fwje0fnjp0YKPZ0SrVWk82SMNLs7CD0JlHQmx7SigNo,3537
|
|
28
28
|
mcp_ticketer/mcp/__init__.py,sha256=Bvzof9vBu6VwcXcIZK8RgKv6ycRV9tDlO-9TUmd8zqQ,122
|
|
29
29
|
mcp_ticketer/mcp/server.py,sha256=TDuU8ChZC2QYSRo0uGHkVReblTf--hriOjxo-pSAF_Y,34068
|
|
@@ -33,9 +33,9 @@ mcp_ticketer/queue/manager.py,sha256=79AH9oUxdBXH3lmJ3kIlFf2GQkWHL6XB6u5JqVWPq60
|
|
|
33
33
|
mcp_ticketer/queue/queue.py,sha256=z4aivQCtsH5_OUr2OfXSfnFKzugTahNnwHw0LS3ZhZc,11549
|
|
34
34
|
mcp_ticketer/queue/run_worker.py,sha256=HFoykfDpOoz8OUxWbQ2Fka_UlGrYwjPVZ-DEimGFH9o,802
|
|
35
35
|
mcp_ticketer/queue/worker.py,sha256=cVjHR_kfnGKAkiUg0HuXCnbKeKNBBEuj0XZHgIuIn4k,14017
|
|
36
|
-
mcp_ticketer-0.1.
|
|
37
|
-
mcp_ticketer-0.1.
|
|
38
|
-
mcp_ticketer-0.1.
|
|
39
|
-
mcp_ticketer-0.1.
|
|
40
|
-
mcp_ticketer-0.1.
|
|
41
|
-
mcp_ticketer-0.1.
|
|
36
|
+
mcp_ticketer-0.1.14.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
|
|
37
|
+
mcp_ticketer-0.1.14.dist-info/METADATA,sha256=AD51kbqeeWDh5nalVzmsmypReM-1f2cajlksTYJVouc,11211
|
|
38
|
+
mcp_ticketer-0.1.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
39
|
+
mcp_ticketer-0.1.14.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
|
|
40
|
+
mcp_ticketer-0.1.14.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
|
|
41
|
+
mcp_ticketer-0.1.14.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|