agentic-devtools 0.2.259__py3-none-any.whl → 0.2.261__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.
- agentic_devtools/_version.py +2 -2
- agentic_devtools/cli/audit/__init__.py +2 -1
- agentic_devtools/cli/audit/apply.py +28 -3
- agentic_devtools/cli/audit/commands.py +56 -1
- agentic_devtools/cli/audit/config.py +2 -0
- agentic_devtools/cli/ci/github_provider.py +34 -0
- agentic_devtools/cli/ci/scheduler.py +15 -1
- agentic_devtools/cli/jira/sdk.py +78 -0
- {agentic_devtools-0.2.259.dist-info → agentic_devtools-0.2.261.dist-info}/METADATA +2 -1
- {agentic_devtools-0.2.259.dist-info → agentic_devtools-0.2.261.dist-info}/RECORD +13 -12
- {agentic_devtools-0.2.259.dist-info → agentic_devtools-0.2.261.dist-info}/entry_points.txt +1 -0
- {agentic_devtools-0.2.259.dist-info → agentic_devtools-0.2.261.dist-info}/WHEEL +0 -0
- {agentic_devtools-0.2.259.dist-info → agentic_devtools-0.2.261.dist-info}/licenses/LICENSE +0 -0
agentic_devtools/_version.py
CHANGED
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 2,
|
|
21
|
+
__version__ = version = '0.2.261'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 2, 261)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -4,5 +4,6 @@ Provides CLI commands for the two-phase audit workflow:
|
|
|
4
4
|
1. ``agdt-audit-prepare`` — deterministic batch data collection
|
|
5
5
|
2. ``agdt-audit-dispatch-evaluation`` — tracking issue + branch push + coding-agent assignment
|
|
6
6
|
3. ``agdt-audit-apply`` — apply agent evaluation results
|
|
7
|
-
4. ``agdt-audit-
|
|
7
|
+
4. ``agdt-audit-label-eval-pr`` — label handoff evaluation PRs for loop ignore
|
|
8
|
+
5. ``agdt-audit-on-pr-close`` — threshold check and dispatch trigger
|
|
8
9
|
"""
|
|
@@ -8,6 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import logging
|
|
10
10
|
import os
|
|
11
|
+
import re
|
|
11
12
|
import shutil
|
|
12
13
|
import subprocess
|
|
13
14
|
from pathlib import Path
|
|
@@ -15,6 +16,7 @@ from pathlib import Path
|
|
|
15
16
|
from agentic_devtools.cli.audit.config import batch_branch_name
|
|
16
17
|
from agentic_devtools.cli.audit.labeling import cleanup_failed_batch, finalize_batch_labels
|
|
17
18
|
from agentic_devtools.cli.ci.provider import CIPlatformProvider
|
|
19
|
+
from agentic_devtools.cli.ci.scheduler import AUTO_MERGE_LABEL
|
|
18
20
|
|
|
19
21
|
logger = logging.getLogger(__name__)
|
|
20
22
|
|
|
@@ -46,6 +48,14 @@ _OUTCOME_HEADLINES = {
|
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
|
|
51
|
+
def _extract_pr_number_from_url(pr_url: str) -> int | None:
|
|
52
|
+
"""Extract pull request number from a GitHub PR URL."""
|
|
53
|
+
match = re.search(r"/pull/([0-9]+)", pr_url)
|
|
54
|
+
if not match:
|
|
55
|
+
return None
|
|
56
|
+
return int(match.group(1))
|
|
57
|
+
|
|
58
|
+
|
|
49
59
|
def apply_audit_results(
|
|
50
60
|
provider: CIPlatformProvider,
|
|
51
61
|
batch_id: str,
|
|
@@ -351,6 +361,9 @@ def _create_instruction_pr(
|
|
|
351
361
|
)
|
|
352
362
|
|
|
353
363
|
try:
|
|
364
|
+
# Intentionally synchronous git/PR creation: delegating this to a coding-agent
|
|
365
|
+
# branch would risk recursive apply triggers with the widened copilot/**
|
|
366
|
+
# branch filter plus audit-batches/**/agent-output/** path filter.
|
|
354
367
|
# Create the branch first so that any failure here leaves the original
|
|
355
368
|
# branch clean (no copied files to clean up).
|
|
356
369
|
_run_git("create branch", "checkout", "-B", branch_name)
|
|
@@ -391,9 +404,21 @@ def _create_instruction_pr(
|
|
|
391
404
|
original_cwd = os.getcwd()
|
|
392
405
|
try:
|
|
393
406
|
os.chdir(repo_path)
|
|
394
|
-
|
|
407
|
+
pr_url = provider.create_pull_request(title=pr_title, body=description)
|
|
395
408
|
finally:
|
|
396
409
|
os.chdir(original_cwd)
|
|
410
|
+
if pr_url:
|
|
411
|
+
pr_number = _extract_pr_number_from_url(pr_url)
|
|
412
|
+
if pr_number:
|
|
413
|
+
try:
|
|
414
|
+
provider.add_label(pr_number, AUTO_MERGE_LABEL)
|
|
415
|
+
except Exception as exc:
|
|
416
|
+
logger.warning(
|
|
417
|
+
"Failed to add auto-merge label to instruction PR #%d: %s",
|
|
418
|
+
pr_number,
|
|
419
|
+
exc,
|
|
420
|
+
)
|
|
421
|
+
return pr_url
|
|
397
422
|
|
|
398
423
|
except subprocess.CalledProcessError:
|
|
399
424
|
return ""
|
|
@@ -459,8 +484,8 @@ def build_pr_description(
|
|
|
459
484
|
"",
|
|
460
485
|
"---",
|
|
461
486
|
"",
|
|
462
|
-
"
|
|
463
|
-
"
|
|
487
|
+
"This PR is eligible for automated processing by the AI PR loop when the "
|
|
488
|
+
"`ai-auto-merge-allowed` label is present.",
|
|
464
489
|
]
|
|
465
490
|
)
|
|
466
491
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""CLI entry points for audit commands.
|
|
2
2
|
|
|
3
3
|
Provides ``agdt-audit-prepare``, ``agdt-audit-dispatch-evaluation``,
|
|
4
|
-
``agdt-audit-apply``,
|
|
4
|
+
``agdt-audit-apply``, ``agdt-audit-label-eval-pr``, ``agdt-audit-reap-stale``, and
|
|
5
|
+
``agdt-audit-on-pr-close`` commands.
|
|
5
6
|
"""
|
|
6
7
|
|
|
7
8
|
from __future__ import annotations
|
|
@@ -12,11 +13,26 @@ import logging
|
|
|
12
13
|
import os
|
|
13
14
|
import sys
|
|
14
15
|
|
|
16
|
+
from agentic_devtools.cli.audit.config import LABEL_AI_PR_LOOP_IGNORE
|
|
15
17
|
from agentic_devtools.cli.github.repo_resolution import resolve_github_repo
|
|
16
18
|
|
|
17
19
|
logger = logging.getLogger(__name__)
|
|
18
20
|
|
|
19
21
|
|
|
22
|
+
def _touches_audit_agent_output(changed_files: list[str]) -> bool:
|
|
23
|
+
"""Return True when PR files include audit agent output payloads."""
|
|
24
|
+
from agentic_devtools.cli.ci.scheduler import ( # noqa: PLC0415
|
|
25
|
+
AUDIT_AGENT_OUTPUT_PATH_PREFIX,
|
|
26
|
+
AUDIT_AGENT_OUTPUT_PATH_SUBSTR,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
for file_path in changed_files:
|
|
30
|
+
normalized = str(file_path).replace("\\", "/")
|
|
31
|
+
if normalized.startswith(AUDIT_AGENT_OUTPUT_PATH_PREFIX) and AUDIT_AGENT_OUTPUT_PATH_SUBSTR in normalized:
|
|
32
|
+
return True
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
|
|
20
36
|
def _write_step_summary(markdown: str) -> None:
|
|
21
37
|
"""Append a Markdown block to the GitHub Actions job summary, when available.
|
|
22
38
|
|
|
@@ -213,3 +229,42 @@ def audit_reap_stale_command() -> None:
|
|
|
213
229
|
except Exception as e:
|
|
214
230
|
logger.error("Audit reap failed: %s", e, exc_info=True)
|
|
215
231
|
sys.exit(1)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def audit_label_eval_pr_command() -> None:
|
|
235
|
+
"""CLI entry point for agdt-audit-label-eval-pr.
|
|
236
|
+
|
|
237
|
+
Checks whether the PR touches ``audit-batches/**/agent-output/**`` and, if so,
|
|
238
|
+
applies ``ai-pr-loop-ignore`` to keep the handoff/evaluation PR out of the
|
|
239
|
+
AI PR loop.
|
|
240
|
+
"""
|
|
241
|
+
parser = argparse.ArgumentParser(description="Label audit evaluation PR when applicable")
|
|
242
|
+
parser.add_argument("--pr-number", type=int, required=True, help="Pull request number")
|
|
243
|
+
parser.add_argument("--repo", type=str, default=None, help="Repository (owner/repo)")
|
|
244
|
+
args = parser.parse_args()
|
|
245
|
+
|
|
246
|
+
from agentic_devtools.cli.ci.github_provider import GitHubActionsProvider
|
|
247
|
+
|
|
248
|
+
repo = resolve_github_repo(args.repo or os.environ.get("GITHUB_REPOSITORY"))
|
|
249
|
+
provider = GitHubActionsProvider(repo=repo)
|
|
250
|
+
|
|
251
|
+
try:
|
|
252
|
+
files = provider.list_pr_files(args.pr_number)
|
|
253
|
+
touches_agent_output = _touches_audit_agent_output(files)
|
|
254
|
+
label_applied = False
|
|
255
|
+
if touches_agent_output:
|
|
256
|
+
provider.add_label(args.pr_number, LABEL_AI_PR_LOOP_IGNORE)
|
|
257
|
+
label_applied = True
|
|
258
|
+
print(
|
|
259
|
+
json.dumps(
|
|
260
|
+
{
|
|
261
|
+
"pr_number": args.pr_number,
|
|
262
|
+
"touches_audit_agent_output": touches_agent_output,
|
|
263
|
+
"label_applied": label_applied,
|
|
264
|
+
"label": LABEL_AI_PR_LOOP_IGNORE if label_applied else "",
|
|
265
|
+
}
|
|
266
|
+
)
|
|
267
|
+
)
|
|
268
|
+
except Exception as e:
|
|
269
|
+
logger.error("Audit eval PR labeling failed: %s", e, exc_info=True)
|
|
270
|
+
sys.exit(1)
|
|
@@ -6,6 +6,7 @@ CLI argument > ``.github/agdt-config.json`` > hardcoded default.
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
+
from agentic_devtools.cli.ci.scheduler import SKIP_LABEL
|
|
9
10
|
from agentic_devtools.config import load_repo_config
|
|
10
11
|
|
|
11
12
|
DEFAULT_BATCH_SIZE = 10
|
|
@@ -14,6 +15,7 @@ DEFAULT_THRESHOLD = 10
|
|
|
14
15
|
# Label constants
|
|
15
16
|
LABEL_AUDITED = "review-feedback-audited"
|
|
16
17
|
LABEL_IN_PROGRESS = "review-feedback-audit-in-progress"
|
|
18
|
+
LABEL_AI_PR_LOOP_IGNORE = SKIP_LABEL
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
def batch_branch_name(batch_id: str) -> str:
|
|
@@ -235,6 +235,7 @@ query($owner: String!, $name: String!) {
|
|
|
235
235
|
number
|
|
236
236
|
createdAt
|
|
237
237
|
isCrossRepository
|
|
238
|
+
headRefName
|
|
238
239
|
headRefOid
|
|
239
240
|
labels(first: 100) {
|
|
240
241
|
nodes { name }
|
|
@@ -259,6 +260,7 @@ query($owner: String!, $name: String!, $endCursor: String!) {
|
|
|
259
260
|
number
|
|
260
261
|
createdAt
|
|
261
262
|
isCrossRepository
|
|
263
|
+
headRefName
|
|
262
264
|
headRefOid
|
|
263
265
|
labels(first: 100) {
|
|
264
266
|
nodes { name }
|
|
@@ -3878,6 +3880,7 @@ class GitHubActionsProvider(CIPlatformProvider):
|
|
|
3878
3880
|
Sorted list (oldest-first) of EligiblePR dataclasses.
|
|
3879
3881
|
"""
|
|
3880
3882
|
from agentic_devtools.cli.ci.scheduler import (
|
|
3883
|
+
AUDIT_EVAL_BRANCH_SUBSTR,
|
|
3881
3884
|
AUTO_MERGE_LABEL,
|
|
3882
3885
|
SKIP_LABEL,
|
|
3883
3886
|
filter_eligible_prs,
|
|
@@ -3934,6 +3937,20 @@ class GitHubActionsProvider(CIPlatformProvider):
|
|
|
3934
3937
|
continue
|
|
3935
3938
|
|
|
3936
3939
|
has_auto_merge = AUTO_MERGE_LABEL in labels
|
|
3940
|
+
head_ref_name = str(node.get("headRefName", "") or "")
|
|
3941
|
+
touches_audit_agent_output = False
|
|
3942
|
+
if AUDIT_EVAL_BRANCH_SUBSTR in head_ref_name.lower():
|
|
3943
|
+
try:
|
|
3944
|
+
touches_audit_agent_output = self._touches_audit_agent_output(pr_number)
|
|
3945
|
+
except Exception as exc:
|
|
3946
|
+
# On API failure, fail-safe: do not exclude the PR.
|
|
3947
|
+
logger.warning(
|
|
3948
|
+
"Failed to evaluate audit agent-output paths for PR #%d: %s",
|
|
3949
|
+
pr_number,
|
|
3950
|
+
exc,
|
|
3951
|
+
)
|
|
3952
|
+
touches_audit_agent_output = False
|
|
3953
|
+
|
|
3937
3954
|
is_human_blocked = False
|
|
3938
3955
|
if not has_auto_merge:
|
|
3939
3956
|
# Check if human-blocked: CI passing + approved + missing auto-merge label
|
|
@@ -3954,8 +3971,11 @@ class GitHubActionsProvider(CIPlatformProvider):
|
|
|
3954
3971
|
"number": pr_number,
|
|
3955
3972
|
"createdAt": node.get("createdAt", ""),
|
|
3956
3973
|
"isCrossRepository": node.get("isCrossRepository", False),
|
|
3974
|
+
"headRefName": head_ref_name,
|
|
3975
|
+
"head_ref": head_ref_name,
|
|
3957
3976
|
"labels": label_nodes,
|
|
3958
3977
|
"is_human_blocked": is_human_blocked,
|
|
3978
|
+
"touches_audit_agent_output": touches_audit_agent_output,
|
|
3959
3979
|
}
|
|
3960
3980
|
eligible_prs.extend(filter_eligible_prs([candidate]))
|
|
3961
3981
|
if effective_max is not None and len(eligible_prs) >= effective_max:
|
|
@@ -3970,6 +3990,20 @@ class GitHubActionsProvider(CIPlatformProvider):
|
|
|
3970
3990
|
|
|
3971
3991
|
return eligible_prs
|
|
3972
3992
|
|
|
3993
|
+
def _touches_audit_agent_output(self, pr_number: int) -> bool:
|
|
3994
|
+
"""Return True when a PR includes audit evaluation agent-output files."""
|
|
3995
|
+
from agentic_devtools.cli.ci.scheduler import ( # noqa: PLC0415
|
|
3996
|
+
AUDIT_AGENT_OUTPUT_PATH_PREFIX,
|
|
3997
|
+
AUDIT_AGENT_OUTPUT_PATH_SUBSTR,
|
|
3998
|
+
)
|
|
3999
|
+
|
|
4000
|
+
changed_files = self.list_pr_files(pr_number)
|
|
4001
|
+
for file_path in changed_files:
|
|
4002
|
+
normalized = str(file_path).replace("\\", "/")
|
|
4003
|
+
if normalized.startswith(AUDIT_AGENT_OUTPUT_PATH_PREFIX) and AUDIT_AGENT_OUTPUT_PATH_SUBSTR in normalized:
|
|
4004
|
+
return True
|
|
4005
|
+
return False
|
|
4006
|
+
|
|
3973
4007
|
def _is_human_blocked(self, pr_number: int, head_sha: str) -> bool:
|
|
3974
4008
|
"""Check if a PR is human-blocked (CI passing + approved + no auto-merge label).
|
|
3975
4009
|
|
|
@@ -27,6 +27,9 @@ VARIABLE_POOL_SIZE = "AI_PR_LOOP_ELIGIBLE_PR_LIMIT"
|
|
|
27
27
|
|
|
28
28
|
SKIP_LABEL = "ai-pr-loop-ignore"
|
|
29
29
|
AUTO_MERGE_LABEL = "ai-auto-merge-allowed"
|
|
30
|
+
AUDIT_EVAL_BRANCH_SUBSTR = "copilot"
|
|
31
|
+
AUDIT_AGENT_OUTPUT_PATH_PREFIX = "audit-batches/"
|
|
32
|
+
AUDIT_AGENT_OUTPUT_PATH_SUBSTR = "/agent-output/"
|
|
30
33
|
|
|
31
34
|
|
|
32
35
|
@dataclass(frozen=True)
|
|
@@ -68,11 +71,15 @@ def filter_eligible_prs(prs: list[dict], skip_label: str = SKIP_LABEL) -> list[E
|
|
|
68
71
|
- Excludes fork PRs (isCrossRepository)
|
|
69
72
|
- Excludes PRs with the skip label (default: ai-pr-loop-ignore)
|
|
70
73
|
- Excludes human-blocked PRs (is_human_blocked flag)
|
|
74
|
+
- Excludes audit evaluation handoff PRs as a scheduler backstop when BOTH:
|
|
75
|
+
- head branch contains ``copilot`` and
|
|
76
|
+
- provider enrichment says PR touches ``audit-batches/**/agent-output/**``
|
|
71
77
|
- Preserves creation order (assumes input is sorted oldest-first)
|
|
72
78
|
|
|
73
79
|
Args:
|
|
74
80
|
prs: List of PR dicts with keys: number, createdAt, isCrossRepository,
|
|
75
|
-
labels (list of dicts with 'name'), is_human_blocked (bool)
|
|
81
|
+
labels (list of dicts with 'name'), is_human_blocked (bool),
|
|
82
|
+
head_ref/headRefName (str), touches_audit_agent_output (bool).
|
|
76
83
|
skip_label: Label name that excludes a PR from processing.
|
|
77
84
|
|
|
78
85
|
Returns:
|
|
@@ -118,6 +125,13 @@ def filter_eligible_prs(prs: list[dict], skip_label: str = SKIP_LABEL) -> list[E
|
|
|
118
125
|
if pr.get("is_human_blocked", False):
|
|
119
126
|
continue
|
|
120
127
|
|
|
128
|
+
# Scheduler backstop for audit evaluation handoff PRs.
|
|
129
|
+
raw_head_ref = pr.get("head_ref", pr.get("headRefName", ""))
|
|
130
|
+
head_ref = str(raw_head_ref) if raw_head_ref is not None else ""
|
|
131
|
+
touches_audit_agent_output = bool(pr.get("touches_audit_agent_output", False))
|
|
132
|
+
if AUDIT_EVAL_BRANCH_SUBSTR in head_ref.lower() and touches_audit_agent_output:
|
|
133
|
+
continue
|
|
134
|
+
|
|
121
135
|
eligible.append(EligiblePR(number=number, created_at=created_at))
|
|
122
136
|
|
|
123
137
|
return eligible
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Jira SDK client factory — lazy wrapper around atlassian-python-api."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import MutableMapping
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from agentic_devtools.cli.jira.config import get_jira_auth_header, get_jira_base_url
|
|
9
|
+
from agentic_devtools.cli.jira.helpers import _get_ssl_verify
|
|
10
|
+
|
|
11
|
+
__all__ = ["build_jira_client", "is_cloud"]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def build_jira_client(): # type: ignore[return]
|
|
15
|
+
"""Build a configured atlassian.Jira client from repo helpers.
|
|
16
|
+
|
|
17
|
+
The ``atlassian-python-api`` package is imported lazily so that importing
|
|
18
|
+
this module does not require it to be installed.
|
|
19
|
+
|
|
20
|
+
Raises:
|
|
21
|
+
ImportError: If ``atlassian-python-api`` is not installed.
|
|
22
|
+
ValueError: If the Jira base URL is not configured (propagated from
|
|
23
|
+
``get_jira_base_url()``).
|
|
24
|
+
OSError: If Jira credentials are missing (propagated from
|
|
25
|
+
``get_jira_auth_header()``).
|
|
26
|
+
RuntimeError: If the installed SDK version is incompatible (missing
|
|
27
|
+
``_session`` or non-MutableMapping headers).
|
|
28
|
+
"""
|
|
29
|
+
try:
|
|
30
|
+
from atlassian import Jira
|
|
31
|
+
except ModuleNotFoundError as exc:
|
|
32
|
+
if exc.name != "atlassian":
|
|
33
|
+
raise
|
|
34
|
+
raise ImportError(
|
|
35
|
+
"atlassian-python-api is required for Jira SDK client support. "
|
|
36
|
+
'Install it with: pip install "atlassian-python-api>=4.0,<5"'
|
|
37
|
+
) from exc
|
|
38
|
+
|
|
39
|
+
url = get_jira_base_url()
|
|
40
|
+
ssl = _get_ssl_verify()
|
|
41
|
+
auth_header = get_jira_auth_header() # may raise OSError
|
|
42
|
+
|
|
43
|
+
client = Jira(url=url, verify_ssl=ssl)
|
|
44
|
+
|
|
45
|
+
# Verify SDK compatibility before header injection
|
|
46
|
+
session = getattr(client, "_session", None)
|
|
47
|
+
if session is None:
|
|
48
|
+
version = _get_atlassian_version()
|
|
49
|
+
raise RuntimeError(f"atlassian-python-api {version} is incompatible: expected client._session to exist")
|
|
50
|
+
|
|
51
|
+
headers = getattr(session, "headers", None)
|
|
52
|
+
if not isinstance(headers, MutableMapping):
|
|
53
|
+
version = _get_atlassian_version()
|
|
54
|
+
raise RuntimeError(
|
|
55
|
+
f"atlassian-python-api {version} is incompatible: expected client._session.headers to be a MutableMapping"
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
headers["Authorization"] = auth_header
|
|
59
|
+
return client
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def is_cloud(metadata: dict[str, Any]) -> bool:
|
|
63
|
+
"""Return True if metadata indicates a Jira Cloud deployment.
|
|
64
|
+
|
|
65
|
+
Checks ``metadata.get("deploymentType") == "Cloud"`` (exact,
|
|
66
|
+
case-sensitive match mirroring the Jira REST ``serverInfo`` response).
|
|
67
|
+
"""
|
|
68
|
+
return metadata.get("deploymentType") == "Cloud"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _get_atlassian_version() -> str:
|
|
72
|
+
"""Best-effort version detection for error messages."""
|
|
73
|
+
try:
|
|
74
|
+
from importlib.metadata import version
|
|
75
|
+
|
|
76
|
+
return version("atlassian-python-api")
|
|
77
|
+
except Exception:
|
|
78
|
+
return "unknown"
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-devtools
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.261
|
|
4
4
|
Summary: Agentic devtools integrate Jira, DevOps & more
|
|
5
5
|
Author: ayaiayorg
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
License-File: LICENSE
|
|
8
8
|
Requires-Python: >=3.10
|
|
9
|
+
Requires-Dist: atlassian-python-api<5,>=4.0
|
|
9
10
|
Requires-Dist: azure-identity>=1.0.0
|
|
10
11
|
Requires-Dist: azure-monitor-query>=1.0.0
|
|
11
12
|
Requires-Dist: build>=1.2.2
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
agentic_devtools/__init__.py,sha256=J_Zw_vWKghk-cLmqI83hXQmSiS8zMhGIHM5WPLDkZuo,242
|
|
2
|
-
agentic_devtools/_version.py,sha256=
|
|
2
|
+
agentic_devtools/_version.py,sha256=hYp1V1xhtQQMK_nMtSjCy0aUhriw4xldgbSzDYuCkOc,524
|
|
3
3
|
agentic_devtools/agdt_gitignore.py,sha256=Jcc9BUiCIqCG9tUuHc5Jua5tPT_QtTnEK6Gr0v_RrKQ,1559
|
|
4
4
|
agentic_devtools/background_tasks.py,sha256=QCiCSTcU8HSFa_g_fa2NWXhhRZU4zo6YgsPSIVVmdOU,16971
|
|
5
5
|
agentic_devtools/config.py,sha256=X6zv8Twviv9LMiV7TYy_6SQeNezJHV8lBNvIxLkOqLY,8049
|
|
@@ -35,10 +35,10 @@ agentic_devtools/cli/analysis/__init__.py,sha256=kz7oA5sw0POHxYLB5OJv39ZAZ-tTNCA
|
|
|
35
35
|
agentic_devtools/cli/analysis/context_resolver.py,sha256=IVSB4Xsf1z_tSkwjqeDN8nB80-mfK5biVZz5N-1Mu8E,6290
|
|
36
36
|
agentic_devtools/cli/analysis/external_context.py,sha256=MgG8pucxdOumISMklcWD-EL2ISCWLEPLIkkMePouHO4,8234
|
|
37
37
|
agentic_devtools/cli/analysis/identity_scanner.py,sha256=xDeDYm6jyfI6o6Z9-xFnLRNXh_s0AukVCajA2tqZJKg,5699
|
|
38
|
-
agentic_devtools/cli/audit/__init__.py,sha256=
|
|
39
|
-
agentic_devtools/cli/audit/apply.py,sha256=
|
|
40
|
-
agentic_devtools/cli/audit/commands.py,sha256=
|
|
41
|
-
agentic_devtools/cli/audit/config.py,sha256=
|
|
38
|
+
agentic_devtools/cli/audit/__init__.py,sha256=bSQ4kpS8h25sgLJ-kSwAyEsM9hFWPBCcTjiO20CMlGc,505
|
|
39
|
+
agentic_devtools/cli/audit/apply.py,sha256=fbpj1fEQmiUDhq5-zlS-Mstub7BKLhTx8f2YY0vXDIc,21142
|
|
40
|
+
agentic_devtools/cli/audit/commands.py,sha256=YZn9DcNjiHJrDzxa9qB9s3ctoWMyJH6uM1bCArxTMsk,10806
|
|
41
|
+
agentic_devtools/cli/audit/config.py,sha256=Ublc-Hsh54qTjU0bgBYWkgNqnJsRIL0eb5KrruJeXfk,2865
|
|
42
42
|
agentic_devtools/cli/audit/dispatch.py,sha256=JJSDj4_f-z26mi3wdP-kWcazETzAqtsJQN4HiJr619s,5199
|
|
43
43
|
agentic_devtools/cli/audit/instruction_resolver.py,sha256=dpEp6X15Wf6Llu9iMLMeRzch6I0IaZMC5F0yvJ7TYcE,3332
|
|
44
44
|
agentic_devtools/cli/audit/labeling.py,sha256=6PSshy0E8MJ5-KRrr8NeMMlhGHE1oFWIuZS_fgVL66g,2198
|
|
@@ -119,14 +119,14 @@ agentic_devtools/cli/ci/agent_assignment.py,sha256=UFlSNju1exEjDvrzHfiQ5snGcd2ka
|
|
|
119
119
|
agentic_devtools/cli/ci/commands.py,sha256=Y4dJUuPF9zfXCggyXM_fctatTYqoZ3l0WmvujU-RD6o,6465
|
|
120
120
|
agentic_devtools/cli/ci/delete_review_comments_command.py,sha256=Fqv8zl33oY5z0BmUbyxDAoRxJen8TtgHa1WHDRVaXTU,8237
|
|
121
121
|
agentic_devtools/cli/ci/exceptions.py,sha256=DjkYB2lxM9V5jN916A3NznDEPkdyx6IM6w_k865SmJw,1418
|
|
122
|
-
agentic_devtools/cli/ci/github_provider.py,sha256=
|
|
122
|
+
agentic_devtools/cli/ci/github_provider.py,sha256=m94kZqHHtHZtznHM_q7iVOXhXrPskSpE6V0GTnEpZlo,200300
|
|
123
123
|
agentic_devtools/cli/ci/guards.py,sha256=-kfmTMb4KoMeyHFTUJjfDWoXbNZ3waX-9NdBrq1Bcy4,26927
|
|
124
124
|
agentic_devtools/cli/ci/job_logs.py,sha256=s3Ufinl2WQPVISq8g11ZXU5GJ0WCKDmZlbyGJzvJEVU,9911
|
|
125
125
|
agentic_devtools/cli/ci/logging_config.py,sha256=Tw_h8LB709gbMd0WZMATLAPIJ1r_c_nE18Bi4bvldHA,2340
|
|
126
126
|
agentic_devtools/cli/ci/models.py,sha256=FPlBEHKrPLnvT3-uy6Xr1R7zrGogAqKrWxiFmf6ENrA,13975
|
|
127
127
|
agentic_devtools/cli/ci/provider.py,sha256=hNSldVBRxbW85gS7REkpvtSFCt0GdB2nD0HcOVoNtcU,31470
|
|
128
128
|
agentic_devtools/cli/ci/retry.py,sha256=BqJcI2AqgVj2tzhhF56FoD-gzSfUu0IxZjg2vQ0_zXE,3077
|
|
129
|
-
agentic_devtools/cli/ci/scheduler.py,sha256
|
|
129
|
+
agentic_devtools/cli/ci/scheduler.py,sha256=xMVpsNsEJIo-R7w21YRgCMx_E8_bsjvePwL6FU961JQ,16436
|
|
130
130
|
agentic_devtools/cli/ci/scheduler_command.py,sha256=ShcfGC0XS7JOXq7prFpTYE0M2FWYbEVK-WuhG3lMErA,3179
|
|
131
131
|
agentic_devtools/cli/ci/speckit_trigger.py,sha256=VeKd8d6z126cat3HWeZJE3sbTUMC1ctiJa5hAN98O58,909
|
|
132
132
|
agentic_devtools/cli/ci/evaluator/__init__.py,sha256=rcwdufq14Fj0uNI-bJNLOuIdxuIO8f4y6EztlMp8_Ik,1071
|
|
@@ -249,6 +249,7 @@ agentic_devtools/cli/jira/get_commands.py,sha256=UssjkLUqvygAK5K49IdHB3sfOTguluB
|
|
|
249
249
|
agentic_devtools/cli/jira/helpers.py,sha256=saby63-eyGyg9JYpYBU1TTjT467UXFkoxVX4cuK4css,6614
|
|
250
250
|
agentic_devtools/cli/jira/parse_error_report.py,sha256=kN1Re8JR3cQuiUXRg8p4Gu1-2yDCYH10vs3uSv_jpG4,12837
|
|
251
251
|
agentic_devtools/cli/jira/role_commands.py,sha256=rv7F0-5jE27oPiCPDW0n_PdLyYYHWTaKfl2xXq9qPgo,20478
|
|
252
|
+
agentic_devtools/cli/jira/sdk.py,sha256=xgdl4hCieuEExhGZQRNizQnABcCH6fgJGLzCdUtORMo,2774
|
|
252
253
|
agentic_devtools/cli/jira/state_helpers.py,sha256=O3Uuyi95OkFIu2bHpqcVXWR40tJBF5Z-sY6lPv1T9PA,1050
|
|
253
254
|
agentic_devtools/cli/jira/update_commands.py,sha256=R8JsIccdVmfUAsvxxRyGaa3SbNEhvu_OQDqKrNiHVTY,7589
|
|
254
255
|
agentic_devtools/cli/jira/vpn_wrapper.py,sha256=3zpR6syTSDtjP-W2Cs-xWFyx3oyj1phEAvWvs9geHVA,2142
|
|
@@ -747,8 +748,8 @@ agentic_devtools/_bundled_skills/prompts/speckit.plan.prompt.md,sha256=IJja5r2Sd
|
|
|
747
748
|
agentic_devtools/_bundled_skills/prompts/speckit.specify.prompt.md,sha256=eyzE3GRi2hyW30a6xPYOU7q6MJf0skrD-baEGURYqpg,31
|
|
748
749
|
agentic_devtools/_bundled_skills/prompts/speckit.tasks.prompt.md,sha256=iPxXwon5nV6dNcJV8-JoP3PssKUVXctNiG-C9SsRhB8,29
|
|
749
750
|
agentic_devtools/_bundled_skills/prompts/speckit.taskstoissues.prompt.md,sha256=L5Y21PMSoUcPAAdHy2Jnf-wGVdi04jV_pPvyOJZfpm0,37
|
|
750
|
-
agentic_devtools-0.2.
|
|
751
|
-
agentic_devtools-0.2.
|
|
752
|
-
agentic_devtools-0.2.
|
|
753
|
-
agentic_devtools-0.2.
|
|
754
|
-
agentic_devtools-0.2.
|
|
751
|
+
agentic_devtools-0.2.261.dist-info/METADATA,sha256=ru1D03KPJKZrE9j31dVJTwg9WsQoLBzV5OOCXovN6KM,29751
|
|
752
|
+
agentic_devtools-0.2.261.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
753
|
+
agentic_devtools-0.2.261.dist-info/entry_points.txt,sha256=iTmAesp5CsbGlcEjdT6ZD01eJg8plYRL6WFmz4E1wNc,10840
|
|
754
|
+
agentic_devtools-0.2.261.dist-info/licenses/LICENSE,sha256=yBEDdICksxhBYLWoERKp9MTqwGnUF6Ryj9BTLwXTc6k,1082
|
|
755
|
+
agentic_devtools-0.2.261.dist-info/RECORD,,
|
|
@@ -11,6 +11,7 @@ agdt-approve-pull-request = agentic_devtools.cli.runner:run_as_script
|
|
|
11
11
|
agdt-assign-implementation-agent = agentic_devtools.cli.ci.commands:assign_implementation_agent_command
|
|
12
12
|
agdt-audit-apply = agentic_devtools.cli.audit.commands:audit_apply_command
|
|
13
13
|
agdt-audit-dispatch-evaluation = agentic_devtools.cli.audit.commands:audit_dispatch_evaluation_command
|
|
14
|
+
agdt-audit-label-eval-pr = agentic_devtools.cli.audit.commands:audit_label_eval_pr_command
|
|
14
15
|
agdt-audit-on-pr-close = agentic_devtools.cli.audit.on_pr_close:on_pr_close_command
|
|
15
16
|
agdt-audit-prepare = agentic_devtools.cli.audit.commands:audit_prepare_command
|
|
16
17
|
agdt-audit-reap-stale = agentic_devtools.cli.audit.commands:audit_reap_stale_command
|
|
File without changes
|
|
File without changes
|