@gajae-code/coding-agent 0.13.3 → 0.14.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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +1 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -1,19 +1,23 @@
1
1
  /**
2
- * Handles `gjc skills` for inspecting bundled workflow skill definitions.
2
+ * Handles `gjc skills` for inspecting bundled workflow skills and
3
+ * filesystem-discovered custom skills.
3
4
  */
5
+ import { Settings } from "../config/settings";
4
6
  import {
5
7
  DEFAULT_GJC_DEFINITION_NAMES,
6
8
  type EmbeddedDefaultGjcSkill,
7
9
  getEmbeddedDefaultGjcSkills,
8
10
  } from "../defaults/gjc-defaults";
11
+ import { discoverRuntimeSkills, type RuntimeSkillDiscoveryCandidate } from "../extensibility/runtime-skill-discovery";
9
12
 
10
- export type SkillsAction = "list" | "read";
13
+ export type SkillsAction = "list" | "read" | "discover";
11
14
 
12
15
  export interface SkillsCommandArgs {
13
16
  action: SkillsAction;
14
17
  name?: string;
15
18
  flags?: {
16
19
  json?: boolean;
20
+ source?: "all" | "project" | "user";
17
21
  };
18
22
  }
19
23
 
@@ -45,6 +49,11 @@ function writeJson(value: unknown): void {
45
49
  process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
46
50
  }
47
51
 
52
+ function formatCandidate(candidate: RuntimeSkillDiscoveryCandidate): string {
53
+ const useWhen = candidate.useWhen && candidate.useWhen.length > 0 ? ` [when: ${candidate.useWhen.join(", ")}]` : "";
54
+ return `${candidate.name}\t${candidate.source}\t${candidate.description}\t${candidate.path}${useWhen}`;
55
+ }
56
+
48
57
  export async function runSkillsCommand(cmd: SkillsCommandArgs): Promise<void> {
49
58
  if (cmd.action === "list") {
50
59
  const skills = listEmbeddedSkills();
@@ -58,6 +67,33 @@ export async function runSkillsCommand(cmd: SkillsCommandArgs): Promise<void> {
58
67
  return;
59
68
  }
60
69
 
70
+ if (cmd.action === "discover") {
71
+ const source = cmd.flags?.source ?? "all";
72
+ const settings = await Settings.loadForScope({ cwd: process.cwd() });
73
+ const result = await discoverRuntimeSkills({
74
+ cwd: process.cwd(),
75
+ source,
76
+ policy: {
77
+ ...settings.getGroup("skills"),
78
+ disabledExtensions: settings.get("disabledExtensions"),
79
+ },
80
+ });
81
+ if (cmd.flags?.json) {
82
+ writeJson({ candidates: result.candidates, diagnostics: result.diagnostics.messages });
83
+ return;
84
+ }
85
+ for (const candidate of result.candidates) {
86
+ process.stdout.write(`${formatCandidate(candidate)}\n`);
87
+ }
88
+ if (result.diagnostics.messages.length > 0) {
89
+ process.stdout.write("\nDiagnostics:\n");
90
+ for (const message of result.diagnostics.messages) {
91
+ process.stdout.write(`- ${message}\n`);
92
+ }
93
+ }
94
+ return;
95
+ }
96
+
61
97
  const name = cmd.name?.trim();
62
98
  if (!name) {
63
99
  process.stderr.write(`error: skill name is required for read (${DEFAULT_GJC_DEFINITION_NAMES.join(", ")})\n`);
@@ -10,15 +10,19 @@ import { pipeline } from "node:stream/promises";
10
10
  import { $which, APP_NAME, isEnoent, VERSION } from "@gajae-code/utils";
11
11
  import { $ } from "bun";
12
12
  import chalk from "chalk";
13
+ import { Settings } from "../config/settings";
13
14
  import { distTagForChannel, isUpdateChannel, UPDATE_CHANNELS, type UpdateChannel } from "../config/update-channel";
14
15
  import { installDefaultGjcDefinitions } from "../defaults/gjc-defaults";
15
16
  import { theme } from "../modes/theme/theme";
17
+ import { getNotificationConfig, type NotificationProvider, resolveNotificationProvider } from "../sdk/bus/config";
16
18
  import {
17
19
  DEFAULT_NPM_REGISTRY,
18
20
  fetchLatestPackageVersion,
19
21
  type Installer,
20
22
  type NpmRegistryLookupOptions,
21
23
  } from "../utils/npm-registry";
24
+ import { runDaemonCommand } from "./daemon-cli";
25
+ import { runNotifyCommand } from "./notify-cli";
22
26
 
23
27
  const RELEASE_REPO = "Yeachan-Heo/gajae-code";
24
28
  const PACKAGE = "@gajae-code/coding-agent";
@@ -602,9 +606,9 @@ async function updateViaPackageManager(options: PackageManagerUpdateOptions): Pr
602
606
  /**
603
607
  * Update via bun package manager.
604
608
  */
605
- async function updateViaBun(expectedVersion: string): Promise<void> {
609
+ async function updateViaBun(expectedVersion: string): Promise<InstalledVersionVerification> {
606
610
  console.log(chalk.dim("Updating via bun..."));
607
- await updateViaPackageManager({
611
+ return await updateViaPackageManager({
608
612
  managerName: "bun",
609
613
  expectedVersion,
610
614
  runInstall: async version => await $`bun install -g ${PACKAGE}@${version}`.nothrow(),
@@ -612,9 +616,9 @@ async function updateViaBun(expectedVersion: string): Promise<void> {
612
616
  });
613
617
  }
614
618
 
615
- async function updateViaNpm(packageName: string, expectedVersion: string): Promise<void> {
619
+ async function updateViaNpm(packageName: string, expectedVersion: string): Promise<InstalledVersionVerification> {
616
620
  console.log(chalk.dim(`Updating npm-managed install via npm (${packageName})...`));
617
- await updateViaPackageManager({
621
+ return await updateViaPackageManager({
618
622
  managerName: "npm",
619
623
  expectedVersion,
620
624
  runInstall: async version => await $`npm install -g ${packageName}@${version}`.nothrow(),
@@ -735,7 +739,11 @@ function formatRegistryProvenance(version: string, registry: string | undefined)
735
739
  /**
736
740
  * Download a release binary to a target path, replacing an existing file.
737
741
  */
738
- async function updateViaBinaryAt(targetPath: string, expectedVersion: string, registry?: string): Promise<void> {
742
+ async function updateViaBinaryAt(
743
+ targetPath: string,
744
+ expectedVersion: string,
745
+ registry?: string,
746
+ ): Promise<InstalledVersionVerification> {
739
747
  const binaryName = getBinaryName();
740
748
  const url = buildReleaseBinaryUrl(expectedVersion);
741
749
  const registryNote = formatRegistryProvenance(expectedVersion, registry);
@@ -753,6 +761,7 @@ async function updateViaBinaryAt(targetPath: string, expectedVersion: string, re
753
761
  printVerifiedVersion(expectedVersion);
754
762
  if (verification.cleanupWarning) console.warn(chalk.yellow(verification.cleanupWarning));
755
763
  printRestartGuidance();
764
+ return verification;
756
765
  }
757
766
 
758
767
  /**
@@ -761,18 +770,151 @@ async function updateViaBinaryAt(targetPath: string, expectedVersion: string, re
761
770
  export interface UpdateCommandDependencies {
762
771
  getLatestRelease?: (options?: LatestReleaseLookupOptions) => Promise<ReleaseInfo>;
763
772
  resolveUpdateTarget?: () => Promise<UpdateTarget>;
764
- performUpdate?: (target: UpdateTarget, expectedVersion: string, registry?: string) => Promise<void>;
773
+ performUpdate?: (
774
+ target: UpdateTarget,
775
+ expectedVersion: string,
776
+ registry?: string,
777
+ ) => Promise<InstalledVersionVerification | undefined>;
765
778
  refreshInstalledDefaultSkills?: () => Promise<void>;
779
+ settings?: () => Promise<Settings>;
780
+ stopDaemon?: (settings: Settings) => Promise<void>;
781
+ restartDaemon?: (settings: Settings) => Promise<void>;
782
+ recoverNotifications?: (settings: Settings) => Promise<void>;
783
+ runPostUpdateRecovery?: (runtimePath: string) => Promise<void>;
766
784
  exit?: (code: number) => never;
767
785
  }
768
786
 
769
- async function performUpdate(target: UpdateTarget, expectedVersion: string, registry?: string): Promise<void> {
787
+ export type PostUpdateRecoverySpawn = (argv: string[]) => Promise<number>;
788
+ export type PostUpdateRecoverySupportCheck = (runtimePath: string) => Promise<boolean>;
789
+ export type LegacyRecoveryDaemonKinds = () => Promise<NotificationProvider[]>;
790
+
791
+ /**
792
+ * A complete, non-quarantined provider with provider-level desired intent is a
793
+ * durable managed-notify setup. The global switch is deliberately excluded:
794
+ * disabling delivery must not leave credential-backed daemon locks unrecovered.
795
+ */
796
+ export function hasManagedNotifySetup(settings: Settings): boolean {
797
+ return managedNotifyDaemonKinds(settings).length > 0;
798
+ }
799
+
800
+ function managedNotifyDaemonKinds(settings: Settings): NotificationProvider[] {
801
+ const config = getNotificationConfig(settings);
802
+ return (["telegram", "discord", "slack"] as const).filter(provider => {
803
+ const resolution = resolveNotificationProvider(config, provider);
804
+ return resolution.configured && !resolution.quarantined && resolution.desiredEnabled;
805
+ });
806
+ }
807
+
808
+ async function stopManagedDaemon(settings: Settings): Promise<void> {
809
+ const kinds = managedNotifyDaemonKinds(settings);
810
+ let failed = false;
811
+ await runDaemonCommand(
812
+ { action: "stop", kinds, all: false, json: false, force: true },
813
+ {
814
+ settings,
815
+ setExitCode: code => {
816
+ if (code !== 0) failed = true;
817
+ },
818
+ },
819
+ );
820
+ if (failed) throw new Error("daemon stop reported failure");
821
+ }
822
+
823
+ async function restartManagedDaemon(settings: Settings): Promise<void> {
824
+ const kinds = managedNotifyDaemonKinds(settings);
825
+ let failed = false;
826
+ await runDaemonCommand(
827
+ { action: "restart", kinds, all: false, json: false, force: false, allowDisabledNoop: true },
828
+ {
829
+ settings,
830
+ setExitCode: code => {
831
+ if (code !== 0) failed = true;
832
+ },
833
+ },
834
+ );
835
+ if (failed) throw new Error("daemon restart reported failure");
836
+ }
837
+
838
+ async function recoverManagedNotifications(settings: Settings): Promise<void> {
839
+ await runNotifyCommand({ action: "recovery", rawArgs: [], forceDaemonLock: false }, { settings });
840
+ }
841
+
842
+ async function spawnPostUpdateRecovery(argv: string[]): Promise<number> {
843
+ const child = Bun.spawn(argv, { stdin: "inherit", stdout: "inherit", stderr: "inherit" });
844
+ return await child.exited;
845
+ }
846
+
847
+ async function supportsUpdateRecovery(runtimePath: string): Promise<boolean> {
848
+ const child = Bun.spawn([runtimePath, "update", "--help"], { stdout: "pipe", stderr: "pipe" });
849
+ const [exitCode, stdout] = await Promise.all([child.exited, new Response(child.stdout).text()]);
850
+ return exitCode === 0 && stdout.includes("update-recovery");
851
+ }
852
+
853
+ async function runLegacyPostUpdateRecovery(
854
+ runtimePath: string,
855
+ spawn: PostUpdateRecoverySpawn,
856
+ managedKinds: LegacyRecoveryDaemonKinds,
857
+ ): Promise<void> {
858
+ const kinds = await managedKinds();
859
+ if (kinds.length === 0) return;
860
+ for (const [name, argv] of [
861
+ ["daemon stop --force", [runtimePath, "daemon", "stop", ...kinds, "--force"]],
862
+ ["daemon reload", [runtimePath, "daemon", "reload", ...kinds]],
863
+ ["notify recovery", [runtimePath, "notify", "recovery"]],
864
+ ] as const) {
865
+ const exitCode = await spawn([...argv]);
866
+ if (exitCode !== 0) throw new Error(`legacy post-update ${name} exited ${exitCode}`);
867
+ }
868
+ }
869
+
870
+ export async function runPostUpdateRecoveryForTest(
871
+ runtimePath: string,
872
+ spawn: PostUpdateRecoverySpawn = spawnPostUpdateRecovery,
873
+ supportsRecovery: PostUpdateRecoverySupportCheck = supportsUpdateRecovery,
874
+ managedKinds: LegacyRecoveryDaemonKinds = async () => managedNotifyDaemonKinds(await Settings.init()),
875
+ ): Promise<void> {
876
+ if (!(await supportsRecovery(runtimePath))) {
877
+ await runLegacyPostUpdateRecovery(runtimePath, spawn, managedKinds);
878
+ return;
879
+ }
880
+ const exitCode = await spawn([runtimePath, "update", "update-recovery"]);
881
+ if (exitCode !== 0) throw new Error(`the verified installed runtime exited ${exitCode}`);
882
+ }
883
+
884
+ async function runPostUpdateRecovery(runtimePath: string): Promise<void> {
885
+ await runPostUpdateRecoveryForTest(runtimePath);
886
+ }
887
+
888
+ export async function runManagedNotifyRecovery(
889
+ deps: Pick<UpdateCommandDependencies, "settings" | "stopDaemon" | "restartDaemon" | "recoverNotifications">,
890
+ ): Promise<void> {
891
+ const settings = await (deps.settings ?? (() => Settings.init()))();
892
+ if (!hasManagedNotifySetup(settings)) return;
893
+ const stages: readonly [string, (settings: Settings) => Promise<void>][] = [
894
+ ["daemon stop --force", deps.stopDaemon ?? stopManagedDaemon],
895
+ ["daemon restart", deps.restartDaemon ?? restartManagedDaemon],
896
+ ["notify recovery", deps.recoverNotifications ?? recoverManagedNotifications],
897
+ ];
898
+ for (const [name, run] of stages) {
899
+ try {
900
+ await run(settings);
901
+ } catch (error) {
902
+ throw new Error(`Post-update ${name} failed: ${error instanceof Error ? error.message : String(error)}`);
903
+ }
904
+ }
905
+ }
906
+
907
+ async function performUpdate(
908
+ target: UpdateTarget,
909
+ expectedVersion: string,
910
+ registry?: string,
911
+ ): Promise<InstalledVersionVerification> {
770
912
  if (target.method === "bun") {
771
- await updateViaBun(expectedVersion);
913
+ return await updateViaBun(expectedVersion);
772
914
  } else if (target.method === "npm") {
773
- await updateViaNpm(target.packageName, expectedVersion);
915
+ return await updateViaNpm(target.packageName, expectedVersion);
774
916
  } else {
775
- await updateViaBinaryAt(target.path, expectedVersion, registry);
917
+ return await updateViaBinaryAt(target.path, expectedVersion, registry);
776
918
  }
777
919
  }
778
920
 
@@ -881,14 +1023,24 @@ export async function runUpdateCommand(
881
1023
 
882
1024
  if (opts.check) return;
883
1025
 
1026
+ let installedVersion: string | undefined;
884
1027
  try {
885
1028
  const resolved = target ?? (await resolveTarget());
886
- await update(resolved, release.version, release.registry);
1029
+ const verification = await update(resolved, release.version, release.registry);
1030
+ if (verification?.path) {
1031
+ installedVersion = release.version;
1032
+ await (deps.runPostUpdateRecovery ?? runPostUpdateRecovery)(verification.path);
1033
+ } else if (!deps.performUpdate) throw new Error("verified installed runtime path is unavailable");
887
1034
  } catch (err) {
888
- console.error(chalk.red(`Update failed: ${err}`));
1035
+ const prefix = installedVersion
1036
+ ? `Updated to ${installedVersion}, but post-update recovery failed`
1037
+ : "Update failed";
1038
+ console.error(chalk.red(`${prefix}: ${err}`));
889
1039
  return exit(1);
890
1040
  }
891
1041
 
1042
+ // The installed runtime completes recovery before this old updater process
1043
+ // refreshes opt-in local definitions, avoiding stale-module daemon control.
892
1044
  await refreshDefaults();
893
1045
  }
894
1046
 
@@ -927,6 +1079,9 @@ ${chalk.bold("Options:")}
927
1079
  -f, --force Force reinstall even if up to date
928
1080
  --channel <stable|nightly> Release channel to update from (default: stable or startup.updateChannel setting)
929
1081
 
1082
+ ${chalk.bold("After a verified update:")}
1083
+ When a complete managed notification provider is configured, GJC serially stops the daemon with --force, restarts it, then runs notify recovery. Globally disabled delivery still receives this lock recovery.
1084
+
930
1085
  ${chalk.bold("Examples:")}
931
1086
  ${APP_NAME} update Update to latest version
932
1087
  ${APP_NAME} update --check Check if updates are available
package/src/cli.ts CHANGED
@@ -39,11 +39,13 @@ export const commands: CommandEntry[] = [
39
39
  { name: "auth-gateway", load: () => import("./commands/auth-gateway").then(m => m.default) },
40
40
  { name: "skills", load: () => import("./commands/skills").then(m => m.default) },
41
41
  { name: "session", load: () => import("./commands/session").then(m => m.default) },
42
+ { name: "accounts", load: () => import("./commands/accounts").then(m => m.default) },
42
43
  { name: "harness", load: () => import("./commands/harness").then(m => m.default) },
43
44
  { name: "coordinator", load: () => import("./commands/coordinator").then(m => m.default) },
44
45
  { name: "team", load: () => import("./commands/team").then(m => m.default) },
45
46
  { name: "ultragoal", load: () => import("./commands/ultragoal").then(m => m.default) },
46
47
  { name: "gc", load: () => import("./commands/gc").then(m => m.default) },
48
+ { name: "crash", load: () => import("./commands/crash").then(m => m.default) },
47
49
  { name: "ralplan", load: () => import("./commands/ralplan").then(m => m.default) },
48
50
  { name: "config", load: () => import("./commands/config").then(m => m.default) },
49
51
  { name: "stats", load: () => import("./commands/stats").then(m => m.default) },
@@ -64,6 +66,7 @@ export const commands: CommandEntry[] = [
64
66
  { name: "rlm", load: () => import("./commands/rlm").then(m => m.default) },
65
67
  { name: "update", load: () => import("./commands/update").then(m => m.default) },
66
68
  { name: "read", load: () => import("./commands/read").then(m => m.default) },
69
+ { name: "customize", load: () => import("./commands/customize").then(m => m.default) },
67
70
  { name: "plugin", load: () => import("./commands/plugin").then(m => m.default) },
68
71
  { name: "completion", load: () => import("./commands/completion").then(m => m.default) },
69
72
  { name: "launch", load: () => import("./commands/launch").then(m => m.default) },
@@ -302,6 +305,7 @@ export class RootHelpCommand extends Command {
302
305
  `# Use different model (fuzzy matching)\n ${APP_NAME} --model opus "Help me refactor this code"`,
303
306
  `# Limit model cycling to specific models\n ${APP_NAME} --models claude-sonnet,claude-haiku,gpt-4o`,
304
307
  `# Pin a stored credential for this session\n ${APP_NAME} --credential email:me@example.com`,
308
+ `# Prefer a stored credential, falling back on quota limits\n ${APP_NAME} --prefer-credential id:15`,
305
309
  `# Activate a model profile for this session\n ${APP_NAME} --mpreset codex-medium`,
306
310
  `# Persist a model profile as the default\n ${APP_NAME} --mpreset opencodego --default`,
307
311
  `# Export a session file to HTML\n ${APP_NAME} --export ~/.gjc/agent/sessions/--path--/session.jsonl`,
@@ -0,0 +1,71 @@
1
+ /** Manage stored OAuth accounts without exposing credential payloads. */
2
+ import { Args, Command, Flags, renderCommandHelp } from "@gajae-code/utils/cli";
3
+ import {
4
+ ACCOUNTS_ACTIONS,
5
+ type AccountsAction,
6
+ type AccountsCommandArgs,
7
+ runAccountsCommand,
8
+ } from "../cli/accounts-cli";
9
+
10
+ export default class Accounts extends Command {
11
+ static description = "List, check, pin, and remove stored OAuth accounts";
12
+ static strict = true;
13
+
14
+ static args = {
15
+ action: Args.string({
16
+ description: "Account action",
17
+ required: false,
18
+ options: [...ACCOUNTS_ACTIONS],
19
+ }),
20
+ provider: Args.string({
21
+ description: "Provider id",
22
+ required: false,
23
+ }),
24
+ selector: Args.string({
25
+ description: "Account selector (bare email, id:, email:, or account:)",
26
+ required: false,
27
+ }),
28
+ };
29
+
30
+ static flags = {
31
+ json: Flags.boolean({ description: "Output safe machine-readable JSON" }),
32
+ persistent: Flags.boolean({ description: "Required for persistent pin changes" }),
33
+ clear: Flags.boolean({ description: "Clear the persistent pin" }),
34
+ account: Flags.string({ description: "Logout one account by row id or email" }),
35
+ all: Flags.boolean({ description: "Logout every OAuth account for the provider" }),
36
+ };
37
+
38
+ static examples = [
39
+ "gjc accounts list",
40
+ "gjc accounts list --json",
41
+ "gjc accounts check",
42
+ "gjc accounts check anthropic --json",
43
+ "gjc accounts pin anthropic me@example.com --persistent",
44
+ "gjc accounts pin anthropic id:42 --persistent",
45
+ "gjc accounts pin anthropic --clear --persistent",
46
+ "gjc accounts logout anthropic --account me@example.com",
47
+ "gjc accounts logout anthropic --all",
48
+ ];
49
+
50
+ async run(): Promise<void> {
51
+ const { args, flags } = await this.parse(Accounts);
52
+ if (!args.action) {
53
+ renderCommandHelp("gjc", "accounts", Accounts);
54
+ return;
55
+ }
56
+ const action = args.action as AccountsAction;
57
+ const cmd: AccountsCommandArgs = {
58
+ action,
59
+ provider: args.provider,
60
+ selector: args.selector,
61
+ flags: {
62
+ json: flags.json,
63
+ persistent: flags.persistent,
64
+ clear: flags.clear,
65
+ account: flags.account,
66
+ all: flags.all,
67
+ },
68
+ };
69
+ await runAccountsCommand(cmd);
70
+ }
71
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `gjc crash` — inspect local crash signatures and file an assisted, fully
3
+ * consented bug report. Nothing leaves the machine without an explicit,
4
+ * digest-confirmed confirmation for that exact invocation.
5
+ */
6
+ import { Args, Command, Flags } from "@gajae-code/utils/cli";
7
+ import { runCrashListCommand, runCrashReportCommand } from "../cli/crash-cli";
8
+
9
+ export default class Crash extends Command {
10
+ static description = "Inspect crash signatures and file an assisted bug report";
11
+ static args = {
12
+ action: Args.string({ description: "list | report", required: false }),
13
+ };
14
+ static flags = {
15
+ json: Flags.boolean({ char: "j", description: "Emit machine-readable JSON (list only)", default: false }),
16
+ };
17
+
18
+ static examples = ["gjc crash list", "gjc crash list --json", "gjc crash report"];
19
+
20
+ async run(): Promise<void> {
21
+ const { args, flags } = await this.parse(Crash);
22
+ const action = args.action ?? "list";
23
+ if (action === "list") {
24
+ await runCrashListCommand(flags.json === true);
25
+ return;
26
+ }
27
+ if (action !== "report") {
28
+ process.stderr.write(`Unknown action "${action}". Expected: list, report.\n`);
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ const outcome = await runCrashReportCommand();
33
+ if (outcome.status === "refused" || outcome.status === "unmatchable") process.exitCode = 1;
34
+ }
35
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * `gjc customize` — customization inspection commands.
3
+ *
4
+ * Currently exposes a single subcommand: `doctor`, a read-only provenance and
5
+ * status report over everything GJC discovers (MCP servers, skills, hooks,
6
+ * tools, extensions, slash commands, plugin bundles).
7
+ */
8
+ import { getProjectDir } from "@gajae-code/utils";
9
+ import { Args, Command, Flags, renderCommandHelp } from "@gajae-code/utils/cli";
10
+ import { runCustomizeDoctorCommand } from "../cli/customize-doctor";
11
+
12
+ const ACTIONS = ["doctor"] as const;
13
+
14
+ export default class Customize extends Command {
15
+ static description = "Inspect discovered customizations (MCP, skills, hooks, tools, extensions, commands, plugins)";
16
+ static delegateHelp = true;
17
+
18
+ static examples = ["gjc customize doctor", "gjc customize doctor --json"];
19
+
20
+ static args = {
21
+ action: Args.string({
22
+ description: "Customize action",
23
+ required: false,
24
+ options: ACTIONS,
25
+ }),
26
+ };
27
+
28
+ static flags = {
29
+ json: Flags.boolean({
30
+ char: "j",
31
+ description: "Emit machine-readable JSON with secrets redacted",
32
+ default: false,
33
+ }),
34
+ };
35
+
36
+ async run(): Promise<void> {
37
+ if (this.argv.includes("--help") || this.argv.includes("-h")) {
38
+ this.#printHelp();
39
+ return;
40
+ }
41
+
42
+ const { args, flags } = await this.parse(Customize);
43
+ const action = (args.action ?? "doctor") as (typeof ACTIONS)[number];
44
+ if (action !== "doctor") {
45
+ renderCommandHelp("gjc", "customize", Customize);
46
+ return;
47
+ }
48
+
49
+ await runCustomizeDoctorCommand({ json: flags.json, cwd: getProjectDir() });
50
+ }
51
+
52
+ #printHelp(): void {
53
+ process.stdout.write(`Inspect discovered customizations and their runtime status
54
+
55
+ USAGE
56
+ $ gjc customize doctor [FLAGS]
57
+
58
+ COMMANDS
59
+ doctor Provenance and status report for MCP servers, skills, hooks, tools,
60
+ extensions, slash commands, and plugin bundles
61
+
62
+ FLAGS
63
+ -j, --json Emit machine-readable JSON with secrets redacted
64
+
65
+ EXAMPLES
66
+ $ gjc customize doctor
67
+ $ gjc customize doctor --json
68
+
69
+ WHAT IT REPORTS
70
+ For every discovered item: source convention and scope (gjc, Claude project,
71
+ Codex project, plugin, explicit config), effective precedence and shadowing,
72
+ runtime status (loaded/disabled/shadowed/rejected/quarantined/stored-only),
73
+ a bounded reason code, remediation commands, trust requirements, and whether
74
+ a new session is required for changes to take effect.
75
+
76
+ SAFETY
77
+ This command is read-only. It never executes hooks, never connects MCP
78
+ servers, and never prints credentials, endpoint tokens, auth headers, env
79
+ values, or raw config dumps. MCP env variable names (not values) and
80
+ redacted endpoints may appear; everything secret-shaped is replaced with
81
+ <redacted>.
82
+ `);
83
+ }
84
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Manage GJC background daemons (status/list/stop/reload).
2
+ * Manage GJC background daemons (status/list/stop/restart).
3
3
  */
4
4
  import { Args, CliParseError, Command, Flags } from "@gajae-code/utils/cli";
5
5
  import {
@@ -54,7 +54,7 @@ export default class Daemon extends Command {
54
54
  force: Flags.boolean({ description: "Allow hard-kill escalation when graceful stop times out" }),
55
55
  "graceful-timeout-ms": Flags.string({ description: "Cooperative stop timeout before escalation" }),
56
56
  "kill-timeout-ms": Flags.string({ description: "Wait for old pid death after SIGKILL" }),
57
- "spawn-if-stopped": Flags.boolean({ description: "On reload, spawn even when no daemon is running" }),
57
+ "spawn-if-stopped": Flags.boolean({ description: "On restart, spawn even when no daemon is running" }),
58
58
  smoke: Flags.boolean({ description: "Internal: run worker smoke without configuration or network" }),
59
59
  "owner-id": Flags.string({ description: "Internal: daemon owner id" }),
60
60
  "agent-dir": Flags.string({ description: "Internal: daemon state directory" }),
@@ -1,4 +1,5 @@
1
1
  import { Command, Flags } from "@gajae-code/utils/cli";
2
+ import { ensureWorkflowSettingsMigrated } from "../config/settings";
2
3
  import { runNativeDeepInterviewCommand } from "../gjc-runtime/deep-interview-runtime";
3
4
 
4
5
  export default class DeepInterview extends Command {
@@ -57,6 +58,7 @@ session_id, or GJC_SESSION_ID.`;
57
58
  ];
58
59
 
59
60
  async run(): Promise<void> {
61
+ await ensureWorkflowSettingsMigrated(process.cwd());
60
62
  const result = await runNativeDeepInterviewCommand(this.argv, process.cwd());
61
63
  if (result.stdout) process.stdout.write(result.stdout);
62
64
  if (result.stderr) process.stderr.write(result.stderr);
@@ -82,6 +82,7 @@ export default class Index extends Command {
82
82
  `# Use different model (fuzzy matching)\n ${APP_NAME} --model opus "Help me refactor this code"`,
83
83
  `# Limit model cycling to specific models\n ${APP_NAME} --models claude-sonnet,claude-haiku,gpt-4o`,
84
84
  `# Pin a stored credential for this session\n ${APP_NAME} --credential email:me@example.com`,
85
+ `# Prefer a stored credential, falling back on quota limits\n ${APP_NAME} --prefer-credential id:15`,
85
86
  `# Activate a model profile for this session\n ${APP_NAME} --mpreset codex-medium`,
86
87
  `# Persist a model profile as the default\n ${APP_NAME} --mpreset opencodego --default`,
87
88
  `# Export a session file to HTML\n ${APP_NAME} --export ~/.gjc/agent/sessions/v2-<scope>/session.jsonl`,
@@ -7,7 +7,7 @@ import { type MCPAction, type MCPCommandArgs, runMCPCommand } from "../cli/mcp-c
7
7
  const ACTIONS: MCPAction[] = ["add", "list", "remove"];
8
8
 
9
9
  export default class MCP extends Command {
10
- static description = "Store standalone MCP server definitions without loading them at runtime";
10
+ static description = "Register MCP servers that ordinary standalone sessions load at startup";
11
11
  static delegateHelp = true;
12
12
 
13
13
  static examples = [
@@ -87,15 +87,15 @@ export default class MCP extends Command {
87
87
  }
88
88
 
89
89
  #printHelp(): void {
90
- process.stdout.write(`Store standalone MCP server definitions in GJC config without loading them at runtime
90
+ process.stdout.write(`Register MCP servers that ordinary standalone sessions load at startup
91
91
 
92
92
  USAGE
93
93
  $ gjc mcp [add|list|remove] [NAME] [COMMAND_OR_URL] [ARGS...] [FLAGS]
94
94
 
95
95
  COMMANDS
96
- add Store an explicit user-provided MCP server definition
97
- list List stored servers with env/header/auth values redacted
98
- remove Remove a stored server and print the removed definition redacted
96
+ add Register an explicit user-provided MCP server definition
97
+ list List registered servers with source, status, and env/header/auth values redacted
98
+ remove Remove a registered server and print the removed definition redacted
99
99
 
100
100
  FLAGS
101
101
  --project Use project scope (./.gjc/mcp.json) instead of user scope
@@ -117,8 +117,13 @@ EXAMPLES
117
117
  $ gjc mcp list --json
118
118
  $ gjc mcp remove context7
119
119
 
120
- STORAGE/RUNTIME
121
- This command stores only the server definition supplied on this invocation. It does not import or inherit Claude Code, Codex, OpenCode, or other live MCP configs. Normal standalone gjc sessions do not load stored MCP registrations today. Public output redacts env, header, auth, and OAuth credential values.
120
+ RUNTIME
121
+ Registrations are consumed by ordinary standalone gjc sessions at startup
122
+ (conventional autoload) unless disabled (enabled: false or the disabledServers
123
+ list), marked autoload: false, or the session opts out with --no-mcp. This
124
+ command stores only the definition supplied on this invocation; it does not
125
+ import or inherit Claude Code, Codex, OpenCode, or other live MCP configs.
126
+ Public output redacts env, header, auth, and OAuth credential values.
122
127
  `);
123
128
  }
124
129
  }
@@ -1,4 +1,5 @@
1
1
  import { Command } from "@gajae-code/utils/cli";
2
+ import { ensureWorkflowSettingsMigrated } from "../config/settings";
2
3
  import { runNativeRalplanCommand } from "../gjc-runtime/ralplan-runtime";
3
4
 
4
5
  export default class Ralplan extends Command {
@@ -12,6 +13,7 @@ export default class Ralplan extends Command {
12
13
  ];
13
14
 
14
15
  async run(): Promise<void> {
16
+ await ensureWorkflowSettingsMigrated(process.cwd());
15
17
  const result = await runNativeRalplanCommand(this.argv, process.cwd());
16
18
  if (result.stdout) process.stdout.write(result.stdout);
17
19
  if (result.stderr) process.stderr.write(result.stderr);