@growthub/cli 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (896) hide show
  1. package/dist/__tests__/agent-jwt-env.test.d.ts +2 -0
  2. package/dist/__tests__/agent-jwt-env.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent-jwt-env.test.js +57 -0
  4. package/dist/__tests__/agent-jwt-env.test.js.map +1 -0
  5. package/dist/__tests__/allowed-hostname.test.d.ts +2 -0
  6. package/dist/__tests__/allowed-hostname.test.d.ts.map +1 -0
  7. package/dist/__tests__/allowed-hostname.test.js +75 -0
  8. package/dist/__tests__/allowed-hostname.test.js.map +1 -0
  9. package/dist/__tests__/auth-login-flow.test.d.ts +2 -0
  10. package/dist/__tests__/auth-login-flow.test.d.ts.map +1 -0
  11. package/dist/__tests__/auth-login-flow.test.js +62 -0
  12. package/dist/__tests__/auth-login-flow.test.js.map +1 -0
  13. package/dist/__tests__/auth-session.test.d.ts +2 -0
  14. package/dist/__tests__/auth-session.test.d.ts.map +1 -0
  15. package/dist/__tests__/auth-session.test.js +128 -0
  16. package/dist/__tests__/auth-session.test.js.map +1 -0
  17. package/dist/__tests__/common.test.d.ts +2 -0
  18. package/dist/__tests__/common.test.d.ts.map +1 -0
  19. package/dist/__tests__/common.test.js +73 -0
  20. package/dist/__tests__/common.test.js.map +1 -0
  21. package/dist/__tests__/company-delete.test.d.ts +2 -0
  22. package/dist/__tests__/company-delete.test.d.ts.map +1 -0
  23. package/dist/__tests__/company-delete.test.js +78 -0
  24. package/dist/__tests__/company-delete.test.js.map +1 -0
  25. package/dist/__tests__/context.test.d.ts +2 -0
  26. package/dist/__tests__/context.test.d.ts.map +1 -0
  27. package/dist/__tests__/context.test.js +50 -0
  28. package/dist/__tests__/context.test.js.map +1 -0
  29. package/dist/__tests__/create-growthub-local-installer.test.d.ts +21 -0
  30. package/dist/__tests__/create-growthub-local-installer.test.d.ts.map +1 -0
  31. package/dist/__tests__/create-growthub-local-installer.test.js +205 -0
  32. package/dist/__tests__/create-growthub-local-installer.test.js.map +1 -0
  33. package/dist/__tests__/data-dir.test.d.ts +2 -0
  34. package/dist/__tests__/data-dir.test.d.ts.map +1 -0
  35. package/dist/__tests__/data-dir.test.js +61 -0
  36. package/dist/__tests__/data-dir.test.js.map +1 -0
  37. package/dist/__tests__/doctor.test.d.ts +2 -0
  38. package/dist/__tests__/doctor.test.d.ts.map +1 -0
  39. package/dist/__tests__/doctor.test.js +93 -0
  40. package/dist/__tests__/doctor.test.js.map +1 -0
  41. package/dist/__tests__/effective-profile.test.d.ts +2 -0
  42. package/dist/__tests__/effective-profile.test.d.ts.map +1 -0
  43. package/dist/__tests__/effective-profile.test.js +91 -0
  44. package/dist/__tests__/effective-profile.test.js.map +1 -0
  45. package/dist/__tests__/execute-hosted-pipeline.test.d.ts +2 -0
  46. package/dist/__tests__/execute-hosted-pipeline.test.d.ts.map +1 -0
  47. package/dist/__tests__/execute-hosted-pipeline.test.js +131 -0
  48. package/dist/__tests__/execute-hosted-pipeline.test.js.map +1 -0
  49. package/dist/__tests__/fork-policy.test.d.ts +12 -0
  50. package/dist/__tests__/fork-policy.test.d.ts.map +1 -0
  51. package/dist/__tests__/fork-policy.test.js +132 -0
  52. package/dist/__tests__/fork-policy.test.js.map +1 -0
  53. package/dist/__tests__/fork-trace.test.d.ts +12 -0
  54. package/dist/__tests__/fork-trace.test.d.ts.map +1 -0
  55. package/dist/__tests__/fork-trace.test.js +90 -0
  56. package/dist/__tests__/fork-trace.test.js.map +1 -0
  57. package/dist/__tests__/home-paths.test.d.ts +2 -0
  58. package/dist/__tests__/home-paths.test.d.ts.map +1 -0
  59. package/dist/__tests__/home-paths.test.js +32 -0
  60. package/dist/__tests__/home-paths.test.js.map +1 -0
  61. package/dist/__tests__/hosted-execution-client.test.d.ts +2 -0
  62. package/dist/__tests__/hosted-execution-client.test.d.ts.map +1 -0
  63. package/dist/__tests__/hosted-execution-client.test.js +100 -0
  64. package/dist/__tests__/hosted-execution-client.test.js.map +1 -0
  65. package/dist/__tests__/http.test.d.ts +2 -0
  66. package/dist/__tests__/http.test.d.ts.map +1 -0
  67. package/dist/__tests__/http.test.js +42 -0
  68. package/dist/__tests__/http.test.js.map +1 -0
  69. package/dist/__tests__/integrations-github-resolver.test.d.ts +14 -0
  70. package/dist/__tests__/integrations-github-resolver.test.d.ts.map +1 -0
  71. package/dist/__tests__/integrations-github-resolver.test.js +103 -0
  72. package/dist/__tests__/integrations-github-resolver.test.js.map +1 -0
  73. package/dist/__tests__/kit-command.test.d.ts +2 -0
  74. package/dist/__tests__/kit-command.test.d.ts.map +1 -0
  75. package/dist/__tests__/kit-command.test.js +134 -0
  76. package/dist/__tests__/kit-command.test.js.map +1 -0
  77. package/dist/__tests__/kit-core.test.d.ts +17 -0
  78. package/dist/__tests__/kit-core.test.d.ts.map +1 -0
  79. package/dist/__tests__/kit-core.test.js +403 -0
  80. package/dist/__tests__/kit-core.test.js.map +1 -0
  81. package/dist/__tests__/kit-fork-command.test.d.ts +11 -0
  82. package/dist/__tests__/kit-fork-command.test.d.ts.map +1 -0
  83. package/dist/__tests__/kit-fork-command.test.js +183 -0
  84. package/dist/__tests__/kit-fork-command.test.js.map +1 -0
  85. package/dist/__tests__/kit-fork-phase-1.test.d.ts +13 -0
  86. package/dist/__tests__/kit-fork-phase-1.test.d.ts.map +1 -0
  87. package/dist/__tests__/kit-fork-phase-1.test.js +220 -0
  88. package/dist/__tests__/kit-fork-phase-1.test.js.map +1 -0
  89. package/dist/__tests__/kit-fork-registry.test.d.ts +8 -0
  90. package/dist/__tests__/kit-fork-registry.test.d.ts.map +1 -0
  91. package/dist/__tests__/kit-fork-registry.test.js +183 -0
  92. package/dist/__tests__/kit-fork-registry.test.js.map +1 -0
  93. package/dist/__tests__/kit-fork-sync-agent.test.d.ts +13 -0
  94. package/dist/__tests__/kit-fork-sync-agent.test.d.ts.map +1 -0
  95. package/dist/__tests__/kit-fork-sync-agent.test.js +262 -0
  96. package/dist/__tests__/kit-fork-sync-agent.test.js.map +1 -0
  97. package/dist/__tests__/kit-fork-sync.test.d.ts +12 -0
  98. package/dist/__tests__/kit-fork-sync.test.d.ts.map +1 -0
  99. package/dist/__tests__/kit-fork-sync.test.js +455 -0
  100. package/dist/__tests__/kit-fork-sync.test.js.map +1 -0
  101. package/dist/__tests__/kit-zernio-social.test.d.ts +16 -0
  102. package/dist/__tests__/kit-zernio-social.test.d.ts.map +1 -0
  103. package/dist/__tests__/kit-zernio-social.test.js +528 -0
  104. package/dist/__tests__/kit-zernio-social.test.js.map +1 -0
  105. package/dist/__tests__/kit.test.d.ts +2 -0
  106. package/dist/__tests__/kit.test.d.ts.map +1 -0
  107. package/dist/__tests__/kit.test.js +359 -0
  108. package/dist/__tests__/kit.test.js.map +1 -0
  109. package/dist/__tests__/native-intelligence-normalizer.test.d.ts +2 -0
  110. package/dist/__tests__/native-intelligence-normalizer.test.d.ts.map +1 -0
  111. package/dist/__tests__/native-intelligence-normalizer.test.js +200 -0
  112. package/dist/__tests__/native-intelligence-normalizer.test.js.map +1 -0
  113. package/dist/__tests__/native-intelligence-planner.test.d.ts +2 -0
  114. package/dist/__tests__/native-intelligence-planner.test.d.ts.map +1 -0
  115. package/dist/__tests__/native-intelligence-planner.test.js +208 -0
  116. package/dist/__tests__/native-intelligence-planner.test.js.map +1 -0
  117. package/dist/__tests__/native-intelligence-recommender.test.d.ts +2 -0
  118. package/dist/__tests__/native-intelligence-recommender.test.d.ts.map +1 -0
  119. package/dist/__tests__/native-intelligence-recommender.test.js +212 -0
  120. package/dist/__tests__/native-intelligence-recommender.test.js.map +1 -0
  121. package/dist/__tests__/native-intelligence-summarizer.test.d.ts +2 -0
  122. package/dist/__tests__/native-intelligence-summarizer.test.d.ts.map +1 -0
  123. package/dist/__tests__/native-intelligence-summarizer.test.js +195 -0
  124. package/dist/__tests__/native-intelligence-summarizer.test.js.map +1 -0
  125. package/dist/__tests__/open-agents.test.d.ts +2 -0
  126. package/dist/__tests__/open-agents.test.d.ts.map +1 -0
  127. package/dist/__tests__/open-agents.test.js +174 -0
  128. package/dist/__tests__/open-agents.test.js.map +1 -0
  129. package/dist/__tests__/progress.test.d.ts +5 -0
  130. package/dist/__tests__/progress.test.d.ts.map +1 -0
  131. package/dist/__tests__/progress.test.js +55 -0
  132. package/dist/__tests__/progress.test.js.map +1 -0
  133. package/dist/__tests__/qwen-code.test.d.ts +2 -0
  134. package/dist/__tests__/qwen-code.test.d.ts.map +1 -0
  135. package/dist/__tests__/qwen-code.test.js +125 -0
  136. package/dist/__tests__/qwen-code.test.js.map +1 -0
  137. package/dist/__tests__/source-import-agent.test.d.ts +9 -0
  138. package/dist/__tests__/source-import-agent.test.d.ts.map +1 -0
  139. package/dist/__tests__/source-import-agent.test.js +124 -0
  140. package/dist/__tests__/source-import-agent.test.js.map +1 -0
  141. package/dist/__tests__/source-import-detect.test.d.ts +8 -0
  142. package/dist/__tests__/source-import-detect.test.d.ts.map +1 -0
  143. package/dist/__tests__/source-import-detect.test.js +91 -0
  144. package/dist/__tests__/source-import-detect.test.js.map +1 -0
  145. package/dist/__tests__/source-import-plan.test.d.ts +8 -0
  146. package/dist/__tests__/source-import-plan.test.d.ts.map +1 -0
  147. package/dist/__tests__/source-import-plan.test.js +170 -0
  148. package/dist/__tests__/source-import-plan.test.js.map +1 -0
  149. package/dist/__tests__/source-import-security.test.d.ts +8 -0
  150. package/dist/__tests__/source-import-security.test.d.ts.map +1 -0
  151. package/dist/__tests__/source-import-security.test.js +111 -0
  152. package/dist/__tests__/source-import-security.test.js.map +1 -0
  153. package/dist/__tests__/source-import-skills-source.test.d.ts +11 -0
  154. package/dist/__tests__/source-import-skills-source.test.d.ts.map +1 -0
  155. package/dist/__tests__/source-import-skills-source.test.js +181 -0
  156. package/dist/__tests__/source-import-skills-source.test.js.map +1 -0
  157. package/dist/__tests__/table-renderer.test.d.ts +12 -0
  158. package/dist/__tests__/table-renderer.test.d.ts.map +1 -0
  159. package/dist/__tests__/table-renderer.test.js +86 -0
  160. package/dist/__tests__/table-renderer.test.js.map +1 -0
  161. package/dist/__tests__/worktree.test.d.ts +2 -0
  162. package/dist/__tests__/worktree.test.d.ts.map +1 -0
  163. package/dist/__tests__/worktree.test.js +399 -0
  164. package/dist/__tests__/worktree.test.js.map +1 -0
  165. package/dist/adapters/http/format-event.d.ts +2 -0
  166. package/dist/adapters/http/format-event.d.ts.map +1 -0
  167. package/dist/adapters/http/format-event.js +6 -0
  168. package/dist/adapters/http/format-event.js.map +1 -0
  169. package/dist/adapters/http/index.d.ts +3 -0
  170. package/dist/adapters/http/index.d.ts.map +1 -0
  171. package/dist/adapters/http/index.js +6 -0
  172. package/dist/adapters/http/index.js.map +1 -0
  173. package/dist/adapters/index.d.ts +3 -0
  174. package/dist/adapters/index.d.ts.map +1 -0
  175. package/dist/adapters/index.js +2 -0
  176. package/dist/adapters/index.js.map +1 -0
  177. package/dist/adapters/open-agents/format-event.d.ts +2 -0
  178. package/dist/adapters/open-agents/format-event.d.ts.map +1 -0
  179. package/dist/adapters/open-agents/format-event.js +39 -0
  180. package/dist/adapters/open-agents/format-event.js.map +1 -0
  181. package/dist/adapters/open-agents/index.d.ts +3 -0
  182. package/dist/adapters/open-agents/index.d.ts.map +1 -0
  183. package/dist/adapters/open-agents/index.js +6 -0
  184. package/dist/adapters/open-agents/index.js.map +1 -0
  185. package/dist/adapters/process/format-event.d.ts +2 -0
  186. package/dist/adapters/process/format-event.d.ts.map +1 -0
  187. package/dist/adapters/process/format-event.js +6 -0
  188. package/dist/adapters/process/format-event.js.map +1 -0
  189. package/dist/adapters/process/index.d.ts +3 -0
  190. package/dist/adapters/process/index.d.ts.map +1 -0
  191. package/dist/adapters/process/index.js +6 -0
  192. package/dist/adapters/process/index.js.map +1 -0
  193. package/dist/adapters/qwen/format-event.d.ts +8 -0
  194. package/dist/adapters/qwen/format-event.d.ts.map +1 -0
  195. package/dist/adapters/qwen/format-event.js +28 -0
  196. package/dist/adapters/qwen/format-event.js.map +1 -0
  197. package/dist/adapters/qwen/index.d.ts +3 -0
  198. package/dist/adapters/qwen/index.d.ts.map +1 -0
  199. package/dist/adapters/qwen/index.js +6 -0
  200. package/dist/adapters/qwen/index.js.map +1 -0
  201. package/dist/adapters/registry.d.ts +3 -0
  202. package/dist/adapters/registry.d.ts.map +1 -0
  203. package/dist/adapters/registry.js +56 -0
  204. package/dist/adapters/registry.js.map +1 -0
  205. package/dist/auth/effective-profile.d.ts +61 -0
  206. package/dist/auth/effective-profile.d.ts.map +1 -0
  207. package/dist/auth/effective-profile.js +127 -0
  208. package/dist/auth/effective-profile.js.map +1 -0
  209. package/dist/auth/hosted-client.d.ts +107 -0
  210. package/dist/auth/hosted-client.d.ts.map +1 -0
  211. package/dist/auth/hosted-client.js +140 -0
  212. package/dist/auth/hosted-client.js.map +1 -0
  213. package/dist/auth/hosted-integrations.d.ts +33 -0
  214. package/dist/auth/hosted-integrations.d.ts.map +1 -0
  215. package/dist/auth/hosted-integrations.js +51 -0
  216. package/dist/auth/hosted-integrations.js.map +1 -0
  217. package/dist/auth/login-flow.d.ts +27 -0
  218. package/dist/auth/login-flow.d.ts.map +1 -0
  219. package/dist/auth/login-flow.js +212 -0
  220. package/dist/auth/login-flow.js.map +1 -0
  221. package/dist/auth/overlay-store.d.ts +52 -0
  222. package/dist/auth/overlay-store.d.ts.map +1 -0
  223. package/dist/auth/overlay-store.js +123 -0
  224. package/dist/auth/overlay-store.js.map +1 -0
  225. package/dist/auth/paths.d.ts +15 -0
  226. package/dist/auth/paths.d.ts.map +1 -0
  227. package/dist/auth/paths.js +27 -0
  228. package/dist/auth/paths.js.map +1 -0
  229. package/dist/auth/session-store.d.ts +35 -0
  230. package/dist/auth/session-store.d.ts.map +1 -0
  231. package/dist/auth/session-store.js +73 -0
  232. package/dist/auth/session-store.js.map +1 -0
  233. package/dist/auth/workflow-access.d.ts +7 -0
  234. package/dist/auth/workflow-access.d.ts.map +1 -0
  235. package/dist/auth/workflow-access.js +27 -0
  236. package/dist/auth/workflow-access.js.map +1 -0
  237. package/dist/checks/agent-jwt-secret-check.d.ts +3 -0
  238. package/dist/checks/agent-jwt-secret-check.d.ts.map +1 -0
  239. package/dist/checks/agent-jwt-secret-check.js +31 -0
  240. package/dist/checks/agent-jwt-secret-check.js.map +1 -0
  241. package/dist/checks/config-check.d.ts +3 -0
  242. package/dist/checks/config-check.d.ts.map +1 -0
  243. package/dist/checks/config-check.js +31 -0
  244. package/dist/checks/config-check.js.map +1 -0
  245. package/dist/checks/database-check.d.ts +4 -0
  246. package/dist/checks/database-check.d.ts.map +1 -0
  247. package/dist/checks/database-check.js +54 -0
  248. package/dist/checks/database-check.js.map +1 -0
  249. package/dist/checks/deployment-auth-check.d.ts +4 -0
  250. package/dist/checks/deployment-auth-check.d.ts.map +1 -0
  251. package/dist/checks/deployment-auth-check.js +83 -0
  252. package/dist/checks/deployment-auth-check.js.map +1 -0
  253. package/dist/checks/index.d.ts +18 -0
  254. package/dist/checks/index.d.ts.map +1 -0
  255. package/dist/checks/index.js +10 -0
  256. package/dist/checks/index.js.map +1 -0
  257. package/dist/checks/llm-check.d.ts +4 -0
  258. package/dist/checks/llm-check.d.ts.map +1 -0
  259. package/dist/checks/llm-check.js +80 -0
  260. package/dist/checks/llm-check.js.map +1 -0
  261. package/dist/checks/log-check.d.ts +4 -0
  262. package/dist/checks/log-check.d.ts.map +1 -0
  263. package/dist/checks/log-check.js +27 -0
  264. package/dist/checks/log-check.js.map +1 -0
  265. package/dist/checks/path-resolver.d.ts +2 -0
  266. package/dist/checks/path-resolver.d.ts.map +1 -0
  267. package/dist/checks/path-resolver.js +2 -0
  268. package/dist/checks/path-resolver.js.map +1 -0
  269. package/dist/checks/port-check.d.ts +4 -0
  270. package/dist/checks/port-check.d.ts.map +1 -0
  271. package/dist/checks/port-check.js +20 -0
  272. package/dist/checks/port-check.js.map +1 -0
  273. package/dist/checks/secrets-check.d.ts +4 -0
  274. package/dist/checks/secrets-check.d.ts.map +1 -0
  275. package/dist/checks/secrets-check.js +123 -0
  276. package/dist/checks/secrets-check.js.map +1 -0
  277. package/dist/checks/storage-check.d.ts +4 -0
  278. package/dist/checks/storage-check.d.ts.map +1 -0
  279. package/dist/checks/storage-check.js +46 -0
  280. package/dist/checks/storage-check.js.map +1 -0
  281. package/dist/client/context.d.ts +21 -0
  282. package/dist/client/context.d.ts.map +1 -0
  283. package/dist/client/context.js +136 -0
  284. package/dist/client/context.js.map +1 -0
  285. package/dist/client/http.d.ts +29 -0
  286. package/dist/client/http.d.ts.map +1 -0
  287. package/dist/client/http.js +120 -0
  288. package/dist/client/http.js.map +1 -0
  289. package/dist/commands/allowed-hostname.d.ts +4 -0
  290. package/dist/commands/allowed-hostname.d.ts.map +1 -0
  291. package/dist/commands/allowed-hostname.js +31 -0
  292. package/dist/commands/allowed-hostname.js.map +1 -0
  293. package/dist/commands/artifact.d.ts +12 -0
  294. package/dist/commands/artifact.d.ts.map +1 -0
  295. package/dist/commands/artifact.js +167 -0
  296. package/dist/commands/artifact.js.map +1 -0
  297. package/dist/commands/auth-bootstrap-ceo.d.ts +8 -0
  298. package/dist/commands/auth-bootstrap-ceo.d.ts.map +1 -0
  299. package/dist/commands/auth-bootstrap-ceo.js +108 -0
  300. package/dist/commands/auth-bootstrap-ceo.js.map +1 -0
  301. package/dist/commands/auth-login.d.ts +24 -0
  302. package/dist/commands/auth-login.d.ts.map +1 -0
  303. package/dist/commands/auth-login.js +270 -0
  304. package/dist/commands/auth-login.js.map +1 -0
  305. package/dist/commands/capability.d.ts +15 -0
  306. package/dist/commands/capability.d.ts.map +1 -0
  307. package/dist/commands/capability.js +366 -0
  308. package/dist/commands/capability.js.map +1 -0
  309. package/dist/commands/client/activity.d.ts +3 -0
  310. package/dist/commands/client/activity.d.ts.map +1 -0
  311. package/dist/commands/client/activity.js +49 -0
  312. package/dist/commands/client/activity.js.map +1 -0
  313. package/dist/commands/client/agent.d.ts +3 -0
  314. package/dist/commands/client/agent.d.ts.map +1 -0
  315. package/dist/commands/client/agent.js +224 -0
  316. package/dist/commands/client/agent.js.map +1 -0
  317. package/dist/commands/client/approval.d.ts +3 -0
  318. package/dist/commands/client/approval.d.ts.map +1 -0
  319. package/dist/commands/client/approval.js +193 -0
  320. package/dist/commands/client/approval.js.map +1 -0
  321. package/dist/commands/client/common.d.ts +33 -0
  322. package/dist/commands/client/common.d.ts.map +1 -0
  323. package/dist/commands/client/common.js +140 -0
  324. package/dist/commands/client/common.js.map +1 -0
  325. package/dist/commands/client/company.d.ts +14 -0
  326. package/dist/commands/client/company.d.ts.map +1 -0
  327. package/dist/commands/client/company.js +346 -0
  328. package/dist/commands/client/company.js.map +1 -0
  329. package/dist/commands/client/context.d.ts +3 -0
  330. package/dist/commands/client/context.d.ts.map +1 -0
  331. package/dist/commands/client/context.js +92 -0
  332. package/dist/commands/client/context.js.map +1 -0
  333. package/dist/commands/client/dashboard.d.ts +3 -0
  334. package/dist/commands/client/dashboard.d.ts.map +1 -0
  335. package/dist/commands/client/dashboard.js +19 -0
  336. package/dist/commands/client/dashboard.js.map +1 -0
  337. package/dist/commands/client/issue.d.ts +3 -0
  338. package/dist/commands/client/issue.d.ts.map +1 -0
  339. package/dist/commands/client/issue.js +229 -0
  340. package/dist/commands/client/issue.js.map +1 -0
  341. package/dist/commands/client/plugin.d.ts +3 -0
  342. package/dist/commands/client/plugin.d.ts.map +1 -0
  343. package/dist/commands/client/plugin.js +252 -0
  344. package/dist/commands/client/plugin.js.map +1 -0
  345. package/dist/commands/configure.d.ts +5 -0
  346. package/dist/commands/configure.d.ts.map +1 -0
  347. package/dist/commands/configure.js +167 -0
  348. package/dist/commands/configure.js.map +1 -0
  349. package/dist/commands/db-backup.d.ts +10 -0
  350. package/dist/commands/db-backup.d.ts.map +1 -0
  351. package/dist/commands/db-backup.js +74 -0
  352. package/dist/commands/db-backup.js.map +1 -0
  353. package/dist/commands/doctor.d.ts +10 -0
  354. package/dist/commands/doctor.d.ts.map +1 -0
  355. package/dist/commands/doctor.js +154 -0
  356. package/dist/commands/doctor.js.map +1 -0
  357. package/dist/commands/env.d.ts +4 -0
  358. package/dist/commands/env.d.ts.map +1 -0
  359. package/dist/commands/env.js +355 -0
  360. package/dist/commands/env.js.map +1 -0
  361. package/dist/commands/fleet.d.ts +39 -0
  362. package/dist/commands/fleet.d.ts.map +1 -0
  363. package/dist/commands/fleet.js +281 -0
  364. package/dist/commands/fleet.js.map +1 -0
  365. package/dist/commands/github.d.ts +29 -0
  366. package/dist/commands/github.d.ts.map +1 -0
  367. package/dist/commands/github.js +205 -0
  368. package/dist/commands/github.js.map +1 -0
  369. package/dist/commands/gtm.d.ts +3 -0
  370. package/dist/commands/gtm.d.ts.map +1 -0
  371. package/dist/commands/gtm.js +134 -0
  372. package/dist/commands/gtm.js.map +1 -0
  373. package/dist/commands/heartbeat-run.d.ts +16 -0
  374. package/dist/commands/heartbeat-run.d.ts.map +1 -0
  375. package/dist/commands/heartbeat-run.js +294 -0
  376. package/dist/commands/heartbeat-run.js.map +1 -0
  377. package/dist/commands/integrations.d.ts +20 -0
  378. package/dist/commands/integrations.d.ts.map +1 -0
  379. package/dist/commands/integrations.js +98 -0
  380. package/dist/commands/integrations.js.map +1 -0
  381. package/dist/commands/kit-fork-remote.d.ts +46 -0
  382. package/dist/commands/kit-fork-remote.d.ts.map +1 -0
  383. package/dist/commands/kit-fork-remote.js +489 -0
  384. package/dist/commands/kit-fork-remote.js.map +1 -0
  385. package/dist/commands/kit-fork.d.ts +39 -0
  386. package/dist/commands/kit-fork.d.ts.map +1 -0
  387. package/dist/commands/kit-fork.js +1338 -0
  388. package/dist/commands/kit-fork.js.map +1 -0
  389. package/dist/commands/kit.d.ts +7 -0
  390. package/dist/commands/kit.d.ts.map +1 -0
  391. package/dist/commands/kit.js +585 -0
  392. package/dist/commands/kit.js.map +1 -0
  393. package/dist/commands/onboard.d.ts +9 -0
  394. package/dist/commands/onboard.d.ts.map +1 -0
  395. package/dist/commands/onboard.js +425 -0
  396. package/dist/commands/onboard.js.map +1 -0
  397. package/dist/commands/open-agents.d.ts +19 -0
  398. package/dist/commands/open-agents.d.ts.map +1 -0
  399. package/dist/commands/open-agents.js +689 -0
  400. package/dist/commands/open-agents.js.map +1 -0
  401. package/dist/commands/pipeline.d.ts +20 -0
  402. package/dist/commands/pipeline.d.ts.map +1 -0
  403. package/dist/commands/pipeline.js +863 -0
  404. package/dist/commands/pipeline.js.map +1 -0
  405. package/dist/commands/profile.d.ts +3 -0
  406. package/dist/commands/profile.d.ts.map +1 -0
  407. package/dist/commands/profile.js +282 -0
  408. package/dist/commands/profile.js.map +1 -0
  409. package/dist/commands/qwen-code.d.ts +19 -0
  410. package/dist/commands/qwen-code.d.ts.map +1 -0
  411. package/dist/commands/qwen-code.js +286 -0
  412. package/dist/commands/qwen-code.js.map +1 -0
  413. package/dist/commands/run.d.ts +9 -0
  414. package/dist/commands/run.d.ts.map +1 -0
  415. package/dist/commands/run.js +156 -0
  416. package/dist/commands/run.js.map +1 -0
  417. package/dist/commands/source-import-discovery.d.ts +28 -0
  418. package/dist/commands/source-import-discovery.d.ts.map +1 -0
  419. package/dist/commands/source-import-discovery.js +327 -0
  420. package/dist/commands/source-import-discovery.js.map +1 -0
  421. package/dist/commands/starter.d.ts +27 -0
  422. package/dist/commands/starter.d.ts.map +1 -0
  423. package/dist/commands/starter.js +358 -0
  424. package/dist/commands/starter.js.map +1 -0
  425. package/dist/commands/status.d.ts +18 -0
  426. package/dist/commands/status.d.ts.map +1 -0
  427. package/dist/commands/status.js +84 -0
  428. package/dist/commands/status.js.map +1 -0
  429. package/dist/commands/template.d.ts +18 -0
  430. package/dist/commands/template.d.ts.map +1 -0
  431. package/dist/commands/template.js +341 -0
  432. package/dist/commands/template.js.map +1 -0
  433. package/dist/commands/workflow.d.ts +24 -0
  434. package/dist/commands/workflow.d.ts.map +1 -0
  435. package/dist/commands/workflow.js +1350 -0
  436. package/dist/commands/workflow.js.map +1 -0
  437. package/dist/commands/worktree-lib.d.ts +49 -0
  438. package/dist/commands/worktree-lib.d.ts.map +1 -0
  439. package/dist/commands/worktree-lib.js +220 -0
  440. package/dist/commands/worktree-lib.js.map +1 -0
  441. package/dist/commands/worktree.d.ts +60 -0
  442. package/dist/commands/worktree.d.ts.map +1 -0
  443. package/dist/commands/worktree.js +874 -0
  444. package/dist/commands/worktree.js.map +1 -0
  445. package/dist/config/data-dir.d.ts +12 -0
  446. package/dist/config/data-dir.d.ts.map +1 -0
  447. package/dist/config/data-dir.js +25 -0
  448. package/dist/config/data-dir.js.map +1 -0
  449. package/dist/config/env.d.ts +15 -0
  450. package/dist/config/env.d.ts.map +1 -0
  451. package/dist/config/env.js +105 -0
  452. package/dist/config/env.js.map +1 -0
  453. package/dist/config/github-home.d.ts +17 -0
  454. package/dist/config/github-home.d.ts.map +1 -0
  455. package/dist/config/github-home.js +29 -0
  456. package/dist/config/github-home.js.map +1 -0
  457. package/dist/config/home.d.ts +23 -0
  458. package/dist/config/home.d.ts.map +1 -0
  459. package/dist/config/home.js +65 -0
  460. package/dist/config/home.js.map +1 -0
  461. package/dist/config/hostnames.d.ts +3 -0
  462. package/dist/config/hostnames.d.ts.map +1 -0
  463. package/dist/config/hostnames.js +27 -0
  464. package/dist/config/hostnames.js.map +1 -0
  465. package/dist/config/kit-forks-home.d.ts +26 -0
  466. package/dist/config/kit-forks-home.d.ts.map +1 -0
  467. package/dist/config/kit-forks-home.js +44 -0
  468. package/dist/config/kit-forks-home.js.map +1 -0
  469. package/dist/config/schema.d.ts +2 -0
  470. package/dist/config/schema.d.ts.map +1 -0
  471. package/dist/config/schema.js +2 -0
  472. package/dist/config/schema.js.map +1 -0
  473. package/dist/config/secrets-key.d.ts +16 -0
  474. package/dist/config/secrets-key.d.ts.map +1 -0
  475. package/dist/config/secrets-key.js +34 -0
  476. package/dist/config/secrets-key.js.map +1 -0
  477. package/dist/config/store.d.ts +6 -0
  478. package/dist/config/store.d.ts.map +1 -0
  479. package/dist/config/store.js +102 -0
  480. package/dist/config/store.js.map +1 -0
  481. package/dist/fleet/agent-plan.d.ts +20 -0
  482. package/dist/fleet/agent-plan.d.ts.map +1 -0
  483. package/dist/fleet/agent-plan.js +61 -0
  484. package/dist/fleet/agent-plan.js.map +1 -0
  485. package/dist/fleet/approvals.d.ts +10 -0
  486. package/dist/fleet/approvals.d.ts.map +1 -0
  487. package/dist/fleet/approvals.js +33 -0
  488. package/dist/fleet/approvals.js.map +1 -0
  489. package/dist/fleet/drift-summary.d.ts +13 -0
  490. package/dist/fleet/drift-summary.d.ts.map +1 -0
  491. package/dist/fleet/drift-summary.js +120 -0
  492. package/dist/fleet/drift-summary.js.map +1 -0
  493. package/dist/fleet/summary.d.ts +9 -0
  494. package/dist/fleet/summary.d.ts.map +1 -0
  495. package/dist/fleet/summary.js +161 -0
  496. package/dist/fleet/summary.js.map +1 -0
  497. package/dist/fleet/types.d.ts +149 -0
  498. package/dist/fleet/types.d.ts.map +1 -0
  499. package/dist/fleet/types.js +12 -0
  500. package/dist/fleet/types.js.map +1 -0
  501. package/dist/github/client.d.ts +42 -0
  502. package/dist/github/client.d.ts.map +1 -0
  503. package/dist/github/client.js +174 -0
  504. package/dist/github/client.js.map +1 -0
  505. package/dist/github/token-store.d.ts +11 -0
  506. package/dist/github/token-store.d.ts.map +1 -0
  507. package/dist/github/token-store.js +74 -0
  508. package/dist/github/token-store.js.map +1 -0
  509. package/dist/github/types.d.ts +69 -0
  510. package/dist/github/types.d.ts.map +1 -0
  511. package/dist/github/types.js +8 -0
  512. package/dist/github/types.js.map +1 -0
  513. package/dist/index.d.ts +2 -0
  514. package/dist/index.d.ts.map +1 -0
  515. package/dist/index.js +1100 -27800
  516. package/dist/index.js.map +1 -0
  517. package/dist/integrations/bridge.d.ts +43 -0
  518. package/dist/integrations/bridge.d.ts.map +1 -0
  519. package/dist/integrations/bridge.js +148 -0
  520. package/dist/integrations/bridge.js.map +1 -0
  521. package/dist/integrations/github-resolver.d.ts +31 -0
  522. package/dist/integrations/github-resolver.d.ts.map +1 -0
  523. package/dist/integrations/github-resolver.js +44 -0
  524. package/dist/integrations/github-resolver.js.map +1 -0
  525. package/dist/integrations/types.d.ts +46 -0
  526. package/dist/integrations/types.d.ts.map +1 -0
  527. package/dist/integrations/types.js +11 -0
  528. package/dist/integrations/types.js.map +1 -0
  529. package/dist/kits/catalog.d.ts +12 -0
  530. package/dist/kits/catalog.d.ts.map +1 -0
  531. package/dist/kits/catalog.js +93 -0
  532. package/dist/kits/catalog.js.map +1 -0
  533. package/dist/kits/contract.d.ts +153 -0
  534. package/dist/kits/contract.d.ts.map +1 -0
  535. package/dist/kits/contract.js +89 -0
  536. package/dist/kits/contract.js.map +1 -0
  537. package/dist/kits/core/adapter-core/contracts.d.ts +108 -0
  538. package/dist/kits/core/adapter-core/contracts.d.ts.map +1 -0
  539. package/dist/kits/core/adapter-core/contracts.js +17 -0
  540. package/dist/kits/core/adapter-core/contracts.js.map +1 -0
  541. package/dist/kits/core/adapter-core/env-gate.d.ts +29 -0
  542. package/dist/kits/core/adapter-core/env-gate.d.ts.map +1 -0
  543. package/dist/kits/core/adapter-core/env-gate.js +143 -0
  544. package/dist/kits/core/adapter-core/env-gate.js.map +1 -0
  545. package/dist/kits/core/adapter-core/fork-inspector.d.ts +42 -0
  546. package/dist/kits/core/adapter-core/fork-inspector.d.ts.map +1 -0
  547. package/dist/kits/core/adapter-core/fork-inspector.js +141 -0
  548. package/dist/kits/core/adapter-core/fork-inspector.js.map +1 -0
  549. package/dist/kits/core/adapter-core/index.d.ts +20 -0
  550. package/dist/kits/core/adapter-core/index.d.ts.map +1 -0
  551. package/dist/kits/core/adapter-core/index.js +13 -0
  552. package/dist/kits/core/adapter-core/index.js.map +1 -0
  553. package/dist/kits/core/adapter-core/output-contract.d.ts +25 -0
  554. package/dist/kits/core/adapter-core/output-contract.d.ts.map +1 -0
  555. package/dist/kits/core/adapter-core/output-contract.js +114 -0
  556. package/dist/kits/core/adapter-core/output-contract.js.map +1 -0
  557. package/dist/kits/core/adapter-core/provider-adapter.d.ts +26 -0
  558. package/dist/kits/core/adapter-core/provider-adapter.d.ts.map +1 -0
  559. package/dist/kits/core/adapter-core/provider-adapter.js +119 -0
  560. package/dist/kits/core/adapter-core/provider-adapter.js.map +1 -0
  561. package/dist/kits/core/adapter-core/runtime-surface.d.ts +25 -0
  562. package/dist/kits/core/adapter-core/runtime-surface.d.ts.map +1 -0
  563. package/dist/kits/core/adapter-core/runtime-surface.js +100 -0
  564. package/dist/kits/core/adapter-core/runtime-surface.js.map +1 -0
  565. package/dist/kits/core/adapter-core/setup-validation.d.ts +28 -0
  566. package/dist/kits/core/adapter-core/setup-validation.d.ts.map +1 -0
  567. package/dist/kits/core/adapter-core/setup-validation.js +145 -0
  568. package/dist/kits/core/adapter-core/setup-validation.js.map +1 -0
  569. package/dist/kits/core/factory/index.d.ts +25 -0
  570. package/dist/kits/core/factory/index.d.ts.map +1 -0
  571. package/dist/kits/core/factory/index.js +21 -0
  572. package/dist/kits/core/factory/index.js.map +1 -0
  573. package/dist/kits/core/factory/operator-kit.d.ts +50 -0
  574. package/dist/kits/core/factory/operator-kit.d.ts.map +1 -0
  575. package/dist/kits/core/factory/operator-kit.js +88 -0
  576. package/dist/kits/core/factory/operator-kit.js.map +1 -0
  577. package/dist/kits/core/factory/ops-kit.d.ts +57 -0
  578. package/dist/kits/core/factory/ops-kit.d.ts.map +1 -0
  579. package/dist/kits/core/factory/ops-kit.js +115 -0
  580. package/dist/kits/core/factory/ops-kit.js.map +1 -0
  581. package/dist/kits/core/factory/studio-kit.d.ts +39 -0
  582. package/dist/kits/core/factory/studio-kit.d.ts.map +1 -0
  583. package/dist/kits/core/factory/studio-kit.js +96 -0
  584. package/dist/kits/core/factory/studio-kit.js.map +1 -0
  585. package/dist/kits/core/factory/workflow-kit.d.ts +57 -0
  586. package/dist/kits/core/factory/workflow-kit.d.ts.map +1 -0
  587. package/dist/kits/core/factory/workflow-kit.js +107 -0
  588. package/dist/kits/core/factory/workflow-kit.js.map +1 -0
  589. package/dist/kits/core/index.d.ts +25 -0
  590. package/dist/kits/core/index.d.ts.map +1 -0
  591. package/dist/kits/core/index.js +111 -0
  592. package/dist/kits/core/index.js.map +1 -0
  593. package/dist/kits/core/types/index.d.ts +65 -0
  594. package/dist/kits/core/types/index.d.ts.map +1 -0
  595. package/dist/kits/core/types/index.js +49 -0
  596. package/dist/kits/core/types/index.js.map +1 -0
  597. package/dist/kits/core/validation/index.d.ts +42 -0
  598. package/dist/kits/core/validation/index.d.ts.map +1 -0
  599. package/dist/kits/core/validation/index.js +128 -0
  600. package/dist/kits/core/validation/index.js.map +1 -0
  601. package/dist/kits/fork-policy.d.ts +78 -0
  602. package/dist/kits/fork-policy.d.ts.map +1 -0
  603. package/dist/kits/fork-policy.js +92 -0
  604. package/dist/kits/fork-policy.js.map +1 -0
  605. package/dist/kits/fork-registry.d.ts +54 -0
  606. package/dist/kits/fork-registry.d.ts.map +1 -0
  607. package/dist/kits/fork-registry.js +201 -0
  608. package/dist/kits/fork-registry.js.map +1 -0
  609. package/dist/kits/fork-remote.d.ts +52 -0
  610. package/dist/kits/fork-remote.d.ts.map +1 -0
  611. package/dist/kits/fork-remote.js +116 -0
  612. package/dist/kits/fork-remote.js.map +1 -0
  613. package/dist/kits/fork-sync-agent.d.ts +51 -0
  614. package/dist/kits/fork-sync-agent.d.ts.map +1 -0
  615. package/dist/kits/fork-sync-agent.js +435 -0
  616. package/dist/kits/fork-sync-agent.js.map +1 -0
  617. package/dist/kits/fork-sync.d.ts +32 -0
  618. package/dist/kits/fork-sync.d.ts.map +1 -0
  619. package/dist/kits/fork-sync.js +590 -0
  620. package/dist/kits/fork-sync.js.map +1 -0
  621. package/dist/kits/fork-trace.d.ts +29 -0
  622. package/dist/kits/fork-trace.d.ts.map +1 -0
  623. package/dist/kits/fork-trace.js +54 -0
  624. package/dist/kits/fork-trace.js.map +1 -0
  625. package/dist/kits/fork-types.d.ts +198 -0
  626. package/dist/kits/fork-types.d.ts.map +1 -0
  627. package/dist/kits/fork-types.js +16 -0
  628. package/dist/kits/fork-types.js.map +1 -0
  629. package/dist/kits/service.d.ts +63 -0
  630. package/dist/kits/service.d.ts.map +1 -0
  631. package/dist/kits/service.js +630 -0
  632. package/dist/kits/service.js.map +1 -0
  633. package/dist/prompts/database.d.ts +3 -0
  634. package/dist/prompts/database.d.ts.map +1 -0
  635. package/dist/prompts/database.js +144 -0
  636. package/dist/prompts/database.js.map +1 -0
  637. package/dist/prompts/llm.d.ts +3 -0
  638. package/dist/prompts/llm.d.ts.map +1 -0
  639. package/dist/prompts/llm.js +37 -0
  640. package/dist/prompts/llm.js.map +1 -0
  641. package/dist/prompts/logging.d.ts +3 -0
  642. package/dist/prompts/logging.d.ts.map +1 -0
  643. package/dist/prompts/logging.js +31 -0
  644. package/dist/prompts/logging.js.map +1 -0
  645. package/dist/prompts/secrets.d.ts +4 -0
  646. package/dist/prompts/secrets.d.ts.map +1 -0
  647. package/dist/prompts/secrets.js +85 -0
  648. package/dist/prompts/secrets.js.map +1 -0
  649. package/dist/prompts/server.d.ts +9 -0
  650. package/dist/prompts/server.d.ts.map +1 -0
  651. package/dist/prompts/server.js +154 -0
  652. package/dist/prompts/server.js.map +1 -0
  653. package/dist/prompts/storage.d.ts +4 -0
  654. package/dist/prompts/storage.d.ts.map +1 -0
  655. package/dist/prompts/storage.js +129 -0
  656. package/dist/prompts/storage.js.map +1 -0
  657. package/dist/runtime/agent-harness/auth-store.d.ts +8 -0
  658. package/dist/runtime/agent-harness/auth-store.d.ts.map +1 -0
  659. package/dist/runtime/agent-harness/auth-store.js +92 -0
  660. package/dist/runtime/agent-harness/auth-store.js.map +1 -0
  661. package/dist/runtime/artifact-contracts/index.d.ts +47 -0
  662. package/dist/runtime/artifact-contracts/index.d.ts.map +1 -0
  663. package/dist/runtime/artifact-contracts/index.js +153 -0
  664. package/dist/runtime/artifact-contracts/index.js.map +1 -0
  665. package/dist/runtime/artifact-contracts/types.d.ts +82 -0
  666. package/dist/runtime/artifact-contracts/types.d.ts.map +1 -0
  667. package/dist/runtime/artifact-contracts/types.js +16 -0
  668. package/dist/runtime/artifact-contracts/types.js.map +1 -0
  669. package/dist/runtime/cms-capability-registry/index.d.ts +30 -0
  670. package/dist/runtime/cms-capability-registry/index.d.ts.map +1 -0
  671. package/dist/runtime/cms-capability-registry/index.js +183 -0
  672. package/dist/runtime/cms-capability-registry/index.js.map +1 -0
  673. package/dist/runtime/cms-capability-registry/types.d.ts +109 -0
  674. package/dist/runtime/cms-capability-registry/types.d.ts.map +1 -0
  675. package/dist/runtime/cms-capability-registry/types.js +19 -0
  676. package/dist/runtime/cms-capability-registry/types.js.map +1 -0
  677. package/dist/runtime/cms-node-contracts/compile.d.ts +6 -0
  678. package/dist/runtime/cms-node-contracts/compile.d.ts.map +1 -0
  679. package/dist/runtime/cms-node-contracts/compile.js +57 -0
  680. package/dist/runtime/cms-node-contracts/compile.js.map +1 -0
  681. package/dist/runtime/cms-node-contracts/index.d.ts +6 -0
  682. package/dist/runtime/cms-node-contracts/index.d.ts.map +1 -0
  683. package/dist/runtime/cms-node-contracts/index.js +5 -0
  684. package/dist/runtime/cms-node-contracts/index.js.map +1 -0
  685. package/dist/runtime/cms-node-contracts/introspect.d.ts +5 -0
  686. package/dist/runtime/cms-node-contracts/introspect.d.ts.map +1 -0
  687. package/dist/runtime/cms-node-contracts/introspect.js +61 -0
  688. package/dist/runtime/cms-node-contracts/introspect.js.map +1 -0
  689. package/dist/runtime/cms-node-contracts/normalize.d.ts +5 -0
  690. package/dist/runtime/cms-node-contracts/normalize.d.ts.map +1 -0
  691. package/dist/runtime/cms-node-contracts/normalize.js +112 -0
  692. package/dist/runtime/cms-node-contracts/normalize.js.map +1 -0
  693. package/dist/runtime/cms-node-contracts/presenter.d.ts +9 -0
  694. package/dist/runtime/cms-node-contracts/presenter.d.ts.map +1 -0
  695. package/dist/runtime/cms-node-contracts/presenter.js +117 -0
  696. package/dist/runtime/cms-node-contracts/presenter.js.map +1 -0
  697. package/dist/runtime/cms-node-contracts/types.d.ts +76 -0
  698. package/dist/runtime/cms-node-contracts/types.d.ts.map +1 -0
  699. package/dist/runtime/cms-node-contracts/types.js +2 -0
  700. package/dist/runtime/cms-node-contracts/types.js.map +1 -0
  701. package/dist/runtime/dynamic-registry-pipeline/index.d.ts +41 -0
  702. package/dist/runtime/dynamic-registry-pipeline/index.d.ts.map +1 -0
  703. package/dist/runtime/dynamic-registry-pipeline/index.js +224 -0
  704. package/dist/runtime/dynamic-registry-pipeline/index.js.map +1 -0
  705. package/dist/runtime/dynamic-registry-pipeline/types.d.ts +61 -0
  706. package/dist/runtime/dynamic-registry-pipeline/types.d.ts.map +1 -0
  707. package/dist/runtime/dynamic-registry-pipeline/types.js +14 -0
  708. package/dist/runtime/dynamic-registry-pipeline/types.js.map +1 -0
  709. package/dist/runtime/hosted-execution-client/index.d.ts +45 -0
  710. package/dist/runtime/hosted-execution-client/index.d.ts.map +1 -0
  711. package/dist/runtime/hosted-execution-client/index.js +527 -0
  712. package/dist/runtime/hosted-execution-client/index.js.map +1 -0
  713. package/dist/runtime/hosted-execution-client/types.d.ts +125 -0
  714. package/dist/runtime/hosted-execution-client/types.d.ts.map +1 -0
  715. package/dist/runtime/hosted-execution-client/types.js +9 -0
  716. package/dist/runtime/hosted-execution-client/types.js.map +1 -0
  717. package/dist/runtime/index.d.ts +24 -0
  718. package/dist/runtime/index.d.ts.map +1 -0
  719. package/dist/runtime/index.js +24 -0
  720. package/dist/runtime/index.js.map +1 -0
  721. package/dist/runtime/machine-capability-resolver/index.d.ts +32 -0
  722. package/dist/runtime/machine-capability-resolver/index.d.ts.map +1 -0
  723. package/dist/runtime/machine-capability-resolver/index.js +131 -0
  724. package/dist/runtime/machine-capability-resolver/index.js.map +1 -0
  725. package/dist/runtime/machine-capability-resolver/types.d.ts +46 -0
  726. package/dist/runtime/machine-capability-resolver/types.d.ts.map +1 -0
  727. package/dist/runtime/machine-capability-resolver/types.js +13 -0
  728. package/dist/runtime/machine-capability-resolver/types.js.map +1 -0
  729. package/dist/runtime/native-intelligence/contract.d.ts +174 -0
  730. package/dist/runtime/native-intelligence/contract.d.ts.map +1 -0
  731. package/dist/runtime/native-intelligence/contract.js +23 -0
  732. package/dist/runtime/native-intelligence/contract.js.map +1 -0
  733. package/dist/runtime/native-intelligence/index.d.ts +38 -0
  734. package/dist/runtime/native-intelligence/index.d.ts.map +1 -0
  735. package/dist/runtime/native-intelligence/index.js +121 -0
  736. package/dist/runtime/native-intelligence/index.js.map +1 -0
  737. package/dist/runtime/native-intelligence/normalizer.d.ts +22 -0
  738. package/dist/runtime/native-intelligence/normalizer.d.ts.map +1 -0
  739. package/dist/runtime/native-intelligence/normalizer.js +307 -0
  740. package/dist/runtime/native-intelligence/normalizer.js.map +1 -0
  741. package/dist/runtime/native-intelligence/planner.d.ts +22 -0
  742. package/dist/runtime/native-intelligence/planner.d.ts.map +1 -0
  743. package/dist/runtime/native-intelligence/planner.js +312 -0
  744. package/dist/runtime/native-intelligence/planner.js.map +1 -0
  745. package/dist/runtime/native-intelligence/provider.d.ts +27 -0
  746. package/dist/runtime/native-intelligence/provider.d.ts.map +1 -0
  747. package/dist/runtime/native-intelligence/provider.js +221 -0
  748. package/dist/runtime/native-intelligence/provider.js.map +1 -0
  749. package/dist/runtime/native-intelligence/recommender.d.ts +23 -0
  750. package/dist/runtime/native-intelligence/recommender.d.ts.map +1 -0
  751. package/dist/runtime/native-intelligence/recommender.js +299 -0
  752. package/dist/runtime/native-intelligence/recommender.js.map +1 -0
  753. package/dist/runtime/native-intelligence/summarizer.d.ts +22 -0
  754. package/dist/runtime/native-intelligence/summarizer.d.ts.map +1 -0
  755. package/dist/runtime/native-intelligence/summarizer.js +228 -0
  756. package/dist/runtime/native-intelligence/summarizer.js.map +1 -0
  757. package/dist/runtime/open-agents/contract.d.ts +58 -0
  758. package/dist/runtime/open-agents/contract.d.ts.map +1 -0
  759. package/dist/runtime/open-agents/contract.js +26 -0
  760. package/dist/runtime/open-agents/contract.js.map +1 -0
  761. package/dist/runtime/open-agents/index.d.ts +15 -0
  762. package/dist/runtime/open-agents/index.d.ts.map +1 -0
  763. package/dist/runtime/open-agents/index.js +72 -0
  764. package/dist/runtime/open-agents/index.js.map +1 -0
  765. package/dist/runtime/open-agents/provider.d.ts +32 -0
  766. package/dist/runtime/open-agents/provider.d.ts.map +1 -0
  767. package/dist/runtime/open-agents/provider.js +190 -0
  768. package/dist/runtime/open-agents/provider.js.map +1 -0
  769. package/dist/runtime/qwen-code/contract.d.ts +79 -0
  770. package/dist/runtime/qwen-code/contract.d.ts.map +1 -0
  771. package/dist/runtime/qwen-code/contract.js +40 -0
  772. package/dist/runtime/qwen-code/contract.js.map +1 -0
  773. package/dist/runtime/qwen-code/health.d.ts +11 -0
  774. package/dist/runtime/qwen-code/health.d.ts.map +1 -0
  775. package/dist/runtime/qwen-code/health.js +111 -0
  776. package/dist/runtime/qwen-code/health.js.map +1 -0
  777. package/dist/runtime/qwen-code/index.d.ts +26 -0
  778. package/dist/runtime/qwen-code/index.d.ts.map +1 -0
  779. package/dist/runtime/qwen-code/index.js +93 -0
  780. package/dist/runtime/qwen-code/index.js.map +1 -0
  781. package/dist/runtime/qwen-code/provider.d.ts +23 -0
  782. package/dist/runtime/qwen-code/provider.d.ts.map +1 -0
  783. package/dist/runtime/qwen-code/provider.js +134 -0
  784. package/dist/runtime/qwen-code/provider.js.map +1 -0
  785. package/dist/runtime/workflow-hygiene/index.d.ts +4 -0
  786. package/dist/runtime/workflow-hygiene/index.d.ts.map +1 -0
  787. package/dist/runtime/workflow-hygiene/index.js +3 -0
  788. package/dist/runtime/workflow-hygiene/index.js.map +1 -0
  789. package/dist/runtime/workflow-hygiene/labels.d.ts +4 -0
  790. package/dist/runtime/workflow-hygiene/labels.d.ts.map +1 -0
  791. package/dist/runtime/workflow-hygiene/labels.js +64 -0
  792. package/dist/runtime/workflow-hygiene/labels.js.map +1 -0
  793. package/dist/runtime/workflow-hygiene/summaries.d.ts +11 -0
  794. package/dist/runtime/workflow-hygiene/summaries.d.ts.map +1 -0
  795. package/dist/runtime/workflow-hygiene/summaries.js +17 -0
  796. package/dist/runtime/workflow-hygiene/summaries.js.map +1 -0
  797. package/dist/runtime/workflow-hygiene/types.d.ts +12 -0
  798. package/dist/runtime/workflow-hygiene/types.d.ts.map +1 -0
  799. package/dist/runtime/workflow-hygiene/types.js +2 -0
  800. package/dist/runtime/workflow-hygiene/types.js.map +1 -0
  801. package/dist/starter/init.d.ts +18 -0
  802. package/dist/starter/init.d.ts.map +1 -0
  803. package/dist/starter/init.js +108 -0
  804. package/dist/starter/init.js.map +1 -0
  805. package/dist/starter/source-import/agent.d.ts +60 -0
  806. package/dist/starter/source-import/agent.d.ts.map +1 -0
  807. package/dist/starter/source-import/agent.js +302 -0
  808. package/dist/starter/source-import/agent.js.map +1 -0
  809. package/dist/starter/source-import/detect.d.ts +20 -0
  810. package/dist/starter/source-import/detect.d.ts.map +1 -0
  811. package/dist/starter/source-import/detect.js +197 -0
  812. package/dist/starter/source-import/detect.js.map +1 -0
  813. package/dist/starter/source-import/github-source.d.ts +66 -0
  814. package/dist/starter/source-import/github-source.d.ts.map +1 -0
  815. package/dist/starter/source-import/github-source.js +233 -0
  816. package/dist/starter/source-import/github-source.js.map +1 -0
  817. package/dist/starter/source-import/index.d.ts +31 -0
  818. package/dist/starter/source-import/index.d.ts.map +1 -0
  819. package/dist/starter/source-import/index.js +31 -0
  820. package/dist/starter/source-import/index.js.map +1 -0
  821. package/dist/starter/source-import/materialize.d.ts +61 -0
  822. package/dist/starter/source-import/materialize.d.ts.map +1 -0
  823. package/dist/starter/source-import/materialize.js +260 -0
  824. package/dist/starter/source-import/materialize.js.map +1 -0
  825. package/dist/starter/source-import/plan.d.ts +39 -0
  826. package/dist/starter/source-import/plan.d.ts.map +1 -0
  827. package/dist/starter/source-import/plan.js +158 -0
  828. package/dist/starter/source-import/plan.js.map +1 -0
  829. package/dist/starter/source-import/security.d.ts +42 -0
  830. package/dist/starter/source-import/security.d.ts.map +1 -0
  831. package/dist/starter/source-import/security.js +323 -0
  832. package/dist/starter/source-import/security.js.map +1 -0
  833. package/dist/starter/source-import/skills-source.d.ts +28 -0
  834. package/dist/starter/source-import/skills-source.d.ts.map +1 -0
  835. package/dist/starter/source-import/skills-source.js +419 -0
  836. package/dist/starter/source-import/skills-source.js.map +1 -0
  837. package/dist/starter/source-import/summarize.d.ts +25 -0
  838. package/dist/starter/source-import/summarize.d.ts.map +1 -0
  839. package/dist/starter/source-import/summarize.js +107 -0
  840. package/dist/starter/source-import/summarize.js.map +1 -0
  841. package/dist/starter/source-import/types.d.ts +357 -0
  842. package/dist/starter/source-import/types.d.ts.map +1 -0
  843. package/dist/starter/source-import/types.js +28 -0
  844. package/dist/starter/source-import/types.js.map +1 -0
  845. package/dist/starter/types.d.ts +46 -0
  846. package/dist/starter/types.d.ts.map +1 -0
  847. package/dist/starter/types.js +11 -0
  848. package/dist/starter/types.js.map +1 -0
  849. package/dist/status/probes.d.ts +25 -0
  850. package/dist/status/probes.d.ts.map +1 -0
  851. package/dist/status/probes.js +297 -0
  852. package/dist/status/probes.js.map +1 -0
  853. package/dist/status/runner.d.ts +18 -0
  854. package/dist/status/runner.d.ts.map +1 -0
  855. package/dist/status/runner.js +185 -0
  856. package/dist/status/runner.js.map +1 -0
  857. package/dist/status/types.d.ts +60 -0
  858. package/dist/status/types.d.ts.map +1 -0
  859. package/dist/status/types.js +13 -0
  860. package/dist/status/types.js.map +1 -0
  861. package/dist/templates/catalog.d.ts +12 -0
  862. package/dist/templates/catalog.d.ts.map +1 -0
  863. package/dist/templates/catalog.js +226 -0
  864. package/dist/templates/catalog.js.map +1 -0
  865. package/dist/templates/contract.d.ts +62 -0
  866. package/dist/templates/contract.d.ts.map +1 -0
  867. package/dist/templates/contract.js +12 -0
  868. package/dist/templates/contract.js.map +1 -0
  869. package/dist/templates/index.d.ts +5 -0
  870. package/dist/templates/index.d.ts.map +1 -0
  871. package/dist/templates/index.js +2 -0
  872. package/dist/templates/index.js.map +1 -0
  873. package/dist/templates/service.d.ts +19 -0
  874. package/dist/templates/service.d.ts.map +1 -0
  875. package/dist/templates/service.js +132 -0
  876. package/dist/templates/service.js.map +1 -0
  877. package/dist/utils/banner.d.ts +2 -0
  878. package/dist/utils/banner.d.ts.map +1 -0
  879. package/dist/utils/banner.js.map +1 -0
  880. package/dist/utils/net.d.ts +5 -0
  881. package/dist/utils/net.d.ts.map +1 -0
  882. package/dist/utils/net.js +19 -0
  883. package/dist/utils/net.js.map +1 -0
  884. package/dist/utils/path-resolver.d.ts +2 -0
  885. package/dist/utils/path-resolver.d.ts.map +1 -0
  886. package/dist/utils/path-resolver.js +22 -0
  887. package/dist/utils/path-resolver.js.map +1 -0
  888. package/dist/utils/progress.d.ts +24 -0
  889. package/dist/utils/progress.d.ts.map +1 -0
  890. package/dist/utils/progress.js +57 -0
  891. package/dist/utils/progress.js.map +1 -0
  892. package/dist/utils/table-renderer.d.ts +28 -0
  893. package/dist/utils/table-renderer.d.ts.map +1 -0
  894. package/dist/utils/table-renderer.js +83 -0
  895. package/dist/utils/table-renderer.js.map +1 -0
  896. package/package.json +1 -1
@@ -0,0 +1,1338 @@
1
+ /**
2
+ * Kit Fork Commands
3
+ *
4
+ * CLI command surface for the worker kit fork & self-healing sync subsystem.
5
+ * Follows the exact same Clack + Commander patterns as kit.ts, template.ts, etc.
6
+ *
7
+ * Commands registered:
8
+ * growthub kit fork # interactive hub (also callable from discovery)
9
+ * growthub kit fork register <path> # register a fork directory
10
+ * growthub kit fork list # list registered forks
11
+ * growthub kit fork status <fork-id> # drift report
12
+ * growthub kit fork heal <fork-id> # heal interactively
13
+ * growthub kit fork jobs # background job queue
14
+ * growthub kit fork deregister <fork-id> # remove registration
15
+ *
16
+ * Top-level shortcut (also wired by index.ts):
17
+ * growthub fork-sync → same hub as above
18
+ */
19
+ import * as p from "@clack/prompts";
20
+ import { registerKitForkRemoteSubcommands } from "./kit-fork-remote.js";
21
+ import pc from "picocolors";
22
+ import { printPaperclipCliBanner } from "../utils/banner.js";
23
+ import { renderTable } from "../utils/table-renderer.js";
24
+ import { renderProgressBar, formatRelative } from "../utils/progress.js";
25
+ import { registerKitFork, listKitForkRegistrations, deregisterKitFork, } from "../kits/fork-registry.js";
26
+ import { detectKitForkDrift, buildKitForkHealPlan, } from "../kits/fork-sync.js";
27
+ import { runKitForkSyncJob, dispatchKitForkSyncJobBackground, listKitForkSyncJobs, cancelKitForkSyncJob, pruneKitForkSyncJobs, getKitForkSyncJob, } from "../kits/fork-sync-agent.js";
28
+ import { listBundledKits } from "../kits/service.js";
29
+ import { readKitForkPolicy, isUntouchable, } from "../kits/fork-policy.js";
30
+ import { appendKitForkTraceEvent, readKitForkTrace } from "../kits/fork-trace.js";
31
+ // ---------------------------------------------------------------------------
32
+ // Display helpers (mirrors patterns from kit.ts)
33
+ // ---------------------------------------------------------------------------
34
+ function hr(width = 72) {
35
+ return pc.dim("─".repeat(width));
36
+ }
37
+ function severityBadge(s) {
38
+ switch (s) {
39
+ case "critical": return pc.red("● critical");
40
+ case "warning": return pc.yellow("● warning");
41
+ case "info": return pc.cyan("● info");
42
+ default: return pc.green("● in-sync");
43
+ }
44
+ }
45
+ function jobStatusBadge(status) {
46
+ switch (status) {
47
+ case "running": return pc.cyan("⟳ running");
48
+ case "completed": return pc.green("✓ completed");
49
+ case "failed": return pc.red("✗ failed");
50
+ case "cancelled": return pc.dim("○ cancelled");
51
+ default: return pc.dim("… pending");
52
+ }
53
+ }
54
+ function formatDate(iso) {
55
+ if (!iso)
56
+ return pc.dim("—");
57
+ return new Date(iso).toLocaleString();
58
+ }
59
+ function printDriftReport(report) {
60
+ console.log("");
61
+ console.log(pc.bold(`Fork: ${report.forkId}`) + " " + severityBadge(report.overallSeverity));
62
+ console.log(pc.dim(`Kit: ${report.kitId}`) +
63
+ " " +
64
+ pc.dim(`fork v${report.forkVersion} → upstream v${report.upstreamVersion}`));
65
+ console.log(hr());
66
+ if (report.fileDrifts.length === 0 && report.packageDrifts.length === 0) {
67
+ console.log(pc.green(" No drift detected — fork is in sync."));
68
+ }
69
+ if (report.fileDrifts.length > 0) {
70
+ console.log(pc.bold("\n File Drift:"));
71
+ for (const d of report.fileDrifts) {
72
+ const badge = d.changeType === "added" ? pc.cyan(" +") :
73
+ d.changeType === "modified" ? pc.yellow(" ~") :
74
+ pc.red(" -");
75
+ console.log(`${badge} ${d.relativePath} ${pc.dim(d.description)}`);
76
+ }
77
+ }
78
+ if (report.packageDrifts.length > 0) {
79
+ console.log(pc.bold("\n Package Drift:"));
80
+ for (const d of report.packageDrifts) {
81
+ const badge = d.changeType === "added" ? pc.cyan(" +") :
82
+ d.changeType === "updated" ? pc.yellow(" ~") :
83
+ pc.red(" -");
84
+ const ver = d.forkVersion
85
+ ? `${d.forkVersion} → ${d.upstreamVersion}`
86
+ : `(new) ${d.upstreamVersion}`;
87
+ console.log(`${badge} ${d.packageName} ${pc.dim(ver)}`);
88
+ }
89
+ }
90
+ if (report.customSkillsDetected.length > 0) {
91
+ console.log(pc.bold("\n Custom Skills Detected (always preserved):"));
92
+ for (const s of report.customSkillsDetected) {
93
+ console.log(` ${pc.magenta("⚑")} ${s}`);
94
+ }
95
+ }
96
+ console.log("");
97
+ console.log(hr());
98
+ }
99
+ function printHealPlan(plan) {
100
+ console.log("");
101
+ console.log(pc.bold(`Heal Plan: ${plan.forkId}`) +
102
+ pc.dim(` v${plan.fromVersion} → v${plan.toVersion}`));
103
+ console.log(pc.dim("Estimated risk: ") + severityBadge(plan.estimatedRisk));
104
+ console.log(hr());
105
+ if (plan.actions.length === 0) {
106
+ console.log(pc.green(" No actions needed."));
107
+ }
108
+ else {
109
+ console.log(pc.bold(` ${plan.actions.length} action(s) planned:`));
110
+ for (const a of plan.actions) {
111
+ const icon = a.actionType === "skip_user_modified" ? pc.dim(" ○") : pc.cyan(" →");
112
+ console.log(`${icon} ${a.description}`);
113
+ }
114
+ }
115
+ if (plan.preservedPaths.length > 0) {
116
+ console.log(pc.bold(`\n ${plan.preservedPaths.length} path(s) preserved (user modifications kept):`));
117
+ for (const pp of plan.preservedPaths) {
118
+ console.log(pc.dim(` ⚑ ${pp}`));
119
+ }
120
+ }
121
+ console.log("");
122
+ console.log(hr());
123
+ }
124
+ function statusIconForDrift(severity) {
125
+ switch (severity) {
126
+ case "critical": return pc.red("✗ drift-major");
127
+ case "warning": return pc.yellow("⚠ drift-warn");
128
+ case "info": return pc.cyan("~ drift-minor");
129
+ default: return pc.green("✓ synced");
130
+ }
131
+ }
132
+ function summarizeFork(fork, opts = {}) {
133
+ let severity = "unknown";
134
+ let upstreamVersion = null;
135
+ let lastHealAt = fork.lastSyncedAt ?? null;
136
+ if (!opts.skipUpstreamCheck) {
137
+ try {
138
+ const report = detectKitForkDrift(fork);
139
+ severity = report.overallSeverity;
140
+ upstreamVersion = report.upstreamVersion;
141
+ }
142
+ catch {
143
+ severity = "unknown";
144
+ }
145
+ }
146
+ let protectedPaths = [];
147
+ try {
148
+ const policy = readKitForkPolicy(fork.forkPath);
149
+ protectedPaths = policy.untouchablePaths.slice(0, 3);
150
+ }
151
+ catch { /* tolerant */ }
152
+ if (!lastHealAt) {
153
+ try {
154
+ const events = readKitForkTrace(fork.forkPath);
155
+ const last = [...events].reverse().find((e) => e.type === "heal_applied");
156
+ if (last)
157
+ lastHealAt = last.timestamp;
158
+ }
159
+ catch { /* tolerant */ }
160
+ }
161
+ return {
162
+ forkId: fork.forkId,
163
+ label: fork.label ?? null,
164
+ kitId: fork.kitId,
165
+ baseVersion: fork.baseVersion,
166
+ forkPath: fork.forkPath,
167
+ severity,
168
+ upstreamVersion,
169
+ protectedPaths,
170
+ lastHealAt,
171
+ hasRemote: Boolean(fork.remote),
172
+ };
173
+ }
174
+ function renderForkTable(summaries) {
175
+ return renderTable({
176
+ columns: [
177
+ {
178
+ key: "forkId",
179
+ label: "Fork ID",
180
+ maxWidth: 26,
181
+ format: (v, row) => pc.cyan(row.label ?? String(v)),
182
+ },
183
+ {
184
+ key: "kitId",
185
+ label: "Kit",
186
+ maxWidth: 22,
187
+ },
188
+ {
189
+ key: "baseVersion",
190
+ label: "Base",
191
+ format: (v) => `v${v}`,
192
+ },
193
+ {
194
+ key: "upstreamVersion",
195
+ label: "Upstream",
196
+ format: (v) => (v ? `v${v}` : pc.dim("—")),
197
+ },
198
+ {
199
+ key: "severity",
200
+ label: "Status",
201
+ format: (v) => v === "unknown" ? pc.dim("○ unknown") : statusIconForDrift(v),
202
+ },
203
+ {
204
+ key: "protectedPaths",
205
+ label: "Protected",
206
+ maxWidth: 18,
207
+ format: (v) => {
208
+ const arr = v;
209
+ if (!arr || arr.length === 0)
210
+ return pc.dim("—");
211
+ return arr.join(",");
212
+ },
213
+ },
214
+ {
215
+ key: "lastHealAt",
216
+ label: "Last Heal",
217
+ format: (v) => (v ? formatRelative(v) : pc.dim("—")),
218
+ },
219
+ ],
220
+ rows: summaries,
221
+ emptyText: "No forks registered yet. Run `growthub kit fork register <path>` to get started.",
222
+ });
223
+ }
224
+ function printForkList(forks) {
225
+ if (forks.length === 0) {
226
+ console.log(pc.dim(" No forks registered yet. Run `growthub kit fork register <path>` to get started."));
227
+ return;
228
+ }
229
+ const summaries = forks.map((f) => summarizeFork(f, { skipUpstreamCheck: true }));
230
+ console.log("");
231
+ console.log(pc.bold("Registered Kit Forks") + pc.dim(` ${forks.length} total`));
232
+ console.log(hr());
233
+ console.log(renderForkTable(summaries));
234
+ console.log("");
235
+ console.log(hr());
236
+ }
237
+ // ---------------------------------------------------------------------------
238
+ // Heal preview — rich grouped rendering
239
+ // ---------------------------------------------------------------------------
240
+ function groupHealActions(plan) {
241
+ const safeAdd = [];
242
+ const safeUpdate = [];
243
+ const protectedActions = [];
244
+ const unresolved = [];
245
+ for (const a of plan.actions) {
246
+ if (a.actionType === "skip_user_modified") {
247
+ protectedActions.push(a);
248
+ continue;
249
+ }
250
+ if (a.needsConfirmation) {
251
+ unresolved.push(a);
252
+ continue;
253
+ }
254
+ if (a.actionType === "add_file" || a.actionType === "add_custom_skill") {
255
+ safeAdd.push(a);
256
+ continue;
257
+ }
258
+ safeUpdate.push(a);
259
+ }
260
+ return { safeAdd, safeUpdate, protected: protectedActions, unresolved };
261
+ }
262
+ function printRichHealPreview(plan, policy) {
263
+ const g = groupHealActions(plan);
264
+ console.log("");
265
+ console.log(pc.bold(`Heal Plan: ${plan.forkId}`) +
266
+ pc.dim(` v${plan.fromVersion} → v${plan.toVersion}`));
267
+ console.log(pc.dim("Estimated risk: ") + severityBadge(plan.estimatedRisk));
268
+ console.log(hr());
269
+ if (g.safeAdd.length > 0) {
270
+ console.log(pc.bold(`\n SAFE ADDITIONS (${g.safeAdd.length}):`));
271
+ for (const a of g.safeAdd) {
272
+ console.log(` ${pc.green("+")} ${a.targetPath} ${pc.dim(a.description)}`);
273
+ }
274
+ }
275
+ if (g.safeUpdate.length > 0) {
276
+ console.log(pc.bold(`\n SAFE UPDATES (${g.safeUpdate.length}):`));
277
+ for (const a of g.safeUpdate) {
278
+ console.log(` ${pc.yellow("~")} ${a.targetPath} ${pc.dim(a.description)}`);
279
+ }
280
+ }
281
+ if (g.protected.length > 0 || plan.preservedPaths.length > 0) {
282
+ const paths = new Set([
283
+ ...g.protected.map((a) => a.targetPath),
284
+ ...plan.preservedPaths,
285
+ ]);
286
+ console.log(pc.bold(`\n PROTECTED (${paths.size}):`));
287
+ for (const pth of paths) {
288
+ const reason = policy && isUntouchable(policy, pth)
289
+ ? "policy.untouchablePaths"
290
+ : "user-modified";
291
+ console.log(` ${pc.dim("○")} ${pth} ${pc.dim(`(${reason})`)}`);
292
+ }
293
+ }
294
+ if (g.unresolved.length > 0) {
295
+ console.log(pc.bold(`\n UNRESOLVED — needs confirmation (${g.unresolved.length}):`));
296
+ for (const a of g.unresolved) {
297
+ console.log(` ${pc.red("!")} ${a.targetPath} ${pc.dim(a.confirmationReason ?? "policy.confirmBeforeChange")}`);
298
+ }
299
+ }
300
+ console.log("");
301
+ console.log(pc.bold(" DECISION:"));
302
+ const applyCount = g.safeAdd.length + g.safeUpdate.length;
303
+ const skipCount = g.protected.length + plan.preservedPaths.length;
304
+ console.log(` ${pc.green(String(applyCount))} will apply · ${pc.dim(String(skipCount) + " protected")} · ${g.unresolved.length > 0 ? pc.red(String(g.unresolved.length) + " unresolved") : pc.dim("0 unresolved")}`);
305
+ console.log(hr());
306
+ }
307
+ function printNextStepsAfterStatus(forkId, hasDrift) {
308
+ console.log("");
309
+ console.log(pc.bold(" Next steps:"));
310
+ if (hasDrift) {
311
+ console.log(` ${pc.cyan("growthub kit fork heal " + forkId + " --preview")} ${pc.dim("rich heal preview")}`);
312
+ console.log(` ${pc.cyan("growthub kit fork heal " + forkId)} ${pc.dim("apply interactively")}`);
313
+ }
314
+ console.log(` ${pc.cyan("growthub kit fork policy " + forkId)} ${pc.dim("interactive policy editor")}`);
315
+ console.log(` ${pc.cyan("growthub kit fork history " + forkId)} ${pc.dim("audit timeline")}`);
316
+ console.log("");
317
+ }
318
+ // ---------------------------------------------------------------------------
319
+ // Jobs table + watch + tail helpers
320
+ // ---------------------------------------------------------------------------
321
+ function estimateJobProgress(job) {
322
+ if (!job.healPlan)
323
+ return null;
324
+ const total = job.healPlan.actions.length;
325
+ if (total === 0)
326
+ return null;
327
+ if (job.healResult) {
328
+ const done = job.healResult.appliedCount + job.healResult.skippedCount;
329
+ return { current: Math.min(done, total), total };
330
+ }
331
+ return { current: 0, total };
332
+ }
333
+ function renderJobTable(jobs) {
334
+ return renderTable({
335
+ columns: [
336
+ {
337
+ key: "jobId",
338
+ label: "Job ID",
339
+ maxWidth: 28,
340
+ format: (v) => pc.cyan(String(v)),
341
+ },
342
+ {
343
+ key: "forkId",
344
+ label: "Fork ID",
345
+ maxWidth: 22,
346
+ format: (v) => pc.dim(String(v)),
347
+ },
348
+ {
349
+ key: "status",
350
+ label: "Status",
351
+ format: (v) => jobStatusBadge(v),
352
+ },
353
+ {
354
+ key: "healPlan",
355
+ label: "Progress",
356
+ maxWidth: 28,
357
+ format: (_v, row) => {
358
+ const prog = estimateJobProgress(row);
359
+ if (!prog) {
360
+ if (row.status === "completed")
361
+ return pc.green("✓ 100%");
362
+ if (row.status === "failed")
363
+ return pc.red("✗");
364
+ return pc.dim("—");
365
+ }
366
+ return renderProgressBar(prog.current, prog.total, { width: 14, showCounts: true });
367
+ },
368
+ },
369
+ {
370
+ key: "createdAt",
371
+ label: "Age",
372
+ format: (_v, row) => formatRelative(row.completedAt ?? row.createdAt),
373
+ },
374
+ ],
375
+ rows: jobs,
376
+ emptyText: "No jobs found.",
377
+ });
378
+ }
379
+ function printJobDetail(job) {
380
+ console.log(` ${jobStatusBadge(job.status)} ${pc.cyan(job.jobId)} ${pc.dim(job.forkId)}`);
381
+ const prog = estimateJobProgress(job);
382
+ if (prog) {
383
+ console.log(` ${pc.dim("Progress:")} ${renderProgressBar(prog.current, prog.total, { width: 24 })}`);
384
+ }
385
+ if (job.healPlan) {
386
+ console.log(` ${pc.dim("Plan:")} ${job.healPlan.actions.length} action(s), risk=${job.healPlan.estimatedRisk}`);
387
+ }
388
+ if (job.startedAt)
389
+ console.log(` ${pc.dim("Started:")} ${formatRelative(job.startedAt)} (${job.startedAt})`);
390
+ if (job.completedAt)
391
+ console.log(` ${pc.dim("Completed:")} ${formatRelative(job.completedAt)} (${job.completedAt})`);
392
+ if (job.error)
393
+ console.log(` ${pc.red("Error:")} ${job.error}`);
394
+ }
395
+ const TERMINAL_JOB_STATUSES = [
396
+ "completed",
397
+ "failed",
398
+ "cancelled",
399
+ ];
400
+ async function watchJob(jobId, jsonMode) {
401
+ const initial = getKitForkSyncJob(jobId);
402
+ if (!initial) {
403
+ console.error(pc.red(`Job not found: ${jobId}`));
404
+ process.exitCode = 1;
405
+ return;
406
+ }
407
+ if (jsonMode) {
408
+ const snapshot = await pollUntilTerminal(jobId);
409
+ console.log(JSON.stringify(snapshot, null, 2));
410
+ return;
411
+ }
412
+ console.log("");
413
+ console.log(pc.bold(`Watching job ${pc.cyan(jobId)}`));
414
+ console.log(hr());
415
+ let lastStatus = null;
416
+ let lastProgress = -1;
417
+ // Poll inline; exit as soon as the job reaches a terminal state.
418
+ // Poll interval is conservative (500ms) to avoid busy-waiting.
419
+ // eslint-disable-next-line no-constant-condition
420
+ while (true) {
421
+ const job = getKitForkSyncJob(jobId);
422
+ if (!job) {
423
+ console.error(pc.red(` Job disappeared: ${jobId}`));
424
+ process.exitCode = 1;
425
+ return;
426
+ }
427
+ const prog = estimateJobProgress(job);
428
+ const progNum = prog ? Math.round((prog.current / (prog.total || 1)) * 100) : -1;
429
+ if (job.status !== lastStatus || progNum !== lastProgress) {
430
+ printJobDetail(job);
431
+ lastStatus = job.status;
432
+ lastProgress = progNum;
433
+ }
434
+ if (TERMINAL_JOB_STATUSES.includes(job.status)) {
435
+ console.log("");
436
+ if (job.status === "failed")
437
+ process.exitCode = 1;
438
+ return;
439
+ }
440
+ await sleep(500);
441
+ }
442
+ }
443
+ async function pollUntilTerminal(jobId) {
444
+ // eslint-disable-next-line no-constant-condition
445
+ while (true) {
446
+ const job = getKitForkSyncJob(jobId);
447
+ if (!job)
448
+ throw new Error(`Job disappeared: ${jobId}`);
449
+ if (TERMINAL_JOB_STATUSES.includes(job.status))
450
+ return job;
451
+ await sleep(500);
452
+ }
453
+ }
454
+ function sleep(ms) {
455
+ return new Promise((resolve) => setTimeout(resolve, ms));
456
+ }
457
+ function tailJobTrace(jobId, limit, jsonMode) {
458
+ const job = getKitForkSyncJob(jobId);
459
+ if (!job) {
460
+ console.error(pc.red(`Job not found: ${jobId}`));
461
+ process.exitCode = 1;
462
+ return;
463
+ }
464
+ const reg = listKitForkRegistrations().find((f) => f.forkId === job.forkId);
465
+ if (!reg) {
466
+ console.error(pc.red(`Fork not registered for job ${jobId}: ${job.forkId}`));
467
+ process.exitCode = 1;
468
+ return;
469
+ }
470
+ const events = readKitForkTrace(reg.forkPath)
471
+ .filter((e) => e.jobId === jobId)
472
+ .slice(-Math.max(1, limit));
473
+ if (jsonMode) {
474
+ console.log(JSON.stringify(events, null, 2));
475
+ return;
476
+ }
477
+ console.log("");
478
+ console.log(pc.bold(`Trace tail: ${pc.cyan(jobId)}`) + pc.dim(` ${events.length} event(s)`));
479
+ console.log(hr());
480
+ if (events.length === 0) {
481
+ console.log(pc.dim(` No trace events recorded for this job yet.`));
482
+ console.log("");
483
+ return;
484
+ }
485
+ for (const e of events) {
486
+ const ts = e.timestamp.replace("T", " ").replace(/\..+Z$/, "Z");
487
+ console.log(` ${pc.dim(ts)} ${pc.cyan("[" + e.type + "]")} ${e.summary ?? ""}`);
488
+ }
489
+ console.log("");
490
+ }
491
+ // ---------------------------------------------------------------------------
492
+ // Interactive hub (exported for use in index.ts Discovery Hub)
493
+ // ---------------------------------------------------------------------------
494
+ export async function runKitForkHub(opts = {}) {
495
+ printPaperclipCliBanner();
496
+ p.intro(pc.bold("Kit Fork Sync Agent"));
497
+ while (true) {
498
+ const choice = await p.select({
499
+ message: "What do you want to do?",
500
+ options: [
501
+ {
502
+ value: "register",
503
+ label: "📂 Register a fork",
504
+ hint: "Track a downloaded and customised worker kit directory",
505
+ },
506
+ {
507
+ value: "list",
508
+ label: "📋 List forks",
509
+ hint: "Browse all registered forks",
510
+ },
511
+ {
512
+ value: "status",
513
+ label: "🔍 Check drift",
514
+ hint: "Detect what has changed between your fork and the latest upstream kit",
515
+ },
516
+ {
517
+ value: "heal",
518
+ label: "🔧 Heal fork",
519
+ hint: "Sync to latest upstream while preserving all your customisations",
520
+ },
521
+ {
522
+ value: "jobs",
523
+ label: "⚙️ Background jobs",
524
+ hint: "View status of async sync jobs",
525
+ },
526
+ ...(opts.allowBackToHub
527
+ ? [{ value: "__back_to_hub", label: "← Back to main menu" }]
528
+ : []),
529
+ ],
530
+ });
531
+ if (p.isCancel(choice)) {
532
+ p.cancel("Cancelled.");
533
+ process.exit(0);
534
+ }
535
+ if (choice === "__back_to_hub")
536
+ return "back";
537
+ if (choice === "register") {
538
+ await runRegisterFlow();
539
+ continue;
540
+ }
541
+ if (choice === "list") {
542
+ runListFlow();
543
+ continue;
544
+ }
545
+ if (choice === "status") {
546
+ await runStatusFlow();
547
+ continue;
548
+ }
549
+ if (choice === "heal") {
550
+ await runHealFlow();
551
+ continue;
552
+ }
553
+ if (choice === "jobs") {
554
+ await runJobsFlow();
555
+ continue;
556
+ }
557
+ }
558
+ }
559
+ // ---------------------------------------------------------------------------
560
+ // Register flow
561
+ // ---------------------------------------------------------------------------
562
+ async function runRegisterFlow() {
563
+ const rawPath = await p.text({
564
+ message: "Enter the path to your fork directory",
565
+ placeholder: "/Users/you/kits/my-higgsfield-fork",
566
+ validate(v) { if (!v.trim())
567
+ return "Path is required"; },
568
+ });
569
+ if (p.isCancel(rawPath)) {
570
+ p.cancel("Cancelled.");
571
+ return;
572
+ }
573
+ const kits = listBundledKits();
574
+ const kitChoice = await p.select({
575
+ message: "Which worker kit is this fork based on?",
576
+ options: [
577
+ ...kits.map((k) => ({
578
+ value: k.id,
579
+ label: k.id + " " + pc.dim("v" + k.version),
580
+ hint: k.description,
581
+ })),
582
+ { value: "__cancel", label: "← Cancel" },
583
+ ],
584
+ });
585
+ if (p.isCancel(kitChoice) || kitChoice === "__cancel") {
586
+ p.cancel("Cancelled.");
587
+ return;
588
+ }
589
+ const labelInput = await p.text({
590
+ message: "Friendly label for this fork (optional)",
591
+ placeholder: "My Production Higgsfield Setup",
592
+ });
593
+ if (p.isCancel(labelInput)) {
594
+ p.cancel("Cancelled.");
595
+ return;
596
+ }
597
+ const kitVersion = kits.find((k) => k.id === kitChoice)?.version ?? "0.0.0";
598
+ const spinner = p.spinner();
599
+ spinner.start("Registering fork...");
600
+ try {
601
+ const reg = registerKitFork({
602
+ forkPath: rawPath.trim(),
603
+ kitId: kitChoice,
604
+ baseVersion: kitVersion,
605
+ label: labelInput.trim() || undefined,
606
+ });
607
+ spinner.stop(pc.green("Fork registered."));
608
+ p.note([
609
+ `Fork ID: ${pc.cyan(reg.forkId)}`,
610
+ `Kit: ${reg.kitId} v${reg.baseVersion}`,
611
+ `Path: ${reg.forkPath}`,
612
+ "",
613
+ `Next: ${pc.cyan("growthub kit fork status " + reg.forkId)}`,
614
+ ].join("\n"), "Registration complete");
615
+ }
616
+ catch (err) {
617
+ spinner.stop(pc.red("Registration failed."));
618
+ p.log.error(err.message);
619
+ }
620
+ }
621
+ // ---------------------------------------------------------------------------
622
+ // List flow
623
+ // ---------------------------------------------------------------------------
624
+ function runListFlow() {
625
+ printForkList(listKitForkRegistrations());
626
+ }
627
+ // ---------------------------------------------------------------------------
628
+ // Status / drift flow
629
+ // ---------------------------------------------------------------------------
630
+ async function runStatusFlow() {
631
+ const forks = listKitForkRegistrations();
632
+ if (forks.length === 0) {
633
+ p.note("No forks registered. Use 'Register a fork' first.", "Nothing to inspect");
634
+ return;
635
+ }
636
+ const choice = await p.select({
637
+ message: "Select a fork to check",
638
+ options: [
639
+ ...forks.map((f) => ({
640
+ value: f.forkId,
641
+ label: (f.label ?? f.forkId) + " " + pc.dim("v" + f.baseVersion),
642
+ hint: f.kitId,
643
+ })),
644
+ { value: "__back", label: "← Back" },
645
+ ],
646
+ });
647
+ if (p.isCancel(choice) || choice === "__back")
648
+ return;
649
+ const reg = forks.find((f) => f.forkId === choice);
650
+ if (!reg) {
651
+ p.cancel("Fork not found.");
652
+ return;
653
+ }
654
+ const spinner = p.spinner();
655
+ spinner.start("Detecting drift...");
656
+ try {
657
+ const report = detectKitForkDrift(reg);
658
+ spinner.stop(pc.green("Analysis complete."));
659
+ printDriftReport(report);
660
+ }
661
+ catch (err) {
662
+ spinner.stop(pc.red("Drift detection failed."));
663
+ p.log.error(err.message);
664
+ }
665
+ }
666
+ // ---------------------------------------------------------------------------
667
+ // Heal flow
668
+ // ---------------------------------------------------------------------------
669
+ async function runHealFlow() {
670
+ const forks = listKitForkRegistrations();
671
+ if (forks.length === 0) {
672
+ p.note("No forks registered. Use 'Register a fork' first.", "Nothing to heal");
673
+ return;
674
+ }
675
+ const choice = await p.select({
676
+ message: "Select a fork to heal",
677
+ options: [
678
+ ...forks.map((f) => ({
679
+ value: f.forkId,
680
+ label: (f.label ?? f.forkId) + " " + pc.dim("v" + f.baseVersion),
681
+ hint: f.kitId,
682
+ })),
683
+ { value: "__back", label: "← Back" },
684
+ ],
685
+ });
686
+ if (p.isCancel(choice) || choice === "__back")
687
+ return;
688
+ const reg = forks.find((f) => f.forkId === choice);
689
+ if (!reg) {
690
+ p.cancel("Fork not found.");
691
+ return;
692
+ }
693
+ // Drift detection
694
+ const driftSpinner = p.spinner();
695
+ driftSpinner.start("Detecting drift...");
696
+ let driftReport;
697
+ try {
698
+ driftReport = detectKitForkDrift(reg);
699
+ driftSpinner.stop("Drift analysis complete.");
700
+ }
701
+ catch (err) {
702
+ driftSpinner.stop(pc.red("Drift detection failed."));
703
+ p.log.error(err.message);
704
+ return;
705
+ }
706
+ printDriftReport(driftReport);
707
+ if (!driftReport.hasUpstreamUpdate && driftReport.overallSeverity === "none") {
708
+ p.note("Your fork is already in sync with the latest upstream kit.", "Already up to date");
709
+ return;
710
+ }
711
+ const plan = buildKitForkHealPlan(driftReport);
712
+ printHealPlan(plan);
713
+ if (plan.actions.length === 0) {
714
+ p.note("No actions needed — fork is structurally clean.", "Nothing to apply");
715
+ return;
716
+ }
717
+ const mode = await p.select({
718
+ message: "How do you want to apply this heal plan?",
719
+ options: [
720
+ { value: "foreground", label: "▶ Run now (foreground)", hint: "Watch live progress in this terminal" },
721
+ { value: "background", label: "⚙️ Background job", hint: "Async — returns immediately, check with 'jobs'" },
722
+ { value: "dry-run", label: "👁 Dry run", hint: "Preview what would happen — no files written" },
723
+ { value: "__cancel", label: "← Cancel" },
724
+ ],
725
+ });
726
+ if (p.isCancel(mode) || mode === "__cancel")
727
+ return;
728
+ if (mode === "background") {
729
+ const jobId = dispatchKitForkSyncJobBackground(reg.forkId, reg.kitId);
730
+ p.note([
731
+ `Job ID: ${pc.cyan(jobId)}`,
732
+ "",
733
+ `Check: ${pc.cyan("growthub kit fork jobs")}`,
734
+ ].join("\n"), "Background sync dispatched");
735
+ return;
736
+ }
737
+ const isDryRun = mode === "dry-run";
738
+ const healSpinner = p.spinner();
739
+ healSpinner.start(isDryRun ? "Running dry run..." : "Applying heal plan...");
740
+ const job = await runKitForkSyncJob(reg.forkId, reg.kitId, {
741
+ dryRun: isDryRun,
742
+ onProgress: (step) => { healSpinner.message(step); },
743
+ });
744
+ healSpinner.stop(job.status === "completed"
745
+ ? pc.green(isDryRun ? "Dry run complete." : "Heal complete.")
746
+ : pc.red("Heal encountered errors."));
747
+ if (job.healResult) {
748
+ const r = job.healResult;
749
+ console.log("");
750
+ console.log(pc.bold("Result:"));
751
+ console.log(` ${pc.green("Applied:")} ${r.appliedCount} ${pc.dim("Skipped:")} ${r.skippedCount} ${r.errorCount > 0 ? pc.red("Errors: " + r.errorCount) : pc.dim("Errors: 0")}`);
752
+ for (const ar of r.actionResults) {
753
+ if (ar.status === "error") {
754
+ console.log(` ${pc.red(" ✗")} ${ar.action.targetPath}: ${ar.detail}`);
755
+ }
756
+ }
757
+ console.log("");
758
+ }
759
+ if (job.status === "failed" && job.error) {
760
+ p.log.error(job.error);
761
+ }
762
+ }
763
+ // ---------------------------------------------------------------------------
764
+ // Jobs flow
765
+ // ---------------------------------------------------------------------------
766
+ async function runJobsFlow() {
767
+ while (true) {
768
+ const jobs = listKitForkSyncJobs();
769
+ if (jobs.length === 0) {
770
+ p.note("No fork-sync jobs recorded yet.", "Jobs");
771
+ return;
772
+ }
773
+ console.log("");
774
+ console.log(pc.bold("Kit Fork Sync Jobs") + pc.dim(` ${jobs.length} total`));
775
+ console.log(hr());
776
+ for (const job of jobs.slice(-10).reverse()) {
777
+ console.log(` ${jobStatusBadge(job.status)} ${pc.cyan(job.jobId)} ${pc.dim(job.forkId)}`);
778
+ if (job.completedAt)
779
+ console.log(` ${pc.dim("Completed:")} ${formatDate(job.completedAt)}`);
780
+ if (job.error)
781
+ console.log(` ${pc.red("Error:")} ${job.error}`);
782
+ }
783
+ console.log("");
784
+ console.log(hr());
785
+ const action = await p.select({
786
+ message: "Manage jobs",
787
+ options: [
788
+ { value: "cancel", label: "Cancel a running job" },
789
+ { value: "prune", label: "Prune completed/failed jobs" },
790
+ { value: "__back", label: "← Back" },
791
+ ],
792
+ });
793
+ if (p.isCancel(action) || action === "__back")
794
+ return;
795
+ if (action === "cancel") {
796
+ const active = jobs.filter((j) => j.status === "running" || j.status === "pending");
797
+ if (active.length === 0) {
798
+ p.note("No cancellable jobs.", "Cancel");
799
+ continue;
800
+ }
801
+ const jobChoice = await p.select({
802
+ message: "Select job to cancel",
803
+ options: active.map((j) => ({ value: j.jobId, label: j.jobId, hint: j.forkId })),
804
+ });
805
+ if (!p.isCancel(jobChoice)) {
806
+ const ok = cancelKitForkSyncJob(jobChoice);
807
+ p.log.info(ok ? `Job ${jobChoice} cancelled.` : `Could not cancel ${jobChoice}.`);
808
+ }
809
+ }
810
+ if (action === "prune") {
811
+ const n = pruneKitForkSyncJobs();
812
+ p.log.info(`Pruned ${n} job(s).`);
813
+ }
814
+ }
815
+ }
816
+ // ---------------------------------------------------------------------------
817
+ // Commander registration
818
+ // ---------------------------------------------------------------------------
819
+ /**
820
+ * Register `growthub kit fork <subcommand>` under the existing `kit` command tree.
821
+ * Called by kit.ts (registerKitCommands already has the `kit` Command object).
822
+ */
823
+ export function registerKitForkSubcommands(kitCommand) {
824
+ const forkCmd = kitCommand
825
+ .command("fork")
826
+ .description("Fork Sync Agent — register, track, and self-heal forked worker kits")
827
+ .addHelpText("after", `
828
+ Examples:
829
+ # Interactive hub
830
+ $ growthub kit fork # start interactive fork menu
831
+
832
+ # List all forks (with drift + policy at a glance)
833
+ $ growthub kit fork list # beautiful table
834
+ $ growthub kit fork list --json # machine-readable
835
+ $ growthub kit fork list --filter status=drift-major
836
+ $ growthub kit fork list --sort-by last-heal
837
+
838
+ # Status with policy eval + heal plan preview + next steps
839
+ $ growthub kit fork status <fork-id>
840
+ $ growthub kit fork status <fork-id> --policy-only
841
+ $ growthub kit fork status <fork-id> --no-upstream-check
842
+
843
+ # Edit policy (interactive) or set fields non-interactively
844
+ $ growthub kit fork policy <fork-id> --edit
845
+ $ growthub kit fork policy <fork-id> --set autoApprove=all --set untouchablePaths+=skills/
846
+
847
+ # Heal (preview, apply, or background)
848
+ $ growthub kit fork heal <fork-id> --preview # rich grouped preview + decision prompt
849
+ $ growthub kit fork heal <fork-id> # apply (foreground)
850
+ $ growthub kit fork heal <fork-id> --background
851
+ $ growthub kit fork heal <fork-id> --dry-run
852
+
853
+ # Monitor background jobs
854
+ $ growthub kit fork jobs # table view with progress
855
+ $ growthub kit fork jobs --watch <job-id> # live progress until terminal
856
+ $ growthub kit fork jobs --tail <job-id> # trace events for a job
857
+ $ growthub kit fork jobs --filter status=running
858
+
859
+ # Audit history
860
+ $ growthub kit fork history <fork-id> # timeline
861
+ $ growthub kit fork history <fork-id> --csv > audit.csv
862
+ $ growthub kit fork history <fork-id> --since 2024-01-01
863
+
864
+ # Manage forks
865
+ $ growthub kit fork register ./my-fork # register existing fork
866
+ $ growthub kit fork deregister <fork-id>
867
+ `);
868
+ forkCmd.action(async () => {
869
+ await runKitForkHub();
870
+ });
871
+ addForkSubcommands(forkCmd);
872
+ registerKitForkRemoteSubcommands(forkCmd);
873
+ }
874
+ /**
875
+ * Register the top-level `growthub fork-sync` shortcut.
876
+ *
877
+ * `growthub fork-sync` is a convenience alias for the hub. Its subcommands
878
+ * (register, list, status, heal, jobs, deregister) are added directly onto
879
+ * the fork-sync command so both these paths work equivalently:
880
+ *
881
+ * growthub fork-sync register ./my-fork
882
+ * growthub kit fork register ./my-fork
883
+ */
884
+ export function registerKitForkCommands(program) {
885
+ const forkSync = program
886
+ .command("fork-sync")
887
+ .description("Kit Fork Sync Agent — alias for `growthub kit fork`")
888
+ .addHelpText("after", `
889
+ Examples:
890
+ $ growthub fork-sync # interactive hub
891
+ $ growthub fork-sync list # beautiful table of all forks
892
+ $ growthub fork-sync status <fork-id> # drift + policy + next steps
893
+ $ growthub fork-sync policy <fork-id> --edit # interactive policy editor
894
+ $ growthub fork-sync heal <fork-id> --preview # rich heal preview
895
+ $ growthub fork-sync heal <fork-id> --background
896
+ $ growthub fork-sync jobs --watch <job-id> # live job progress
897
+ $ growthub fork-sync history <fork-id> # audit timeline
898
+ `);
899
+ forkSync.action(async () => {
900
+ await runKitForkHub();
901
+ });
902
+ // Add subcommands directly onto fork-sync (not inside a nested "fork" wrapper)
903
+ addForkSubcommands(forkSync);
904
+ registerKitForkRemoteSubcommands(forkSync);
905
+ }
906
+ /**
907
+ * Internal helper: add the six fork subcommands directly onto any Commander
908
+ * Command object. Used by both registerKitForkSubcommands (under kit fork)
909
+ * and registerKitForkCommands (under the top-level fork-sync alias).
910
+ */
911
+ function addForkSubcommands(parentCmd) {
912
+ // ── register ──────────────────────────────────────────────────────────────
913
+ parentCmd
914
+ .command("register")
915
+ .description("Register a forked worker kit directory for sync tracking")
916
+ .argument("<path>", "Path to the fork directory")
917
+ .option("--kit <kit-id>", "Kit ID this fork is based on (auto-detected from kit.json if omitted)")
918
+ .option("--label <label>", "Friendly label for this fork")
919
+ .action(async (forkPath, opts) => {
920
+ const kits = listBundledKits();
921
+ let kitId = opts.kit;
922
+ if (!kitId) {
923
+ try {
924
+ const nodePath = await import("node:path");
925
+ const nodeFs = await import("node:fs");
926
+ const kitJsonPath = nodePath.resolve(forkPath, "kit.json");
927
+ if (nodeFs.existsSync(kitJsonPath)) {
928
+ const manifest = JSON.parse(nodeFs.readFileSync(kitJsonPath, "utf8"));
929
+ kitId = manifest?.kit?.id ?? undefined;
930
+ }
931
+ }
932
+ catch { /* fallthrough */ }
933
+ }
934
+ if (!kitId) {
935
+ console.error(pc.yellow("Could not auto-detect kit ID from kit.json. Use --kit <kit-id>."));
936
+ console.error(pc.dim("Available: " + kits.map((k) => k.id).join(", ")));
937
+ process.exitCode = 1;
938
+ return;
939
+ }
940
+ const kit = kits.find((k) => k.id === kitId);
941
+ if (!kit) {
942
+ console.error(pc.red(`Unknown kit: ${kitId}`));
943
+ process.exitCode = 1;
944
+ return;
945
+ }
946
+ try {
947
+ const reg = registerKitFork({
948
+ forkPath,
949
+ kitId,
950
+ baseVersion: kit.version,
951
+ label: opts.label,
952
+ });
953
+ console.log(pc.green("Fork registered:"), reg.forkId);
954
+ console.log(pc.dim("Kit: "), reg.kitId, "v" + reg.baseVersion);
955
+ console.log(pc.dim("Path: "), reg.forkPath);
956
+ }
957
+ catch (err) {
958
+ console.error(pc.red(err.message));
959
+ process.exitCode = 1;
960
+ }
961
+ });
962
+ // ── list ──────────────────────────────────────────────────────────────────
963
+ parentCmd
964
+ .command("list")
965
+ .description("List all registered forks with rich drift + policy summary")
966
+ .option("--kit <kit-id>", "Filter by kit ID")
967
+ .option("--filter <expr>", "Filter expression, e.g. status=synced, status=drift-major, kit=<id>")
968
+ .option("--sort-by <key>", "Sort by: id | kit | status | last-heal (default: id)")
969
+ .option("--no-upstream-check", "Skip upstream drift detection (faster, shows cached status only)")
970
+ .option("--json", "Output raw JSON")
971
+ .action((opts) => {
972
+ const raw = listKitForkRegistrations(opts.kit);
973
+ const skipUpstream = opts.upstreamCheck === false;
974
+ let summaries = raw.map((f) => summarizeFork(f, { skipUpstreamCheck: skipUpstream }));
975
+ if (opts.filter) {
976
+ const [key, value] = opts.filter.split("=").map((s) => s.trim());
977
+ if (!key || !value) {
978
+ console.error(pc.red(`Invalid --filter expression: ${opts.filter}`));
979
+ console.error(pc.dim("Use --filter status=<synced|drift-minor|drift-warn|drift-major|unknown> or kit=<id>"));
980
+ process.exitCode = 1;
981
+ return;
982
+ }
983
+ summaries = summaries.filter((s) => {
984
+ if (key === "kit")
985
+ return s.kitId === value;
986
+ if (key === "status") {
987
+ const mapping = {
988
+ synced: "none",
989
+ "drift-minor": "info",
990
+ "drift-warn": "warning",
991
+ "drift-major": "critical",
992
+ unknown: "unknown",
993
+ };
994
+ const want = mapping[value] ?? value;
995
+ return s.severity === want;
996
+ }
997
+ return true;
998
+ });
999
+ }
1000
+ const sortKey = opts.sortBy ?? "id";
1001
+ summaries.sort((a, b) => {
1002
+ if (sortKey === "kit")
1003
+ return a.kitId.localeCompare(b.kitId);
1004
+ if (sortKey === "status") {
1005
+ const order = ["none", "info", "warning", "critical", "unknown"];
1006
+ return order.indexOf(a.severity) - order.indexOf(b.severity);
1007
+ }
1008
+ if (sortKey === "last-heal") {
1009
+ return (b.lastHealAt ?? "").localeCompare(a.lastHealAt ?? "");
1010
+ }
1011
+ return a.forkId.localeCompare(b.forkId);
1012
+ });
1013
+ if (opts.json) {
1014
+ console.log(JSON.stringify(summaries, null, 2));
1015
+ return;
1016
+ }
1017
+ if (summaries.length === 0) {
1018
+ console.log(pc.dim(" No forks match the given filters."));
1019
+ return;
1020
+ }
1021
+ console.log("");
1022
+ console.log(pc.bold("Registered Kit Forks") + pc.dim(` ${summaries.length} total`));
1023
+ console.log(hr());
1024
+ console.log(renderForkTable(summaries));
1025
+ console.log("");
1026
+ console.log(hr());
1027
+ });
1028
+ // ── status ─────────────────────────────────────────────────────────────────
1029
+ parentCmd
1030
+ .command("status")
1031
+ .description("Detect drift + show policy evaluation + heal plan preview + next steps")
1032
+ .argument("<fork-id>", "Fork ID from list")
1033
+ .option("--policy-only", "Show only the fork's policy (skip drift detection)")
1034
+ .option("--no-upstream-check", "Use cached registration fields; do not query the upstream bundled kit")
1035
+ .option("--json", "Output raw JSON drift report")
1036
+ .action(async (forkId, opts) => {
1037
+ const reg = listKitForkRegistrations().find((f) => f.forkId === forkId);
1038
+ if (!reg) {
1039
+ console.error(pc.red(`Fork not found: ${forkId}`));
1040
+ console.error(pc.dim("Hint: run `growthub kit fork list` to see registered forks."));
1041
+ process.exitCode = 1;
1042
+ return;
1043
+ }
1044
+ const policy = readKitForkPolicy(reg.forkPath);
1045
+ if (opts.policyOnly) {
1046
+ if (opts.json) {
1047
+ console.log(JSON.stringify(policy, null, 2));
1048
+ return;
1049
+ }
1050
+ console.log("");
1051
+ console.log(pc.bold(`Policy: ${reg.forkId}`));
1052
+ console.log(hr());
1053
+ console.log(` ${pc.dim("autoApprove:")} ${policy.autoApprove}`);
1054
+ console.log(` ${pc.dim("autoApproveDepUpdates:")} ${policy.autoApproveDepUpdates}`);
1055
+ console.log(` ${pc.dim("remoteSyncMode:")} ${policy.remoteSyncMode}`);
1056
+ console.log(` ${pc.dim("interactiveConflicts:")} ${policy.interactiveConflicts}`);
1057
+ console.log(` ${pc.dim("untouchablePaths:")} [${policy.untouchablePaths.join(", ")}]`);
1058
+ console.log(` ${pc.dim("confirmBeforeChange:")} [${policy.confirmBeforeChange.join(", ")}]`);
1059
+ console.log(` ${pc.dim("allowedScripts:")} [${policy.allowedScripts.join(", ")}]`);
1060
+ console.log("");
1061
+ return;
1062
+ }
1063
+ if (opts.upstreamCheck === false) {
1064
+ if (opts.json) {
1065
+ console.log(JSON.stringify({ forkId: reg.forkId, kitId: reg.kitId, forkVersion: reg.baseVersion, policy }, null, 2));
1066
+ return;
1067
+ }
1068
+ console.log("");
1069
+ console.log(pc.bold(`Fork: ${reg.forkId}`) + " " + pc.dim("(no upstream check)"));
1070
+ console.log(pc.dim(`Kit: ${reg.kitId} v${reg.baseVersion}`));
1071
+ console.log(hr());
1072
+ console.log(` ${pc.dim("Path:")} ${reg.forkPath}`);
1073
+ console.log(` ${pc.dim("Policy:")} autoApprove=${policy.autoApprove}, remoteSyncMode=${policy.remoteSyncMode}`);
1074
+ if (policy.untouchablePaths.length > 0) {
1075
+ console.log(` ${pc.dim("Protected paths:")} ${policy.untouchablePaths.join(", ")}`);
1076
+ }
1077
+ console.log("");
1078
+ console.log(hr());
1079
+ printNextStepsAfterStatus(reg.forkId, true);
1080
+ return;
1081
+ }
1082
+ try {
1083
+ const report = detectKitForkDrift(reg);
1084
+ appendKitForkTraceEvent(reg.forkPath, {
1085
+ forkId: reg.forkId, kitId: reg.kitId, type: "status_ran",
1086
+ summary: `status inspected — severity=${report.overallSeverity}`,
1087
+ });
1088
+ if (opts.json) {
1089
+ const plan = buildKitForkHealPlan(report, { policy });
1090
+ console.log(JSON.stringify({ drift: report, plan, policy }, null, 2));
1091
+ return;
1092
+ }
1093
+ printDriftReport(report);
1094
+ const hasDrift = report.hasUpstreamUpdate || report.overallSeverity !== "none";
1095
+ if (hasDrift) {
1096
+ const plan = buildKitForkHealPlan(report, { policy });
1097
+ printRichHealPreview(plan, policy);
1098
+ }
1099
+ printNextStepsAfterStatus(reg.forkId, hasDrift);
1100
+ }
1101
+ catch (err) {
1102
+ console.error(pc.red(err.message));
1103
+ process.exitCode = 1;
1104
+ }
1105
+ });
1106
+ // ── heal ───────────────────────────────────────────────────────────────────
1107
+ parentCmd
1108
+ .command("heal")
1109
+ .description("Apply a safe non-destructive heal to bring a fork up to date")
1110
+ .argument("<fork-id>", "Fork ID from list")
1111
+ .option("--preview", "Rich grouped preview (safe additions / updates / protected / unresolved); does not write")
1112
+ .option("--dry-run", "Preview the plan without writing any files")
1113
+ .option("--background", "Dispatch as an async background job")
1114
+ .option("--skip <paths>", "Comma-separated relative paths to skip")
1115
+ .option("--json", "Output heal plan as JSON (implies --dry-run)")
1116
+ .action(async (forkId, opts) => {
1117
+ const reg = listKitForkRegistrations().find((f) => f.forkId === forkId);
1118
+ if (!reg) {
1119
+ console.error(pc.red(`Fork not found: ${forkId}`));
1120
+ console.error(pc.dim("Hint: run `growthub kit fork list` to see registered forks."));
1121
+ process.exitCode = 1;
1122
+ return;
1123
+ }
1124
+ const policy = readKitForkPolicy(reg.forkPath);
1125
+ if (opts.json) {
1126
+ const report = detectKitForkDrift(reg);
1127
+ const plan = buildKitForkHealPlan(report, { policy });
1128
+ console.log(JSON.stringify(plan, null, 2));
1129
+ return;
1130
+ }
1131
+ if (opts.preview) {
1132
+ const report = detectKitForkDrift(reg);
1133
+ const plan = buildKitForkHealPlan(report, { policy });
1134
+ appendKitForkTraceEvent(reg.forkPath, {
1135
+ forkId: reg.forkId, kitId: reg.kitId, type: "heal_proposed",
1136
+ summary: `preview requested — ${plan.actions.length} action(s), risk=${plan.estimatedRisk}`,
1137
+ detail: { mode: "preview" },
1138
+ });
1139
+ printRichHealPreview(plan, policy);
1140
+ if (plan.actions.length === 0) {
1141
+ console.log(pc.dim(" No actions needed. Fork is structurally clean."));
1142
+ return;
1143
+ }
1144
+ const decision = await p.select({
1145
+ message: "Apply this plan?",
1146
+ options: [
1147
+ { value: "apply", label: "▶ Yes, apply now", hint: "Run synchronously in this terminal" },
1148
+ { value: "background", label: "⚙️ Run in background", hint: "Dispatch as an async job" },
1149
+ { value: "cancel", label: "← No, cancel" },
1150
+ ],
1151
+ });
1152
+ if (p.isCancel(decision) || decision === "cancel") {
1153
+ console.log(pc.dim(" Cancelled. Plan was not applied."));
1154
+ console.log(pc.dim(` Next: ${pc.cyan("growthub kit fork policy " + reg.forkId)} or ${pc.cyan("growthub kit fork heal " + reg.forkId)}`));
1155
+ return;
1156
+ }
1157
+ if (decision === "background") {
1158
+ const jobId = dispatchKitForkSyncJobBackground(reg.forkId, reg.kitId, {
1159
+ skipFiles: opts.skip?.split(",").map((s) => s.trim()),
1160
+ });
1161
+ console.log("");
1162
+ console.log(pc.green(" ✓ Background heal dispatched"));
1163
+ console.log(` Job ID: ${pc.cyan(jobId)}`);
1164
+ console.log(` Watch: ${pc.cyan("growthub kit fork jobs --watch " + jobId)}`);
1165
+ return;
1166
+ }
1167
+ // decision === "apply" — fall through to foreground run below
1168
+ opts.dryRun = false;
1169
+ }
1170
+ if (opts.background) {
1171
+ const jobId = dispatchKitForkSyncJobBackground(reg.forkId, reg.kitId, {
1172
+ dryRun: opts.dryRun,
1173
+ skipFiles: opts.skip?.split(",").map((s) => s.trim()),
1174
+ });
1175
+ console.log(pc.green("Background job dispatched:"), jobId);
1176
+ console.log(pc.dim(` Watch: growthub kit fork jobs --watch ${jobId}`));
1177
+ console.log(pc.dim(` List: growthub kit fork jobs`));
1178
+ return;
1179
+ }
1180
+ const job = await runKitForkSyncJob(reg.forkId, reg.kitId, {
1181
+ dryRun: opts.dryRun,
1182
+ skipFiles: opts.skip?.split(",").map((s) => s.trim()),
1183
+ onProgress: (step) => process.stderr.write(pc.dim(step) + "\n"),
1184
+ });
1185
+ const r = job.healResult;
1186
+ if (r) {
1187
+ console.log(pc.bold("Heal result:"));
1188
+ console.log(` ${pc.green("Applied:")} ${r.appliedCount} ${pc.dim("Skipped:")} ${r.skippedCount} ${r.errorCount > 0 ? pc.red("Errors: " + r.errorCount) : pc.dim("Errors: 0")}`);
1189
+ }
1190
+ if (job.status === "failed") {
1191
+ console.error(pc.red("Heal failed: " + (job.error ?? "unknown error")));
1192
+ console.error(pc.dim(` Review: growthub kit fork history ${reg.forkId}`));
1193
+ process.exitCode = 1;
1194
+ }
1195
+ });
1196
+ // ── jobs ───────────────────────────────────────────────────────────────────
1197
+ parentCmd
1198
+ .command("jobs")
1199
+ .description("List background fork-sync jobs, watch live progress, or tail a job's trace")
1200
+ .option("--fork <fork-id>", "Filter by fork ID")
1201
+ .option("--status <status>", "Filter by status (pending | running | completed | failed | cancelled | awaiting_confirmation)")
1202
+ .option("--filter <expr>", "Filter expression, e.g. status=running")
1203
+ .option("--watch <job-id>", "Poll the given job and print live progress until terminal")
1204
+ .option("--tail <job-id>", "Print trace events from the fork of the given job (default 50)")
1205
+ .option("--limit <n>", "Limit entries when using --tail (default 50)", (v) => parseInt(v, 10))
1206
+ .option("--json", "Output raw JSON")
1207
+ .action(async (opts) => {
1208
+ if (opts.watch) {
1209
+ await watchJob(opts.watch, Boolean(opts.json));
1210
+ return;
1211
+ }
1212
+ if (opts.tail) {
1213
+ tailJobTrace(opts.tail, opts.limit ?? 50, Boolean(opts.json));
1214
+ return;
1215
+ }
1216
+ let effectiveStatus = opts.status;
1217
+ if (!effectiveStatus && opts.filter) {
1218
+ const [key, value] = opts.filter.split("=").map((s) => s.trim());
1219
+ if (key === "status" && value)
1220
+ effectiveStatus = value;
1221
+ }
1222
+ const jobs = listKitForkSyncJobs({
1223
+ forkId: opts.fork,
1224
+ status: effectiveStatus,
1225
+ });
1226
+ if (opts.json) {
1227
+ console.log(JSON.stringify(jobs, null, 2));
1228
+ return;
1229
+ }
1230
+ if (jobs.length === 0) {
1231
+ console.log(pc.dim(" No jobs found."));
1232
+ return;
1233
+ }
1234
+ console.log("");
1235
+ console.log(pc.bold("Kit Fork Sync Jobs") + pc.dim(` ${jobs.length} total`));
1236
+ console.log(hr());
1237
+ console.log(renderJobTable(jobs));
1238
+ console.log("");
1239
+ console.log(hr());
1240
+ console.log(pc.dim(" Live progress: growthub kit fork jobs --watch <job-id>"));
1241
+ console.log(pc.dim(" Trace events: growthub kit fork jobs --tail <job-id>"));
1242
+ console.log("");
1243
+ });
1244
+ // ── history (audit timeline) ──────────────────────────────────────────────
1245
+ parentCmd
1246
+ .command("history")
1247
+ .description("Export fork operation history from trace.jsonl")
1248
+ .argument("<fork-id>", "Fork ID from list")
1249
+ .option("--since <iso>", "ISO-8601 start date (inclusive)")
1250
+ .option("--until <iso>", "ISO-8601 end date (inclusive)")
1251
+ .option("--event-type <type>", "Filter by event type (e.g. heal_applied, policy_updated)")
1252
+ .option("--limit <n>", "Return at most N events (applied after filters)", (v) => parseInt(v, 10))
1253
+ .option("--json", "Emit machine-readable JSON")
1254
+ .option("--csv", "Emit CSV for compliance tools")
1255
+ .action((forkId, opts) => {
1256
+ const reg = listKitForkRegistrations().find((f) => f.forkId === forkId);
1257
+ if (!reg) {
1258
+ console.error(pc.red(`Fork not found: ${forkId}`));
1259
+ console.error(pc.dim("Hint: run `growthub kit fork list` to see registered forks."));
1260
+ process.exitCode = 1;
1261
+ return;
1262
+ }
1263
+ const all = readKitForkTrace(reg.forkPath);
1264
+ const sinceMs = opts.since ? new Date(opts.since).getTime() : undefined;
1265
+ const untilMs = opts.until ? new Date(opts.until).getTime() : undefined;
1266
+ let events = all.filter((e) => {
1267
+ const ts = new Date(e.timestamp).getTime();
1268
+ if (sinceMs !== undefined && ts < sinceMs)
1269
+ return false;
1270
+ if (untilMs !== undefined && ts > untilMs)
1271
+ return false;
1272
+ if (opts.eventType && e.type !== opts.eventType)
1273
+ return false;
1274
+ return true;
1275
+ });
1276
+ if (opts.limit && opts.limit > 0) {
1277
+ events = events.slice(-opts.limit);
1278
+ }
1279
+ if (opts.json) {
1280
+ console.log(JSON.stringify(events, null, 2));
1281
+ return;
1282
+ }
1283
+ if (opts.csv) {
1284
+ console.log("timestamp,forkId,kitId,jobId,type,summary");
1285
+ for (const e of events) {
1286
+ const summary = (e.summary ?? "").replace(/"/g, '""');
1287
+ console.log(`${e.timestamp},${e.forkId},${e.kitId},${e.jobId ?? ""},${e.type},"${summary}"`);
1288
+ }
1289
+ return;
1290
+ }
1291
+ console.log("");
1292
+ console.log(pc.bold(`Fork History: ${reg.forkId}`) + pc.dim(` ${events.length} event(s)`));
1293
+ console.log(hr());
1294
+ if (events.length === 0) {
1295
+ console.log(pc.dim(" No matching events."));
1296
+ console.log("");
1297
+ return;
1298
+ }
1299
+ for (const e of events) {
1300
+ const ts = e.timestamp.replace("T", " ").replace(/\..+Z$/, "Z");
1301
+ console.log(` ${pc.dim(ts)} ${pc.cyan("[" + e.type + "]")} ${e.summary ?? ""}`);
1302
+ }
1303
+ console.log("");
1304
+ console.log(hr());
1305
+ console.log("");
1306
+ });
1307
+ // ── deregister ─────────────────────────────────────────────────────────────
1308
+ parentCmd
1309
+ .command("deregister")
1310
+ .description("Remove a fork registration (does not delete your fork directory)")
1311
+ .argument("<fork-id>", "Fork ID to deregister")
1312
+ .action(async (forkId) => {
1313
+ const allForks = listKitForkRegistrations();
1314
+ const reg = allForks.find((f) => f.forkId === forkId);
1315
+ if (!reg) {
1316
+ console.error(pc.red(`Fork not found: ${forkId}`));
1317
+ process.exitCode = 1;
1318
+ return;
1319
+ }
1320
+ const confirmed = await p.confirm({
1321
+ message: `Remove registration for ${pc.cyan(forkId)}? (Your fork directory will not be touched)`,
1322
+ initialValue: false,
1323
+ });
1324
+ if (p.isCancel(confirmed) || !confirmed) {
1325
+ p.cancel("Cancelled.");
1326
+ return;
1327
+ }
1328
+ const ok = deregisterKitFork(reg.kitId, forkId);
1329
+ if (ok) {
1330
+ console.log(pc.green("Fork deregistered:"), forkId);
1331
+ }
1332
+ else {
1333
+ console.error(pc.red("Deregistration failed."));
1334
+ process.exitCode = 1;
1335
+ }
1336
+ });
1337
+ }
1338
+ //# sourceMappingURL=kit-fork.js.map