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,157 @@
1
+ /**
2
+ * File helpers of the team move: walking with exclusions, a staging area that
3
+ * records a hash for every file it holds, text sniffing and path rewriting.
4
+ *
5
+ * @module services/team-move/team-move-fs
6
+ */
7
+ import type { PackageFileEntry } from './team-move.types.js';
8
+ /** Directory names never packaged, at any depth (machine noise and build output). */
9
+ export declare const MOVE_EXCLUDED_DIR_NAMES: ReadonlySet<string>;
10
+ /**
11
+ * Whether a file name is left out of a package.
12
+ *
13
+ * @param name - File name (no directory)
14
+ * @returns True for backups, temp files, logs, JSONL transcripts and shell history
15
+ */
16
+ export declare function isExcludedMoveFile(name: string): boolean;
17
+ /** A regular file found by {@link walkFiles}. */
18
+ export interface WalkedFile {
19
+ abs: string;
20
+ /** POSIX path relative to the walked root. */
21
+ rel: string;
22
+ size: number;
23
+ }
24
+ /**
25
+ * Walk the regular files under a directory, skipping excluded names. Symlinks
26
+ * are never followed or packaged.
27
+ *
28
+ * @param root - Directory to walk (a missing one yields nothing)
29
+ * @param extraExcludedDirs - Extra directory names to skip
30
+ * @yields Each file, directories in name order
31
+ */
32
+ export declare function walkFiles(root: string, extraExcludedDirs?: ReadonlySet<string>): AsyncGenerator<WalkedFile>;
33
+ /**
34
+ * SHA-256 of a file, streamed.
35
+ *
36
+ * @param file - Absolute path
37
+ * @returns Hex digest
38
+ */
39
+ export declare function sha256File(file: string): Promise<string>;
40
+ /**
41
+ * A directory the package is assembled in. Every file written through it is
42
+ * hashed and listed, which becomes the manifest's file list.
43
+ */
44
+ export declare class StagingArea {
45
+ readonly root: string;
46
+ private readonly entries;
47
+ /** @param root - Absolute staging directory (created when missing) */
48
+ constructor(root: string);
49
+ /** Create the staging directory. */
50
+ init(): Promise<void>;
51
+ /**
52
+ * Absolute path of a package path (refusing anything that escapes the root).
53
+ *
54
+ * @param rel - POSIX package path
55
+ * @returns Absolute path
56
+ */
57
+ abs(rel: string): string;
58
+ /**
59
+ * Copy a file in, recording its hash.
60
+ *
61
+ * @param source - Absolute source file
62
+ * @param rel - POSIX package path
63
+ * @returns The recorded entry
64
+ */
65
+ copyIn(source: string, rel: string): Promise<PackageFileEntry>;
66
+ /**
67
+ * Write a text/JSON file, recording its hash.
68
+ *
69
+ * @param rel - POSIX package path
70
+ * @param content - File content
71
+ * @returns The recorded entry
72
+ */
73
+ writeText(rel: string, content: string): Promise<PackageFileEntry>;
74
+ /**
75
+ * Write a JSON file.
76
+ *
77
+ * @param rel - POSIX package path
78
+ * @param value - Value to serialise
79
+ * @returns The recorded entry
80
+ */
81
+ writeJson(rel: string, value: unknown): Promise<PackageFileEntry>;
82
+ /**
83
+ * Remove a file again (secret-scan exclusion).
84
+ *
85
+ * @param rel - POSIX package path
86
+ */
87
+ remove(rel: string): Promise<void>;
88
+ /**
89
+ * Whether a package path is in the area.
90
+ *
91
+ * @param rel - POSIX package path
92
+ * @returns True when present
93
+ */
94
+ has(rel: string): boolean;
95
+ /**
96
+ * Every recorded file, sorted by path.
97
+ *
98
+ * @returns File entries
99
+ */
100
+ files(): PackageFileEntry[];
101
+ /**
102
+ * Total bytes of the recorded files.
103
+ *
104
+ * @returns Sum of sizes
105
+ */
106
+ totalBytes(): number;
107
+ }
108
+ /**
109
+ * Whether a path looks like a text file by its extension.
110
+ *
111
+ * @param file - File path or name
112
+ * @returns True for known text extensions and extension-less names
113
+ */
114
+ export declare function hasTextExtension(file: string): boolean;
115
+ /**
116
+ * Whether a buffer looks like text (no NUL byte in the first 8 KB).
117
+ *
118
+ * @param head - First bytes of a file
119
+ * @returns True when no NUL is found
120
+ */
121
+ export declare function looksLikeText(head: Buffer): boolean;
122
+ /**
123
+ * Replace a path prefix wherever it appears as a path in a text: followed by
124
+ * `/`, a quote, whitespace, end of text or other non-path characters.
125
+ *
126
+ * @param text - Text to rewrite
127
+ * @param from - Source path (no trailing slash)
128
+ * @param to - Target path
129
+ * @returns Rewritten text and the number of replacements
130
+ */
131
+ export declare function rewritePathPrefix(text: string, from: string, to: string): {
132
+ text: string;
133
+ count: number;
134
+ };
135
+ /**
136
+ * Turn a name into a folder-safe slug.
137
+ *
138
+ * @param name - Project or team name
139
+ * @returns Lowercase slug of letters, digits, dot, dash and underscore
140
+ */
141
+ export declare function slugify(name: string): string;
142
+ /**
143
+ * Whether a path exists.
144
+ *
145
+ * @param target - Absolute path
146
+ * @returns True when it can be stat'ed
147
+ */
148
+ export declare function pathExists(target: string): Promise<boolean>;
149
+ /**
150
+ * Write a file atomically (temp file in the same directory, then rename), so a
151
+ * crash never leaves half a file. Accepts bytes, so binaries survive.
152
+ *
153
+ * @param dest - Destination path (its folder is created)
154
+ * @param content - Bytes to write
155
+ */
156
+ export declare function writeFileAtomic(dest: string, content: Buffer): Promise<void>;
157
+ //# sourceMappingURL=team-move-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-fs.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-fs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAAiF,CAAC;AAK1I;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED,iDAAiD;AACjD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAuB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,cAAc,CAAC,UAAU,CAAC,CAkB7H;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9D;AAED;;;GAGG;AACH,qBAAa,WAAW;IAIV,QAAQ,CAAC,IAAI,EAAE,MAAM;IAHjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D,sEAAsE;gBACjD,IAAI,EAAE,MAAM;IAEjC,oCAAoC;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMxB;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqBpE;;;;;;OAMG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUxE;;;;;;OAMG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvE;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;;;OAIG;IACH,KAAK,IAAI,gBAAgB,EAAE;IAI3B;;;;OAIG;IACH,UAAU,IAAI,MAAM;CAKrB;AAKD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6BzG;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjE;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlF"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * File helpers of the team move: walking with exclusions, a staging area that
3
+ * records a hash for every file it holds, text sniffing and path rewriting.
4
+ *
5
+ * @module services/team-move/team-move-fs
6
+ */
7
+ import { createHash } from 'node:crypto';
8
+ import { createReadStream, createWriteStream } from 'node:fs';
9
+ import * as fs from 'node:fs/promises';
10
+ import * as path from 'node:path';
11
+ import { pipeline } from 'node:stream/promises';
12
+ import { BACKUP_EXCLUDED_FILE_NAMES, BACKUP_EXCLUDED_FILE_SUFFIXES } from '../backup/backup.types.js';
13
+ /** Directory names never packaged, at any depth (machine noise and build output). */
14
+ export const MOVE_EXCLUDED_DIR_NAMES = new Set(['node_modules', 'logs', '.orchestrator-state', '.git', '.DS_Store']);
15
+ /** File-name patterns never packaged: backups, temp files, logs, transcripts, shell history. */
16
+ const EXCLUDED_NAME_PATTERNS = [/\.bak(?:[-.].*)?$/, /\.tmp(?:\.|$)/, /\.orig$/, /~$/, /^\.DS_Store$/];
17
+ /**
18
+ * Whether a file name is left out of a package.
19
+ *
20
+ * @param name - File name (no directory)
21
+ * @returns True for backups, temp files, logs, JSONL transcripts and shell history
22
+ */
23
+ export function isExcludedMoveFile(name) {
24
+ if (BACKUP_EXCLUDED_FILE_NAMES.includes(name))
25
+ return true;
26
+ if (BACKUP_EXCLUDED_FILE_SUFFIXES.some((suffix) => name.endsWith(suffix)))
27
+ return true;
28
+ return EXCLUDED_NAME_PATTERNS.some((re) => re.test(name));
29
+ }
30
+ /**
31
+ * Walk the regular files under a directory, skipping excluded names. Symlinks
32
+ * are never followed or packaged.
33
+ *
34
+ * @param root - Directory to walk (a missing one yields nothing)
35
+ * @param extraExcludedDirs - Extra directory names to skip
36
+ * @yields Each file, directories in name order
37
+ */
38
+ export async function* walkFiles(root, extraExcludedDirs = new Set()) {
39
+ const walk = async function* (absDir, relDir) {
40
+ const entries = await fs.readdir(absDir, { withFileTypes: true }).catch(() => []);
41
+ entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
42
+ for (const e of entries) {
43
+ const rel = relDir ? `${relDir}/${e.name}` : e.name;
44
+ if (e.isSymbolicLink())
45
+ continue;
46
+ if (e.isDirectory()) {
47
+ if (MOVE_EXCLUDED_DIR_NAMES.has(e.name) || extraExcludedDirs.has(e.name))
48
+ continue;
49
+ yield* walk(path.join(absDir, e.name), rel);
50
+ }
51
+ else if (e.isFile() && !isExcludedMoveFile(e.name)) {
52
+ const abs = path.join(absDir, e.name);
53
+ const st = await fs.stat(abs).catch(() => null);
54
+ if (st?.isFile())
55
+ yield { abs, rel, size: st.size };
56
+ }
57
+ }
58
+ };
59
+ yield* walk(root, '');
60
+ }
61
+ /**
62
+ * SHA-256 of a file, streamed.
63
+ *
64
+ * @param file - Absolute path
65
+ * @returns Hex digest
66
+ */
67
+ export async function sha256File(file) {
68
+ const hash = createHash('sha256');
69
+ await pipeline(createReadStream(file), async function (source) {
70
+ for await (const chunk of source)
71
+ hash.update(chunk);
72
+ });
73
+ return hash.digest('hex');
74
+ }
75
+ /**
76
+ * A directory the package is assembled in. Every file written through it is
77
+ * hashed and listed, which becomes the manifest's file list.
78
+ */
79
+ export class StagingArea {
80
+ root;
81
+ entries = new Map();
82
+ /** @param root - Absolute staging directory (created when missing) */
83
+ constructor(root) {
84
+ this.root = root;
85
+ }
86
+ /** Create the staging directory. */
87
+ async init() {
88
+ await fs.mkdir(this.root, { recursive: true });
89
+ }
90
+ /**
91
+ * Absolute path of a package path (refusing anything that escapes the root).
92
+ *
93
+ * @param rel - POSIX package path
94
+ * @returns Absolute path
95
+ */
96
+ abs(rel) {
97
+ const target = path.resolve(this.root, ...rel.split('/'));
98
+ if (target !== this.root && !target.startsWith(this.root + path.sep))
99
+ throw new Error(`path escapes the package: ${rel}`);
100
+ return target;
101
+ }
102
+ /**
103
+ * Copy a file in, recording its hash.
104
+ *
105
+ * @param source - Absolute source file
106
+ * @param rel - POSIX package path
107
+ * @returns The recorded entry
108
+ */
109
+ async copyIn(source, rel) {
110
+ const dest = this.abs(rel);
111
+ await fs.mkdir(path.dirname(dest), { recursive: true });
112
+ const hash = createHash('sha256');
113
+ let bytes = 0;
114
+ await pipeline(createReadStream(source), async function* (src) {
115
+ for await (const chunk of src) {
116
+ hash.update(chunk);
117
+ bytes += chunk.length;
118
+ yield chunk;
119
+ }
120
+ }, createWriteStream(dest));
121
+ const entry = { path: rel, sha256: hash.digest('hex'), bytes };
122
+ this.entries.set(rel, entry);
123
+ return entry;
124
+ }
125
+ /**
126
+ * Write a text/JSON file, recording its hash.
127
+ *
128
+ * @param rel - POSIX package path
129
+ * @param content - File content
130
+ * @returns The recorded entry
131
+ */
132
+ async writeText(rel, content) {
133
+ const dest = this.abs(rel);
134
+ await fs.mkdir(path.dirname(dest), { recursive: true });
135
+ const buf = Buffer.from(content, 'utf8');
136
+ await fs.writeFile(dest, buf);
137
+ const entry = { path: rel, sha256: createHash('sha256').update(buf).digest('hex'), bytes: buf.length };
138
+ this.entries.set(rel, entry);
139
+ return entry;
140
+ }
141
+ /**
142
+ * Write a JSON file.
143
+ *
144
+ * @param rel - POSIX package path
145
+ * @param value - Value to serialise
146
+ * @returns The recorded entry
147
+ */
148
+ async writeJson(rel, value) {
149
+ return this.writeText(rel, JSON.stringify(value, null, 2));
150
+ }
151
+ /**
152
+ * Remove a file again (secret-scan exclusion).
153
+ *
154
+ * @param rel - POSIX package path
155
+ */
156
+ async remove(rel) {
157
+ this.entries.delete(rel);
158
+ await fs.rm(this.abs(rel), { force: true });
159
+ }
160
+ /**
161
+ * Whether a package path is in the area.
162
+ *
163
+ * @param rel - POSIX package path
164
+ * @returns True when present
165
+ */
166
+ has(rel) {
167
+ return this.entries.has(rel);
168
+ }
169
+ /**
170
+ * Every recorded file, sorted by path.
171
+ *
172
+ * @returns File entries
173
+ */
174
+ files() {
175
+ return [...this.entries.values()].sort((a, b) => (a.path < b.path ? -1 : 1));
176
+ }
177
+ /**
178
+ * Total bytes of the recorded files.
179
+ *
180
+ * @returns Sum of sizes
181
+ */
182
+ totalBytes() {
183
+ let sum = 0;
184
+ for (const e of this.entries.values())
185
+ sum += e.bytes;
186
+ return sum;
187
+ }
188
+ }
189
+ /** File extensions that are rewritten and scanned as text. */
190
+ const TEXT_EXTENSIONS = new Set(['.md', '.json', '.txt', '.yaml', '.yml', '.csv', '.tsv', '.html', '.xml', '.toml', '.ini', '.env', '.sh', '.ts', '.js', '.py', '.sql', '.mdx', '.cfg', '.conf']);
191
+ /**
192
+ * Whether a path looks like a text file by its extension.
193
+ *
194
+ * @param file - File path or name
195
+ * @returns True for known text extensions and extension-less names
196
+ */
197
+ export function hasTextExtension(file) {
198
+ const ext = path.extname(file).toLowerCase();
199
+ return ext === '' || TEXT_EXTENSIONS.has(ext);
200
+ }
201
+ /**
202
+ * Whether a buffer looks like text (no NUL byte in the first 8 KB).
203
+ *
204
+ * @param head - First bytes of a file
205
+ * @returns True when no NUL is found
206
+ */
207
+ export function looksLikeText(head) {
208
+ const n = Math.min(head.length, 8000);
209
+ for (let i = 0; i < n; i++)
210
+ if (head[i] === 0)
211
+ return false;
212
+ return true;
213
+ }
214
+ /**
215
+ * Replace a path prefix wherever it appears as a path in a text: followed by
216
+ * `/`, a quote, whitespace, end of text or other non-path characters.
217
+ *
218
+ * @param text - Text to rewrite
219
+ * @param from - Source path (no trailing slash)
220
+ * @param to - Target path
221
+ * @returns Rewritten text and the number of replacements
222
+ */
223
+ export function rewritePathPrefix(text, from, to) {
224
+ const source = from.replace(/\/+$/, '');
225
+ const dest = to.replace(/\/+$/, '');
226
+ if (!source || source === dest || !text.includes(source))
227
+ return { text, count: 0 };
228
+ let count = 0;
229
+ let out = '';
230
+ let index = 0;
231
+ for (;;) {
232
+ const hit = text.indexOf(source, index);
233
+ if (hit < 0)
234
+ break;
235
+ const before = hit === 0 ? '' : text[hit - 1];
236
+ const after = text[hit + source.length] ?? '';
237
+ // Not part of a longer path: the character before is not a path character
238
+ // and the character after does not continue the final segment.
239
+ const startsPath = before === '' || !/[A-Za-z0-9._~-]/.test(before);
240
+ // A full stop ends a sentence, not the folder name, when whitespace or the end follows it.
241
+ const next = text[hit + source.length + 1] ?? '';
242
+ const endsPath = after === '' || !/[A-Za-z0-9._~-]/.test(after) || (after === '.' && (next === '' || /[\s"')\]]/.test(next)));
243
+ out += text.slice(index, hit);
244
+ if (startsPath && endsPath) {
245
+ out += dest;
246
+ count += 1;
247
+ }
248
+ else {
249
+ out += source;
250
+ }
251
+ index = hit + source.length;
252
+ }
253
+ out += text.slice(index);
254
+ return { text: out, count };
255
+ }
256
+ /**
257
+ * Turn a name into a folder-safe slug.
258
+ *
259
+ * @param name - Project or team name
260
+ * @returns Lowercase slug of letters, digits, dot, dash and underscore
261
+ */
262
+ export function slugify(name) {
263
+ const slug = name
264
+ .normalize('NFKD')
265
+ .replace(/[^\p{L}\p{N}._-]+/gu, '-')
266
+ .replace(/^-+|-+$/g, '')
267
+ .toLowerCase();
268
+ return slug.length > 0 ? slug.slice(0, 60) : 'project';
269
+ }
270
+ /**
271
+ * Whether a path exists.
272
+ *
273
+ * @param target - Absolute path
274
+ * @returns True when it can be stat'ed
275
+ */
276
+ export async function pathExists(target) {
277
+ return fs.stat(target).then(() => true, () => false);
278
+ }
279
+ /**
280
+ * Write a file atomically (temp file in the same directory, then rename), so a
281
+ * crash never leaves half a file. Accepts bytes, so binaries survive.
282
+ *
283
+ * @param dest - Destination path (its folder is created)
284
+ * @param content - Bytes to write
285
+ */
286
+ export async function writeFileAtomic(dest, content) {
287
+ await fs.mkdir(path.dirname(dest), { recursive: true });
288
+ const temp = `${dest}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;
289
+ try {
290
+ await fs.writeFile(temp, content, { flag: 'wx' });
291
+ await fs.rename(temp, dest);
292
+ }
293
+ catch (error) {
294
+ await fs.rm(temp, { force: true }).catch(() => undefined);
295
+ throw error;
296
+ }
297
+ }
298
+ //# sourceMappingURL=team-move-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-fs.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
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 type { PackageRepo } from './team-move.types.js';
13
+ /**
14
+ * Run git in a directory.
15
+ *
16
+ * @param cwd - Working directory
17
+ * @param args - Git arguments
18
+ * @param timeoutMs - Kill after this long
19
+ * @returns Trimmed stdout
20
+ * @throws Error with git's stderr
21
+ */
22
+ export declare function git(cwd: string, args: string[], timeoutMs?: number): Promise<string>;
23
+ /**
24
+ * Read the state of the repository a project lives in.
25
+ *
26
+ * `.crewly/` is ignored when judging "dirty": Crewly's own data goes through
27
+ * the package, so it must not block a move. The remote is read as configured
28
+ * (`git config`), not through `url.*.insteadOf` rewrites, which are local to
29
+ * this machine.
30
+ *
31
+ * @param project - Project identity
32
+ * @param project.id - Project id
33
+ * @param project.name - Project name
34
+ * @param project.path - Absolute project path
35
+ * @returns Repo record (never throws)
36
+ */
37
+ export declare function inspectRepo(project: {
38
+ id: string;
39
+ name: string;
40
+ path: string;
41
+ }): Promise<PackageRepo>;
42
+ /**
43
+ * Describe what the owner has to push or commit before a move.
44
+ *
45
+ * @param repos - Repos from {@link inspectRepo}
46
+ * @returns One line per repo that blocks the move (empty when none)
47
+ */
48
+ export declare function describeBlockingRepos(repos: readonly PackageRepo[]): string[];
49
+ /** Outcome of {@link restoreRepo}. */
50
+ export interface RestoreRepoResult {
51
+ ok: boolean;
52
+ branch: string | null;
53
+ headSha: string | null;
54
+ /** Non-fatal notes (e.g. the recorded commit is not on the remote). */
55
+ warnings: string[];
56
+ error?: string;
57
+ }
58
+ /**
59
+ * Put a repository at the recorded remote, branch and commit. Works for an
60
+ * empty folder, a folder that only holds `.crewly/` and an existing clone.
61
+ * Never discards local changes and never prompts for credentials.
62
+ *
63
+ * @param dest - Target folder (created when missing)
64
+ * @param repo - Recorded state from the source
65
+ * @param timeoutMs - Per git network call
66
+ * @returns Result (never throws)
67
+ */
68
+ export declare function restoreRepo(dest: string, repo: Pick<PackageRepo, 'remoteUrl' | 'branch' | 'headSha'>, timeoutMs?: number): Promise<RestoreRepoResult>;
69
+ //# sourceMappingURL=team-move-git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-git.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-git.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAaxD;;;;;;;;GAQG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CAY5G;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAkC3G;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAS7E;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,EAC3D,SAAS,GAAE,MAA2C,GACrD,OAAO,CAAC,iBAAiB,CAAC,CAiD5B"}