mindweave 3.0.0 → 3.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/README.md +36 -4
- package/dist/alternator/chassis/lsp.js +36 -4
- package/dist/alternator/chassis/lsp.js.map +1 -1
- package/dist/alternator/chassis/provision.js +54 -6
- package/dist/alternator/chassis/provision.js.map +1 -1
- package/dist/alternator/chassis/servers.js +34 -21
- package/dist/alternator/chassis/servers.js.map +1 -1
- package/dist/cli/App.js +6 -6
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/attachments.js +37 -1
- package/dist/cli/attachments.js.map +1 -1
- package/dist/cli/bootstrap.js +25 -3
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/components/FirstRunFrame.js +1 -1
- package/dist/cli/components/MarathonBox.js +2 -1
- package/dist/cli/components/MarathonBox.js.map +1 -1
- package/dist/cli/marathonUi.js +2 -0
- package/dist/cli/marathonUi.js.map +1 -1
- package/dist/cli/startupArgs.js +1 -1
- package/dist/core/permissions.js +26 -1
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/spendView.js +8 -1
- package/dist/core/spendView.js.map +1 -1
- package/dist/core/turnRunner.js +28 -2
- package/dist/core/turnRunner.js.map +1 -1
- package/dist/drivers/deepseek/inlineTools.js +36 -2
- package/dist/drivers/deepseek/inlineTools.js.map +1 -1
- package/dist/drivers/ollama/endpoint.js +25 -0
- package/dist/drivers/ollama/endpoint.js.map +1 -1
- package/dist/dynamo/engine.js +408 -88
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/guard.js +11 -4
- package/dist/dynamo/guard.js.map +1 -1
- package/dist/dynamo/hooks.js +209 -0
- package/dist/dynamo/hooks.js.map +1 -0
- package/dist/dynamo/marathon.js +67 -10
- package/dist/dynamo/marathon.js.map +1 -1
- package/dist/dynamo/todoReminder.js +26 -0
- package/dist/dynamo/todoReminder.js.map +1 -0
- package/dist/governor/forbidden.js +19 -0
- package/dist/governor/forbidden.js.map +1 -1
- package/dist/governor/freshness.js +1 -1
- package/dist/governor/freshness.js.map +1 -1
- package/dist/governor/index.js +8 -1
- package/dist/governor/index.js.map +1 -1
- package/dist/governor/rules.js +1 -0
- package/dist/governor/rules.js.map +1 -1
- package/dist/governor/write.js +50 -2
- package/dist/governor/write.js.map +1 -1
- package/dist/mcp/config.js +0 -41
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/projectApproval.js +117 -0
- package/dist/mcp/projectApproval.js.map +1 -0
- package/dist/mcp/resultStore.js +19 -5
- package/dist/mcp/resultStore.js.map +1 -1
- package/dist/mcp/transport/stdio.js +4 -1
- package/dist/mcp/transport/stdio.js.map +1 -1
- package/dist/memory/allMetas.js +1 -1
- package/dist/memory/allMetas.js.map +1 -1
- package/dist/memory/autoMemory.js +1 -0
- package/dist/memory/autoMemory.js.map +1 -1
- package/dist/memory/clearedArchive.js +120 -0
- package/dist/memory/clearedArchive.js.map +1 -0
- package/dist/memory/compaction.js +154 -14
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/counters.js +64 -0
- package/dist/memory/counters.js.map +1 -0
- package/dist/memory/projectNotes.js +61 -13
- package/dist/memory/projectNotes.js.map +1 -1
- package/dist/memory/rewind.js +6 -2
- package/dist/memory/rewind.js.map +1 -1
- package/dist/memory/session.js +13 -5
- package/dist/memory/session.js.map +1 -1
- package/dist/memory/sessionMemory.js +6 -2
- package/dist/memory/sessionMemory.js.map +1 -1
- package/dist/memory/store.js +3 -0
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/workingSet.js +0 -375
- package/dist/memory/workingSet.js.map +1 -1
- package/dist/project/context.js +54 -7
- package/dist/project/context.js.map +1 -1
- package/dist/tools/approval.js +19 -4
- package/dist/tools/approval.js.map +1 -1
- package/dist/tools/backgroundShells.js +8 -1
- package/dist/tools/backgroundShells.js.map +1 -1
- package/dist/tools/browser.js +2 -1
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/checkpoints.js +28 -4
- package/dist/tools/checkpoints.js.map +1 -1
- package/dist/tools/childEnv.js +50 -0
- package/dist/tools/childEnv.js.map +1 -0
- package/dist/tools/codeIntel.js +4 -1
- package/dist/tools/codeIntel.js.map +1 -1
- package/dist/tools/commandParse.js +238 -0
- package/dist/tools/commandParse.js.map +1 -0
- package/dist/tools/commandPolicy.js +283 -0
- package/dist/tools/commandPolicy.js.map +1 -0
- package/dist/tools/edit.js +2 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/editRipple.js +18 -3
- package/dist/tools/editRipple.js.map +1 -1
- package/dist/tools/editTarget.js +11 -6
- package/dist/tools/editTarget.js.map +1 -1
- package/dist/tools/governorTools.js +61 -1
- package/dist/tools/governorTools.js.map +1 -1
- package/dist/tools/grep.js +13 -5
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/guard.js +249 -2
- package/dist/tools/guard.js.map +1 -1
- package/dist/tools/invisible.js +62 -0
- package/dist/tools/invisible.js.map +1 -0
- package/dist/tools/killTree.js +3 -0
- package/dist/tools/killTree.js.map +1 -1
- package/dist/tools/readFile.js +2 -2
- package/dist/tools/readFile.js.map +1 -1
- package/dist/tools/readSymbol.js +5 -24
- package/dist/tools/readSymbol.js.map +1 -1
- package/dist/tools/replaceSymbol.js +1 -1
- package/dist/tools/replaceSymbol.js.map +1 -1
- package/dist/tools/ripgrepShell.js +56 -0
- package/dist/tools/ripgrepShell.js.map +1 -0
- package/dist/tools/runCommand.js +74 -15
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/runsLater.js +50 -0
- package/dist/tools/runsLater.js.map +1 -0
- package/dist/tools/serverConsent.js +27 -0
- package/dist/tools/serverConsent.js.map +1 -0
- package/dist/tools/ui.js +27 -0
- package/dist/tools/ui.js.map +1 -1
- package/dist/tools/untrusted.js +22 -1
- package/dist/tools/untrusted.js.map +1 -1
- package/dist/tools/viewImage.js +2 -2
- package/dist/tools/viewImage.js.map +1 -1
- package/dist/tools/webFetch.js +76 -8
- package/dist/tools/webFetch.js.map +1 -1
- package/dist/tools/workspace.js +87 -24
- package/dist/tools/workspace.js.map +1 -1
- package/dist/tools/writeFile.js +9 -4
- package/dist/tools/writeFile.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* childEnv.ts — the environment a program Mindweave starts should see.
|
|
3
|
+
*
|
|
4
|
+
* Mindweave loads its settings files (~/.mindweave/.env and a project's .env) into its
|
|
5
|
+
* own environment, because that is where every driver reads its API key. A child
|
|
6
|
+
* process inherits that environment, so every command the agent ran, every MCP server
|
|
7
|
+
* and every language server could read every provider key: `env` in a debugging step
|
|
8
|
+
* put them in the transcript, and any build script or injected instruction could send
|
|
9
|
+
* them anywhere. The user's own shell never exposed them; Mindweave did.
|
|
10
|
+
*
|
|
11
|
+
* So a child gets the environment the user's shell gave Mindweave, not the one
|
|
12
|
+
* Mindweave built on top of it:
|
|
13
|
+
*
|
|
14
|
+
* - a variable that was not there when Mindweave started is left out (everything
|
|
15
|
+
* loaded from the settings files, the stored-key slots, internal flags);
|
|
16
|
+
* - a provider key the user exported in their shell is passed with the value they
|
|
17
|
+
* exported, even when Mindweave is using a different key of theirs for itself;
|
|
18
|
+
* - anything else that was there passes through as it is now.
|
|
19
|
+
*
|
|
20
|
+
* The snapshot is taken when this module is first loaded, which is before the
|
|
21
|
+
* settings files are read (cli/bootstrap.ts imports it for that reason).
|
|
22
|
+
*/
|
|
23
|
+
const IS_WINDOWS = process.platform === "win32";
|
|
24
|
+
/** Windows variable names are case-insensitive; compare them that way. */
|
|
25
|
+
const norm = (name) => (IS_WINDOWS ? name.toUpperCase() : name);
|
|
26
|
+
/** The environment Mindweave started with, by normalised name. */
|
|
27
|
+
const shell = new Map(Object.entries(process.env).flatMap(([k, v]) => (v === undefined ? [] : [[norm(k), v]])));
|
|
28
|
+
/** A provider key variable, or one of the numbered slots keys are stored in. */
|
|
29
|
+
const PROVIDER_KEY = /_API_KEY(_\d+)?$/i;
|
|
30
|
+
/**
|
|
31
|
+
* The environment for a child process: the user's shell environment as it is now,
|
|
32
|
+
* without anything Mindweave added, plus `extra` (which the caller decides and wins).
|
|
33
|
+
*/
|
|
34
|
+
export function childEnv(extra = {}) {
|
|
35
|
+
const out = {};
|
|
36
|
+
for (const [name, value] of Object.entries(process.env)) {
|
|
37
|
+
if (value === undefined)
|
|
38
|
+
continue;
|
|
39
|
+
const original = shell.get(norm(name));
|
|
40
|
+
if (original === undefined)
|
|
41
|
+
continue;
|
|
42
|
+
out[name] = PROVIDER_KEY.test(name) ? original : value;
|
|
43
|
+
}
|
|
44
|
+
return { ...out, ...extra };
|
|
45
|
+
}
|
|
46
|
+
/** True when `name` was set by Mindweave rather than inherited from the shell (for tests and diagnostics). */
|
|
47
|
+
export function addedByMindweave(name) {
|
|
48
|
+
return process.env[name] !== undefined && !shell.has(norm(name));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=childEnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childEnv.js","sourceRoot":"","sources":["../../src/tools/childEnv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAEhD,0EAA0E;AAC1E,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAExE,kEAAkE;AAClE,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAqB,CAAC,CAAC,CAAC,CAC7G,CAAC;AAEF,gFAAgF;AAChF,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgC,EAAE;IACzD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAS;QACrC,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/tools/codeIntel.js
CHANGED
|
@@ -12,7 +12,7 @@ import { promises as fs } from "node:fs";
|
|
|
12
12
|
import { relativize, resolvePath } from "./paths.js";
|
|
13
13
|
import { allChassis, chassisForPath, mergedDefinition, mergedReferences } from "./chassisMux.js";
|
|
14
14
|
import { walkFiles } from "./walk.js";
|
|
15
|
-
import { excludedFromSearch } from "./guard.js";
|
|
15
|
+
import { excludedFromSearch, guardedPathReason } from "./guard.js";
|
|
16
16
|
import { isSupported } from "../alternator/chassis/treesitter.js";
|
|
17
17
|
import { isMarkupSupported } from "../alternator/chassis/markup.js";
|
|
18
18
|
import { fail, failQuietly } from "./results.js";
|
|
@@ -57,6 +57,9 @@ const outlineDef = {
|
|
|
57
57
|
return degraded();
|
|
58
58
|
const rawPath = typeof args.path === "string" && args.path.trim() ? args.path.trim() : ".";
|
|
59
59
|
const abs = resolvePath(ctx, rawPath);
|
|
60
|
+
const blocked = await guardedPathReason(abs);
|
|
61
|
+
if (blocked)
|
|
62
|
+
return fail(`Refusing to outline ${rawPath}: it is ${blocked}.`);
|
|
60
63
|
let stat;
|
|
61
64
|
try {
|
|
62
65
|
stat = await fs.stat(abs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeIntel.js","sourceRoot":"","sources":["../../src/tools/codeIntel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"codeIntel.js","sourceRoot":"","sources":["../../src/tools/codeIntel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commandParse.ts — read a shell command into the commands it contains (pure).
|
|
3
|
+
*
|
|
4
|
+
* The command guard used to be regular expressions over the raw text, which cannot tell
|
|
5
|
+
* `cat .env` from `echo ".env"`, misses the second command in `a; b`, and has no idea
|
|
6
|
+
* what a command names as its arguments. This reads the text the way a shell would, far
|
|
7
|
+
* enough to answer three questions: which commands run, what words each was given, and
|
|
8
|
+
* whether it writes a file.
|
|
9
|
+
*
|
|
10
|
+
* It is NOT a shell. It does not expand variables, run substitutions or follow
|
|
11
|
+
* redirections into anything clever; whatever it cannot read with certainty it says so
|
|
12
|
+
* (`unreadable`), and every caller treats that as "ask", never as "allow". That one rule
|
|
13
|
+
* is what lets this stay small: a construct it does not model is not a hole, it is a
|
|
14
|
+
* question for the person.
|
|
15
|
+
*
|
|
16
|
+
* Three dialects, because Windows runs PowerShell or cmd and everything else runs a
|
|
17
|
+
* POSIX shell: they differ in what is an escape (backslash in POSIX, backtick in
|
|
18
|
+
* PowerShell, a caret in cmd) and a backslash in a Windows path is not an escape at all.
|
|
19
|
+
*/
|
|
20
|
+
const NULL_TARGETS = new Set(["/dev/null", "$null", "nul", "NUL", "Nul"]);
|
|
21
|
+
/** Split `command` into simple commands. Never throws. */
|
|
22
|
+
export function parseCommand(command, dialect = process.platform === "win32" ? "powershell" : "posix") {
|
|
23
|
+
const commands = [];
|
|
24
|
+
let unreadable = null;
|
|
25
|
+
const fail = (why) => {
|
|
26
|
+
unreadable ??= why;
|
|
27
|
+
};
|
|
28
|
+
let words = [];
|
|
29
|
+
let writes = [];
|
|
30
|
+
let reads = [];
|
|
31
|
+
let expands = false;
|
|
32
|
+
let cur = "";
|
|
33
|
+
let inWord = false;
|
|
34
|
+
/** A redirect operator waiting for its target word. */
|
|
35
|
+
let pending = null;
|
|
36
|
+
const endWord = () => {
|
|
37
|
+
if (!inWord)
|
|
38
|
+
return;
|
|
39
|
+
inWord = false;
|
|
40
|
+
const word = cur;
|
|
41
|
+
cur = "";
|
|
42
|
+
if (pending) {
|
|
43
|
+
if (pending === ">" && !NULL_TARGETS.has(word))
|
|
44
|
+
writes.push(word);
|
|
45
|
+
if (pending === "<")
|
|
46
|
+
reads.push(word);
|
|
47
|
+
pending = null;
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
words.push(word);
|
|
51
|
+
};
|
|
52
|
+
const endCommand = () => {
|
|
53
|
+
endWord();
|
|
54
|
+
pending = null;
|
|
55
|
+
if (words.length > 0 || writes.length > 0 || reads.length > 0)
|
|
56
|
+
commands.push({ words, writes, reads, expands });
|
|
57
|
+
words = [];
|
|
58
|
+
writes = [];
|
|
59
|
+
reads = [];
|
|
60
|
+
expands = false;
|
|
61
|
+
};
|
|
62
|
+
const n = command.length;
|
|
63
|
+
for (let i = 0; i < n; i++) {
|
|
64
|
+
const c = command[i];
|
|
65
|
+
const next = command[i + 1];
|
|
66
|
+
// ── quotes ──
|
|
67
|
+
if (c === "'") {
|
|
68
|
+
inWord = true;
|
|
69
|
+
let end = command.indexOf("'", i + 1);
|
|
70
|
+
// In PowerShell a doubled quote inside single quotes is one literal quote: 'it''s'.
|
|
71
|
+
while (dialect === "powershell" && end >= 0 && command[end + 1] === "'") {
|
|
72
|
+
cur += command.slice(i + 1, end) + "'";
|
|
73
|
+
i = end + 1;
|
|
74
|
+
end = command.indexOf("'", i + 1);
|
|
75
|
+
}
|
|
76
|
+
if (end < 0) {
|
|
77
|
+
fail("an unclosed quote");
|
|
78
|
+
cur += command.slice(i + 1);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
cur += command.slice(i + 1, end);
|
|
82
|
+
i = end;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (c === '"') {
|
|
86
|
+
inWord = true;
|
|
87
|
+
let j = i + 1;
|
|
88
|
+
for (; j < n && command[j] !== '"'; j++) {
|
|
89
|
+
const d = command[j];
|
|
90
|
+
if (d === "$") {
|
|
91
|
+
expands = true;
|
|
92
|
+
if (command[j + 1] === "(")
|
|
93
|
+
fail("a command substitution inside quotes");
|
|
94
|
+
}
|
|
95
|
+
if (d === "`" && dialect !== "cmd")
|
|
96
|
+
fail("a backtick inside quotes");
|
|
97
|
+
// An escaped character inside double quotes.
|
|
98
|
+
if ((dialect === "posix" && d === "\\" && j + 1 < n) || (dialect === "powershell" && d === "`" && j + 1 < n)) {
|
|
99
|
+
cur += command[j + 1];
|
|
100
|
+
j++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
cur += d;
|
|
104
|
+
}
|
|
105
|
+
if (j >= n)
|
|
106
|
+
fail("an unclosed quote");
|
|
107
|
+
i = j;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// ── escapes ──
|
|
111
|
+
if (dialect === "posix" && c === "\\") {
|
|
112
|
+
if (next === "\n") {
|
|
113
|
+
i++;
|
|
114
|
+
continue; // a line continuation
|
|
115
|
+
}
|
|
116
|
+
inWord = true;
|
|
117
|
+
if (next !== undefined)
|
|
118
|
+
cur += next;
|
|
119
|
+
i++;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (dialect === "powershell" && c === "`") {
|
|
123
|
+
fail("a backtick");
|
|
124
|
+
inWord = true;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (dialect === "cmd" && c === "^") {
|
|
128
|
+
fail("a caret escape");
|
|
129
|
+
inWord = true;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
// ── separators ──
|
|
133
|
+
if (c === "\n" || c === "\r" || c === ";") {
|
|
134
|
+
endCommand();
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (c === "&") {
|
|
138
|
+
if (next === "&")
|
|
139
|
+
i++;
|
|
140
|
+
else if (next === ">")
|
|
141
|
+
fail("a combined redirect");
|
|
142
|
+
else if (words.length === 0 && !inWord)
|
|
143
|
+
fail("the call operator");
|
|
144
|
+
endCommand();
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (c === "|") {
|
|
148
|
+
if (next === "|" || next === "&")
|
|
149
|
+
i++;
|
|
150
|
+
endCommand();
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// ── redirects ──
|
|
154
|
+
if (c === ">" || c === "<") {
|
|
155
|
+
// A file-descriptor duplicate (2>&1, >&2) writes to no file.
|
|
156
|
+
if (c === ">" && next === "&") {
|
|
157
|
+
i++;
|
|
158
|
+
while (command[i + 1] !== undefined && /[0-9-]/.test(command[i + 1]))
|
|
159
|
+
i++;
|
|
160
|
+
// The number before it was read as a word; it is not an argument.
|
|
161
|
+
if (inWord && /^[0-9]$/.test(cur)) {
|
|
162
|
+
cur = "";
|
|
163
|
+
inWord = false;
|
|
164
|
+
}
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (c === "<" && (next === "<" || next === "(")) {
|
|
168
|
+
fail(next === "<" ? "a here-document" : "a process substitution");
|
|
169
|
+
endCommand();
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// `2>` and `1>`: the digit is the stream, not a word.
|
|
173
|
+
if (inWord && /^[0-9]$/.test(cur)) {
|
|
174
|
+
cur = "";
|
|
175
|
+
inWord = false;
|
|
176
|
+
}
|
|
177
|
+
else
|
|
178
|
+
endWord();
|
|
179
|
+
if (c === ">" && next === ">")
|
|
180
|
+
i++;
|
|
181
|
+
if (c === ">" && next === "(")
|
|
182
|
+
fail("a process substitution");
|
|
183
|
+
pending = c;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// ── whitespace ──
|
|
187
|
+
if (c === " " || c === "\t") {
|
|
188
|
+
endWord();
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
// ── things this reader does not model ──
|
|
192
|
+
if (c === "$") {
|
|
193
|
+
if (next === "(")
|
|
194
|
+
fail("a command substitution");
|
|
195
|
+
expands = true;
|
|
196
|
+
}
|
|
197
|
+
if (c === "`" && dialect === "posix")
|
|
198
|
+
fail("a command substitution");
|
|
199
|
+
if (c === "{" || c === "}") {
|
|
200
|
+
// A script block, a brace expansion or a group. `{}` alone is find's placeholder.
|
|
201
|
+
if (!(c === "{" && next === "}") && !(c === "}" && command[i - 1] === "{"))
|
|
202
|
+
fail("a block or brace expansion");
|
|
203
|
+
}
|
|
204
|
+
if (c === "(" || c === ")")
|
|
205
|
+
fail("a group or expression");
|
|
206
|
+
if (c === "@" && (next === "'" || next === '"') && !inWord)
|
|
207
|
+
fail("a here-string");
|
|
208
|
+
if (c === "%" && dialect !== "cmd" && !inWord && next === "{")
|
|
209
|
+
fail("a script block");
|
|
210
|
+
inWord = true;
|
|
211
|
+
cur += c;
|
|
212
|
+
}
|
|
213
|
+
endCommand();
|
|
214
|
+
// What a command may start with that changes what runs.
|
|
215
|
+
for (const cmd of commands) {
|
|
216
|
+
const first = cmd.words[0];
|
|
217
|
+
if (first === undefined)
|
|
218
|
+
continue;
|
|
219
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(first))
|
|
220
|
+
fail("an environment variable set before the command");
|
|
221
|
+
if (first.startsWith("$"))
|
|
222
|
+
fail("a variable used as the command");
|
|
223
|
+
if (/^(eval|exec|source|\.|iex|invoke-expression|invoke-command|icm|start-process|saps|start|call)$/i.test(first)) {
|
|
224
|
+
fail(`${first}, which runs other text as code`);
|
|
225
|
+
}
|
|
226
|
+
if (cmd.words.some((w) => /^-e(nc(odedcommand)?)?$/i.test(w) || /^-command$/i.test(w) || /^-c$/.test(w) && /^(bash|sh|zsh|dash)$/.test(first))) {
|
|
227
|
+
fail("a program told to run a string as code");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return { commands, unreadable };
|
|
231
|
+
}
|
|
232
|
+
/** The program or cmdlet a command runs, lower-cased, without a directory or a .exe. */
|
|
233
|
+
export function verbOf(cmd) {
|
|
234
|
+
const first = cmd.words[0] ?? "";
|
|
235
|
+
const base = first.split(/[\\/]/).pop() ?? first;
|
|
236
|
+
return base.replace(/\.(exe|cmd|bat|com|ps1)$/i, "").toLowerCase();
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=commandParse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandParse.js","sourceRoot":"","sources":["../../src/tools/commandParse.ts"],"names":[],"mappings":"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"}
|