@fnndsc/brasa 0.1.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.
- package/dist/builtins/debug.d.ts +8 -0
- package/dist/builtins/debug.js +39 -0
- package/dist/builtins/debug.js.map +1 -0
- package/dist/builtins/executable.d.ts +22 -0
- package/dist/builtins/executable.js +115 -0
- package/dist/builtins/executable.js.map +1 -0
- package/dist/builtins/fs/cat.d.ts +16 -0
- package/dist/builtins/fs/cat.js +266 -0
- package/dist/builtins/fs/cat.js.map +1 -0
- package/dist/builtins/fs/cd.d.ts +42 -0
- package/dist/builtins/fs/cd.js +193 -0
- package/dist/builtins/fs/cd.js.map +1 -0
- package/dist/builtins/fs/cp.d.ts +10 -0
- package/dist/builtins/fs/cp.js +86 -0
- package/dist/builtins/fs/cp.js.map +1 -0
- package/dist/builtins/fs/download.d.ts +6 -0
- package/dist/builtins/fs/download.js +45 -0
- package/dist/builtins/fs/download.js.map +1 -0
- package/dist/builtins/fs/du.d.ts +58 -0
- package/dist/builtins/fs/du.js +210 -0
- package/dist/builtins/fs/du.js.map +1 -0
- package/dist/builtins/fs/edit.d.ts +7 -0
- package/dist/builtins/fs/edit.js +104 -0
- package/dist/builtins/fs/edit.js.map +1 -0
- package/dist/builtins/fs/ls.d.ts +8 -0
- package/dist/builtins/fs/ls.js +68 -0
- package/dist/builtins/fs/ls.js.map +1 -0
- package/dist/builtins/fs/mkdir.d.ts +9 -0
- package/dist/builtins/fs/mkdir.js +52 -0
- package/dist/builtins/fs/mkdir.js.map +1 -0
- package/dist/builtins/fs/mv.d.ts +10 -0
- package/dist/builtins/fs/mv.js +88 -0
- package/dist/builtins/fs/mv.js.map +1 -0
- package/dist/builtins/fs/pull.args.d.ts +22 -0
- package/dist/builtins/fs/pull.args.js +30 -0
- package/dist/builtins/fs/pull.args.js.map +1 -0
- package/dist/builtins/fs/pull.d.ts +26 -0
- package/dist/builtins/fs/pull.js +445 -0
- package/dist/builtins/fs/pull.js.map +1 -0
- package/dist/builtins/fs/pwd.d.ts +10 -0
- package/dist/builtins/fs/pwd.js +73 -0
- package/dist/builtins/fs/pwd.js.map +1 -0
- package/dist/builtins/fs/rm.d.ts +37 -0
- package/dist/builtins/fs/rm.js +197 -0
- package/dist/builtins/fs/rm.js.map +1 -0
- package/dist/builtins/fs/touch.d.ts +9 -0
- package/dist/builtins/fs/touch.js +76 -0
- package/dist/builtins/fs/touch.js.map +1 -0
- package/dist/builtins/fs/tree.d.ts +15 -0
- package/dist/builtins/fs/tree.js +84 -0
- package/dist/builtins/fs/tree.js.map +1 -0
- package/dist/builtins/fs/upload.d.ts +6 -0
- package/dist/builtins/fs/upload.js +48 -0
- package/dist/builtins/fs/upload.js.map +1 -0
- package/dist/builtins/help.d.ts +74 -0
- package/dist/builtins/help.js +1217 -0
- package/dist/builtins/help.js.map +1 -0
- package/dist/builtins/index.d.ts +45 -0
- package/dist/builtins/index.js +45 -0
- package/dist/builtins/index.js.map +1 -0
- package/dist/builtins/net/connect.d.ts +7 -0
- package/dist/builtins/net/connect.js +42 -0
- package/dist/builtins/net/connect.js.map +1 -0
- package/dist/builtins/net/cubepath.d.ts +18 -0
- package/dist/builtins/net/cubepath.js +102 -0
- package/dist/builtins/net/cubepath.js.map +1 -0
- package/dist/builtins/net/logout.d.ts +6 -0
- package/dist/builtins/net/logout.js +24 -0
- package/dist/builtins/net/logout.js.map +1 -0
- package/dist/builtins/net/pacs.d.ts +24 -0
- package/dist/builtins/net/pacs.js +121 -0
- package/dist/builtins/net/pacs.js.map +1 -0
- package/dist/builtins/net/pacsUtils.d.ts +85 -0
- package/dist/builtins/net/pacsUtils.js +184 -0
- package/dist/builtins/net/pacsUtils.js.map +1 -0
- package/dist/builtins/net/query.d.ts +60 -0
- package/dist/builtins/net/query.js +324 -0
- package/dist/builtins/net/query.js.map +1 -0
- package/dist/builtins/parametersofplugin.d.ts +13 -0
- package/dist/builtins/parametersofplugin.js +43 -0
- package/dist/builtins/parametersofplugin.js.map +1 -0
- package/dist/builtins/pluginExecute.d.ts +27 -0
- package/dist/builtins/pluginExecute.js +165 -0
- package/dist/builtins/pluginExecute.js.map +1 -0
- package/dist/builtins/proc.d.ts +6 -0
- package/dist/builtins/proc.helpers.d.ts +68 -0
- package/dist/builtins/proc.helpers.js +102 -0
- package/dist/builtins/proc.helpers.js.map +1 -0
- package/dist/builtins/proc.js +289 -0
- package/dist/builtins/proc.js.map +1 -0
- package/dist/builtins/res/compute.d.ts +6 -0
- package/dist/builtins/res/compute.js +55 -0
- package/dist/builtins/res/compute.js.map +1 -0
- package/dist/builtins/res/feed.d.ts +6 -0
- package/dist/builtins/res/feed.js +244 -0
- package/dist/builtins/res/feed.js.map +1 -0
- package/dist/builtins/res/feed.notes.d.ts +28 -0
- package/dist/builtins/res/feed.notes.js +24 -0
- package/dist/builtins/res/feed.notes.js.map +1 -0
- package/dist/builtins/res/files.d.ts +18 -0
- package/dist/builtins/res/files.js +85 -0
- package/dist/builtins/res/files.js.map +1 -0
- package/dist/builtins/res/group.d.ts +6 -0
- package/dist/builtins/res/group.js +54 -0
- package/dist/builtins/res/group.js.map +1 -0
- package/dist/builtins/res/pipeline.args.d.ts +22 -0
- package/dist/builtins/res/pipeline.args.js +28 -0
- package/dist/builtins/res/pipeline.args.js.map +1 -0
- package/dist/builtins/res/pipeline.d.ts +20 -0
- package/dist/builtins/res/pipeline.js +252 -0
- package/dist/builtins/res/pipeline.js.map +1 -0
- package/dist/builtins/res/plugin.d.ts +13 -0
- package/dist/builtins/res/plugin.js +140 -0
- package/dist/builtins/res/plugin.js.map +1 -0
- package/dist/builtins/res/plugininstance.d.ts +6 -0
- package/dist/builtins/res/plugininstance.js +53 -0
- package/dist/builtins/res/plugininstance.js.map +1 -0
- package/dist/builtins/res/pluginmeta.d.ts +6 -0
- package/dist/builtins/res/pluginmeta.js +53 -0
- package/dist/builtins/res/pluginmeta.js.map +1 -0
- package/dist/builtins/res/tag.d.ts +6 -0
- package/dist/builtins/res/tag.js +53 -0
- package/dist/builtins/res/tag.js.map +1 -0
- package/dist/builtins/res/workflow.d.ts +6 -0
- package/dist/builtins/res/workflow.js +53 -0
- package/dist/builtins/res/workflow.js.map +1 -0
- package/dist/builtins/store.d.ts +6 -0
- package/dist/builtins/store.js +107 -0
- package/dist/builtins/store.js.map +1 -0
- package/dist/builtins/sys/context.d.ts +6 -0
- package/dist/builtins/sys/context.js +50 -0
- package/dist/builtins/sys/context.js.map +1 -0
- package/dist/builtins/sys/physicalmode.d.ts +8 -0
- package/dist/builtins/sys/physicalmode.js +34 -0
- package/dist/builtins/sys/physicalmode.js.map +1 -0
- package/dist/builtins/sys/timing.d.ts +8 -0
- package/dist/builtins/sys/timing.js +34 -0
- package/dist/builtins/sys/timing.js.map +1 -0
- package/dist/builtins/sys/version.d.ts +15 -0
- package/dist/builtins/sys/version.js +23 -0
- package/dist/builtins/sys/version.js.map +1 -0
- package/dist/builtins/sys/whoami.d.ts +17 -0
- package/dist/builtins/sys/whoami.js +44 -0
- package/dist/builtins/sys/whoami.js.map +1 -0
- package/dist/builtins/utils.d.ts +55 -0
- package/dist/builtins/utils.js +145 -0
- package/dist/builtins/utils.js.map +1 -0
- package/dist/builtins/wildcard.d.ts +26 -0
- package/dist/builtins/wildcard.js +120 -0
- package/dist/builtins/wildcard.js.map +1 -0
- package/dist/command-keys.d.ts +8 -0
- package/dist/command-keys.js +32 -0
- package/dist/command-keys.js.map +1 -0
- package/dist/config/storeConfig.d.ts +57 -0
- package/dist/config/storeConfig.js +78 -0
- package/dist/config/storeConfig.js.map +1 -0
- package/dist/core/chiliDelegate.d.ts +21 -0
- package/dist/core/chiliDelegate.js +32 -0
- package/dist/core/chiliDelegate.js.map +1 -0
- package/dist/core/connect.d.ts +38 -0
- package/dist/core/connect.js +46 -0
- package/dist/core/connect.js.map +1 -0
- package/dist/core/dispatch.d.ts +95 -0
- package/dist/core/dispatch.js +618 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/engine.d.ts +91 -0
- package/dist/core/engine.js +222 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/preprocess.d.ts +46 -0
- package/dist/core/preprocess.js +146 -0
- package/dist/core/preprocess.js.map +1 -0
- package/dist/core/progress.d.ts +50 -0
- package/dist/core/progress.js +21 -0
- package/dist/core/progress.js.map +1 -0
- package/dist/core/promptContext.d.ts +49 -0
- package/dist/core/promptContext.js +39 -0
- package/dist/core/promptContext.js.map +1 -0
- package/dist/core/question.d.ts +27 -0
- package/dist/core/question.js +33 -0
- package/dist/core/question.js.map +1 -0
- package/dist/core/sink.d.ts +207 -0
- package/dist/core/sink.js +329 -0
- package/dist/core/sink.js.map +1 -0
- package/dist/core/surface.d.ts +172 -0
- package/dist/core/surface.js +105 -0
- package/dist/core/surface.js.map +1 -0
- package/dist/core/version.d.ts +20 -0
- package/dist/core/version.js +82 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/completer/index.d.ts +15 -0
- package/dist/lib/completer/index.js +212 -0
- package/dist/lib/completer/index.js.map +1 -0
- package/dist/lib/completer/pathComplete.helpers.d.ts +22 -0
- package/dist/lib/completer/pathComplete.helpers.js +49 -0
- package/dist/lib/completer/pathComplete.helpers.js.map +1 -0
- package/dist/lib/parser.d.ts +13 -0
- package/dist/lib/parser.js +52 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/pipe.d.ts +11 -0
- package/dist/lib/pipe.js +90 -0
- package/dist/lib/pipe.js.map +1 -0
- package/dist/lib/prefetch.d.ts +25 -0
- package/dist/lib/prefetch.js +64 -0
- package/dist/lib/prefetch.js.map +1 -0
- package/dist/lib/semicolonParser.d.ts +22 -0
- package/dist/lib/semicolonParser.js +53 -0
- package/dist/lib/semicolonParser.js.map +1 -0
- package/dist/lib/spinner.d.ts +23 -0
- package/dist/lib/spinner.js +71 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/vfs/providers/static.d.ts +65 -0
- package/dist/lib/vfs/providers/static.js +164 -0
- package/dist/lib/vfs/providers/static.js.map +1 -0
- package/dist/lib/vfs/providers/static_content.d.ts +27 -0
- package/dist/lib/vfs/providers/static_content.js +180 -0
- package/dist/lib/vfs/providers/static_content.js.map +1 -0
- package/dist/lib/vfs/vfs.d.ts +59 -0
- package/dist/lib/vfs/vfs.js +202 -0
- package/dist/lib/vfs/vfs.js.map +1 -0
- package/dist/session/index.d.ts +76 -0
- package/dist/session/index.js +120 -0
- package/dist/session/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin edit command.
|
|
3
|
+
* Fetches a ChRIS file, opens it in the surface's local editor, then
|
|
4
|
+
* re-uploads on save. The editor mechanics live in the surface, so this
|
|
5
|
+
* builtin knows nothing of processes or terminals — it fetches, hands the
|
|
6
|
+
* content to the surface, and uploads the result.
|
|
7
|
+
*/
|
|
8
|
+
import { writeFileSync, unlinkSync, existsSync } from 'fs';
|
|
9
|
+
import { tmpdir } from 'os';
|
|
10
|
+
import { join, extname, posix } from 'path';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { path_resolve, error_stripDebugPrefix } from '../utils.js';
|
|
13
|
+
import { surface_get, capability_require, CapabilityError } from '../../core/surface.js';
|
|
14
|
+
import { files_cat } from '@fnndsc/chili/commands/fs/cat.js';
|
|
15
|
+
import { file_replaceContent } from '@fnndsc/chili/commands/fs/edit.js';
|
|
16
|
+
import { errorStack, listCache_get } from '@fnndsc/cumin';
|
|
17
|
+
const BINARY_EXTENSIONS = new Set([
|
|
18
|
+
'.dcm', '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp', '.ico',
|
|
19
|
+
'.pdf', '.zip', '.tar', '.gz', '.bz2', '.xz', '.7z',
|
|
20
|
+
'.exe', '.dll', '.so', '.bin', '.mp3', '.mp4', '.avi', '.wav',
|
|
21
|
+
]);
|
|
22
|
+
/**
|
|
23
|
+
* Opens a ChRIS file in the surface's local editor. On save, replaces the
|
|
24
|
+
* original via delete + re-upload. No-ops if content is unchanged.
|
|
25
|
+
*
|
|
26
|
+
* @param args - [filePath, ...]
|
|
27
|
+
*/
|
|
28
|
+
export async function builtin_edit(args) {
|
|
29
|
+
if (args.length === 0) {
|
|
30
|
+
console.error(chalk.red('Usage: edit <file>'));
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Editing needs a surface that can open a local editor. A surface without
|
|
35
|
+
// the capability (a headless or browser host) fails here with a clear
|
|
36
|
+
// message instead of assuming a terminal exists.
|
|
37
|
+
try {
|
|
38
|
+
capability_require('localEdit', 'edit: this surface cannot open a local editor.');
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
const message = err instanceof CapabilityError ? err.message : String(err);
|
|
42
|
+
console.error(chalk.red(message));
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const target = await path_resolve(args[0]);
|
|
47
|
+
const ext = extname(target).toLowerCase();
|
|
48
|
+
if (BINARY_EXTENSIONS.has(ext)) {
|
|
49
|
+
console.error(chalk.red(`edit: ${args[0]}: binary file (${ext}), cannot edit as text`));
|
|
50
|
+
process.exitCode = 1;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const catResult = await files_cat(target);
|
|
54
|
+
if (!catResult.ok) {
|
|
55
|
+
const err = errorStack.stack_pop();
|
|
56
|
+
console.error(chalk.red(`edit: ${err ? error_stripDebugPrefix(err.message) : 'Failed to read file'}`));
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Hand the content to the surface's editor.
|
|
61
|
+
let edit;
|
|
62
|
+
try {
|
|
63
|
+
edit = await surface_get().localEdit({ content: catResult.value, extension: ext || '.txt' });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
console.error(chalk.red(`edit: ${err instanceof Error ? err.message : String(err)}`));
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (!edit.changed) {
|
|
71
|
+
console.log(chalk.gray('(no changes)'));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Upload the edited content: write it to a temp file the replace command
|
|
75
|
+
// reads, and preserve that file (reporting its path) if the save fails.
|
|
76
|
+
const tmpPath = join(tmpdir(), `chell-edit-${Date.now()}${ext || '.txt'}`);
|
|
77
|
+
let keepTmp = false;
|
|
78
|
+
try {
|
|
79
|
+
writeFileSync(tmpPath, edit.content, 'utf8');
|
|
80
|
+
const result = await file_replaceContent(target, tmpPath);
|
|
81
|
+
listCache_get().cache_invalidate(posix.dirname(target));
|
|
82
|
+
if (result.success) {
|
|
83
|
+
console.log(chalk.green(`Saved: ${args[0]}`));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const apiErr = errorStack.stack_pop();
|
|
87
|
+
console.error(chalk.red(`edit: Save failed — ${result.error}`));
|
|
88
|
+
if (apiErr)
|
|
89
|
+
console.error(chalk.red(` API error: ${error_stripDebugPrefix(apiErr.message)}`));
|
|
90
|
+
console.error(chalk.yellow(`Your edits are preserved at: ${tmpPath}`));
|
|
91
|
+
keepTmp = true;
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
if (!keepTmp && existsSync(tmpPath)) {
|
|
97
|
+
try {
|
|
98
|
+
unlinkSync(tmpPath);
|
|
99
|
+
}
|
|
100
|
+
catch { /* ignore */ }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/builtins/fs/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lists the contents of the current or specified directory/files in the ChRIS filesystem context.
|
|
3
|
+
* Supports a virtual `/bin` directory for plugins and multiple paths (e.g., from wildcard expansion).
|
|
4
|
+
*
|
|
5
|
+
* @param args - An array containing target paths (optional).
|
|
6
|
+
* @returns A Promise that resolves when the directory contents are listed.
|
|
7
|
+
*/
|
|
8
|
+
export declare function builtin_ls(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin ls command.
|
|
3
|
+
* Lists directory contents.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { commandArgs_process, path_resolve } from '../utils.js';
|
|
7
|
+
import { listCache_get } from '@fnndsc/cumin';
|
|
8
|
+
import { session } from '../../session/index.js';
|
|
9
|
+
import { vfs } from '../../lib/vfs/vfs.js';
|
|
10
|
+
/**
|
|
11
|
+
* Lists the contents of the current or specified directory/files in the ChRIS filesystem context.
|
|
12
|
+
* Supports a virtual `/bin` directory for plugins and multiple paths (e.g., from wildcard expansion).
|
|
13
|
+
*
|
|
14
|
+
* @param args - An array containing target paths (optional).
|
|
15
|
+
* @returns A Promise that resolves when the directory contents are listed.
|
|
16
|
+
*/
|
|
17
|
+
export async function builtin_ls(args) {
|
|
18
|
+
const parsed = commandArgs_process(args);
|
|
19
|
+
const pathArgsRaw = parsed._;
|
|
20
|
+
let sortBy = 'name';
|
|
21
|
+
if (parsed['sort']) {
|
|
22
|
+
const sortValue = String(parsed['sort']);
|
|
23
|
+
if (['name', 'size', 'date', 'owner'].includes(sortValue)) {
|
|
24
|
+
sortBy = sortValue;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
let pathArgs = pathArgsRaw;
|
|
28
|
+
const shouldRefresh = !!parsed['refresh'] || !!parsed['f'];
|
|
29
|
+
const options = {
|
|
30
|
+
long: !!parsed['l'],
|
|
31
|
+
human: !!parsed['h'],
|
|
32
|
+
oneColumn: !!parsed['1'],
|
|
33
|
+
sort: sortBy,
|
|
34
|
+
reverse: !!parsed['reverse'] || !!parsed['r'],
|
|
35
|
+
directory: !!parsed['d']
|
|
36
|
+
};
|
|
37
|
+
if (shouldRefresh) {
|
|
38
|
+
const listCache = listCache_get();
|
|
39
|
+
if (pathArgs.length === 0) {
|
|
40
|
+
const cwd = await session.getCWD();
|
|
41
|
+
console.log(chalk.gray(`[Cache] Invalidating: ${cwd}`));
|
|
42
|
+
listCache.cache_invalidate(cwd);
|
|
43
|
+
listCache.cache_invalidate();
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
for (const pathArg of pathArgs) {
|
|
47
|
+
const resolvedPath = await path_resolve(pathArg);
|
|
48
|
+
console.log(chalk.gray(`[Cache] Invalidating: ${resolvedPath}`));
|
|
49
|
+
listCache.cache_invalidate(resolvedPath);
|
|
50
|
+
}
|
|
51
|
+
listCache.cache_invalidate();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (pathArgs.length === 0) {
|
|
55
|
+
await vfs.list(undefined, options);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (pathArgs.length === 1) {
|
|
59
|
+
const target = await path_resolve(pathArgs[0]);
|
|
60
|
+
await vfs.list(target, options);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
for (const pathArg of pathArgs) {
|
|
64
|
+
const target = await path_resolve(pathArg);
|
|
65
|
+
await vfs.list(target, options);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=ls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/builtins/fs/ls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CommandEnvelope } from '@fnndsc/cumin';
|
|
2
|
+
/**
|
|
3
|
+
* Creates directories.
|
|
4
|
+
*
|
|
5
|
+
* @param args - Command line arguments (directory paths).
|
|
6
|
+
* @returns An envelope whose rendered text reports each directory and whose
|
|
7
|
+
* model lists per-target outcomes.
|
|
8
|
+
*/
|
|
9
|
+
export declare function builtin_mkdir(args: string[]): Promise<CommandEnvelope>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin mkdir command.
|
|
3
|
+
* Creates directories, reported as a command envelope.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { listCache_get, envelope_ok, envelope_error } from '@fnndsc/cumin';
|
|
7
|
+
import { path_resolve } from '../utils.js';
|
|
8
|
+
import { files_mkdir as chefs_mkdir_cmd } from '@fnndsc/chili/commands/fs/mkdir.js';
|
|
9
|
+
import { mkdir_render } from '@fnndsc/chili/views/fs.js';
|
|
10
|
+
/**
|
|
11
|
+
* Creates directories.
|
|
12
|
+
*
|
|
13
|
+
* @param args - Command line arguments (directory paths).
|
|
14
|
+
* @returns An envelope whose rendered text reports each directory and whose
|
|
15
|
+
* model lists per-target outcomes.
|
|
16
|
+
*/
|
|
17
|
+
export async function builtin_mkdir(args) {
|
|
18
|
+
if (args.length === 0) {
|
|
19
|
+
return envelope_error('', undefined, `${chalk.red('Usage: mkdir <directory> [directory...]')}\n`);
|
|
20
|
+
}
|
|
21
|
+
let rendered = '';
|
|
22
|
+
let renderedErr = '';
|
|
23
|
+
const outcomes = [];
|
|
24
|
+
for (const pathArg of args) {
|
|
25
|
+
try {
|
|
26
|
+
const targetPath = await path_resolve(pathArg);
|
|
27
|
+
const success = await chefs_mkdir_cmd(targetPath);
|
|
28
|
+
rendered += `${mkdir_render(targetPath, success)}\n`;
|
|
29
|
+
outcomes.push({ path: targetPath, created: success });
|
|
30
|
+
// Invalidate cache for parent directory
|
|
31
|
+
if (success) {
|
|
32
|
+
const parentDir = targetPath.substring(0, targetPath.lastIndexOf('/')) || '/';
|
|
33
|
+
const listCache = listCache_get();
|
|
34
|
+
listCache.cache_invalidate(parentDir);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
39
|
+
renderedErr += `${chalk.red(`mkdir: ${pathArg}: ${msg}`)}\n`;
|
|
40
|
+
outcomes.push({ path: pathArg, created: false });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const anyFailed = outcomes.some((outcome) => !outcome.created);
|
|
44
|
+
const model = { kind: 'fs.mkdir', data: outcomes };
|
|
45
|
+
if (anyFailed) {
|
|
46
|
+
const envelope = envelope_error(rendered, undefined, renderedErr || undefined);
|
|
47
|
+
envelope.model = model;
|
|
48
|
+
return envelope;
|
|
49
|
+
}
|
|
50
|
+
return envelope_ok(rendered, model);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=mkdir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mkdir.js","sourceRoot":"","sources":["../../../src/builtins/fs/mkdir.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAQzD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,IAAI,CAAC,CAAC;IACpG,CAAC;IAED,IAAI,QAAQ,GAAW,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAW,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,UAAU,GAAW,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,OAAO,GAAY,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;YAC3D,QAAQ,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAEtD,wCAAwC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,SAAS,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;gBACtF,MAAM,SAAS,GAAc,aAAa,EAAE,CAAC;gBAC7C,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAY,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAqB,EAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/F,MAAM,KAAK,GAA2C,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC3F,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,QAAQ,GAAoB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,IAAI,SAAS,CAAC,CAAC;QAChG,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CommandEnvelope } from '@fnndsc/cumin';
|
|
2
|
+
/**
|
|
3
|
+
* Moves or renames a file or directory.
|
|
4
|
+
* Supports multiple sources when destination is a directory.
|
|
5
|
+
*
|
|
6
|
+
* @param args - [src1, src2, ..., dest] or [src, dest]
|
|
7
|
+
* @returns An envelope whose rendered text reports progress and results and
|
|
8
|
+
* whose model carries per-source outcomes.
|
|
9
|
+
*/
|
|
10
|
+
export declare function builtin_mv(args: string[]): Promise<CommandEnvelope>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin mv command.
|
|
3
|
+
* Moves or renames files/directories, reported as a command envelope.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { listCache_get, envelope_ok, envelope_error } from '@fnndsc/cumin';
|
|
8
|
+
import { commandArgs_process, path_resolve } from '../utils.js';
|
|
9
|
+
import { files_mv as chefs_mv_cmd } from '@fnndsc/chili/commands/fs/mv.js';
|
|
10
|
+
import { mv_render } from '@fnndsc/chili/views/fs.js';
|
|
11
|
+
/**
|
|
12
|
+
* Moves or renames a file or directory.
|
|
13
|
+
* Supports multiple sources when destination is a directory.
|
|
14
|
+
*
|
|
15
|
+
* @param args - [src1, src2, ..., dest] or [src, dest]
|
|
16
|
+
* @returns An envelope whose rendered text reports progress and results and
|
|
17
|
+
* whose model carries per-source outcomes.
|
|
18
|
+
*/
|
|
19
|
+
export async function builtin_mv(args) {
|
|
20
|
+
const parsed = commandArgs_process(args);
|
|
21
|
+
const pathArgs = parsed._;
|
|
22
|
+
if (pathArgs.length < 2) {
|
|
23
|
+
return envelope_error(`${chalk.red('Usage: mv <source...> <dest>')}\n`);
|
|
24
|
+
}
|
|
25
|
+
// Last arg is destination, all others are sources
|
|
26
|
+
const dest = pathArgs[pathArgs.length - 1];
|
|
27
|
+
const sources = pathArgs.slice(0, -1);
|
|
28
|
+
const destPath = await path_resolve(dest);
|
|
29
|
+
const listCache = listCache_get();
|
|
30
|
+
let successCount = 0;
|
|
31
|
+
let failCount = 0;
|
|
32
|
+
let rendered = '';
|
|
33
|
+
let renderedErr = '';
|
|
34
|
+
const outcomes = [];
|
|
35
|
+
for (const src of sources) {
|
|
36
|
+
try {
|
|
37
|
+
const srcPath = await path_resolve(src);
|
|
38
|
+
// For multiple sources, show which file we're moving
|
|
39
|
+
if (sources.length > 1) {
|
|
40
|
+
rendered += `${chalk.gray(`Moving ${srcPath}...`)}\n`;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
rendered += `Moving ${srcPath} to ${destPath}...\n`;
|
|
44
|
+
}
|
|
45
|
+
const success = await chefs_mv_cmd(srcPath, destPath);
|
|
46
|
+
if (sources.length === 1) {
|
|
47
|
+
rendered += `${mv_render(srcPath, destPath, success)}\n`;
|
|
48
|
+
}
|
|
49
|
+
outcomes.push({ source: srcPath, moved: success });
|
|
50
|
+
if (success) {
|
|
51
|
+
successCount++;
|
|
52
|
+
// Invalidate source directory
|
|
53
|
+
const srcDir = path.posix.dirname(srcPath);
|
|
54
|
+
listCache.cache_invalidate(srcDir);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
failCount++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
62
|
+
renderedErr += `${chalk.red(`mv: ${src}: ${msg}`)}\n`;
|
|
63
|
+
outcomes.push({ source: src, moved: false });
|
|
64
|
+
failCount++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Invalidate destination directory (always, since files moved into it)
|
|
68
|
+
listCache.cache_invalidate(destPath);
|
|
69
|
+
const destParent = path.posix.dirname(destPath);
|
|
70
|
+
listCache.cache_invalidate(destParent);
|
|
71
|
+
// Summary for multiple files
|
|
72
|
+
if (sources.length > 1) {
|
|
73
|
+
if (failCount === 0) {
|
|
74
|
+
rendered += `${chalk.green(`✓ Moved ${successCount} file(s) to ${destPath}`)}\n`;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
rendered += `${chalk.yellow(`⚠ Moved ${successCount} file(s), ${failCount} failed`)}\n`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const modelData = { dest: destPath, outcomes, moved: successCount, failed: failCount };
|
|
81
|
+
if (failCount > 0) {
|
|
82
|
+
const envelope = envelope_error(rendered, undefined, renderedErr || undefined);
|
|
83
|
+
envelope.model = { kind: 'fs.mv', data: modelData };
|
|
84
|
+
return envelope;
|
|
85
|
+
}
|
|
86
|
+
return envelope_ok(rendered, { kind: 'fs.mv', data: modelData });
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=mv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mv.js","sourceRoot":"","sources":["../../../src/builtins/fs/mv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Pure argument parsing for the `pull` builtin.
|
|
3
|
+
*
|
|
4
|
+
* Dependency-free so it is trivially unit-testable.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parsed `pull` arguments.
|
|
10
|
+
*/
|
|
11
|
+
export interface PullArgs {
|
|
12
|
+
nowait: boolean;
|
|
13
|
+
retryMax: number;
|
|
14
|
+
paths: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parses `pull` arguments: the `--nowait` flag, `--retry N`, and path operands.
|
|
18
|
+
*
|
|
19
|
+
* @param args - Raw command arguments.
|
|
20
|
+
* @returns The parsed flags and paths.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pullArgs_parse(args: string[]): PullArgs;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Pure argument parsing for the `pull` builtin.
|
|
3
|
+
*
|
|
4
|
+
* Dependency-free so it is trivially unit-testable.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parses `pull` arguments: the `--nowait` flag, `--retry N`, and path operands.
|
|
10
|
+
*
|
|
11
|
+
* @param args - Raw command arguments.
|
|
12
|
+
* @returns The parsed flags and paths.
|
|
13
|
+
*/
|
|
14
|
+
export function pullArgs_parse(args) {
|
|
15
|
+
const nowait = args.includes('--nowait');
|
|
16
|
+
let retryMax = 0;
|
|
17
|
+
const paths = [];
|
|
18
|
+
for (let i = 0; i < args.length; i++) {
|
|
19
|
+
if (args[i] === '--retry' && i + 1 < args.length) {
|
|
20
|
+
const n = parseInt(args[++i], 10);
|
|
21
|
+
if (!isNaN(n) && n >= 0)
|
|
22
|
+
retryMax = n;
|
|
23
|
+
}
|
|
24
|
+
else if (!args[i].startsWith('--')) {
|
|
25
|
+
paths.push(args[i]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { nowait, retryMax, paths };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pull.args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.args.js","sourceRoot":"","sources":["../../../src/builtins/fs/pull.args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,MAAM,GAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,QAAQ,GAAW,CAAC,CAAC;IACzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,CAAC,GAAW,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Builtin pull command.
|
|
3
|
+
*
|
|
4
|
+
* Blocking PACS series retrieve with parallel execution and per-series structured progress.
|
|
5
|
+
* Accepts one or more `/net/pacs/queries/...` VFS paths (query, study, or series level)
|
|
6
|
+
* and materialises the matching DICOM series into ChRIS storage.
|
|
7
|
+
*
|
|
8
|
+
* Progress is driven by LONK WebSocket push notifications (api/v1/pacs/ws/).
|
|
9
|
+
* Use `--retry N` to automatically re-fire retrieves for series that received no LONK activity.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Pulls one or more `/net/pacs/queries/...` VFS paths into ChRIS storage.
|
|
15
|
+
*
|
|
16
|
+
* Blocking by default: emits per-series structured progress via LONK WebSocket,
|
|
17
|
+
* exits non-zero on partial failure.
|
|
18
|
+
* With `--nowait`: fires retrieves and prints `<seriesUID> <retrieveId>` per line, then returns.
|
|
19
|
+
* With `--retry N`: re-fires retrieves for [NO LONK] series up to N additional times.
|
|
20
|
+
*
|
|
21
|
+
* @param args - Command arguments (VFS paths, optional flags).
|
|
22
|
+
* @example
|
|
23
|
+
* pull /net/pacs/queries/42_AccessionNumber:12345678
|
|
24
|
+
* pull --retry 3 /net/pacs/queries/42_AccessionNumber:12345678/Study_1.2.3_US-Hips
|
|
25
|
+
*/
|
|
26
|
+
export declare function builtin_pull(args: string[]): Promise<void>;
|