@team-agent/installer 0.2.11 → 0.3.1

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 +1204 -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 +1207 -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 +557 -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 +1084 -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 +526 -0
  59. package/crates/team-agent/src/leader/rediscover.rs +1101 -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 +237 -0
  64. package/crates/team-agent/src/leader/tests/identity.rs +206 -0
  65. package/crates/team-agent/src/leader/tests/idle.rs +272 -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 +410 -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 +489 -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 +2109 -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 +985 -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 +710 -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 +187 -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 +468 -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 +743 -0
  110. package/crates/team-agent/src/messaging/helpers.rs +209 -0
  111. package/crates/team-agent/src/messaging/leader_receiver.rs +329 -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 +553 -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 +578 -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 +659 -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 +765 -0
  172. package/crates/team-agent/src/tmux_backend.rs +810 -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 +118 -112
  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 -119
  203. package/src/team_agent/coordinator/lifecycle.py +0 -411
  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 -218
  226. package/src/team_agent/idle_takeover.py +0 -59
  227. package/src/team_agent/idle_takeover_wiring.py +0 -114
  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 -262
  255. package/src/team_agent/messaging/delivery.py +0 -504
  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 -503
  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 -91
  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 -1243
  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 -144
  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 -693
  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
package/npm/install.mjs CHANGED
@@ -1,13 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { spawnSync } from "node:child_process";
3
3
  import fs from "node:fs";
4
+ import { createRequire } from "node:module";
4
5
  import os from "node:os";
5
6
  import path from "node:path";
6
7
  import { fileURLToPath } from "node:url";
7
8
 
8
9
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
10
  const packageRoot = path.resolve(__dirname, "..");
11
+ const require = createRequire(import.meta.url);
10
12
  const packageJson = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
13
+ const DOCTOR_TIMEOUT_MS = 5000;
11
14
 
12
15
  const command = process.argv[2] || "install";
13
16
  const args = process.argv.slice(3);
@@ -17,16 +20,21 @@ if (["-h", "--help", "help"].includes(command)) {
17
20
  process.exit(0);
18
21
  }
19
22
 
20
- if (command === "install" || command === "update") {
21
- install(args);
22
- } else if (command === "doctor") {
23
- runDoctor(args);
24
- } else if (command === "uninstall") {
25
- uninstall(args);
26
- } else {
27
- console.error(`unknown command: ${command}`);
28
- printHelp();
29
- process.exit(2);
23
+ try {
24
+ if (command === "install" || command === "update") {
25
+ install(args);
26
+ } else if (command === "doctor") {
27
+ runDoctor(args);
28
+ } else if (command === "uninstall") {
29
+ uninstall(args);
30
+ } else {
31
+ console.error(`unknown command: ${command}`);
32
+ printHelp();
33
+ process.exit(2);
34
+ }
35
+ } catch (error) {
36
+ console.error(error instanceof Error ? error.message : String(error));
37
+ process.exit(1);
30
38
  }
31
39
 
32
40
  function printHelp() {
@@ -40,14 +48,12 @@ Usage:
40
48
  Options:
41
49
  --prefix <dir> wrapper install prefix, default ~/.local
42
50
  --runtime-dir <dir> stable runtime root, default ~/.team-agent/runtime
43
- --python <path> Python executable, otherwise TEAM_AGENT_PYTHON, python3, python
44
51
  --purge-runtime uninstall also removes the runtime root
45
52
  `);
46
53
  }
47
54
 
48
55
  function install(argv) {
49
56
  const opts = parseOptions(argv);
50
- const python = resolvePython(opts.python);
51
57
  const prefix = path.resolve(expandHome(opts.prefix || path.join(os.homedir(), ".local")));
52
58
  const binDir = path.join(prefix, "bin");
53
59
  const runtimeRoot = path.resolve(expandHome(opts.runtimeDir || path.join(os.homedir(), ".team-agent", "runtime")));
@@ -55,42 +61,47 @@ function install(argv) {
55
61
  const dest = path.join(runtimeRoot, version);
56
62
  const tmp = path.join(runtimeRoot, `.${version}.${process.pid}.tmp`);
57
63
  const backup = path.join(runtimeRoot, `.${version}.previous`);
64
+ const platformBinary = resolvePlatformBinary();
58
65
 
59
66
  fs.mkdirSync(runtimeRoot, { recursive: true });
60
67
  fs.rmSync(tmp, { recursive: true, force: true });
61
- copyTree(packageRoot, tmp);
68
+ fs.mkdirSync(path.join(tmp, "bin"), { recursive: true });
69
+ copyExecutable(platformBinary.path, path.join(tmp, "bin", "team-agent"));
70
+
62
71
  fs.rmSync(backup, { recursive: true, force: true });
63
72
  if (fs.existsSync(dest)) {
64
73
  fs.renameSync(dest, backup);
65
74
  }
66
75
  fs.renameSync(tmp, dest);
67
76
 
77
+ const runtimeBinary = path.join(dest, "bin", "team-agent");
68
78
  fs.mkdirSync(binDir, { recursive: true });
69
- writeWrapper(path.join(binDir, "team-agent"), dest, "team_agent", python);
70
- writeWrapper(path.join(binDir, "team_orchestrator"), dest, "team_agent.mcp_server", python);
71
- writeWrapper(path.join(binDir, "team-agent-coordinator"), dest, "team_agent.coordinator", python);
79
+ writeExecWrapper(path.join(binDir, "team-agent"), runtimeBinary, []);
80
+ writeExecWrapper(path.join(binDir, "team_orchestrator"), runtimeBinary, ["mcp-server"]);
81
+ writeExecWrapper(path.join(binDir, "team-agent-coordinator"), runtimeBinary, ["coordinator"]);
82
+ installSkills();
72
83
 
73
84
  const teamAgent = path.join(binDir, "team-agent");
74
- const skill = spawnSync(teamAgent, ["install-skill", "--target", "all"], {
75
- text: true,
76
- encoding: "utf8",
77
- });
78
- if (skill.status !== 0) {
79
- process.stderr.write(skill.stderr || skill.stdout || "team-agent install-skill failed\n");
80
- process.exit(skill.status || 1);
81
- }
82
-
83
85
  console.log(`installed: ${teamAgent}`);
84
86
  console.log(`runtime: ${dest}`);
85
- console.log(`python: ${python}`);
86
- console.log(`skill: installed for Codex and Claude`);
87
+ console.log(`binary: ${platformBinary.packageName}`);
88
+ console.log("skill: installed for Codex and Claude");
87
89
  console.log(`PATH: ensure ${binDir} is on PATH`);
88
90
 
89
- const doctor = spawnSync(teamAgent, ["doctor", "--json"], { text: true, encoding: "utf8" });
90
- if (doctor.status === 0) {
91
- console.log("doctor: ok");
92
- } else {
93
- console.log("doctor: has blockers; run `team-agent doctor` after updating PATH");
91
+ const doctorWorkspace = makeDoctorWorkspace();
92
+ try {
93
+ const doctor = spawnSync(teamAgent, ["doctor", "--json", "--workspace", doctorWorkspace], {
94
+ text: true,
95
+ encoding: "utf8",
96
+ timeout: DOCTOR_TIMEOUT_MS,
97
+ });
98
+ if (doctor.status === 0) {
99
+ console.log("doctor: ok");
100
+ } else {
101
+ console.log("doctor: has blockers; run `team-agent doctor` after updating PATH");
102
+ }
103
+ } finally {
104
+ fs.rmSync(doctorWorkspace, { recursive: true, force: true });
94
105
  }
95
106
  }
96
107
 
@@ -102,8 +113,16 @@ function runDoctor(argv) {
102
113
  console.error(`team-agent wrapper not found: ${teamAgent}`);
103
114
  process.exit(1);
104
115
  }
105
- const proc = spawnSync(teamAgent, ["doctor"], { stdio: "inherit" });
106
- process.exit(proc.status || 0);
116
+ const doctorWorkspace = makeDoctorWorkspace();
117
+ try {
118
+ const proc = spawnSync(teamAgent, ["doctor", "--workspace", doctorWorkspace], {
119
+ stdio: "inherit",
120
+ timeout: DOCTOR_TIMEOUT_MS,
121
+ });
122
+ process.exit(proc.status ?? 1);
123
+ } finally {
124
+ fs.rmSync(doctorWorkspace, { recursive: true, force: true });
125
+ }
107
126
  }
108
127
 
109
128
  function uninstall(argv) {
@@ -112,10 +131,7 @@ function uninstall(argv) {
112
131
  for (const name of ["team-agent", "team_orchestrator", "team-agent-coordinator"]) {
113
132
  fs.rmSync(path.join(prefix, "bin", name), { force: true });
114
133
  }
115
- for (const skillDir of [
116
- path.join(os.homedir(), ".codex", "skills", "team-agent"),
117
- path.join(os.homedir(), ".claude", "skills", "team-agent"),
118
- ]) {
134
+ for (const skillDir of skillDestinations()) {
119
135
  fs.rmSync(skillDir, { recursive: true, force: true });
120
136
  }
121
137
  console.log(`removed wrappers from ${path.join(prefix, "bin")}`);
@@ -135,16 +151,12 @@ function parseOptions(argv) {
135
151
  const item = argv[i];
136
152
  if (item === "--prefix") {
137
153
  opts.prefix = argv[++i];
138
- } else if (item.startsWith("--prefix=")) {
154
+ } else if (item?.startsWith("--prefix=")) {
139
155
  opts.prefix = item.slice("--prefix=".length);
140
156
  } else if (item === "--runtime-dir") {
141
157
  opts.runtimeDir = argv[++i];
142
- } else if (item.startsWith("--runtime-dir=")) {
158
+ } else if (item?.startsWith("--runtime-dir=")) {
143
159
  opts.runtimeDir = item.slice("--runtime-dir=".length);
144
- } else if (item === "--python") {
145
- opts.python = argv[++i];
146
- } else if (item.startsWith("--python=")) {
147
- opts.python = item.slice("--python=".length);
148
160
  } else if (item === "--purge-runtime") {
149
161
  opts.purgeRuntime = true;
150
162
  } else {
@@ -154,88 +166,82 @@ function parseOptions(argv) {
154
166
  return opts;
155
167
  }
156
168
 
157
- function resolvePython(explicit) {
158
- const candidates = pythonCandidates(explicit);
159
- for (const candidate of candidates) {
160
- const resolved = path.isAbsolute(candidate) ? candidate : which(candidate) || candidate;
161
- if (!resolved) {
162
- continue;
163
- }
164
- const proc = spawnSync(resolved, ["-c", "import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)"], {
165
- text: true,
166
- encoding: "utf8",
167
- });
168
- if (proc.status === 0) {
169
- return resolved;
170
- }
169
+ function resolvePlatformBinary() {
170
+ const packageName = platformPackageName();
171
+ if (!packageName) {
172
+ printUnsupportedPlatform();
173
+ process.exit(1);
174
+ }
175
+ const binarySpec = `${packageName}/bin/team-agent`;
176
+ try {
177
+ return {
178
+ packageName,
179
+ path: require.resolve(binarySpec),
180
+ };
181
+ } catch {
182
+ console.error(`ERROR: Team Agent binary package not installed for ${process.platform}/${process.arch}`);
183
+ console.error("ACTION: rerun without --no-optional, or use a supported macOS/Linux/WSL platform.");
184
+ console.error(`LOG: package=${packageName} node=${process.version} platform=${process.platform} arch=${process.arch}`);
185
+ process.exit(1);
171
186
  }
172
- console.error("No usable Python >= 3.10 found. Set TEAM_AGENT_PYTHON or pass --python.");
173
- process.exit(1);
174
187
  }
175
188
 
176
- function pythonCandidates(explicit) {
177
- const candidates = [explicit, process.env.TEAM_AGENT_PYTHON, "python3", "python"];
178
- const commonPaths = [
179
- "/opt/homebrew/bin/python3",
180
- "/usr/local/bin/python3",
181
- "/usr/bin/python3",
182
- "/opt/homebrew/opt/python@3/bin/python3",
183
- "/usr/local/opt/python@3/bin/python3",
184
- ];
185
- candidates.push(...commonPaths);
186
- for (const root of ["/opt/homebrew/opt", "/usr/local/opt"]) {
187
- try {
188
- for (const entry of fs.readdirSync(root)) {
189
- if (!entry.startsWith("python@")) {
190
- continue;
191
- }
192
- const bin = path.join(root, entry, "bin");
193
- for (const name of fs.readdirSync(bin)) {
194
- if (/^python3(\.\d+)?$/.test(name)) {
195
- candidates.push(path.join(bin, name));
196
- }
197
- }
198
- }
199
- } catch {
200
- continue;
201
- }
202
- }
203
- return [...new Set(candidates.filter(Boolean))];
189
+ function platformPackageName() {
190
+ const key = `${process.platform}-${process.arch}`;
191
+ const packages = {
192
+ "darwin-arm64": "@team-agent/cli-darwin-arm64",
193
+ "darwin-x64": "@team-agent/cli-darwin-x64",
194
+ "linux-x64": "@team-agent/cli-linux-x64",
195
+ };
196
+ return packages[key] || null;
204
197
  }
205
198
 
206
- function which(commandName) {
207
- for (const directory of (process.env.PATH || "").split(path.delimiter)) {
208
- if (!directory) {
209
- continue;
210
- }
211
- const candidate = path.join(directory, commandName);
212
- try {
213
- fs.accessSync(candidate, fs.constants.X_OK);
214
- return candidate;
215
- } catch {
216
- continue;
217
- }
218
- }
219
- return null;
199
+ function printUnsupportedPlatform() {
200
+ console.error(`ERROR: unsupported Team Agent platform ${process.platform}/${process.arch}.`);
201
+ console.error("ACTION: supported platforms are darwin/arm64, darwin/x64, and linux/x64.");
202
+ console.error(`LOG: node=${process.version} platform=${process.platform} arch=${process.arch}`);
220
203
  }
221
204
 
222
- function writeWrapper(file, runtimeDir, moduleName, python) {
205
+ function copyExecutable(src, dest) {
206
+ fs.copyFileSync(src, dest);
207
+ fs.chmodSync(dest, 0o755);
208
+ }
209
+
210
+ function writeExecWrapper(file, binary, fixedArgs) {
211
+ const args = fixedArgs.map(shellQuote).join(" ");
212
+ const argPrefix = args ? `${args} ` : "";
223
213
  const content = `#!/usr/bin/env sh
224
- PYTHON_BIN="\${TEAM_AGENT_PYTHON:-${doubleQuoteValue(python)}}"
225
- PYTHONPATH="${doubleQuoteValue(path.join(runtimeDir, "src"))}" exec "$PYTHON_BIN" -m ${moduleName} "$@"
214
+ exec ${shellQuote(binary)} ${argPrefix}"$@"
226
215
  `;
227
216
  fs.writeFileSync(file, content, { mode: 0o755 });
228
217
  fs.chmodSync(file, 0o755);
229
218
  }
230
219
 
220
+ function installSkills() {
221
+ const source = path.join(packageRoot, "skills", "team-agent");
222
+ if (!fs.existsSync(source)) {
223
+ throw new Error(`skill source not found: ${source}`);
224
+ }
225
+ for (const dest of skillDestinations()) {
226
+ fs.rmSync(dest, { recursive: true, force: true });
227
+ copyTree(source, dest);
228
+ }
229
+ }
230
+
231
+ function skillDestinations() {
232
+ return [
233
+ path.join(os.homedir(), ".codex", "skills", "team-agent"),
234
+ path.join(os.homedir(), ".claude", "skills", "team-agent"),
235
+ ];
236
+ }
237
+
238
+ function makeDoctorWorkspace() {
239
+ return fs.mkdtempSync(path.join(os.tmpdir(), "team-agent-doctor-"));
240
+ }
241
+
231
242
  function copyTree(src, dest) {
232
- const ignored = new Set([".git", ".team", "node_modules", "__pycache__", ".pytest_cache", ".venv"]);
233
243
  const stat = fs.lstatSync(src);
234
244
  if (stat.isDirectory()) {
235
- const name = path.basename(src);
236
- if (ignored.has(name) || src.endsWith(path.join("team-agent-core", "target"))) {
237
- return;
238
- }
239
245
  fs.mkdirSync(dest, { recursive: true, mode: stat.mode });
240
246
  for (const entry of fs.readdirSync(src)) {
241
247
  if (entry === ".DS_Store") {
@@ -261,6 +267,6 @@ function expandHome(value) {
261
267
  return value;
262
268
  }
263
269
 
264
- function doubleQuoteValue(value) {
265
- return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\$/g, "\\$").replace(/`/g, "\\`");
270
+ function shellQuote(value) {
271
+ return `'${String(value).replace(/'/g, "'\\''")}'`;
266
272
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@team-agent/installer",
3
- "version": "0.2.11",
3
+ "version": "0.3.1",
4
4
  "description": "npx installer for Team Agent",
5
5
  "keywords": [
6
6
  "codex",
@@ -19,33 +19,35 @@
19
19
  "bin": {
20
20
  "team-agent-installer": "npm/install.mjs"
21
21
  },
22
+ "optionalDependencies": {
23
+ "@team-agent/cli-darwin-arm64": "0.3.1",
24
+ "@team-agent/cli-darwin-x64": "0.3.1",
25
+ "@team-agent/cli-linux-x64": "0.3.1"
26
+ },
22
27
  "scripts": {
23
28
  "postinstall": "node npm/bincheck.mjs",
24
- "test": "PYTHONPATH=src python3 tests/run_tests.py",
25
- "test:regression": "PYTHONPATH=src python3 scripts/run_regression_tests.py --iterations 3",
26
- "test:rust": "cargo test --manifest-path crates/team-agent-core/Cargo.toml",
29
+ "test": "cargo test --workspace --locked",
30
+ "build:release": "cargo build --release --bin team-agent --locked",
27
31
  "pack:dry-run": "npm pack --dry-run"
28
32
  },
29
33
  "files": [
30
- "npm",
31
- "scripts",
32
- "src",
34
+ "npm/bincheck.mjs",
35
+ "npm/install.mjs",
33
36
  "skills",
34
37
  "templates",
35
38
  "examples",
36
39
  "schemas",
37
- "crates/team-agent-core/Cargo.toml",
38
- "crates/team-agent-core/src",
39
- "pyproject.toml",
40
+ "Cargo.toml",
41
+ "Cargo.lock",
42
+ "crates/team-agent/Cargo.toml",
43
+ "crates/team-agent/src",
40
44
  "README.md",
41
45
  "README.zh.md",
42
46
  "LICENSE",
43
- "!**/__pycache__/**",
44
- "!**/*.pyc",
45
47
  "!**/target/**"
46
48
  ],
47
49
  "engines": {
48
50
  "node": ">=18"
49
51
  },
50
- "license": "AGPL-3.0-or-later"
52
+ "license": "AGPL-3.0"
51
53
  }
@@ -1,12 +0,0 @@
1
- [package]
2
- name = "team-agent-core"
3
- version = "0.1.0"
4
- edition = "2021"
5
-
6
- [lib]
7
- name = "team_agent_core"
8
- path = "src/lib.rs"
9
-
10
- [[bin]]
11
- name = "team-agent-core"
12
- path = "src/main.rs"