wawesome 0.14.1 → 0.14.3
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 +75 -47
- package/dist/index.mjs +129 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -312,27 +312,38 @@ stderr, so a redirect catches the secret and not one character besides:
|
|
|
312
312
|
npx wawesome credentials mint ci-pipeline > secret.txt
|
|
313
313
|
```
|
|
314
314
|
|
|
315
|
-
A
|
|
316
|
-
|
|
315
|
+
A capability is one cell of a grid: a verb, `read` or `write`, and the resource it acts on. A
|
|
316
|
+
credential carries the words a deploy needs, reaches every App in the workspace, and expires in
|
|
317
|
+
ninety days unless you say otherwise:
|
|
317
318
|
|
|
318
319
|
```bash
|
|
319
|
-
# reads and
|
|
320
|
-
npx wawesome credentials mint
|
|
320
|
+
# reads what ran and fires a run of what somebody else shipped, on one App, never expires
|
|
321
|
+
npx wawesome credentials mint runner -c read:apps,read:functions,read:invocations,write:runs -a prod --expires never
|
|
321
322
|
|
|
322
|
-
# ships code and attaches the domain the project declares
|
|
323
|
-
npx wawesome credentials mint ci -c
|
|
323
|
+
# ships code into an App it may create, and attaches the domain the project declares
|
|
324
|
+
npx wawesome credentials mint ci -c write:apps,write:functions,write:env,read:tenant,write:domains -a prod
|
|
324
325
|
```
|
|
325
326
|
|
|
326
327
|
| Flag | Meaning |
|
|
327
328
|
|:---------------------|:------------------------------------------------------------------------------|
|
|
328
|
-
| `-c, --capability` | `
|
|
329
|
+
| `-c, --capability` | A `{read\|write}:{resource}` word — `read:apps`, `write:functions`, `write:env`, `write:runs` and the rest. Repeatable or comma-separated. Default: `write:apps`, `write:functions`, `write:env`, `read:domains`, `read:tenant` |
|
|
330
|
+
| `--preset` | The words one job needs, by the job's name: `viewer`, `deployer`, `member`. [Which credential for which job](#which-credential-for-which-job) is what each one grants. Not with `-c` |
|
|
329
331
|
| `-a, --app` | Restrict to these Apps, by slug. Repeatable. Default: every App in the workspace |
|
|
330
332
|
| `--expires` | Days, or `never`. Default: 90 |
|
|
331
333
|
|
|
334
|
+
The resources are `tenant`, `apps`, `functions`, `env`, `domains`, `invocations`, `runs`,
|
|
335
|
+
`schedules`, `previews` and `egress`. A write reaches the read of the same resource, so
|
|
336
|
+
`write:functions` carries `read:functions` and there is no reason to name both. The command prints
|
|
337
|
+
the words the credential ended up with.
|
|
338
|
+
|
|
339
|
+
Some things are a person's alone, whatever a credential carries: renaming the workspace, detaching a
|
|
340
|
+
domain, widening the egress allowlist, billing, and this workspace's own credentials and members.
|
|
341
|
+
Those are not words to mint — a credential asking for one is told a person has to be at the keyboard.
|
|
342
|
+
|
|
332
343
|
An App named in a restriction does not have to exist yet. A pipeline whose first deploy creates the
|
|
333
|
-
App it was minted for is the ordinary case. A restriction bounds what a credential
|
|
334
|
-
what it
|
|
335
|
-
runtime.
|
|
344
|
+
App it was minted for is the ordinary case. A restriction bounds what a credential reads as well as
|
|
345
|
+
what it disturbs, and `write:functions` is the hole in it: a Function deployed into an App the
|
|
346
|
+
credential does reach still reads the whole workspace's environment at runtime.
|
|
336
347
|
|
|
337
348
|
### List them
|
|
338
349
|
|
|
@@ -468,19 +479,22 @@ concluding the platform cannot do it.
|
|
|
468
479
|
|:---------------------------|:------------------------------------------------------------------------|:--------------|
|
|
469
480
|
| `list_templates` | The template catalogue, with what each one is for | nothing |
|
|
470
481
|
| `get_template` | One template's files, environment contract and outbound providers | nothing |
|
|
471
|
-
| `list_apps` | The Apps
|
|
472
|
-
| `list_functions` | The Functions in one App, and what their live version carries | `read`
|
|
473
|
-
| `list_versions` | A Function's Versions, and which one is live | `read`
|
|
474
|
-
| `get_usage` | The Tenant's usage and headroom | `read`
|
|
475
|
-
| `list_invocations` | Recent Invocations of a Function, failures included | `
|
|
476
|
-
| `get_invocation` | One Invocation by id | `
|
|
477
|
-
| `read_invocation_logs` | An Invocation's log body, a page at a time | `
|
|
478
|
-
| `diagnose_latest_failure` | The latest failure, its logs and the Version that ran it, in one call | `
|
|
479
|
-
| `deploy_function` | Deploys code and the static files it carries | `
|
|
480
|
-
| `deploy_status` | How a deploy went, by the handle it answered with | `
|
|
481
|
-
| `rollback_function` | Puts a Version the Function already has back on its public address | `
|
|
482
|
-
| `set_env_var` | Sets an App's environment variable, read at the next invocation | `
|
|
483
|
-
| `invoke_function` | Runs a deployed Function once and answers with the Invocation id | `
|
|
482
|
+
| `list_apps` | The Apps the credential reaches, with the slug each is addressed by | `read:apps` |
|
|
483
|
+
| `list_functions` | The Functions in one App, and what their live version carries | `read:functions` |
|
|
484
|
+
| `list_versions` | A Function's Versions, and which one is live | `read:functions` |
|
|
485
|
+
| `get_usage` | The Tenant's usage and headroom | `read:tenant` |
|
|
486
|
+
| `list_invocations` | Recent Invocations of a Function, failures included | `read:invocations` |
|
|
487
|
+
| `get_invocation` | One Invocation by id | `read:invocations` |
|
|
488
|
+
| `read_invocation_logs` | An Invocation's log body, a page at a time | `read:invocations` |
|
|
489
|
+
| `diagnose_latest_failure` | The latest failure, its logs and the Version that ran it, in one call | `read:invocations`, `read:functions` |
|
|
490
|
+
| `deploy_function` | Deploys code and the static files it carries | `write:functions` |
|
|
491
|
+
| `deploy_status` | How a deploy went, by the handle it answered with | `read:functions` |
|
|
492
|
+
| `rollback_function` | Puts a Version the Function already has back on its public address | `write:functions` |
|
|
493
|
+
| `set_env_var` | Sets an App's environment variable, read at the next invocation | `write:env` |
|
|
494
|
+
| `invoke_function` | Runs a deployed Function once and answers with the Invocation id | `write:runs` |
|
|
495
|
+
|
|
496
|
+
A word that writes reaches the read of the same thing, so `write:functions` needs no `read:functions`
|
|
497
|
+
beside it, and the presets below are named in exactly these words.
|
|
484
498
|
|
|
485
499
|
A deploy is two calls. The first says which of your files the platform does not already hold, by
|
|
486
500
|
content hash; your agent uploads those bytes to `PUT /v1/assets/{content_hash}` with the same
|
|
@@ -499,42 +513,48 @@ is all the platform permits, and an agent taking it would end yours.
|
|
|
499
513
|
### Which credential for which job
|
|
500
514
|
|
|
501
515
|
A credential carries the words its job needs and stops there. They are the same words
|
|
502
|
-
[Deploy credentials](#mint-one) mints with
|
|
516
|
+
[Deploy credentials](#mint-one) mints with, and `--preset` fills them in for you: it expands into the
|
|
517
|
+
words below before the request is built, and the command prints the words the credential ended up
|
|
518
|
+
with. A preset and `-c` together are refused rather than merged, since both name the same thing. The
|
|
519
|
+
preset is the name of the job; the words are the grant, and they are what travels.
|
|
520
|
+
|
|
521
|
+
A preset is a workspace role, and the ones offered here are the roles carrying nothing only a person
|
|
522
|
+
can hold. The name a job is minted under and the standing a member is given are one thing, rather
|
|
523
|
+
than two lists somebody has to keep level.
|
|
503
524
|
|
|
504
|
-
**Read and investigate, without the ability to ship
|
|
505
|
-
|
|
506
|
-
ships code or runs it
|
|
525
|
+
**Read and investigate, without the ability to ship** — `viewer`, which is every `read:` word the
|
|
526
|
+
platform has. The agent enumerates your Apps, reads Functions, Versions, Invocations and log bodies,
|
|
527
|
+
diagnoses a failure, checks usage, and browses templates. Every tool that ships code or runs it
|
|
528
|
+
refuses:
|
|
507
529
|
|
|
508
530
|
```bash
|
|
509
|
-
npx wawesome credentials mint
|
|
531
|
+
npx wawesome credentials mint reader --preset viewer -a prod
|
|
510
532
|
```
|
|
511
533
|
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
the task and every other read works.
|
|
515
|
-
|
|
516
|
-
**Read, investigate and run.** The same, plus `invoke_function`, so the agent can exercise a Function
|
|
517
|
-
and read what it did. It still cannot deploy, roll back, or set a variable:
|
|
534
|
+
**Ship and read back** — `deployer`, which is every read plus `write:apps`, `write:functions`,
|
|
535
|
+
`write:env` and `write:runs`. Deploy, run, diagnose, roll back, set a key. Every tool in the table:
|
|
518
536
|
|
|
519
537
|
```bash
|
|
520
|
-
npx wawesome credentials mint
|
|
538
|
+
npx wawesome credentials mint ci --preset deployer -a prod
|
|
521
539
|
```
|
|
522
540
|
|
|
523
|
-
**The whole
|
|
541
|
+
**The whole workspace** — `member`, which is the deployer's words plus `write:schedules` and
|
|
542
|
+
`write:previews`, for an agent that pauses a schedule or cuts a preview as well:
|
|
524
543
|
|
|
525
544
|
```bash
|
|
526
|
-
npx wawesome credentials mint agent
|
|
545
|
+
npx wawesome credentials mint agent --preset member -a prod
|
|
527
546
|
```
|
|
528
547
|
|
|
529
|
-
Add `domains
|
|
530
|
-
|
|
531
|
-
|
|
548
|
+
Add `write:domains` where the project declares a custom domain the deploy should claim. Nothing gives
|
|
549
|
+
an agent billing, a plan change, credential management or your workspace's slug: those are closed to
|
|
550
|
+
every credential, whatever it carries.
|
|
532
551
|
|
|
533
552
|
Keep `-a` on all three. A credential restricted to one App is refused on every tool that names
|
|
534
553
|
another, which is what stops an agent working on one client's project from touching another's.
|
|
535
|
-
`get_invocation` and `read_invocation_logs` take an Invocation id rather than an App, and
|
|
536
|
-
|
|
537
|
-
|
|
554
|
+
`get_invocation` and `read_invocation_logs` take an Invocation id rather than an App, and an id
|
|
555
|
+
belonging to an App the credential cannot reach is answered as an id naming nothing. `list_apps`
|
|
556
|
+
answers a set rather than one App, so it is narrowed instead of refused: the credential is listed the
|
|
557
|
+
Apps it reaches and told nothing about the rest.
|
|
538
558
|
|
|
539
559
|
### When a tool refuses
|
|
540
560
|
|
|
@@ -542,10 +562,18 @@ A refusal is the tool's answer, not a protocol error, and it carries the same `r
|
|
|
542
562
|
prints:
|
|
543
563
|
|
|
544
564
|
- `credential-missing-capability`. The credential does not carry a word this tool needs. The refusal
|
|
545
|
-
names
|
|
565
|
+
names the first in `missing_capability` and every one of them in `missing_capabilities`, which are
|
|
566
|
+
the words to mint a credential with. This one answers `403` rather than `200`, with a
|
|
567
|
+
`WWW-Authenticate: Bearer error="insufficient_scope"` challenge naming the same words and where
|
|
568
|
+
this endpoint's OAuth metadata is — a connector installed through consent reads it and asks its
|
|
569
|
+
human to widen the grant rather than to install again.
|
|
546
570
|
- `app-outside-credential-scope`. The credential is restricted to named Apps and this is not one of
|
|
547
571
|
them. A wider capability changes nothing here.
|
|
548
572
|
|
|
573
|
+
A `401` is the credential itself: revoked, expired, or one this platform never issued. Nothing else
|
|
574
|
+
answers one — a workspace that cannot deploy for a lapsed plan or a restriction is refused under its
|
|
575
|
+
own reason, and re-installing the connector would not fix either.
|
|
576
|
+
|
|
549
577
|
A quota refusal carries its numbers under `allowance` beside the prose, so your agent reports
|
|
550
578
|
"3 of 3 App slots" rather than handing you a sentence to read.
|
|
551
579
|
|
|
@@ -731,9 +759,9 @@ npx wawesome domains
|
|
|
731
759
|
```
|
|
732
760
|
|
|
733
761
|
It prints the domain, where it got to, when the platform last checked, and the records to add. It
|
|
734
|
-
changes nothing, and a deploy credential carrying `
|
|
735
|
-
thing you do. The TXT record is minted a moment after the name is claimed, and an attach that
|
|
736
|
-
it prints a row saying so rather than dropping the record from the list. That row is what this
|
|
762
|
+
changes nothing, and a deploy credential carrying `read:domains` can run it, so a pipeline reads the
|
|
763
|
+
same thing you do. The TXT record is minted a moment after the name is claimed, and an attach that
|
|
764
|
+
outran it prints a row saying so rather than dropping the record from the list. That row is what this
|
|
737
765
|
command fills in, and it is where the deploy sends you: deploying again would change nothing, and a
|
|
738
766
|
deploy that changes nothing is refused.
|
|
739
767
|
|
package/dist/index.mjs
CHANGED
|
@@ -883,7 +883,7 @@ async function buildJs(entryInput, options) {
|
|
|
883
883
|
* that has to name this version — `--version`, the dependency a scaffolded
|
|
884
884
|
* project pins — reads it here, so a release bumps one file.
|
|
885
885
|
*/
|
|
886
|
-
const CLI_VERSION = "0.14.
|
|
886
|
+
const CLI_VERSION = "0.14.3";
|
|
887
887
|
//#endregion
|
|
888
888
|
//#region src/prompt.ts
|
|
889
889
|
/**
|
|
@@ -1685,7 +1685,7 @@ async function detachDomainCommand(hostname, options = {}) {
|
|
|
1685
1685
|
* The one place a Tenant can ask. The records used to exist only in the output
|
|
1686
1686
|
* of a deploy that changed something, so a deploy that outran the vendor left
|
|
1687
1687
|
* nothing to run but a second deploy, which is refused for changing nothing
|
|
1688
|
-
* (#617). Open to a deploy credential carrying `
|
|
1688
|
+
* (#617). Open to a deploy credential carrying `read:domains`, since a pipeline asks
|
|
1689
1689
|
* this too.
|
|
1690
1690
|
*/
|
|
1691
1691
|
async function showDomainCommand(options = {}) {
|
|
@@ -4667,6 +4667,74 @@ async function workspaceCommand(action, target, options) {
|
|
|
4667
4667
|
process.exit(1);
|
|
4668
4668
|
}
|
|
4669
4669
|
//#endregion
|
|
4670
|
+
//#region ../shared/mint-surface.generated.ts
|
|
4671
|
+
const MINT_PRESETS = [
|
|
4672
|
+
{
|
|
4673
|
+
name: "viewer",
|
|
4674
|
+
job: "Read and investigate",
|
|
4675
|
+
capabilities: [
|
|
4676
|
+
"read:tenant",
|
|
4677
|
+
"read:apps",
|
|
4678
|
+
"read:functions",
|
|
4679
|
+
"read:env",
|
|
4680
|
+
"read:domains",
|
|
4681
|
+
"read:invocations",
|
|
4682
|
+
"read:runs",
|
|
4683
|
+
"read:schedules",
|
|
4684
|
+
"read:previews",
|
|
4685
|
+
"read:egress"
|
|
4686
|
+
],
|
|
4687
|
+
summary: "Reads the workspace, Apps, Functions, environment variables, domains, invocations, runs, schedules, previews and the egress allowlist. It writes nothing."
|
|
4688
|
+
},
|
|
4689
|
+
{
|
|
4690
|
+
name: "deployer",
|
|
4691
|
+
job: "Ship and read back",
|
|
4692
|
+
capabilities: [
|
|
4693
|
+
"read:tenant",
|
|
4694
|
+
"read:apps",
|
|
4695
|
+
"read:functions",
|
|
4696
|
+
"read:env",
|
|
4697
|
+
"read:domains",
|
|
4698
|
+
"read:invocations",
|
|
4699
|
+
"read:runs",
|
|
4700
|
+
"read:schedules",
|
|
4701
|
+
"read:previews",
|
|
4702
|
+
"read:egress",
|
|
4703
|
+
"write:apps",
|
|
4704
|
+
"write:functions",
|
|
4705
|
+
"write:env",
|
|
4706
|
+
"write:runs"
|
|
4707
|
+
],
|
|
4708
|
+
summary: "Reads the workspace, Apps, Functions, environment variables, domains, invocations, runs, schedules, previews and the egress allowlist, and can create Apps, deploy Functions, set environment variables and run Functions. It does not attach domains, pause and resume schedules or create previews."
|
|
4709
|
+
},
|
|
4710
|
+
{
|
|
4711
|
+
name: "member",
|
|
4712
|
+
job: "Build in the workspace",
|
|
4713
|
+
capabilities: [
|
|
4714
|
+
"read:tenant",
|
|
4715
|
+
"read:apps",
|
|
4716
|
+
"read:functions",
|
|
4717
|
+
"read:env",
|
|
4718
|
+
"read:domains",
|
|
4719
|
+
"read:invocations",
|
|
4720
|
+
"read:runs",
|
|
4721
|
+
"read:schedules",
|
|
4722
|
+
"read:previews",
|
|
4723
|
+
"read:egress",
|
|
4724
|
+
"write:apps",
|
|
4725
|
+
"write:functions",
|
|
4726
|
+
"write:env",
|
|
4727
|
+
"write:runs",
|
|
4728
|
+
"write:schedules",
|
|
4729
|
+
"write:previews"
|
|
4730
|
+
],
|
|
4731
|
+
summary: "Reads the workspace, Apps, Functions, environment variables, domains, invocations, runs, schedules, previews and the egress allowlist, and can create Apps, deploy Functions, set environment variables, run Functions, pause and resume schedules and create previews. It does not attach domains."
|
|
4732
|
+
}
|
|
4733
|
+
];
|
|
4734
|
+
function mintPreset(name) {
|
|
4735
|
+
return MINT_PRESETS.find((preset) => preset.name === name);
|
|
4736
|
+
}
|
|
4737
|
+
//#endregion
|
|
4670
4738
|
//#region src/deploy-credentials.ts
|
|
4671
4739
|
const SECRET_SHOWN_ONCE = "Copy it now. This is the only time it will be shown. If you lose it, revoke this credential and mint another.";
|
|
4672
4740
|
const REGENERATED_SECRET_SHOWN_ONCE = "Copy it now. This is the only time it will be shown. If you lose it, regenerate this credential again.";
|
|
@@ -4689,6 +4757,54 @@ function asList(raw) {
|
|
|
4689
4757
|
const words = (Array.isArray(raw) ? raw : [raw]).flatMap((word) => String(word).split(",")).map((word) => word.trim()).filter((word) => word.length > 0);
|
|
4690
4758
|
return words.length > 0 ? words : void 0;
|
|
4691
4759
|
}
|
|
4760
|
+
/** What the help block is written to fit. A narrower terminal wraps it again;
|
|
4761
|
+
* a wider one leaves the words where they are put. */
|
|
4762
|
+
const HELP_WIDTH = 88;
|
|
4763
|
+
function wordsUnder(words, gutter) {
|
|
4764
|
+
const lines = [];
|
|
4765
|
+
let line = "";
|
|
4766
|
+
words.forEach((word, i) => {
|
|
4767
|
+
const piece = i < words.length - 1 ? `${word},` : word;
|
|
4768
|
+
const joined = line ? `${line} ${piece}` : piece;
|
|
4769
|
+
if (line && gutter.length + joined.length > HELP_WIDTH) {
|
|
4770
|
+
lines.push(gutter + line);
|
|
4771
|
+
line = piece;
|
|
4772
|
+
} else line = joined;
|
|
4773
|
+
});
|
|
4774
|
+
return line ? [...lines, gutter + line] : lines;
|
|
4775
|
+
}
|
|
4776
|
+
/**
|
|
4777
|
+
* Every preset with the job on one line and the words it grants under it,
|
|
4778
|
+
* wherever one is offered or refused.
|
|
4779
|
+
*
|
|
4780
|
+
* The words are printed rather than stood for: a name on its own would be a
|
|
4781
|
+
* label an owner has to trust, free to drift from the grant it makes. They are
|
|
4782
|
+
* under the name rather than beside it because a grid word names one resource
|
|
4783
|
+
* and one verb, so a job takes ten of them or more.
|
|
4784
|
+
*/
|
|
4785
|
+
function presetsOffered(indent = " ", pad = 12) {
|
|
4786
|
+
return MINT_PRESETS.flatMap((preset) => [`${indent}${preset.name.padEnd(pad)}${preset.job}`, ...wordsUnder(preset.capabilities, `${indent}${" ".repeat(pad)}`)]);
|
|
4787
|
+
}
|
|
4788
|
+
/** The `--preset` flag as `--help` states it: the job each one is for, the
|
|
4789
|
+
* words being too many to fit on a flag's line and printed by the command's
|
|
4790
|
+
* own help. */
|
|
4791
|
+
const PRESET_FLAG_HELP = `Grant the words a job needs: ${MINT_PRESETS.map((preset) => `${preset.name} (${preset.job.toLowerCase()})`).join(", ")}. 'wawesome credentials --help' prints what each one grants. Not with --capability`;
|
|
4792
|
+
/**
|
|
4793
|
+
* The words to mint with: the ones named, or the ones a preset names.
|
|
4794
|
+
*
|
|
4795
|
+
* A preset expands here rather than travelling as a name, so what the command
|
|
4796
|
+
* sends and prints is the vocabulary itself: a label the platform never sees
|
|
4797
|
+
* would be free to drift from the words it stands for.
|
|
4798
|
+
*/
|
|
4799
|
+
function capabilitiesAsked(options) {
|
|
4800
|
+
const named = asList(options.capability);
|
|
4801
|
+
const preset = options.preset?.trim();
|
|
4802
|
+
if (!preset) return named;
|
|
4803
|
+
if (named) fail(`--preset ${preset} and --capability ${named.join(",")} both name what this credential carries.`, "Name one of them. A preset is a fill, so pass its words to --capability if you mean to edit them:", ...presetsOffered());
|
|
4804
|
+
const found = mintPreset(preset);
|
|
4805
|
+
if (!found) fail(`'${preset}' is not a preset. The ones offered are:`, ...presetsOffered());
|
|
4806
|
+
return [...found.capabilities];
|
|
4807
|
+
}
|
|
4692
4808
|
function parseExpiry(raw) {
|
|
4693
4809
|
if (raw === void 0) return void 0;
|
|
4694
4810
|
const asked = String(raw).trim().toLowerCase();
|
|
@@ -4786,10 +4902,10 @@ async function deleteCredential(creds, credentialId) {
|
|
|
4786
4902
|
* and not one character besides.
|
|
4787
4903
|
*/
|
|
4788
4904
|
async function mintCredentialCommand(name, options) {
|
|
4789
|
-
if (!name || !name.trim()) fail("No name given. Usage: wawesome credentials mint <name> [--capability
|
|
4905
|
+
if (!name || !name.trim()) fail("No name given. Usage: wawesome credentials mint <name> [--capability write:functions] [--app <app>] [--expires 90|never]", "The name is what tells the CI one from the agent one a year from now.");
|
|
4906
|
+
const capabilities = capabilitiesAsked(options);
|
|
4790
4907
|
const creds = requireCredentials$1();
|
|
4791
4908
|
const payload = { name: name.trim() };
|
|
4792
|
-
const capabilities = asList(options.capability);
|
|
4793
4909
|
if (capabilities) payload.capabilities = capabilities;
|
|
4794
4910
|
const apps = asList(options.app);
|
|
4795
4911
|
if (apps) payload.apps = apps;
|
|
@@ -5516,19 +5632,23 @@ cli.command("credentials [action] [target]", "Mint, list, regenerate, revoke and
|
|
|
5516
5632
|
revoke <name-or-prefix> Revoke one, immediately and for good
|
|
5517
5633
|
delete <name-or-prefix> Forget a revoked or expired one, freeing its name
|
|
5518
5634
|
|
|
5635
|
+
Presets (--preset), each the words one job needs, a write carrying its read:
|
|
5636
|
+
${presetsOffered(" ").join("\n")}
|
|
5637
|
+
|
|
5519
5638
|
Examples:
|
|
5520
5639
|
wawesome credentials
|
|
5521
5640
|
wawesome credentials mint ci-pipeline
|
|
5522
|
-
wawesome credentials mint
|
|
5523
|
-
wawesome credentials mint
|
|
5524
|
-
wawesome credentials mint ci
|
|
5641
|
+
wawesome credentials mint viewer --preset viewer -a prod
|
|
5642
|
+
wawesome credentials mint reader -c read:apps,read:functions,read:invocations -a prod
|
|
5643
|
+
wawesome credentials mint ci --preset deployer --expires never
|
|
5644
|
+
wawesome credentials mint ci -c write:apps,write:functions,write:env,read:tenant,write:domains -a prod
|
|
5525
5645
|
wawesome credentials mint ci-pipeline > /tmp/secret
|
|
5526
5646
|
wawesome credentials regenerate ci-pipeline
|
|
5527
5647
|
wawesome credentials regenerate ci --expires never --yes
|
|
5528
5648
|
wawesome credentials revoke ci-pipeline
|
|
5529
5649
|
wawesome credentials revoke wawe_ab3k9x --yes
|
|
5530
|
-
wawesome credentials delete ci-pipeline`).option("-c, --capability <capability>", "Capability to grant
|
|
5531
|
-
cli.command("credentials mint <name>", "Mint a deploy credential, printing its secret exactly once").option("-c, --capability <capability>", "Capability to grant
|
|
5650
|
+
wawesome credentials delete ci-pipeline`).option("-c, --capability <capability>", "Capability to grant, as {read|write}:{resource}: read:apps, write:functions, write:env, write:runs and the rest (repeatable or comma-separated, default: what a deploy needs)").option("--preset <preset>", PRESET_FLAG_HELP).option("-a, --app <app>", "Restrict the credential to this App (repeatable or comma-separated, default: every App)").option("--expires <days|never>", "Days until the credential expires, or 'never' (default: 90)").option("-y, --yes", "Skip the confirmation a regenerate, revoke or delete asks for").option("-v, --verbose", "Enable verbose debug output").action((action, target, options) => credentialsCommand(action, target, options));
|
|
5651
|
+
cli.command("credentials mint <name>", "Mint a deploy credential, printing its secret exactly once").option("-c, --capability <capability>", "Capability to grant, as {read|write}:{resource}: read:apps, write:functions, write:env, write:runs and the rest (repeatable or comma-separated; a write carries its read)").option("--preset <preset>", PRESET_FLAG_HELP).option("-a, --app <app>", "Restrict the credential to this App (repeatable or comma-separated)").option("--expires <days|never>", "Days until the credential expires, or 'never' (default: 90)").option("-v, --verbose", "Enable verbose debug output").action((name, options) => mintCredentialCommand(name, options));
|
|
5532
5652
|
cli.command("credentials list", "List deploy credentials, never their secrets").alias("credentials ls").option("-v, --verbose", "Enable verbose debug output").action((options) => listCredentialsCommand(options));
|
|
5533
5653
|
cli.command("credentials regenerate <name-or-prefix>", "Replace a deploy credential's secret, keeping its name, capabilities and Apps").option("--expires <days|never>", "Days until the regenerated credential expires, or 'never' (default: 90)").option("-y, --yes", "Regenerate without being asked to confirm").option("-v, --verbose", "Enable verbose debug output").action((target, options) => regenerateCredentialCommand(target, options));
|
|
5534
5654
|
cli.command("credentials revoke <name-or-prefix>", "Revoke a deploy credential, immediately and for good").option("-y, --yes", "Revoke without being asked to confirm").option("-v, --verbose", "Enable verbose debug output").action((target, options) => revokeCredentialCommand(target, options));
|