@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
420 lines • 23.9 kB
JavaScript
// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
import { CommandSpec, Argument } from "../types.js";
import { PATHS_OPERAND } from "../constants.js";
export const SPECS = {
awk: new CommandSpec({
arguments: [
new Argument('-F'),
new Argument('-v', { action: 'append' }),
new Argument('-f', { action: 'append', type: 'path' }),
new Argument('text', { metavar: '', nargs: '?', providedBy: ['-f'] }),
PATHS_OPERAND,
],
}),
grep: new CommandSpec({
arguments: [
new Argument(['-r', '--recursive'], { action: 'store_true' }),
new Argument(['-R', '--dereference-recursive'], { action: 'store_true' }),
// -r and -R are --directories=recurse; the last of the three on the
// line wins.
new Argument(['-d', '--directories']),
// A device is read only when named; a walk never opens one.
new Argument(['-D', '--devices']),
// -y is GNU's obsolete spelling of -i.
new Argument(['-i', '-y', '--ignore-case'], { action: 'store_true' }),
new Argument('--no-ignore-case', { action: 'store_true' }),
new Argument('-I', { action: 'store_true' }),
new Argument(['-v', '--invert-match'], { action: 'store_true' }),
new Argument(['-n', '--line-number'], { action: 'store_true' }),
new Argument('--binary-files'),
new Argument(['-c', '--count'], { action: 'store_true' }),
new Argument(['-l', '--files-with-matches'], { action: 'store_true' }),
new Argument(['-L', '--files-without-match'], { action: 'store_true' }),
new Argument(['-w', '--word-regexp'], { action: 'store_true' }),
new Argument(['-x', '--line-regexp'], { action: 'store_true' }),
// --fixed-regexp is GNU's older name for --fixed-strings.
new Argument(['-F', '--fixed-strings', '--fixed-regexp'], { action: 'store_true' }),
new Argument(['-E', '--extended-regexp'], { action: 'store_true' }),
new Argument(['-G', '--basic-regexp'], { action: 'store_true' }),
new Argument(['-P', '--perl-regexp'], { action: 'store_true' }),
new Argument(['-z', '--null-data'], { action: 'store_true' }),
new Argument(['-o', '--only-matching'], { action: 'store_true' }),
new Argument(['-q', '--quiet', '--silent'], { action: 'store_true' }),
new Argument(['-s', '--no-messages'], { action: 'store_true' }),
new Argument(['-H', '--with-filename'], { action: 'store_true' }),
new Argument(['-h', '--no-filename'], { action: 'store_true' }),
new Argument('--label'),
new Argument(['-Z', '--null'], { action: 'store_true' }),
new Argument(['-T', '--initial-tab'], { action: 'store_true' }),
new Argument(['-m', '--max-count']),
new Argument(['-A', '--after-context']),
new Argument(['-B', '--before-context']),
// -NUM is -C NUM.
new Argument(['-C', '--context'], { numericShorthand: true }),
new Argument('--group-separator'),
new Argument('--no-group-separator', { action: 'store_true' }),
new Argument(['-e', '--regexp'], { action: 'append' }),
new Argument(['-f', '--file'], { action: 'append', type: 'path' }),
new Argument(['-a', '--text'], { action: 'store_true' }),
new Argument(['-b', '--byte-offset'], { action: 'store_true' }),
new Argument('--include', { action: 'append' }),
new Argument('--exclude', { action: 'append' }),
new Argument('--exclude-from', { action: 'append', type: 'path' }),
new Argument('--exclude-dir', { action: 'append' }),
// The version, like the --version registration supplies.
new Argument('-V', { action: 'store_true' }),
// Accepted no-ops: output is never a tty, so plain output is exactly
// what GNU produces with --color=auto (#471); -U only matters where a
// line can end in CR LF, and -u is obsolete (GNU warns and ignores it).
new Argument('--color', { nargs: '?', attachedOnly: true }),
new Argument('--colour', { nargs: '?', attachedOnly: true }),
new Argument('--line-buffered', { action: 'store_true' }),
new Argument(['-U', '--binary'], { action: 'store_true' }),
new Argument(['-u', '--unix-byte-offsets'], { action: 'store_true' }),
new Argument('text', { metavar: '', nargs: '?', providedBy: ['-e', '-f'] }),
PATHS_OPERAND,
],
}),
jq: new CommandSpec({
arguments: [
new Argument(['-n', '--null-input'], {
action: 'store_true',
help: 'Use null as the single input value',
}),
new Argument(['-R', '--raw-input'], {
action: 'store_true',
help: 'Read each line as a string instead of JSON',
}),
new Argument(['-s', '--slurp'], {
action: 'store_true',
help: 'Read all inputs into one array',
}),
new Argument(['-c', '--compact-output'], {
action: 'store_true',
help: 'Compact instead of pretty-printed output',
}),
new Argument(['-r', '--raw-output'], {
action: 'store_true',
help: 'Output strings without quotes or escapes',
}),
new Argument('--raw-output0', {
action: 'store_true',
help: 'Implies -r and writes NUL after each output',
}),
new Argument(['-j', '--join-output'], {
action: 'store_true',
help: 'Implies -r and writes no trailing newline',
}),
new Argument(['-a', '--ascii-output'], {
action: 'store_true',
help: 'Escape non-ASCII characters in output',
}),
new Argument(['-S', '--sort-keys'], {
action: 'store_true',
help: 'Sort object keys on output',
}),
new Argument(['-e', '--exit-status'], {
action: 'store_true',
help: 'Set the exit status from the last output',
}),
new Argument('--tab', { action: 'store_true', help: 'Indent with tabs' }),
new Argument('--indent', { help: 'Indent with n spaces (max 7)' }),
new Argument(['-M', '--monochrome-output'], {
action: 'store_true',
help: 'Disable colored output (already the default)',
}),
new Argument('--unbuffered', {
action: 'store_true',
help: 'Accepted for compatibility; output is one buffer',
}),
new Argument(['-f', '--from-file'], { type: 'path', help: 'Read the filter from a file' }),
new Argument('--stream', {
action: 'store_true',
help: 'Read each input as its [path, leaf] events',
}),
new Argument('--seq', {
action: 'store_true',
help: 'Read and write RS-delimited JSON text sequences',
}),
new Argument('--arg', {
action: 'extend',
nargs: 2,
valueTypes: ['str', 'str'],
help: 'Set $name to a string value',
}),
new Argument('--argjson', {
action: 'extend',
nargs: 2,
valueTypes: ['str', 'str'],
help: 'Set $name to a JSON value',
}),
new Argument('--rawfile', {
action: 'extend',
nargs: 2,
type: 'path',
valueTypes: ['str', 'path'],
help: "Set $name to a file's contents",
}),
new Argument('--slurpfile', {
action: 'extend',
nargs: 2,
type: 'path',
valueTypes: ['str', 'path'],
help: "Set $name to a file's documents, as an array",
}),
new Argument('--args', {
action: 'store_true',
help: 'Read the remaining operands as positional string values',
}),
new Argument('--jsonargs', {
action: 'store_true',
help: 'Read the remaining operands as positional JSON values',
}),
new Argument(['-h', '--help'], { action: 'store_true', help: 'Show this help and exit' }),
new Argument(['-V', '--version'], {
action: 'store_true',
help: 'Show version information and exit',
}),
new Argument('text', { metavar: '', nargs: '?', providedBy: ['-f'] }),
new Argument('paths', {
metavar: '',
type: 'path',
nargs: '*',
textWhen: ['--args', '--jsonargs'],
}),
],
allowAbbrev: false,
}),
rg: new CommandSpec({
arguments: [
new Argument(['-e', '--regexp'], { action: 'append' }),
new Argument(['-f', '--file'], { action: 'append', type: 'path' }),
new Argument(['-i', '--ignore-case'], { action: 'store_true' }),
new Argument(['-s', '--case-sensitive'], { action: 'store_true' }),
new Argument(['-S', '--smart-case'], { action: 'store_true' }),
new Argument(['-v', '--invert-match'], { action: 'store_true' }),
new Argument('--no-invert-match', { action: 'store_true' }),
new Argument(['-w', '--word-regexp'], { action: 'store_true' }),
new Argument(['-x', '--line-regexp'], { action: 'store_true' }),
new Argument(['-F', '--fixed-strings'], { action: 'store_true' }),
new Argument('--no-fixed-strings', { action: 'store_true' }),
new Argument(['-m', '--max-count']),
new Argument('--stop-on-nonmatch', { action: 'store_true' }),
new Argument(['-n', '--line-number'], { action: 'store_true' }),
new Argument(['-N', '--no-line-number'], { action: 'store_true' }),
new Argument(['-b', '--byte-offset'], { action: 'store_true' }),
new Argument('--no-byte-offset', { action: 'store_true' }),
new Argument('--column', { action: 'store_true' }),
new Argument('--no-column', { action: 'store_true' }),
new Argument('--vimgrep', { action: 'store_true' }),
new Argument(['-o', '--only-matching'], { action: 'store_true' }),
new Argument(['-r', '--replace']),
new Argument('--trim', { action: 'store_true' }),
new Argument('--no-trim', { action: 'store_true' }),
new Argument(['-M', '--max-columns']),
new Argument('--max-columns-preview', { action: 'store_true' }),
new Argument('--no-max-columns-preview', { action: 'store_true' }),
new Argument(['-0', '--null'], { action: 'store_true' }),
new Argument('--null-data', { action: 'store_true' }),
new Argument('--path-separator'),
new Argument(['-q', '--quiet'], { action: 'store_true' }),
new Argument(['-c', '--count'], { action: 'store_true' }),
new Argument('--count-matches', { action: 'store_true' }),
new Argument('--include-zero', { action: 'store_true' }),
new Argument('--no-include-zero', { action: 'store_true' }),
new Argument(['-l', '--files-with-matches'], { action: 'store_true' }),
new Argument('--files-without-match', { action: 'store_true' }),
new Argument('--files', { action: 'store_true' }),
new Argument('--type-list', { action: 'store_true' }),
new Argument(['-H', '--with-filename'], { action: 'store_true' }),
new Argument(['-I', '--no-filename'], { action: 'store_true' }),
new Argument('--heading', { action: 'store_true' }),
new Argument('--no-heading', { action: 'store_true' }),
new Argument(['-A', '--after-context']),
new Argument(['-B', '--before-context']),
new Argument(['-C', '--context']),
new Argument('--passthru', { action: 'store_true' }),
new Argument('--passthrough', { action: 'store_true' }),
new Argument('--context-separator'),
new Argument('--no-context-separator', { action: 'store_true' }),
new Argument('--field-match-separator'),
new Argument('--field-context-separator'),
new Argument(['-g', '--glob'], { action: 'append' }),
new Argument('--iglob', { action: 'append' }),
new Argument('--glob-case-insensitive', { action: 'store_true' }),
new Argument('--no-glob-case-insensitive', { action: 'store_true' }),
new Argument(['-t', '--type'], { action: 'append' }),
new Argument(['-T', '--type-not'], { action: 'append' }),
new Argument('--type-add', { action: 'append' }),
new Argument('--type-clear', { action: 'append' }),
new Argument(['-.', '--hidden'], { action: 'store_true' }),
new Argument('--no-hidden', { action: 'store_true' }),
new Argument(['-u', '--unrestricted'], { action: 'count' }),
new Argument(['-d', '--max-depth', '--maxdepth']),
new Argument('--max-filesize'),
new Argument(['-L', '--follow'], { action: 'store_true' }),
new Argument('--one-file-system', { action: 'store_true' }),
new Argument('--no-one-file-system', { action: 'store_true' }),
new Argument(['-a', '--text'], { action: 'store_true' }),
new Argument('--no-text', { action: 'store_true' }),
new Argument('--binary', { action: 'store_true' }),
new Argument('--no-binary', { action: 'store_true' }),
new Argument('--sort'),
new Argument('--sortr'),
new Argument('--sort-files', { action: 'store_true' }),
new Argument('--no-sort-files', { action: 'store_true' }),
new Argument('--no-messages', { action: 'store_true' }),
new Argument('--messages', { action: 'store_true' }),
new Argument('--no-ignore', { action: 'store_true' }),
new Argument('--ignore', { action: 'store_true' }),
new Argument('--no-ignore-dot', { action: 'store_true' }),
new Argument('--ignore-dot', { action: 'store_true' }),
new Argument('--no-ignore-exclude', { action: 'store_true' }),
new Argument('--ignore-exclude', { action: 'store_true' }),
// --ignore-file's gitignore rules apply to the walk; the negation drops
// every one of them, wherever it stands.
new Argument('--ignore-file', { action: 'append', type: 'path' }),
new Argument('--no-ignore-files', { action: 'store_true' }),
new Argument('--ignore-files', { action: 'store_true' }),
new Argument('--no-ignore-global', { action: 'store_true' }),
new Argument('--ignore-global', { action: 'store_true' }),
new Argument('--no-ignore-messages', { action: 'store_true' }),
new Argument('--ignore-messages', { action: 'store_true' }),
new Argument('--no-ignore-parent', { action: 'store_true' }),
new Argument('--ignore-parent', { action: 'store_true' }),
new Argument('--no-ignore-vcs', { action: 'store_true' }),
new Argument('--ignore-vcs', { action: 'store_true' }),
new Argument('--no-require-git', { action: 'store_true' }),
new Argument('--require-git', { action: 'store_true' }),
new Argument('--ignore-file-case-insensitive', { action: 'store_true' }),
new Argument('--no-ignore-file-case-insensitive', { action: 'store_true' }),
new Argument('--no-config', { action: 'store_true' }),
new Argument(['-j', '--threads']),
new Argument('--line-buffered', { action: 'store_true' }),
new Argument('--no-line-buffered', { action: 'store_true' }),
new Argument('--block-buffered', { action: 'store_true' }),
new Argument('--no-block-buffered', { action: 'store_true' }),
new Argument('--mmap', { action: 'store_true' }),
new Argument('--no-mmap', { action: 'store_true' }),
new Argument('--no-follow', { action: 'store_true' }),
// --stats ends the output with ripgrep's counts and timings; --json
// prints JSON Lines (begin, match, context, end, summary).
new Argument('--stats', { action: 'store_true' }),
new Argument('--no-stats', { action: 'store_true' }),
new Argument('--json', { action: 'store_true' }),
// A line may end in CR LF: `$` matches before the CR and every line rg
// writes ends in CR LF.
new Argument('--crlf', { action: 'store_true' }),
new Argument('--no-crlf', { action: 'store_true' }),
// A match may span lines: the whole file is searched at once.
new Argument(['-U', '--multiline'], { action: 'store_true' }),
new Argument('--no-multiline', { action: 'store_true' }),
new Argument('--multiline-dotall', { action: 'store_true' }),
new Argument('--no-multiline-dotall', { action: 'store_true' }),
new Argument(['-P', '--pcre2'], { action: 'store_true' }),
new Argument('--no-pcre2', { action: 'store_true' }),
new Argument('--engine'),
new Argument('--no-json', { action: 'store_true' }),
// A .gz or .tgz file is searched decompressed; mirage has gzip and no
// other decompressor, which ripgrep leaves raw too when their programs
// are missing.
new Argument(['-z', '--search-zip'], { action: 'store_true' }),
new Argument('--no-search-zip', { action: 'store_true' }),
new Argument(['-E', '--encoding']),
new Argument('--no-encoding', { action: 'store_true' }),
// --pre runs COMMAND PATH for each file, its contents on stdin, and
// searches what it prints; --pre-glob picks the files.
new Argument('--pre'),
new Argument('--pre-glob', { action: 'append' }),
new Argument('--no-pre', { action: 'store_true' }),
new Argument('--unicode', { action: 'store_true' }),
new Argument('--no-unicode', { action: 'store_true' }),
new Argument('--pcre2-unicode', { action: 'store_true' }),
new Argument('--no-pcre2-unicode', { action: 'store_true' }),
new Argument('--auto-hybrid-regex', { action: 'store_true' }),
new Argument('--no-auto-hybrid-regex', { action: 'store_true' }),
new Argument('--color'),
// -p is --heading -n plus colors, which mirage never writes.
new Argument(['-p', '--pretty'], { action: 'store_true' }),
// Accepted no-ops whose values ripgrep checks, refused in its words:
// mirage writes no colors or hyperlinks and compiles no DFA, and logs
// nothing for --debug and --trace.
new Argument('--colors', { action: 'append' }),
new Argument('--hyperlink-format'),
new Argument('--hostname-bin'),
new Argument('--dfa-size-limit'),
new Argument('--regex-size-limit'),
new Argument('--debug', { action: 'store_true' }),
new Argument('--trace', { action: 'store_true' }),
// The help page, the version and the PCRE2 version, answered like the
// --help and --version the registration supplies.
new Argument('-h', { action: 'store_true' }),
new Argument('-V', { action: 'store_true' }),
new Argument('--pcre2-version', { action: 'store_true' }),
new Argument('text', {
metavar: '',
nargs: '?',
providedBy: ['-e', '-f', '--files', '--type-list'],
}),
PATHS_OPERAND,
],
allowAbbrev: false,
}),
sed: new CommandSpec({
arguments: [
new Argument('-i', { action: 'store_true' }),
new Argument('-e', { action: 'append' }),
new Argument('-f', { action: 'append', type: 'path' }),
new Argument('-n', { action: 'store_true' }),
new Argument('-E', { action: 'store_true' }),
new Argument('-r', { action: 'store_true' }),
new Argument(['-l', '--line-length']),
new Argument(['-s', '--separate'], { action: 'store_true' }),
new Argument('text', { metavar: '', nargs: '?', providedBy: ['-e', '-f'] }),
PATHS_OPERAND,
],
}),
strings: new CommandSpec({
arguments: [new Argument('-n'), PATHS_OPERAND],
}),
zgrep: new CommandSpec({
arguments: [
new Argument(['-i', '--ignore-case'], { action: 'store_true' }),
new Argument(['-b', '--byte-offset'], { action: 'store_true' }),
new Argument(['-c', '--count'], { action: 'store_true' }),
new Argument(['-l', '--files-with-matches'], { action: 'store_true' }),
new Argument(['-L', '--files-without-match'], { action: 'store_true' }),
new Argument(['-n', '--line-number'], { action: 'store_true' }),
new Argument(['-v', '--invert-match'], { action: 'store_true' }),
new Argument(['-e', '--regexp'], { action: 'append' }),
new Argument(['-f', '--file'], { action: 'append', type: 'path' }),
new Argument(['-E', '--extended-regexp'], { action: 'store_true' }),
new Argument(['-G', '--basic-regexp'], { action: 'store_true' }),
new Argument(['-F', '--fixed-strings', '--fixed-regexp'], { action: 'store_true' }),
new Argument(['-P', '--perl-regexp'], { action: 'store_true' }),
new Argument(['-H', '--with-filename'], { action: 'store_true' }),
new Argument(['-h', '--no-filename'], { action: 'store_true' }),
new Argument(['-m', '--max-count']),
new Argument(['-o', '--only-matching'], { action: 'store_true' }),
new Argument(['-q', '--quiet', '--silent'], { action: 'store_true' }),
new Argument(['-s', '--no-messages'], { action: 'store_true' }),
new Argument(['-w', '--word-regexp'], { action: 'store_true' }),
new Argument(['-x', '--line-regexp'], { action: 'store_true' }),
new Argument('text', { metavar: '', nargs: '?', providedBy: ['-e', '-f'] }),
PATHS_OPERAND,
],
}),
};
//# sourceMappingURL=search.js.map