forgexa-cli 1.91.0__tar.gz → 1.91.2__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.
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/PKG-INFO +1 -1
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/__init__.py +1 -1
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/agent_core.py +21 -2
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/daemon.py +19 -22
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/PKG-INFO +1 -1
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/pyproject.toml +1 -1
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/README.md +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/_build_config.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/_local_bind.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/autoupgrade.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/aws_evidence.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/aws_logs_evidence.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/main.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/observability_contract.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/observability_evidence.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/py.typed +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/runtime_evidence.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/zcode_protocol.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/SOURCES.txt +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/dependency_links.txt +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/entry_points.txt +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/requires.txt +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/top_level.txt +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/setup.cfg +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_auth_and_runtime_commands.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_autoupgrade.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_check_command.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_expiry_warnings_and_revoke.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_local_bind_commands.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_publish_script.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_runtime_credentials.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_session_credentials.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_silent_install.py +0 -0
- {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_upgrade_observability.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""forgexa-cli — Forgexa command-line client."""
|
|
2
|
-
__version__ = "1.91.
|
|
2
|
+
__version__ = "1.91.2"
|
|
@@ -1424,7 +1424,7 @@ def _parse_semver(v: str) -> tuple[int, int, int] | None:
|
|
|
1424
1424
|
|
|
1425
1425
|
|
|
1426
1426
|
def _check_agent_min_version(agent_id: str, version: str, spec: dict) -> tuple[bool, str]:
|
|
1427
|
-
"""Check a discovered agent
|
|
1427
|
+
"""Check a discovered agent against its supported registry version range.
|
|
1428
1428
|
|
|
1429
1429
|
Returns (min_version_ok, version_warning). version_warning is empty
|
|
1430
1430
|
whenever there's nothing to warn about: no minimum is defined for this
|
|
@@ -1432,7 +1432,7 @@ def _check_agent_min_version(agent_id: str, version: str, spec: dict) -> tuple[b
|
|
|
1432
1432
|
version meets the minimum. ``strict_min_version`` makes an unparseable
|
|
1433
1433
|
version a hard failure for integrations with known incompatible releases.
|
|
1434
1434
|
|
|
1435
|
-
This is the single source of truth for per-agent
|
|
1435
|
+
This is the single source of truth for per-agent version gating,
|
|
1436
1436
|
consumed by both AgentDiscovery.discover() (so `forgexa check` and the
|
|
1437
1437
|
daemon's own heartbeat can report incompatibility instantly, without
|
|
1438
1438
|
running a real task) and ProcessManager.run_agent() (a defense-in-depth
|
|
@@ -1452,6 +1452,17 @@ def _check_agent_min_version(agent_id: str, version: str, spec: dict) -> tuple[b
|
|
|
1452
1452
|
f"version v{min_str}+. Fix: {upgrade_hint}.",
|
|
1453
1453
|
)
|
|
1454
1454
|
return True, ""
|
|
1455
|
+
maximum = spec.get("max_version_exclusive")
|
|
1456
|
+
if maximum and parsed >= tuple(maximum):
|
|
1457
|
+
maximum_str = ".".join(str(x) for x in maximum)
|
|
1458
|
+
reason = spec.get("max_version_reason", "")
|
|
1459
|
+
hint = spec.get("unsupported_version_hint", spec.get("upgrade_hint", ""))
|
|
1460
|
+
warning = f"{agent_id} {version} requires a CLI adapter for v{maximum_str} or newer."
|
|
1461
|
+
if reason:
|
|
1462
|
+
warning += f" {reason}"
|
|
1463
|
+
if hint:
|
|
1464
|
+
warning += f" Fix: {hint}."
|
|
1465
|
+
return False, warning
|
|
1455
1466
|
if parsed >= tuple(min_version):
|
|
1456
1467
|
return True, ""
|
|
1457
1468
|
min_str = ".".join(str(x) for x in min_version)
|
|
@@ -1528,6 +1539,14 @@ class AgentDiscovery:
|
|
|
1528
1539
|
"env_model_override": "FACTORY_OPENCODE_MODEL",
|
|
1529
1540
|
"compatibility_level": "L2",
|
|
1530
1541
|
"min_version": (1, 4, 0),
|
|
1542
|
+
"max_version_exclusive": (2, 0, 0),
|
|
1543
|
+
"max_version_reason": (
|
|
1544
|
+
"This adapter implements OpenCode 1.x; OpenCode 2.x removed --dir "
|
|
1545
|
+
"and changed the non-interactive permission protocol."
|
|
1546
|
+
),
|
|
1547
|
+
"unsupported_version_hint": (
|
|
1548
|
+
"install OpenCode >=1.4.0,<2.0.0 or select another compatible agent"
|
|
1549
|
+
),
|
|
1531
1550
|
"min_version_reason": (
|
|
1532
1551
|
"--dangerously-skip-permissions (required so headless runs "
|
|
1533
1552
|
"don't block on interactive permission prompts) was added "
|
|
@@ -1234,7 +1234,7 @@ except (ImportError, ModuleNotFoundError):
|
|
|
1234
1234
|
# DAEMON_VERSION is the protocol/logic version of the daemon code.
|
|
1235
1235
|
# Kept in sync with pyproject.toml version via bump-version.sh.
|
|
1236
1236
|
# CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
|
|
1237
|
-
DAEMON_VERSION = "1.91.
|
|
1237
|
+
DAEMON_VERSION = "1.91.2"
|
|
1238
1238
|
|
|
1239
1239
|
|
|
1240
1240
|
def _detect_client_type() -> str:
|
|
@@ -2612,7 +2612,7 @@ def _get_analysis_outputs_for_type(req_type: str, change_scope: str = "standard"
|
|
|
2612
2612
|
# Standalone fallback has no profile registry — apply the content_only
|
|
2613
2613
|
# light-variant trim for bugfix inline (mirrors resolve_profile).
|
|
2614
2614
|
if change_scope == "content_only" and req_type == "bugfix":
|
|
2615
|
-
outputs = ["diagnosis.md", "analysis.json"]
|
|
2615
|
+
outputs = ["diagnosis.md", "analysis.json", "test-intent.json"]
|
|
2616
2616
|
return outputs
|
|
2617
2617
|
|
|
2618
2618
|
|
|
@@ -6809,19 +6809,21 @@ class ProcessManager:
|
|
|
6809
6809
|
failure_code=failure_code,
|
|
6810
6810
|
)
|
|
6811
6811
|
|
|
6812
|
-
|
|
6813
|
-
|
|
6814
|
-
|
|
6815
|
-
|
|
6816
|
-
|
|
6817
|
-
|
|
6812
|
+
compatible, warning = _check_agent_min_version(
|
|
6813
|
+
agent.agent_id, agent.version,
|
|
6814
|
+
AgentDiscovery.AGENT_REGISTRY.get(agent.agent_id, {}),
|
|
6815
|
+
)
|
|
6816
|
+
if not agent.min_version_ok or not compatible:
|
|
6817
|
+
warning = warning or agent.version_warning or (
|
|
6818
|
+
f"The {agent.agent_id} CLI version is incompatible with this integration"
|
|
6819
|
+
)
|
|
6818
6820
|
logger.warning(
|
|
6819
6821
|
"Refusing to run task %s on agent '%s': %s",
|
|
6820
|
-
task.task_id, agent.agent_id,
|
|
6822
|
+
task.task_id, agent.agent_id, warning,
|
|
6821
6823
|
)
|
|
6822
6824
|
return TaskResult(
|
|
6823
6825
|
status="failed", exit_code=-1, stdout="", stderr="",
|
|
6824
|
-
error=
|
|
6826
|
+
error=warning,
|
|
6825
6827
|
failure_code="agent_version_incompatible",
|
|
6826
6828
|
)
|
|
6827
6829
|
|
|
@@ -14814,7 +14816,7 @@ class RuntimeDaemon:
|
|
|
14814
14816
|
# (validation runs after the agent finished); missing/corrupt
|
|
14815
14817
|
# analysis.json conservatively falls back to standard, so a
|
|
14816
14818
|
# content_only bugfix analysis is only required to produce
|
|
14817
|
-
# diagnosis.md + analysis.json.
|
|
14819
|
+
# diagnosis.md + analysis.json + test-intent.json.
|
|
14818
14820
|
_analysis_scope = _read_analysis_change_scope(
|
|
14819
14821
|
base / "analysis.json", input_data
|
|
14820
14822
|
)
|
|
@@ -14971,9 +14973,7 @@ class RuntimeDaemon:
|
|
|
14971
14973
|
#
|
|
14972
14974
|
# _skip_test_artifacts = True → skip ALL artifact checks
|
|
14973
14975
|
# (set for types that explicitly list "test_coverage" in
|
|
14974
|
-
# skip_dimensions, e.g. "task", "documentation", "spike"
|
|
14975
|
-
# also set when the task's change scope is content_only —
|
|
14976
|
-
# scope-adaptive lightweight pipeline, Phase 1)
|
|
14976
|
+
# skip_dimensions, e.g. "task", "documentation", "spike")
|
|
14977
14977
|
#
|
|
14978
14978
|
# _requires_structured_artifacts = True → test-cases.json and
|
|
14979
14979
|
# coverage-matrix.json are *required* deliverables.
|
|
@@ -14985,11 +14985,8 @@ class RuntimeDaemon:
|
|
|
14985
14985
|
# tests + test-report.md).
|
|
14986
14986
|
_skip_test_artifacts = req_type == "task"
|
|
14987
14987
|
_requires_structured_artifacts = False
|
|
14988
|
-
#
|
|
14989
|
-
#
|
|
14990
|
-
# exempts the testing node from all heavy test artifact
|
|
14991
|
-
# validation — the lightweight prompt only writes
|
|
14992
|
-
# test-report.md.
|
|
14988
|
+
# Content-only fixes trim implementation work, not the formal
|
|
14989
|
+
# QA contract or the assets needed to execute it.
|
|
14993
14990
|
_change_scope = _task_change_scope(input_data)
|
|
14994
14991
|
try:
|
|
14995
14992
|
from app.services.type_workflow_profiles import resolve_profile
|
|
@@ -15000,10 +14997,11 @@ class RuntimeDaemon:
|
|
|
15000
14997
|
_requires_structured_artifacts = req_type in ("feature", "improvement")
|
|
15001
14998
|
except Exception:
|
|
15002
14999
|
pass
|
|
15003
|
-
if _change_scope == "content_only":
|
|
15000
|
+
if _change_scope == "content_only" and req_type == "bugfix":
|
|
15004
15001
|
# Safety net: applies even when the profile registry is not
|
|
15005
15002
|
# importable (standalone vendored daemon execution).
|
|
15006
|
-
_skip_test_artifacts =
|
|
15003
|
+
_skip_test_artifacts = False
|
|
15004
|
+
_requires_structured_artifacts = True
|
|
15007
15005
|
|
|
15008
15006
|
# Keep e2e evidence validation active for any requirement type.
|
|
15009
15007
|
# An enforced policy requires artifacts only when the analysis
|
|
@@ -15018,7 +15016,6 @@ class RuntimeDaemon:
|
|
|
15018
15016
|
).is_file()
|
|
15019
15017
|
if (
|
|
15020
15018
|
_skip_test_artifacts
|
|
15021
|
-
and _change_scope != "content_only"
|
|
15022
15019
|
and (
|
|
15023
15020
|
(
|
|
15024
15021
|
(qa_policy or {}).get("enforcement") == "enforce"
|
|
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
|