crewly 1.20.303 → 1.20.305

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 (139) hide show
  1. package/config/skills/orchestrator/move-team/SKILL.md +53 -0
  2. package/config/skills/orchestrator/move-team/execute.sh +42 -0
  3. package/dist/backend/backend/src/constants.d.ts +82 -0
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +82 -0
  6. package/dist/backend/backend/src/constants.js.map +1 -1
  7. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts +39 -0
  8. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts.map +1 -0
  9. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js +211 -0
  10. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js.map +1 -0
  11. package/dist/backend/backend/src/index.d.ts.map +1 -1
  12. package/dist/backend/backend/src/index.js +22 -3
  13. package/dist/backend/backend/src/index.js.map +1 -1
  14. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  15. package/dist/backend/backend/src/routes/api.routes.js +3 -0
  16. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  17. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  18. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  19. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
  20. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  21. package/dist/backend/backend/src/services/core/storage.service.d.ts +18 -0
  22. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  23. package/dist/backend/backend/src/services/core/storage.service.js +16 -0
  24. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  25. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +19 -0
  26. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/decisions/decision.service.js +46 -0
  28. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  29. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
  31. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  32. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  33. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +25 -0
  35. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  36. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  37. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +41 -0
  39. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts +122 -0
  41. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts.map +1 -0
  42. package/dist/backend/backend/src/services/team-move/team-move-archive.js +202 -0
  43. package/dist/backend/backend/src/services/team-move/team-move-archive.js.map +1 -0
  44. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +59 -0
  45. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -0
  46. package/dist/backend/backend/src/services/team-move/team-move-chat.js +133 -0
  47. package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -0
  48. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts +102 -0
  49. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts.map +1 -0
  50. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js +217 -0
  51. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js.map +1 -0
  52. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts +102 -0
  53. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/team-move/team-move-crypto.js +348 -0
  55. package/dist/backend/backend/src/services/team-move/team-move-crypto.js.map +1 -0
  56. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts +209 -0
  57. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js +504 -0
  59. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js.map +1 -0
  60. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +182 -0
  61. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/team-move/team-move-exporter.js +537 -0
  63. package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -0
  64. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts +157 -0
  65. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts.map +1 -0
  66. package/dist/backend/backend/src/services/team-move/team-move-fs.js +298 -0
  67. package/dist/backend/backend/src/services/team-move/team-move-fs.js.map +1 -0
  68. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts +69 -0
  69. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts.map +1 -0
  70. package/dist/backend/backend/src/services/team-move/team-move-git.js +198 -0
  71. package/dist/backend/backend/src/services/team-move/team-move-git.js.map +1 -0
  72. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +121 -0
  73. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/team-move/team-move-importer.js +473 -0
  75. package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -0
  76. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts +110 -0
  77. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/team-move/team-move-journal.js +198 -0
  79. package/dist/backend/backend/src/services/team-move/team-move-journal.js.map +1 -0
  80. package/dist/backend/backend/src/services/team-move/team-move-machines.d.ts +62 -0
  81. package/dist/backend/backend/src/services/team-move/team-move-machines.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/team-move/team-move-machines.js +95 -0
  83. package/dist/backend/backend/src/services/team-move/team-move-machines.js.map +1 -0
  84. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts +71 -0
  85. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
  87. package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
  88. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
  89. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
  91. package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
  92. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
  93. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
  95. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
  96. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
  97. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
  99. package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
  100. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
  101. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
  103. package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
  104. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +279 -0
  105. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
  107. package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
  108. package/dist/backend/build-info.json +2 -2
  109. package/dist/cli/backend/src/constants.d.ts +82 -0
  110. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  111. package/dist/cli/backend/src/constants.js +82 -0
  112. package/dist/cli/backend/src/constants.js.map +1 -1
  113. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  114. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  115. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  116. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  117. package/dist/cli/backend/src/services/core/storage.service.d.ts +18 -0
  118. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  119. package/dist/cli/backend/src/services/core/storage.service.js +16 -0
  120. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  121. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
  122. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  123. package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
  124. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  125. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  126. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -0
  128. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  129. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  130. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  131. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +41 -0
  132. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  133. package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
  134. package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
  135. package/dist/cli/cli/src/commands/team-move.js +159 -0
  136. package/dist/cli/cli/src/commands/team-move.js.map +1 -0
  137. package/dist/cli/cli/src/index.js +33 -0
  138. package/dist/cli/cli/src/index.js.map +1 -1
  139. package/package.json +1 -1
@@ -0,0 +1,537 @@
1
+ /**
2
+ * Team move exporter (source machine).
3
+ *
4
+ * Collects everything Crewly owns about ONE team into a staging directory,
5
+ * writes a manifest with a hash for every file, runs the secret scan, and (in
6
+ * {@link buildEncryptedPackage}) turns the staging directory into an encrypted
7
+ * `tar.gz` stream.
8
+ *
9
+ * Package layout (POSIX paths):
10
+ *
11
+ * manifest.json
12
+ * team/** the team's folder: config, prompts, norms, SOPs,
13
+ * wiki vault, cron tasks
14
+ * agents/<session>/** agent memory, standing answers, session summaries
15
+ * handover/<file> newest handover notes per agent
16
+ * records/*.json task-pool items, decisions, chat channels and
17
+ * rooms, Slack channel mapping, scheduled messages
18
+ * projects/<id>/data/** `<project>/.crewly/**` (or the package-tree stores)
19
+ *
20
+ * Not in it: credentials, tokens, runtime logins, logs and transcripts,
21
+ * node_modules/build output and repository working trees (the repo list in
22
+ * the manifest lets the target clone them).
23
+ *
24
+ * @module services/team-move/team-move-exporter
25
+ */
26
+ import * as fs from 'node:fs/promises';
27
+ import * as path from 'node:path';
28
+ import { createWriteStream } from 'node:fs';
29
+ import { pipeline } from 'node:stream/promises';
30
+ import { create as tarCreate } from 'tar';
31
+ import { TEAM_MOVE_CONSTANTS } from '../../constants.js';
32
+ import { safeReadJson } from '../../utils/file-io.utils.js';
33
+ import { collectSecretEnvValues } from '../../utils/secret-env.js';
34
+ import { PACKAGE_TREE_STORES, getCrewlyHomePath, isInsidePackageTree, resolveProjectDataDir } from '../core/crewly-home.utils.js';
35
+ import { readTeamChat } from './team-move-chat.js';
36
+ import { createEncryptStream, createHashTap } from './team-move-crypto.js';
37
+ import { StagingArea, walkFiles } from './team-move-fs.js';
38
+ import { describeBlockingRepos, inspectRepo as defaultInspectRepo } from './team-move-git.js';
39
+ import { TeamMoveSecretScanError, isSkippableFinding, scanStaging } from './team-move-secret-scan.js';
40
+ import { identityOf, resetWorkItemForTarget, selectDecisions, selectPoolItems, selectScheduledMessages, } from './team-move-select.js';
41
+ const C = TEAM_MOVE_CONSTANTS;
42
+ /** First path segments of a project's `.crewly` that are Crewly state, packaged before anything else. */
43
+ const CORE_PROJECT_DIRS = new Set([
44
+ 'tickets',
45
+ 'missions',
46
+ 'requests',
47
+ 'triggers',
48
+ 'knowledge',
49
+ 'wiki',
50
+ 'goals',
51
+ 'tasks',
52
+ 'task-records',
53
+ 'escalations',
54
+ 'specs',
55
+ 'memory',
56
+ 'prompts',
57
+ 'agents-index.json',
58
+ ]);
59
+ /** Folders of a project's `.crewly` that are scratch space, never packaged. */
60
+ const PROJECT_SCRATCH_DIRS = new Set(['worktrees', 'tmp', 'cache']);
61
+ /** Connectors whose connection does not travel; found by name in the team's words. */
62
+ const CONNECTOR_HINTS = {
63
+ Google: /\bgoogle (?:drive|docs|sheets|slides|calendar)\b|\bgmail\b/,
64
+ Zoho: /\bzoho\b/,
65
+ Canva: /\bcanva\b/,
66
+ WhatsApp: /\bwhatsapp\b/,
67
+ };
68
+ /** Thrown when a repository holds work that exists only on the source. */
69
+ export class TeamMoveBlockedError extends Error {
70
+ lines;
71
+ constructor(lines) {
72
+ super(`Push this work before moving the team: ${lines.join('; ')}`);
73
+ this.lines = lines;
74
+ this.name = 'TeamMoveBlockedError';
75
+ }
76
+ }
77
+ /**
78
+ * The caps for non-git project files: constants, overridable in megabytes by
79
+ * `CREWLY_TEAM_MOVE_WORK_MAX_MB` and `CREWLY_TEAM_MOVE_WORK_FILE_MAX_MB`.
80
+ *
81
+ * @param env - Environment to read overrides from
82
+ * @returns The caps in bytes
83
+ */
84
+ export function resolveWorkFileLimits(env = process.env) {
85
+ const mb = (name, fallback) => {
86
+ const n = Number(env[name]);
87
+ return Number.isFinite(n) && n > 0 ? Math.floor(n * 1024 * 1024) : fallback;
88
+ };
89
+ return { totalBytes: mb(C.WORK_FILES_MAX_MB_ENV, C.WORK_FILES_MAX_BYTES), fileBytes: mb(C.WORK_FILE_MAX_MB_ENV, C.WORK_FILE_MAX_BYTES) };
90
+ }
91
+ /** Whether a repo record says the folder is not a git repository (its files travel instead of being cloned). */
92
+ export function isPlainFolder(repo) {
93
+ return !!repo.note?.startsWith('not a git repository');
94
+ }
95
+ /**
96
+ * Prepare a team config for another machine: nothing is running there yet.
97
+ *
98
+ * @param raw - Parsed `config.json`
99
+ * @returns Copy with runtime state cleared
100
+ */
101
+ export function sanitizeTeamForMove(raw) {
102
+ const team = { ...raw };
103
+ delete team['archived'];
104
+ delete team['archivedAt'];
105
+ delete team['movedTo'];
106
+ const members = Array.isArray(team['members']) ? team['members'] : [];
107
+ team['members'] = members.map((m) => {
108
+ const next = { ...m, agentStatus: 'inactive', workingStatus: 'idle' };
109
+ for (const key of ['readyAt', 'lastStartError', 'dropoutReason', 'lastActivityCheck', 'runtimeFallback'])
110
+ delete next[key];
111
+ return next;
112
+ });
113
+ return team;
114
+ }
115
+ /** Escape a string for use in a RegExp. */
116
+ function escapeRegExp(text) {
117
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
118
+ }
119
+ /** The exporter. */
120
+ export class TeamMoveExporter {
121
+ deps;
122
+ home;
123
+ now;
124
+ inspect;
125
+ constructor(deps) {
126
+ this.deps = deps;
127
+ this.home = deps.home ?? getCrewlyHomePath();
128
+ this.now = deps.now ?? (() => new Date().toISOString());
129
+ this.inspect = deps.inspectRepo ?? defaultInspectRepo;
130
+ }
131
+ /**
132
+ * Check, before anything is built, that no repository holds work only this
133
+ * machine has. Used by the REST entry point so the owner learns what to
134
+ * push before a move is even requested.
135
+ *
136
+ * @param teamId - Team to move
137
+ * @returns The repos and the lines that block the move
138
+ */
139
+ async checkRepos(teamId) {
140
+ const team = await this.requireTeam(teamId);
141
+ const projects = await this.teamProjects(team);
142
+ const repos = await Promise.all(projects.map((p) => this.inspect({ id: p.id, name: p.name, path: p.path })));
143
+ return { repos, blocking: describeBlockingRepos(repos) };
144
+ }
145
+ async requireTeam(teamId) {
146
+ const team = (await this.deps.getTeams()).find((t) => t.id === teamId);
147
+ if (!team)
148
+ throw new Error(`team ${teamId} not found on this machine`);
149
+ if (team.members.length === 0)
150
+ throw new Error(`team ${team.name} has no members`);
151
+ return team;
152
+ }
153
+ async teamProjects(team) {
154
+ const all = await this.deps.getProjects();
155
+ return team.projectIds.map((id) => all.find((p) => p.id === id)).filter((p) => !!p);
156
+ }
157
+ /**
158
+ * Collect, scan and describe the package.
159
+ *
160
+ * @param options - Team, move, staging directory, policy flags
161
+ * @returns Manifest, staging area and the Cloud summary
162
+ * @throws TeamMoveBlockedError for unpushed work; TeamMoveSecretScanError for secrets
163
+ */
164
+ async export(options) {
165
+ const team = await this.requireTeam(options.teamId);
166
+ const projects = await this.teamProjects(team);
167
+ const id = identityOf(team);
168
+ const repos = await Promise.all(projects.map((p) => this.inspect({ id: p.id, name: p.name, path: p.path })));
169
+ const blocking = describeBlockingRepos(repos);
170
+ if (blocking.length > 0 && !options.allowDirty)
171
+ throw new TeamMoveBlockedError(blocking);
172
+ const staging = new StagingArea(path.resolve(options.stagingDir));
173
+ await staging.init();
174
+ const counts = {};
175
+ const bump = (key, n = 1) => {
176
+ counts[key] = (counts[key] ?? 0) + n;
177
+ };
178
+ // 1. The team's folder (config, prompts, norms, SOPs, wiki vault, cron tasks).
179
+ const teamDir = path.join(this.home, 'teams', team.id);
180
+ const rawConfig = await safeReadJson(path.join(teamDir, 'config.json'), null);
181
+ if (!rawConfig)
182
+ throw new Error(`team ${team.name} has no config.json`);
183
+ await staging.writeJson('team/config.json', sanitizeTeamForMove(rawConfig));
184
+ for await (const f of walkFiles(teamDir)) {
185
+ if (f.rel === 'config.json')
186
+ continue;
187
+ await staging.copyIn(f.abs, `team/${f.rel}`);
188
+ const top = f.rel.split('/')[0];
189
+ if (top === 'wiki')
190
+ bump('wikiPages');
191
+ else if (top === 'norms' || top === 'sops')
192
+ bump('normsAndSops');
193
+ else if (top === 'prompts')
194
+ bump('prompts');
195
+ else if (f.rel === 'cron-tasks.json')
196
+ bump('cronTaskFiles');
197
+ }
198
+ bump('members', team.members.length);
199
+ const cron = await safeReadJson(path.join(teamDir, 'cron-tasks.json'), {});
200
+ if (Array.isArray(cron.tasks))
201
+ counts['cronTasks'] = cron.tasks.length;
202
+ if (Array.isArray(team.triggers))
203
+ counts['teamTriggers'] = team.triggers.length;
204
+ // 2. Agent memory, standing answers and session summaries.
205
+ for (const session of id.sessions) {
206
+ for await (const f of walkFiles(path.join(this.home, 'agents', session))) {
207
+ await staging.copyIn(f.abs, `agents/${session}/${f.rel}`);
208
+ bump('agentFiles');
209
+ if (f.rel.startsWith('sessions/'))
210
+ bump('sessionSummaries');
211
+ }
212
+ }
213
+ // 3. Newest handover notes per agent.
214
+ const handoverDir = path.join(this.home, 'handover');
215
+ const handoverNames = await fs.readdir(handoverDir).catch(() => []);
216
+ for (const session of id.sessions) {
217
+ const own = new RegExp(`^${escapeRegExp(session)}-(?:\\d{4}-|restart-|runtime-)`);
218
+ const matching = [];
219
+ for (const name of handoverNames) {
220
+ if (!own.test(name) || !name.endsWith('.md'))
221
+ continue;
222
+ const st = await fs.stat(path.join(handoverDir, name)).catch(() => null);
223
+ if (st?.isFile())
224
+ matching.push({ name, mtime: st.mtimeMs });
225
+ }
226
+ matching.sort((a, b) => b.mtime - a.mtime);
227
+ for (const h of matching.slice(0, C.HANDOVERS_PER_AGENT)) {
228
+ await staging.copyIn(path.join(handoverDir, h.name), `handover/${h.name}`);
229
+ bump('handoverNotes');
230
+ }
231
+ }
232
+ // 4. Records from the global stores.
233
+ await this.collectRecords(staging, id, team, counts);
234
+ // 5. Project-local Crewly data, within the size caps.
235
+ const allTeams = await this.deps.getTeams();
236
+ const packageProjects = await this.collectProjects(staging, projects, allTeams, team.id, counts);
237
+ await this.collectWorkFiles(staging, repos, packageProjects, counts);
238
+ // 6. Required tools and runtimes.
239
+ const { tools: requiredTools, connectors: requiredConnectors } = await this.detectNeeds(staging, team);
240
+ const requiredRuntimes = [...new Set(team.members.map((m) => m.runtimeType).filter(Boolean))].sort();
241
+ // 7. Secret scan: nothing leaves the machine with a credential in it.
242
+ const known = this.deps.knownSecrets ? await this.deps.knownSecrets() : collectSecretEnvValues(process.env);
243
+ const scan = await scanStaging(staging, staging.files(), known);
244
+ let excludedFiles = 0;
245
+ if (scan.findings.length > 0) {
246
+ const removable = scan.findings.filter((f) => isSkippableFinding(f.path));
247
+ if (!options.skipFlagged || removable.length !== scan.findings.length)
248
+ throw new TeamMoveSecretScanError(scan.findings);
249
+ for (const finding of removable) {
250
+ const bytes = staging.files().find((e) => e.path === finding.path)?.bytes ?? 0;
251
+ await staging.remove(finding.path);
252
+ excludedFiles += 1;
253
+ const projectMatch = /^projects\/([^/]+)\/(data|files)\/(.*)$/.exec(finding.path);
254
+ const project = projectMatch ? packageProjects.find((p) => p.id === projectMatch[1]) : undefined;
255
+ if (project && projectMatch) {
256
+ const skipped = { path: projectMatch[3], bytes, reason: 'secret_scan' };
257
+ if (projectMatch[2] === 'files' && project.work) {
258
+ project.work.skipped.push(skipped);
259
+ project.work.files -= 1;
260
+ project.work.bytes -= bytes;
261
+ counts['workFiles'] = Math.max(0, (counts['workFiles'] ?? 0) - 1);
262
+ }
263
+ else {
264
+ project.skipped.push(skipped);
265
+ project.files -= 1;
266
+ project.bytes -= bytes;
267
+ }
268
+ }
269
+ }
270
+ }
271
+ // 8. Manifest.
272
+ const members = team.members.map((m) => ({
273
+ id: m.id,
274
+ name: m.name,
275
+ role: m.role,
276
+ sessionName: m.sessionName,
277
+ runtimeType: m.runtimeType,
278
+ }));
279
+ counts['repos'] = repos.length;
280
+ counts['projects'] = packageProjects.length;
281
+ const files = staging.files();
282
+ const manifest = {
283
+ kind: C.PACKAGE_KIND,
284
+ schemaVersion: C.SCHEMA_VERSION,
285
+ moveId: options.moveId,
286
+ createdAt: this.now(),
287
+ crewlyVersion: this.deps.crewlyVersion,
288
+ source: { ...this.deps.source, homePath: this.home, platform: process.platform },
289
+ team: { id: team.id, name: team.name, members, projectIds: [...team.projectIds] },
290
+ counts,
291
+ projects: packageProjects,
292
+ repos,
293
+ requiredTools,
294
+ requiredRuntimes,
295
+ requiredConnectors,
296
+ files,
297
+ totalBytes: files.reduce((n, f) => n + f.bytes, 0),
298
+ noSecrets: true,
299
+ secretScan: { filesScanned: scan.filesScanned, knownValuesChecked: known.length, findings: 0, excludedFiles },
300
+ notMoved: this.notMovedList(),
301
+ };
302
+ await staging.writeJson('manifest.json', manifest);
303
+ return {
304
+ manifest,
305
+ staging,
306
+ summary: summarize(manifest),
307
+ dirtyRepos: blocking,
308
+ };
309
+ }
310
+ /** The things a move deliberately leaves out, shown to the owner. */
311
+ notMovedList() {
312
+ return [
313
+ 'Credentials, API keys, OAuth/connector grants and runtime logins (Claude, Codex, ...)',
314
+ 'Slack bot tokens (Crewly Cloud re-points the agents\' Slack apps to the target)',
315
+ 'Source code of git projects (cloned from each repository on the target; projects that are not git repositories travel in the package)',
316
+ 'Chat message history (channels and rooms move, messages stay on the source)',
317
+ 'Running sessions, logs, transcripts, build output and node_modules',
318
+ 'Short-lived agent reminders (they are set again by the agents)',
319
+ ];
320
+ }
321
+ /** Global-store records of the team. */
322
+ async collectRecords(staging, id, team, counts) {
323
+ // Task pool: open items of the team. Claims are not moved: nothing runs on the target yet.
324
+ const pool = await safeReadJson(path.join(this.home, 'task-pool', 'pool.json'), {});
325
+ const slice = selectPoolItems(pool, id);
326
+ await staging.writeJson('records/task-pool.json', { workItems: slice.workItems.map(resetWorkItemForTarget) });
327
+ counts['taskPoolItems'] = slice.workItems.length;
328
+ // Open decisions / requests to the owner.
329
+ const decisionsFile = await safeReadJson(path.join(this.home, 'owner-decisions.json'), {});
330
+ const decisions = selectDecisions(Array.isArray(decisionsFile.decisions) ? decisionsFile.decisions : [], id);
331
+ await staging.writeJson('records/decisions.json', { decisions });
332
+ counts['openDecisions'] = decisions.length;
333
+ // Legacy owner-created scheduled messages aimed at the team.
334
+ const scheduled = await safeReadJson(path.join(this.home, 'scheduled-messages.json'), []);
335
+ const mine = selectScheduledMessages(Array.isArray(scheduled) ? scheduled : [], id);
336
+ await staging.writeJson('records/scheduled-messages.json', { messages: mine });
337
+ counts['scheduledMessages'] = mine.length;
338
+ // Chat channels, rooms and DMs with their membership.
339
+ const chat = readTeamChat(this.home, id);
340
+ await staging.writeJson('records/chat-channels.json', chat);
341
+ counts['chatChannels'] = chat.channels.length;
342
+ // The Slack channel mapping of the team, so the target reuses the same channel.
343
+ const slackFile = await safeReadJson(path.join(this.home, 'slack-team-channels.json'), {});
344
+ const mapping = (Array.isArray(slackFile.mappings) ? slackFile.mappings : []).find((m) => m['teamId'] === team.id) ?? null;
345
+ await staging.writeJson('records/slack-team-channel.json', { mapping });
346
+ if (mapping)
347
+ counts['slackChannelMappings'] = 1;
348
+ }
349
+ /**
350
+ * Copy each project's Crewly data under the size caps.
351
+ *
352
+ * @returns Manifest entries of the projects
353
+ */
354
+ async collectProjects(staging, projects, allTeams, teamId, counts) {
355
+ const out = [];
356
+ let remaining = C.PROJECT_FILES_MAX_BYTES;
357
+ for (const project of projects) {
358
+ const dataDir = resolveProjectDataDir(project.path);
359
+ const inHome = isInsidePackageTree(project.path);
360
+ const entry = {
361
+ id: project.id,
362
+ name: project.name,
363
+ sourcePath: project.path,
364
+ dataDir: inHome ? 'home' : '.crewly',
365
+ files: 0,
366
+ bytes: 0,
367
+ skipped: [],
368
+ sharedWithTeams: allTeams.filter((t) => t.id !== teamId && t.projectIds.includes(project.id)).map((t) => t.name),
369
+ };
370
+ // Candidates: every file with its package-relative path.
371
+ const candidates = [];
372
+ const roots = inHome
373
+ ? PACKAGE_TREE_STORES.map((s) => ({ dir: path.join(dataDir, s), prefix: s }))
374
+ : [{ dir: dataDir, prefix: '' }];
375
+ for (const root of roots) {
376
+ const single = await fs.stat(root.dir).catch(() => null);
377
+ if (single?.isFile()) {
378
+ candidates.push({ abs: root.dir, rel: root.prefix, size: single.size, priority: 0 });
379
+ continue;
380
+ }
381
+ for await (const f of walkFiles(root.dir, PROJECT_SCRATCH_DIRS)) {
382
+ const rel = root.prefix ? `${root.prefix}/${f.rel}` : f.rel;
383
+ candidates.push({ abs: f.abs, rel, size: f.size, priority: CORE_PROJECT_DIRS.has(rel.split('/')[0]) ? 0 : 1 });
384
+ }
385
+ }
386
+ // Core state first, then small files before big ones, so a cap loses the biggest scratch files.
387
+ candidates.sort((a, b) => a.priority - b.priority || a.size - b.size || (a.rel < b.rel ? -1 : 1));
388
+ for (const c of candidates) {
389
+ const skip = (reason) => {
390
+ entry.skipped.push({ path: c.rel, bytes: c.size, reason });
391
+ };
392
+ if (c.size > C.PROJECT_FILE_MAX_BYTES)
393
+ skip('too_large');
394
+ else if (c.size > remaining)
395
+ skip('size_cap');
396
+ else {
397
+ try {
398
+ await staging.copyIn(c.abs, `projects/${project.id}/data/${c.rel}`);
399
+ remaining -= c.size;
400
+ entry.files += 1;
401
+ entry.bytes += c.size;
402
+ }
403
+ catch {
404
+ skip('unreadable');
405
+ }
406
+ }
407
+ }
408
+ entry.skipped.sort((a, b) => b.bytes - a.bytes);
409
+ counts['projectFiles'] = (counts['projectFiles'] ?? 0) + entry.files;
410
+ const count = (prefix) => staging.files().filter((f) => f.path.startsWith(`projects/${project.id}/data/${prefix}/`)).length;
411
+ counts['tickets'] = (counts['tickets'] ?? 0) + staging.files().filter((f) => f.path.startsWith(`projects/${project.id}/data/tickets/`) && f.path.endsWith('.md')).length;
412
+ counts['missionFiles'] = (counts['missionFiles'] ?? 0) + count('missions');
413
+ counts['requestFiles'] = (counts['requestFiles'] ?? 0) + count('requests');
414
+ counts['triggerFiles'] = (counts['triggerFiles'] ?? 0) + count('triggers');
415
+ out.push(entry);
416
+ }
417
+ return out;
418
+ }
419
+ /**
420
+ * Copy the working files of projects that are not git repositories (a git
421
+ * project is cloned on the target instead). Dependencies, build output,
422
+ * logs and `.DS_Store` stay out; the caps leave the biggest files behind
423
+ * and every skipped file is listed in the manifest.
424
+ */
425
+ async collectWorkFiles(staging, repos, packageProjects, counts) {
426
+ const limits = this.deps.workLimits ?? resolveWorkFileLimits();
427
+ const excluded = new Set(C.WORK_EXCLUDED_DIRS);
428
+ let remaining = limits.totalBytes;
429
+ for (const repo of repos) {
430
+ const entry = packageProjects.find((p) => p.id === repo.projectId);
431
+ if (!entry || !isPlainFolder(repo) || isInsidePackageTree(repo.path))
432
+ continue;
433
+ const work = { files: 0, bytes: 0, skipped: [] };
434
+ entry.work = work;
435
+ const candidates = [];
436
+ for await (const f of walkFiles(repo.path, excluded)) {
437
+ if (f.rel.endsWith('.log'))
438
+ continue;
439
+ candidates.push(f);
440
+ }
441
+ candidates.sort((a, b) => a.size - b.size || (a.rel < b.rel ? -1 : 1));
442
+ for (const c of candidates) {
443
+ const skip = (reason) => {
444
+ work.skipped.push({ path: c.rel, bytes: c.size, reason });
445
+ };
446
+ if (c.size > limits.fileBytes)
447
+ skip('too_large');
448
+ else if (c.size > remaining)
449
+ skip('size_cap');
450
+ else {
451
+ try {
452
+ await staging.copyIn(c.abs, `projects/${entry.id}/files/${c.rel}`);
453
+ remaining -= c.size;
454
+ work.files += 1;
455
+ work.bytes += c.size;
456
+ }
457
+ catch {
458
+ skip('unreadable');
459
+ }
460
+ }
461
+ }
462
+ work.skipped.sort((a, b) => b.bytes - a.bytes);
463
+ counts['workFiles'] = (counts['workFiles'] ?? 0) + work.files;
464
+ }
465
+ }
466
+ /** Tools and connectors the team's own words mention (prompts, norms, SOPs, cron tasks). */
467
+ async detectNeeds(staging, team) {
468
+ let text = team.members.map((m) => m.systemPrompt ?? '').join('\n');
469
+ for (const f of staging.files()) {
470
+ if (!/^team\/(norms|sops|prompts)\//.test(f.path) && f.path !== 'team/cron-tasks.json')
471
+ continue;
472
+ if (f.bytes > C.TEXT_FILE_MAX_BYTES)
473
+ continue;
474
+ text += `\n${await fs.readFile(staging.abs(f.path), 'utf8').catch(() => '')}`;
475
+ }
476
+ const lower = text.toLowerCase();
477
+ const tools = C.KNOWN_TOOLS.filter((tool) => new RegExp(`(?:^|[^a-z0-9-])${escapeRegExp(tool)}(?:$|[^a-z0-9-])`).test(lower)).sort();
478
+ const connectors = Object.entries(CONNECTOR_HINTS)
479
+ .filter(([, re]) => re.test(lower))
480
+ .map(([name]) => name)
481
+ .sort();
482
+ return { tools, connectors };
483
+ }
484
+ }
485
+ /**
486
+ * The small summary Cloud receives (kept far below its 64 KB limit).
487
+ *
488
+ * @param manifest - Full manifest
489
+ * @returns Summary without file names
490
+ */
491
+ export function summarize(manifest) {
492
+ return {
493
+ kind: manifest.kind,
494
+ schemaVersion: manifest.schemaVersion,
495
+ crewlyVersion: manifest.crewlyVersion,
496
+ team: { id: manifest.team.id, name: manifest.team.name, members: manifest.team.members.length },
497
+ counts: manifest.counts,
498
+ repos: manifest.repos.length,
499
+ reposDirty: manifest.repos.filter((r) => r.dirty || r.unpushed > 0).length,
500
+ requiredTools: manifest.requiredTools,
501
+ requiredRuntimes: manifest.requiredRuntimes,
502
+ totalBytes: manifest.totalBytes,
503
+ uncompressedBytes: manifest.totalBytes,
504
+ noSecrets: true,
505
+ };
506
+ }
507
+ /**
508
+ * Tar+gzip a staging directory and encrypt it for the target.
509
+ *
510
+ * @param stagingDir - Directory built by {@link TeamMoveExporter.export}
511
+ * @param outFile - Where the ciphertext is written
512
+ * @param recipientPublicKey - Target's base64 X25519 public key
513
+ * @param moveId - Move id (bound into the encryption)
514
+ * @returns File, size, hash and chunk count of the ciphertext
515
+ */
516
+ export async function buildEncryptedPackage(stagingDir, outFile, recipientPublicKey, moveId) {
517
+ await fs.mkdir(path.dirname(outFile), { recursive: true });
518
+ const tap = createHashTap();
519
+ const tarStream = tarCreate({ gzip: true, cwd: stagingDir, portable: true, noMtime: true }, ['.']);
520
+ await pipeline(tarStream, createEncryptStream({ recipientPublicKey, moveId }), tap, createWriteStream(outFile, { mode: 0o600 }));
521
+ return {
522
+ file: outFile,
523
+ size: tap.bytes,
524
+ sha256: tap.digest(),
525
+ chunks: Math.max(1, Math.ceil(tap.bytes / C.TRANSFER_CHUNK_BYTES)),
526
+ };
527
+ }
528
+ /**
529
+ * Package entries sorted for stable comparisons in tests.
530
+ *
531
+ * @param files - Manifest file entries
532
+ * @returns Paths
533
+ */
534
+ export function packagePaths(files) {
535
+ return files.map((f) => f.path).sort();
536
+ }
537
+ //# sourceMappingURL=team-move-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-exporter.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-exporter.ts"],"names":[],"mappings":"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"}