@tinycloud/courier 0.2.0-beta.37 → 0.2.0-beta.39
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 +369 -12
- package/dist/a2a.d.ts +6 -0
- package/dist/a2a.js +10 -0
- package/dist/a2a.js.map +1 -1
- package/dist/approval.d.ts +6 -5
- package/dist/approval.js +7 -16
- package/dist/approval.js.map +1 -1
- package/dist/args.js +1 -1
- package/dist/args.js.map +1 -1
- package/dist/broker-config.d.ts +24 -0
- package/dist/broker-config.js +99 -0
- package/dist/broker-config.js.map +1 -0
- package/dist/broker.d.ts +77 -0
- package/dist/broker.js +253 -0
- package/dist/broker.js.map +1 -0
- package/dist/commands.js +5 -2
- package/dist/commands.js.map +1 -1
- package/dist/consumed.d.ts +10 -0
- package/dist/consumed.js +54 -0
- package/dist/consumed.js.map +1 -0
- package/dist/guard/binaries.d.ts +17 -0
- package/dist/guard/binaries.js +89 -0
- package/dist/guard/binaries.js.map +1 -0
- package/dist/guard/cleanhome.d.ts +27 -0
- package/dist/guard/cleanhome.js +111 -0
- package/dist/guard/cleanhome.js.map +1 -0
- package/dist/guard/command.d.ts +13 -0
- package/dist/guard/command.js +158 -0
- package/dist/guard/command.js.map +1 -0
- package/dist/guard/expansion.d.ts +10 -0
- package/dist/guard/expansion.js +74 -0
- package/dist/guard/expansion.js.map +1 -0
- package/dist/guard/hook.d.ts +38 -0
- package/dist/guard/hook.js +124 -0
- package/dist/guard/hook.js.map +1 -0
- package/dist/guard/install.d.ts +67 -0
- package/dist/guard/install.js +193 -0
- package/dist/guard/install.js.map +1 -0
- package/dist/guard/network.d.ts +7 -0
- package/dist/guard/network.js +78 -0
- package/dist/guard/network.js.map +1 -0
- package/dist/guard/normalize.d.ts +28 -0
- package/dist/guard/normalize.js +257 -0
- package/dist/guard/normalize.js.map +1 -0
- package/dist/guard/paseo.d.ts +30 -0
- package/dist/guard/paseo.js +148 -0
- package/dist/guard/paseo.js.map +1 -0
- package/dist/guard/paths.d.ts +31 -0
- package/dist/guard/paths.js +180 -0
- package/dist/guard/paths.js.map +1 -0
- package/dist/guard/policy.d.ts +65 -0
- package/dist/guard/policy.js +1179 -0
- package/dist/guard/policy.js.map +1 -0
- package/dist/guard/shell.d.ts +55 -0
- package/dist/guard/shell.js +727 -0
- package/dist/guard/shell.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +4 -1
- package/dist/keys.js +7 -2
- package/dist/keys.js.map +1 -1
- package/dist/main.js +44 -4
- package/dist/main.js.map +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +3 -3
- package/dist/node.js.map +1 -1
- package/dist/notify.d.ts +43 -0
- package/dist/notify.js +92 -0
- package/dist/notify.js.map +1 -0
- package/dist/pause.d.ts +32 -0
- package/dist/pause.js +111 -0
- package/dist/pause.js.map +1 -0
- package/dist/profile.d.ts +3 -3
- package/dist/profile.js +12 -12
- package/dist/profile.js.map +1 -1
- package/dist/wake.d.ts +17 -0
- package/dist/wake.js +74 -13
- package/dist/wake.js.map +1 -1
- package/dist/watch-cmd.d.ts +3 -0
- package/dist/watch-cmd.js +56 -2
- package/dist/watch-cmd.js.map +1 -1
- package/dist/watch.d.ts +134 -0
- package/dist/watch.js +697 -13
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
- package/skills/courier/SKILL.md +119 -8
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { installBinaryCensus } from './binaries.js';
|
|
5
|
+
import { programName } from '../program.js';
|
|
6
|
+
import { isRecord } from '../a2a.js';
|
|
7
|
+
import { installRoots, realpathBest } from './paths.js';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
/** Where this OS user keeps credentials that a woken agent can read through the Read tool (and a shell) unless HOME differs. */
|
|
10
|
+
export const CREDENTIAL_FILES = ['.config/gh/**', '.npmrc', '.netrc', '.ssh/**', '.aws/**', '.config/gcloud/**', '.docker/config.json', '.config/wrangler/**', '.config/.wrangler/**', '.git-credentials'];
|
|
11
|
+
/**
|
|
12
|
+
* The guard's Claude Code settings and the environment woken agents get (spec §7).
|
|
13
|
+
*
|
|
14
|
+
* Settings = a `PreToolUse` hook that runs `courier guard` on every tool call, plus deny rules for what no approval can
|
|
15
|
+
* unlock (pairing and revoking, Secret Bridge), direct gated actions, and the files the guard lives in.
|
|
16
|
+
* Approved PR merges go through the broker, never through a hook allow decision.
|
|
17
|
+
*/
|
|
18
|
+
/** Command prefixes a woken agent may not run directly (the broker runs the merge). */
|
|
19
|
+
const GATED_DENY = [
|
|
20
|
+
'gh pr merge', 'gh workflow run', 'gh release create', 'gh release edit', 'gh release delete', 'gh release upload', 'gh run rerun', 'gh secret', 'gh repo sync',
|
|
21
|
+
'npm publish', 'npm unpublish', 'npm dist-tag', 'pnpm publish', 'bun publish', 'yarn npm publish', 'changeset publish', 'npx changeset publish', 'bunx changeset publish',
|
|
22
|
+
'wrangler deploy', 'wrangler publish', 'wrangler delete', 'wrangler rollback', 'wrangler secret', 'npx wrangler deploy', 'phala deploy', 'phala cvms',
|
|
23
|
+
'git push', 'git push origin main', 'git push origin master', 'git push --force', 'git push -f', 'git push --mirror', 'git push --all', 'git push --tags',
|
|
24
|
+
].map((prefix) => `Bash(${prefix}:*)`);
|
|
25
|
+
/** Programs that change user, outlive the call or reach credentials. */
|
|
26
|
+
const PRIVILEGE_DENY = ['sudo', 'su', 'doas', 'pkexec', 'tmux', 'screen', 'crontab', 'systemctl', 'ssh', 'gh auth', 'git credential', 'secret-tool'].map((prefix) => `Bash(${prefix}:*)`);
|
|
27
|
+
const shq = (s) => `'${s.replace(/'/g, `'\\''`)}'`;
|
|
28
|
+
/** The command Claude Code runs for the hook. `|| exit 2` turns any crash into a blocking error (exit 1 would fail open). */
|
|
29
|
+
export function hookCommand(argv, home, realHome = os.homedir()) {
|
|
30
|
+
// COURIER_REAL_HOME: the hook runs with the agent's clean HOME, and still has to protect the owner's real one.
|
|
31
|
+
return `COURIER_HOME=${shq(home)} COURIER_REAL_HOME=${shq(realHome)} ${argv.map(shq).join(' ')} || exit 2`;
|
|
32
|
+
}
|
|
33
|
+
/** Everything the guard keeps for a profile lives here; no tool call may write it. */
|
|
34
|
+
export const guardDir = (home) => path.join(home, 'guard');
|
|
35
|
+
export const guardSettingsFile = (home) => path.join(guardDir(home), 'settings.json');
|
|
36
|
+
/** `TC_HOME` for woken agents: an empty directory, so the owner's `tc` profile is not found. */
|
|
37
|
+
export const profileId = (home) => createHash('sha256').update(realpathBest(home)).digest('hex').slice(0, 24);
|
|
38
|
+
export const agentHome = (home) => path.join(path.dirname(path.resolve(home)), `courier-agent-home-${profileId(home)}`);
|
|
39
|
+
export const noOwnerProfileDir = (home) => path.join(agentHome(home), 'no-owner-profile');
|
|
40
|
+
/** Paths no tool call may write: the courier profile (keys, grant, state), the guard files, the hook program and what it imports. */
|
|
41
|
+
export function protectedPaths(home, entry) {
|
|
42
|
+
return [path.resolve(home), ...installRoots(entry)];
|
|
43
|
+
}
|
|
44
|
+
/** Claude Code permission paths: `//abs/path` is absolute. */
|
|
45
|
+
const rulePath = (p) => `/${path.resolve(p)}`;
|
|
46
|
+
export function guardSettings(options) {
|
|
47
|
+
const { argv, home, entry } = options;
|
|
48
|
+
const programs = [...new Set(['courier', 'tc courier', 'tinycloud courier', programName()])];
|
|
49
|
+
const deny = [];
|
|
50
|
+
for (const p of protectedPaths(home, entry)) {
|
|
51
|
+
for (const tool of ['Edit', 'Write', 'MultiEdit', 'NotebookEdit'])
|
|
52
|
+
deny.push(`${tool}(${rulePath(p)}/**)`);
|
|
53
|
+
}
|
|
54
|
+
for (const f of ['key.json', 'grant.json'])
|
|
55
|
+
deny.push(`Read(${rulePath(path.join(home, f))})`);
|
|
56
|
+
// Credential-file Read rules supplement the hook policy.
|
|
57
|
+
for (const rel of CREDENTIAL_FILES)
|
|
58
|
+
deny.push(`Read(${rulePath(path.join(os.homedir(), rel))})`);
|
|
59
|
+
for (const prog of programs)
|
|
60
|
+
for (const sub of ['pair', 'revoke', 'init', 'pause', 'resume', 'watch'])
|
|
61
|
+
deny.push(`Bash(${prog} ${sub}:*)`);
|
|
62
|
+
deny.push('Bash(secret-bridge:*)', 'Bash(secret_bridge:*)', 'mcp__paseo', 'mcp__paseo__*');
|
|
63
|
+
// Gated actions are refused by the hook; these rules make them hold even if the hook does not start. Merges go through
|
|
64
|
+
// `courier run-approved`, which is not on this list. Rules use only the prefix forms Claude Code documents.
|
|
65
|
+
deny.push(...GATED_DENY, ...PRIVILEGE_DENY);
|
|
66
|
+
return {
|
|
67
|
+
disableAllHooks: false,
|
|
68
|
+
hooks: { PreToolUse: [{ matcher: '*', hooks: [{ type: 'command', command: hookCommand(argv, home), timeout: 60 }] }] },
|
|
69
|
+
permissions: { deny },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** The guard's own hook command, as {@link hookCommand} writes it. */
|
|
73
|
+
export const GUARD_HOOK_RE = /^COURIER_HOME=.* 'guard' \|\| exit 2$/;
|
|
74
|
+
const isGuardHook = (entry) => isRecord(entry) && Array.isArray(entry.hooks) && entry.hooks.some((h) => isRecord(h) && typeof h.command === 'string' && GUARD_HOOK_RE.test(h.command));
|
|
75
|
+
/**
|
|
76
|
+
* `ours` merged over a user's settings: the guard's hook goes first, its deny rules are added, `disableAllHooks` is
|
|
77
|
+
* forced to false, and an older copy of the guard's hook in `theirs` is replaced, not duplicated.
|
|
78
|
+
*/
|
|
79
|
+
export function mergeGuardSettings(ours, theirs) {
|
|
80
|
+
if (theirs === undefined)
|
|
81
|
+
return { ...ours };
|
|
82
|
+
if (!isRecord(theirs))
|
|
83
|
+
throw new Error('settings are not a JSON object');
|
|
84
|
+
const theirHooks = isRecord(theirs.hooks) ? theirs.hooks : {};
|
|
85
|
+
const theirPre = (Array.isArray(theirHooks.PreToolUse) ? theirHooks.PreToolUse : []).filter((entry) => !isGuardHook(entry));
|
|
86
|
+
const theirPerms = isRecord(theirs.permissions) ? theirs.permissions : {};
|
|
87
|
+
const theirDeny = Array.isArray(theirPerms.deny) ? theirPerms.deny : [];
|
|
88
|
+
return {
|
|
89
|
+
...theirs,
|
|
90
|
+
disableAllHooks: false,
|
|
91
|
+
hooks: { ...theirHooks, PreToolUse: [...ours.hooks.PreToolUse, ...theirPre] },
|
|
92
|
+
permissions: { ...theirPerms, deny: [...new Set([...ours.permissions.deny, ...theirDeny])] },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The settings the guard installs in a woken agent's project directory. The file is the guard's: only the guard's hook
|
|
97
|
+
* (as the one PreToolUse entry, with no other hook event) and the union of deny rules survive. Everything else in it
|
|
98
|
+
* (other hooks, `env`, `apiKeyHelper`, `statusLine`, MCP servers, allow rules) is replaced, because any of it can run a
|
|
99
|
+
* command or widen what the agent may do (B1).
|
|
100
|
+
*/
|
|
101
|
+
export function projectSettings(ours, theirs) {
|
|
102
|
+
if (theirs !== undefined && !isRecord(theirs))
|
|
103
|
+
throw new Error('settings are not a JSON object');
|
|
104
|
+
const perms = isRecord(theirs) && isRecord(theirs.permissions) ? theirs.permissions : {};
|
|
105
|
+
const theirDeny = Array.isArray(perms.deny) ? perms.deny.filter((rule) => typeof rule === 'string') : [];
|
|
106
|
+
return { disableAllHooks: false, hooks: ours.hooks, permissions: { deny: [...new Set([...ours.permissions.deny, ...theirDeny])] } };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Write the guard settings for `home`. A settings file the owner passed with `--claude-settings` is merged in, with the
|
|
110
|
+
* guard's hook and deny rules added to (never replacing) whatever it holds. Returns the path to give `claude --settings`.
|
|
111
|
+
*/
|
|
112
|
+
export function writeGuardSettings(options) {
|
|
113
|
+
const dir = guardDir(options.home);
|
|
114
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
115
|
+
fs.mkdirSync(noOwnerProfileDir(options.home), { recursive: true, mode: 0o700 });
|
|
116
|
+
installBinaryCensus(path.join(guardDir(options.home), 'binaries.json'), options.entry, options.argv, process.cwd());
|
|
117
|
+
const theirs = options.userSettings ? JSON.parse(fs.readFileSync(options.userSettings, 'utf8')) : undefined;
|
|
118
|
+
if (options.userSettings && !isRecord(theirs))
|
|
119
|
+
throw new Error(`${options.userSettings} is not a JSON object`);
|
|
120
|
+
const merged = mergeGuardSettings(guardSettings(options), theirs);
|
|
121
|
+
const file = guardSettingsFile(options.home);
|
|
122
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
123
|
+
fs.writeFileSync(tmp, `${JSON.stringify(merged, null, 2)}\n`, { mode: 0o600 });
|
|
124
|
+
fs.renameSync(tmp, file);
|
|
125
|
+
return file;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The only variables a woken agent inherits (claude and exec adapters build the environment from this list; nothing else
|
|
129
|
+
* is passed on): paths and locale, proxy and CA settings, what Claude Code itself needs. No inherited `COURIER_*` paths are passed. No tokens:
|
|
130
|
+
* not `GH_TOKEN`/`GITHUB_TOKEN`, `NPM_TOKEN`, `CLOUDFLARE_*`, `WRANGLER_*`, `PHALA_*`, `LINEAR_*`, `AWS_*`, cloud or
|
|
131
|
+
* `TC_*` credentials, nor `SSH_AUTH_SOCK`. An operator who really needs one names it with `--env-pass`.
|
|
132
|
+
*/
|
|
133
|
+
const ALLOWED_ENV = [
|
|
134
|
+
/^(PATH|HOME|USER|LOGNAME|SHELL|LANG|LANGUAGE|TZ|TERM|COLORTERM|NO_COLOR|FORCE_COLOR|TMPDIR|TMP|TEMP|HOSTNAME)$/,
|
|
135
|
+
/^LC_[A-Z_]+$/,
|
|
136
|
+
/^(HTTPS?_PROXY|NO_PROXY|ALL_PROXY)$/i,
|
|
137
|
+
/^(SSL_CERT_FILE|SSL_CERT_DIR|CURL_CA_BUNDLE|REQUESTS_CA_BUNDLE|NODE_EXTRA_CA_CERTS)$/,
|
|
138
|
+
/^CLAUDE_CODE_ENTRYPOINT$/,
|
|
139
|
+
/^CLAUDECODE$/,
|
|
140
|
+
/^TC_BIN$/,
|
|
141
|
+
];
|
|
142
|
+
/** Credential variables explicitly blanked by the Paseo adapter. */
|
|
143
|
+
const BLANKED_ENV = [
|
|
144
|
+
'COURIER_HOME', 'COURIER_REAL_HOME', 'COURIER_BROKER_DIR',
|
|
145
|
+
'GH_TOKEN', 'GITHUB_TOKEN', 'GH_ENTERPRISE_TOKEN', 'GITHUB_ENTERPRISE_TOKEN', 'GITHUB_PAT', 'NPM_TOKEN', 'NODE_AUTH_TOKEN', 'YARN_NPM_AUTH_TOKEN', 'NPM_CONFIG_TOKEN',
|
|
146
|
+
'CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_API_KEY', 'CLOUDFLARE_ACCOUNT_ID', 'CLOUDFLARE_EMAIL', 'CF_API_TOKEN', 'CF_ACCOUNT_ID', 'WRANGLER_API_TOKEN',
|
|
147
|
+
'PHALA_CLOUD_API_KEY', 'PHALA_API_KEY', 'LINEAR_API_KEY', 'LINEAR_ACCESS_TOKEN', 'TYPESAFE_API_KEY',
|
|
148
|
+
'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'AWS_PROFILE', 'GOOGLE_APPLICATION_CREDENTIALS', 'GOOGLE_API_KEY', 'AZURE_CLIENT_SECRET',
|
|
149
|
+
'OPENAI_API_KEY', 'SLACK_BOT_TOKEN', 'SLACK_TOKEN', 'DOCKER_PASSWORD', 'SSH_AUTH_SOCK', 'SSH_ASKPASS', 'GIT_ASKPASS',
|
|
150
|
+
'GIT_CONFIG_PARAMETERS', 'GIT_CONFIG_SYSTEM', 'GIT_CONFIG', 'GIT_EXEC_PATH', 'GIT_SSH_COMMAND', 'GIT_SSH', 'GIT_PROXY_COMMAND', 'GIT_EDITOR', 'GIT_SEQUENCE_EDITOR', 'GIT_PAGER', 'GIT_EXTERNAL_DIFF',
|
|
151
|
+
'BASH_ENV', 'ENV', 'NODE_OPTIONS', 'NODE_PATH', 'LD_PRELOAD', 'LD_LIBRARY_PATH', 'DYLD_INSERT_LIBRARIES', 'ZDOTDIR', 'GH_CONFIG_DIR',
|
|
152
|
+
'ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN', 'CLAUDE_CODE_MESSAGING_TOKEN',
|
|
153
|
+
'TC_PRIVATE_KEY', 'TC_PROFILE', 'TC_OWNER_DID', 'TC_API_KEY', 'TC_TOKEN', 'TC_OPENKEY_HOST', 'TC_OPENKEY_API_HOST', 'TC_AUTH_NO_POPUP', 'TC_NO_POPUP',
|
|
154
|
+
];
|
|
155
|
+
const allowed = (name, extra) => !/^COURIER_/.test(name) && (extra.includes(name) || ALLOWED_ENV.some((re) => re.test(name)));
|
|
156
|
+
/** Private shell/config roots shared by the direct adapters and stock Paseo overrides. */
|
|
157
|
+
export function agentHomeEnv(home) {
|
|
158
|
+
const clean = agentHome(home);
|
|
159
|
+
return {
|
|
160
|
+
HOME: clean, CLAUDE_CONFIG_DIR: path.join(clean, '.claude'), ZDOTDIR: clean,
|
|
161
|
+
XDG_CONFIG_HOME: path.join(clean, '.config'), XDG_DATA_HOME: path.join(clean, '.local/share'),
|
|
162
|
+
XDG_CACHE_HOME: path.join(clean, '.cache'), XDG_STATE_HOME: path.join(clean, '.local/state'),
|
|
163
|
+
XDG_RUNTIME_DIR: path.join(clean, '.runtime'),
|
|
164
|
+
TMPDIR: path.join(clean, 'tmp'), TMP: path.join(clean, 'tmp'), TEMP: path.join(clean, 'tmp'),
|
|
165
|
+
TC_HOME: noOwnerProfileDir(home),
|
|
166
|
+
GIT_CONFIG_COUNT: '1', GIT_CONFIG_KEY_0: 'core.hooksPath', GIT_CONFIG_VALUE_0: '/dev/null',
|
|
167
|
+
GIT_CONFIG_NOSYSTEM: '1', GIT_CONFIG_GLOBAL: path.join(clean, '.gitconfig'),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Environment for a woken agent: an allowlist (see {@link ALLOWED_ENV}) plus `extra` names the operator passed with
|
|
172
|
+
* `--env-pass`. The owner's `tc` profile is hidden by pointing `TC_HOME` at an empty directory.
|
|
173
|
+
*/
|
|
174
|
+
export function courierOnlyEnv(base, home, extra = []) {
|
|
175
|
+
const env = {};
|
|
176
|
+
for (const [name, value] of Object.entries(base))
|
|
177
|
+
if (value !== undefined && allowed(name, extra))
|
|
178
|
+
env[name] = value;
|
|
179
|
+
Object.assign(env, agentHomeEnv(home));
|
|
180
|
+
return env;
|
|
181
|
+
}
|
|
182
|
+
const CREDENTIAL_LIKE = /(TOKEN|SECRET|PASSW|API_?KEY|ACCESS_KEY|PRIVATE_KEY|CREDENTIAL|AUTH)|^(TC|CLOUDFLARE|CF|WRANGLER|PHALA|LINEAR|AWS|GOOGLE|AZURE|GH|GITHUB|NPM|SSH)_/i;
|
|
183
|
+
/** Environment overrides for Paseo: blank credential names and set the clean agent HOME. */
|
|
184
|
+
export function courierEnvOverrides(base, home, extra = []) {
|
|
185
|
+
const out = {};
|
|
186
|
+
for (const name of [...Object.keys(base).filter((n) => CREDENTIAL_LIKE.test(n) || /^(XDG_|GIT_|COURIER_)/.test(n)), ...BLANKED_ENV]) {
|
|
187
|
+
if (!allowed(name, extra) && !name.startsWith('PASEO_') && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
|
|
188
|
+
out[name] = '';
|
|
189
|
+
}
|
|
190
|
+
Object.assign(out, agentHomeEnv(home));
|
|
191
|
+
return out;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/guard/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** WHATWG URL parsing canonicalises short, decimal, octal and hex IPv4 forms. Numeric hosts are refused conservatively. */
|
|
2
|
+
export declare function blockedDestination(value: string): boolean;
|
|
3
|
+
/** Literal addresses inside argv and interpreted HTTP/net client code, including headers and --resolve. */
|
|
4
|
+
export declare function networkTextRefusal(text: string): boolean;
|
|
5
|
+
export type ResolveHost = (host: string) => Promise<string[]>;
|
|
6
|
+
/** DNS check before the tool executes. Errors fail closed. */
|
|
7
|
+
export declare function dnsRefusal(text: string, resolve?: ResolveHost): Promise<boolean>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { isIP } from 'node:net';
|
|
2
|
+
import { lookup } from 'node:dns/promises';
|
|
3
|
+
/** WHATWG URL parsing canonicalises short, decimal, octal and hex IPv4 forms. Numeric hosts are refused conservatively. */
|
|
4
|
+
export function blockedDestination(value) {
|
|
5
|
+
const input = value.trim().replace(/^["']|["',;)]$/g, '');
|
|
6
|
+
if (/^(?:\[?::1\]?|\[?::ffff:)/i.test(input))
|
|
7
|
+
return true;
|
|
8
|
+
let url;
|
|
9
|
+
try {
|
|
10
|
+
url = new URL(input.includes('://') ? input : `http://${input}`);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return /(?:localhost|\b127\.|\b0x7f|\[::)/i.test(input);
|
|
14
|
+
}
|
|
15
|
+
const host = url.hostname.toLowerCase().replace(/\.$/, '').replace(/^\[|\]$/g, '');
|
|
16
|
+
return url.port === '6767' || url.port === '6768' || host === 'localhost' || host.endsWith('.localhost') ||
|
|
17
|
+
isIP(host) !== 0 || /^[0-9]+$/.test(host) || /(?:^|[.-])(?:127|0x7f[0-9a-f]*)(?:[.-]|$)/i.test(host) || /\.(nip|sslip)\.io$/.test(host);
|
|
18
|
+
}
|
|
19
|
+
/** Literal addresses inside argv and interpreted HTTP/net client code, including headers and --resolve. */
|
|
20
|
+
export function networkTextRefusal(text) {
|
|
21
|
+
if (/\/dev\/(tcp|udp)\//i.test(text))
|
|
22
|
+
return true;
|
|
23
|
+
const networkCode = /\b(curl|wget|net|http|https|fetch|connect|urlopen|requests?|socket)\b/.test(text);
|
|
24
|
+
const tokens = text.split(/[\s"'`,(){};=]+/).filter(Boolean);
|
|
25
|
+
for (const token of tokens) {
|
|
26
|
+
if (isIP(token.replace(/^\[|\]$/g, '')) !== 0)
|
|
27
|
+
return true;
|
|
28
|
+
if (networkCode && /^(?:[0-9]{7,}|0x[0-9a-f]+)$/i.test(token) && blockedDestination(token))
|
|
29
|
+
return true;
|
|
30
|
+
if (/^https?:\/\//i.test(token) && blockedDestination(token))
|
|
31
|
+
return true;
|
|
32
|
+
if (/(?:localhost|\[?::|^127\.|^0177\.|^0x7f|^2130706433|^0\.0\.0\.0)/i.test(token) && blockedDestination(token))
|
|
33
|
+
return true;
|
|
34
|
+
if (/(?:^|:)676[78](?:\/|$)/.test(token))
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return /\b(?:connect|urlopen|request|fetch)\b/.test(text) && /\b676[78]\b/.test(text);
|
|
38
|
+
}
|
|
39
|
+
const resolveHost = async (host) => (await lookup(host, { all: true, verbatim: true })).map(r => r.address);
|
|
40
|
+
/** DNS check before the tool executes. Errors fail closed. */
|
|
41
|
+
export async function dnsRefusal(text, resolve = resolveHost) {
|
|
42
|
+
const hosts = new Set();
|
|
43
|
+
for (const token of text.match(/(?:https?:\/\/)[^\s"'`,)]+|\b[a-z0-9.-]+:\d+(?:\/[^\s"']*)?/gi) ?? []) {
|
|
44
|
+
try {
|
|
45
|
+
hosts.add(new URL(token.includes('://') ? token : `http://${token}`).hostname);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (/\b(curl|wget|http|https|httpie|xh|xhs|aria2c|fetch|urlopen|connect)\b/.test(text)) {
|
|
52
|
+
for (const host of text.match(/\b(?:[a-z0-9-]+\.)+[a-z]{2,}\b/gi) ?? [])
|
|
53
|
+
hosts.add(host);
|
|
54
|
+
}
|
|
55
|
+
if (hosts.size > 20)
|
|
56
|
+
return true;
|
|
57
|
+
for (const host of hosts) {
|
|
58
|
+
if (blockedDestination(host))
|
|
59
|
+
return true;
|
|
60
|
+
let timer;
|
|
61
|
+
try {
|
|
62
|
+
const addresses = await Promise.race([resolve(host), new Promise((_, reject) => { timer = setTimeout(() => reject(Error('DNS timeout')), 1500); })]);
|
|
63
|
+
if (!addresses.length || addresses.some(a => {
|
|
64
|
+
const ip = a.replace(/^::ffff:/i, '');
|
|
65
|
+
return /^(127\.|0\.)/.test(ip) || ip === '::1' || ip === '::' || /^::ffff:7f/i.test(a);
|
|
66
|
+
}))
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/guard/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type Verb } from './target.js';
|
|
2
|
+
import type { PolicyEnv, Word } from './policy.js';
|
|
3
|
+
/** A gated command reduced to what an approval names, or the reason it cannot be (the guard then refuses it). */
|
|
4
|
+
export type Norm = {
|
|
5
|
+
verb: Verb;
|
|
6
|
+
target: string;
|
|
7
|
+
} | string;
|
|
8
|
+
export interface NormCtx {
|
|
9
|
+
env: PolicyEnv;
|
|
10
|
+
cwds: string[];
|
|
11
|
+
cwdUnknown: boolean;
|
|
12
|
+
/** `NAME=value` prefix assignments of the command. */
|
|
13
|
+
assigns: string[];
|
|
14
|
+
}
|
|
15
|
+
/** `owner/repo` of a git remote (name or URL), identical across every directory the command may run in. */
|
|
16
|
+
export declare function repoOfRemote(ctx: NormCtx, remote: string | undefined): string | undefined;
|
|
17
|
+
export declare function normGhPrMerge(rest: Word[], ctx: NormCtx, all?: Word[]): Norm;
|
|
18
|
+
export declare function normGhWorkflowRun(rest: Word[], ctx: NormCtx, all?: Word[]): Norm;
|
|
19
|
+
export declare const releaseIsReadOnly: (sub: string | undefined) => boolean;
|
|
20
|
+
export declare function normGhRelease(rest: Word[], ctx: NormCtx, all?: Word[]): Norm;
|
|
21
|
+
export declare function normApi(text: string): Norm;
|
|
22
|
+
export declare function normPublish(prog: string, rest: Word[], ctx: NormCtx): Norm;
|
|
23
|
+
export declare function normChangeset(ctx: NormCtx): Norm;
|
|
24
|
+
export declare function normScript(prog: string, script: string, ctx: NormCtx): Norm;
|
|
25
|
+
export declare function normWrangler(rest: Word[], ctx: NormCtx): Norm;
|
|
26
|
+
export declare function normPhala(rest: Word[]): Norm;
|
|
27
|
+
export declare function normSecrets(rest: Word[]): Norm;
|
|
28
|
+
export declare function normPush(remote: string | undefined, branches: string[], ctx: NormCtx): Norm;
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { canonicalTarget } from './target.js';
|
|
3
|
+
const fail = (why) => why;
|
|
4
|
+
const lits = (args) => args.map((a) => a.value);
|
|
5
|
+
function ok(verb, target) {
|
|
6
|
+
try {
|
|
7
|
+
return { verb, target: canonicalTarget(verb, target) };
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return fail(`cannot name the target (${target.slice(0, 80)})`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Value of `--flag v`, `--flag=v` or `-f v` (first occurrence), or undefined. */
|
|
14
|
+
function flagValue(args, names) {
|
|
15
|
+
for (let i = 0; i < args.length; i++) {
|
|
16
|
+
const v = args[i].value;
|
|
17
|
+
for (const n of names) {
|
|
18
|
+
if (v === n)
|
|
19
|
+
return args[i + 1]?.value;
|
|
20
|
+
if (n.startsWith('--') && v.startsWith(`${n}=`))
|
|
21
|
+
return v.slice(n.length + 1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const GITHUB_REMOTE = /github\.com[:/]([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+?)(?:\.git)?\/?$/;
|
|
27
|
+
/** `owner/repo` of a git remote (name or URL), identical across every directory the command may run in. */
|
|
28
|
+
export function repoOfRemote(ctx, remote) {
|
|
29
|
+
const direct = remote ? GITHUB_REMOTE.exec(remote) : null;
|
|
30
|
+
if (direct)
|
|
31
|
+
return `${direct[1]}/${direct[2]}`.toLowerCase();
|
|
32
|
+
if (ctx.cwdUnknown)
|
|
33
|
+
return undefined;
|
|
34
|
+
const found = new Set();
|
|
35
|
+
for (const dir of ctx.cwds) {
|
|
36
|
+
const r = ctx.env.git(dir, ['remote', 'get-url', remote ?? 'origin']);
|
|
37
|
+
if (!r.ok)
|
|
38
|
+
continue;
|
|
39
|
+
const m = GITHUB_REMOTE.exec(r.out.trim());
|
|
40
|
+
if (m)
|
|
41
|
+
found.add(`${m[1]}/${m[2]}`.toLowerCase());
|
|
42
|
+
else
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return found.size === 1 ? [...found][0] : undefined;
|
|
46
|
+
}
|
|
47
|
+
/** The repo `gh` will act on: -R/--repo, then GH_REPO (assigned here or in the environment), then the origin remote. */
|
|
48
|
+
function ghRepo(args, ctx) {
|
|
49
|
+
const fromFlag = flagValue(args, ['-R', '--repo']);
|
|
50
|
+
const assigned = ctx.assigns.find((a) => a.startsWith('GH_REPO='))?.slice(8) ?? ctx.env.getenv('GH_REPO');
|
|
51
|
+
const raw = fromFlag ?? assigned;
|
|
52
|
+
if (raw) {
|
|
53
|
+
const m = /^(?:[^/\s]+\/)?([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/.exec(raw);
|
|
54
|
+
return m ? `${m[1]}/${m[2]}`.toLowerCase() : undefined;
|
|
55
|
+
}
|
|
56
|
+
return repoOfRemote(ctx, undefined);
|
|
57
|
+
}
|
|
58
|
+
const MERGE_VALUE_FLAGS = new Set(['-R', '--repo', '-b', '--body', '-F', '--body-file', '-t', '--subject', '-A', '--author-email', '--match-head-commit']);
|
|
59
|
+
/** Positionals of `rest`, skipping flags and the values of `valueFlags`. */
|
|
60
|
+
function positionals(rest, valueFlags) {
|
|
61
|
+
const out = [];
|
|
62
|
+
for (let i = 0; i < rest.length; i++) {
|
|
63
|
+
const v = rest[i].value;
|
|
64
|
+
if (v === '--') {
|
|
65
|
+
out.push(...lits(rest.slice(i + 1)));
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
if (v.startsWith('-')) {
|
|
69
|
+
if (valueFlags.has(v))
|
|
70
|
+
i++;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
out.push(v);
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
export function normGhPrMerge(rest, ctx, all = rest) {
|
|
78
|
+
const [selector] = positionals(rest, MERGE_VALUE_FLAGS);
|
|
79
|
+
if (!selector)
|
|
80
|
+
return fail('name the PR by number or URL (gh pr merge <number> --repo owner/repo); the current branch is not a target');
|
|
81
|
+
const url = /^https?:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)/i.exec(selector);
|
|
82
|
+
const repo = url ? `${url[1]}/${url[2]}`.toLowerCase() : /^#?\d+$/.test(selector) ? ghRepo(all, ctx) : undefined;
|
|
83
|
+
const number = url ? url[3] : /^#?(\d+)$/.exec(selector)?.[1];
|
|
84
|
+
if (!number)
|
|
85
|
+
return fail('name the PR by number or URL, not by branch');
|
|
86
|
+
if (!repo)
|
|
87
|
+
return fail('could not tell which repository (add --repo owner/repo)');
|
|
88
|
+
return ok('merge', `${repo}#${number}`);
|
|
89
|
+
}
|
|
90
|
+
export function normGhWorkflowRun(rest, ctx, all = rest) {
|
|
91
|
+
const [workflow] = positionals(rest, new Set(['-R', '--repo', '-r', '--ref', '-f', '--raw-field', '-F', '--field', '--json']));
|
|
92
|
+
const repo = ghRepo(all, ctx);
|
|
93
|
+
if (!workflow)
|
|
94
|
+
return fail('name the workflow (gh workflow run <file or name> --repo owner/repo)');
|
|
95
|
+
if (!repo)
|
|
96
|
+
return fail('could not tell which repository (add --repo owner/repo)');
|
|
97
|
+
return ok('other', `workflow:${repo}:${workflow}`);
|
|
98
|
+
}
|
|
99
|
+
const RELEASE_READ_ONLY = new Set(['list', 'view', 'download', 'verify', 'verify-asset']);
|
|
100
|
+
export const releaseIsReadOnly = (sub) => sub !== undefined && RELEASE_READ_ONLY.has(sub);
|
|
101
|
+
export function normGhRelease(rest, ctx, all = rest) {
|
|
102
|
+
const [tag] = positionals(rest, new Set(['-R', '--repo', '-t', '--title', '-n', '--notes', '-F', '--notes-file', '--target', '--discussion-category', '--notes-start-tag']));
|
|
103
|
+
const repo = ghRepo(all, ctx);
|
|
104
|
+
if (!tag)
|
|
105
|
+
return fail('name the release tag (gh release <create|edit|delete|upload> <tag> --repo owner/repo)');
|
|
106
|
+
if (!repo)
|
|
107
|
+
return fail('could not tell which repository (add --repo owner/repo)');
|
|
108
|
+
return ok('publish', `release:${repo}@${tag}`);
|
|
109
|
+
}
|
|
110
|
+
// ---- GitHub API ----
|
|
111
|
+
export function normApi(text) {
|
|
112
|
+
const targets = new Set();
|
|
113
|
+
const clean = text.replace(/\u0001/g, '\u0001');
|
|
114
|
+
if (clean.includes('\u0001') && /merge|refs|graphql/i.test(clean)) {
|
|
115
|
+
// A placeholder inside the endpoint (e.g. pulls/$N/merge) means the target is decided at run time.
|
|
116
|
+
if (/\/pulls\/[^\/\s]*\u0001[^\/\s]*\/merge|repos\/[^\s]*\u0001/i.test(clean))
|
|
117
|
+
return fail('the API endpoint contains a variable; write it out literally');
|
|
118
|
+
}
|
|
119
|
+
// Every target goes through the same canonicalTarget as an approval's: exact PR digits, lower-cased repo, and a
|
|
120
|
+
// number it cannot name (0, or more than 9 digits) becomes 'unknown', which refuses the call.
|
|
121
|
+
const addAll = (re, build) => {
|
|
122
|
+
for (const m of clean.matchAll(re)) {
|
|
123
|
+
const raw = build(m);
|
|
124
|
+
let canonical;
|
|
125
|
+
try {
|
|
126
|
+
canonical = raw === undefined ? undefined : canonicalTarget('merge', raw);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
canonical = undefined;
|
|
130
|
+
}
|
|
131
|
+
targets.add(canonical ?? 'unknown');
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
addAll(/repos\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pulls\/(\d+)\/merge\b/gi, (m) => `${m[1]}/${m[2]}#${m[3]}`);
|
|
135
|
+
addAll(/repos\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/git\/refs\/heads\/(main|master)\b/gi, (m) => `${m[1]}/${m[2]}`.toLowerCase() + `@${m[3].toLowerCase()}`);
|
|
136
|
+
addAll(/repos\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/merges\b/gi, (m) => {
|
|
137
|
+
const base = /(?:^|\n)(?:base=|"base"\s*:\s*")([A-Za-z0-9_./-]+)/.exec(clean)?.[1];
|
|
138
|
+
return base ? `${m[1]}/${m[2]}`.toLowerCase() + `@${base}` : undefined;
|
|
139
|
+
});
|
|
140
|
+
const merged = /\/pulls\/[^\/\s]*\/merge\b|\/merges\b|\/git\/refs\/(heads\/)?(main|master)\b/i.test(clean);
|
|
141
|
+
const graphql = /\bmergePullRequest\b|\benablePullRequestAutoMerge\b|\bmergeBranch\b|\bupdateRef\b|\bcreateCommitOnBranch\b/i.test(clean);
|
|
142
|
+
if (graphql)
|
|
143
|
+
return fail('GraphQL merges and ref writes cannot be tied to a target; use `gh pr merge <number> --repo owner/repo`');
|
|
144
|
+
if (!merged || targets.size !== 1 || targets.has('unknown'))
|
|
145
|
+
return fail('could not tie the API call to a single repository and PR or branch');
|
|
146
|
+
const [t] = [...targets];
|
|
147
|
+
return ok('merge', t);
|
|
148
|
+
}
|
|
149
|
+
// ---- package publish / deploy ----
|
|
150
|
+
function readJson(ctx, rel) {
|
|
151
|
+
if (ctx.cwdUnknown)
|
|
152
|
+
return undefined;
|
|
153
|
+
const dirs = new Set();
|
|
154
|
+
for (const dir of ctx.cwds) {
|
|
155
|
+
const r = ctx.env.readFile(path.resolve(dir, rel));
|
|
156
|
+
if (r.state !== 'text')
|
|
157
|
+
continue;
|
|
158
|
+
try {
|
|
159
|
+
dirs.add(r.text);
|
|
160
|
+
}
|
|
161
|
+
catch { /* skip */ }
|
|
162
|
+
}
|
|
163
|
+
if (dirs.size !== 1)
|
|
164
|
+
return undefined;
|
|
165
|
+
try {
|
|
166
|
+
return JSON.parse([...dirs][0]);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function readText(ctx, rel) {
|
|
173
|
+
if (ctx.cwdUnknown)
|
|
174
|
+
return undefined;
|
|
175
|
+
const found = new Set();
|
|
176
|
+
for (const dir of ctx.cwds) {
|
|
177
|
+
const r = ctx.env.readFile(path.resolve(dir, rel));
|
|
178
|
+
if (r.state === 'text')
|
|
179
|
+
found.add(r.text);
|
|
180
|
+
}
|
|
181
|
+
return found.size === 1 ? [...found][0] : undefined;
|
|
182
|
+
}
|
|
183
|
+
const PUBLISH_VALUE_FLAGS = new Set(['--tag', '--access', '--otp', '--registry', '--prefix', '--userconfig', '--cache', '--provenance-file', '--auth-type', '--tolerate-republish', '--gzip-level']);
|
|
184
|
+
export function normPublish(prog, rest, ctx) {
|
|
185
|
+
const flags = lits(rest);
|
|
186
|
+
if (flags.some((f) => /^(-w|--workspace(=.*)?|-ws|--workspaces|--recursive|-r|--filter(=.*)?)$/.test(f))) {
|
|
187
|
+
return fail('publishing several workspaces at once cannot be tied to one target; publish one package directory at a time');
|
|
188
|
+
}
|
|
189
|
+
const pos = positionals(rest, PUBLISH_VALUE_FLAGS);
|
|
190
|
+
if (pos.length > 1)
|
|
191
|
+
return fail('give at most one package directory');
|
|
192
|
+
const arg = pos[0];
|
|
193
|
+
if (arg && /\.(tgz|tar\.gz)$/i.test(arg))
|
|
194
|
+
return fail('publishing a tarball cannot be tied to a package; publish from the package directory');
|
|
195
|
+
const dir = arg && !/^(\w+:|[^./~][^/]*\/[^/]*@)/.test(arg) ? arg : undefined;
|
|
196
|
+
const pkg = readJson(ctx, path.join(dir ?? '.', 'package.json'));
|
|
197
|
+
if (!pkg)
|
|
198
|
+
return fail(`could not read ${prog}'s package.json (name and version) to name the target`);
|
|
199
|
+
if (typeof pkg.name !== 'string' || typeof pkg.version !== 'string')
|
|
200
|
+
return fail('package.json has no name and version');
|
|
201
|
+
return ok('publish', `npm:${pkg.name}@${pkg.version}`);
|
|
202
|
+
}
|
|
203
|
+
export function normChangeset(ctx) {
|
|
204
|
+
const pkg = readJson(ctx, 'package.json');
|
|
205
|
+
if (!pkg || typeof pkg.name !== 'string')
|
|
206
|
+
return fail('could not read the root package.json to name `changeset publish` (it publishes every pending package)');
|
|
207
|
+
return ok('publish', `changeset:${pkg.name}`);
|
|
208
|
+
}
|
|
209
|
+
export function normScript(prog, script, ctx) {
|
|
210
|
+
const pkg = readJson(ctx, 'package.json');
|
|
211
|
+
if (!pkg || typeof pkg.name !== 'string')
|
|
212
|
+
return fail('could not read package.json to name the script');
|
|
213
|
+
const verb = /^deploy/i.test(script) ? 'deploy' : 'publish';
|
|
214
|
+
return ok(verb, `script:${pkg.name}:${script}`);
|
|
215
|
+
}
|
|
216
|
+
function configName(ctx, configFlag) {
|
|
217
|
+
const toml = readText(ctx, configFlag ?? 'wrangler.toml');
|
|
218
|
+
if (toml !== undefined)
|
|
219
|
+
return /^name\s*=\s*"([^"]+)"/m.exec(toml)?.[1];
|
|
220
|
+
for (const file of configFlag ? [] : ['wrangler.jsonc', 'wrangler.json']) {
|
|
221
|
+
const text = readText(ctx, file);
|
|
222
|
+
if (text !== undefined)
|
|
223
|
+
return /"name"\s*:\s*"([^"]+)"/.exec(text)?.[1];
|
|
224
|
+
}
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
export function normWrangler(rest, ctx) {
|
|
228
|
+
const pos = positionals(rest, new Set(['-n', '--name', '-e', '--env', '-c', '--config', '--project-name', '--branch', '--commit-hash', '--commit-message', '--compatibility-date', '--message', '--tag']));
|
|
229
|
+
if (pos[0] === 'pages') {
|
|
230
|
+
const project = flagValue(rest, ['--project-name']);
|
|
231
|
+
return project ? ok('deploy', `pages:${project}`) : fail('name the Pages project (--project-name)');
|
|
232
|
+
}
|
|
233
|
+
const name = flagValue(rest, ['-n', '--name']) ?? configName(ctx, flagValue(rest, ['-c', '--config']));
|
|
234
|
+
const env = flagValue(rest, ['-e', '--env']);
|
|
235
|
+
if (!name)
|
|
236
|
+
return fail('could not tell which worker (add --name or run from a directory with a wrangler config that has a name)');
|
|
237
|
+
return ok('deploy', `wrangler:${name}${env ? `:${env}` : ''}`);
|
|
238
|
+
}
|
|
239
|
+
export function normPhala(rest) {
|
|
240
|
+
const name = flagValue(rest, ['-n', '--name']) ?? flagValue(rest, ['--cvm-id', '--uuid']);
|
|
241
|
+
return name ? ok('deploy', `phala:${name}`) : fail('name the CVM (phala deploy --name <name>)');
|
|
242
|
+
}
|
|
243
|
+
export function normSecrets(rest) {
|
|
244
|
+
const words = lits(rest);
|
|
245
|
+
return ok('other', `secrets:${words.join(' ')}`);
|
|
246
|
+
}
|
|
247
|
+
// ---- git push ----
|
|
248
|
+
export function normPush(remote, branches, ctx) {
|
|
249
|
+
const repo = repoOfRemote(ctx, remote);
|
|
250
|
+
if (!repo)
|
|
251
|
+
return fail('could not tell which GitHub repository the push goes to');
|
|
252
|
+
const names = new Set(branches.map((b) => (/^(main|master)$/i.test(b) ? b.toLowerCase() : b)));
|
|
253
|
+
if (names.size !== 1)
|
|
254
|
+
return fail('a push to several branches cannot be tied to one target');
|
|
255
|
+
return ok('merge', `${repo}@${[...names][0]}`);
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/guard/normalize.ts"],"names":[],"mappings":"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"}
|