devops-bot-sdk 1.4.76__tar.gz → 1.4.79__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.
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/PKG-INFO +1 -1
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/pyproject.toml +1 -1
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/__init__.py +2 -2
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/client.py +1 -1
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/ipc/handlers.py +44 -4
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/README.md +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/SOURCES.txt +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/requires.txt +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/top_level.txt +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/files.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/process.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/collectors/screenshot.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/config.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/crucial.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/exceptions.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/git_ops.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/graphify.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/hooks/__init__.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/hooks/crucial_guard.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/ipc/__init__.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/ipc/electron_bridge.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/local_exec.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/__init__.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/envelope.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/requests.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/responses.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/models/snapshots.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/py.typed +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/run_auto.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/sse.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/test.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/test_pipeline.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/sdk/updater.py +0 -0
- {devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/setup.cfg +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devops-bot-sdk"
|
|
7
|
-
version = "1.4.
|
|
7
|
+
version = "1.4.79"
|
|
8
8
|
description = "DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "LicenseRef-Proprietary"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""AgentOS Desktop SDK — thin HTTPS/SSE client for the Electron app.
|
|
2
2
|
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.79
|
|
4
4
|
|
|
5
5
|
Public surface:
|
|
6
6
|
BackendClient.from_config() — create client from ~/.agentos/config.toml
|
|
@@ -30,7 +30,7 @@ Rules:
|
|
|
30
30
|
- All data egress through submit_webhook only
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
|
-
__version__ = "1.4.
|
|
33
|
+
__version__ = "1.4.79"
|
|
34
34
|
__author__ = "AgentOS"
|
|
35
35
|
|
|
36
36
|
from sdk.client import BackendClient
|
|
@@ -531,7 +531,7 @@ _PRD_FORMAT = (
|
|
|
531
531
|
|
|
532
532
|
|
|
533
533
|
def _build_epic_prompt(jira_key: str, summary: str, description: str | None,
|
|
534
|
-
human_instructions: str | None) -> str:
|
|
534
|
+
human_instructions: str | None, story_count: int | None = None) -> str:
|
|
535
535
|
"""Read-only prompt that turns an Epic into a decomposition JSON."""
|
|
536
536
|
parts: list[str] = [
|
|
537
537
|
"You are decomposing a JIRA EPIC into implementable user stories. This is "
|
|
@@ -650,6 +650,37 @@ _STORIES_DIR_HINT = re.compile(
|
|
|
650
650
|
)
|
|
651
651
|
|
|
652
652
|
|
|
653
|
+
# An explicit "build N user stories" count in the description/instructions.
|
|
654
|
+
_STORY_COUNT_WORDS = {
|
|
655
|
+
"one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6,
|
|
656
|
+
"seven": 7, "eight": 8, "nine": 9, "ten": 10, "eleven": 11, "twelve": 12,
|
|
657
|
+
}
|
|
658
|
+
_STORY_COUNT_RE = re.compile(
|
|
659
|
+
r"\b(\d{1,2})\s+(?:user\s+)?stor(?:y|ies)\b"
|
|
660
|
+
r"|\b(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)"
|
|
661
|
+
r"\s+(?:user\s+)?stor(?:y|ies)\b",
|
|
662
|
+
re.I,
|
|
663
|
+
)
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
def _extract_story_count(text: str | None) -> int | None:
|
|
667
|
+
"""A requested number of user stories from the text (e.g. "build 3 user stories",
|
|
668
|
+
"create five stories"), or None. Bounded to a sane max."""
|
|
669
|
+
if not text:
|
|
670
|
+
return None
|
|
671
|
+
m = _STORY_COUNT_RE.search(text)
|
|
672
|
+
if not m:
|
|
673
|
+
return None
|
|
674
|
+
if m.group(1):
|
|
675
|
+
try:
|
|
676
|
+
n = int(m.group(1))
|
|
677
|
+
except ValueError:
|
|
678
|
+
return None
|
|
679
|
+
else:
|
|
680
|
+
n = _STORY_COUNT_WORDS.get((m.group(2) or "").lower(), 0)
|
|
681
|
+
return min(n, 50) if n and n >= 1 else None
|
|
682
|
+
|
|
683
|
+
|
|
653
684
|
def _extract_stories_dir(text: str | None) -> str | None:
|
|
654
685
|
"""A directory the instructions ask the user stories to be WRITTEN into, or None.
|
|
655
686
|
|
|
@@ -2490,15 +2521,19 @@ _PATH_ROOTS = (
|
|
|
2490
2521
|
# end-of-line. The root is anchored to a known top-level dir to limit false
|
|
2491
2522
|
# positives in prose; for an inline path followed by other words on the SAME
|
|
2492
2523
|
# line, quote it (see _QUOTED_PATH_RE) to avoid grabbing the trailing text.
|
|
2493
|
-
_ABS_PATH_RE = re.compile(rf"(?<![\w
|
|
2524
|
+
_ABS_PATH_RE = re.compile(rf"(?<![\w.:])/(?:{_PATH_ROOTS})(?:/[A-Za-z0-9._\- ]+)+")
|
|
2494
2525
|
_HOME_PATH_RE = re.compile(r"(?<![\w.])~(?:/[A-Za-z0-9._\- ]+)+")
|
|
2495
2526
|
# Windows path. Folder names may contain SPACES (e.g. "BA activities clone"), so a
|
|
2496
2527
|
# segment is any run of valid path chars (everything except \ / : * ? " < > | and
|
|
2497
2528
|
# newline) up to the next separator — it must NOT stop at the first space.
|
|
2498
2529
|
_WIN_PATH_RE = re.compile(r"[A-Za-z]:\\(?:[^\\/:*?\"<>|\r\n]+\\?)+")
|
|
2530
|
+
# Windows path written with FORWARD slashes (e.g. C:/Users/me/new_tasks) — common on
|
|
2531
|
+
# Windows. Unquoted form disallows spaces (quote it if a folder has spaces) so it
|
|
2532
|
+
# stops cleanly at the end of the path instead of swallowing trailing prose.
|
|
2533
|
+
_WIN_FS_PATH_RE = re.compile(r"[A-Za-z]:/(?:[A-Za-z0-9._\-]+/?)+")
|
|
2499
2534
|
# A QUOTED path (single/double/back quotes) — the reliable way to give a path that
|
|
2500
|
-
# contains spaces, on any OS.
|
|
2501
|
-
_QUOTED_PATH_RE = re.compile(r"""["'`]\s*((?:[A-Za-z]
|
|
2535
|
+
# contains spaces, on any OS. Accepts a drive letter with EITHER separator (C:\ or C:/).
|
|
2536
|
+
_QUOTED_PATH_RE = re.compile(r"""["'`]\s*((?:[A-Za-z]:[\\/]|~/|/)[^"'`\r\n]+?)\s*["'`]""")
|
|
2502
2537
|
_FILE_SEG_RE = re.compile(r"\.[A-Za-z0-9]{1,6}$")
|
|
2503
2538
|
|
|
2504
2539
|
|
|
@@ -2550,6 +2585,9 @@ def _extract_path_from_text(text: str | None) -> str | None:
|
|
|
2550
2585
|
p = _clean_path(m.group(0))
|
|
2551
2586
|
return _dir_of(str(Path.home() / p[2:])) or None
|
|
2552
2587
|
m = _WIN_PATH_RE.search(text)
|
|
2588
|
+
if m:
|
|
2589
|
+
return _dir_of(_clean_path(m.group(0))) or None
|
|
2590
|
+
m = _WIN_FS_PATH_RE.search(text)
|
|
2553
2591
|
if m:
|
|
2554
2592
|
return _dir_of(_clean_path(m.group(0))) or None
|
|
2555
2593
|
return None
|
|
@@ -2579,6 +2617,8 @@ def _extract_all_paths(text: str | None) -> list[str]:
|
|
|
2579
2617
|
found.append((m.start(), _dir_of(str(Path.home() / p[2:]))))
|
|
2580
2618
|
for m in _WIN_PATH_RE.finditer(text):
|
|
2581
2619
|
found.append((m.start(), _dir_of(_clean_path(m.group(0)))))
|
|
2620
|
+
for m in _WIN_FS_PATH_RE.finditer(text):
|
|
2621
|
+
found.append((m.start(), _dir_of(_clean_path(m.group(0)))))
|
|
2582
2622
|
found.sort(key=lambda x: x[0])
|
|
2583
2623
|
out: list[str] = []
|
|
2584
2624
|
for _, p in found:
|
|
File without changes
|
|
File without changes
|
{devops_bot_sdk-1.4.76 → devops_bot_sdk-1.4.79}/devops_bot_sdk.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|