@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.
Files changed (226) hide show
  1. package/dist/builtins/debug.d.ts +8 -0
  2. package/dist/builtins/debug.js +39 -0
  3. package/dist/builtins/debug.js.map +1 -0
  4. package/dist/builtins/executable.d.ts +22 -0
  5. package/dist/builtins/executable.js +115 -0
  6. package/dist/builtins/executable.js.map +1 -0
  7. package/dist/builtins/fs/cat.d.ts +16 -0
  8. package/dist/builtins/fs/cat.js +266 -0
  9. package/dist/builtins/fs/cat.js.map +1 -0
  10. package/dist/builtins/fs/cd.d.ts +42 -0
  11. package/dist/builtins/fs/cd.js +193 -0
  12. package/dist/builtins/fs/cd.js.map +1 -0
  13. package/dist/builtins/fs/cp.d.ts +10 -0
  14. package/dist/builtins/fs/cp.js +86 -0
  15. package/dist/builtins/fs/cp.js.map +1 -0
  16. package/dist/builtins/fs/download.d.ts +6 -0
  17. package/dist/builtins/fs/download.js +45 -0
  18. package/dist/builtins/fs/download.js.map +1 -0
  19. package/dist/builtins/fs/du.d.ts +58 -0
  20. package/dist/builtins/fs/du.js +210 -0
  21. package/dist/builtins/fs/du.js.map +1 -0
  22. package/dist/builtins/fs/edit.d.ts +7 -0
  23. package/dist/builtins/fs/edit.js +104 -0
  24. package/dist/builtins/fs/edit.js.map +1 -0
  25. package/dist/builtins/fs/ls.d.ts +8 -0
  26. package/dist/builtins/fs/ls.js +68 -0
  27. package/dist/builtins/fs/ls.js.map +1 -0
  28. package/dist/builtins/fs/mkdir.d.ts +9 -0
  29. package/dist/builtins/fs/mkdir.js +52 -0
  30. package/dist/builtins/fs/mkdir.js.map +1 -0
  31. package/dist/builtins/fs/mv.d.ts +10 -0
  32. package/dist/builtins/fs/mv.js +88 -0
  33. package/dist/builtins/fs/mv.js.map +1 -0
  34. package/dist/builtins/fs/pull.args.d.ts +22 -0
  35. package/dist/builtins/fs/pull.args.js +30 -0
  36. package/dist/builtins/fs/pull.args.js.map +1 -0
  37. package/dist/builtins/fs/pull.d.ts +26 -0
  38. package/dist/builtins/fs/pull.js +445 -0
  39. package/dist/builtins/fs/pull.js.map +1 -0
  40. package/dist/builtins/fs/pwd.d.ts +10 -0
  41. package/dist/builtins/fs/pwd.js +73 -0
  42. package/dist/builtins/fs/pwd.js.map +1 -0
  43. package/dist/builtins/fs/rm.d.ts +37 -0
  44. package/dist/builtins/fs/rm.js +197 -0
  45. package/dist/builtins/fs/rm.js.map +1 -0
  46. package/dist/builtins/fs/touch.d.ts +9 -0
  47. package/dist/builtins/fs/touch.js +76 -0
  48. package/dist/builtins/fs/touch.js.map +1 -0
  49. package/dist/builtins/fs/tree.d.ts +15 -0
  50. package/dist/builtins/fs/tree.js +84 -0
  51. package/dist/builtins/fs/tree.js.map +1 -0
  52. package/dist/builtins/fs/upload.d.ts +6 -0
  53. package/dist/builtins/fs/upload.js +48 -0
  54. package/dist/builtins/fs/upload.js.map +1 -0
  55. package/dist/builtins/help.d.ts +74 -0
  56. package/dist/builtins/help.js +1217 -0
  57. package/dist/builtins/help.js.map +1 -0
  58. package/dist/builtins/index.d.ts +45 -0
  59. package/dist/builtins/index.js +45 -0
  60. package/dist/builtins/index.js.map +1 -0
  61. package/dist/builtins/net/connect.d.ts +7 -0
  62. package/dist/builtins/net/connect.js +42 -0
  63. package/dist/builtins/net/connect.js.map +1 -0
  64. package/dist/builtins/net/cubepath.d.ts +18 -0
  65. package/dist/builtins/net/cubepath.js +102 -0
  66. package/dist/builtins/net/cubepath.js.map +1 -0
  67. package/dist/builtins/net/logout.d.ts +6 -0
  68. package/dist/builtins/net/logout.js +24 -0
  69. package/dist/builtins/net/logout.js.map +1 -0
  70. package/dist/builtins/net/pacs.d.ts +24 -0
  71. package/dist/builtins/net/pacs.js +121 -0
  72. package/dist/builtins/net/pacs.js.map +1 -0
  73. package/dist/builtins/net/pacsUtils.d.ts +85 -0
  74. package/dist/builtins/net/pacsUtils.js +184 -0
  75. package/dist/builtins/net/pacsUtils.js.map +1 -0
  76. package/dist/builtins/net/query.d.ts +60 -0
  77. package/dist/builtins/net/query.js +324 -0
  78. package/dist/builtins/net/query.js.map +1 -0
  79. package/dist/builtins/parametersofplugin.d.ts +13 -0
  80. package/dist/builtins/parametersofplugin.js +43 -0
  81. package/dist/builtins/parametersofplugin.js.map +1 -0
  82. package/dist/builtins/pluginExecute.d.ts +27 -0
  83. package/dist/builtins/pluginExecute.js +165 -0
  84. package/dist/builtins/pluginExecute.js.map +1 -0
  85. package/dist/builtins/proc.d.ts +6 -0
  86. package/dist/builtins/proc.helpers.d.ts +68 -0
  87. package/dist/builtins/proc.helpers.js +102 -0
  88. package/dist/builtins/proc.helpers.js.map +1 -0
  89. package/dist/builtins/proc.js +289 -0
  90. package/dist/builtins/proc.js.map +1 -0
  91. package/dist/builtins/res/compute.d.ts +6 -0
  92. package/dist/builtins/res/compute.js +55 -0
  93. package/dist/builtins/res/compute.js.map +1 -0
  94. package/dist/builtins/res/feed.d.ts +6 -0
  95. package/dist/builtins/res/feed.js +244 -0
  96. package/dist/builtins/res/feed.js.map +1 -0
  97. package/dist/builtins/res/feed.notes.d.ts +28 -0
  98. package/dist/builtins/res/feed.notes.js +24 -0
  99. package/dist/builtins/res/feed.notes.js.map +1 -0
  100. package/dist/builtins/res/files.d.ts +18 -0
  101. package/dist/builtins/res/files.js +85 -0
  102. package/dist/builtins/res/files.js.map +1 -0
  103. package/dist/builtins/res/group.d.ts +6 -0
  104. package/dist/builtins/res/group.js +54 -0
  105. package/dist/builtins/res/group.js.map +1 -0
  106. package/dist/builtins/res/pipeline.args.d.ts +22 -0
  107. package/dist/builtins/res/pipeline.args.js +28 -0
  108. package/dist/builtins/res/pipeline.args.js.map +1 -0
  109. package/dist/builtins/res/pipeline.d.ts +20 -0
  110. package/dist/builtins/res/pipeline.js +252 -0
  111. package/dist/builtins/res/pipeline.js.map +1 -0
  112. package/dist/builtins/res/plugin.d.ts +13 -0
  113. package/dist/builtins/res/plugin.js +140 -0
  114. package/dist/builtins/res/plugin.js.map +1 -0
  115. package/dist/builtins/res/plugininstance.d.ts +6 -0
  116. package/dist/builtins/res/plugininstance.js +53 -0
  117. package/dist/builtins/res/plugininstance.js.map +1 -0
  118. package/dist/builtins/res/pluginmeta.d.ts +6 -0
  119. package/dist/builtins/res/pluginmeta.js +53 -0
  120. package/dist/builtins/res/pluginmeta.js.map +1 -0
  121. package/dist/builtins/res/tag.d.ts +6 -0
  122. package/dist/builtins/res/tag.js +53 -0
  123. package/dist/builtins/res/tag.js.map +1 -0
  124. package/dist/builtins/res/workflow.d.ts +6 -0
  125. package/dist/builtins/res/workflow.js +53 -0
  126. package/dist/builtins/res/workflow.js.map +1 -0
  127. package/dist/builtins/store.d.ts +6 -0
  128. package/dist/builtins/store.js +107 -0
  129. package/dist/builtins/store.js.map +1 -0
  130. package/dist/builtins/sys/context.d.ts +6 -0
  131. package/dist/builtins/sys/context.js +50 -0
  132. package/dist/builtins/sys/context.js.map +1 -0
  133. package/dist/builtins/sys/physicalmode.d.ts +8 -0
  134. package/dist/builtins/sys/physicalmode.js +34 -0
  135. package/dist/builtins/sys/physicalmode.js.map +1 -0
  136. package/dist/builtins/sys/timing.d.ts +8 -0
  137. package/dist/builtins/sys/timing.js +34 -0
  138. package/dist/builtins/sys/timing.js.map +1 -0
  139. package/dist/builtins/sys/version.d.ts +15 -0
  140. package/dist/builtins/sys/version.js +23 -0
  141. package/dist/builtins/sys/version.js.map +1 -0
  142. package/dist/builtins/sys/whoami.d.ts +17 -0
  143. package/dist/builtins/sys/whoami.js +44 -0
  144. package/dist/builtins/sys/whoami.js.map +1 -0
  145. package/dist/builtins/utils.d.ts +55 -0
  146. package/dist/builtins/utils.js +145 -0
  147. package/dist/builtins/utils.js.map +1 -0
  148. package/dist/builtins/wildcard.d.ts +26 -0
  149. package/dist/builtins/wildcard.js +120 -0
  150. package/dist/builtins/wildcard.js.map +1 -0
  151. package/dist/command-keys.d.ts +8 -0
  152. package/dist/command-keys.js +32 -0
  153. package/dist/command-keys.js.map +1 -0
  154. package/dist/config/storeConfig.d.ts +57 -0
  155. package/dist/config/storeConfig.js +78 -0
  156. package/dist/config/storeConfig.js.map +1 -0
  157. package/dist/core/chiliDelegate.d.ts +21 -0
  158. package/dist/core/chiliDelegate.js +32 -0
  159. package/dist/core/chiliDelegate.js.map +1 -0
  160. package/dist/core/connect.d.ts +38 -0
  161. package/dist/core/connect.js +46 -0
  162. package/dist/core/connect.js.map +1 -0
  163. package/dist/core/dispatch.d.ts +95 -0
  164. package/dist/core/dispatch.js +618 -0
  165. package/dist/core/dispatch.js.map +1 -0
  166. package/dist/core/engine.d.ts +91 -0
  167. package/dist/core/engine.js +222 -0
  168. package/dist/core/engine.js.map +1 -0
  169. package/dist/core/preprocess.d.ts +46 -0
  170. package/dist/core/preprocess.js +146 -0
  171. package/dist/core/preprocess.js.map +1 -0
  172. package/dist/core/progress.d.ts +50 -0
  173. package/dist/core/progress.js +21 -0
  174. package/dist/core/progress.js.map +1 -0
  175. package/dist/core/promptContext.d.ts +49 -0
  176. package/dist/core/promptContext.js +39 -0
  177. package/dist/core/promptContext.js.map +1 -0
  178. package/dist/core/question.d.ts +27 -0
  179. package/dist/core/question.js +33 -0
  180. package/dist/core/question.js.map +1 -0
  181. package/dist/core/sink.d.ts +207 -0
  182. package/dist/core/sink.js +329 -0
  183. package/dist/core/sink.js.map +1 -0
  184. package/dist/core/surface.d.ts +172 -0
  185. package/dist/core/surface.js +105 -0
  186. package/dist/core/surface.js.map +1 -0
  187. package/dist/core/version.d.ts +20 -0
  188. package/dist/core/version.js +82 -0
  189. package/dist/core/version.js.map +1 -0
  190. package/dist/index.d.ts +31 -0
  191. package/dist/index.js +32 -0
  192. package/dist/index.js.map +1 -0
  193. package/dist/lib/completer/index.d.ts +15 -0
  194. package/dist/lib/completer/index.js +212 -0
  195. package/dist/lib/completer/index.js.map +1 -0
  196. package/dist/lib/completer/pathComplete.helpers.d.ts +22 -0
  197. package/dist/lib/completer/pathComplete.helpers.js +49 -0
  198. package/dist/lib/completer/pathComplete.helpers.js.map +1 -0
  199. package/dist/lib/parser.d.ts +13 -0
  200. package/dist/lib/parser.js +52 -0
  201. package/dist/lib/parser.js.map +1 -0
  202. package/dist/lib/pipe.d.ts +11 -0
  203. package/dist/lib/pipe.js +90 -0
  204. package/dist/lib/pipe.js.map +1 -0
  205. package/dist/lib/prefetch.d.ts +25 -0
  206. package/dist/lib/prefetch.js +64 -0
  207. package/dist/lib/prefetch.js.map +1 -0
  208. package/dist/lib/semicolonParser.d.ts +22 -0
  209. package/dist/lib/semicolonParser.js +53 -0
  210. package/dist/lib/semicolonParser.js.map +1 -0
  211. package/dist/lib/spinner.d.ts +23 -0
  212. package/dist/lib/spinner.js +71 -0
  213. package/dist/lib/spinner.js.map +1 -0
  214. package/dist/lib/vfs/providers/static.d.ts +65 -0
  215. package/dist/lib/vfs/providers/static.js +164 -0
  216. package/dist/lib/vfs/providers/static.js.map +1 -0
  217. package/dist/lib/vfs/providers/static_content.d.ts +27 -0
  218. package/dist/lib/vfs/providers/static_content.js +180 -0
  219. package/dist/lib/vfs/providers/static_content.js.map +1 -0
  220. package/dist/lib/vfs/vfs.d.ts +59 -0
  221. package/dist/lib/vfs/vfs.js +202 -0
  222. package/dist/lib/vfs/vfs.js.map +1 -0
  223. package/dist/session/index.d.ts +76 -0
  224. package/dist/session/index.js +120 -0
  225. package/dist/session/index.js.map +1 -0
  226. package/package.json +58 -0
@@ -0,0 +1,197 @@
1
+ /**
2
+ * @file Builtin rm command.
3
+ * Removes files or directories, reported as a command envelope.
4
+ */
5
+ import chalk from 'chalk';
6
+ import path from 'path';
7
+ import * as readline from 'readline';
8
+ import { listCache_get, envelope_ok, envelope_error } from '@fnndsc/cumin';
9
+ import { path_resolve } from '../utils.js';
10
+ import { files_rm as chefs_rm_cmd } from '@fnndsc/chili/commands/fs/rm.js';
11
+ import { rm_render } from '@fnndsc/chili/views/fs.js';
12
+ import { sink_get } from '../../core/sink.js';
13
+ /**
14
+ * Prompts the user for confirmation.
15
+ *
16
+ * @param message - The prompt message.
17
+ * @returns A Promise resolving to true if user confirms (y/Y), false otherwise.
18
+ */
19
+ async function prompt_confirm(message) {
20
+ return new Promise((resolve) => {
21
+ const rl = readline.createInterface({
22
+ input: process.stdin,
23
+ output: process.stdout
24
+ });
25
+ rl.question(message, (answer) => {
26
+ rl.close();
27
+ const confirmed = answer.trim().toLowerCase() === 'y';
28
+ resolve(confirmed);
29
+ });
30
+ });
31
+ }
32
+ /**
33
+ * Parses `rm` arguments, supporting combined short flags (`-rf`, `-rfi`) and the
34
+ * `--` end-of-options separator.
35
+ *
36
+ * @param args - Raw command arguments.
37
+ * @returns The parsed flags and path operands.
38
+ */
39
+ export function rmArgs_parse(args) {
40
+ let recursive = false;
41
+ let force = false;
42
+ let interactive = false;
43
+ const paths = [];
44
+ let endOfOptions = false;
45
+ for (const arg of args) {
46
+ if (arg === '--') {
47
+ endOfOptions = true;
48
+ continue;
49
+ }
50
+ if (endOfOptions) {
51
+ paths.push(arg);
52
+ continue;
53
+ }
54
+ if (arg.startsWith('-') && arg.length > 1) {
55
+ for (const ch of arg.substring(1)) {
56
+ if (ch === 'r' || ch === 'R')
57
+ recursive = true;
58
+ else if (ch === 'f')
59
+ force = true;
60
+ else if (ch === 'i')
61
+ interactive = true;
62
+ }
63
+ }
64
+ else if (!arg.startsWith('-')) {
65
+ paths.push(arg);
66
+ }
67
+ }
68
+ return { recursive, force, interactive, paths };
69
+ }
70
+ /**
71
+ * Formats the multi-target removal summary line.
72
+ *
73
+ * @param successCount - Number of items removed successfully.
74
+ * @param failCount - Number of items that failed to remove.
75
+ * @returns The summary string, or null if there is nothing to summarise.
76
+ */
77
+ export function rmSummary_format(successCount, failCount) {
78
+ if (!(successCount > 0 || failCount > 0))
79
+ return null;
80
+ if (successCount > 0 && failCount === 0) {
81
+ return chalk.green(`Successfully removed ${successCount} item${successCount !== 1 ? 's' : ''}`);
82
+ }
83
+ if (successCount > 0 && failCount > 0) {
84
+ return chalk.yellow(`Removed ${successCount} item${successCount !== 1 ? 's' : ''}, failed ${failCount}`);
85
+ }
86
+ return chalk.red(`Failed to remove ${failCount} item${failCount !== 1 ? 's' : ''}`);
87
+ }
88
+ /**
89
+ * Removes one or more files or directories.
90
+ *
91
+ * In interactive mode (-i) output is streamed live through the sink so each
92
+ * confirmation prompt appears in sequence with its result; the envelope then
93
+ * carries only the model. Otherwise output is buffered into the envelope.
94
+ *
95
+ * @param args - Command line arguments (flags and paths).
96
+ * @returns An envelope whose model lists per-target outcomes.
97
+ */
98
+ export async function builtin_rm(args) {
99
+ const { recursive, force, interactive, paths } = rmArgs_parse(args);
100
+ if (paths.length === 0) {
101
+ return envelope_error('', undefined, `${chalk.red('Usage: rm [-rf] <path> [path...]')}\n`);
102
+ }
103
+ const options = { recursive, force };
104
+ let successCount = 0;
105
+ let failCount = 0;
106
+ let rendered = '';
107
+ let renderedErr = '';
108
+ const outcomes = [];
109
+ /**
110
+ * Emits one line of stdout output: streamed live in interactive mode,
111
+ * buffered into the envelope otherwise.
112
+ *
113
+ * @param line - The line to emit (without trailing newline).
114
+ */
115
+ const out_emit = (line) => {
116
+ if (interactive) {
117
+ sink_get().data_write(`${line}\n`);
118
+ }
119
+ else {
120
+ rendered += `${line}\n`;
121
+ }
122
+ };
123
+ /**
124
+ * Emits one line of error output: streamed live in interactive mode,
125
+ * buffered into the envelope otherwise.
126
+ *
127
+ * @param line - The line to emit (without trailing newline).
128
+ */
129
+ const err_emit = (line) => {
130
+ if (interactive) {
131
+ sink_get().err_write(`${line}\n`);
132
+ }
133
+ else {
134
+ renderedErr += `${line}\n`;
135
+ }
136
+ };
137
+ for (const pathArg of paths) {
138
+ try {
139
+ const target = await path_resolve(pathArg);
140
+ if (target.startsWith('/bin/')) {
141
+ err_emit(chalk.red(`rm: cannot remove '${pathArg}': virtual /bin directory`));
142
+ outcomes.push({ path: pathArg, removed: false, skipped: false });
143
+ failCount++;
144
+ continue;
145
+ }
146
+ if (interactive) {
147
+ const confirmed = await prompt_confirm(`rm: remove '${pathArg}'? (y/n): `);
148
+ if (!confirmed) {
149
+ out_emit(chalk.gray(`skipped '${pathArg}'`));
150
+ outcomes.push({ path: pathArg, removed: false, skipped: true });
151
+ continue;
152
+ }
153
+ }
154
+ const result = await chefs_rm_cmd(target, options);
155
+ if (result.success) {
156
+ if (paths.length > 1) {
157
+ out_emit(chalk.gray(`removed '${pathArg}'`));
158
+ }
159
+ else {
160
+ out_emit(rm_render(result));
161
+ }
162
+ outcomes.push({ path: pathArg, removed: true, skipped: false });
163
+ successCount++;
164
+ const listCache = listCache_get();
165
+ const parentDir = path.posix.dirname(target);
166
+ listCache.cache_invalidate(parentDir);
167
+ }
168
+ else {
169
+ err_emit(chalk.red(`rm: cannot remove '${pathArg}': ${result.error || 'unknown error'}`));
170
+ outcomes.push({ path: pathArg, removed: false, skipped: false });
171
+ failCount++;
172
+ }
173
+ }
174
+ catch (e) {
175
+ const msg = e instanceof Error ? e.message : String(e);
176
+ err_emit(chalk.red(`rm: cannot remove '${pathArg}': ${msg}`));
177
+ outcomes.push({ path: pathArg, removed: false, skipped: false });
178
+ failCount++;
179
+ }
180
+ }
181
+ if (paths.length > 1) {
182
+ const summary = rmSummary_format(successCount, failCount);
183
+ if (summary) {
184
+ out_emit('');
185
+ out_emit(summary);
186
+ }
187
+ }
188
+ const model = { kind: 'fs.rm', data: outcomes };
189
+ if (failCount > 0) {
190
+ const envelope = envelope_error(rendered, undefined, renderedErr || undefined);
191
+ envelope.model = model;
192
+ return envelope;
193
+ }
194
+ const envelope = envelope_ok(rendered, model);
195
+ return envelope;
196
+ }
197
+ //# sourceMappingURL=rm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rm.js","sourceRoot":"","sources":["../../../src/builtins/fs/rm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { CommandEnvelope } from '@fnndsc/cumin';
2
+ /**
3
+ * Creates empty files or updates timestamps.
4
+ *
5
+ * @param args - Command line arguments (file paths).
6
+ * @returns An envelope whose rendered text reports each created file and
7
+ * whose model lists per-target outcomes.
8
+ */
9
+ export declare function builtin_touch(args: string[]): Promise<CommandEnvelope>;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @file Builtin touch command.
3
+ * Creates files, reported as a command envelope.
4
+ */
5
+ import chalk from 'chalk';
6
+ import path from 'path';
7
+ import { listCache_get, errorStack, envelope_ok, envelope_error } from '@fnndsc/cumin';
8
+ import { commandArgs_process, path_resolve, error_stripDebugPrefix } from '../utils.js';
9
+ import { files_touch as chefs_touch_cmd } from '@fnndsc/chili/commands/fs/touch.js';
10
+ import { touch_render } from '@fnndsc/chili/views/fs.js';
11
+ /**
12
+ * Creates empty files or updates timestamps.
13
+ *
14
+ * @param args - Command line arguments (file paths).
15
+ * @returns An envelope whose rendered text reports each created file and
16
+ * whose model lists per-target outcomes.
17
+ */
18
+ export async function builtin_touch(args) {
19
+ const parsed = commandArgs_process(args);
20
+ const pathArgs = parsed._;
21
+ if (pathArgs.length === 0) {
22
+ return envelope_error('', undefined, `${chalk.red('Usage: touch [--withContents <string>] [--withContentsFromFile <file>] <file>')}\n`);
23
+ }
24
+ // Build options from parsed flags
25
+ const options = {};
26
+ if (parsed['withContents']) {
27
+ options.withContents = String(parsed['withContents']);
28
+ }
29
+ if (parsed['withContentsFromFile']) {
30
+ options.withContentsFromFile = String(parsed['withContentsFromFile']);
31
+ }
32
+ // Only process the first file argument when using content options
33
+ const filesToTouch = (options.withContents || options.withContentsFromFile)
34
+ ? [pathArgs[0]] // Only one file when injecting content
35
+ : pathArgs; // Multiple files allowed for empty touch
36
+ let rendered = '';
37
+ let renderedErr = '';
38
+ const outcomes = [];
39
+ for (const pathArg of filesToTouch) {
40
+ try {
41
+ const targetPath = await path_resolve(pathArg);
42
+ const success = await chefs_touch_cmd(targetPath, options);
43
+ if (success) {
44
+ rendered += `${touch_render(targetPath, success)}\n`;
45
+ outcomes.push({ path: targetPath, created: true });
46
+ // Invalidate cache for parent directory
47
+ const listCache = listCache_get();
48
+ const parentDir = path.posix.dirname(targetPath);
49
+ listCache.cache_invalidate(parentDir);
50
+ }
51
+ else {
52
+ // Touch failed, report the error from errorStack
53
+ const lastError = errorStack.stack_pop();
54
+ renderedErr += `${chalk.red(`Failed to create file: ${targetPath}`)}\n`;
55
+ if (lastError) {
56
+ renderedErr += `${chalk.gray(` ${error_stripDebugPrefix(lastError.message)}`)}\n`;
57
+ }
58
+ outcomes.push({ path: targetPath, created: false });
59
+ }
60
+ }
61
+ catch (e) {
62
+ const msg = e instanceof Error ? e.message : String(e);
63
+ renderedErr += `${chalk.red(`touch: ${pathArg}: ${msg}`)}\n`;
64
+ outcomes.push({ path: pathArg, created: false });
65
+ }
66
+ }
67
+ const anyFailed = outcomes.some((outcome) => !outcome.created);
68
+ const model = { kind: 'fs.touch', data: outcomes };
69
+ if (anyFailed) {
70
+ const envelope = envelope_error(rendered, undefined, renderedErr || undefined);
71
+ envelope.model = model;
72
+ return envelope;
73
+ }
74
+ return envelope_ok(rendered, model);
75
+ }
76
+ //# sourceMappingURL=touch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"touch.js","sourceRoot":"","sources":["../../../src/builtins/fs/touch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAmB,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAExG,OAAO,EAAc,mBAAmB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,WAAW,IAAI,eAAe,EAAgB,MAAM,oCAAoC,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAQzD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,MAAM,GAAe,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAa,MAAM,CAAC,CAAa,CAAC;IAEhD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,cAAc,CACnB,EAAE,EACF,SAAS,EACT,GAAG,KAAK,CAAC,GAAG,CAAC,+EAA+E,CAAC,IAAI,CAClG,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,kEAAkE;IAClE,MAAM,YAAY,GAAa,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;QACnF,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,uCAAuC;QACxD,CAAC,CAAC,QAAQ,CAAC,CAAM,yCAAyC;IAE5D,IAAI,QAAQ,GAAW,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAW,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAW,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,OAAO,GAAY,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEpE,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEnD,wCAAwC;gBACxC,MAAM,SAAS,GAAc,aAAa,EAAE,CAAC;gBAC7C,MAAM,SAAS,GAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACzD,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,MAAM,SAAS,GAA6B,UAAU,CAAC,SAAS,EAAE,CAAC;gBACnE,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,IAAI,CAAC;gBACxE,IAAI,SAAS,EAAE,CAAC;oBACd,WAAW,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;gBACrF,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,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,15 @@
1
+ /**
2
+ * Displays a directory tree of the ChRIS filesystem.
3
+ * Uses chili's scan_do machinery for recursive filesystem traversal.
4
+ *
5
+ * @param args - Command line arguments (optional path and flags).
6
+ * @returns A Promise that resolves when the tree is displayed.
7
+ *
8
+ * @example
9
+ * ```
10
+ * tree # Tree of current directory
11
+ * tree /home/user/data # Tree of specific path
12
+ * tree --follow # Follow symbolic links
13
+ * ```
14
+ */
15
+ export declare function builtin_tree(args: string[]): Promise<void>;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @file Builtin tree command.
3
+ * Displays directory structure.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { commandArgs_process, path_resolve, error_stripDebugPrefix } from '../utils.js';
7
+ import { session } from '../../session/index.js';
8
+ import { spinner } from '../../lib/spinner.js';
9
+ import { errorStack } from '@fnndsc/cumin';
10
+ import { scan_do, archyTree_create } from '@fnndsc/chili/path/pathCommand.js';
11
+ import { bytes_format } from '@fnndsc/chili/commands/fs/upload.js';
12
+ /**
13
+ * Displays a directory tree of the ChRIS filesystem.
14
+ * Uses chili's scan_do machinery for recursive filesystem traversal.
15
+ *
16
+ * @param args - Command line arguments (optional path and flags).
17
+ * @returns A Promise that resolves when the tree is displayed.
18
+ *
19
+ * @example
20
+ * ```
21
+ * tree # Tree of current directory
22
+ * tree /home/user/data # Tree of specific path
23
+ * tree --follow # Follow symbolic links
24
+ * ```
25
+ */
26
+ export async function builtin_tree(args) {
27
+ const parsed = commandArgs_process(args);
28
+ const pathArgs = parsed._;
29
+ const pathMode = !!parsed['path'];
30
+ // Determine target path
31
+ let targetPath;
32
+ if (pathArgs.length > 0) {
33
+ targetPath = await path_resolve(pathArgs[0]);
34
+ }
35
+ // Build scan options
36
+ const scanOptions = {
37
+ silent: true,
38
+ tree: false, // We'll format it ourselves
39
+ follow: !!parsed['follow'],
40
+ dirsOnly: false,
41
+ };
42
+ // If path specified, temporarily set context
43
+ const originalFolder = await session.getCWD();
44
+ if (targetPath) {
45
+ await session.setCWD(targetPath);
46
+ }
47
+ try {
48
+ spinner.start(`Scanning ${targetPath || 'current directory'}...`);
49
+ const scanResult = await scan_do(scanOptions);
50
+ if (!scanResult) {
51
+ spinner.stop();
52
+ const lastError = errorStack.stack_pop();
53
+ if (lastError) {
54
+ console.error(chalk.red(error_stripDebugPrefix(lastError.message)));
55
+ }
56
+ else {
57
+ console.error(chalk.red('Failed to scan directory tree.'));
58
+ }
59
+ return;
60
+ }
61
+ spinner.stop();
62
+ if (pathMode) {
63
+ // --path: emit one full chrisPath per entry — grep-friendly
64
+ for (const item of scanResult.fileInfo) {
65
+ console.log(item.chrisPath);
66
+ }
67
+ }
68
+ else {
69
+ // Default: ASCII tree
70
+ const treeOutput = archyTree_create(scanResult.fileInfo);
71
+ console.log(treeOutput);
72
+ }
73
+ // Display summary
74
+ console.log(chalk.green(`Total size: ${bytes_format(scanResult.totalSize)}`));
75
+ console.log(chalk.gray(`${scanResult.fileInfo.length} items`));
76
+ }
77
+ finally {
78
+ // Restore original path
79
+ if (targetPath) {
80
+ await session.setCWD(originalFolder);
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/builtins/fs/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Uploads a local file or directory to ChRIS.
3
+ *
4
+ * @param args - [localPath, remotePath]
5
+ */
6
+ export declare function builtin_upload(args: string[]): Promise<void>;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @file Builtin upload command.
3
+ * Uploads files to ChRIS.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { path_resolve } from '../utils.js';
7
+ import { files_uploadWithProgress as chefs_upload_cmd, bytes_format } from '@fnndsc/chili/commands/fs/upload.js';
8
+ import { listCache_get } from '@fnndsc/cumin';
9
+ import { sink_get } from '../../core/sink.js';
10
+ /**
11
+ * Uploads a local file or directory to ChRIS.
12
+ *
13
+ * @param args - [localPath, remotePath]
14
+ */
15
+ export async function builtin_upload(args) {
16
+ if (args.length < 2) {
17
+ console.log(chalk.red('Usage: upload <local_path> <remote_path>'));
18
+ return;
19
+ }
20
+ const localPath = args[0];
21
+ const remotePath = args[1];
22
+ const targetRemote = await path_resolve(remotePath);
23
+ try {
24
+ const summary = await chefs_upload_cmd(localPath, targetRemote, {
25
+ onProgress: event => sink_get().progress_write(event),
26
+ });
27
+ console.log('');
28
+ if (summary.failedCount === 0) {
29
+ console.log(chalk.green(`✓ Successfully uploaded ${summary.transferredCount} file(s)`));
30
+ }
31
+ else {
32
+ console.log(chalk.yellow(`⚠ Uploaded ${summary.transferredCount} file(s), ${summary.failedCount} failed`));
33
+ }
34
+ console.log(chalk.gray(` Total: ${bytes_format(summary.transferSize)} in ${summary.duration.toFixed(1)}s (${bytes_format(summary.speed)}/s)`));
35
+ // Invalidate cache for actual target directory where files were uploaded
36
+ if (summary.transferredCount > 0) {
37
+ const listCache = listCache_get();
38
+ listCache.cache_invalidate(summary.actualTargetPath);
39
+ // Also invalidate parent to refresh its listing
40
+ listCache.cache_invalidate(targetRemote);
41
+ }
42
+ }
43
+ catch (e) {
44
+ const msg = e instanceof Error ? e.message : String(e);
45
+ console.error(chalk.red(`Upload error: ${msg}`));
46
+ }
47
+ }
48
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/builtins/fs/upload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,wBAAwB,IAAI,gBAAgB,EAAiB,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAChI,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,UAAU,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,YAAY,GAAW,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAkB,MAAM,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE;YAC7E,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;SACtD,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,gBAAgB,UAAU,CAAC,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,OAAO,CAAC,gBAAgB,aAAa,OAAO,CAAC,WAAW,SAAS,CAAC,CAAC,CAAC;QAC7G,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhJ,yEAAyE;QACzE,IAAI,OAAO,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;YAClC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACrD,gDAAgD;YAChD,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
@@ -0,0 +1,74 @@
1
+ interface CommandHelp {
2
+ usage: string;
3
+ summary?: string;
4
+ description: string;
5
+ subcommands?: string[];
6
+ options?: string[];
7
+ examples?: string[];
8
+ }
9
+ /**
10
+ * Standard subcommands and options injected into every resource help entry.
11
+ * Captures the Resource Contract documented in CONTEXT.md.
12
+ */
13
+ export declare const RESOURCE_LIST_OPTIONS: string[];
14
+ /**
15
+ * Help-text registry keyed by builtin command name.
16
+ */
17
+ export declare const helpText: Record<string, CommandHelp>;
18
+ /**
19
+ * Displays help text for a command.
20
+ *
21
+ * @param command - The command to display help for.
22
+ */
23
+ /**
24
+ * Formats and returns the detailed help text for a specific command as a string.
25
+ *
26
+ * @param command - The command name to retrieve help for.
27
+ /**
28
+ * Word-wraps a flat string to fit within a given width, with uniform indentation.
29
+ *
30
+ * @param str - Input text (single line or freeform).
31
+ * @param width - Total line width including indent (default 78).
32
+ * @param indent - Leading spaces on every line (default 2).
33
+ * @returns Multi-line string, each line at most `width` chars wide.
34
+ */
35
+ export declare function text_boxFormat(str: string, width?: number, indent?: number): string;
36
+ /**
37
+ * @returns The formatted help text string, or undefined if no help exists.
38
+ */
39
+ export declare function commandHelp_get(command: string): string | undefined;
40
+ /**
41
+ * Displays help text for a command.
42
+ *
43
+ * @param command - The command to display help for.
44
+ */
45
+ export declare function help_show(command: string): void;
46
+ /**
47
+ * Checks if arguments contain --help flag.
48
+ * -h is treated as help unless the command uses it for "human-readable" (ls, du).
49
+ *
50
+ * @param args - Command arguments.
51
+ * @param command - The command name (optional).
52
+ * @returns True if help is requested.
53
+ */
54
+ export declare function args_checkHasHelpFlag(args: string[], command?: string): boolean;
55
+ /**
56
+ * Builtin help command - displays command list or specific command help.
57
+ *
58
+ * @param args - Command arguments (optional command name).
59
+ */
60
+ export declare function builtin_help(args: string[]): Promise<void>;
61
+ /**
62
+ * Gets the list of all builtin command names.
63
+ *
64
+ * @returns Array of builtin command names.
65
+ */
66
+ export declare function builtinCommands_list(): string[];
67
+ /**
68
+ * Gets the description for a builtin command.
69
+ *
70
+ * @param command - The command name.
71
+ * @returns The command description, or undefined if not found.
72
+ */
73
+ export declare function builtinCommand_descriptionGet(command: string): string | undefined;
74
+ export {};