crewly 1.20.303 → 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 (135) 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 +69 -0
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +69 -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 +45 -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 +214 -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 +156 -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 +462 -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 +462 -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-preflight.d.ts +71 -0
  81. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
  83. package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
  84. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
  85. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
  87. package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
  88. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
  89. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
  91. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
  92. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
  93. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
  95. package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
  96. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
  97. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
  99. package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
  100. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +269 -0
  101. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
  103. package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
  104. package/dist/backend/build-info.json +2 -2
  105. package/dist/cli/backend/src/constants.d.ts +69 -0
  106. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  107. package/dist/cli/backend/src/constants.js +69 -0
  108. package/dist/cli/backend/src/constants.js.map +1 -1
  109. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  110. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  111. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  112. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  113. package/dist/cli/backend/src/services/core/storage.service.d.ts +18 -0
  114. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  115. package/dist/cli/backend/src/services/core/storage.service.js +16 -0
  116. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  117. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
  118. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  119. package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
  120. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  121. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  122. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  123. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -0
  124. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  125. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  126. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +41 -0
  128. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  129. package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
  130. package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
  131. package/dist/cli/cli/src/commands/team-move.js +155 -0
  132. package/dist/cli/cli/src/commands/team-move.js.map +1 -0
  133. package/dist/cli/cli/src/index.js +33 -0
  134. package/dist/cli/cli/src/index.js.map +1 -1
  135. package/package.json +1 -1
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Git side of the team move: read a repository's state on the source, and put
3
+ * a repository back at a recorded branch and commit on the target.
4
+ *
5
+ * Code never travels in the package. The source records where each project's
6
+ * repository lives (remote, branch, head, dirty) and refuses to move while
7
+ * work exists only on that machine; the target fetches the code itself with
8
+ * its own git credentials.
9
+ *
10
+ * @module services/team-move/team-move-git
11
+ */
12
+ import { execFile } from 'node:child_process';
13
+ import * as fs from 'node:fs/promises';
14
+ import * as path from 'node:path';
15
+ import { promisify } from 'node:util';
16
+ import { TEAM_MOVE_CONSTANTS } from '../../constants.js';
17
+ const execFileAsync = promisify(execFile);
18
+ /** Git probes are quick; a hung one must not stall the export. */
19
+ const PROBE_TIMEOUT_MS = 20_000;
20
+ /** Never prompt: a missing credential must fail, not hang. */
21
+ const NON_INTERACTIVE_ENV = {
22
+ GIT_TERMINAL_PROMPT: '0',
23
+ GIT_SSH_COMMAND: 'ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new',
24
+ };
25
+ /**
26
+ * Run git in a directory.
27
+ *
28
+ * @param cwd - Working directory
29
+ * @param args - Git arguments
30
+ * @param timeoutMs - Kill after this long
31
+ * @returns Trimmed stdout
32
+ * @throws Error with git's stderr
33
+ */
34
+ export async function git(cwd, args, timeoutMs = PROBE_TIMEOUT_MS) {
35
+ try {
36
+ const { stdout } = await execFileAsync('git', ['-C', cwd, ...args], {
37
+ timeout: timeoutMs,
38
+ env: { ...process.env, ...NON_INTERACTIVE_ENV },
39
+ maxBuffer: 16 * 1024 * 1024,
40
+ });
41
+ return stdout.trim();
42
+ }
43
+ catch (error) {
44
+ const e = error;
45
+ throw new Error((e.stderr?.trim() || e.message || 'git failed').split('\n').slice(0, 3).join(' | '));
46
+ }
47
+ }
48
+ /** Like {@link git} but null on failure. */
49
+ async function gitOrNull(cwd, args) {
50
+ try {
51
+ const out = await git(cwd, args);
52
+ return out.length > 0 ? out : null;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * Read the state of the repository a project lives in.
60
+ *
61
+ * `.crewly/` is ignored when judging "dirty": Crewly's own data goes through
62
+ * the package, so it must not block a move. The remote is read as configured
63
+ * (`git config`), not through `url.*.insteadOf` rewrites, which are local to
64
+ * this machine.
65
+ *
66
+ * @param project - Project identity
67
+ * @param project.id - Project id
68
+ * @param project.name - Project name
69
+ * @param project.path - Absolute project path
70
+ * @returns Repo record (never throws)
71
+ */
72
+ export async function inspectRepo(project) {
73
+ const base = {
74
+ projectId: project.id,
75
+ projectName: project.name,
76
+ path: project.path,
77
+ remoteUrl: null,
78
+ branch: null,
79
+ headSha: null,
80
+ dirty: false,
81
+ unpushed: 0,
82
+ };
83
+ const exists = await fs.stat(project.path).then((s) => s.isDirectory(), () => false);
84
+ if (!exists)
85
+ return { ...base, note: 'project folder does not exist on this machine' };
86
+ const top = await gitOrNull(project.path, ['rev-parse', '--show-toplevel']);
87
+ if (!top)
88
+ return { ...base, note: 'not a git repository — files are not moved, only Crewly data' };
89
+ const [remoteUrl, branch, headSha, status] = await Promise.all([
90
+ gitOrNull(project.path, ['config', '--get', 'remote.origin.url']),
91
+ gitOrNull(project.path, ['symbolic-ref', '--quiet', '--short', 'HEAD']),
92
+ gitOrNull(project.path, ['rev-parse', 'HEAD']),
93
+ gitOrNull(project.path, ['status', '--porcelain', '--untracked-files=normal', '--', '.', ':(exclude).crewly']),
94
+ ]);
95
+ // Commits that no remote-tracking branch has: work that exists only here.
96
+ const unpushedRaw = headSha ? await gitOrNull(project.path, ['rev-list', '--count', 'HEAD', '--not', '--remotes']) : null;
97
+ const unpushed = unpushedRaw ? Number.parseInt(unpushedRaw, 10) || 0 : 0;
98
+ return {
99
+ ...base,
100
+ remoteUrl,
101
+ branch,
102
+ headSha,
103
+ dirty: status !== null,
104
+ unpushed,
105
+ ...(remoteUrl ? {} : { note: 'no git remote — the target cannot fetch this code' }),
106
+ };
107
+ }
108
+ /**
109
+ * Describe what the owner has to push or commit before a move.
110
+ *
111
+ * @param repos - Repos from {@link inspectRepo}
112
+ * @returns One line per repo that blocks the move (empty when none)
113
+ */
114
+ export function describeBlockingRepos(repos) {
115
+ const lines = [];
116
+ for (const r of repos) {
117
+ const problems = [];
118
+ if (r.dirty)
119
+ problems.push('uncommitted changes (commit and push them)');
120
+ if (r.unpushed > 0)
121
+ problems.push(`${r.unpushed} commit${r.unpushed === 1 ? '' : 's'} not pushed${r.branch ? ` on ${r.branch}` : ''}`);
122
+ if (problems.length > 0)
123
+ lines.push(`${r.projectName} (${r.path}): ${problems.join(', ')}`);
124
+ }
125
+ return lines;
126
+ }
127
+ /**
128
+ * Put a repository at the recorded remote, branch and commit. Works for an
129
+ * empty folder, a folder that only holds `.crewly/` and an existing clone.
130
+ * Never discards local changes and never prompts for credentials.
131
+ *
132
+ * @param dest - Target folder (created when missing)
133
+ * @param repo - Recorded state from the source
134
+ * @param timeoutMs - Per git network call
135
+ * @returns Result (never throws)
136
+ */
137
+ export async function restoreRepo(dest, repo, timeoutMs = TEAM_MOVE_CONSTANTS.GIT_TIMEOUT_MS) {
138
+ const warnings = [];
139
+ if (!repo.remoteUrl)
140
+ return { ok: false, branch: null, headSha: null, warnings, error: 'the source repository has no remote' };
141
+ try {
142
+ await fs.mkdir(dest, { recursive: true });
143
+ const hasGit = await fs.stat(path.join(dest, '.git')).then(() => true, () => false);
144
+ if (!hasGit)
145
+ await git(dest, ['init', '-q']);
146
+ const currentRemote = await gitOrNull(dest, ['config', '--get', 'remote.origin.url']);
147
+ if (!currentRemote)
148
+ await git(dest, ['remote', 'add', 'origin', repo.remoteUrl]);
149
+ else if (currentRemote !== repo.remoteUrl)
150
+ warnings.push(`origin is ${currentRemote}, expected ${repo.remoteUrl}; kept as is`);
151
+ await git(dest, ['fetch', '--tags', '--prune', 'origin'], timeoutMs);
152
+ const dirty = (await gitOrNull(dest, ['status', '--porcelain', '--untracked-files=no'])) !== null;
153
+ const head = await gitOrNull(dest, ['rev-parse', '--verify', '--quiet', 'HEAD']);
154
+ if (dirty) {
155
+ warnings.push('the folder already has local changes; the checkout was left alone');
156
+ }
157
+ else if (repo.branch) {
158
+ const remoteBranch = `origin/${repo.branch}`;
159
+ const remoteHas = await gitOrNull(dest, ['rev-parse', '--verify', '--quiet', `${remoteBranch}^{commit}`]);
160
+ if (!remoteHas) {
161
+ warnings.push(`branch ${repo.branch} is not on the remote`);
162
+ }
163
+ else {
164
+ let target = remoteBranch;
165
+ if (repo.headSha) {
166
+ const sha = await gitOrNull(dest, ['rev-parse', '--verify', '--quiet', `${repo.headSha}^{commit}`]);
167
+ if (sha)
168
+ target = sha;
169
+ else
170
+ warnings.push(`recorded commit ${repo.headSha.slice(0, 8)} is not on the remote; using the tip of ${repo.branch}`);
171
+ }
172
+ // `-B` moves the branch to the recorded commit; untracked files (.crewly) stay.
173
+ await git(dest, ['checkout', '-q', '-B', repo.branch, target]);
174
+ await gitOrNull(dest, ['branch', '--set-upstream-to', remoteBranch, repo.branch]);
175
+ }
176
+ }
177
+ else if (repo.headSha) {
178
+ const sha = await gitOrNull(dest, ['rev-parse', '--verify', '--quiet', `${repo.headSha}^{commit}`]);
179
+ if (sha)
180
+ await git(dest, ['checkout', '-q', '--detach', sha]);
181
+ else
182
+ warnings.push(`recorded commit ${repo.headSha.slice(0, 8)} is not on the remote`);
183
+ }
184
+ else if (!head) {
185
+ warnings.push('no branch or commit was recorded; nothing was checked out');
186
+ }
187
+ return {
188
+ ok: true,
189
+ branch: await gitOrNull(dest, ['symbolic-ref', '--quiet', '--short', 'HEAD']),
190
+ headSha: await gitOrNull(dest, ['rev-parse', 'HEAD']),
191
+ warnings,
192
+ };
193
+ }
194
+ catch (error) {
195
+ return { ok: false, branch: null, headSha: null, warnings, error: error instanceof Error ? error.message : String(error) };
196
+ }
197
+ }
198
+ //# sourceMappingURL=team-move-git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-git.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Team move importer (target machine).
3
+ *
4
+ * Takes a downloaded, encrypted package and applies it to this machine in
5
+ * idempotent, journaled steps, so a crash or restart resumes where it stopped:
6
+ *
7
+ * decrypt -> validate -> projects -> repos -> project data -> agents ->
8
+ * records -> team -> start -> report
9
+ *
10
+ * The team is registered (and therefore started) only after every other piece
11
+ * is in place. Project folders are relocated under this machine's projects
12
+ * root; the mapping is recorded and absolute paths inside the moved text files
13
+ * are rewritten to match. Repositories are cloned at the recorded branch and
14
+ * commit with this machine's own git credentials.
15
+ *
16
+ * @module services/team-move/team-move-importer
17
+ */
18
+ import type { Project, ScheduledMessage, Team } from '../../types/index.js';
19
+ import type { WorkItem } from '../../types/v2/work-item.types.js';
20
+ import { type ApplyChatResult, type ChatRecords } from './team-move-chat.js';
21
+ import { restoreRepo } from './team-move-git.js';
22
+ import { MoveJournal } from './team-move-journal.js';
23
+ import type { TeamMoveImportReport } from './team-move.types.js';
24
+ /** Thrown for a package this machine must not apply. */
25
+ export declare class TeamMoveImportError extends Error {
26
+ readonly code: 'invalid_package' | 'conflict' | 'no_space' | 'unsupported';
27
+ constructor(message: string, code?: 'invalid_package' | 'conflict' | 'no_space' | 'unsupported');
28
+ }
29
+ /** Collaborators of the importer. */
30
+ export interface ImportDeps {
31
+ home?: string;
32
+ crewlyVersion: string;
33
+ storage: {
34
+ getTeams(): Promise<Team[]>;
35
+ getProjects(): Promise<Project[]>;
36
+ saveProject(project: Project): Promise<void>;
37
+ saveTeam(team: Team): Promise<void>;
38
+ getScheduledMessages(): Promise<ScheduledMessage[]>;
39
+ saveScheduledMessage(message: ScheduledMessage): Promise<void>;
40
+ };
41
+ /** Add work items that are not in the pool yet; returns how many were added. */
42
+ addWorkItems: (items: WorkItem[]) => Promise<number>;
43
+ /** Add decisions that are not there yet; returns how many were added. */
44
+ addDecisions: (decisions: Array<Record<string, unknown>>) => Promise<number>;
45
+ /** Make the Slack channel mapping known before the team exists (no duplicate channel). */
46
+ adoptSlackMapping: (mapping: Record<string, unknown>) => Promise<boolean>;
47
+ /** Add chat channels and members (defaults to writing the chat-v2 database). */
48
+ applyChat?: (records: ChatRecords) => ApplyChatResult;
49
+ /** Start the team; returns ok/error. Omit to import without starting. */
50
+ startTeam?: (teamId: string) => Promise<{
51
+ ok: boolean;
52
+ error?: string;
53
+ }>;
54
+ /** Which tools exist here (default: PATH lookup). */
55
+ hasCommand?: (binary: string) => boolean;
56
+ /** Runtime id to logged-in. */
57
+ runtimeLogins?: () => Promise<Record<string, boolean>>;
58
+ /** Free disk bytes (tests). */
59
+ freeDisk?: (dir: string) => Promise<number | null>;
60
+ restoreRepo?: typeof restoreRepo;
61
+ now?: () => string;
62
+ }
63
+ /** Inputs of one import. */
64
+ export interface ImportInput {
65
+ moveId: string;
66
+ /** Downloaded ciphertext. */
67
+ packageFile: string;
68
+ /** Base64 PKCS8 private key of this move. */
69
+ privateKey: string;
70
+ /** Expected ciphertext hash (from Cloud), verified before decrypting. */
71
+ expectedSha256?: string;
72
+ }
73
+ /** The projects root of this machine. */
74
+ export declare function projectsRoot(env?: NodeJS.ProcessEnv, homeDir?: string): string;
75
+ /** The importer. */
76
+ export declare class TeamMoveImporter {
77
+ private readonly deps;
78
+ private readonly home;
79
+ private readonly now;
80
+ private readonly restore;
81
+ constructor(deps: ImportDeps);
82
+ /**
83
+ * Apply a package. Safe to call again for the same move: finished steps are
84
+ * skipped.
85
+ *
86
+ * @param input - Move id, package file and key
87
+ * @param journal - Journal of this move
88
+ * @returns The report for the owner
89
+ * @throws TeamMoveImportError for a package that must not be applied
90
+ */
91
+ run(input: ImportInput, journal?: MoveJournal): Promise<TeamMoveImportReport>;
92
+ private validate;
93
+ /**
94
+ * Decide where each project lives here and register it under its own id.
95
+ * A project that already exists here (same id) keeps its folder.
96
+ */
97
+ private registerProjects;
98
+ private hasForeignContent;
99
+ /** Clone each project's repository at the recorded branch and commit. */
100
+ private cloneRepos;
101
+ /**
102
+ * Copy a package directory into a destination. A file that exists with other
103
+ * content is replaced (the package is the team's state) and the old copy is
104
+ * kept next to it as `<name>.pre-move-<id>`. Text files get this machine's
105
+ * paths. Writes are atomic, so a crash never leaves a half file.
106
+ */
107
+ private copyTree;
108
+ /** Project data, agent memory and handover notes. */
109
+ private importData;
110
+ private projectDataDir;
111
+ /** Source path to target path rewrites for the moved text files. */
112
+ private rewritesFor;
113
+ private readRecord;
114
+ /** Task-pool items, decisions, scheduled messages, chat channels, Slack mapping. */
115
+ private importRecords;
116
+ /** Copy the team folder, then register the team (its first save announces it everywhere). */
117
+ private registerTeam;
118
+ private startTeam;
119
+ private buildReport;
120
+ }
121
+ //# sourceMappingURL=team-move-importer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-importer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-importer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAiB,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,KAAK,EAIV,oBAAoB,EAErB,MAAM,sBAAsB,CAAC;AAO9B,wDAAwD;AACxD,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa;gBAD1E,OAAO,EAAE,MAAM,EACN,IAAI,GAAE,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,aAAiC;CAKjG;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE;QACP,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5B,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpD,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAChE,CAAC;IACF,gFAAgF;IAChF,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,yEAAyE;IACzE,YAAY,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,0FAA0F;IAC1F,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,gFAAgF;IAChF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,eAAe,CAAC;IACtD,yEAAyE;IACzE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,qDAAqD;IACrD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,OAAO,GAAE,MAAqB,GAAG,MAAM,CAGzG;AAoBD,oBAAoB;AACpB,qBAAa,gBAAgB;IAKf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEhB,IAAI,EAAE,UAAU;IAM7C;;;;;;;;OAQG;IACG,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,WAAgE,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAyDzH,QAAQ;IAsDtB;;;OAGG;YACW,gBAAgB;YA4BhB,iBAAiB;IAM/B,yEAAyE;YAC3D,UAAU;IA8BxB;;;;;OAKG;YACW,QAAQ;IA0CtB,qDAAqD;YACvC,UAAU;IAwBxB,OAAO,CAAC,cAAc;IAItB,oEAAoE;IACpE,OAAO,CAAC,WAAW;YAcL,UAAU;IAWxB,oFAAoF;YACtE,aAAa;IAoC3B,6FAA6F;YAC/E,YAAY;YAoBZ,SAAS;YAWT,WAAW;CAsD1B"}