oh-my-codex 0.18.7 → 0.18.9

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 (307) hide show
  1. package/Cargo.lock +12 -12
  2. package/Cargo.toml +1 -1
  3. package/README.md +5 -5
  4. package/crates/omx-sparkshell/tests/execution.rs +1 -1
  5. package/dist/agents/__tests__/native-config.test.js +42 -1
  6. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  7. package/dist/agents/definitions.d.ts +8 -0
  8. package/dist/agents/definitions.d.ts.map +1 -1
  9. package/dist/agents/definitions.js +1 -0
  10. package/dist/agents/definitions.js.map +1 -1
  11. package/dist/agents/native-config.d.ts +5 -1
  12. package/dist/agents/native-config.d.ts.map +1 -1
  13. package/dist/agents/native-config.js +17 -2
  14. package/dist/agents/native-config.js.map +1 -1
  15. package/dist/autopilot/__tests__/fsm.test.js +3 -0
  16. package/dist/autopilot/__tests__/fsm.test.js.map +1 -1
  17. package/dist/autopilot/fsm.js +2 -2
  18. package/dist/autopilot/fsm.js.map +1 -1
  19. package/dist/cli/__tests__/auth.test.js +4 -2
  20. package/dist/cli/__tests__/auth.test.js.map +1 -1
  21. package/dist/cli/__tests__/codex-plugin-layout.test.js +512 -1
  22. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  23. package/dist/cli/__tests__/doctor-warning-copy.test.js +39 -0
  24. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  25. package/dist/cli/__tests__/index.test.js +98 -6
  26. package/dist/cli/__tests__/index.test.js.map +1 -1
  27. package/dist/cli/__tests__/package-bin-contract.test.js +28 -8
  28. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  29. package/dist/cli/__tests__/question.test.js +26 -9
  30. package/dist/cli/__tests__/question.test.js.map +1 -1
  31. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +13 -0
  32. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  33. package/dist/cli/__tests__/ralph.test.js +14 -0
  34. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  35. package/dist/cli/__tests__/resume.test.js +50 -1
  36. package/dist/cli/__tests__/resume.test.js.map +1 -1
  37. package/dist/cli/__tests__/setup-install-mode.test.js +89 -0
  38. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  39. package/dist/cli/__tests__/setup-refresh.test.js +65 -0
  40. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  41. package/dist/cli/__tests__/state.test.js +21 -0
  42. package/dist/cli/__tests__/state.test.js.map +1 -1
  43. package/dist/cli/__tests__/team.test.js +2 -2
  44. package/dist/cli/__tests__/update.test.js +323 -18
  45. package/dist/cli/__tests__/update.test.js.map +1 -1
  46. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +1 -1
  47. package/dist/cli/doctor.d.ts.map +1 -1
  48. package/dist/cli/doctor.js +8 -1
  49. package/dist/cli/doctor.js.map +1 -1
  50. package/dist/cli/index.d.ts +21 -4
  51. package/dist/cli/index.d.ts.map +1 -1
  52. package/dist/cli/index.js +143 -28
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/cli/plugin-marketplace.d.ts +14 -2
  55. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  56. package/dist/cli/plugin-marketplace.js +62 -15
  57. package/dist/cli/plugin-marketplace.js.map +1 -1
  58. package/dist/cli/ralph.d.ts.map +1 -1
  59. package/dist/cli/ralph.js +3 -1
  60. package/dist/cli/ralph.js.map +1 -1
  61. package/dist/cli/setup-preferences.d.ts +2 -0
  62. package/dist/cli/setup-preferences.d.ts.map +1 -1
  63. package/dist/cli/setup-preferences.js +4 -0
  64. package/dist/cli/setup-preferences.js.map +1 -1
  65. package/dist/cli/setup.d.ts +3 -0
  66. package/dist/cli/setup.d.ts.map +1 -1
  67. package/dist/cli/setup.js +166 -27
  68. package/dist/cli/setup.js.map +1 -1
  69. package/dist/cli/state.d.ts.map +1 -1
  70. package/dist/cli/state.js +8 -1
  71. package/dist/cli/state.js.map +1 -1
  72. package/dist/cli/tmux-hook.d.ts.map +1 -1
  73. package/dist/cli/tmux-hook.js +16 -0
  74. package/dist/cli/tmux-hook.js.map +1 -1
  75. package/dist/cli/update.d.ts +22 -3
  76. package/dist/cli/update.d.ts.map +1 -1
  77. package/dist/cli/update.js +312 -26
  78. package/dist/cli/update.js.map +1 -1
  79. package/dist/cli/version.d.ts.map +1 -1
  80. package/dist/cli/version.js +5 -9
  81. package/dist/cli/version.js.map +1 -1
  82. package/dist/compat/__tests__/doctor-contract.test.js +12 -1
  83. package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
  84. package/dist/config/__tests__/generator-notify.test.js +1 -0
  85. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  86. package/dist/config/generator.d.ts +2 -2
  87. package/dist/config/generator.d.ts.map +1 -1
  88. package/dist/config/generator.js +2 -2
  89. package/dist/config/generator.js.map +1 -1
  90. package/dist/config/team-mode.d.ts +12 -0
  91. package/dist/config/team-mode.d.ts.map +1 -0
  92. package/dist/config/team-mode.js +91 -0
  93. package/dist/config/team-mode.js.map +1 -0
  94. package/dist/hooks/__tests__/agents-overlay.test.js +88 -0
  95. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  96. package/dist/hooks/__tests__/code-review-skill-contract.test.js +12 -0
  97. package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -1
  98. package/dist/hooks/__tests__/deep-interview-contract.test.js +30 -1
  99. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  100. package/dist/hooks/__tests__/keyword-detector.test.js +423 -3
  101. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  102. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +1 -1
  103. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  104. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +189 -0
  105. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  106. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +35 -2
  107. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  108. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +3 -3
  109. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  110. package/dist/hooks/__tests__/skill-guidance-contract.test.js +21 -0
  111. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  112. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  113. package/dist/hooks/agents-overlay.js +36 -50
  114. package/dist/hooks/agents-overlay.js.map +1 -1
  115. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js +31 -0
  116. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js.map +1 -1
  117. package/dist/hooks/extensibility/plugin-runner.js +17 -21
  118. package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
  119. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  120. package/dist/hooks/keyword-detector.js +258 -12
  121. package/dist/hooks/keyword-detector.js.map +1 -1
  122. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  123. package/dist/hooks/prompt-guidance-contract.js +6 -0
  124. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  125. package/dist/hooks/session.d.ts +1 -0
  126. package/dist/hooks/session.d.ts.map +1 -1
  127. package/dist/hooks/session.js.map +1 -1
  128. package/dist/hud/__tests__/authority.test.js +435 -32
  129. package/dist/hud/__tests__/authority.test.js.map +1 -1
  130. package/dist/hud/__tests__/hud-tmux-injection.test.js +2 -1
  131. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  132. package/dist/hud/__tests__/index.test.js +42 -0
  133. package/dist/hud/__tests__/index.test.js.map +1 -1
  134. package/dist/hud/__tests__/reconcile.test.js +642 -15
  135. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  136. package/dist/hud/__tests__/render.test.js +61 -0
  137. package/dist/hud/__tests__/render.test.js.map +1 -1
  138. package/dist/hud/__tests__/state.test.js +160 -4
  139. package/dist/hud/__tests__/state.test.js.map +1 -1
  140. package/dist/hud/__tests__/tmux.test.js +180 -21
  141. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  142. package/dist/hud/authority.d.ts +5 -0
  143. package/dist/hud/authority.d.ts.map +1 -1
  144. package/dist/hud/authority.js +324 -28
  145. package/dist/hud/authority.js.map +1 -1
  146. package/dist/hud/index.d.ts +3 -2
  147. package/dist/hud/index.d.ts.map +1 -1
  148. package/dist/hud/index.js +42 -19
  149. package/dist/hud/index.js.map +1 -1
  150. package/dist/hud/reconcile.d.ts +3 -3
  151. package/dist/hud/reconcile.d.ts.map +1 -1
  152. package/dist/hud/reconcile.js +128 -19
  153. package/dist/hud/reconcile.js.map +1 -1
  154. package/dist/hud/render.d.ts.map +1 -1
  155. package/dist/hud/render.js +35 -0
  156. package/dist/hud/render.js.map +1 -1
  157. package/dist/hud/state.d.ts.map +1 -1
  158. package/dist/hud/state.js +65 -80
  159. package/dist/hud/state.js.map +1 -1
  160. package/dist/hud/tmux.d.ts +24 -6
  161. package/dist/hud/tmux.d.ts.map +1 -1
  162. package/dist/hud/tmux.js +136 -38
  163. package/dist/hud/tmux.js.map +1 -1
  164. package/dist/hud/types.d.ts +11 -0
  165. package/dist/hud/types.d.ts.map +1 -1
  166. package/dist/hud/types.js.map +1 -1
  167. package/dist/mcp/__tests__/state-paths.test.js +71 -1
  168. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  169. package/dist/mcp/state-paths.d.ts +32 -0
  170. package/dist/mcp/state-paths.d.ts.map +1 -1
  171. package/dist/mcp/state-paths.js +113 -17
  172. package/dist/mcp/state-paths.js.map +1 -1
  173. package/dist/mcp/state-server.d.ts +4 -4
  174. package/dist/question/__tests__/renderer.test.js +566 -1
  175. package/dist/question/__tests__/renderer.test.js.map +1 -1
  176. package/dist/question/renderer.d.ts +9 -1
  177. package/dist/question/renderer.d.ts.map +1 -1
  178. package/dist/question/renderer.js +246 -70
  179. package/dist/question/renderer.js.map +1 -1
  180. package/dist/scripts/__tests__/codex-native-hook.test.js +837 -101
  181. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  182. package/dist/scripts/__tests__/notify-state-io.test.js +72 -1
  183. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
  184. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts +2 -0
  185. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts.map +1 -0
  186. package/dist/scripts/__tests__/notify-tmux-injection.test.js +57 -0
  187. package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -0
  188. package/dist/scripts/__tests__/run-test-files.test.js +74 -0
  189. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  190. package/dist/scripts/__tests__/verify-native-agents.test.js +65 -0
  191. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
  192. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  193. package/dist/scripts/codex-native-hook.js +107 -39
  194. package/dist/scripts/codex-native-hook.js.map +1 -1
  195. package/dist/scripts/eval/eval-parity-smoke.js +1 -1
  196. package/dist/scripts/eval/eval-parity-smoke.js.map +1 -1
  197. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  198. package/dist/scripts/notify-hook/auto-nudge.js +3 -1
  199. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  200. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
  201. package/dist/scripts/notify-hook/ralph-session-resume.js +3 -10
  202. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
  203. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  204. package/dist/scripts/notify-hook/state-io.js +62 -38
  205. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  206. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  207. package/dist/scripts/notify-hook/team-leader-nudge.js +7 -0
  208. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  209. package/dist/scripts/notify-hook/tmux-injection.d.ts +7 -0
  210. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  211. package/dist/scripts/notify-hook/tmux-injection.js +24 -18
  212. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  213. package/dist/scripts/notify-hook.js +75 -11
  214. package/dist/scripts/notify-hook.js.map +1 -1
  215. package/dist/scripts/run-test-files.js +193 -22
  216. package/dist/scripts/run-test-files.js.map +1 -1
  217. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  218. package/dist/scripts/sync-plugin-mirror.js +61 -3
  219. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  220. package/dist/scripts/verify-native-agents.d.ts.map +1 -1
  221. package/dist/scripts/verify-native-agents.js +58 -1
  222. package/dist/scripts/verify-native-agents.js.map +1 -1
  223. package/dist/state/__tests__/operations.test.js +113 -0
  224. package/dist/state/__tests__/operations.test.js.map +1 -1
  225. package/dist/state/__tests__/skill-active.test.js +3 -16
  226. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  227. package/dist/state/__tests__/workflow-transition.test.js +25 -0
  228. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  229. package/dist/state/operations.d.ts.map +1 -1
  230. package/dist/state/operations.js +57 -2
  231. package/dist/state/operations.js.map +1 -1
  232. package/dist/state/skill-active.d.ts.map +1 -1
  233. package/dist/state/skill-active.js +7 -39
  234. package/dist/state/skill-active.js.map +1 -1
  235. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  236. package/dist/state/workflow-transition-reconcile.js +10 -14
  237. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  238. package/dist/team/__tests__/runtime.test.js +1 -1
  239. package/dist/team/__tests__/runtime.test.js.map +1 -1
  240. package/dist/team/__tests__/scaling.test.js +9 -4
  241. package/dist/team/__tests__/scaling.test.js.map +1 -1
  242. package/dist/team/__tests__/tmux-session.test.js +195 -2
  243. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  244. package/dist/team/__tests__/worker-runtime-identity.test.js +4 -2
  245. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  246. package/dist/team/scaling.d.ts.map +1 -1
  247. package/dist/team/scaling.js +3 -2
  248. package/dist/team/scaling.js.map +1 -1
  249. package/dist/team/tmux-session.d.ts +2 -0
  250. package/dist/team/tmux-session.d.ts.map +1 -1
  251. package/dist/team/tmux-session.js +142 -12
  252. package/dist/team/tmux-session.js.map +1 -1
  253. package/dist/utils/__tests__/platform-command.test.js +16 -1
  254. package/dist/utils/__tests__/platform-command.test.js.map +1 -1
  255. package/dist/utils/__tests__/version.test.d.ts +2 -0
  256. package/dist/utils/__tests__/version.test.d.ts.map +1 -0
  257. package/dist/utils/__tests__/version.test.js +51 -0
  258. package/dist/utils/__tests__/version.test.js.map +1 -0
  259. package/dist/utils/paths.d.ts +8 -1
  260. package/dist/utils/paths.d.ts.map +1 -1
  261. package/dist/utils/paths.js +16 -4
  262. package/dist/utils/paths.js.map +1 -1
  263. package/dist/utils/platform-command.d.ts +9 -0
  264. package/dist/utils/platform-command.d.ts.map +1 -1
  265. package/dist/utils/platform-command.js +15 -0
  266. package/dist/utils/platform-command.js.map +1 -1
  267. package/dist/utils/version.d.ts +7 -0
  268. package/dist/utils/version.d.ts.map +1 -0
  269. package/dist/utils/version.js +67 -0
  270. package/dist/utils/version.js.map +1 -0
  271. package/dist/verification/__tests__/ci-rust-gates.test.js +89 -1
  272. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  273. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +16 -2
  274. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
  275. package/package.json +11 -10
  276. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  277. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +334 -21
  278. package/plugins/oh-my-codex/hooks/hooks.json +1 -2
  279. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +3 -1
  280. package/plugins/oh-my-codex/skills/code-review/SKILL.md +7 -7
  281. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +51 -11
  282. package/plugins/oh-my-codex/skills/ralph/SKILL.md +22 -22
  283. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +9 -0
  284. package/skills/autopilot/SKILL.md +3 -1
  285. package/skills/code-review/SKILL.md +7 -7
  286. package/skills/deep-interview/SKILL.md +51 -11
  287. package/skills/ralph/SKILL.md +22 -22
  288. package/skills/ultraqa/SKILL.md +9 -0
  289. package/src/scripts/__tests__/codex-native-hook.test.ts +946 -98
  290. package/src/scripts/__tests__/notify-state-io.test.ts +95 -0
  291. package/src/scripts/__tests__/notify-tmux-injection.test.ts +82 -0
  292. package/src/scripts/__tests__/run-test-files.test.ts +102 -0
  293. package/src/scripts/__tests__/verify-native-agents.test.ts +75 -0
  294. package/src/scripts/codex-native-hook.ts +123 -34
  295. package/src/scripts/demo-team-e2e.sh +10 -7
  296. package/src/scripts/eval/eval-parity-smoke.ts +1 -1
  297. package/src/scripts/notify-hook/auto-nudge.ts +3 -1
  298. package/src/scripts/notify-hook/ralph-session-resume.ts +2 -8
  299. package/src/scripts/notify-hook/state-io.ts +75 -37
  300. package/src/scripts/notify-hook/team-leader-nudge.ts +7 -0
  301. package/src/scripts/notify-hook/tmux-injection.ts +35 -19
  302. package/src/scripts/notify-hook.ts +91 -4
  303. package/src/scripts/prepare-build.js +83 -0
  304. package/src/scripts/run-test-files.ts +192 -22
  305. package/src/scripts/sync-plugin-mirror.ts +98 -9
  306. package/src/scripts/verify-native-agents.ts +65 -1
  307. package/src/scripts/postinstall-bootstrap.js +0 -23
package/dist/cli/setup.js CHANGED
@@ -20,10 +20,11 @@ import { readSessionState, isSessionStale } from "../hooks/session.js";
20
20
  import { getCatalogHeadlineCounts } from "./catalog-contract.js";
21
21
  import { tryReadCatalogManifest } from "../catalog/reader.js";
22
22
  import { DEFAULT_FRONTIER_MODEL } from "../config/models.js";
23
+ import { teamModeEnabled, } from "../config/team-mode.js";
23
24
  import { addGeneratedAgentsMarker, hasOmxAgentsContract, hasOmxManagedAgentsSections, isOmxGeneratedAgentsMd, upsertManagedAgentsBlock, } from "../utils/agents-md.js";
24
25
  import { DEFAULT_HUD_CONFIG } from "../hud/types.js";
25
26
  import { SETUP_INSTALL_MODES, SETUP_MCP_MODES, SETUP_SCOPES, getSetupScopeFilePath, readPersistedSetupPreferences, } from "./setup-preferences.js";
26
- import { OMX_LOCAL_MARKETPLACE_NAME, OMX_PLUGIN_NAME, materializePackagedOmxPluginCache, resolvePackagedOmxMarketplace, upsertLocalOmxMarketplaceRegistration, upsertLocalOmxPluginEnablement, upsertLocalOmxPluginMcpServerEnablement, hasLocalOmxPluginMcpServerRegistrations, } from "./plugin-marketplace.js";
27
+ import { OMX_LOCAL_MARKETPLACE_NAME, OMX_PLUGIN_NAME, materializePackagedOmxPluginCache, resolvePackagedOmxMarketplace, upsertLocalOmxMarketplaceRegistration, upsertLocalOmxPluginEnablement, upsertLocalOmxPluginMcpServerEnablement, hasLocalOmxPluginMcpServerRegistrations, pluginHookCacheMatchesPackaged, } from "./plugin-marketplace.js";
27
28
  import { resolveCodexHookFeatureSupportForCli } from "./codex-feature-probe.js";
28
29
  async function resolveStatusLinePresetForSetup(projectRoot, options) {
29
30
  if (options.force) {
@@ -46,6 +47,7 @@ async function resolveStatusLinePresetForSetup(projectRoot, options) {
46
47
  }
47
48
  import { resolveAgentsModelTableContext, upsertAgentsModelTable, } from "../utils/agents-model-table.js";
48
49
  export { SETUP_INSTALL_MODES, SETUP_MCP_MODES, SETUP_SCOPES };
50
+ export { SETUP_TEAM_MODES } from "../config/team-mode.js";
49
51
  const PROJECT_GITIGNORE_ENTRIES = [
50
52
  ".omx/",
51
53
  ".codex/*",
@@ -61,6 +63,9 @@ const LEGACY_PROJECT_GITIGNORE_ENTRIES = [".codex/"];
61
63
  const SETUP_ONLY_INSTALLABLE_SKILLS = new Set(["wiki"]);
62
64
  const DEFAULT_SETUP_MCP_MODE = "none";
63
65
  const HARD_DEPRECATED_SKILL_NAMES = new Set(["web-clone"]);
66
+ const TEAM_MODE_SKILL_NAMES = new Set(["team", "worker"]);
67
+ const TEAM_MODE_PROMPT_NAMES = new Set(["team-executor"]);
68
+ const TEAM_MODE_NATIVE_AGENT_NAMES = new Set(["team-executor"]);
64
69
  function isCatalogInstallableStatus(status) {
65
70
  return status === "active" || status === "internal";
66
71
  }
@@ -85,6 +90,65 @@ function applyPluginModeWordingToAgentsTemplate(content, scope) {
85
90
  : "`~/.codex/skills`";
86
91
  return scopedContent.replace(/Role prompts under `prompts\/\*\.md` are narrower execution surfaces\. They must follow this file, not override it\.\nWhen OMX is installed, load the installed prompt\/skill\/agent surfaces from [^\n]+active\)\./, `Registered Codex plugin marketplace surfaces supply OMX workflows and plugin-scoped companion resources when the plugin is installed. Native agent roles are installed as setup-owned Codex agent TOML files in plugin mode so agent_type routing works. They must follow this file, not override it.\nUser-installed skills may still live under ${userSkillPath}.`);
87
92
  }
93
+ function stripNamedXmlSection(content, sectionName) {
94
+ return content.replace(new RegExp(`\\n?<${sectionName}>[\\s\\S]*?<\\/${sectionName}>\\n?`, "g"), "\n");
95
+ }
96
+ function applyTeamModeToAgentsTemplate(content, teamMode) {
97
+ if (teamModeEnabled(teamMode))
98
+ return content;
99
+ let next = content;
100
+ for (const section of ["team_compositions", "team_pipeline", "team_model_resolution"]) {
101
+ next = stripNamedXmlSection(next, section);
102
+ }
103
+ return next
104
+ .replace(/\(\+ \$team if needed\)/g, "")
105
+ .replace(/- `\$team` when[^\n]*\n/g, "")
106
+ .replace(/,?\s*`team`,?/g, "")
107
+ .replace(/\s*\|\s*`\$team ".*?"`\s*\|.*\|\n/g, "\n")
108
+ .replace(/,?\s*`\$team`/g, "")
109
+ .replace(/`\$team`,?\s*/g, "")
110
+ .replace(/\/?\s*`team`\/`swarm`/g, "`swarm`")
111
+ .split("\n")
112
+ .filter((line) => {
113
+ const normalized = line.toLowerCase();
114
+ if (normalized.includes("team mode"))
115
+ return false;
116
+ if (normalized.includes("team runtime"))
117
+ return false;
118
+ if (normalized.includes("team orchestration"))
119
+ return false;
120
+ if (normalized.includes("team/swarm"))
121
+ return false;
122
+ if (normalized.includes("team pipeline"))
123
+ return false;
124
+ if (normalized.includes("runtime/team"))
125
+ return false;
126
+ if (normalized.includes("team overlays"))
127
+ return false;
128
+ if (normalized.includes("team pane"))
129
+ return false;
130
+ if (normalized.startsWith("- teams may "))
131
+ return false;
132
+ if (normalized.includes("outside active `team`"))
133
+ return false;
134
+ if (normalized.includes("reserve `worker`"))
135
+ return false;
136
+ if (normalized.includes("worker` is a team-runtime"))
137
+ return false;
138
+ if (normalized.includes("team-plan"))
139
+ return false;
140
+ if (normalized.includes("omx team"))
141
+ return false;
142
+ return true;
143
+ })
144
+ .join("\n")
145
+ .replace(/\n{3,}/g, "\n\n");
146
+ }
147
+ function getAgentsModelTableDefinitionsForTeamMode(teamMode) {
148
+ if (teamModeEnabled(teamMode))
149
+ return AGENT_DEFINITIONS;
150
+ return Object.fromEntries(Object.entries(AGENT_DEFINITIONS).filter(([name]) => !TEAM_MODE_NATIVE_AGENT_NAMES.has(name)));
151
+ }
88
152
  const REQUIRED_TEAM_CLI_API_MARKERS = [
89
153
  "if (subcommand === 'api')",
90
154
  "executeTeamApiOperation",
@@ -372,14 +436,17 @@ async function promptForFirstPartyMcpRemoval(configPath, registrationKinds) {
372
436
  }
373
437
  }
374
438
  function hasPersistedSetupPreferences(preferences) {
375
- return Boolean(preferences?.scope || preferences?.installMode);
439
+ return Boolean(preferences?.scope || preferences?.installMode || preferences?.teamMode);
376
440
  }
377
441
  function formatPersistedSetupPreferenceSummary(preferences) {
378
- return [
442
+ const summary = [
379
443
  `scope=${preferences.scope ?? "not recorded"}`,
380
444
  `installMode=${preferences.installMode ?? "not recorded"}`,
381
445
  `mcpMode=${preferences.mcpMode ?? "not recorded"}`,
382
- ].join(", ");
446
+ ];
447
+ if (preferences.teamMode)
448
+ summary.push(`teamMode=${preferences.teamMode}`);
449
+ return summary.join(", ");
383
450
  }
384
451
  async function promptForPersistedSetupReview(preferences) {
385
452
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
@@ -631,6 +698,8 @@ async function refreshOmxPluginDiscoveryCache(pkgRoot, options, codexHomeDir = c
631
698
  const hookFilesMissing = !existsSync(join(cacheDir, "hooks", "hooks.json"))
632
699
  || !existsSync(join(cacheDir, "hooks", "codex-native-hook.mjs"))
633
700
  || !existsSync(join(cacheDir, "hooks", "omx-command.json"));
701
+ const hookFilesChanged = !hookFilesMissing
702
+ && !(await pluginHookCacheMatchesPackaged(cacheDir, packagedMarketplace));
634
703
  const skillListChanged = expectedSkillNames !== null &&
635
704
  cachedSkillNames !== null &&
636
705
  JSON.stringify(cachedSkillNames) !== JSON.stringify(expectedSkillNames);
@@ -638,6 +707,7 @@ async function refreshOmxPluginDiscoveryCache(pkgRoot, options, codexHomeDir = c
638
707
  !skillsPointerChanged &&
639
708
  !hooksPointerChanged &&
640
709
  !hookFilesMissing &&
710
+ !hookFilesChanged &&
641
711
  !skillListChanged)
642
712
  continue;
643
713
  staleDirs.push(cacheDir);
@@ -656,6 +726,7 @@ async function refreshOmxPluginDiscoveryCache(pkgRoot, options, codexHomeDir = c
656
726
  ? `hooks pointer ${manifest.hooks ?? "missing"} -> ./hooks/hooks.json`
657
727
  : null,
658
728
  hookFilesMissing ? "plugin hook files missing" : null,
729
+ hookFilesChanged ? "plugin hook files changed" : null,
659
730
  skillListChanged ? "skill directory list changed" : null,
660
731
  ].filter(Boolean);
661
732
  console.log(` ${options.dryRun ? "would invalidate" : "invalidated"} Codex plugin discovery cache ${cacheDir} (${reasons.join(", ")})`);
@@ -1082,7 +1153,7 @@ async function cleanupPluginModeLegacyAgentsMd(agentsMdPath, backupContext, opti
1082
1153
  return true;
1083
1154
  }
1084
1155
  export async function setup(options = {}) {
1085
- const { force = false, dryRun = false, installMode: requestedInstallMode, mcpMode: requestedMcpMode, scope: requestedScope, verbose = false, setupScopePrompt, persistedSetupReviewPrompt, installModePrompt, modelUpgradePrompt, pluginAgentsMdPrompt, pluginDeveloperInstructionsPrompt, pluginDeveloperInstructionsOverwritePrompt, firstPartyMcpRemovalPrompt, } = options;
1156
+ const { force = false, dryRun = false, installMode: requestedInstallMode, mcpMode: requestedMcpMode, teamMode: requestedTeamMode, scope: requestedScope, verbose = false, setupScopePrompt, persistedSetupReviewPrompt, installModePrompt, modelUpgradePrompt, pluginAgentsMdPrompt, pluginDeveloperInstructionsPrompt, pluginDeveloperInstructionsOverwritePrompt, firstPartyMcpRemovalPrompt, } = options;
1086
1157
  const pkgRoot = getPackageRoot();
1087
1158
  const projectRoot = process.cwd();
1088
1159
  const persistedPreferences = await readPersistedSetupPreferences(projectRoot, { warnOnLegacyScope: true });
@@ -1097,8 +1168,12 @@ export async function setup(options = {}) {
1097
1168
  Boolean(persistedPreferences?.mcpMode) &&
1098
1169
  (!persistedPreferences?.scope ||
1099
1170
  persistedPreferences.scope === effectiveScopeForInstallMode);
1171
+ const wouldUsePersistedTeamMode = !requestedTeamMode &&
1172
+ Boolean(persistedPreferences?.teamMode) &&
1173
+ (!persistedPreferences?.scope ||
1174
+ persistedPreferences.scope === effectiveScopeForInstallMode);
1100
1175
  const shouldReviewPersistedSetup = hasPersistedSetupPreferences(persistedPreferences) &&
1101
- (wouldUsePersistedScope || wouldUsePersistedInstallMode || wouldUsePersistedMcpMode) &&
1176
+ (wouldUsePersistedScope || wouldUsePersistedInstallMode || wouldUsePersistedMcpMode || wouldUsePersistedTeamMode) &&
1102
1177
  (typeof persistedSetupReviewPrompt === "function" ||
1103
1178
  (process.stdin.isTTY && process.stdout.isTTY));
1104
1179
  if (shouldReviewPersistedSetup) {
@@ -1110,6 +1185,13 @@ export async function setup(options = {}) {
1110
1185
  const resolvedScope = await resolveSetupScope(projectRoot, requestedScope, persistedReviewDecision, persistedPreferences, setupScopePrompt);
1111
1186
  const resolvedInstallMode = await resolveSetupInstallMode(projectRoot, resolvedScope.scope, requestedInstallMode, installModePrompt, persistedReviewDecision, persistedPreferences);
1112
1187
  const resolvedMcpMode = resolveSetupMcpMode(resolvedScope.scope, requestedMcpMode, persistedReviewDecision, persistedPreferences);
1188
+ const resolvedTeamMode = requestedTeamMode
1189
+ ?? (persistedReviewDecision !== "reset" &&
1190
+ (!persistedPreferences?.scope || persistedPreferences.scope === resolvedScope.scope)
1191
+ ? persistedPreferences?.teamMode
1192
+ : undefined)
1193
+ ?? "enabled";
1194
+ const isTeamModeEnabled = teamModeEnabled(resolvedTeamMode);
1113
1195
  const scopeDirs = resolveScopeDirectories(resolvedScope.scope, projectRoot);
1114
1196
  const existingConfigForMcpMigration = existsSync(scopeDirs.codexConfigFile)
1115
1197
  ? await readFile(scopeDirs.codexConfigFile, "utf-8")
@@ -1163,6 +1245,7 @@ export async function setup(options = {}) {
1163
1245
  ? " (from .omx/setup-scope.json)"
1164
1246
  : "";
1165
1247
  console.log(`Using setup MCP mode: ${resolvedMcpMode.mcpMode}${mcpModeSourceMessage}\n`);
1248
+ console.log(`Using setup Team mode: ${resolvedTeamMode}\n`);
1166
1249
  if (shouldOfferFirstPartyMcpRemoval) {
1167
1250
  if (removeFirstPartyMcpRegistrations) {
1168
1251
  console.log("Deprecated first-party OMX MCP registrations will be removed from config.toml during this setup run.\n");
@@ -1200,6 +1283,9 @@ export async function setup(options = {}) {
1200
1283
  const setupPreferencesToPersist = {
1201
1284
  scope: resolvedScope.scope,
1202
1285
  mcpMode: resolvedMcpMode.mcpMode,
1286
+ ...(requestedTeamMode || persistedPreferences?.teamMode || resolvedTeamMode === "disabled"
1287
+ ? { teamMode: resolvedTeamMode }
1288
+ : {}),
1203
1289
  ...(resolvedInstallMode &&
1204
1290
  (resolvedScope.scope === "user" ||
1205
1291
  resolvedInstallMode.installMode === "plugin")
@@ -1234,7 +1320,7 @@ export async function setup(options = {}) {
1234
1320
  : " Prompt refresh skipped; no legacy OMX-managed prompt files found.\n");
1235
1321
  }
1236
1322
  else {
1237
- summary.prompts = await installPrompts(promptsSrc, promptsDst, backupContext, { force, dryRun, verbose });
1323
+ summary.prompts = await installPrompts(promptsSrc, promptsDst, backupContext, { force, dryRun, verbose, teamMode: resolvedTeamMode });
1238
1324
  const cleanedLegacyPromptShims = await cleanupLegacySkillPromptShims(promptsSrc, promptsDst, {
1239
1325
  dryRun,
1240
1326
  verbose,
@@ -1282,6 +1368,7 @@ export async function setup(options = {}) {
1282
1368
  force,
1283
1369
  dryRun,
1284
1370
  verbose,
1371
+ teamMode: resolvedTeamMode,
1285
1372
  });
1286
1373
  }
1287
1374
  if (catalogCounts) {
@@ -1299,6 +1386,7 @@ export async function setup(options = {}) {
1299
1386
  dryRun,
1300
1387
  verbose,
1301
1388
  preserveUnmanagedObsoleteNativeAgents: true,
1389
+ teamMode: resolvedTeamMode,
1302
1390
  });
1303
1391
  console.log(` Native agent role refresh complete (${scopeDirs.nativeAgentsDir}); plugin mode still installs role TOML so agent_type routing works.\n`);
1304
1392
  }
@@ -1307,6 +1395,7 @@ export async function setup(options = {}) {
1307
1395
  force,
1308
1396
  dryRun,
1309
1397
  verbose,
1398
+ teamMode: resolvedTeamMode,
1310
1399
  });
1311
1400
  console.log(` Native agent refresh complete (${scopeDirs.nativeAgentsDir}).\n`);
1312
1401
  }
@@ -1385,7 +1474,7 @@ export async function setup(options = {}) {
1385
1474
  else if (pluginCacheRefresh.status === "unchanged") {
1386
1475
  console.log(" Codex plugin discovery cache already matches packaged plugin metadata.");
1387
1476
  }
1388
- const pluginCacheMaterialize = await materializePackagedOmxPluginCache(scopeDirs.codexHomeDir, packagedMarketplace, { dryRun });
1477
+ const pluginCacheMaterialize = await materializePackagedOmxPluginCache(scopeDirs.codexHomeDir, packagedMarketplace, { dryRun, teamMode: resolvedTeamMode });
1389
1478
  if (pluginCacheMaterialize.status === "materialized") {
1390
1479
  console.log(` ${dryRun ? "Would install" : "Installed"} local Codex plugin cache for ${OMX_LOCAL_MARKETPLACE_NAME}/${OMX_PLUGIN_NAME} at ${pluginCacheMaterialize.cacheDir}.`);
1391
1480
  }
@@ -1451,15 +1540,20 @@ export async function setup(options = {}) {
1451
1540
  await syncManagedWindowsNativeHookShim(scopeDirs.codexHomeDir, pkgRoot, summary.config, backupContext, { dryRun, verbose });
1452
1541
  console.log(` Native Codex hooks refresh complete (${scopeDirs.codexHooksFile}).\n`);
1453
1542
  }
1454
- // Step 5.5: Verify team CLI interop surface is available.
1543
+ // Step 5.5: Verify team CLI interop surface is available when Team is enabled.
1455
1544
  console.log("[5.5/8] Verifying Team CLI API interop...");
1456
- const teamToolsCheck = await verifyTeamCliApiInterop(pkgRoot);
1457
- if (teamToolsCheck.ok) {
1458
- console.log(" omx team api command detected (CLI-first interop ready)");
1545
+ if (isTeamModeEnabled) {
1546
+ const teamToolsCheck = await verifyTeamCliApiInterop(pkgRoot);
1547
+ if (teamToolsCheck.ok) {
1548
+ console.log(" omx team api command detected (CLI-first interop ready)");
1549
+ }
1550
+ else {
1551
+ console.log(` WARNING: ${teamToolsCheck.message}`);
1552
+ console.log(" Run `npm run build` and then re-run `omx setup`.");
1553
+ }
1459
1554
  }
1460
1555
  else {
1461
- console.log(` WARNING: ${teamToolsCheck.message}`);
1462
- console.log(" Run `npm run build` and then re-run `omx setup`.");
1556
+ console.log(" Skipped because Team mode is disabled for this setup.");
1463
1557
  }
1464
1558
  console.log();
1465
1559
  // Step 6: Generate AGENTS.md
@@ -1477,7 +1571,8 @@ export async function setup(options = {}) {
1477
1571
  const modelTableContext = resolveAgentsModelTableContext(resolvedConfig, {
1478
1572
  codexHomeOverride: scopeDirs.codexHomeDir,
1479
1573
  });
1480
- const rewritten = upsertAgentsModelTable(addGeneratedAgentsMarker(applyPluginModeWordingToAgentsTemplate(content, resolvedScope.scope)), modelTableContext);
1574
+ const modelTableDefinitions = getAgentsModelTableDefinitionsForTeamMode(resolvedTeamMode);
1575
+ const rewritten = upsertAgentsModelTable(addGeneratedAgentsMarker(applyTeamModeToAgentsTemplate(applyPluginModeWordingToAgentsTemplate(content, resolvedScope.scope), resolvedTeamMode)), modelTableContext, modelTableDefinitions);
1481
1576
  const result = await syncManagedAgentsContent(rewritten, pluginAgentsMdDst, summary.agentsMd, backupContext, {
1482
1577
  agentsOverwritePrompt: options.agentsOverwritePrompt,
1483
1578
  dryRun,
@@ -1526,9 +1621,11 @@ export async function setup(options = {}) {
1526
1621
  const modelTableContext = resolveAgentsModelTableContext(resolvedConfig, {
1527
1622
  codexHomeOverride: scopeDirs.codexHomeDir,
1528
1623
  });
1529
- const rewritten = upsertAgentsModelTable(addGeneratedAgentsMarker(applyScopePathRewritesToAgentsTemplate(content, resolvedScope.scope)), modelTableContext);
1624
+ const modelTableDefinitions = getAgentsModelTableDefinitionsForTeamMode(resolvedTeamMode);
1625
+ const rewritten = upsertAgentsModelTable(addGeneratedAgentsMarker(applyTeamModeToAgentsTemplate(applyScopePathRewritesToAgentsTemplate(content, resolvedScope.scope), resolvedTeamMode)), modelTableContext, modelTableDefinitions);
1530
1626
  let changed = true;
1531
1627
  let canApplyManagedModelRefresh = false;
1628
+ let canApplyManagedRefreshDuringActiveSession = false;
1532
1629
  let managedRefreshContent = "";
1533
1630
  let canApplyManagedAgentsMerge = false;
1534
1631
  let mergedAgentsContent = "";
@@ -1546,15 +1643,25 @@ export async function setup(options = {}) {
1546
1643
  }
1547
1644
  else {
1548
1645
  if (hasOmxManagedAgentsSections(existing)) {
1549
- managedRefreshContent = upsertAgentsModelTable(existing, modelTableContext);
1646
+ const existingIsGeneratedAgentsMd = isOmxGeneratedAgentsMd(existing);
1647
+ managedRefreshContent = teamModeEnabled(resolvedTeamMode)
1648
+ ? upsertAgentsModelTable(existing, modelTableContext, modelTableDefinitions)
1649
+ : existingIsGeneratedAgentsMd
1650
+ ? rewritten
1651
+ : upsertManagedAgentsBlock(existing, rewritten);
1550
1652
  canApplyManagedModelRefresh = managedRefreshContent !== existing;
1653
+ canApplyManagedRefreshDuringActiveSession =
1654
+ canApplyManagedModelRefresh &&
1655
+ !teamModeEnabled(resolvedTeamMode) &&
1656
+ existingIsGeneratedAgentsMd;
1551
1657
  }
1552
1658
  }
1553
1659
  }
1554
1660
  if (resolvedScope.scope === "project" &&
1555
1661
  sessionIsActive &&
1556
1662
  agentsMdExists &&
1557
- (changed || canApplyManagedAgentsMerge || canApplyManagedModelRefresh)) {
1663
+ (changed || canApplyManagedAgentsMerge || canApplyManagedModelRefresh) &&
1664
+ !canApplyManagedRefreshDuringActiveSession) {
1558
1665
  summary.agentsMd.skipped += 1;
1559
1666
  console.log(" WARNING: Active omx session detected (pid " +
1560
1667
  activeSession?.pid +
@@ -1833,6 +1940,13 @@ async function installPrompts(srcDir, dstDir, backupContext, options) {
1833
1940
  if (!file.endsWith(".md"))
1834
1941
  continue;
1835
1942
  const promptName = file.slice(0, -3);
1943
+ if (!teamModeEnabled(options.teamMode) && TEAM_MODE_PROMPT_NAMES.has(promptName)) {
1944
+ summary.skipped += 1;
1945
+ if (options.verbose) {
1946
+ console.log(` skipped ${file} (Team mode disabled)`);
1947
+ }
1948
+ continue;
1949
+ }
1836
1950
  const status = agentStatusByName?.get(promptName);
1837
1951
  if (manifest && !isSetupPromptAssetName(promptName, manifest)) {
1838
1952
  summary.skipped += 1;
@@ -1849,14 +1963,17 @@ async function installPrompts(srcDir, dstDir, backupContext, options) {
1849
1963
  continue;
1850
1964
  await syncManagedFileFromDisk(src, dst, summary, backupContext, options, `prompt ${file}`);
1851
1965
  }
1852
- if (options.force && manifest && existsSync(dstDir)) {
1966
+ if (manifest && existsSync(dstDir)) {
1853
1967
  const installedFiles = await readdir(dstDir);
1854
1968
  for (const file of installedFiles) {
1855
1969
  if (!file.endsWith(".md"))
1856
1970
  continue;
1857
1971
  const promptName = file.slice(0, -3);
1858
1972
  const status = agentStatusByName?.get(promptName);
1859
- if (isSetupPromptAssetName(promptName, manifest))
1973
+ const disabledTeamPrompt = !teamModeEnabled(options.teamMode) && TEAM_MODE_PROMPT_NAMES.has(promptName);
1974
+ if (isSetupPromptAssetName(promptName, manifest) && !disabledTeamPrompt)
1975
+ continue;
1976
+ if (!options.force && !disabledTeamPrompt)
1860
1977
  continue;
1861
1978
  const stalePromptPath = join(dstDir, file);
1862
1979
  if (!existsSync(stalePromptPath))
@@ -1873,7 +1990,8 @@ async function installPrompts(srcDir, dstDir, backupContext, options) {
1873
1990
  ? "would remove stale prompt"
1874
1991
  : "removed stale prompt";
1875
1992
  const label = status ?? "unlisted";
1876
- console.log(` ${prefix} ${file} (status: ${label})`);
1993
+ const reason = disabledTeamPrompt ? ", Team mode disabled" : "";
1994
+ console.log(` ${prefix} ${file} (status: ${label}${reason})`);
1877
1995
  }
1878
1996
  }
1879
1997
  }
@@ -1943,6 +2061,13 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
1943
2061
  : Object.keys(AGENT_DEFINITIONS).sort();
1944
2062
  for (const name of nativeAgentNames) {
1945
2063
  staleCandidateNativeAgentNames.add(name);
2064
+ if (!teamModeEnabled(options.teamMode) && TEAM_MODE_NATIVE_AGENT_NAMES.has(name)) {
2065
+ summary.skipped += 1;
2066
+ if (options.verbose) {
2067
+ console.log(` skipped native agent ${name}.toml (Team mode disabled)`);
2068
+ }
2069
+ continue;
2070
+ }
1946
2071
  const agent = AGENT_DEFINITIONS[name];
1947
2072
  if (!agent) {
1948
2073
  if (options.verbose) {
@@ -1968,14 +2093,17 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
1968
2093
  summary.backedUp += generatedCleanup.backedUp;
1969
2094
  summary.removed += generatedCleanup.removed;
1970
2095
  }
1971
- if (options.force && manifest && existsSync(agentsDir)) {
2096
+ if (manifest && existsSync(agentsDir)) {
1972
2097
  const installedFiles = await readdir(agentsDir);
1973
2098
  for (const file of installedFiles) {
1974
2099
  if (!file.endsWith(".toml"))
1975
2100
  continue;
1976
2101
  const agentName = file.slice(0, -5);
1977
2102
  const agentStatus = agentStatusByName?.get(agentName);
1978
- if (isNativeAgentInstallableStatus(agentStatus))
2103
+ const disabledTeamAgent = !teamModeEnabled(options.teamMode) && TEAM_MODE_NATIVE_AGENT_NAMES.has(agentName);
2104
+ if (isNativeAgentInstallableStatus(agentStatus) && !disabledTeamAgent)
2105
+ continue;
2106
+ if (!options.force && !disabledTeamAgent)
1979
2107
  continue;
1980
2108
  if (!staleCandidateNativeAgentNames.has(agentName) &&
1981
2109
  agentStatus === undefined)
@@ -1995,7 +2123,8 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
1995
2123
  ? "would remove stale native agent"
1996
2124
  : "removed stale native agent";
1997
2125
  const label = agentStatus ?? "unlisted";
1998
- console.log(` ${prefix} ${file} (status: ${label})`);
2126
+ const reason = disabledTeamAgent ? ", Team mode disabled" : "";
2127
+ console.log(` ${prefix} ${file} (status: ${label}${reason})`);
1999
2128
  }
2000
2129
  }
2001
2130
  }
@@ -2060,6 +2189,13 @@ export async function installSkills(srcDir, dstDir, backupContext, options) {
2060
2189
  if (!entry.isDirectory())
2061
2190
  continue;
2062
2191
  staleCandidateSkillNames.add(entry.name);
2192
+ if (!teamModeEnabled(options.teamMode) && TEAM_MODE_SKILL_NAMES.has(entry.name)) {
2193
+ summary.skipped += 1;
2194
+ if (options.verbose) {
2195
+ console.log(` skipped ${entry.name}/ (Team mode disabled)`);
2196
+ }
2197
+ continue;
2198
+ }
2063
2199
  const status = skillStatusByName?.get(entry.name);
2064
2200
  if (skillStatusByName && !isSetupInstallableSkill(entry.name, status)) {
2065
2201
  summary.skipped += 1;
@@ -2107,10 +2243,11 @@ export async function installSkills(srcDir, dstDir, backupContext, options) {
2107
2243
  if (manifest && existsSync(dstDir)) {
2108
2244
  for (const staleSkill of staleCandidateSkillNames) {
2109
2245
  const status = skillStatusByName?.get(staleSkill);
2110
- if (isSetupInstallableSkill(staleSkill, status))
2246
+ const disabledTeamSkill = !teamModeEnabled(options.teamMode) && TEAM_MODE_SKILL_NAMES.has(staleSkill);
2247
+ if (isSetupInstallableSkill(staleSkill, status) && !disabledTeamSkill)
2111
2248
  continue;
2112
2249
  const hardDeprecated = HARD_DEPRECATED_SKILL_NAMES.has(staleSkill);
2113
- if (!options.force && !hardDeprecated)
2250
+ if (!options.force && !hardDeprecated && !disabledTeamSkill)
2114
2251
  continue;
2115
2252
  const staleSkillDir = join(dstDir, staleSkill);
2116
2253
  if (!existsSync(staleSkillDir))
@@ -2124,7 +2261,9 @@ export async function installSkills(srcDir, dstDir, backupContext, options) {
2124
2261
  ? "would remove stale skill"
2125
2262
  : "removed stale skill";
2126
2263
  const label = status ?? "unlisted";
2127
- const reason = hardDeprecated ? ", hard-deprecated" : "";
2264
+ const reason = disabledTeamSkill
2265
+ ? ", Team mode disabled"
2266
+ : hardDeprecated ? ", hard-deprecated" : "";
2128
2267
  console.log(` ${prefix} ${staleSkill}/ (status: ${label}${reason})`);
2129
2268
  }
2130
2269
  }