crewly 1.20.302 → 1.20.304

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 (276) hide show
  1. package/config/roles/developer/prompt.md +7 -0
  2. package/config/roles/fullstack-dev/prompt.md +7 -0
  3. package/config/roles/product-manager/prompt.md +7 -0
  4. package/config/skills/orchestrator/move-team/SKILL.md +53 -0
  5. package/config/skills/orchestrator/move-team/execute.sh +42 -0
  6. package/config/skills/orchestrator/usage-categories/SKILL.md +59 -0
  7. package/config/skills/orchestrator/usage-categories/execute.sh +81 -0
  8. package/config/skills/orchestrator/usage-categories/execute.test.sh +45 -0
  9. package/config/skills/orchestrator/usage-report/SKILL.md +71 -0
  10. package/config/skills/orchestrator/usage-report/execute.sh +84 -0
  11. package/config/skills/orchestrator/usage-report/execute.test.sh +39 -0
  12. package/config/skills/team-leader/usage-report/SKILL.md +71 -0
  13. package/config/skills/team-leader/usage-report/execute.sh +84 -0
  14. package/config/skills/team-leader/usage-report/execute.test.sh +39 -0
  15. package/dist/backend/backend/src/constants.d.ts +80 -0
  16. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  17. package/dist/backend/backend/src/constants.js +80 -0
  18. package/dist/backend/backend/src/constants.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts +45 -0
  20. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts.map +1 -0
  21. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js +214 -0
  22. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js.map +1 -0
  23. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts +36 -0
  24. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts.map +1 -0
  25. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js +158 -0
  26. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js.map +1 -0
  27. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts +15 -0
  28. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts.map +1 -0
  29. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js +26 -0
  30. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js.map +1 -0
  31. package/dist/backend/backend/src/index.d.ts +10 -0
  32. package/dist/backend/backend/src/index.d.ts.map +1 -1
  33. package/dist/backend/backend/src/index.js +97 -20
  34. package/dist/backend/backend/src/index.js.map +1 -1
  35. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  36. package/dist/backend/backend/src/routes/api.routes.js +6 -0
  37. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  38. package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts +32 -0
  39. package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/agent/follow-through.wiring.js +42 -1
  41. package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -1
  42. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +26 -6
  43. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/agent/resource-mode.service.js +59 -5
  45. package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  47. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
  49. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  50. package/dist/backend/backend/src/services/core/storage.service.d.ts +18 -0
  51. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/core/storage.service.js +16 -0
  53. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +19 -0
  55. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/decisions/decision.service.js +46 -0
  57. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  58. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
  59. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +101 -0
  61. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
  62. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts +58 -0
  63. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js +100 -0
  65. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js.map +1 -0
  66. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +3 -0
  68. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +7 -0
  70. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +15 -0
  72. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  73. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  74. package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
  75. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  76. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  77. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +25 -0
  79. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  80. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
  81. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
  83. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  84. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  85. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +41 -0
  87. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  88. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts +122 -0
  89. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/team-move/team-move-archive.js +202 -0
  91. package/dist/backend/backend/src/services/team-move/team-move-archive.js.map +1 -0
  92. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +59 -0
  93. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/team-move/team-move-chat.js +133 -0
  95. package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -0
  96. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts +102 -0
  97. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js +217 -0
  99. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js.map +1 -0
  100. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts +102 -0
  101. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/team-move/team-move-crypto.js +348 -0
  103. package/dist/backend/backend/src/services/team-move/team-move-crypto.js.map +1 -0
  104. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts +209 -0
  105. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js +504 -0
  107. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js.map +1 -0
  108. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +156 -0
  109. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/team-move/team-move-exporter.js +462 -0
  111. package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -0
  112. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts +157 -0
  113. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/team-move/team-move-fs.js +298 -0
  115. package/dist/backend/backend/src/services/team-move/team-move-fs.js.map +1 -0
  116. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts +69 -0
  117. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/team-move/team-move-git.js +198 -0
  119. package/dist/backend/backend/src/services/team-move/team-move-git.js.map +1 -0
  120. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +121 -0
  121. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -0
  122. package/dist/backend/backend/src/services/team-move/team-move-importer.js +462 -0
  123. package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -0
  124. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts +110 -0
  125. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts.map +1 -0
  126. package/dist/backend/backend/src/services/team-move/team-move-journal.js +198 -0
  127. package/dist/backend/backend/src/services/team-move/team-move-journal.js.map +1 -0
  128. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts +71 -0
  129. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
  130. package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
  131. package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
  132. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
  133. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
  134. package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
  135. package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
  136. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
  137. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
  138. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
  139. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
  140. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
  141. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
  142. package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
  143. package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
  144. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
  145. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
  146. package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
  147. package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
  148. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +269 -0
  149. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
  150. package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
  151. package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
  152. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +42 -2
  153. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  154. package/dist/backend/backend/src/services/trace/trace-context.service.js +66 -5
  155. package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -1
  156. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/trace/trace-recorder.js +11 -0
  158. package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -1
  159. package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts +28 -0
  160. package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts.map +1 -0
  161. package/dist/backend/backend/src/services/usage-ledger/categories-param.js +67 -0
  162. package/dist/backend/backend/src/services/usage-ledger/categories-param.js.map +1 -0
  163. package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts +37 -0
  164. package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/usage-ledger/excerpt.js +49 -0
  166. package/dist/backend/backend/src/services/usage-ledger/excerpt.js.map +1 -0
  167. package/dist/backend/backend/src/services/usage-ledger/index.d.ts +14 -0
  168. package/dist/backend/backend/src/services/usage-ledger/index.d.ts.map +1 -0
  169. package/dist/backend/backend/src/services/usage-ledger/index.js +14 -0
  170. package/dist/backend/backend/src/services/usage-ledger/index.js.map +1 -0
  171. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
  172. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
  173. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
  174. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
  175. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts +100 -0
  176. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js +189 -0
  178. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js.map +1 -0
  179. package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts +41 -0
  180. package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts.map +1 -0
  181. package/dist/backend/backend/src/services/usage-ledger/owner-spans.js +71 -0
  182. package/dist/backend/backend/src/services/usage-ledger/owner-spans.js.map +1 -0
  183. package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts +47 -0
  184. package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts.map +1 -0
  185. package/dist/backend/backend/src/services/usage-ledger/team-directory.js +106 -0
  186. package/dist/backend/backend/src/services/usage-ledger/team-directory.js.map +1 -0
  187. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts +101 -0
  188. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts.map +1 -0
  189. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js +263 -0
  190. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js.map +1 -0
  191. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts +96 -0
  192. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts.map +1 -0
  193. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js +166 -0
  194. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js.map +1 -0
  195. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts +90 -0
  196. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts.map +1 -0
  197. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js +294 -0
  198. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js.map +1 -0
  199. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts +102 -0
  200. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts.map +1 -0
  201. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js +314 -0
  202. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js.map +1 -0
  203. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts +62 -0
  204. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts.map +1 -0
  205. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js +106 -0
  206. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js.map +1 -0
  207. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts +52 -0
  208. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts.map +1 -0
  209. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js +95 -0
  210. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js.map +1 -0
  211. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts +127 -0
  212. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts.map +1 -0
  213. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js +19 -0
  214. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js.map +1 -0
  215. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts +124 -0
  216. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts.map +1 -0
  217. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js +372 -0
  218. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js.map +1 -0
  219. package/dist/backend/build-info.json +2 -2
  220. package/dist/cli/backend/src/constants.d.ts +80 -0
  221. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  222. package/dist/cli/backend/src/constants.js +80 -0
  223. package/dist/cli/backend/src/constants.js.map +1 -1
  224. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +26 -6
  225. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  226. package/dist/cli/backend/src/services/agent/resource-mode.service.js +59 -5
  227. package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
  228. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  229. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  230. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  231. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  232. package/dist/cli/backend/src/services/core/storage.service.d.ts +18 -0
  233. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  234. package/dist/cli/backend/src/services/core/storage.service.js +16 -0
  235. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  236. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
  237. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  238. package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
  239. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  240. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
  241. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
  242. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +101 -0
  243. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
  244. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  245. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +3 -0
  246. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  247. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  248. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  249. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -0
  250. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  251. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
  252. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  253. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
  254. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  255. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  256. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  257. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +41 -0
  258. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  259. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +42 -2
  260. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  261. package/dist/cli/backend/src/services/trace/trace-context.service.js +66 -5
  262. package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -1
  263. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  264. package/dist/cli/backend/src/services/trace/trace-recorder.js +11 -0
  265. package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -1
  266. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
  267. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
  268. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
  269. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
  270. package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
  271. package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
  272. package/dist/cli/cli/src/commands/team-move.js +155 -0
  273. package/dist/cli/cli/src/commands/team-move.js.map +1 -0
  274. package/dist/cli/cli/src/index.js +33 -0
  275. package/dist/cli/cli/src/index.js.map +1 -1
  276. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-secret-scan.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-secret-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,iDAAiD;AACjD,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE;gBAAzB,QAAQ,EAAE,aAAa,EAAE;CAO/C;AAiCD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAAE,KAAK,GAAE,SAAS,cAAc,EAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS5J;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAO/D"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Secret scan of a package before it leaves the machine.
3
+ *
4
+ * Runs the same detectors as the session-log redactor (token shapes such as
5
+ * Slack, OpenAI/Anthropic, GitHub, Google keys, JWTs, bearer headers, private
6
+ * key blocks, connection strings and `SECRET_NAME=value` assignments) plus the
7
+ * exact secret values this machine holds in its environment and settings. It
8
+ * reports file paths and pattern counts only, never a matched value.
9
+ *
10
+ * @module services/team-move/team-move-secret-scan
11
+ */
12
+ import * as fs from 'node:fs/promises';
13
+ import { redactSecretsWithCount } from '../../utils/secret-redactor.js';
14
+ import { looksLikeText } from './team-move-fs.js';
15
+ /** Window read at a time (text is scanned in overlapping windows). */
16
+ const WINDOW_BYTES = 1024 * 1024;
17
+ /** Overlap between windows so a secret cut by a boundary is still seen. */
18
+ const OVERLAP_BYTES = 1024;
19
+ /** Thrown when a package would carry secrets. */
20
+ export class TeamMoveSecretScanError extends Error {
21
+ findings;
22
+ constructor(findings) {
23
+ super(`The secret scan found credentials in ${findings.length} file${findings.length === 1 ? '' : 's'}; nothing was sent. ` +
24
+ `Remove them from: ${findings.slice(0, 10).map((f) => f.path).join(', ')}${findings.length > 10 ? ', ...' : ''}`);
25
+ this.findings = findings;
26
+ this.name = 'TeamMoveSecretScanError';
27
+ }
28
+ }
29
+ /**
30
+ * Count secrets in one file.
31
+ *
32
+ * @param abs - Absolute file path
33
+ * @param known - Exact secret values to look for
34
+ * @returns Number of matches, 0 for binary files
35
+ */
36
+ async function scanFile(abs, known) {
37
+ const handle = await fs.open(abs, 'r');
38
+ try {
39
+ const stat = await handle.stat();
40
+ const head = Buffer.alloc(Math.min(8192, stat.size));
41
+ await handle.read(head, 0, head.length, 0);
42
+ if (!looksLikeText(head))
43
+ return { matches: 0, scanned: false };
44
+ let matches = 0;
45
+ let position = 0;
46
+ const buf = Buffer.alloc(WINDOW_BYTES + OVERLAP_BYTES);
47
+ // Matches inside the overlap are seen by two windows; counting the first
48
+ // window's tail once is enough, we only need "any", so double counts are fine.
49
+ while (position < stat.size) {
50
+ const { bytesRead } = await handle.read(buf, 0, buf.length, position);
51
+ if (bytesRead === 0)
52
+ break;
53
+ matches += redactSecretsWithCount(buf.subarray(0, bytesRead).toString('utf8'), known).count;
54
+ position += WINDOW_BYTES;
55
+ }
56
+ return { matches, scanned: true };
57
+ }
58
+ finally {
59
+ await handle.close();
60
+ }
61
+ }
62
+ /**
63
+ * Scan every file of a staging area.
64
+ *
65
+ * @param staging - The package being built
66
+ * @param files - Its files
67
+ * @param known - Exact secret values (env, settings) to look for
68
+ * @returns Files scanned and the findings
69
+ */
70
+ export async function scanStaging(staging, files, known = []) {
71
+ const findings = [];
72
+ let filesScanned = 0;
73
+ for (const f of files) {
74
+ const { matches, scanned } = await scanFile(staging.abs(f.path), known);
75
+ if (scanned)
76
+ filesScanned += 1;
77
+ if (matches > 0)
78
+ findings.push({ path: f.path, matches });
79
+ }
80
+ return { filesScanned, findings };
81
+ }
82
+ /**
83
+ * Whether a flagged file may be left out of the package instead of aborting.
84
+ * Core records (the team config, task pool, decisions, chat records) can never
85
+ * be skipped; free-form notes and project files can.
86
+ *
87
+ * @param packagePath - Package path of the flagged file
88
+ * @returns True when skipping is allowed
89
+ */
90
+ export function isSkippableFinding(packagePath) {
91
+ return (packagePath.startsWith('projects/') ||
92
+ packagePath.startsWith('handover/') ||
93
+ /^agents\/[^/]+\/sessions\//.test(packagePath) ||
94
+ /^team\/(wiki|norms|sops)\//.test(packagePath));
95
+ }
96
+ //# sourceMappingURL=team-move-secret-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-secret-scan.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-secret-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Which records of the global stores belong to a team. Pure functions: the
3
+ * exporter (source) selects with them, the archiver removes with them.
4
+ *
5
+ * @module services/team-move/team-move-select
6
+ */
7
+ import type { Team } from '../../types/index.js';
8
+ import type { ScheduledMessage } from '../../types/index.js';
9
+ import type { WorkItem } from '../../types/v2/work-item.types.js';
10
+ import type { TaskClaim } from '../../types/v2/claim.types.js';
11
+ /** What identifies a team's records in the global stores. */
12
+ export interface TeamIdentity {
13
+ teamId: string;
14
+ teamName: string;
15
+ /** Member session names. */
16
+ sessions: ReadonlySet<string>;
17
+ /** Member ids. */
18
+ memberIds: ReadonlySet<string>;
19
+ }
20
+ /**
21
+ * Identity of a team.
22
+ *
23
+ * @param team - The team
24
+ * @returns Ids and session names to match records by
25
+ */
26
+ export declare function identityOf(team: Pick<Team, 'id' | 'name' | 'members'>): TeamIdentity;
27
+ /**
28
+ * Whether a free-form target string names the team or one of its members.
29
+ *
30
+ * @param target - A `target`/`targetTeam`/session field value
31
+ * @param id - Team identity
32
+ * @returns True on a match
33
+ */
34
+ export declare function targetsTeam(target: unknown, id: TeamIdentity): boolean;
35
+ /**
36
+ * Whether a work item is still open.
37
+ *
38
+ * @param wi - Work item
39
+ * @returns True when it is neither terminal nor failed/rejected
40
+ */
41
+ export declare function isOpenWorkItem(wi: Pick<WorkItem, 'status'>): boolean;
42
+ /** The slice of the pool a team owns. */
43
+ export interface TeamPoolSlice {
44
+ workItems: WorkItem[];
45
+ /** Active claims by team members on selected items (not moved; counted for the report). */
46
+ activeClaims: number;
47
+ }
48
+ /**
49
+ * Open task-pool items of a team: those aimed at the team or a member, those
50
+ * a member is working on, and their open children.
51
+ *
52
+ * @param pool - The pool file content
53
+ * @param pool.workItems - All work items
54
+ * @param pool.claims - All claims
55
+ * @param id - Team identity
56
+ * @returns Selected items
57
+ */
58
+ export declare function selectPoolItems(pool: {
59
+ workItems?: WorkItem[];
60
+ claims?: TaskClaim[];
61
+ }, id: TeamIdentity): TeamPoolSlice;
62
+ /**
63
+ * Make a work item safe to start over on the target: nothing is running there
64
+ * yet, so an item that was being worked on goes back to the queue.
65
+ *
66
+ * @param wi - Work item as exported
67
+ * @returns Copy for the target
68
+ */
69
+ export declare function resetWorkItemForTarget(wi: WorkItem): WorkItem;
70
+ /**
71
+ * Scheduled messages (legacy owner-created reminders) that address a team.
72
+ *
73
+ * @param messages - All scheduled messages
74
+ * @param id - Team identity
75
+ * @returns Those whose `targetTeam` names the team or one of its members
76
+ */
77
+ export declare function selectScheduledMessages(messages: readonly ScheduledMessage[], id: TeamIdentity): ScheduledMessage[];
78
+ /** The decision fields the selector reads. */
79
+ export interface DecisionLike {
80
+ id: string;
81
+ status: string;
82
+ teamId?: string;
83
+ asker?: string;
84
+ requestedBy?: string;
85
+ }
86
+ /**
87
+ * Open decisions/requests to the owner that belong to a team.
88
+ *
89
+ * @param decisions - All decisions
90
+ * @param id - Team identity
91
+ * @returns Pending ones asked by the team or one of its members
92
+ */
93
+ export declare function selectDecisions<T extends DecisionLike>(decisions: readonly T[], id: TeamIdentity): T[];
94
+ //# sourceMappingURL=team-move-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-select.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-select.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,kBAAkB;IAClB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,YAAY,CAOpF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,GAAG,OAAO,CAGtE;AAKD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,OAAO,CAEpE;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,2FAA2F;IAC3F,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;CAAE,EAAE,EAAE,EAAE,YAAY,GAAG,aAAa,CAwBvH;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAQ7D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,EAAE,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAEnH;AAED,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,GAAG,CAAC,EAAE,CAMtG"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Which records of the global stores belong to a team. Pure functions: the
3
+ * exporter (source) selects with them, the archiver removes with them.
4
+ *
5
+ * @module services/team-move/team-move-select
6
+ */
7
+ import { TERMINAL_WORK_ITEM_STATUSES } from '../../types/v2/work-item.types.js';
8
+ /**
9
+ * Identity of a team.
10
+ *
11
+ * @param team - The team
12
+ * @returns Ids and session names to match records by
13
+ */
14
+ export function identityOf(team) {
15
+ return {
16
+ teamId: team.id,
17
+ teamName: team.name,
18
+ sessions: new Set(team.members.map((m) => m.sessionName).filter((s) => typeof s === 'string' && s.length > 0)),
19
+ memberIds: new Set(team.members.map((m) => m.id)),
20
+ };
21
+ }
22
+ /**
23
+ * Whether a free-form target string names the team or one of its members.
24
+ *
25
+ * @param target - A `target`/`targetTeam`/session field value
26
+ * @param id - Team identity
27
+ * @returns True on a match
28
+ */
29
+ export function targetsTeam(target, id) {
30
+ if (typeof target !== 'string' || target.length === 0)
31
+ return false;
32
+ return target === id.teamId || target === id.teamName || id.sessions.has(target) || id.memberIds.has(target);
33
+ }
34
+ /** Work-item statuses that are still open (not finished, cancelled or verified). */
35
+ const OPEN_EXCLUDED = new Set([...TERMINAL_WORK_ITEM_STATUSES, 'failed', 'rejected']);
36
+ /**
37
+ * Whether a work item is still open.
38
+ *
39
+ * @param wi - Work item
40
+ * @returns True when it is neither terminal nor failed/rejected
41
+ */
42
+ export function isOpenWorkItem(wi) {
43
+ return !OPEN_EXCLUDED.has(wi.status);
44
+ }
45
+ /**
46
+ * Open task-pool items of a team: those aimed at the team or a member, those
47
+ * a member is working on, and their open children.
48
+ *
49
+ * @param pool - The pool file content
50
+ * @param pool.workItems - All work items
51
+ * @param pool.claims - All claims
52
+ * @param id - Team identity
53
+ * @returns Selected items
54
+ */
55
+ export function selectPoolItems(pool, id) {
56
+ const items = Array.isArray(pool.workItems) ? pool.workItems : [];
57
+ const claims = Array.isArray(pool.claims) ? pool.claims : [];
58
+ const activeByItem = new Map();
59
+ for (const c of claims)
60
+ if (c.status === 'active' && id.sessions.has(c.agentId))
61
+ activeByItem.set(c.workItemId, c);
62
+ const picked = new Map();
63
+ for (const wi of items) {
64
+ if (!isOpenWorkItem(wi))
65
+ continue;
66
+ if (targetsTeam(wi.target, id) || activeByItem.has(wi.id))
67
+ picked.set(wi.id, wi);
68
+ }
69
+ // Open children of picked items follow their parent.
70
+ let grew = true;
71
+ while (grew) {
72
+ grew = false;
73
+ for (const wi of items) {
74
+ if (picked.has(wi.id) || !isOpenWorkItem(wi))
75
+ continue;
76
+ if (wi.parentWorkItemId && picked.has(wi.parentWorkItemId)) {
77
+ picked.set(wi.id, wi);
78
+ grew = true;
79
+ }
80
+ }
81
+ }
82
+ const activeClaims = [...picked.keys()].filter((k) => activeByItem.has(k)).length;
83
+ return { workItems: [...picked.values()], activeClaims };
84
+ }
85
+ /**
86
+ * Make a work item safe to start over on the target: nothing is running there
87
+ * yet, so an item that was being worked on goes back to the queue.
88
+ *
89
+ * @param wi - Work item as exported
90
+ * @returns Copy for the target
91
+ */
92
+ export function resetWorkItemForTarget(wi) {
93
+ const next = { ...wi };
94
+ if (next.status === 'running' || next.status === 'accepted') {
95
+ next.status = 'queued';
96
+ delete next.startedAt;
97
+ next.metadata = { ...(next.metadata ?? {}), movedFromRunning: true };
98
+ }
99
+ return next;
100
+ }
101
+ /**
102
+ * Scheduled messages (legacy owner-created reminders) that address a team.
103
+ *
104
+ * @param messages - All scheduled messages
105
+ * @param id - Team identity
106
+ * @returns Those whose `targetTeam` names the team or one of its members
107
+ */
108
+ export function selectScheduledMessages(messages, id) {
109
+ return messages.filter((m) => targetsTeam(m.targetTeam, id));
110
+ }
111
+ /** Decision statuses that still wait for the owner. */
112
+ const PENDING_DECISION_STATUSES = new Set(['open', 'parked']);
113
+ /**
114
+ * Open decisions/requests to the owner that belong to a team.
115
+ *
116
+ * @param decisions - All decisions
117
+ * @param id - Team identity
118
+ * @returns Pending ones asked by the team or one of its members
119
+ */
120
+ export function selectDecisions(decisions, id) {
121
+ return decisions.filter((d) => PENDING_DECISION_STATUSES.has(d.status) &&
122
+ (d.teamId === id.teamId || (typeof d.asker === 'string' && id.sessions.has(d.asker)) || (typeof d.requestedBy === 'string' && id.sessions.has(d.requestedBy))));
123
+ }
124
+ //# sourceMappingURL=team-move-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-select.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Test fixture of the team move: builds a throwaway Crewly home with one team
3
+ * (plus a decoy team that must not travel), its agents' memory, handover notes,
4
+ * a project with `.crewly` data and a git repository, task-pool items,
5
+ * decisions, chat channels and a Slack channel mapping.
6
+ *
7
+ * @module services/team-move/team-move.fixture
8
+ */
9
+ /** Ids of the fixture. */
10
+ export declare const FIXTURE: {
11
+ readonly teamId: "11111111-1111-4111-8111-111111111111";
12
+ readonly decoyTeamId: "22222222-2222-4222-8222-222222222222";
13
+ readonly projectId: "33333333-3333-4333-8333-333333333333";
14
+ readonly leadId: "aaaaaaaa-0000-4000-8000-000000000001";
15
+ readonly devId: "aaaaaaaa-0000-4000-8000-000000000002";
16
+ readonly leadSession: "movers-lena-aaaaaaaa";
17
+ readonly devSession: "movers-dev-bbbbbbbb";
18
+ readonly decoySession: "decoy-dan-cccccccc";
19
+ readonly channelId: "chan-0001-team-channel";
20
+ readonly dmId: "chan-0002-lena-dm";
21
+ };
22
+ /** A built fixture. */
23
+ export interface Fixture {
24
+ root: string;
25
+ home: string;
26
+ projectDir: string;
27
+ remoteDir: string;
28
+ cleanup(): Promise<void>;
29
+ }
30
+ /**
31
+ * Build the source machine.
32
+ *
33
+ * @returns Paths and a cleanup function
34
+ */
35
+ export declare function buildSourceFixture(): Promise<Fixture>;
36
+ /**
37
+ * An empty target machine.
38
+ *
39
+ * @param root - Fixture root
40
+ * @returns Target home and projects root
41
+ */
42
+ export declare function buildTargetPaths(root: string): Promise<{
43
+ home: string;
44
+ projectsRoot: string;
45
+ }>;
46
+ //# sourceMappingURL=team-move.fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move.fixture.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move.fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,0BAA0B;AAC1B,eAAO,MAAM,OAAO;;;;;;;;;;;CAWV,CAAC;AAEX,uBAAuB;AACvB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AA2BD;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAiJ3D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAMpG"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Test fixture of the team move: builds a throwaway Crewly home with one team
3
+ * (plus a decoy team that must not travel), its agents' memory, handover notes,
4
+ * a project with `.crewly` data and a git repository, task-pool items,
5
+ * decisions, chat channels and a Slack channel mapping.
6
+ *
7
+ * @module services/team-move/team-move.fixture
8
+ */
9
+ import { execFileSync } from 'node:child_process';
10
+ import * as fs from 'node:fs/promises';
11
+ import * as os from 'node:os';
12
+ import * as path from 'node:path';
13
+ import { openChatDatabase } from '../chat-v2/sqlite/chat-db.js';
14
+ /** Ids of the fixture. */
15
+ export const FIXTURE = {
16
+ teamId: '11111111-1111-4111-8111-111111111111',
17
+ decoyTeamId: '22222222-2222-4222-8222-222222222222',
18
+ projectId: '33333333-3333-4333-8333-333333333333',
19
+ leadId: 'aaaaaaaa-0000-4000-8000-000000000001',
20
+ devId: 'aaaaaaaa-0000-4000-8000-000000000002',
21
+ leadSession: 'movers-lena-aaaaaaaa',
22
+ devSession: 'movers-dev-bbbbbbbb',
23
+ decoySession: 'decoy-dan-cccccccc',
24
+ channelId: 'chan-0001-team-channel',
25
+ dmId: 'chan-0002-lena-dm',
26
+ };
27
+ /**
28
+ * Write a JSON file, creating folders.
29
+ *
30
+ * @param file - Destination
31
+ * @param value - Content
32
+ */
33
+ async function writeJson(file, value) {
34
+ await fs.mkdir(path.dirname(file), { recursive: true });
35
+ await fs.writeFile(file, JSON.stringify(value, null, 2));
36
+ }
37
+ /**
38
+ * Write a text file, creating folders.
39
+ *
40
+ * @param file - Destination
41
+ * @param text - Content
42
+ */
43
+ async function writeText(file, text) {
44
+ await fs.mkdir(path.dirname(file), { recursive: true });
45
+ await fs.writeFile(file, text);
46
+ }
47
+ const git = (cwd, ...args) => execFileSync('git', args, { cwd, encoding: 'utf8', env: { ...process.env, GIT_AUTHOR_NAME: 't', GIT_AUTHOR_EMAIL: 't@t', GIT_COMMITTER_NAME: 't', GIT_COMMITTER_EMAIL: 't@t' } }).trim();
48
+ /**
49
+ * Build the source machine.
50
+ *
51
+ * @returns Paths and a cleanup function
52
+ */
53
+ export async function buildSourceFixture() {
54
+ const root = await fs.mkdtemp(path.join(os.tmpdir(), 'crewly-move-fixture-'));
55
+ const home = path.join(root, 'source-home', '.crewly');
56
+ const projectDir = path.join(root, 'source-projects', 'movers-app');
57
+ const remoteDir = path.join(root, 'remote.git');
58
+ const F = FIXTURE;
59
+ const now = '2026-10-10T10:00:00.000Z';
60
+ // Git: a bare remote with one pushed commit; the project is a clone of it.
61
+ await fs.mkdir(remoteDir, { recursive: true });
62
+ git(remoteDir, 'init', '--bare', '-q', '-b', 'main');
63
+ await fs.mkdir(projectDir, { recursive: true });
64
+ git(projectDir, 'init', '-q', '-b', 'main');
65
+ await writeText(path.join(projectDir, 'README.md'), '# movers app\n');
66
+ await writeText(path.join(projectDir, '.gitignore'), '.crewly/\n');
67
+ git(projectDir, 'add', '-A');
68
+ git(projectDir, 'commit', '-q', '-m', 'first');
69
+ git(projectDir, 'remote', 'add', 'origin', remoteDir);
70
+ git(projectDir, 'push', '-q', '-u', 'origin', 'main');
71
+ // Project-local Crewly data.
72
+ await writeText(path.join(projectDir, '.crewly', 'tickets', 'MOV-1-ship-it.md'), `---\nid: MOV-1\nstatus: ready\n---\nShip it from ${projectDir}/src\n`);
73
+ await writeText(path.join(projectDir, '.crewly', 'tickets', 'MOV-2-second.md'), '---\nid: MOV-2\nstatus: backlog\n---\nSecond ticket\n');
74
+ await writeJson(path.join(projectDir, '.crewly', 'missions', 'm1.json'), { id: 'm1', title: 'Launch', objective: 'ship' });
75
+ await writeText(path.join(projectDir, '.crewly', 'findings', 'notes.md'), 'findings\n');
76
+ await writeText(path.join(projectDir, '.crewly', 'logs', 'noise.log'), 'log noise\n');
77
+ await writeText(path.join(projectDir, '.crewly', 'tickets', 'old.md.bak-1'), 'backup\n');
78
+ // Teams.
79
+ const member = (id, name, role, session) => ({
80
+ id,
81
+ name,
82
+ sessionName: session,
83
+ role,
84
+ systemPrompt: `You are ${name}. Work in ${projectDir}. Use ffmpeg for video.`,
85
+ agentStatus: 'active',
86
+ workingStatus: 'in_progress',
87
+ runtimeType: 'claude-code',
88
+ readyAt: now,
89
+ dropoutReason: 'idle_exit',
90
+ createdAt: now,
91
+ updatedAt: now,
92
+ agentId: session,
93
+ });
94
+ const teamDir = path.join(home, 'teams', F.teamId);
95
+ await writeJson(path.join(teamDir, 'config.json'), {
96
+ id: F.teamId,
97
+ name: 'Movers',
98
+ description: 'Team that moves',
99
+ members: [member(F.leadId, 'Lena', 'tech-lead', F.leadSession), member(F.devId, 'Dev', 'developer', F.devSession)],
100
+ projectIds: [F.projectId],
101
+ leaderId: F.leadId,
102
+ leaderIds: [F.leadId],
103
+ createdAt: now,
104
+ updatedAt: now,
105
+ });
106
+ await writeText(path.join(teamDir, 'prompts', `${F.leadId}.md`), 'lead prompt');
107
+ await writeText(path.join(teamDir, 'norms', 'review.md'), '# Review norm\nAlways review with Google Drive docs.\n');
108
+ await writeText(path.join(teamDir, 'sops', 'release.md'), '# Release SOP\n');
109
+ await writeText(path.join(teamDir, 'wiki', 'llm-curated', 'index.md'), '# Wiki index\n');
110
+ await writeText(path.join(teamDir, 'wiki', 'llm-curated', 'usage.jsonl'), '{"x":1}\n');
111
+ await writeJson(path.join(teamDir, 'cron-tasks.json'), { tasks: [{ id: 'cron-1', cron: '0 9 * * *', message: 'daily' }] });
112
+ await writeJson(path.join(teamDir, 'config.json.bak-1'), { stale: true });
113
+ const decoyDir = path.join(home, 'teams', F.decoyTeamId);
114
+ await writeJson(path.join(decoyDir, 'config.json'), {
115
+ id: F.decoyTeamId,
116
+ name: 'Decoy',
117
+ members: [member('dddddddd-0000-4000-8000-000000000001', 'Dan', 'developer', F.decoySession)],
118
+ projectIds: [],
119
+ createdAt: now,
120
+ updatedAt: now,
121
+ });
122
+ await writeJson(path.join(home, 'projects.json'), [
123
+ { id: F.projectId, name: 'Movers App', path: projectDir, teams: {}, status: 'stopped', createdAt: now, updatedAt: now },
124
+ ]);
125
+ // Agent memory and handover notes.
126
+ for (const s of [F.leadSession, F.devSession, F.decoySession]) {
127
+ await writeJson(path.join(home, 'agents', s, 'memory.json'), { session: s, notes: [`remember ${s}`] });
128
+ await writeText(path.join(home, 'agents', s, 'standing.md'), `standing answers of ${s}\n`);
129
+ await writeText(path.join(home, 'agents', s, 'sessions', '2026-10-01-10-00.md'), `summary of ${s}\n`);
130
+ }
131
+ for (let i = 0; i < 12; i++) {
132
+ const stamp = `2026-10-${String(i + 1).padStart(2, '0')}T10-00-00-000Z`;
133
+ await writeText(path.join(home, 'handover', `${F.leadSession}-${stamp}.md`), `handover ${i}`);
134
+ }
135
+ await writeText(path.join(home, 'handover', `${F.decoySession}-2026-10-01T10-00-00-000Z.md`), 'decoy handover');
136
+ // Task pool.
137
+ const item = (id, target, status) => ({
138
+ id,
139
+ type: 'delegate',
140
+ owner: 'team_lead',
141
+ target,
142
+ title: `item ${id}`,
143
+ description: `see ${projectDir}`,
144
+ status,
145
+ createdAt: now,
146
+ retryCount: 0,
147
+ maxRetries: 3,
148
+ inputTokens: 0,
149
+ outputTokens: 0,
150
+ cost: 0,
151
+ startedAt: status === 'running' ? now : undefined,
152
+ });
153
+ await writeJson(path.join(home, 'task-pool', 'pool.json'), {
154
+ workItems: [item('wi-queued', F.devSession, 'queued'), item('wi-running', F.leadSession, 'running'), item('wi-done', F.devSession, 'done'), item('wi-decoy', F.decoySession, 'queued')],
155
+ claims: [],
156
+ lastUpdatedAt: now,
157
+ });
158
+ // Decisions.
159
+ await writeJson(path.join(home, 'owner-decisions.json'), {
160
+ nextId: 3,
161
+ decisions: [
162
+ { id: 'D-1', question: 'Ship?', options: [], defaultKey: 'wait', deadline: now, requestedBy: F.leadSession, asker: F.leadSession, teamId: F.teamId, status: 'open', card: { slackChannelId: 'C1', messageTs: '1.1', postedBy: 'crewly' }, createdAt: now, updatedAt: now },
163
+ { id: 'D-2', question: 'Old?', options: [], defaultKey: 'wait', deadline: now, requestedBy: F.leadSession, asker: F.leadSession, teamId: F.teamId, status: 'resolved', createdAt: now, updatedAt: now },
164
+ ],
165
+ });
166
+ // Slack channel mapping.
167
+ await writeJson(path.join(home, 'slack-team-channels.json'), {
168
+ version: 1,
169
+ autoCreate: true,
170
+ channelPrefix: '',
171
+ mappings: [{ teamId: F.teamId, slackChannelId: 'C0MOVERS', slackChannelName: 'movers', chatChannelId: F.channelId, createdAt: now, autoCreated: true }],
172
+ });
173
+ // Chat channels.
174
+ const db = openChatDatabase({ dbPath: path.join(home, 'chat.db'), skipIntegrityCheck: true });
175
+ try {
176
+ const insert = db.prepare('INSERT INTO chat_channels (id, agent_session, owner_user_id, name, purpose, created_at, type, team_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
177
+ insert.run(F.channelId, '', 'owner', 'movers', null, Date.parse(now), 'huddle', F.teamId);
178
+ insert.run(F.dmId, F.leadSession, 'owner', 'Lena', null, Date.parse(now), 'dm', null);
179
+ insert.run('chan-0003-decoy-dm', F.decoySession, 'owner', 'Dan', null, Date.parse(now), 'dm', null);
180
+ const member = db.prepare('INSERT INTO chat_channel_members (channel_id, member_session, joined_at) VALUES (?, ?, ?)');
181
+ member.run(F.channelId, F.leadSession, Date.parse(now));
182
+ member.run(F.channelId, F.devSession, Date.parse(now));
183
+ }
184
+ finally {
185
+ db.close();
186
+ }
187
+ return { root, home, projectDir, remoteDir, cleanup: () => fs.rm(root, { recursive: true, force: true }) };
188
+ }
189
+ /**
190
+ * An empty target machine.
191
+ *
192
+ * @param root - Fixture root
193
+ * @returns Target home and projects root
194
+ */
195
+ export async function buildTargetPaths(root) {
196
+ const home = path.join(root, 'target-home', '.crewly');
197
+ const projectsRoot = path.join(root, 'target-projects');
198
+ await fs.mkdir(home, { recursive: true });
199
+ await fs.mkdir(projectsRoot, { recursive: true });
200
+ return { home, projectsRoot };
201
+ }
202
+ //# sourceMappingURL=team-move.fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move.fixture.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move.fixture.ts"],"names":[],"mappings":"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"}