forgexa-cli 1.14.9__tar.gz → 1.14.10__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.14.9 → forgexa_cli-1.14.10}/PKG-INFO +1 -1
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli/__init__.py +1 -1
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli/daemon.py +39 -10
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli.egg-info/PKG-INFO +1 -1
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/pyproject.toml +1 -1
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/README.md +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli/_build_config.py +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli/main.py +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli/py.typed +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli.egg-info/SOURCES.txt +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli.egg-info/dependency_links.txt +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli.egg-info/entry_points.txt +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli.egg-info/requires.txt +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/forgexa_cli.egg-info/top_level.txt +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/setup.cfg +0 -0
- {forgexa_cli-1.14.9 → forgexa_cli-1.14.10}/tests/test_auth_and_runtime_commands.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""forgexa-cli — Forgexa command-line client."""
|
|
2
|
-
__version__ = "1.14.
|
|
2
|
+
__version__ = "1.14.10"
|
|
@@ -523,7 +523,7 @@ except (ImportError, ModuleNotFoundError):
|
|
|
523
523
|
# DAEMON_VERSION is the protocol/logic version of the daemon code.
|
|
524
524
|
# Kept in sync with pyproject.toml version via bump-version.sh.
|
|
525
525
|
# CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
|
|
526
|
-
DAEMON_VERSION = "1.14.
|
|
526
|
+
DAEMON_VERSION = "1.14.10"
|
|
527
527
|
|
|
528
528
|
|
|
529
529
|
def _detect_client_type() -> str:
|
|
@@ -2393,12 +2393,28 @@ class WorkspaceManager:
|
|
|
2393
2393
|
cwd=ws_path, timeout=settings.GIT_FETCH_TIMEOUT, project_key=project_key,
|
|
2394
2394
|
)
|
|
2395
2395
|
except RuntimeError as _pre_fe2:
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2396
|
+
_sync_err_str = str(_pre_fe2)
|
|
2397
|
+
_sync_err_lower_pre = _sync_err_str.lower()
|
|
2398
|
+
_is_not_found_pre = (
|
|
2399
|
+
"couldn't find remote ref" in _sync_err_lower_pre
|
|
2400
|
+
or "\u65e0\u6cd5\u627e\u5230\u8fdc\u7a0b\u5f15\u7528" in _sync_err_lower_pre
|
|
2401
|
+
or "remote ref does not exist" in _sync_err_lower_pre
|
|
2400
2402
|
)
|
|
2401
|
-
|
|
2403
|
+
if _is_not_found_pre:
|
|
2404
|
+
# Branch doesn't exist on remote — expected for fresh analysis.
|
|
2405
|
+
# Log at INFO, not WARNING, so operators aren't misled.
|
|
2406
|
+
logger.info(
|
|
2407
|
+
"fetch branch %s not found on remote for worktree %s "
|
|
2408
|
+
"(branch was deleted or never created — normal for fresh analysis)",
|
|
2409
|
+
branch_name, ws_path,
|
|
2410
|
+
)
|
|
2411
|
+
else:
|
|
2412
|
+
logger.warning(
|
|
2413
|
+
"fetch branch %s failed for worktree %s: %s "
|
|
2414
|
+
"(likely auth/SSH issue — will retry in sync loop)",
|
|
2415
|
+
branch_name, ws_path, _pre_fe2,
|
|
2416
|
+
)
|
|
2417
|
+
_last_sync_err = _sync_err_str[:300]
|
|
2402
2418
|
_branch_fetch_ok = False
|
|
2403
2419
|
|
|
2404
2420
|
if fresh_start and not _branch_fetch_ok:
|
|
@@ -4509,23 +4525,35 @@ class ProcessManager:
|
|
|
4509
4525
|
The daemon service runs with ProtectSystem=strict and only allows
|
|
4510
4526
|
writes under ~/.forgexa plus the workspace root. Claude Code writes
|
|
4511
4527
|
config, debug logs, cache, and session state under XDG paths and
|
|
4512
|
-
~/.claude by default,
|
|
4528
|
+
~/.claude by default, and newer builds may still touch $HOME/.claude.json
|
|
4529
|
+
even when XDG paths are set. That can fail with EROFS inside the daemon.
|
|
4513
4530
|
|
|
4514
|
-
Point Claude at writable daemon-owned directories
|
|
4515
|
-
|
|
4531
|
+
Point Claude at writable daemon-owned directories, redirect HOME to
|
|
4532
|
+
the same writable sandbox, and mirror only the small set of user
|
|
4533
|
+
config files it needs for headless execution.
|
|
4516
4534
|
"""
|
|
4517
4535
|
sandbox_root = Path.home() / ".forgexa" / "claude-home"
|
|
4518
4536
|
config_root = sandbox_root / "config"
|
|
4519
4537
|
data_root = sandbox_root / "data"
|
|
4520
4538
|
cache_root = sandbox_root / "cache"
|
|
4521
4539
|
state_root = sandbox_root / "state"
|
|
4540
|
+
home_claude_dir = sandbox_root / ".claude"
|
|
4522
4541
|
claude_config_dir = config_root / "claude"
|
|
4523
4542
|
|
|
4524
|
-
for path in (
|
|
4543
|
+
for path in (
|
|
4544
|
+
config_root,
|
|
4545
|
+
data_root,
|
|
4546
|
+
cache_root,
|
|
4547
|
+
state_root,
|
|
4548
|
+
home_claude_dir,
|
|
4549
|
+
claude_config_dir,
|
|
4550
|
+
):
|
|
4525
4551
|
path.mkdir(parents=True, exist_ok=True)
|
|
4526
4552
|
|
|
4527
4553
|
source_files = [
|
|
4554
|
+
(Path.home() / ".claude.json", sandbox_root / ".claude.json"),
|
|
4528
4555
|
(Path.home() / ".claude.json", claude_config_dir / ".claude.json"),
|
|
4556
|
+
(Path.home() / ".claude" / "settings.json", home_claude_dir / "settings.json"),
|
|
4529
4557
|
(Path.home() / ".claude" / "settings.json", claude_config_dir / "settings.json"),
|
|
4530
4558
|
]
|
|
4531
4559
|
for source, dest in source_files:
|
|
@@ -4539,6 +4567,7 @@ class ProcessManager:
|
|
|
4539
4567
|
)
|
|
4540
4568
|
|
|
4541
4569
|
env = {
|
|
4570
|
+
"HOME": str(sandbox_root),
|
|
4542
4571
|
"XDG_CONFIG_HOME": str(config_root),
|
|
4543
4572
|
"XDG_DATA_HOME": str(data_root),
|
|
4544
4573
|
"XDG_CACHE_HOME": str(cache_root),
|
|
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
|