@team-agent/installer 0.2.10 → 0.3.0

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 (326) hide show
  1. package/Cargo.lock +744 -0
  2. package/Cargo.toml +34 -0
  3. package/crates/team-agent/Cargo.toml +33 -0
  4. package/crates/team-agent/src/cli/adapters.rs +1343 -0
  5. package/crates/team-agent/src/cli/diagnose.rs +554 -0
  6. package/crates/team-agent/src/cli/emit.rs +1077 -0
  7. package/crates/team-agent/src/cli/helpers.rs +88 -0
  8. package/crates/team-agent/src/cli/leader.rs +216 -0
  9. package/crates/team-agent/src/cli/mod.rs +1141 -0
  10. package/crates/team-agent/src/cli/profile.rs +306 -0
  11. package/crates/team-agent/src/cli/send.rs +215 -0
  12. package/crates/team-agent/src/cli/status.rs +179 -0
  13. package/crates/team-agent/src/cli/status_port.rs +502 -0
  14. package/crates/team-agent/src/cli/tests/base.rs +616 -0
  15. package/crates/team-agent/src/cli/tests/compile.rs +96 -0
  16. package/crates/team-agent/src/cli/tests/divergence.rs +509 -0
  17. package/crates/team-agent/src/cli/tests/lane_c.rs +333 -0
  18. package/crates/team-agent/src/cli/tests/leader_watch.rs +395 -0
  19. package/crates/team-agent/src/cli/tests/main_preserved.rs +675 -0
  20. package/crates/team-agent/src/cli/tests/missing_subcommands.rs +390 -0
  21. package/crates/team-agent/src/cli/tests/mod.rs +97 -0
  22. package/crates/team-agent/src/cli/tests/peer_allow.rs +137 -0
  23. package/crates/team-agent/src/cli/tests/repair_state_byte_lock.rs +302 -0
  24. package/crates/team-agent/src/cli/tests/run_delegation.rs +305 -0
  25. package/crates/team-agent/src/cli/tests/status_send.rs +385 -0
  26. package/crates/team-agent/src/cli/tests/verb_profile.rs +182 -0
  27. package/crates/team-agent/src/cli/tests/verb_settle.rs +236 -0
  28. package/crates/team-agent/src/cli/tests/verb_validate.rs +184 -0
  29. package/crates/team-agent/src/cli/types.rs +605 -0
  30. package/crates/team-agent/src/compiler/tests.rs +701 -0
  31. package/crates/team-agent/src/compiler.rs +489 -0
  32. package/crates/team-agent/src/coordinator/backoff.rs +153 -0
  33. package/crates/team-agent/src/coordinator/health.rs +436 -0
  34. package/crates/team-agent/src/coordinator/mod.rs +80 -0
  35. package/crates/team-agent/src/coordinator/orphan.rs +179 -0
  36. package/crates/team-agent/src/coordinator/tests/abnormal.rs +255 -0
  37. package/crates/team-agent/src/coordinator/tests/basics.rs +262 -0
  38. package/crates/team-agent/src/coordinator/tests/daemon.rs +323 -0
  39. package/crates/team-agent/src/coordinator/tests/health_sync.rs +263 -0
  40. package/crates/team-agent/src/coordinator/tests/main_preserved.rs +136 -0
  41. package/crates/team-agent/src/coordinator/tests/mod.rs +310 -0
  42. package/crates/team-agent/src/coordinator/tests/spine.rs +261 -0
  43. package/crates/team-agent/src/coordinator/tests/takeover.rs +227 -0
  44. package/crates/team-agent/src/coordinator/tests/tick_core.rs +256 -0
  45. package/crates/team-agent/src/coordinator/tests/watch.rs +167 -0
  46. package/crates/team-agent/src/coordinator/tick.rs +2032 -0
  47. package/crates/team-agent/src/coordinator/types.rs +584 -0
  48. package/crates/team-agent/src/db/migration.rs +716 -0
  49. package/crates/team-agent/src/db/mod.rs +23 -0
  50. package/crates/team-agent/src/db/schema.rs +378 -0
  51. package/crates/team-agent/src/event_log.rs +375 -0
  52. package/crates/team-agent/src/fake_worker.rs +253 -0
  53. package/crates/team-agent/src/leader/helpers.rs +190 -0
  54. package/crates/team-agent/src/leader/inject.rs +33 -0
  55. package/crates/team-agent/src/leader/lease.rs +1063 -0
  56. package/crates/team-agent/src/leader/mod.rs +99 -0
  57. package/crates/team-agent/src/leader/owner_bind.rs +292 -0
  58. package/crates/team-agent/src/leader/rediscover/tests.rs +525 -0
  59. package/crates/team-agent/src/leader/rediscover.rs +1099 -0
  60. package/crates/team-agent/src/leader/start.rs +273 -0
  61. package/crates/team-agent/src/leader/takeover.rs +235 -0
  62. package/crates/team-agent/src/leader/tests/basics.rs +183 -0
  63. package/crates/team-agent/src/leader/tests/byte_findings.rs +234 -0
  64. package/crates/team-agent/src/leader/tests/identity.rs +206 -0
  65. package/crates/team-agent/src/leader/tests/idle.rs +271 -0
  66. package/crates/team-agent/src/leader/tests/lease_api.rs +225 -0
  67. package/crates/team-agent/src/leader/tests/lease_claim.rs +253 -0
  68. package/crates/team-agent/src/leader/tests/mod.rs +125 -0
  69. package/crates/team-agent/src/leader/tests/rediscover.rs +351 -0
  70. package/crates/team-agent/src/leader/tests/wake_start_owner.rs +204 -0
  71. package/crates/team-agent/src/leader/types.rs +487 -0
  72. package/crates/team-agent/src/lib.rs +85 -0
  73. package/crates/team-agent/src/lifecycle/display.rs +228 -0
  74. package/crates/team-agent/src/lifecycle/helpers.rs +112 -0
  75. package/crates/team-agent/src/lifecycle/launch/plan.rs +227 -0
  76. package/crates/team-agent/src/lifecycle/launch.rs +1833 -0
  77. package/crates/team-agent/src/lifecycle/mod.rs +62 -0
  78. package/crates/team-agent/src/lifecycle/restart/agent.rs +533 -0
  79. package/crates/team-agent/src/lifecycle/restart/common.rs +517 -0
  80. package/crates/team-agent/src/lifecycle/restart/orchestrator.rs +41 -0
  81. package/crates/team-agent/src/lifecycle/restart/rebuild.rs +268 -0
  82. package/crates/team-agent/src/lifecycle/restart/remove.rs +780 -0
  83. package/crates/team-agent/src/lifecycle/restart/selection.rs +208 -0
  84. package/crates/team-agent/src/lifecycle/restart/team_state.rs +242 -0
  85. package/crates/team-agent/src/lifecycle/restart.rs +76 -0
  86. package/crates/team-agent/src/lifecycle/tests/agent_ops.rs +455 -0
  87. package/crates/team-agent/src/lifecycle/tests/core.rs +989 -0
  88. package/crates/team-agent/src/lifecycle/tests/lane_ops.rs +583 -0
  89. package/crates/team-agent/src/lifecycle/tests/launch_spawn.rs +933 -0
  90. package/crates/team-agent/src/lifecycle/tests/main_preserved.rs +265 -0
  91. package/crates/team-agent/src/lifecycle/tests.rs +27 -0
  92. package/crates/team-agent/src/lifecycle/types.rs +685 -0
  93. package/crates/team-agent/src/main.rs +41 -0
  94. package/crates/team-agent/src/mcp_server/helpers.rs +228 -0
  95. package/crates/team-agent/src/mcp_server/mod.rs +183 -0
  96. package/crates/team-agent/src/mcp_server/normalize.rs +312 -0
  97. package/crates/team-agent/src/mcp_server/tests/golden.rs +283 -0
  98. package/crates/team-agent/src/mcp_server/tests/normalize.rs +244 -0
  99. package/crates/team-agent/src/mcp_server/tests/scoped.rs +189 -0
  100. package/crates/team-agent/src/mcp_server/tests/send.rs +222 -0
  101. package/crates/team-agent/src/mcp_server/tests/tools.rs +158 -0
  102. package/crates/team-agent/src/mcp_server/tests/wire.rs +159 -0
  103. package/crates/team-agent/src/mcp_server/tests.rs +38 -0
  104. package/crates/team-agent/src/mcp_server/tools.rs +603 -0
  105. package/crates/team-agent/src/mcp_server/types.rs +421 -0
  106. package/crates/team-agent/src/mcp_server/wire.rs +388 -0
  107. package/crates/team-agent/src/message_store.rs +767 -0
  108. package/crates/team-agent/src/messaging/activity.rs +433 -0
  109. package/crates/team-agent/src/messaging/delivery.rs +542 -0
  110. package/crates/team-agent/src/messaging/helpers.rs +209 -0
  111. package/crates/team-agent/src/messaging/leader_receiver.rs +340 -0
  112. package/crates/team-agent/src/messaging/mod.rs +147 -0
  113. package/crates/team-agent/src/messaging/peers.rs +32 -0
  114. package/crates/team-agent/src/messaging/results.rs +537 -0
  115. package/crates/team-agent/src/messaging/scheduler.rs +344 -0
  116. package/crates/team-agent/src/messaging/selftest.rs +100 -0
  117. package/crates/team-agent/src/messaging/send.rs +582 -0
  118. package/crates/team-agent/src/messaging/tests/basic.rs +357 -0
  119. package/crates/team-agent/src/messaging/tests/main_preserved.rs +122 -0
  120. package/crates/team-agent/src/messaging/tests/mod.rs +293 -0
  121. package/crates/team-agent/src/messaging/tests/runtime.rs +1422 -0
  122. package/crates/team-agent/src/messaging/tests/spine.rs +437 -0
  123. package/crates/team-agent/src/messaging/trust.rs +192 -0
  124. package/crates/team-agent/src/messaging/types.rs +355 -0
  125. package/crates/team-agent/src/messaging/watchers.rs +591 -0
  126. package/crates/team-agent/src/model/enums.rs +311 -0
  127. package/crates/team-agent/src/model/errors.rs +17 -0
  128. package/crates/team-agent/src/model/ids.rs +155 -0
  129. package/crates/team-agent/src/model/mod.rs +22 -0
  130. package/crates/team-agent/src/model/paths.rs +228 -0
  131. package/crates/team-agent/src/model/permissions.rs +567 -0
  132. package/crates/team-agent/src/model/routing.rs +340 -0
  133. package/crates/team-agent/src/model/spec.rs +680 -0
  134. package/crates/team-agent/src/model/task_graph.rs +380 -0
  135. package/crates/team-agent/src/model/testdata/fuzz.golden.yaml +43 -0
  136. package/crates/team-agent/src/model/testdata/fuzz.yaml +43 -0
  137. package/crates/team-agent/src/model/testdata/spec_invalid_a.yaml +207 -0
  138. package/crates/team-agent/src/model/testdata/team.spec.golden.yaml +206 -0
  139. package/crates/team-agent/src/model/testdata/team.spec.yaml +206 -0
  140. package/crates/team-agent/src/model/yaml/tests.rs +288 -0
  141. package/crates/team-agent/src/model/yaml.rs +800 -0
  142. package/crates/team-agent/src/packaging/install.rs +305 -0
  143. package/crates/team-agent/src/packaging/migrate.rs +30 -0
  144. package/crates/team-agent/src/packaging/mod.rs +82 -0
  145. package/crates/team-agent/src/packaging/repair.rs +24 -0
  146. package/crates/team-agent/src/packaging/tests.rs +829 -0
  147. package/crates/team-agent/src/packaging/types.rs +369 -0
  148. package/crates/team-agent/src/provider/adapter.rs +801 -0
  149. package/crates/team-agent/src/provider/approvals/mod.rs +2 -0
  150. package/crates/team-agent/src/provider/approvals/parsing.rs +452 -0
  151. package/crates/team-agent/src/provider/approvals/runtime_prompts.rs +163 -0
  152. package/crates/team-agent/src/provider/classify.rs +456 -0
  153. package/crates/team-agent/src/provider/faults.rs +136 -0
  154. package/crates/team-agent/src/provider/helpers.rs +41 -0
  155. package/crates/team-agent/src/provider/mod.rs +53 -0
  156. package/crates/team-agent/src/provider/startup_prompt.rs +423 -0
  157. package/crates/team-agent/src/provider/tests/adapter.rs +239 -0
  158. package/crates/team-agent/src/provider/tests/classify.rs +240 -0
  159. package/crates/team-agent/src/provider/tests/faults.rs +120 -0
  160. package/crates/team-agent/src/provider/tests/idle.rs +208 -0
  161. package/crates/team-agent/src/provider/tests/wire.rs +213 -0
  162. package/crates/team-agent/src/provider/tests.rs +31 -0
  163. package/crates/team-agent/src/provider/types.rs +424 -0
  164. package/crates/team-agent/src/state/identity.rs +656 -0
  165. package/crates/team-agent/src/state/mod.rs +58 -0
  166. package/crates/team-agent/src/state/owner_gate.rs +423 -0
  167. package/crates/team-agent/src/state/persist.rs +712 -0
  168. package/crates/team-agent/src/state/projection.rs +657 -0
  169. package/crates/team-agent/src/state/selector.rs +105 -0
  170. package/crates/team-agent/src/state/testdata/state-rich.canonical.json +133 -0
  171. package/crates/team-agent/src/tmux_backend/tests.rs +586 -0
  172. package/crates/team-agent/src/tmux_backend.rs +758 -0
  173. package/crates/team-agent/src/transport/test_support.rs +252 -0
  174. package/crates/team-agent/src/transport/tests/behavior.rs +327 -0
  175. package/crates/team-agent/src/transport/tests/mod.rs +199 -0
  176. package/crates/team-agent/src/transport/tests/wire.rs +527 -0
  177. package/crates/team-agent/src/transport.rs +774 -0
  178. package/npm/install.mjs +90 -106
  179. package/package.json +15 -13
  180. package/crates/team-agent-core/Cargo.toml +0 -12
  181. package/crates/team-agent-core/src/lib.rs +0 -332
  182. package/crates/team-agent-core/src/main.rs +0 -152
  183. package/pyproject.toml +0 -18
  184. package/scripts/install.py +0 -88
  185. package/scripts/run_regression_tests.py +0 -83
  186. package/src/team_agent/__init__.py +0 -3
  187. package/src/team_agent/__main__.py +0 -5
  188. package/src/team_agent/_legacy_pane_discovery.py +0 -186
  189. package/src/team_agent/abnormal_track.py +0 -253
  190. package/src/team_agent/approvals/__init__.py +0 -65
  191. package/src/team_agent/approvals/constants.py +0 -6
  192. package/src/team_agent/approvals/parsing.py +0 -176
  193. package/src/team_agent/approvals/runtime_prompts.py +0 -171
  194. package/src/team_agent/approvals/status.py +0 -176
  195. package/src/team_agent/cli/__init__.py +0 -137
  196. package/src/team_agent/cli/commands.py +0 -481
  197. package/src/team_agent/cli/e2e.py +0 -202
  198. package/src/team_agent/cli/helpers.py +0 -226
  199. package/src/team_agent/cli/parser.py +0 -540
  200. package/src/team_agent/compiler.py +0 -334
  201. package/src/team_agent/coordinator/__init__.py +0 -53
  202. package/src/team_agent/coordinator/__main__.py +0 -83
  203. package/src/team_agent/coordinator/lifecycle.py +0 -363
  204. package/src/team_agent/coordinator/metadata.py +0 -61
  205. package/src/team_agent/coordinator/paths.py +0 -17
  206. package/src/team_agent/diagnose/__init__.py +0 -48
  207. package/src/team_agent/diagnose/checks.py +0 -101
  208. package/src/team_agent/diagnose/comms.py +0 -213
  209. package/src/team_agent/diagnose/health.py +0 -241
  210. package/src/team_agent/diagnose/orphan_cleanup.py +0 -364
  211. package/src/team_agent/diagnose/preflight.py +0 -194
  212. package/src/team_agent/diagnose/quick_start.py +0 -324
  213. package/src/team_agent/display/__init__.py +0 -92
  214. package/src/team_agent/display/adaptive.py +0 -511
  215. package/src/team_agent/display/backend.py +0 -46
  216. package/src/team_agent/display/close.py +0 -154
  217. package/src/team_agent/display/ghostty.py +0 -77
  218. package/src/team_agent/display/rebuild.py +0 -102
  219. package/src/team_agent/display/tiling.py +0 -156
  220. package/src/team_agent/display/worker_window.py +0 -114
  221. package/src/team_agent/display/workspace.py +0 -382
  222. package/src/team_agent/errors.py +0 -10
  223. package/src/team_agent/events.py +0 -84
  224. package/src/team_agent/fake_worker.py +0 -80
  225. package/src/team_agent/idle_predicate.py +0 -200
  226. package/src/team_agent/idle_takeover.py +0 -59
  227. package/src/team_agent/idle_takeover_wiring.py +0 -111
  228. package/src/team_agent/launch/__init__.py +0 -41
  229. package/src/team_agent/launch/bootstrap.py +0 -85
  230. package/src/team_agent/launch/config.py +0 -106
  231. package/src/team_agent/launch/core.py +0 -301
  232. package/src/team_agent/launch/requirements.py +0 -57
  233. package/src/team_agent/leader/__init__.py +0 -926
  234. package/src/team_agent/leader_binding.py +0 -183
  235. package/src/team_agent/lifecycle/__init__.py +0 -5
  236. package/src/team_agent/lifecycle/agents.py +0 -278
  237. package/src/team_agent/lifecycle/operations.py +0 -411
  238. package/src/team_agent/lifecycle/paste_buffer_hygiene.py +0 -39
  239. package/src/team_agent/lifecycle/start.py +0 -363
  240. package/src/team_agent/mcp_server/__init__.py +0 -42
  241. package/src/team_agent/mcp_server/__main__.py +0 -7
  242. package/src/team_agent/mcp_server/contracts.py +0 -148
  243. package/src/team_agent/mcp_server/normalize.py +0 -257
  244. package/src/team_agent/mcp_server/server.py +0 -150
  245. package/src/team_agent/mcp_server/tools.py +0 -352
  246. package/src/team_agent/message_store/__init__.py +0 -23
  247. package/src/team_agent/message_store/agent_health.py +0 -113
  248. package/src/team_agent/message_store/core.py +0 -497
  249. package/src/team_agent/message_store/leader_notification_log.py +0 -198
  250. package/src/team_agent/message_store/result_watchers.py +0 -251
  251. package/src/team_agent/message_store/schema.py +0 -308
  252. package/src/team_agent/message_store/schema_migration.py +0 -448
  253. package/src/team_agent/messaging/__init__.py +0 -1
  254. package/src/team_agent/messaging/activity_detector.py +0 -254
  255. package/src/team_agent/messaging/delivery.py +0 -473
  256. package/src/team_agent/messaging/deps.py +0 -247
  257. package/src/team_agent/messaging/idle_alerts.py +0 -423
  258. package/src/team_agent/messaging/internal_delivery.py +0 -46
  259. package/src/team_agent/messaging/leader.py +0 -497
  260. package/src/team_agent/messaging/leader_api_errors.py +0 -216
  261. package/src/team_agent/messaging/leader_panes.py +0 -673
  262. package/src/team_agent/messaging/owner_bypass.py +0 -29
  263. package/src/team_agent/messaging/result_delivery.py +0 -539
  264. package/src/team_agent/messaging/results.py +0 -447
  265. package/src/team_agent/messaging/scheduler.py +0 -450
  266. package/src/team_agent/messaging/send.py +0 -532
  267. package/src/team_agent/messaging/session_drift.py +0 -94
  268. package/src/team_agent/messaging/tmux_io.py +0 -506
  269. package/src/team_agent/messaging/tmux_prompt.py +0 -338
  270. package/src/team_agent/messaging/trust_auto_answer.py +0 -52
  271. package/src/team_agent/orchestrator/__init__.py +0 -376
  272. package/src/team_agent/orchestrator/plan.py +0 -122
  273. package/src/team_agent/orchestrator/state.py +0 -128
  274. package/src/team_agent/paths.py +0 -45
  275. package/src/team_agent/permissions.py +0 -123
  276. package/src/team_agent/profiles/__init__.py +0 -82
  277. package/src/team_agent/profiles/constants.py +0 -19
  278. package/src/team_agent/profiles/core.py +0 -407
  279. package/src/team_agent/profiles/helpers.py +0 -69
  280. package/src/team_agent/profiles/provider_env.py +0 -188
  281. package/src/team_agent/profiles/smoke.py +0 -201
  282. package/src/team_agent/provider_cli/__init__.py +0 -43
  283. package/src/team_agent/provider_cli/adapter.py +0 -172
  284. package/src/team_agent/provider_cli/base.py +0 -48
  285. package/src/team_agent/provider_cli/claude.py +0 -457
  286. package/src/team_agent/provider_cli/codex.py +0 -336
  287. package/src/team_agent/provider_cli/copilot.py +0 -8
  288. package/src/team_agent/provider_cli/fake.py +0 -39
  289. package/src/team_agent/provider_cli/gemini.py +0 -95
  290. package/src/team_agent/provider_cli/opencode.py +0 -8
  291. package/src/team_agent/provider_cli/prompt.py +0 -62
  292. package/src/team_agent/provider_cli/registry.py +0 -18
  293. package/src/team_agent/provider_cli/unsupported.py +0 -32
  294. package/src/team_agent/provider_state/README.md +0 -78
  295. package/src/team_agent/provider_state/__init__.py +0 -86
  296. package/src/team_agent/provider_state/claude.py +0 -86
  297. package/src/team_agent/provider_state/codex.py +0 -84
  298. package/src/team_agent/provider_state/common.py +0 -207
  299. package/src/team_agent/provider_state/registry.py +0 -118
  300. package/src/team_agent/providers.py +0 -163
  301. package/src/team_agent/quality_gates.py +0 -104
  302. package/src/team_agent/restart/__init__.py +0 -34
  303. package/src/team_agent/restart/orchestration.py +0 -554
  304. package/src/team_agent/restart/selection.py +0 -89
  305. package/src/team_agent/restart/snapshot.py +0 -70
  306. package/src/team_agent/routing.py +0 -84
  307. package/src/team_agent/runtime.py +0 -1239
  308. package/src/team_agent/rust_core.py +0 -327
  309. package/src/team_agent/sessions/__init__.py +0 -25
  310. package/src/team_agent/sessions/capture.py +0 -143
  311. package/src/team_agent/sessions/inventory.py +0 -44
  312. package/src/team_agent/sessions/resume.py +0 -135
  313. package/src/team_agent/simple_yaml.py +0 -236
  314. package/src/team_agent/spec.py +0 -370
  315. package/src/team_agent/state.py +0 -602
  316. package/src/team_agent/status/__init__.py +0 -63
  317. package/src/team_agent/status/approvals.py +0 -52
  318. package/src/team_agent/status/compact.py +0 -158
  319. package/src/team_agent/status/constants.py +0 -18
  320. package/src/team_agent/status/inbox.py +0 -58
  321. package/src/team_agent/status/peek.py +0 -117
  322. package/src/team_agent/status/queries.py +0 -199
  323. package/src/team_agent/task_graph.py +0 -80
  324. package/src/team_agent/terminal.py +0 -57
  325. package/src/team_agent/wake.py +0 -58
  326. package/src/team_agent/watch/__init__.py +0 -145
@@ -0,0 +1,369 @@
1
+ //! packaging 共享类型 —— §19 散字符串 → enum / §3 路径·版本 newtype / typed Outcome·Report /
2
+ //! entry fn 入参 / PackagingError / 平台能力声明(纯函数 `platform_support`)。
3
+
4
+ use std::path::{Path, PathBuf};
5
+
6
+ use serde::{Deserialize, Serialize};
7
+ use thiserror::Error;
8
+
9
+ // ── REUSE — committed model types(不重定义)──────────────────────────────────
10
+ // `Provider` 给 SkillTarget→provider 关联用(SkillTarget 是 installer 域的 codex/claude/all,
11
+ // 与 ProviderKind 对齐,见 card §拥有的类型「与 step 8 ProviderKind 对齐」)。
12
+ use crate::model::enums::Provider;
13
+ use crate::model::errors::ModelError;
14
+
15
+ // ── REUSE — step 3 db schema/migration(doctor --fix-schema / migration·repair 实体在此)──
16
+ // packaging 只转调:doctor 把 schema_diagnosis 结论转成 typed DoctorStatus;repair 走 fix_schema_layout。
17
+ use crate::db::migration::{Diagnosis, FixResult};
18
+ use crate::db::DbError;
19
+
20
+ // ===========================================================================
21
+ // §19 散字符串态 → 穷尽 enum
22
+ // ===========================================================================
23
+
24
+ /// installer 子命令(`install.mjs:20-30` argv 散字符串 `install/update/doctor/uninstall/help`)。
25
+ /// `unknown command` 走 exit 2 —— Rust 侧由 clap(step 14)在解析层挡掉,此 enum 是穷尽 match 无 fallthrough。
26
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
27
+ #[serde(rename_all = "snake_case")]
28
+ pub enum InstallerCommand {
29
+ Install,
30
+ Update,
31
+ Doctor,
32
+ Uninstall,
33
+ Help,
34
+ }
35
+
36
+ /// skill 安装目标(`cli/parser.py:443` choices `codex/claude/all`)。`_skill_dest_dir` 据此选
37
+ /// `~/.codex` vs `~/.claude`(`commands.py:467-472`)。**散字符串必须 enum**,与 step 8 Provider 对齐。
38
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
39
+ #[serde(rename_all = "snake_case")]
40
+ pub enum SkillTarget {
41
+ Codex,
42
+ Claude,
43
+ All,
44
+ }
45
+
46
+ impl SkillTarget {
47
+ /// 单目标 → 对应 provider(`All` 无单一 provider → `None`)。与 [`Provider`] 对齐,防散字符串再生。
48
+ pub fn provider(self) -> Option<Provider> {
49
+ match self {
50
+ Self::Codex => Some(Provider::Codex),
51
+ Self::Claude => Some(Provider::ClaudeCode),
52
+ Self::All => None,
53
+ }
54
+ }
55
+
56
+ /// `_skill_dest_dir`:`~/.codex|.claude/skills/team-agent`(`All` 应 fan-out 到两者,非单 dir → None)。
57
+ pub fn dest_dir(self, home: &Path) -> Option<SkillDestDir> {
58
+ match self {
59
+ Self::Codex => Some(SkillDestDir(home.join(".codex").join("skills").join("team-agent"))),
60
+ Self::Claude => Some(SkillDestDir(home.join(".claude").join("skills").join("team-agent"))),
61
+ Self::All => None,
62
+ }
63
+ }
64
+ }
65
+
66
+ /// `doctor` 的 typed 结论(取代 `install.mjs:89-94` 的 exit-code + stdout `doctor: ok`/`has blockers`
67
+ /// 猜测)。`team-agent doctor --json`(`commands.py:218-260`)结构化为此,**typed,非 exit-code 猜**。
68
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
69
+ #[serde(rename_all = "snake_case", tag = "status")]
70
+ pub enum DoctorStatus {
71
+ /// 自检全过(schema 无 layout drift + 各 gate 通过)。
72
+ Ok,
73
+ /// 有阻断项 —— 携带逐条 blocker(schema drift / orphan / comms gate 失败等)。
74
+ HasBlockers { blockers: Vec<Blocker> },
75
+ }
76
+
77
+ /// doctor 单条阻断项。来源分类:packaging 不拥有实体逻辑,只把 step 3/11/12 的结论归一为此 typed 项。
78
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
79
+ pub struct Blocker {
80
+ pub source: BlockerSource,
81
+ /// 人读说明(对应 Python 各 gate 的 reason/error 字段)。
82
+ pub detail: String,
83
+ }
84
+
85
+ /// blocker 来源(穷尽 —— 标明 doctor 实体在哪一 step,packaging 仅转调)。
86
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
87
+ #[serde(rename_all = "snake_case")]
88
+ pub enum BlockerSource {
89
+ /// step 3:`team.db` 物理 layout drift(`schema_diagnosis().layout_diffs` 非空)。
90
+ SchemaLayoutDrift,
91
+ /// step 12:孤儿 coordinator(`orphan_gate`)。// 实体在 step 12,placeholder 转调。
92
+ OrphanCoordinator,
93
+ /// step 11:comms selftest 未过(`run_comms_selftest`)。// 实体在 step 11,placeholder 转调。
94
+ CommsGate,
95
+ /// installer 自身:bin 不在 PATH / 不可执行(`bincheck.mjs` PATH-not-found 诊断的等价)。
96
+ PathNotConfigured,
97
+ }
98
+
99
+ // ===========================================================================
100
+ // §3 路径/版本 newtype(语义不同,禁混传)
101
+ // ===========================================================================
102
+
103
+ /// **单一真相源**版本(`CARGO_PKG_VERSION`)。修掉 `pyproject.toml(0.1.4)` vs `package.json(0.2.11)`
104
+ /// 双源漂移 —— 禁手抄第二处。
105
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
106
+ #[serde(transparent)]
107
+ pub struct Version(pub String);
108
+
109
+ impl Version {
110
+ /// 编译期注入的唯一版本(`env!("CARGO_PKG_VERSION")`)。
111
+ pub fn current() -> Self {
112
+ Self(env!("CARGO_PKG_VERSION").to_string())
113
+ }
114
+ pub fn as_str(&self) -> &str {
115
+ &self.0
116
+ }
117
+ }
118
+
119
+ /// wrapper 安装前缀(`install.mjs:51` 默认 `~/.local`;`<prefix>/bin` 落 bin)。
120
+ #[derive(Debug, Clone, PartialEq, Eq)]
121
+ pub struct Prefix(pub PathBuf);
122
+
123
+ /// `<prefix>/bin`(`install.mjs:52`)。PATH 诊断针对此目录。
124
+ #[derive(Debug, Clone, PartialEq, Eq)]
125
+ pub struct BinDir(pub PathBuf);
126
+
127
+ /// skill 落地目录(`~/.codex|.claude/skills/team-agent`,`commands.py:469-471`)。
128
+ #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
129
+ pub struct SkillDestDir(pub PathBuf);
130
+
131
+ // 注:`RuntimeRoot` / `VersionedRuntimePath`(`runtimeRoot/<version>` 三态目录)在 Python 单二进制后
132
+ // **大概率消失**(无 Python 源树要复制);Rust 版「原子替换 + rollback」作用于**二进制本身**,故由
133
+ // [`AtomicReplacePlan`] 承载语义,不保留 RuntimeRoot newtype(card §拥有的类型)。
134
+
135
+ // ===========================================================================
136
+ // release 产物矩阵 / 平台能力如实声明(§8;能力门归 step 9,packaging 只声明覆盖面)
137
+ // ===========================================================================
138
+
139
+ /// release 目标平台(各平台静态二进制)。`Backend::Tmux`/`Pty`(step 9)能力门在 step 9,
140
+ /// 此 enum 只用于「release 矩阵覆盖面」声明。
141
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
142
+ #[serde(rename_all = "snake_case")]
143
+ pub enum ReleaseTarget {
144
+ MacosAarch64,
145
+ MacosX8664,
146
+ LinuxX8664,
147
+ LinuxAarch64,
148
+ /// Windows 原生(WezTerm/ConPTY 后端,非 tmux);见下 [`PlatformSupport`]。
149
+ WindowsX8664,
150
+ }
151
+
152
+ /// 平台支持等级(§8:如实声明,不假装兼容)。
153
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
154
+ #[serde(rename_all = "snake_case", tag = "level")]
155
+ pub enum PlatformSupport {
156
+ /// 原生一等(macOS/Linux tmux;Windows WezTerm/ConPTY,见 transport-backend-design.md)。
157
+ Native,
158
+ /// 需 WSL + tmux backend(显式标要求,不假装原生)。
159
+ RequiresWslTmux { note: String },
160
+ /// 当前 release 矩阵不覆盖。
161
+ Unsupported { reason: String },
162
+ }
163
+
164
+ /// release 矩阵中某目标平台的支持等级(§8 如实声明;能力门归 step 9)。纯函数。
165
+ pub fn platform_support(target: ReleaseTarget) -> PlatformSupport {
166
+ match target {
167
+ ReleaseTarget::MacosAarch64
168
+ | ReleaseTarget::MacosX8664
169
+ | ReleaseTarget::LinuxX8664
170
+ | ReleaseTarget::LinuxAarch64
171
+ | ReleaseTarget::WindowsX8664 => PlatformSupport::Native,
172
+ }
173
+ }
174
+
175
+ // ===========================================================================
176
+ // typed Outcome / Report(取代 install.mjs console.log 自由文本 + engine 三态)
177
+ // ===========================================================================
178
+
179
+ /// `install`/`update` 的结构化结果(取代 `install.mjs:83-94` 自由文本行;`--json` mode serde)。
180
+ /// **无 engine/fallback/fallback_reason 字段**(card §陷阱:Rust 全量后无双引擎)。
181
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
182
+ pub struct InstallReport {
183
+ /// 落地的 bin 路径(`<binDir>/team-agent`)。// REAL-MACHINE-E2E: 真写需文件系统。
184
+ pub installed_bin: PathBuf,
185
+ pub version: Version,
186
+ /// 二进制原子替换的结果(install=首装无 replace;update=有 replace + 可能 rollback)。
187
+ pub replace: Option<AtomicReplaceOutcome>,
188
+ /// SKILL 安装结果(per-target)。
189
+ pub skills: Vec<SkillInstallOutcome>,
190
+ /// 装完跑一次 doctor 的结论(`install.mjs:89` `doctor --json`)。
191
+ pub doctor: DoctorStatus,
192
+ /// PATH 提示/诊断(bin 是否在 PATH;不在则带 [`PathDiagnostic`])。
193
+ pub path_hint: PathHint,
194
+ }
195
+
196
+ /// PATH 提示(`install.mjs:87` `ensure <binDir> is on PATH` + `bincheck.mjs` not-found 诊断)。
197
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
198
+ #[serde(rename_all = "snake_case", tag = "kind")]
199
+ pub enum PathHint {
200
+ /// bin 已在 PATH。
201
+ OnPath { bin_dir: PathBuf },
202
+ /// bin 不在 PATH —— 携带诊断(保留 WSL/`.npmrc` 等价提示)。// REAL-MACHINE-E2E: 真探 PATH。
203
+ NotOnPath { bin_dir: PathBuf, diagnostic: PathDiagnostic },
204
+ }
205
+
206
+ /// 「bin 不在 PATH」诊断(`bincheck.mjs:39-65` 自由 console.error → typed struct)。
207
+ /// Rust 版无 npm,但 PATH-not-found 提示要保留(下载即跑也要提示 PATH/可执行位)。
208
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
209
+ pub struct PathDiagnostic {
210
+ pub init_cwd: PathBuf,
211
+ /// cwd 在 WSL `/mnt/c/` 下(`bincheck.mjs:67` isWslMntC)。
212
+ pub wsl_mnt_c: bool,
213
+ /// 项目级 `.npmrc` 是否设了 `prefix`(`bincheck.mjs:56` summarizeNpmrc);Rust 无 npm 路径 → `None`。
214
+ pub npmrc_prefix: Option<bool>,
215
+ /// PATH 条目数(`bincheck.mjs:43`)。
216
+ pub path_entries: usize,
217
+ /// bin 文件是否有可执行位(下载即跑场景的等价检查)。
218
+ pub executable_bit_set: bool,
219
+ }
220
+
221
+ /// 单个 SKILL 安装结果(`commands.py:_install_skill_to` 返回 dict → typed)。
222
+ /// **修 `dirs_exist_ok=True` 残留**:`removed_stale` 记录拷前清掉的陈旧文件(Python 不清 → 残留)。
223
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
224
+ pub struct SkillInstallOutcome {
225
+ pub target: SkillTarget,
226
+ pub source: PathBuf,
227
+ pub dest: SkillDestDir,
228
+ /// `--dry-run`(`commands.py:477`)→ 不落地,仅报告将拷的源/目标。
229
+ pub dry_run: bool,
230
+ /// 拷前清理掉的旧 SKILL 残留文件(diff 删除;Python 不清这一类)。// REAL-MACHINE-E2E: 真写。
231
+ pub removed_stale: Vec<PathBuf>,
232
+ }
233
+
234
+ /// 二进制原子替换结果(bug-084 同源:rename 必须 Result + 跨卷 fallback + 回滚)。
235
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
236
+ #[serde(rename_all = "snake_case", tag = "outcome")]
237
+ pub enum AtomicReplaceOutcome {
238
+ /// `dest→backup` rename + `tmp→dest` rename 成功(同卷快路径)。// REAL-MACHINE-E2E.
239
+ Replaced { backup: PathBuf },
240
+ /// 跨卷 `EXDEV` → copy+fsync+rename fallback 成功。// REAL-MACHINE-E2E: 需跨卷真机。
241
+ ReplacedCrossDevice { backup: PathBuf },
242
+ /// 替换失败 → 已回滚到 `.previous`(原 dest 仍可用)。// REAL-MACHINE-E2E.
243
+ RolledBack { restored_from: PathBuf, error: String },
244
+ }
245
+
246
+ /// `uninstall` 结果(`install.mjs:109-130`)。默认保留 runtime/workspace(有 team 在跑勿 purge)。
247
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
248
+ pub struct UninstallOutcome {
249
+ /// 移除的 wrapper/bin。// REAL-MACHINE-E2E: 真删需文件系统。
250
+ pub removed_bins: Vec<PathBuf>,
251
+ /// 移除的 skill 目录(`~/.codex|.claude/skills/team-agent`)。
252
+ pub removed_skill_dirs: Vec<SkillDestDir>,
253
+ /// 默认 false;仅 `--purge-runtime` 且确认无 team 在跑才 true(`install.mjs:128`)。
254
+ pub purged_runtime: bool,
255
+ /// 因检测到 team 在跑而拒绝 purge(安全护栏:绝不默认删 workspace/.team)。
256
+ pub purge_refused_team_running: bool,
257
+ }
258
+
259
+ /// schema migration / repair 转调结果(`doctor --fix-schema` → step 3 `fix_schema_layout`)。
260
+ /// 直接转 step 3 的 [`FixResult`](不重新散字符串化);此 enum 是 packaging 侧的「转调外壳」。
261
+ #[derive(Debug, Clone)]
262
+ pub enum MigrationOutcome {
263
+ /// 已是最新 / 无 drift —— 无需迁移。
264
+ UpToDate { diagnosis: Diagnosis },
265
+ /// 执行了 schema layout 重建(转 step 3 FixResult::Fixed)。
266
+ Migrated { fix: FixResult },
267
+ /// 撞活跃锁,拒绝且不写备份(转 step 3 FixResult::Blocked)。
268
+ Blocked { reason: String },
269
+ }
270
+
271
+ // ===========================================================================
272
+ // entry fn 入参(installer 四子命令的 typed 选项;取代 install.mjs parseOptions 散字符串)
273
+ // ===========================================================================
274
+
275
+ /// `install`/`update` 选项(`install.mjs:132` parseOptions)。**无 `--python`**(单二进制不再 resolve
276
+ /// python —— card §PythonResolution「整体删除」;此类「找不到/找错 python」故障消失是 §1 重写核心收益)。
277
+ #[derive(Debug, Clone, PartialEq, Eq)]
278
+ pub struct InstallOptions {
279
+ /// `--prefix`(默认 `~/.local`)。
280
+ pub prefix: Prefix,
281
+ /// 当前进程二进制源(用于原子替换 update 的 `tmp`);install 首装时是「自拷贝」源。
282
+ pub self_binary: PathBuf,
283
+ /// install-skill 的目标(installer 默认 `All`,`install.mjs:74`)。
284
+ pub skill_target: SkillTarget,
285
+ }
286
+
287
+ /// `uninstall` 选项(`install.mjs:109`)。
288
+ #[derive(Debug, Clone, PartialEq, Eq)]
289
+ pub struct UninstallOptions {
290
+ pub prefix: Prefix,
291
+ /// `--purge-runtime`(`install.mjs:148`)。默认 false。
292
+ pub purge_runtime: bool,
293
+ /// purge 前据此 workspace 判定有无 team 在跑(经 state 投影;`None` = 不检查,纯 bin/skill 卸载)。
294
+ pub workspace: Option<PathBuf>,
295
+ }
296
+
297
+ /// `install-skill` 选项(`commands.py:451` + `parser.py:442`)。
298
+ #[derive(Debug, Clone, PartialEq, Eq)]
299
+ pub struct SkillInstallOptions {
300
+ pub target: SkillTarget,
301
+ /// `--dest`(显式目标目录;不能与 `--target all` 组合)。
302
+ pub dest: Option<PathBuf>,
303
+ /// `--dry-run`。
304
+ pub dry_run: bool,
305
+ /// repo `skills/team-agent/` 源(`commands.py:452` `repo_root()/skills/team-agent`)。
306
+ pub source: PathBuf,
307
+ }
308
+
309
+ /// `doctor` 选项(`commands.py:218` + `parser.py:340-351`)。
310
+ #[derive(Debug, Clone, PartialEq, Eq)]
311
+ pub struct DoctorOptions {
312
+ pub workspace: PathBuf,
313
+ /// `--gate orphans|comms`(`None` = schema + 默认自检)。
314
+ pub gate: Option<DoctorGate>,
315
+ /// `--fix`(需配 `--gate`;`commands.py:220` `--fix requires --gate`)。
316
+ pub fix: bool,
317
+ /// `--cleanup-orphans` / `--confirm`(转 step 12)。
318
+ pub cleanup_orphans: bool,
319
+ pub confirm: bool,
320
+ }
321
+
322
+ /// doctor gate(`parser.py` choices + `commands.py:222/234`)。穷尽,无 fallthrough(`unknown doctor gate` → Err)。
323
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
324
+ #[serde(rename_all = "snake_case")]
325
+ pub enum DoctorGate {
326
+ Orphans,
327
+ Comms,
328
+ }
329
+
330
+ // ===========================================================================
331
+ // 错误(daemon/CLI entry 返 rich Result<Report, PackagingError>;§10)
332
+ // ===========================================================================
333
+
334
+ #[derive(Debug, Error)]
335
+ pub enum PackagingError {
336
+ /// 文件系统副作用失败(写 bin / 拷 skill / 删除)。
337
+ #[error("io: {0}")]
338
+ Io(#[from] std::io::Error),
339
+ /// 二进制原子替换失败且回滚也失败(bug-084 同源最坏情形;携带最终错误)。
340
+ #[error("atomic binary replace failed and rollback failed: {0}")]
341
+ ReplaceFailed(String),
342
+ /// 跨卷 rename(`EXDEV`)且 copy fallback 也失败。
343
+ #[error("cross-device binary replace fallback failed: {0}")]
344
+ CrossDeviceReplaceFailed(String),
345
+ /// 非法选项组合(`--dest` + `--target all`;`--fix` 无 `--gate`)。对应 Python `TeamAgentError`。
346
+ #[error("invalid options: {0}")]
347
+ InvalidOptions(String),
348
+ /// 未知 doctor gate(`commands.py:235` `unknown doctor gate`)。
349
+ #[error("unknown doctor gate: {0}")]
350
+ UnknownGate(String),
351
+ /// PATH/可执行位诊断本身失败(无法读 PATH 等)。
352
+ #[error("path diagnostic failed: {0}")]
353
+ PathDiagnostic(String),
354
+ /// uninstall 拒绝 purge(检测到 team 在跑;非真错误而是安全护栏,但走 Err 强制调用方处理)。
355
+ #[error("refused to purge runtime: a team appears to be running under {0}")]
356
+ PurgeRefusedTeamRunning(PathBuf),
357
+ /// 平台不支持当前操作(§8 如实声明;不假装兼容)。
358
+ #[error("unsupported platform for operation: {0}")]
359
+ UnsupportedPlatform(String),
360
+ /// step 3 schema/migration 转调错误。
361
+ #[error("schema: {0}")]
362
+ Db(#[from] DbError),
363
+ /// step 5 state(repair-state / team-running 判定)转调错误。
364
+ #[error("state: {0}")]
365
+ State(String),
366
+ /// model 校验/解析转调(版本解析等)。
367
+ #[error(transparent)]
368
+ Model(#[from] ModelError),
369
+ }