@vincentt-xr/cli 0.15.1 → 0.16.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/dist/cli/args.js +1 -0
- package/dist/cli/index.js +177 -4
- package/dist/cli/usage-text.js +27 -0
- package/dist/cli/verb-surface.d.ts +3 -1
- package/dist/cli/verb-surface.js +12 -0
- package/dist/domain/api.d.ts +51 -0
- package/dist/domain/api.js +145 -0
- package/dist/domain/command.d.ts +75 -0
- package/dist/domain/command.js +467 -0
- package/dist/domain/copy.d.ts +334 -0
- package/dist/domain/copy.js +952 -0
- package/dist/domain/hostname.d.ts +57 -0
- package/dist/domain/hostname.js +116 -0
- package/dist/domain/names.d.ts +78 -0
- package/dist/domain/names.js +113 -0
- package/dist/domain/routedVerbs.d.ts +10 -0
- package/dist/domain/routedVerbs.js +30 -0
- package/dist/domain/wire.d.ts +140 -0
- package/dist/domain/wire.js +174 -0
- package/dist/dx/clusters.js +10 -1
- package/dist/dx/command.d.ts +13 -4
- package/dist/dx/command.js +26 -5
- package/dist/dx/report.d.ts +39 -7
- package/dist/dx/report.js +71 -20
- package/dist/dx/send.d.ts +22 -4
- package/dist/dx/send.js +29 -8
- package/dist/dx/skeleton.js +19 -0
- package/dist/dx/unbiddenVerbs.d.ts +25 -0
- package/dist/dx/unbiddenVerbs.js +39 -0
- package/dist/lib/exitCodes.d.ts +24 -0
- package/dist/lib/exitCodes.js +28 -0
- package/dist/lib/initCommand.d.ts +3 -1
- package/dist/lib/initCommand.js +10 -0
- package/dist/lib/initFrom.js +12 -2
- package/dist/lib/lifecycle.d.ts +5 -1
- package/dist/lib/projects.d.ts +8 -1
- package/dist/lib/projects.js +21 -4
- package/dist/platform/allowlist.d.ts +36 -0
- package/dist/platform/allowlist.js +34 -0
- package/dist/platform/behind.d.ts +41 -0
- package/dist/platform/behind.js +82 -0
- package/dist/platform/command.d.ts +16 -0
- package/dist/platform/command.js +90 -0
- package/dist/platform/footer.d.ts +60 -0
- package/dist/platform/footer.js +101 -0
- package/dist/platform/notice.d.ts +29 -0
- package/dist/platform/notice.js +66 -0
- package/dist/platform/offSwitch.d.ts +19 -0
- package/dist/platform/offSwitch.js +21 -0
- package/dist/platform/outdated.d.ts +25 -0
- package/dist/platform/outdated.js +246 -0
- package/dist/platform/releaseCache.d.ts +69 -0
- package/dist/platform/releaseCache.js +140 -0
- package/dist/platform/releaseFetch.d.ts +51 -0
- package/dist/platform/releaseFetch.js +150 -0
- package/dist/platform/resolve.d.ts +30 -0
- package/dist/platform/resolve.js +128 -0
- package/dist/platform/templateUpgrade.d.ts +56 -0
- package/dist/platform/templateUpgrade.js +476 -0
- package/dist/platform/upgradeReport.d.ts +132 -0
- package/dist/platform/upgradeReport.js +258 -0
- package/dist/platform/versionSummary.d.ts +82 -0
- package/dist/platform/versionSummary.js +181 -0
- package/dist/platform/zonePath.d.ts +154 -0
- package/dist/platform/zonePath.js +286 -0
- package/dist/platform/zones.d.ts +64 -0
- package/dist/platform/zones.js +79 -0
- package/dist/publish/api.d.ts +15 -4
- package/dist/publish/api.js +19 -5
- package/dist/publish/command.d.ts +10 -0
- package/dist/publish/command.js +7 -1
- package/dist/publish/copy.d.ts +14 -1
- package/dist/publish/copy.js +32 -3
- package/dist/scaffold/index.d.ts +50 -3
- package/dist/scaffold/index.js +61 -1
- package/dist/shared/config.d.ts +16 -0
- package/dist/shared/config.js +9 -1
- package/package.json +1 -1
- package/dist/dx/qa.f7.fixtures.d.ts +0 -73
- package/dist/dx/qa.f7.fixtures.js +0 -58
- package/dist/publish/qa.f4.fixtures.d.ts +0 -25
- package/dist/publish/qa.f4.fixtures.js +0 -140
- package/dist/relay/qa.f12.fixtures.d.ts +0 -154
- package/dist/relay/qa.f12.fixtures.js +0 -358
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { type DnsRecord, type DomainView, type Finding } from "./wire.js";
|
|
2
|
+
import { type NamePair } from "./names.js";
|
|
3
|
+
/**
|
|
4
|
+
* The state words are the console's badge words, LOWERCASED (transcript L43
|
|
5
|
+
* decision 3). One word set across both surfaces — if the console badge and this
|
|
6
|
+
* column disagree, the console label is wrong.
|
|
7
|
+
*
|
|
8
|
+
* An unrecognized state renders as ITSELF rather than as a plausible neighbour.
|
|
9
|
+
* A newer API sending an eighth state must not read as `not verified`, which
|
|
10
|
+
* would tell a creator nothing is wrong when something might be.
|
|
11
|
+
*/
|
|
12
|
+
export declare function stateWord(view: Pick<DomainView, "state" | "rawState">): string;
|
|
13
|
+
/** Is the domain serving right now? Drives the alias-stance line. */
|
|
14
|
+
export declare function isServing(view: Pick<DomainView, "state">): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The rule label for one record, naming it by WHAT IT IS FOR.
|
|
17
|
+
*
|
|
18
|
+
* `CNAME · certificate` is what distinguishes the validation record at a glance
|
|
19
|
+
* from the pointer CNAME, which is the same type. The label is derived from the
|
|
20
|
+
* record's ROLE when the API names one and falls back to the bare type — it is
|
|
21
|
+
* never invented from the record's name, because a name-sniffing heuristic
|
|
22
|
+
* (`starts with _`) would mislabel a future record.
|
|
23
|
+
*/
|
|
24
|
+
export declare function recordLabel(record: DnsRecord, role?: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Which record carries the keep-this-one caption?
|
|
27
|
+
*
|
|
28
|
+
* The certificate validation record, and ONLY it (Flow C1). Its deletion is the
|
|
29
|
+
* only fault in this feature with a delayed consequence — every other record
|
|
30
|
+
* fails immediately and visibly. `"keep this"` beside three records reads as
|
|
31
|
+
* boilerplate, which is why exactly one carries it.
|
|
32
|
+
*
|
|
33
|
+
* Decided from the ROLE the API names, never sniffed from the value. A heuristic
|
|
34
|
+
* on `acm-validations.aws` would break the day the CA changes, and it would break
|
|
35
|
+
* silently — into the arm where the caption is ABSENT, which is the expensive
|
|
36
|
+
* direction.
|
|
37
|
+
*/
|
|
38
|
+
export declare function carriesKeepCaption(role?: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* The keep-this-one caption. The caption NAMES THE DELAY explicitly, because a
|
|
41
|
+
* creator who reads only the first clause must not conclude they can ignore it.
|
|
42
|
+
*
|
|
43
|
+
* It is NOT an alert and carries no tint — a warning colour on a record someone
|
|
44
|
+
* is being asked to CREATE reads as an incident at the moment of creation.
|
|
45
|
+
*/
|
|
46
|
+
export declare function keepCaption(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* One record's block, with BOTH NAME FORMS, SHORT FIRST.
|
|
49
|
+
*
|
|
50
|
+
* Four rules from Flow C1, and every one of them is load-bearing:
|
|
51
|
+
* 1. NEVER ONE FORM. Printing the FQDN alone is what every researched platform
|
|
52
|
+
* does, and it is why this failure is universal.
|
|
53
|
+
* 2. NEVER "or". That hands the creator a decision with no basis for making it;
|
|
54
|
+
* two labelled lines give them a test they can run against the screen in
|
|
55
|
+
* front of them.
|
|
56
|
+
* 3. THE SHORT FORM IS FIRST — the majority want it, and the first line is what
|
|
57
|
+
* a hurrying creator copies. (QA-F16-C1 asserts this.)
|
|
58
|
+
* 4. Labels name the box on their screen, never the DNS concept.
|
|
59
|
+
*
|
|
60
|
+
* When the relative form cannot be derived (see names.ts) only the FQDN prints,
|
|
61
|
+
* WITHOUT the short-form tell. Printing an underived relative name would be the
|
|
62
|
+
* wrong-form paste this block exists to prevent, and printing the tell beside a
|
|
63
|
+
* lone FQDN would claim most registrars want the value on that line.
|
|
64
|
+
*/
|
|
65
|
+
export declare function recordBlock(record: DnsRecord, pair: NamePair, role?: string): string[];
|
|
66
|
+
/**
|
|
67
|
+
* The disambiguating paragraph. PROSE, not a footnote, and it names the VISIBLE
|
|
68
|
+
* TELL — *"if yours already shows `.acme.com` beside the box"*. That is the one
|
|
69
|
+
* observation that resolves the ambiguity without teaching DNS, and it is the
|
|
70
|
+
* sentence that has to survive a skim.
|
|
71
|
+
*/
|
|
72
|
+
export declare function twoFormParagraph(zone: string): string[];
|
|
73
|
+
/**
|
|
74
|
+
* The whole three-record block, fenced together ONCE.
|
|
75
|
+
*
|
|
76
|
+
* `roles` is parallel to `records` and comes from the API. The CLI does not
|
|
77
|
+
* decide which record is the certificate one.
|
|
78
|
+
*/
|
|
79
|
+
export declare function allRecordBlocks(records: readonly DnsRecord[], domain: string, roles?: readonly (string | undefined)[]): string[];
|
|
80
|
+
/**
|
|
81
|
+
* The permanent address, named UNPROMPTED, in every state where the custom domain
|
|
82
|
+
* is not working (CLI convention 4).
|
|
83
|
+
*
|
|
84
|
+
* "Your Vincentt address" — never "the default", "the fallback", "the free
|
|
85
|
+
* address". The line costs one line and it is the single most valuable thing this
|
|
86
|
+
* feature does.
|
|
87
|
+
*
|
|
88
|
+
* Returns NOTHING when the API did not send a permanent address. A line naming an
|
|
89
|
+
* address the CLI assembled itself would print the wrong host on staging and dev,
|
|
90
|
+
* for the reason `liveUrl` is server-computed everywhere else in this CLI.
|
|
91
|
+
*/
|
|
92
|
+
export declare function aliasStance(domain: string, permanentAddress: string | undefined, serving: boolean): string[];
|
|
93
|
+
/** The same fact for a domain that WAS serving and stopped. */
|
|
94
|
+
export declare function aliasStanceStopped(permanentAddress: string | undefined): string[];
|
|
95
|
+
export type Severity = "blocking" | "advisory";
|
|
96
|
+
/**
|
|
97
|
+
* The severity of one finding.
|
|
98
|
+
*
|
|
99
|
+
* `wireSeverity` is the API's own classification when it sends one, and it WINS:
|
|
100
|
+
* the exit code the CLI returns must not disagree with the state the server put
|
|
101
|
+
* the domain in, and the server is the party that performed the observation.
|
|
102
|
+
*
|
|
103
|
+
* The local table is the fallback for an API that sends no severity, and it is
|
|
104
|
+
* derived from the design record rather than from the producer:
|
|
105
|
+
* - PROXY_IN_FRONT is advisory and NEVER blocking (Scenario 4's accepted
|
|
106
|
+
* constraint: heuristic, worded as an observation, "never blocking").
|
|
107
|
+
* - STALE_ACME_CHALLENGE is advisory ("it blocks nothing; you can delete it").
|
|
108
|
+
* - UNEXPECTED_AAAA and TOKEN_STALE_PRESENT are advisory: each is an
|
|
109
|
+
* observation beside a row whose failure, if any, is named by another finding.
|
|
110
|
+
*
|
|
111
|
+
* KNOWN DIVERGENCE, reported rather than papered over: the producer's
|
|
112
|
+
* `DomainFinding.Severity()` currently classes ONLY VALIDATION_RECORD_GONE as
|
|
113
|
+
* advisory, which would make a proxy observation alone exit non-zero and
|
|
114
|
+
* contradict "an all-advisory report exits 0". Honoring a wire severity means
|
|
115
|
+
* the CLI tracks the server once that is settled instead of holding a second
|
|
116
|
+
* opinion in a second language.
|
|
117
|
+
*/
|
|
118
|
+
export declare function findingSeverity(code: string, wireSeverity?: string): Severity;
|
|
119
|
+
export declare function severityGlyph(s: Severity): string;
|
|
120
|
+
/**
|
|
121
|
+
* One finding, rendered.
|
|
122
|
+
*
|
|
123
|
+
* `expected` / `observed` are STACKED AND COLUMN-ALIGNED, never inline — f2's
|
|
124
|
+
* rule for two values a creator must judge, and the shape that makes the
|
|
125
|
+
* difference visible at a glance. This is why f16 beats every researched
|
|
126
|
+
* competitor, all of whom print only the expected record.
|
|
127
|
+
*
|
|
128
|
+
* `observed` IS PRINTED AS THE STRING THE WIRE SENT. It is not parsed, not
|
|
129
|
+
* re-rendered, and not reformatted. The wire says it is a string and never
|
|
130
|
+
* structured precisely so a client cannot lose the fidelity that is the point of
|
|
131
|
+
* the ruling.
|
|
132
|
+
*
|
|
133
|
+
* `expected` is omitted when the API sent none — the pair degrades to the
|
|
134
|
+
* observed line alone rather than printing an invented expectation.
|
|
135
|
+
*/
|
|
136
|
+
export declare function findingLines(f: Finding, domain: string): string[];
|
|
137
|
+
/**
|
|
138
|
+
* The whole findings report, ORDERED `✗` BEFORE `!`.
|
|
139
|
+
*
|
|
140
|
+
* A creator who reads only the first block reads the thing that is actually
|
|
141
|
+
* stopping them. Within each severity the API's own order is preserved — it
|
|
142
|
+
* observed them and it orders cause before consequence.
|
|
143
|
+
*/
|
|
144
|
+
export declare function findingsReport(findings: readonly Finding[], domain: string): string[];
|
|
145
|
+
/**
|
|
146
|
+
* THE EXIT CODE FOLLOWS THE GLYPH, NEVER THE COUNT (CLI convention 3,
|
|
147
|
+
* QA-F16-C2).
|
|
148
|
+
*
|
|
149
|
+
* An all-advisory report exits 0. A report with ten advisories and no blocking
|
|
150
|
+
* finding exits 0. A report with one blocking finding exits 1 regardless of how
|
|
151
|
+
* many advisories sit beside it.
|
|
152
|
+
*
|
|
153
|
+
* This is the whole of the mapping and it is deliberately a function of the
|
|
154
|
+
* findings alone, so it cannot be reached through a code path that also consults
|
|
155
|
+
* a count.
|
|
156
|
+
*/
|
|
157
|
+
export declare function exitCodeForFindings(findings: readonly Finding[]): 0 | 1;
|
|
158
|
+
/** f4's after-a-non-zero-exit rule. An agent's most expensive failure is retrying against a half-applied state. */
|
|
159
|
+
export declare const NOTHING_WAS_CHANGED = " Nothing was changed.";
|
|
160
|
+
export declare const NOTHING_WAS_CLAIMED = " Nothing was claimed.";
|
|
161
|
+
/**
|
|
162
|
+
* At the ceiling. A LIMIT IS PRINTED AS A NUMBER, NEVER AS A POLICY OR A PLAN
|
|
163
|
+
* (f4's CLI rule), and the remedy names a HUMAN ROLE per f12's rule that unbidden
|
|
164
|
+
* output names a fact, never an instruction to buy.
|
|
165
|
+
*
|
|
166
|
+
* No price, no plan name other than the one they are on, no URL. Clause 4 reaches
|
|
167
|
+
* the CLI too.
|
|
168
|
+
*/
|
|
169
|
+
export declare function refusedAtCeiling(limit: number): string[];
|
|
170
|
+
/**
|
|
171
|
+
* Already attached — THE ANTI-ORACLE ANSWER.
|
|
172
|
+
*
|
|
173
|
+
* BYTE-IDENTICAL whether the name is held by this workspace or by a stranger's.
|
|
174
|
+
* It never says *another workspace*, never says *yours*, never names a project.
|
|
175
|
+
* f2's slug-collision discipline applied to the second global host namespace.
|
|
176
|
+
*
|
|
177
|
+
* The `list` line is safe precisely because `list` only ever shows the caller's
|
|
178
|
+
* own domains — a creator who genuinely holds the name finds it there.
|
|
179
|
+
*
|
|
180
|
+
* IT TAKES NO ARGUMENT BEYOND THE HOSTNAME. A "you already have this"
|
|
181
|
+
* convenience message is the exact shape that breaks this, and it is the first
|
|
182
|
+
* thing a tidying PR adds.
|
|
183
|
+
*/
|
|
184
|
+
export declare function refusedAlreadyAttached(domain: string): string[];
|
|
185
|
+
/** A platform address. */
|
|
186
|
+
export declare function refusedPlatformHost(): string[];
|
|
187
|
+
/**
|
|
188
|
+
* A root domain. The reason is one clause and it is ABOUT THE CREATOR'S
|
|
189
|
+
* REGISTRAR, not about our infrastructure.
|
|
190
|
+
*
|
|
191
|
+
* A refusal with no reason gets retried; a refusal whose reason is *"our CDN
|
|
192
|
+
* doesn't support it"* sounds like something we might fix on request.
|
|
193
|
+
*/
|
|
194
|
+
export declare function refusedRootDomain(domain: string): string[];
|
|
195
|
+
/** Not on a plan that carries custom domains. Names the plan they are on and nothing else. */
|
|
196
|
+
export declare function refusedNoEntitlement(planName: string | undefined): string[];
|
|
197
|
+
/**
|
|
198
|
+
* A verify refused by the rate limit.
|
|
199
|
+
*
|
|
200
|
+
* `Retry-After` says HOW LONG, never WHICH LIMIT. All refusal bodies are
|
|
201
|
+
* byte-identical across causes, so this copy names no limit family.
|
|
202
|
+
*/
|
|
203
|
+
export declare function refusedTooSoon(retryAfterSec: number | undefined): string[];
|
|
204
|
+
/**
|
|
205
|
+
* The uniform not-found. A hostname not attached to THIS project returns the same
|
|
206
|
+
* 404 as one that does not exist, one held by a stranger, and a version that does
|
|
207
|
+
* not exist — so the CLI's copy for it must be equally uniform.
|
|
208
|
+
*/
|
|
209
|
+
export declare function notAttached(domain: string): string[];
|
|
210
|
+
/**
|
|
211
|
+
* Flow C1 — the transcript the whole feature turns on.
|
|
212
|
+
*
|
|
213
|
+
* NO PROMPT and no progress bar. Attaching asks nothing irreversible, so a prompt
|
|
214
|
+
* would be ceremony. The three records are fenced together once as SECTION rules
|
|
215
|
+
* rather than f4's `─── FIRST PUBLISH ───` block, which f4 reserves for the
|
|
216
|
+
* irreversible.
|
|
217
|
+
*/
|
|
218
|
+
export interface AttachRendered {
|
|
219
|
+
projectName?: string;
|
|
220
|
+
orgName?: string;
|
|
221
|
+
domain: string;
|
|
222
|
+
records: readonly DnsRecord[];
|
|
223
|
+
roles?: readonly (string | undefined)[];
|
|
224
|
+
permanentAddress?: string;
|
|
225
|
+
}
|
|
226
|
+
export declare function attachSuccess(i: AttachRendered): string[];
|
|
227
|
+
export declare function verifyReading(domain: string): string;
|
|
228
|
+
/**
|
|
229
|
+
* Not ready. Every finding names what was actually observed.
|
|
230
|
+
*
|
|
231
|
+
* The remedy is THE EXACT COMMAND, last. Not "try again", not a URL.
|
|
232
|
+
*/
|
|
233
|
+
export declare function verifyNotReady(domain: string, findings: readonly Finding[], permanentAddress: string | undefined): string[];
|
|
234
|
+
/**
|
|
235
|
+
* Ready, and live.
|
|
236
|
+
*
|
|
237
|
+
* The `!` about hard-coded canonical/og:url sits BELOW the success because the
|
|
238
|
+
* creator's next act is to share the address, and the advisory is about what
|
|
239
|
+
* happens when they do. IT IS AN ADVISORY AND NEVER AN EDIT — B-F4-2.
|
|
240
|
+
*/
|
|
241
|
+
export declare function verifyLive(domain: string, permanentAddress: string | undefined, liveVersion: number | undefined): string[];
|
|
242
|
+
/**
|
|
243
|
+
* Ready, serving, but with advisory findings (D-44's case among them).
|
|
244
|
+
*
|
|
245
|
+
* EXIT 0, because every finding is `!` and the domain is serving. The success
|
|
246
|
+
* lines above are UNCHANGED — escalating the glyph would teach a creator that `✗`
|
|
247
|
+
* sometimes means *working fine*.
|
|
248
|
+
*
|
|
249
|
+
* When the certificate validation record is the missing one, THE RECORD IS
|
|
250
|
+
* RE-PRINTED: the entire cause of this state is a record the creator tidied away,
|
|
251
|
+
* and the remedy has to be on the screen rather than a command away. This is the
|
|
252
|
+
* one place a `verify` success prints a record block.
|
|
253
|
+
*/
|
|
254
|
+
export declare function verifyServingWithAdvisories(domain: string, findings: readonly Finding[], reprint: readonly DnsRecord[], roles: readonly (string | undefined)[]): string[];
|
|
255
|
+
/**
|
|
256
|
+
* Flow C5 — `failing`: STILL SERVING, and the reader can still prevent the stop.
|
|
257
|
+
*
|
|
258
|
+
* This arm exists because the serving-with-advisories one is FALSE here. That
|
|
259
|
+
* one opens *"✓ ar.acme.com is yours — the TXT record matches"*, which sat
|
|
260
|
+
* directly above *"✗ We can't find the TXT record"* — the screen contradicting
|
|
261
|
+
* itself in two adjacent lines. A `failing` domain is serving on a record we can
|
|
262
|
+
* no longer see, so nothing about the DNS may be reported as confirmed.
|
|
263
|
+
*
|
|
264
|
+
* The date is ABSOLUTE, never a countdown, and the stop is described BY WHAT A
|
|
265
|
+
* VISITOR SEES rather than by an internal state — the fact that makes a creator
|
|
266
|
+
* act. The reassurance clause is mandatory: their first fear on reading this is
|
|
267
|
+
* that they are losing their work.
|
|
268
|
+
*/
|
|
269
|
+
export declare function verifyFailing(domain: string, findings: readonly Finding[], holdsAt: string | undefined, permanentAddress: string | undefined): string[];
|
|
270
|
+
/**
|
|
271
|
+
* The certificate did not come.
|
|
272
|
+
*
|
|
273
|
+
* The one thing this state does that no other does: IT NAMES A DIFFERENT ACTOR.
|
|
274
|
+
* A CAA record usually lives on the parent zone and is usually somebody else's,
|
|
275
|
+
* and copy that assumes the reader controls it sends them looking in the wrong
|
|
276
|
+
* place. It never says "contact support" — that implies a queue this product does
|
|
277
|
+
* not have.
|
|
278
|
+
*/
|
|
279
|
+
export declare function verifyCertFailed(domain: string, findings: readonly Finding[], permanentAddress: string | undefined): string[];
|
|
280
|
+
export declare function shortDate(iso: string | undefined): string;
|
|
281
|
+
export declare function listRows(domains: readonly DomainView[]): string[];
|
|
282
|
+
/**
|
|
283
|
+
* The entitlement line — A BARE COUNT AND THE PLAN NAME. No price, no ladder, no
|
|
284
|
+
* *"upgrade for more"*. Clause 4 reaches the CLI too.
|
|
285
|
+
*
|
|
286
|
+
* A zero denominator is never rendered, and an absent limit renders the count
|
|
287
|
+
* alone rather than inventing one.
|
|
288
|
+
*/
|
|
289
|
+
export declare function entitlementLine(count: number | undefined, limit: number | undefined, planName: string | undefined): string[];
|
|
290
|
+
export declare function listEmpty(planName: string | undefined): string[];
|
|
291
|
+
/**
|
|
292
|
+
* Flow C7 — the confirmation.
|
|
293
|
+
*
|
|
294
|
+
* `[y/N]`, AND IT IS NOT f4's IRREVERSIBLE CASING BEING MISAPPLIED. Detaching IS
|
|
295
|
+
* undoable — but the default is No because the act is IMMEDIATELY VISIBLE TO
|
|
296
|
+
* STRANGERS, and an accidental Enter would take a client's advertised address dark
|
|
297
|
+
* mid-campaign. The bracket casing tracks *would an accidental Enter be
|
|
298
|
+
* expensive*, and this one would (shared.md § the refined convention).
|
|
299
|
+
*
|
|
300
|
+
* THE COPY DELIBERATELY CONTRADICTS f4's PERMANENCE SENTENCE. A detached custom
|
|
301
|
+
* domain is NOT burned — the platform has no authority over the creator's
|
|
302
|
+
* registrar, and copy that "consistently" applied f4's permanence language would
|
|
303
|
+
* be a false claim about someone else's property. Stated positively: the name
|
|
304
|
+
* stays yours, and you can delete our three records.
|
|
305
|
+
*
|
|
306
|
+
* No fenced block: f4 reserves fencing for the irreversible.
|
|
307
|
+
*/
|
|
308
|
+
export declare function detachDisclosure(domain: string, permanentAddress: string | undefined): string[];
|
|
309
|
+
export declare function detachPrompt(domain: string): string;
|
|
310
|
+
export declare function detachDone(domain: string): string[];
|
|
311
|
+
/** Declined. Exit 0, ZERO network calls. Declining is not a failure; it is the prompt working. */
|
|
312
|
+
export declare function detachDeclined(domain: string): string[];
|
|
313
|
+
/**
|
|
314
|
+
* Already detached — a SILENT RESOLVE, not an error. The creator asked for a
|
|
315
|
+
* state the world is already in.
|
|
316
|
+
*/
|
|
317
|
+
export declare function detachAlready(domain: string): string[];
|
|
318
|
+
/**
|
|
319
|
+
* A non-TTY detach with no explicit flag. REFUSE; NEVER ASSUME YES.
|
|
320
|
+
*
|
|
321
|
+
* A pipe cannot consent. The remedy names the flag, because an agent that reaches
|
|
322
|
+
* this needs to know the act is available rather than concluding detach is
|
|
323
|
+
* console-only.
|
|
324
|
+
*/
|
|
325
|
+
export declare function detachNeedsConsent(domain: string): string[];
|
|
326
|
+
/**
|
|
327
|
+
* `renew` gets a FACT rather than a redirect, because the honest answer is that
|
|
328
|
+
* the act does not exist. f4's rule: a creator typing a plausible verb has told us
|
|
329
|
+
* exactly what they want.
|
|
330
|
+
*/
|
|
331
|
+
export declare function noRenewVerb(): string[];
|
|
332
|
+
export declare function unknownDomainSub(sub: string): string[];
|
|
333
|
+
/** `vincentt domains` / `custom-domain` / `dns` — plausible verbs, answered. */
|
|
334
|
+
export declare function domainVerbRedirect(typed: string): string[];
|