harvask-cli 0.3.1 → 0.6.0

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 (40) hide show
  1. package/README.md +77 -3
  2. package/dist/api-client.js +23 -9
  3. package/dist/api-client.js.map +1 -1
  4. package/dist/cli.js +20 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/attachment/index.js +11 -1
  7. package/dist/commands/attachment/index.js.map +1 -1
  8. package/dist/commands/issue/builds.js +4 -0
  9. package/dist/commands/issue/builds.js.map +1 -1
  10. package/dist/commands/issue/deliverable.js +93 -0
  11. package/dist/commands/issue/deliverable.js.map +1 -0
  12. package/dist/commands/issue/index.js +18 -2
  13. package/dist/commands/issue/index.js.map +1 -1
  14. package/dist/commands/project/builds.js +13 -9
  15. package/dist/commands/project/builds.js.map +1 -1
  16. package/dist/commands/project/index.js +2 -1
  17. package/dist/commands/project/index.js.map +1 -1
  18. package/dist/commands/scheduled-task/index.js +290 -47
  19. package/dist/commands/scheduled-task/index.js.map +1 -1
  20. package/dist/commands/storage/index.js +17 -1
  21. package/dist/commands/storage/index.js.map +1 -1
  22. package/dist/commands/workspace/batch.js +65 -0
  23. package/dist/commands/workspace/batch.js.map +1 -0
  24. package/dist/commands/workspace/collect.js +368 -0
  25. package/dist/commands/workspace/collect.js.map +1 -0
  26. package/dist/commands/workspace/index.js +240 -0
  27. package/dist/commands/workspace/index.js.map +1 -0
  28. package/dist/errors/hint-map.js +34 -0
  29. package/dist/errors/hint-map.js.map +1 -1
  30. package/dist/registry.js +2 -0
  31. package/dist/registry.js.map +1 -1
  32. package/dist/utils/input.js +14 -0
  33. package/dist/utils/input.js.map +1 -1
  34. package/dist/utils/upload.js +29 -0
  35. package/dist/utils/upload.js.map +1 -1
  36. package/package.json +1 -1
  37. package/skills/harvask/AGENTS.md +38 -3
  38. package/skills/harvask/GEMINI.md +38 -3
  39. package/skills/harvask/SKILL.md +38 -3
  40. package/skills/harvask/migration.md +72 -0
@@ -11,6 +11,8 @@ import { buildFileFormData } from '../../utils/upload.js';
11
11
  import { saveBlob } from '../../utils/download.js';
12
12
  import { API_NS } from '../../api-base.js';
13
13
  const BASE = `${API_NS}/projects/{project}/storage`;
14
+ /** 同名ファイルが既にあるときの挙動(`StorageUploadController::CONFLICT_MODES` と同値)。 */
15
+ export const STORAGE_CONFLICT_MODES = ['rename', 'overwrite', 'error'];
14
16
  export function buildStorageSearchCall(query, opts = {}) {
15
17
  if (!query || query.trim() === '')
16
18
  throw new ValidationError('search query is required');
@@ -120,10 +122,24 @@ export const storageModule = {
120
122
  .description('Upload a file (multipart; very large files may exceed the request timeout)')
121
123
  .requiredOption('--file <path>', 'local file path')
122
124
  .option('--parent-id <id>', 'parent folder id (omit = root)', parseIntArg)
125
+ .option('--on-conflict <mode>', `same-name file in the target folder (${STORAGE_CONFLICT_MODES.join('|')}; default rename)`)
126
+ .option('--yes', 'skip confirmation (required with --on-conflict overwrite in non-interactive mode)')
123
127
  .action(async (opts) => {
128
+ const onConflict = opts.onConflict;
129
+ if (onConflict !== undefined && !STORAGE_CONFLICT_MODES.includes(onConflict)) {
130
+ throw new ValidationError(`--on-conflict must be one of: ${STORAGE_CONFLICT_MODES.join(', ')}`);
131
+ }
132
+ // overwrite は既存の実体を消して差し替える不可逆操作(storage_items の id は維持される)。
133
+ // delete と同じゲートを通す。
134
+ if (onConflict === 'overwrite') {
135
+ requireConfirmation(opts, 'overwrite an existing file');
136
+ }
124
137
  const client = ctx.getApiClient();
125
138
  const pid = await resolveProjectId(client, parseProjectArg(opts.project) ?? {});
126
- const form = buildFileFormData(opts.file, { parent_id: opts.parentId });
139
+ const form = buildFileFormData(opts.file, {
140
+ parent_id: opts.parentId,
141
+ on_conflict: onConflict,
142
+ });
127
143
  const result = await client.postMultipart(`${API_NS}/projects/${pid}/storage/upload`, form);
128
144
  printOutput(result, ctx.out);
129
145
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/storage/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/storage/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * `workspace push` のバッチ分割(純粋関数)。
3
+ *
4
+ * 件数とサイズの両方で切る。件数だけを見ていると `post_max_size`(1GB)に当たって 413、
5
+ * サイズだけを見ていると PHP の `max_file_uploads`(既定 20)を超えた分が黙って捨てられ、
6
+ * 「送ったのに保存されていない」になる。
7
+ */
8
+ /** 1 リクエストのファイル数上限(`WorkspaceUploadController::MAX_FILES_PER_REQUEST` と同値)。 */
9
+ export const MAX_FILES_PER_REQUEST = 20;
10
+ /** 1 ファイルの上限(`files.*` の `max:102400` KB と同値)。超えるとサーバーが 422。 */
11
+ export const MAX_FILE_BYTES = 102400 * 1024;
12
+ /** 1 リクエストの合計サイズの既定上限。`post_max_size`(1GB)より十分小さく取る。 */
13
+ export const DEFAULT_MAX_BATCH_BYTES = 200 * 1024 * 1024;
14
+ /** preflight 1 回で問い合わせられるパス数(`MAX_PREFLIGHT_PATHS` と同値)。 */
15
+ export const MAX_PREFLIGHT_PATHS = 2000;
16
+ /**
17
+ * 単体でサーバーの上限を超えるファイルを分ける(送っても 422 になるため)。
18
+ */
19
+ export function partitionOversized(files, maxFileBytes = MAX_FILE_BYTES) {
20
+ const ok = [];
21
+ const oversized = [];
22
+ for (const file of files) {
23
+ (file.size > maxFileBytes ? oversized : ok).push(file);
24
+ }
25
+ return { ok, oversized };
26
+ }
27
+ /**
28
+ * ファイル一覧をリクエスト単位へ分割する。
29
+ *
30
+ * 単体で maxBytes を超えるファイルは単独バッチになる(サーバーの 1 ファイル上限内なら通る)。
31
+ */
32
+ export function planBatches(files, opts = {}) {
33
+ const maxFiles = opts.maxFiles ?? MAX_FILES_PER_REQUEST;
34
+ const maxBytes = opts.maxBytes ?? DEFAULT_MAX_BATCH_BYTES;
35
+ const batches = [];
36
+ let current = [];
37
+ let currentBytes = 0;
38
+ for (const file of files) {
39
+ if (current.length > 0 && (current.length >= maxFiles || currentBytes + file.size > maxBytes)) {
40
+ batches.push(current);
41
+ current = [];
42
+ currentBytes = 0;
43
+ }
44
+ current.push(file);
45
+ currentBytes += file.size;
46
+ }
47
+ if (current.length > 0) {
48
+ batches.push(current);
49
+ }
50
+ return batches;
51
+ }
52
+ /**
53
+ * 配列を size 件ずつに割る(preflight のページング用)。
54
+ */
55
+ export function chunk(items, size) {
56
+ const out = [];
57
+ for (let i = 0; i < items.length; i += size) {
58
+ out.push(items.slice(i, i + size));
59
+ }
60
+ return out;
61
+ }
62
+ export function totalBytes(files) {
63
+ return files.reduce((sum, f) => sum + f.size, 0);
64
+ }
65
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/commands/workspace/batch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,gEAAgE;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,GAAG,IAAI,CAAC;AAE5C,wDAAwD;AACxD,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAOxC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAU,EACV,eAAuB,cAAc;IAErC,MAAM,EAAE,GAAQ,EAAE,CAAC;IACnB,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,KAAU,EACV,OAAiD,EAAE;IAEnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,qBAAqB,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,uBAAuB,CAAC;IAC1D,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAQ,EAAE,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC;YAC9F,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAI,KAAU,EAAE,IAAY;IAC/C,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAmB;IAC5C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,368 @@
1
+ /**
2
+ * `workspace push` のローカル走査・除外・相対パス正規化。
3
+ *
4
+ * `.gitignore` は自前で解釈しない。git リポジトリなら `git ls-files` に列挙させることで
5
+ * `.gitignore` / `.git/info/exclude` / global gitignore がそのまま効き、依存も増えない。
6
+ * git が使えない(リポジトリでない / git が無い / --include-ignored)ときだけ、
7
+ * 既定除外つきの再帰走査に落とす。
8
+ *
9
+ * 判定(正規化・グロブ・除外・投入先チェック)は純粋関数として切り出してある。
10
+ * テストが見るのはそこだけで、fs / git を触るのは collectFiles() のみ。
11
+ */
12
+ import { spawnSync } from 'node:child_process';
13
+ import { lstatSync, readdirSync } from 'node:fs';
14
+ import { join, sep as PLATFORM_SEP } from 'node:path';
15
+ import { ValidationError } from '../../errors/index.js';
16
+ /**
17
+ * 相対パスのディレクトリ深さの上限。
18
+ * サーバー側 `S3FileBrowserService::MAX_RELATIVE_DIR_DEPTH` と同値。超えると upload が 422
19
+ * (preflight では検出できない)ので、送る前に弾く。
20
+ */
21
+ export const MAX_RELATIVE_DIR_DEPTH = 20;
22
+ /** ワークスペース側の保護ディレクトリ(`S3FileBrowserService::PROTECTED_PATHS` と同値)。 */
23
+ export const PROTECTED_DIRS = ['apps', 'canvas'];
24
+ /** 既定除外のディレクトリ名(--include-ignored で解除)。 */
25
+ export const DEFAULT_EXCLUDED_DIRS = [
26
+ 'node_modules',
27
+ 'vendor',
28
+ 'dist',
29
+ 'build',
30
+ '__pycache__',
31
+ '.venv',
32
+ ];
33
+ /** 既定除外のファイル名(--include-ignored で解除)。 */
34
+ export const DEFAULT_EXCLUDED_FILES = ['.DS_Store'];
35
+ // 制御文字とバックスラッシュ。サーバーの normalizeRelativeDir() が弾くのと同じ集合。
36
+ const INVALID_SEGMENT_CHARS = /[\u0000-\u001f\u007f\\]/;
37
+ /**
38
+ * ローカルの相対パスを、そのまま `paths[]` に載せられる形へ正規化する。
39
+ *
40
+ * 不正なパスを 1 件でも混ぜると upload リクエストが丸ごと 422 になるため、
41
+ * ここで弾いて呼び出し側に理由を返す(黙って直さない)。
42
+ *
43
+ * @param sepChar プラットフォームのパス区切り。`\` のときだけ `/` へ変換する
44
+ * (Linux ではファイル名に `\` を含められるので、一律変換すると階層を捏造してしまう)
45
+ */
46
+ export function normalizeRelativePath(raw, sepChar = PLATFORM_SEP) {
47
+ let path = sepChar === '\\' ? raw.split('\\').join('/') : raw;
48
+ while (path.startsWith('./')) {
49
+ path = path.slice(2);
50
+ }
51
+ path = path.replace(/^\/+/, '').replace(/\/+$/, '');
52
+ if (path === '') {
53
+ return { ok: false, reason: 'invalid_path', detail: 'empty path' };
54
+ }
55
+ const segments = path.split('/');
56
+ for (const segment of segments) {
57
+ if (segment === '') {
58
+ return { ok: false, reason: 'invalid_path', detail: `empty path segment in "${raw}"` };
59
+ }
60
+ if (segment === '.' || segment === '..') {
61
+ return { ok: false, reason: 'invalid_path', detail: `"${segment}" segment in "${raw}"` };
62
+ }
63
+ if (INVALID_SEGMENT_CHARS.test(segment)) {
64
+ return {
65
+ ok: false,
66
+ reason: 'invalid_path',
67
+ detail: `control character or backslash in "${raw}"`,
68
+ };
69
+ }
70
+ }
71
+ const depth = segments.length - 1;
72
+ if (depth > MAX_RELATIVE_DIR_DEPTH) {
73
+ return {
74
+ ok: false,
75
+ reason: 'too_deep',
76
+ detail: `directory depth ${depth} > ${MAX_RELATIVE_DIR_DEPTH}`,
77
+ };
78
+ }
79
+ return { ok: true, path };
80
+ }
81
+ /**
82
+ * `--dest` を検証して正規化する(空 = ワークスペースルート)。
83
+ */
84
+ export function normalizeDestPath(raw) {
85
+ if (raw === undefined || raw === '') {
86
+ return '';
87
+ }
88
+ const result = normalizeRelativePath(raw, '/');
89
+ if (!result.ok) {
90
+ throw new ValidationError(`--dest is not a valid workspace path: ${result.detail}`);
91
+ }
92
+ return result.path;
93
+ }
94
+ /**
95
+ * グロブを正規表現へ変換する。`**` は区切りをまたぎ、`*` `?` は 1 セグメント内で一致する。
96
+ */
97
+ export function globToRegExp(glob) {
98
+ let re = '';
99
+ for (let i = 0; i < glob.length; i++) {
100
+ const c = glob[i];
101
+ if (c === '*') {
102
+ if (glob[i + 1] === '*') {
103
+ i++;
104
+ if (glob[i + 1] === '/') {
105
+ // `**/` は 0 階層にも一致させる(`**/*.log` がルート直下の a.log にも効く)
106
+ i++;
107
+ re += '(?:.*/)?';
108
+ }
109
+ else {
110
+ re += '.*';
111
+ }
112
+ }
113
+ else {
114
+ re += '[^/]*';
115
+ }
116
+ }
117
+ else if (c === '?') {
118
+ re += '[^/]';
119
+ }
120
+ else {
121
+ re += c.replace(/[.+^${}()|[\]\\]/g, '\\$&');
122
+ }
123
+ }
124
+ return new RegExp(`^${re}$`);
125
+ }
126
+ /**
127
+ * 相対パスがグロブに一致するか。3 通りで見る:
128
+ * 1. パス全体(`src/**\/*.ts`)
129
+ * 2. 区切りを含まないパターンは各セグメント(`node_modules` で配下ごと、`*.log` でファイル名)
130
+ * 3. 区切りを含むパターンは祖先ディレクトリ(`src/gen` で `src/gen/a.ts`)
131
+ */
132
+ export function matchesGlob(path, pattern) {
133
+ const pat = pattern.endsWith('/') ? pattern.slice(0, -1) : pattern;
134
+ if (pat === '') {
135
+ return false;
136
+ }
137
+ const re = globToRegExp(pat);
138
+ if (re.test(path)) {
139
+ return true;
140
+ }
141
+ const segments = path.split('/');
142
+ if (!pat.includes('/')) {
143
+ return segments.some((s) => re.test(s));
144
+ }
145
+ for (let i = 1; i < segments.length; i++) {
146
+ if (re.test(segments.slice(0, i).join('/'))) {
147
+ return true;
148
+ }
149
+ }
150
+ return false;
151
+ }
152
+ /**
153
+ * 何があっても送らないもの。`--include-ignored` でも `--include` でも戻せない。
154
+ *
155
+ * `.env*` を外せなくしているのは、サーバーの `MaskProjectSecretsInAiWrites` が入力文字列しか
156
+ * マスクせず**ファイル本文は素通り**するため。メンバー全員に見えるワークスペースへ秘密を
157
+ * 置かない判断は、ここでしか下せない(`.env.example` も一律で落とす — 例外を作ると
158
+ * `.env.production` を `.env.example` に見せかける事故の余地が残る)。
159
+ */
160
+ export function isAlwaysExcluded(path) {
161
+ const segments = path.split('/');
162
+ if (segments.includes('.git')) {
163
+ return true;
164
+ }
165
+ const name = segments[segments.length - 1];
166
+ return name === '.env' || name.startsWith('.env.');
167
+ }
168
+ /**
169
+ * 既定除外(`--include-ignored` で一括解除、`--include <glob>` で個別に復帰)。
170
+ */
171
+ export function isDefaultExcluded(path) {
172
+ const segments = path.split('/');
173
+ if (segments.slice(0, -1).some((s) => DEFAULT_EXCLUDED_DIRS.includes(s))) {
174
+ return true;
175
+ }
176
+ return DEFAULT_EXCLUDED_FILES.includes(segments[segments.length - 1]);
177
+ }
178
+ /**
179
+ * 正規化済み相対パスの一覧を、送るもの / 送らないものに振り分ける。
180
+ * `--exclude` は `--include` より強い(明示の除外が勝つ)。
181
+ */
182
+ export function filterPaths(paths, opts = {}) {
183
+ const exclude = opts.exclude ?? [];
184
+ const include = opts.include ?? [];
185
+ const included = [];
186
+ const excluded = [];
187
+ for (const path of paths) {
188
+ if (isAlwaysExcluded(path)) {
189
+ excluded.push({ path, reason: 'always_excluded' });
190
+ continue;
191
+ }
192
+ const hit = exclude.find((pattern) => matchesGlob(path, pattern));
193
+ if (hit !== undefined) {
194
+ excluded.push({ path, reason: 'excluded', detail: hit });
195
+ continue;
196
+ }
197
+ if (!opts.includeIgnored &&
198
+ isDefaultExcluded(path) &&
199
+ !include.some((pattern) => matchesGlob(path, pattern))) {
200
+ excluded.push({ path, reason: 'default_excluded' });
201
+ continue;
202
+ }
203
+ included.push(path);
204
+ }
205
+ return { included, excluded };
206
+ }
207
+ /* ------------------------------------------------------------------ *
208
+ * 投入先(ワークスペース側)のパス判定
209
+ * ------------------------------------------------------------------ */
210
+ /**
211
+ * ベースディレクトリと相対パスを連結する(サーバーの joinPath() と同じ規則)。
212
+ * 送る `paths[]` は連結前の相対パスのまま。連結後は表示と投入先の判定にだけ使う。
213
+ */
214
+ export function joinWorkspacePath(base, relative) {
215
+ const b = base.replace(/^\/+|\/+$/g, '');
216
+ const r = relative.replace(/^\/+|\/+$/g, '');
217
+ if (b === '') {
218
+ return r;
219
+ }
220
+ return r === '' ? b : `${b}/${r}`;
221
+ }
222
+ /**
223
+ * `apps/` `canvas/` 配下に入るパスを返す。ミニアプリのソースと SQLite、Canvas の実ファイルが
224
+ * そこにあり、上書きすると動いているアプリが壊れる。サーバーは止めないのでここで止める。
225
+ */
226
+ export function detectProtectedPaths(joinedPaths) {
227
+ return joinedPaths.filter((p) => PROTECTED_DIRS.includes(p.split('/')[0]));
228
+ }
229
+ /**
230
+ * preflight の `invalid` を見て、投入を中止すべきかを判定する。
231
+ * 1 件でも不正なパスが混ざると upload リクエストが丸ごと 422 になるため、部分的には送らない。
232
+ */
233
+ export function shouldAbortForInvalid(invalid) {
234
+ return invalid.length > 0;
235
+ }
236
+ /* ------------------------------------------------------------------ *
237
+ * ローカル走査(唯一 fs / git を触るところ)
238
+ * ------------------------------------------------------------------ */
239
+ /**
240
+ * git にファイルを列挙させる。リポジトリでない / git が無い場合は null。
241
+ */
242
+ function gitListFiles(root) {
243
+ const probe = spawnSync('git', ['-C', root, 'rev-parse', '--git-dir'], { encoding: 'utf8' });
244
+ if (probe.error || probe.status !== 0) {
245
+ return null;
246
+ }
247
+ const listed = spawnSync('git', ['-C', root, 'ls-files', '--cached', '--others', '--exclude-standard', '-z'], { encoding: 'utf8', maxBuffer: 256 * 1024 * 1024 });
248
+ if (listed.error || listed.status !== 0) {
249
+ return null;
250
+ }
251
+ return listed.stdout.split('\0').filter((s) => s !== '');
252
+ }
253
+ /**
254
+ * 掘らずに済むディレクトリか。あくまで走査の枝刈りで、除外の正は filterPaths()。
255
+ * `--include` で戻される可能性があるものは掘って、判定はそちらに任せる。
256
+ */
257
+ function shouldPruneDir(name, opts) {
258
+ if (name === '.git') {
259
+ return true;
260
+ }
261
+ if (opts.includeIgnored || !DEFAULT_EXCLUDED_DIRS.includes(name)) {
262
+ return false;
263
+ }
264
+ return !(opts.include ?? []).some((pattern) => pattern === name || pattern.startsWith(`${name}/`) || pattern.includes('**'));
265
+ }
266
+ /**
267
+ * 再帰走査(git を使えないとき)。シンボリックリンクは辿らず、報告して飛ばす。
268
+ */
269
+ function walkTree(root, opts, excluded) {
270
+ const files = [];
271
+ const walk = (relDir) => {
272
+ const absDir = relDir === '' ? root : join(root, ...relDir.split('/'));
273
+ let entries;
274
+ try {
275
+ entries = readdirSync(absDir, { withFileTypes: true });
276
+ }
277
+ catch {
278
+ excluded.push({ path: relDir === '' ? '.' : `${relDir}/`, reason: 'unreadable' });
279
+ return;
280
+ }
281
+ for (const entry of entries) {
282
+ const rel = relDir === '' ? entry.name : `${relDir}/${entry.name}`;
283
+ if (entry.isSymbolicLink()) {
284
+ // リンク先がツリーの外に出る事故を避けるため辿らない
285
+ excluded.push({ path: rel, reason: 'symlink' });
286
+ continue;
287
+ }
288
+ if (entry.isDirectory()) {
289
+ if (shouldPruneDir(entry.name, opts)) {
290
+ excluded.push({
291
+ path: `${rel}/`,
292
+ reason: entry.name === '.git' ? 'always_excluded' : 'default_excluded',
293
+ });
294
+ continue;
295
+ }
296
+ walk(rel);
297
+ continue;
298
+ }
299
+ if (!entry.isFile()) {
300
+ excluded.push({ path: rel, reason: 'not_a_file' });
301
+ continue;
302
+ }
303
+ files.push(rel);
304
+ }
305
+ };
306
+ walk('');
307
+ return files;
308
+ }
309
+ /**
310
+ * ローカルディレクトリから投入対象を集める。
311
+ */
312
+ export function collectFiles(root, opts = {}) {
313
+ const excluded = [];
314
+ let listed = null;
315
+ let source = 'walk';
316
+ if (!opts.includeIgnored) {
317
+ listed = gitListFiles(root);
318
+ if (listed !== null) {
319
+ source = 'git';
320
+ }
321
+ }
322
+ if (listed === null) {
323
+ listed = walkTree(root, opts, excluded);
324
+ }
325
+ const normalized = [];
326
+ const seen = new Set();
327
+ for (const raw of listed) {
328
+ const result = normalizeRelativePath(raw);
329
+ if (!result.ok) {
330
+ excluded.push({ path: raw, reason: result.reason, detail: result.detail });
331
+ continue;
332
+ }
333
+ if (seen.has(result.path)) {
334
+ continue;
335
+ }
336
+ seen.add(result.path);
337
+ normalized.push(result.path);
338
+ }
339
+ const filtered = filterPaths(normalized, opts);
340
+ excluded.push(...filtered.excluded);
341
+ const files = [];
342
+ for (const path of filtered.included) {
343
+ const absolute = join(root, ...path.split('/'));
344
+ let stat;
345
+ try {
346
+ stat = lstatSync(absolute);
347
+ }
348
+ catch {
349
+ // `git ls-files --cached` は削除済みのファイルも返す
350
+ excluded.push({ path, reason: 'unreadable' });
351
+ continue;
352
+ }
353
+ if (stat.isSymbolicLink()) {
354
+ excluded.push({ path, reason: 'symlink' });
355
+ continue;
356
+ }
357
+ if (!stat.isFile()) {
358
+ // サブモジュール(gitlink)などはここに落ちる
359
+ excluded.push({ path, reason: 'not_a_file' });
360
+ continue;
361
+ }
362
+ files.push({ path, absolute, size: stat.size });
363
+ }
364
+ files.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
365
+ excluded.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
366
+ return { files, excluded, source };
367
+ }
368
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../src/commands/workspace/collect.ts"],"names":[],"mappings":"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"}