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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.14.9
3
+ Version: 1.14.10
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: MIT
@@ -1,2 +1,2 @@
1
1
  """forgexa-cli — Forgexa command-line client."""
2
- __version__ = "1.14.9"
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.9"
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
- logger.warning(
2397
- "fetch branch %s failed for worktree %s: %s "
2398
- "(likely auth/SSH issue — will retry in sync loop)",
2399
- branch_name, ws_path, _pre_fe2,
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
- _last_sync_err = str(_pre_fe2)[:300]
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, which can fail with EROFS inside the daemon.
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 and mirror only the
4515
- small set of user config files it needs for headless execution.
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 (config_root, data_root, cache_root, state_root, claude_config_dir):
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),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forgexa-cli
3
- Version: 1.14.9
3
+ Version: 1.14.10
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: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "forgexa-cli"
3
- version = "1.14.9"
3
+ version = "1.14.10"
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 = { text = "MIT" }
File without changes
File without changes