quickcall-integrations 0.3.4__tar.gz → 0.3.6__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.
- quickcall_integrations-0.3.6/.quickcall-issue-template.yaml +38 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/PKG-INFO +1 -1
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/resources/github_resources.py +26 -57
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/github_tools.py +117 -18
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/.claude-plugin/plugin.json +1 -1
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/pyproject.toml +1 -1
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/uv.lock +1 -1
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/.claude-plugin/marketplace.json +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/.github/workflows/publish-pypi.yml +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/.gitignore +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/.pre-commit-config.yaml +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/Dockerfile +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/README.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/assets/logo.png +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/__init__.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/api_clients/__init__.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/api_clients/github_client.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/api_clients/slack_client.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/auth/__init__.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/auth/credentials.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/auth/device_flow.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/resources/__init__.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/resources/slack_resources.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/server.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/__init__.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/auth_tools.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/git_tools.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/slack_tools.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/utility_tools.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/appraisal.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/connect-github-pat.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/connect.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/slack-summary.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/status.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/updates.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/requirements.txt +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/README.md +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/appraisal/__init__.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/appraisal/setup_test_data.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/test_appraisal_integration.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/test_appraisal_tools.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/test_integrations.py +0 -0
- {quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/test_tools.py +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
defaults:
|
|
2
|
+
labels: ["triage"]
|
|
3
|
+
body: |
|
|
4
|
+
## Description
|
|
5
|
+
|
|
6
|
+
## Details
|
|
7
|
+
|
|
8
|
+
templates:
|
|
9
|
+
bug:
|
|
10
|
+
labels: ["bug", "triage"]
|
|
11
|
+
body: |
|
|
12
|
+
## Bug Description
|
|
13
|
+
|
|
14
|
+
## Steps to Reproduce
|
|
15
|
+
1.
|
|
16
|
+
2.
|
|
17
|
+
|
|
18
|
+
## Expected Behavior
|
|
19
|
+
|
|
20
|
+
## Actual Behavior
|
|
21
|
+
|
|
22
|
+
feature:
|
|
23
|
+
labels: ["enhancement"]
|
|
24
|
+
body: |
|
|
25
|
+
## Feature Request
|
|
26
|
+
|
|
27
|
+
## Problem Statement
|
|
28
|
+
|
|
29
|
+
## Proposed Solution
|
|
30
|
+
|
|
31
|
+
## Alternatives Considered
|
|
32
|
+
|
|
33
|
+
docs:
|
|
34
|
+
labels: ["documentation"]
|
|
35
|
+
body: |
|
|
36
|
+
## Documentation Update
|
|
37
|
+
|
|
38
|
+
## What needs to be documented?
|
|
@@ -5,50 +5,14 @@ Resources are automatically available in Claude's context when connected.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import logging
|
|
8
|
-
from typing import Any, Dict, Optional
|
|
9
8
|
|
|
10
|
-
import yaml
|
|
11
9
|
from fastmcp import FastMCP
|
|
12
10
|
|
|
13
11
|
from mcp_server.auth import get_credential_store, get_github_pat
|
|
14
|
-
from mcp_server.auth.credentials import _find_project_root, _parse_env_file
|
|
15
12
|
|
|
16
13
|
logger = logging.getLogger(__name__)
|
|
17
14
|
|
|
18
15
|
|
|
19
|
-
def _load_issue_templates_config() -> Optional[Dict[str, Any]]:
|
|
20
|
-
"""
|
|
21
|
-
Load issue templates from ISSUE_TEMPLATE_PATH in .quickcall.env.
|
|
22
|
-
Returns None if not configured or file doesn't exist.
|
|
23
|
-
"""
|
|
24
|
-
import os
|
|
25
|
-
from pathlib import Path
|
|
26
|
-
|
|
27
|
-
template_path = os.getenv("ISSUE_TEMPLATE_PATH")
|
|
28
|
-
|
|
29
|
-
# Check .quickcall.env in project root
|
|
30
|
-
if not template_path:
|
|
31
|
-
project_root = _find_project_root()
|
|
32
|
-
if project_root:
|
|
33
|
-
config_path = project_root / ".quickcall.env"
|
|
34
|
-
if config_path.exists():
|
|
35
|
-
env_vars = _parse_env_file(config_path)
|
|
36
|
-
if "ISSUE_TEMPLATE_PATH" in env_vars:
|
|
37
|
-
template_path = env_vars["ISSUE_TEMPLATE_PATH"]
|
|
38
|
-
if not Path(template_path).is_absolute():
|
|
39
|
-
template_path = str(project_root / template_path)
|
|
40
|
-
|
|
41
|
-
if not template_path:
|
|
42
|
-
return None
|
|
43
|
-
|
|
44
|
-
try:
|
|
45
|
-
with open(template_path) as f:
|
|
46
|
-
return yaml.safe_load(f) or {}
|
|
47
|
-
except Exception as e:
|
|
48
|
-
logger.warning(f"Failed to load issue templates: {e}")
|
|
49
|
-
return None
|
|
50
|
-
|
|
51
|
-
|
|
52
16
|
def create_github_resources(mcp: FastMCP) -> None:
|
|
53
17
|
"""Add GitHub resources to the MCP server."""
|
|
54
18
|
|
|
@@ -107,41 +71,46 @@ def create_github_resources(mcp: FastMCP) -> None:
|
|
|
107
71
|
"""
|
|
108
72
|
Available issue templates from project configuration.
|
|
109
73
|
|
|
74
|
+
Supports both:
|
|
75
|
+
- GitHub native templates (.github/ISSUE_TEMPLATE/*.yml)
|
|
76
|
+
- Custom templates (ISSUE_TEMPLATE_PATH in .quickcall.env)
|
|
77
|
+
|
|
110
78
|
Use template names when creating issues with manage_issues.
|
|
111
79
|
"""
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if not config:
|
|
115
|
-
return "No issue templates configured.\n\nTo configure:\n1. Create a YAML file with your templates\n2. Add ISSUE_TEMPLATE_PATH=/path/to/templates.yaml to .quickcall.env"
|
|
80
|
+
# Import here to avoid circular imports
|
|
81
|
+
from mcp_server.tools.github_tools import _get_all_templates
|
|
116
82
|
|
|
117
|
-
templates =
|
|
118
|
-
defaults = config.get("defaults", {})
|
|
83
|
+
templates = _get_all_templates()
|
|
119
84
|
|
|
120
85
|
if not templates:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if defaults.get("body"):
|
|
128
|
-
lines.append(f" Body template: {defaults['body'][:100]}...")
|
|
129
|
-
return "\n".join(lines)
|
|
86
|
+
return (
|
|
87
|
+
"No issue templates found.\n\n"
|
|
88
|
+
"Supported sources:\n"
|
|
89
|
+
"1. GitHub native: .github/ISSUE_TEMPLATE/*.yml\n"
|
|
90
|
+
"2. Custom: Add ISSUE_TEMPLATE_PATH to .quickcall.env"
|
|
91
|
+
)
|
|
130
92
|
|
|
131
93
|
lines = ["Available Issue Templates:", ""]
|
|
132
94
|
|
|
133
|
-
for
|
|
95
|
+
for key, template in templates.items():
|
|
96
|
+
name = template.get("name", key)
|
|
97
|
+
description = template.get("description", "")
|
|
134
98
|
labels = template.get("labels", [])
|
|
135
|
-
|
|
136
|
-
|
|
99
|
+
title_prefix = template.get("title_prefix", "")
|
|
100
|
+
|
|
101
|
+
lines.append(f"- {key}")
|
|
102
|
+
if name != key:
|
|
103
|
+
lines.append(f" Name: {name}")
|
|
104
|
+
if description:
|
|
105
|
+
lines.append(f" Description: {description}")
|
|
137
106
|
if labels:
|
|
138
107
|
lines.append(f" Labels: {', '.join(labels)}")
|
|
139
|
-
if
|
|
140
|
-
lines.append(f"
|
|
108
|
+
if title_prefix:
|
|
109
|
+
lines.append(f" Title prefix: {title_prefix}")
|
|
141
110
|
|
|
142
111
|
lines.append("")
|
|
143
112
|
lines.append(
|
|
144
|
-
"Usage: manage_issues(action='create', title='...', template='<
|
|
113
|
+
"Usage: manage_issues(action='create', title='...', template='<key>')"
|
|
145
114
|
)
|
|
146
115
|
|
|
147
116
|
return "\n".join(lines)
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/github_tools.py
RENAMED
|
@@ -44,14 +44,85 @@ DEFAULT_ISSUE_TEMPLATE: Dict[str, Any] = {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
def
|
|
47
|
+
def _load_github_native_templates() -> Dict[str, Dict[str, Any]]:
|
|
48
48
|
"""
|
|
49
|
-
Load issue
|
|
50
|
-
Returns
|
|
49
|
+
Load GitHub native issue templates from .github/ISSUE_TEMPLATE/*.yml.
|
|
50
|
+
Returns dict of template_name -> template_config.
|
|
51
51
|
"""
|
|
52
|
-
|
|
52
|
+
project_root = _find_project_root()
|
|
53
|
+
if not project_root:
|
|
54
|
+
return {}
|
|
55
|
+
|
|
56
|
+
template_dir = project_root / ".github" / "ISSUE_TEMPLATE"
|
|
57
|
+
if not template_dir.exists():
|
|
58
|
+
return {}
|
|
59
|
+
|
|
60
|
+
templates = {}
|
|
61
|
+
for template_file in template_dir.glob("*.yml"):
|
|
62
|
+
try:
|
|
63
|
+
with open(template_file) as f:
|
|
64
|
+
config = yaml.safe_load(f) or {}
|
|
65
|
+
|
|
66
|
+
# Extract template name (use filename without extension as fallback)
|
|
67
|
+
name = config.get("name", template_file.stem)
|
|
68
|
+
# Use filename stem as key for easier matching
|
|
69
|
+
key = template_file.stem
|
|
70
|
+
|
|
71
|
+
# Convert GitHub template format to our format
|
|
72
|
+
templates[key] = {
|
|
73
|
+
"name": name,
|
|
74
|
+
"description": config.get("description", ""),
|
|
75
|
+
"title_prefix": config.get("title", ""),
|
|
76
|
+
"labels": config.get("labels", []),
|
|
77
|
+
"assignees": config.get("assignees", []),
|
|
78
|
+
"body": _github_template_body_to_markdown(config.get("body", [])),
|
|
79
|
+
}
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.warning(f"Failed to load GitHub template {template_file}: {e}")
|
|
82
|
+
|
|
83
|
+
return templates
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _github_template_body_to_markdown(body: List[Dict[str, Any]]) -> str:
|
|
87
|
+
"""Convert GitHub issue template body fields to markdown."""
|
|
88
|
+
if not body:
|
|
89
|
+
return ""
|
|
90
|
+
|
|
91
|
+
lines = []
|
|
92
|
+
for field in body:
|
|
93
|
+
field_type = field.get("type", "")
|
|
94
|
+
attrs = field.get("attributes", {})
|
|
95
|
+
label = attrs.get("label", "")
|
|
96
|
+
|
|
97
|
+
if field_type in ("textarea", "input"):
|
|
98
|
+
if label:
|
|
99
|
+
lines.append(f"## {label}")
|
|
100
|
+
lines.append("")
|
|
101
|
+
placeholder = attrs.get("placeholder", "")
|
|
102
|
+
if placeholder:
|
|
103
|
+
lines.append(placeholder)
|
|
104
|
+
lines.append("")
|
|
105
|
+
elif field_type == "markdown":
|
|
106
|
+
value = attrs.get("value", "")
|
|
107
|
+
if value:
|
|
108
|
+
lines.append(value)
|
|
109
|
+
lines.append("")
|
|
110
|
+
|
|
111
|
+
return "\n".join(lines)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _get_all_templates() -> Dict[str, Dict[str, Any]]:
|
|
115
|
+
"""
|
|
116
|
+
Get all available issue templates from both sources.
|
|
117
|
+
Priority: Custom templates (.quickcall.env) > GitHub native templates
|
|
118
|
+
"""
|
|
119
|
+
templates = {}
|
|
53
120
|
|
|
54
|
-
#
|
|
121
|
+
# 1. Load GitHub native templates first (lower priority)
|
|
122
|
+
templates.update(_load_github_native_templates())
|
|
123
|
+
|
|
124
|
+
# 2. Load custom templates (higher priority, can override)
|
|
125
|
+
template_path = os.getenv("ISSUE_TEMPLATE_PATH")
|
|
55
126
|
if not template_path:
|
|
56
127
|
project_root = _find_project_root()
|
|
57
128
|
if project_root:
|
|
@@ -63,24 +134,52 @@ def _load_issue_template(template_type: Optional[str] = None) -> Dict[str, Any]:
|
|
|
63
134
|
if not Path(template_path).is_absolute():
|
|
64
135
|
template_path = str(project_root / template_path)
|
|
65
136
|
|
|
66
|
-
if
|
|
67
|
-
|
|
137
|
+
if template_path:
|
|
138
|
+
try:
|
|
139
|
+
with open(template_path) as f:
|
|
140
|
+
config = yaml.safe_load(f) or {}
|
|
141
|
+
custom_templates = config.get("templates", {})
|
|
142
|
+
for key, tpl in custom_templates.items():
|
|
143
|
+
templates[key] = {
|
|
144
|
+
"name": key,
|
|
145
|
+
"description": "",
|
|
146
|
+
"title_prefix": "",
|
|
147
|
+
"labels": tpl.get("labels", []),
|
|
148
|
+
"assignees": tpl.get("assignees", []),
|
|
149
|
+
"body": tpl.get("body", ""),
|
|
150
|
+
}
|
|
151
|
+
except Exception as e:
|
|
152
|
+
logger.warning(f"Failed to load custom templates: {e}")
|
|
68
153
|
|
|
69
|
-
|
|
70
|
-
with open(template_path) as f:
|
|
71
|
-
config = yaml.safe_load(f) or {}
|
|
154
|
+
return templates
|
|
72
155
|
|
|
73
|
-
# If template_type specified, look for it in templates section
|
|
74
|
-
if template_type and "templates" in config:
|
|
75
|
-
return config["templates"].get(
|
|
76
|
-
template_type, config.get("defaults", DEFAULT_ISSUE_TEMPLATE)
|
|
77
|
-
)
|
|
78
156
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
157
|
+
def _load_issue_template(template_type: Optional[str] = None) -> Dict[str, Any]:
|
|
158
|
+
"""
|
|
159
|
+
Load issue template from available sources.
|
|
160
|
+
|
|
161
|
+
Sources (in priority order):
|
|
162
|
+
1. Custom templates from ISSUE_TEMPLATE_PATH in .quickcall.env
|
|
163
|
+
2. GitHub native templates from .github/ISSUE_TEMPLATE/*.yml
|
|
164
|
+
|
|
165
|
+
Returns defaults if no template found.
|
|
166
|
+
"""
|
|
167
|
+
if not template_type:
|
|
82
168
|
return DEFAULT_ISSUE_TEMPLATE
|
|
83
169
|
|
|
170
|
+
all_templates = _get_all_templates()
|
|
171
|
+
|
|
172
|
+
if template_type in all_templates:
|
|
173
|
+
tpl = all_templates[template_type]
|
|
174
|
+
return {
|
|
175
|
+
"labels": tpl.get("labels", []),
|
|
176
|
+
"assignees": tpl.get("assignees", []),
|
|
177
|
+
"body": tpl.get("body", ""),
|
|
178
|
+
"title_prefix": tpl.get("title_prefix", ""),
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return DEFAULT_ISSUE_TEMPLATE
|
|
182
|
+
|
|
84
183
|
|
|
85
184
|
# Track whether we're using PAT mode for status reporting
|
|
86
185
|
_using_pat_mode: bool = False
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quickcall",
|
|
3
3
|
"description": "Integrate quickcall into dev workflows - eliminate interruptions for developers. Ask about your work, get instant answers. No more context switching.",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.5",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sagar Sarkale"
|
|
7
7
|
}
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/.claude-plugin/marketplace.json
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/.github/workflows/publish-pypi.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/api_clients/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/api_clients/slack_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/auth/credentials.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/auth/device_flow.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/resources/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/auth_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/slack_tools.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/mcp_server/tools/utility_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/connect.md
RENAMED
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/status.md
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/plugins/quickcall/commands/updates.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/appraisal/setup_test_data.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.4 → quickcall_integrations-0.3.6}/tests/test_appraisal_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|