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.
Files changed (34) hide show
  1. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/PKG-INFO +1 -1
  2. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/__init__.py +1 -1
  3. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/agent_core.py +21 -2
  4. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/daemon.py +19 -22
  5. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/PKG-INFO +1 -1
  6. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/pyproject.toml +1 -1
  7. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/README.md +0 -0
  8. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/_build_config.py +0 -0
  9. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/_local_bind.py +0 -0
  10. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/autoupgrade.py +0 -0
  11. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/aws_evidence.py +0 -0
  12. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/aws_logs_evidence.py +0 -0
  13. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/main.py +0 -0
  14. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/observability_contract.py +0 -0
  15. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/observability_evidence.py +0 -0
  16. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/py.typed +0 -0
  17. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/runtime_evidence.py +0 -0
  18. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli/zcode_protocol.py +0 -0
  19. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/SOURCES.txt +0 -0
  20. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/dependency_links.txt +0 -0
  21. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/entry_points.txt +0 -0
  22. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/requires.txt +0 -0
  23. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/forgexa_cli.egg-info/top_level.txt +0 -0
  24. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/setup.cfg +0 -0
  25. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_auth_and_runtime_commands.py +0 -0
  26. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_autoupgrade.py +0 -0
  27. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_check_command.py +0 -0
  28. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_expiry_warnings_and_revoke.py +0 -0
  29. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_local_bind_commands.py +0 -0
  30. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_publish_script.py +0 -0
  31. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_runtime_credentials.py +0 -0
  32. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_session_credentials.py +0 -0
  33. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_silent_install.py +0 -0
  34. {forgexa_cli-1.91.0 → forgexa_cli-1.91.2}/tests/test_upgrade_observability.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.91.0
3
+ Version: 1.91.2
4
4
  Summary: Forgexa CLI — command-line client and AI agent runtime for the Forgexa platform
5
5
  Author-email: Jason Sun <dev.winds@gmail.com>
6
6
  License-Expression: MIT
@@ -1,2 +1,2 @@
1
1
  """forgexa-cli — Forgexa command-line client."""
2
- __version__ = "1.91.0"
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's version against its registry minimum, if any.
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 minimum-version gating,
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.0"
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
- # Centralized, agent-agnostic version gate: AgentDiscovery.discover()
6813
- # already computed min_version_ok/version_warning against
6814
- # AGENT_REGISTRY[agent_id]["min_version"] (see _check_agent_min_version).
6815
- # Refuse to dispatch rather than letting a known-incompatible CLI
6816
- # invocation fail later with a confusing/unrelated error.
6817
- if not agent.min_version_ok:
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, agent.version_warning,
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=agent.version_warning,
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
- # Scope-adaptive pipeline (Phase 1): a content_only change
14989
- # scope (analysis-predicted, machine-verified server-side)
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 = True
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.91.0
3
+ Version: 1.91.2
4
4
  Summary: Forgexa CLI — command-line client and AI agent runtime for the Forgexa platform
5
5
  Author-email: Jason Sun <dev.winds@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "forgexa-cli"
3
- version = "1.91.0"
3
+ version = "1.91.2"
4
4
  description = "Forgexa CLI — command-line client and AI agent runtime for the Forgexa platform"
5
5
  requires-python = ">=3.9"
6
6
  license = "MIT"
File without changes
File without changes