aisc-cli 0.1.8__tar.gz → 0.1.9__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 (105) hide show
  1. {aisc_cli-0.1.8/src/aisc_cli.egg-info → aisc_cli-0.1.9}/PKG-INFO +1 -1
  2. aisc_cli-0.1.9/src/aisc/VERSION +1 -0
  3. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/cc_switch_resolver.py +34 -13
  4. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/docker_lifecycle.py +1536 -1240
  5. aisc_cli-0.1.9/src/aisc/application/extensions.py +239 -0
  6. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/artifact.py +4 -1
  7. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/build.py +9 -5
  8. aisc_cli-0.1.9/src/aisc/cli/commands/extensions.py +176 -0
  9. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/main.py +177 -1
  10. {aisc_cli-0.1.8 → aisc_cli-0.1.9/src/aisc_cli.egg-info}/PKG-INFO +1 -1
  11. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/SOURCES.txt +2 -0
  12. aisc_cli-0.1.8/src/aisc/VERSION +0 -1
  13. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/LICENSE +0 -0
  14. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/MANIFEST.in +0 -0
  15. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/README.md +0 -0
  16. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/pyproject.toml +0 -0
  17. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/setup.cfg +0 -0
  18. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/__init__.py +0 -0
  19. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/__main__.py +0 -0
  20. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/__init__.py +0 -0
  21. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/config_reader.py +0 -0
  22. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/container_registry.py +0 -0
  23. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/data_root_store.py +0 -0
  24. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/docker_.py +0 -0
  25. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/docker_gateway.py +0 -0
  26. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/docker_sdk_backed.py +0 -0
  27. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/maintenance_lock.py +0 -0
  28. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/state_file.py +0 -0
  29. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/system.py +0 -0
  30. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/windows_config_reader.py +0 -0
  31. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/workspace_lease_store.py +0 -0
  32. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/__init__.py +0 -0
  33. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/artifact.py +0 -0
  34. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/bundle_fetch.py +0 -0
  35. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/cc_switch_provider.py +0 -0
  36. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/config_service.py +0 -0
  37. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/conversation.py +0 -0
  38. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/data_migration.py +0 -0
  39. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/data_root.py +0 -0
  40. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/doctor.py +0 -0
  41. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/legacy_scan.py +0 -0
  42. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/network_subscription.py +0 -0
  43. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/profile_service.py +0 -0
  44. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/provider.py +0 -0
  45. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/repair.py +0 -0
  46. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/resources.py +0 -0
  47. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/runtime.py +0 -0
  48. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/session.py +0 -0
  49. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/tool_versions.py +0 -0
  50. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/toolchain.py +0 -0
  51. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/update.py +0 -0
  52. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/usage.py +0 -0
  53. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/version.py +0 -0
  54. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/web_gateway.py +0 -0
  55. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/work_collection.py +0 -0
  56. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/worklog.py +0 -0
  57. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/workspace_reconcile.py +0 -0
  58. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/applog.py +0 -0
  59. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/__init__.py +0 -0
  60. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/build_progress_parser.py +0 -0
  61. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/__init__.py +0 -0
  62. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/agents.py +0 -0
  63. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/bundle.py +0 -0
  64. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/cc_switch.py +0 -0
  65. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/config.py +0 -0
  66. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/container.py +0 -0
  67. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/conversation.py +0 -0
  68. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/data_root.py +0 -0
  69. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/logs.py +0 -0
  70. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/network.py +0 -0
  71. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/profile.py +0 -0
  72. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/provider.py +0 -0
  73. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/run.py +0 -0
  74. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/runs.py +0 -0
  75. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/runtime.py +0 -0
  76. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/serve.py +0 -0
  77. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/serve_fs.py +0 -0
  78. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/session.py +0 -0
  79. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/update.py +0 -0
  80. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/usage.py +0 -0
  81. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/wizard.py +0 -0
  82. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/work_record.py +0 -0
  83. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/worklog.py +0 -0
  84. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/workspaces.py +0 -0
  85. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/help_i18n.py +0 -0
  86. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/output.py +0 -0
  87. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/tutorial.py +0 -0
  88. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/__init__.py +0 -0
  89. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/artifacts.py +0 -0
  90. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/cc_switch_release.py +0 -0
  91. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/config.py +0 -0
  92. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/data_migration.py +0 -0
  93. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/data_root.py +0 -0
  94. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/docker_ownership.py +0 -0
  95. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/gateway.py +0 -0
  96. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/models.py +0 -0
  97. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/toolchain.py +0 -0
  98. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/web_services.py +0 -0
  99. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/workspace_lease.py +0 -0
  100. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/schemas/__init__.py +0 -0
  101. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/schemas/config_schema.py +0 -0
  102. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/dependency_links.txt +0 -0
  103. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/entry_points.txt +0 -0
  104. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/requires.txt +0 -0
  105. {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aisc-cli
3
- Version: 0.1.8
3
+ Version: 0.1.9
4
4
  Summary: AISC CLI — Super Claude workstation management
5
5
  Author: AISC contributors
6
6
  License-Expression: MIT
@@ -0,0 +1 @@
1
+ 0.1.9
@@ -48,6 +48,10 @@ from aisc.domain.cc_switch_release import (
48
48
 
49
49
 
50
50
  DEFAULT_API_BASE = "https://api.github.com"
51
+ #: ghfast.top rejects API paths with 403; gh-proxy.com has been verified to
52
+ #: proxy GitHub's JSON API. Only supplement the default base — an explicit
53
+ #: corporate/test base must remain the sole source of truth.
54
+ DEFAULT_API_MIRROR_PREFIX = "https://gh-proxy.com/"
51
55
  DEFAULT_TIMEOUT_S = 15.0
52
56
  DEFAULT_TTL_S = 600.0
53
57
  DEFAULT_PER_PAGE = 50
@@ -134,6 +138,9 @@ class CcSwitchResolver:
134
138
  self._transport = transport
135
139
  self._cache_dir = Path(cache_dir) if cache_dir is not None else None
136
140
  self._api_base = (api_base or os.environ.get("AISC_GH_API_BASE") or DEFAULT_API_BASE).rstrip("/")
141
+ self._api_bases = [self._api_base]
142
+ if self._api_base == DEFAULT_API_BASE:
143
+ self._api_bases.append(f"{DEFAULT_API_MIRROR_PREFIX}{DEFAULT_API_BASE}")
137
144
  self._token = token or os.environ.get("AISC_GH_API_TOKEN") or ""
138
145
  self._timeout = timeout
139
146
  self._ttl_s = ttl_s
@@ -201,9 +208,9 @@ class CcSwitchResolver:
201
208
 
202
209
  # --- GitHub API ----------------------------------------------------------
203
210
 
204
- def _fetch_page(self, page: int) -> Tuple[List[Dict[str, Any]], bool]:
211
+ def _fetch_page(self, page: int, api_base: str) -> Tuple[List[Dict[str, Any]], bool]:
205
212
  url = (
206
- f"{self._api_base}/repos/{UPSTREAM_REPO}/releases"
213
+ f"{api_base}/repos/{UPSTREAM_REPO}/releases"
207
214
  f"?per_page={DEFAULT_PER_PAGE}&page={page}"
208
215
  )
209
216
  headers: Dict[str, str] = {"Accept": "application/vnd.github+json"}
@@ -235,17 +242,31 @@ class CcSwitchResolver:
235
242
  return body, len(body) < DEFAULT_PER_PAGE
236
243
 
237
244
  def _fetch_releases(self) -> List[Dict[str, Any]]:
238
- all_releases: List[Dict[str, Any]] = []
239
- for page in range(1, DEFAULT_MAX_PAGES + 1):
240
- page_releases, last = self._fetch_page(page)
241
- all_releases.extend(page_releases)
242
- if last or not page_releases:
243
- break
244
- else:
245
- # Exhausted pagination without finding a terminal page; keep what
246
- # we have — selection fails closed if the target isn't in range.
247
- pass
248
- return all_releases
245
+ last_error: Optional[ResolveError] = None
246
+ for api_base in self._api_bases:
247
+ try:
248
+ all_releases: List[Dict[str, Any]] = []
249
+ for page in range(1, DEFAULT_MAX_PAGES + 1):
250
+ page_releases, last = self._fetch_page(page, api_base)
251
+ all_releases.extend(page_releases)
252
+ if last or not page_releases:
253
+ break
254
+ else:
255
+ # Exhausted pagination without finding a terminal page;
256
+ # keep what we have — selection fails closed if the target
257
+ # isn't in range.
258
+ pass
259
+ return all_releases
260
+ except ResolveError as exc:
261
+ if exc.code not in (
262
+ CC_SWITCH_ERROR_NETWORK,
263
+ CC_SWITCH_ERROR_RATE_LIMITED,
264
+ ):
265
+ raise
266
+ last_error = exc
267
+ raise last_error or ResolveError(
268
+ CC_SWITCH_ERROR_NETWORK, "github api unavailable"
269
+ )
249
270
 
250
271
  # --- cache ---------------------------------------------------------------
251
272