forgexa-cli 1.37.0__tar.gz → 1.37.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.
Potentially problematic release.
This version of forgexa-cli might be problematic. Click here for more details.
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/PKG-INFO +1 -1
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/__init__.py +1 -1
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/daemon.py +28 -5
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli.egg-info/PKG-INFO +1 -1
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/pyproject.toml +1 -1
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/README.md +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/_build_config.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/_local_bind.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/agent_core.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/autoupgrade.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/main.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli/py.typed +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli.egg-info/SOURCES.txt +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli.egg-info/dependency_links.txt +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli.egg-info/entry_points.txt +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli.egg-info/requires.txt +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/forgexa_cli.egg-info/top_level.txt +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/setup.cfg +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_auth_and_runtime_commands.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_autoupgrade.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_check_command.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_expiry_warnings_and_revoke.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_local_bind_commands.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_runtime_credentials.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_session_credentials.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_silent_install.py +0 -0
- {forgexa_cli-1.37.0 → forgexa_cli-1.37.2}/tests/test_upgrade_observability.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""forgexa-cli — Forgexa command-line client."""
|
|
2
|
-
__version__ = "1.37.
|
|
2
|
+
__version__ = "1.37.2"
|
|
@@ -910,7 +910,7 @@ except (ImportError, ModuleNotFoundError):
|
|
|
910
910
|
# DAEMON_VERSION is the protocol/logic version of the daemon code.
|
|
911
911
|
# Kept in sync with pyproject.toml version via bump-version.sh.
|
|
912
912
|
# CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
|
|
913
|
-
DAEMON_VERSION = "1.37.
|
|
913
|
+
DAEMON_VERSION = "1.37.2"
|
|
914
914
|
|
|
915
915
|
|
|
916
916
|
def _detect_client_type() -> str:
|
|
@@ -8658,6 +8658,17 @@ class RuntimeDaemon:
|
|
|
8658
8658
|
return
|
|
8659
8659
|
|
|
8660
8660
|
try:
|
|
8661
|
+
# Analysis-continuity P0 (design doc §九 P0-5, R1-c): capture the
|
|
8662
|
+
# pre-wipe HEAD so the deleted analysis docs remain recoverable
|
|
8663
|
+
# from git history via this exact commit.
|
|
8664
|
+
try:
|
|
8665
|
+
pre_wipe_sha = (
|
|
8666
|
+
await self.workspace_manager._git(
|
|
8667
|
+
"rev-parse", "HEAD", cwd=workspace_path,
|
|
8668
|
+
)
|
|
8669
|
+
).strip()
|
|
8670
|
+
except Exception:
|
|
8671
|
+
pre_wipe_sha = "unknown"
|
|
8661
8672
|
# Stage all deletions with git rm
|
|
8662
8673
|
await self.workspace_manager._git(
|
|
8663
8674
|
"rm", "-r", "--cached", "--ignore-unmatch",
|
|
@@ -8666,18 +8677,24 @@ class RuntimeDaemon:
|
|
|
8666
8677
|
)
|
|
8667
8678
|
# Remove physical files
|
|
8668
8679
|
shutil.rmtree(str(dir_to_wipe), ignore_errors=True)
|
|
8669
|
-
# Commit the wipe so the branch diff is clean
|
|
8680
|
+
# Commit the wipe so the branch diff is clean. The pre-wipe HEAD in
|
|
8681
|
+
# the message documents where the old docs can be recovered from.
|
|
8670
8682
|
_git_name, _git_email = _resolve_git_author(task.project)
|
|
8683
|
+
_wipe_msg = (
|
|
8684
|
+
f"cleanup: wipe analysis docs in {output_dir_norm} before fresh re-analysis"
|
|
8685
|
+
)
|
|
8686
|
+
if pre_wipe_sha and pre_wipe_sha != "unknown":
|
|
8687
|
+
_wipe_msg += f" [pre-wipe HEAD {pre_wipe_sha}]"
|
|
8671
8688
|
await self.workspace_manager._git(
|
|
8672
8689
|
"-c", f"user.name={_git_name}",
|
|
8673
8690
|
"-c", f"user.email={_git_email}",
|
|
8674
8691
|
"commit", "-m",
|
|
8675
|
-
|
|
8692
|
+
_wipe_msg,
|
|
8676
8693
|
cwd=workspace_path,
|
|
8677
8694
|
)
|
|
8678
8695
|
logger.info(
|
|
8679
|
-
"Wiped %d analysis doc(s) from %s for task %s (fresh analysis)",
|
|
8680
|
-
len(existing_files), output_dir_norm, task.task_id,
|
|
8696
|
+
"Wiped %d analysis doc(s) from %s for task %s (fresh analysis; pre-wipe HEAD %s)",
|
|
8697
|
+
len(existing_files), output_dir_norm, task.task_id, pre_wipe_sha,
|
|
8681
8698
|
)
|
|
8682
8699
|
except Exception as _wipe_err:
|
|
8683
8700
|
# Wipe failure on a fresh analysis is not safe to ignore:
|
|
@@ -11393,6 +11410,12 @@ class RuntimeDaemon:
|
|
|
11393
11410
|
base = workspace_path / doc_dir.lstrip("./")
|
|
11394
11411
|
req_type = input_data.get("requirement_type", "feature")
|
|
11395
11412
|
candidate_paths = [str(base / fname) for fname in _get_analysis_outputs_for_type(req_type)]
|
|
11413
|
+
# Analysis-continuity P2: collect the machine-readable refinement
|
|
11414
|
+
# report so the server can verify feedback coverage and baseline
|
|
11415
|
+
# commitments before promoting the candidate (missing file is
|
|
11416
|
+
# handled server-side as a needs_review condition).
|
|
11417
|
+
if input_data.get("analysis_mode") == "refine":
|
|
11418
|
+
candidate_paths.append(str(base / "refinement-report.json"))
|
|
11396
11419
|
|
|
11397
11420
|
existing_artifact_paths = {a.get("path", "").replace("\\", "/") for a in result.artifacts}
|
|
11398
11421
|
|
|
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
|