@asturiu/v0-sdk 0.0.0-stage → 1.0.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/CHANGELOG.md +42 -0
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +82 -2
- package/contract/assertion-vectors.json +90 -0
- package/contract/schemas/branding.schema.json +46 -0
- package/contract/schemas/definitions.schema.json +376 -0
- package/contract/schemas/portal.schema.json +56 -0
- package/contract/tenant-api-routes.json +165 -0
- package/dist/branding.d.ts +131 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +206 -0
- package/dist/branding.js.map +1 -0
- package/dist/changesets.d.ts +58 -0
- package/dist/changesets.d.ts.map +1 -0
- package/dist/changesets.js +18 -0
- package/dist/changesets.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +12 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/changesets.d.ts +14 -0
- package/dist/cli/changesets.d.ts.map +1 -0
- package/dist/cli/changesets.js +252 -0
- package/dist/cli/changesets.js.map +1 -0
- package/dist/cli/cli.d.ts +37 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +415 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/context.d.ts +147 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +258 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/engine.d.ts +59 -0
- package/dist/cli/engine.d.ts.map +1 -0
- package/dist/cli/engine.js +85 -0
- package/dist/cli/engine.js.map +1 -0
- package/dist/cli/feedback.d.ts +40 -0
- package/dist/cli/feedback.d.ts.map +1 -0
- package/dist/cli/feedback.js +420 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/files.d.ts +83 -0
- package/dist/cli/files.d.ts.map +1 -0
- package/dist/cli/files.js +389 -0
- package/dist/cli/files.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/overview.d.ts +6 -0
- package/dist/cli/overview.d.ts.map +1 -0
- package/dist/cli/overview.js +379 -0
- package/dist/cli/overview.js.map +1 -0
- package/dist/cli/parts.d.ts +5 -0
- package/dist/cli/parts.d.ts.map +1 -0
- package/dist/cli/parts.js +414 -0
- package/dist/cli/parts.js.map +1 -0
- package/dist/cli/sources.d.ts +37 -0
- package/dist/cli/sources.d.ts.map +1 -0
- package/dist/cli/sources.js +91 -0
- package/dist/cli/sources.js.map +1 -0
- package/dist/cli/terminal.d.ts +135 -0
- package/dist/cli/terminal.d.ts.map +1 -0
- package/dist/cli/terminal.js +353 -0
- package/dist/cli/terminal.js.map +1 -0
- package/dist/cli/ui-page.d.ts +8 -0
- package/dist/cli/ui-page.d.ts.map +1 -0
- package/dist/cli/ui-page.js +216 -0
- package/dist/cli/ui-page.js.map +1 -0
- package/dist/cli/ui.d.ts +54 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +251 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/client.d.ts +88 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +165 -0
- package/dist/client.js.map +1 -0
- package/dist/contacts.d.ts +43 -0
- package/dist/contacts.d.ts.map +1 -0
- package/dist/contacts.js +46 -0
- package/dist/contacts.js.map +1 -0
- package/dist/definition-set.d.ts +731 -0
- package/dist/definition-set.d.ts.map +1 -0
- package/dist/definition-set.js +659 -0
- package/dist/definition-set.js.map +1 -0
- package/dist/definitions.d.ts +42 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +154 -0
- package/dist/definitions.js.map +1 -0
- package/dist/enrolment.d.ts +9 -0
- package/dist/enrolment.d.ts.map +1 -0
- package/dist/enrolment.js +8 -0
- package/dist/enrolment.js.map +1 -0
- package/dist/fill.d.ts +73 -0
- package/dist/fill.d.ts.map +1 -0
- package/dist/fill.js +46 -0
- package/dist/fill.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications.d.ts +33 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +36 -0
- package/dist/notifications.js.map +1 -0
- package/dist/oidc.d.ts +122 -0
- package/dist/oidc.d.ts.map +1 -0
- package/dist/oidc.js +150 -0
- package/dist/oidc.js.map +1 -0
- package/dist/overlay.d.ts +109 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +58 -0
- package/dist/overlay.js.map +1 -0
- package/dist/passes.d.ts +95 -0
- package/dist/passes.d.ts.map +1 -0
- package/dist/passes.js +140 -0
- package/dist/passes.js.map +1 -0
- package/dist/portal-options.d.ts +65 -0
- package/dist/portal-options.d.ts.map +1 -0
- package/dist/portal-options.js +120 -0
- package/dist/portal-options.js.map +1 -0
- package/dist/reads.d.ts +41 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +44 -0
- package/dist/reads.js.map +1 -0
- package/dist/recovery-words.d.ts +8 -0
- package/dist/recovery-words.d.ts.map +1 -0
- package/dist/recovery-words.js +136 -0
- package/dist/recovery-words.js.map +1 -0
- package/dist/recovery.d.ts +198 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +112 -0
- package/dist/recovery.js.map +1 -0
- package/dist/reveal.d.ts +35 -0
- package/dist/reveal.d.ts.map +1 -0
- package/dist/reveal.js +66 -0
- package/dist/reveal.js.map +1 -0
- package/dist/seal.d.ts +15 -0
- package/dist/seal.d.ts.map +1 -0
- package/dist/seal.js +0 -0
- package/dist/seal.js.map +1 -0
- package/dist/session.d.ts +66 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +61 -0
- package/dist/session.js.map +1 -0
- package/dist/signing-in-mark.d.ts +14 -0
- package/dist/signing-in-mark.d.ts.map +1 -0
- package/dist/signing-in-mark.js +24 -0
- package/dist/signing-in-mark.js.map +1 -0
- package/dist/signing-in.d.ts +22 -0
- package/dist/signing-in.d.ts.map +1 -0
- package/dist/signing-in.js +203 -0
- package/dist/signing-in.js.map +1 -0
- package/dist/tags.d.ts +96 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +88 -0
- package/dist/tags.js.map +1 -0
- package/dist/tenant-subscription.d.ts +47 -0
- package/dist/tenant-subscription.d.ts.map +1 -0
- package/dist/tenant-subscription.js +7 -0
- package/dist/tenant-subscription.js.map +1 -0
- package/dist/testing/index.d.ts +125 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +320 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/theme.d.ts +237 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +504 -0
- package/dist/theme.js.map +1 -0
- package/dist/tickets.d.ts +152 -0
- package/dist/tickets.d.ts.map +1 -0
- package/dist/tickets.js +65 -0
- package/dist/tickets.js.map +1 -0
- package/dist/tiers.d.ts +168 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +341 -0
- package/dist/tiers.js.map +1 -0
- package/dist/types.d.ts +885 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/urlid.d.ts +50 -0
- package/dist/urlid.d.ts.map +1 -0
- package/dist/urlid.js +78 -0
- package/dist/urlid.js.map +1 -0
- package/dist/version.d.ts +15 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +15 -0
- package/dist/version.js.map +1 -0
- package/make/asturiu.mk +43 -0
- package/package.json +63 -4
- package/src/branding.ts +221 -0
- package/src/changesets.ts +61 -0
- package/src/cli/bin.ts +12 -0
- package/src/cli/changesets.ts +233 -0
- package/src/cli/cli.ts +425 -0
- package/src/cli/context.ts +299 -0
- package/src/cli/engine.ts +112 -0
- package/src/cli/feedback.ts +406 -0
- package/src/cli/files.ts +371 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/overview.ts +343 -0
- package/src/cli/parts.ts +371 -0
- package/src/cli/sources.ts +111 -0
- package/src/cli/terminal.ts +384 -0
- package/src/cli/ui-page.ts +215 -0
- package/src/cli/ui.ts +266 -0
- package/src/client.ts +202 -0
- package/src/contacts.ts +61 -0
- package/src/definition-set.ts +965 -0
- package/src/definitions.ts +156 -0
- package/src/enrolment.ts +10 -0
- package/src/fill.ts +83 -0
- package/src/index.ts +38 -0
- package/src/notifications.ts +55 -0
- package/src/oidc.ts +199 -0
- package/src/overlay.ts +137 -0
- package/src/passes.ts +168 -0
- package/src/portal-options.ts +125 -0
- package/src/reads.ts +71 -0
- package/src/recovery-words.ts +137 -0
- package/src/recovery.ts +269 -0
- package/src/reveal.ts +72 -0
- package/src/seal.ts +0 -0
- package/src/session.ts +93 -0
- package/src/signing-in-mark.ts +23 -0
- package/src/signing-in.ts +213 -0
- package/src/tags.ts +146 -0
- package/src/tenant-subscription.ts +44 -0
- package/src/testing/index.ts +337 -0
- package/src/theme.ts +628 -0
- package/src/tickets.ts +195 -0
- package/src/tiers.ts +397 -0
- package/src/types.ts +847 -0
- package/src/urlid.ts +77 -0
- package/src/version.ts +15 -0
- package/templates/asturiu/branding.json +4 -0
- package/templates/asturiu/definitions.json +23 -0
- package/templates/asturiu/portal.json +16 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/** The text as it shows, without escape sequences. */
|
|
2
|
+
export declare const visible: (s: string) => string;
|
|
3
|
+
/** Columns a string takes on screen (one per code point: the symbols used here are all narrow). */
|
|
4
|
+
export declare const widthOf: (s: string) => number;
|
|
5
|
+
/**
|
|
6
|
+
* Text from outside as data: no escape sequence, no control character and no bidirectional override reaches the
|
|
7
|
+
* terminal (or the local page). Line breaks stay, tabs become two spaces.
|
|
8
|
+
*/
|
|
9
|
+
export declare function plain(value: unknown): string;
|
|
10
|
+
/** At most `n` columns, with an ellipsis when cut. */
|
|
11
|
+
export declare function truncate(s: string, n: number, ellipsis?: string): string;
|
|
12
|
+
/** Plain text wrapped at word boundaries to `width` columns; a word longer than a line is cut. */
|
|
13
|
+
export declare function wrap(text: string, width: number): string[];
|
|
14
|
+
/** "3 days ago", "in 2 weeks", "just now". */
|
|
15
|
+
export declare function ago(iso: string | null | undefined, now?: number): string;
|
|
16
|
+
/** "2026-10-31 15:20" in the local time zone. */
|
|
17
|
+
export declare function when(iso: string | null | undefined): string;
|
|
18
|
+
/** "812 B", "3.1 KiB". */
|
|
19
|
+
export declare function bytes(n: number): string;
|
|
20
|
+
/** "1 finding", "3 findings". */
|
|
21
|
+
export declare const plural: (n: number, one: string, many?: string) => string;
|
|
22
|
+
/** A changeset number as the Engine writes it: 001. */
|
|
23
|
+
export declare const pad3: (n: number) => string;
|
|
24
|
+
type Env = Record<string, string | undefined>;
|
|
25
|
+
/** How many colours the stream takes: 0 none, 1 the basic sixteen, 2 256, 3 true colour. */
|
|
26
|
+
export declare function colorLevel(stream: {
|
|
27
|
+
isTTY?: boolean;
|
|
28
|
+
}, env: Env): number;
|
|
29
|
+
declare const UNICODE: {
|
|
30
|
+
ok: string;
|
|
31
|
+
fail: string;
|
|
32
|
+
warn: string;
|
|
33
|
+
info: string;
|
|
34
|
+
open: string;
|
|
35
|
+
half: string;
|
|
36
|
+
pause: string;
|
|
37
|
+
cross: string;
|
|
38
|
+
dash: string;
|
|
39
|
+
arrow: string;
|
|
40
|
+
pointer: string;
|
|
41
|
+
bullet: string;
|
|
42
|
+
dot: string;
|
|
43
|
+
diamond: string;
|
|
44
|
+
bar: string;
|
|
45
|
+
ellipsis: string;
|
|
46
|
+
rule: string;
|
|
47
|
+
question: string;
|
|
48
|
+
};
|
|
49
|
+
export type Tone = "ok" | "warn" | "fail" | "info" | "todo" | "muted";
|
|
50
|
+
export type Sym = keyof typeof UNICODE;
|
|
51
|
+
export type Paint = "bold" | "dim" | "italic" | "underline" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "gray" | "brand";
|
|
52
|
+
export interface Column<Row> {
|
|
53
|
+
label: string;
|
|
54
|
+
value: (row: Row) => string;
|
|
55
|
+
paint?: (text: string, row: Row) => string;
|
|
56
|
+
align?: "left" | "right";
|
|
57
|
+
flex?: boolean;
|
|
58
|
+
min?: number;
|
|
59
|
+
}
|
|
60
|
+
/** A writable stream as far as this module uses one. */
|
|
61
|
+
export interface OutStream {
|
|
62
|
+
write: (s: string) => unknown;
|
|
63
|
+
isTTY?: boolean;
|
|
64
|
+
columns?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface TerminalOptions {
|
|
67
|
+
stdout?: OutStream;
|
|
68
|
+
stderr?: OutStream;
|
|
69
|
+
stdin?: {
|
|
70
|
+
isTTY?: boolean;
|
|
71
|
+
};
|
|
72
|
+
env?: Env;
|
|
73
|
+
color?: number;
|
|
74
|
+
unicode?: boolean;
|
|
75
|
+
quiet?: boolean;
|
|
76
|
+
}
|
|
77
|
+
export declare function createTerminal(opts?: TerminalOptions): {
|
|
78
|
+
level: number;
|
|
79
|
+
unicode: boolean;
|
|
80
|
+
sym: {
|
|
81
|
+
ok: string;
|
|
82
|
+
fail: string;
|
|
83
|
+
warn: string;
|
|
84
|
+
info: string;
|
|
85
|
+
open: string;
|
|
86
|
+
half: string;
|
|
87
|
+
pause: string;
|
|
88
|
+
cross: string;
|
|
89
|
+
dash: string;
|
|
90
|
+
arrow: string;
|
|
91
|
+
pointer: string;
|
|
92
|
+
bullet: string;
|
|
93
|
+
dot: string;
|
|
94
|
+
diamond: string;
|
|
95
|
+
bar: string;
|
|
96
|
+
ellipsis: string;
|
|
97
|
+
rule: string;
|
|
98
|
+
question: string;
|
|
99
|
+
};
|
|
100
|
+
paint: Record<Paint, (s: unknown) => string>;
|
|
101
|
+
mark: (tone: Tone) => string;
|
|
102
|
+
toned: (tone: Tone, text: unknown) => string;
|
|
103
|
+
columns: () => number;
|
|
104
|
+
out: (s?: string) => void;
|
|
105
|
+
err: (s?: string) => void;
|
|
106
|
+
link: (text: string, url: string | null | undefined) => string;
|
|
107
|
+
code: (cmd: string) => string;
|
|
108
|
+
banner: (title: string, meta?: string[]) => void;
|
|
109
|
+
section: (title: string, aside?: string) => void;
|
|
110
|
+
rule: () => void;
|
|
111
|
+
pairs: (rows: [string, string | string[]][], o?: {
|
|
112
|
+
indent?: number;
|
|
113
|
+
width?: number;
|
|
114
|
+
}) => void;
|
|
115
|
+
item: (tone: Tone, text: string, detail?: string, indent?: number) => void;
|
|
116
|
+
callout: (tone: Tone, title: string, lines?: string[]) => void;
|
|
117
|
+
quote: (text: string, indent?: number) => void;
|
|
118
|
+
next: (steps: [string, string][]) => void;
|
|
119
|
+
table: <Row>(rows: Row[], cols: Column<Row>[], o?: {
|
|
120
|
+
indent?: number;
|
|
121
|
+
gap?: number;
|
|
122
|
+
header?: boolean;
|
|
123
|
+
}) => void;
|
|
124
|
+
confirm: (question: string, byDefault?: boolean) => Promise<boolean | null>;
|
|
125
|
+
spin: (text: string) => {
|
|
126
|
+
update: (_t: string) => void;
|
|
127
|
+
stop: () => void;
|
|
128
|
+
};
|
|
129
|
+
busy: <T>(text: string, fn: () => Promise<T>) => Promise<T>;
|
|
130
|
+
ellipsis: string;
|
|
131
|
+
interactive: boolean;
|
|
132
|
+
};
|
|
133
|
+
export type Terminal = ReturnType<typeof createTerminal>;
|
|
134
|
+
export {};
|
|
135
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/cli/terminal.ts"],"names":[],"mappings":"AAkBA,sDAAsD;AACtD,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,MAAqC,CAAC;AAE1E,mGAAmG;AACnG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,MAAgC,CAAC;AAErE;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM5C;AAED,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAKrE;AAED,kGAAkG;AAClG,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B1D;AAYD,8CAA8C;AAC9C,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,SAAa,GAAG,MAAM,CAQ5E;AAED,iDAAiD;AACjD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAM3D;AAED,0BAA0B;AAC1B,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGvC;AAED,iCAAiC;AACjC,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,EAAE,KAAK,MAAM,EAAE,aAAgB,KAAG,MAAwC,CAAC;AAE3G,uDAAuD;AACvD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAAoC,CAAC;AAEtE,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE9C,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAUxE;AAkBD,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;;;;CAA0N,CAAC;AAIxO,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACtE,MAAM,MAAM,GAAG,GAAG,MAAM,OAAO,OAAO,CAAC;AACvC,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC1I,MAAM,WAAW,MAAM,CAAC,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wDAAwD;AACxD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,eAAoB;;;;;;;;;;;;;;;;;;;;;;;6BAYxB,OAAO,KAAK,MAAM;iBAiB7B,IAAI;kBAEH,IAAI,QAAQ,OAAO;;;;iBAwEpB,MAAM,OAAO,MAAM,GAAG,IAAI,GAAG,SAAS;gBAGvC,MAAM;oBAGF,MAAM,SAAQ,MAAM,EAAE;qBAOrB,MAAM,UAAU,MAAM;;kBAKzB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAK;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;iBAUtE,IAAI,QAAQ,MAAM,WAAW,MAAM;oBAKhC,IAAI,SAAS,MAAM,UAAS,MAAM,EAAE;kBAOtC,MAAM;kBAMN,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;YAQxB,GAAG,QAAQ,GAAG,EAAE,QAAQ,MAAM,CAAC,GAAG,CAAC,EAAE,MAAK;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;wBA4B3E,MAAM,0BAAsB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;iBAvIhE,MAAM;qBACc,MAAM;;;WAsB1B,CAAC,QAAQ,MAAM,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC;;;EA6HvE;AAED,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal output for `asturiu-v0-tenant` (ADR-074 §5). No dependencies.
|
|
3
|
+
*
|
|
4
|
+
* - Colour only where it helps: on a terminal, never in a pipe or a file. NO_COLOR, --no-color and TERM=dumb turn it
|
|
5
|
+
* off; FORCE_COLOR and --color turn it on.
|
|
6
|
+
* - Unicode symbols, with one-character ASCII stand-ins where the terminal cannot show them.
|
|
7
|
+
* - A spinner on stderr while the Tenant API answers, only on a terminal and never in CI.
|
|
8
|
+
* - Text that comes from outside (ticket posts, titles, server messages) is printed as data: escape sequences, control
|
|
9
|
+
* characters and bidirectional overrides are taken out before it reaches the terminal (`plain`).
|
|
10
|
+
*/
|
|
11
|
+
import { createInterface } from "node:readline";
|
|
12
|
+
const ESC = "\x1b[";
|
|
13
|
+
// CSI sequences and OSC sequences (hyperlinks, titles), whichever terminator they use.
|
|
14
|
+
const ANSI = /\x1b\[[0-9;?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b[@-Z\\-_]/g;
|
|
15
|
+
// C0 and C1 controls (except tab and newline), zero-width and bidirectional formatting characters.
|
|
16
|
+
const CONTROLS = /[\u0000-\u0008\u000b-\u001f\u007f-\u009f----]/g;
|
|
17
|
+
/** The text as it shows, without escape sequences. */
|
|
18
|
+
export const visible = (s) => String(s).replace(ANSI, "");
|
|
19
|
+
/** Columns a string takes on screen (one per code point: the symbols used here are all narrow). */
|
|
20
|
+
export const widthOf = (s) => [...visible(s)].length;
|
|
21
|
+
/**
|
|
22
|
+
* Text from outside as data: no escape sequence, no control character and no bidirectional override reaches the
|
|
23
|
+
* terminal (or the local page). Line breaks stay, tabs become two spaces.
|
|
24
|
+
*/
|
|
25
|
+
export function plain(value) {
|
|
26
|
+
return String(value ?? "")
|
|
27
|
+
.replace(ANSI, "")
|
|
28
|
+
.replace(/\r\n?/g, "\n")
|
|
29
|
+
.replace(/\t/g, " ")
|
|
30
|
+
.replace(CONTROLS, "");
|
|
31
|
+
}
|
|
32
|
+
/** At most `n` columns, with an ellipsis when cut. */
|
|
33
|
+
export function truncate(s, n, ellipsis = "…") {
|
|
34
|
+
const chars = [...s];
|
|
35
|
+
if (chars.length <= n)
|
|
36
|
+
return s;
|
|
37
|
+
if (n <= ellipsis.length)
|
|
38
|
+
return chars.slice(0, n).join("");
|
|
39
|
+
return `${chars.slice(0, n - [...ellipsis].length).join("").trimEnd()}${ellipsis}`;
|
|
40
|
+
}
|
|
41
|
+
/** Plain text wrapped at word boundaries to `width` columns; a word longer than a line is cut. */
|
|
42
|
+
export function wrap(text, width) {
|
|
43
|
+
const w = Math.max(10, width);
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const para of text.split("\n")) {
|
|
46
|
+
if (!para.trim()) {
|
|
47
|
+
out.push("");
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const indent = /^\s*/.exec(para)?.[0] ?? "";
|
|
51
|
+
let line = "";
|
|
52
|
+
for (const word of para.trim().split(/\s+/)) {
|
|
53
|
+
let rest = word;
|
|
54
|
+
while ([...rest].length > w - indent.length) {
|
|
55
|
+
if (line)
|
|
56
|
+
out.push(indent + line);
|
|
57
|
+
line = "";
|
|
58
|
+
const chars = [...rest];
|
|
59
|
+
out.push(indent + chars.slice(0, w - indent.length).join(""));
|
|
60
|
+
rest = chars.slice(w - indent.length).join("");
|
|
61
|
+
}
|
|
62
|
+
if (!rest)
|
|
63
|
+
continue;
|
|
64
|
+
if (!line)
|
|
65
|
+
line = rest;
|
|
66
|
+
else if ([...indent].length + [...line].length + 1 + [...rest].length <= w)
|
|
67
|
+
line += ` ${rest}`;
|
|
68
|
+
else {
|
|
69
|
+
out.push(indent + line);
|
|
70
|
+
line = rest;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (line)
|
|
74
|
+
out.push(indent + line);
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
const UNITS = [
|
|
79
|
+
["year", 365 * 24 * 3600],
|
|
80
|
+
["month", 30 * 24 * 3600],
|
|
81
|
+
["week", 7 * 24 * 3600],
|
|
82
|
+
["day", 24 * 3600],
|
|
83
|
+
["hour", 3600],
|
|
84
|
+
["minute", 60],
|
|
85
|
+
];
|
|
86
|
+
const RELATIVE = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
|
|
87
|
+
/** "3 days ago", "in 2 weeks", "just now". */
|
|
88
|
+
export function ago(iso, now = Date.now()) {
|
|
89
|
+
if (!iso)
|
|
90
|
+
return "";
|
|
91
|
+
const t = Date.parse(iso);
|
|
92
|
+
if (Number.isNaN(t))
|
|
93
|
+
return "";
|
|
94
|
+
const s = Math.round((t - now) / 1000);
|
|
95
|
+
if (Math.abs(s) < 60)
|
|
96
|
+
return "just now";
|
|
97
|
+
for (const [unit, size] of UNITS)
|
|
98
|
+
if (Math.abs(s) >= size)
|
|
99
|
+
return RELATIVE.format(Math.round(s / size), unit);
|
|
100
|
+
return RELATIVE.format(Math.round(s / 60), "minute");
|
|
101
|
+
}
|
|
102
|
+
/** "2026-10-31 15:20" in the local time zone. */
|
|
103
|
+
export function when(iso) {
|
|
104
|
+
if (!iso)
|
|
105
|
+
return "";
|
|
106
|
+
const d = new Date(iso);
|
|
107
|
+
if (Number.isNaN(d.getTime()))
|
|
108
|
+
return String(iso);
|
|
109
|
+
const p = (n) => String(n).padStart(2, "0");
|
|
110
|
+
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`;
|
|
111
|
+
}
|
|
112
|
+
/** "812 B", "3.1 KiB". */
|
|
113
|
+
export function bytes(n) {
|
|
114
|
+
if (n < 1024)
|
|
115
|
+
return `${n} B`;
|
|
116
|
+
return `${(n / 1024).toFixed(n < 10 * 1024 ? 1 : 0)} KiB`;
|
|
117
|
+
}
|
|
118
|
+
/** "1 finding", "3 findings". */
|
|
119
|
+
export const plural = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
|
|
120
|
+
/** A changeset number as the Engine writes it: 001. */
|
|
121
|
+
export const pad3 = (n) => String(n).padStart(3, "0");
|
|
122
|
+
/** How many colours the stream takes: 0 none, 1 the basic sixteen, 2 256, 3 true colour. */
|
|
123
|
+
export function colorLevel(stream, env) {
|
|
124
|
+
if (env.NO_COLOR !== undefined && env.NO_COLOR !== "")
|
|
125
|
+
return 0;
|
|
126
|
+
if (env.FORCE_COLOR !== undefined) {
|
|
127
|
+
if (env.FORCE_COLOR === "0" || env.FORCE_COLOR === "false")
|
|
128
|
+
return 0;
|
|
129
|
+
return Math.min(3, Math.max(1, Number(env.FORCE_COLOR) || 1));
|
|
130
|
+
}
|
|
131
|
+
if (!stream.isTTY || env.TERM === "dumb")
|
|
132
|
+
return 0;
|
|
133
|
+
if (env.COLORTERM === "truecolor" || env.COLORTERM === "24bit")
|
|
134
|
+
return 3;
|
|
135
|
+
if (/-256(color)?$/i.test(env.TERM ?? "") || env.TERM_PROGRAM === "Apple_Terminal")
|
|
136
|
+
return 2;
|
|
137
|
+
return 1;
|
|
138
|
+
}
|
|
139
|
+
/** Whether the terminal shows the Unicode symbols. */
|
|
140
|
+
function unicodeOk(env) {
|
|
141
|
+
if (env.ASTURIU_ASCII)
|
|
142
|
+
return false;
|
|
143
|
+
if (process.platform !== "win32")
|
|
144
|
+
return env.TERM !== "linux";
|
|
145
|
+
return Boolean(env.WT_SESSION || env.TERMINUS_SUBLIME || env.TERM_PROGRAM === "vscode" || env.ConEmuTask === "{cmd::Cmder}" || env.TERM === "xterm-256color");
|
|
146
|
+
}
|
|
147
|
+
/** Whether the terminal turns OSC 8 sequences into links (and ignores them otherwise). */
|
|
148
|
+
function linksOk(env) {
|
|
149
|
+
if (env.FORCE_HYPERLINK !== undefined)
|
|
150
|
+
return env.FORCE_HYPERLINK !== "0";
|
|
151
|
+
if (env.CI)
|
|
152
|
+
return false;
|
|
153
|
+
if (env.WT_SESSION)
|
|
154
|
+
return true;
|
|
155
|
+
if (["iTerm.app", "WezTerm", "vscode", "ghostty", "Hyper"].includes(env.TERM_PROGRAM ?? ""))
|
|
156
|
+
return true;
|
|
157
|
+
return Number(env.VTE_VERSION ?? 0) >= 5000;
|
|
158
|
+
}
|
|
159
|
+
const UNICODE = { ok: "✔", fail: "✖", warn: "▲", info: "●", open: "○", half: "◐", pause: "‖", cross: "✕", dash: "–", arrow: "→", pointer: "›", bullet: "•", dot: "·", diamond: "◆", bar: "│", ellipsis: "…", rule: "─", question: "?" };
|
|
160
|
+
const ASCII = { ok: "+", fail: "x", warn: "!", info: "*", open: "o", half: "~", pause: "=", cross: "-", dash: "-", arrow: ">", pointer: ">", bullet: "*", dot: "-", diamond: "*", bar: "|", ellipsis: "...", rule: "-", question: "?" };
|
|
161
|
+
const SPINNER = { unicode: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"], ascii: ["-", "\\", "|", "/"] };
|
|
162
|
+
export function createTerminal(opts = {}) {
|
|
163
|
+
const stdout = opts.stdout ?? process.stdout;
|
|
164
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
165
|
+
const stdin = opts.stdin ?? process.stdin;
|
|
166
|
+
const env = opts.env ?? process.env;
|
|
167
|
+
const level = opts.color ?? colorLevel(stdout, env);
|
|
168
|
+
const uni = opts.unicode ?? unicodeOk(env);
|
|
169
|
+
const links = level > 0 && linksOk(env);
|
|
170
|
+
const sym = uni ? UNICODE : ASCII;
|
|
171
|
+
const ellipsis = sym.ellipsis;
|
|
172
|
+
const sgr = (open, close) => (s) => (level ? `${ESC}${open}m${s}${ESC}${close}m` : String(s));
|
|
173
|
+
const paint = {
|
|
174
|
+
bold: sgr(1, 22),
|
|
175
|
+
dim: sgr(2, 22),
|
|
176
|
+
italic: sgr(3, 23),
|
|
177
|
+
underline: sgr(4, 24),
|
|
178
|
+
red: sgr(31, 39),
|
|
179
|
+
green: sgr(32, 39),
|
|
180
|
+
yellow: sgr(33, 39),
|
|
181
|
+
blue: sgr(34, 39),
|
|
182
|
+
magenta: sgr(35, 39),
|
|
183
|
+
cyan: sgr(36, 39),
|
|
184
|
+
gray: sgr(90, 39),
|
|
185
|
+
brand: level >= 3 ? sgr("38;2;124;108;255", 39) : level === 2 ? sgr("38;5;99", 39) : sgr(35, 39),
|
|
186
|
+
};
|
|
187
|
+
const TONES = { ok: ["green", "ok"], warn: ["yellow", "warn"], fail: ["red", "fail"], info: ["cyan", "info"], todo: ["blue", "open"], muted: ["gray", "dash"] };
|
|
188
|
+
/** The coloured symbol of a tone. */
|
|
189
|
+
const mark = (tone) => paint[TONES[tone][0]](sym[TONES[tone][1]]);
|
|
190
|
+
/** Text in a tone's colour. */
|
|
191
|
+
const toned = (tone, text) => paint[TONES[tone][0]](text);
|
|
192
|
+
const columns = () => Math.max(60, Math.min(120, stdout.columns || 100));
|
|
193
|
+
// ------------------------------------------------------------ spinner
|
|
194
|
+
const spinnable = !opts.quiet && Boolean(stderr.isTTY) && !env.CI && env.TERM !== "dumb";
|
|
195
|
+
let spinning = null;
|
|
196
|
+
const frames = uni ? SPINNER.unicode : SPINNER.ascii;
|
|
197
|
+
const clearSpin = () => {
|
|
198
|
+
if (spinning)
|
|
199
|
+
stderr.write(`\r${ESC}2K`);
|
|
200
|
+
};
|
|
201
|
+
const drawSpin = () => {
|
|
202
|
+
if (!spinning)
|
|
203
|
+
return;
|
|
204
|
+
spinning.frame = (spinning.frame + 1) % frames.length;
|
|
205
|
+
stderr.write(`\r${ESC}2K ${paint.brand(frames[spinning.frame])} ${paint.gray(truncate(spinning.text, columns() - 6, ellipsis))}`);
|
|
206
|
+
};
|
|
207
|
+
/** A spinner with a line of text while something waits on the network; nothing when stderr is not a terminal. */
|
|
208
|
+
function spin(text) {
|
|
209
|
+
if (!spinnable)
|
|
210
|
+
return { update: (_t) => { }, stop: () => { } };
|
|
211
|
+
if (spinning)
|
|
212
|
+
spinning.text = text;
|
|
213
|
+
else {
|
|
214
|
+
stderr.write(`${ESC}?25l`);
|
|
215
|
+
spinning = { text, frame: 0, timer: setInterval(drawSpin, 80) };
|
|
216
|
+
spinning.timer.unref?.();
|
|
217
|
+
drawSpin();
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
update: (t) => {
|
|
221
|
+
if (spinning)
|
|
222
|
+
spinning.text = t;
|
|
223
|
+
},
|
|
224
|
+
stop: () => {
|
|
225
|
+
if (!spinning)
|
|
226
|
+
return;
|
|
227
|
+
clearInterval(spinning.timer);
|
|
228
|
+
clearSpin();
|
|
229
|
+
spinning = null;
|
|
230
|
+
stderr.write(`${ESC}?25h`);
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/** Runs `fn` with a spinner showing `text`. */
|
|
235
|
+
async function busy(text, fn) {
|
|
236
|
+
const s = spin(text);
|
|
237
|
+
try {
|
|
238
|
+
return await fn();
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
s.stop();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (spinnable)
|
|
245
|
+
process.once("exit", () => spinning && stderr.write(`\r${ESC}2K${ESC}?25h`));
|
|
246
|
+
// ------------------------------------------------------------ lines
|
|
247
|
+
// Two blank lines in a row read as a gap in the output: the second is left out.
|
|
248
|
+
let blank = false;
|
|
249
|
+
/** One line on stdout. */
|
|
250
|
+
const out = (s = "") => {
|
|
251
|
+
if (!s && blank)
|
|
252
|
+
return;
|
|
253
|
+
blank = !s;
|
|
254
|
+
clearSpin();
|
|
255
|
+
stdout.write(`${s}\n`);
|
|
256
|
+
if (spinning)
|
|
257
|
+
drawSpin();
|
|
258
|
+
};
|
|
259
|
+
/** One line on stderr. */
|
|
260
|
+
const err = (s = "") => {
|
|
261
|
+
clearSpin();
|
|
262
|
+
stderr.write(`${s}\n`);
|
|
263
|
+
if (spinning)
|
|
264
|
+
drawSpin();
|
|
265
|
+
};
|
|
266
|
+
/** A link where the terminal makes one, the text otherwise. */
|
|
267
|
+
const link = (text, url) => (links && url ? `\x1b]8;;${url}\x07${text}\x1b]8;;\x07` : text);
|
|
268
|
+
/** A command the person can run, in the colour every command has. */
|
|
269
|
+
const code = (cmd) => paint.cyan(cmd);
|
|
270
|
+
/** The heading of every run: the mark, the Engine, and where it talks to. */
|
|
271
|
+
function banner(title, meta = []) {
|
|
272
|
+
out();
|
|
273
|
+
out(` ${paint.brand(sym.diamond)} ${paint.bold("Asturiu")} ${paint.bold(title)}${meta.filter(Boolean).length ? ` ${paint.gray(meta.filter(Boolean).join(` ${sym.dot} `))}` : ""}`);
|
|
274
|
+
out();
|
|
275
|
+
}
|
|
276
|
+
/** A section title, with an aside in grey. */
|
|
277
|
+
function section(title, aside) {
|
|
278
|
+
out(` ${paint.bold(title)}${aside ? ` ${paint.gray(aside)}` : ""}`);
|
|
279
|
+
}
|
|
280
|
+
/** Label and value pairs, labels aligned. A value of several lines continues under the first. */
|
|
281
|
+
function pairs(rows, o = {}) {
|
|
282
|
+
const indent = " ".repeat(o.indent ?? 2);
|
|
283
|
+
const w = o.width ?? Math.max(...rows.map(([k]) => widthOf(k))) + 2;
|
|
284
|
+
for (const [k, v] of rows) {
|
|
285
|
+
const lines = Array.isArray(v) ? v : [v];
|
|
286
|
+
lines.forEach((line, i) => out(`${indent}${i === 0 ? paint.gray(k.padEnd(w)) : " ".repeat(w)}${line}`));
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/** A line with a tone's symbol, and detail in grey. */
|
|
290
|
+
function item(tone, text, detail, indent = 2) {
|
|
291
|
+
out(`${" ".repeat(indent)}${mark(tone)} ${text}${detail ? ` ${paint.gray(detail)}` : ""}`);
|
|
292
|
+
}
|
|
293
|
+
/** A block that must not be missed: a coloured bar beside a title and its lines. */
|
|
294
|
+
function callout(tone, title, lines = []) {
|
|
295
|
+
out(` ${mark(tone)} ${paint.bold(title)}`);
|
|
296
|
+
const bar = toned(tone, sym.bar);
|
|
297
|
+
for (const l of lines)
|
|
298
|
+
for (const part of wrap(l, columns() - 8))
|
|
299
|
+
out(` ${bar} ${part}`);
|
|
300
|
+
}
|
|
301
|
+
/** Text quoted from outside (a ticket post), wrapped, behind a grey bar. */
|
|
302
|
+
function quote(text, indent = 4) {
|
|
303
|
+
const pad = " ".repeat(indent);
|
|
304
|
+
for (const line of wrap(plain(text), columns() - indent - 4))
|
|
305
|
+
out(`${pad}${paint.gray(sym.bar)}${line ? ` ${line}` : ""}`);
|
|
306
|
+
}
|
|
307
|
+
/** What to run next: each command and why, aligned. */
|
|
308
|
+
function next(steps) {
|
|
309
|
+
if (!steps.length)
|
|
310
|
+
return;
|
|
311
|
+
out();
|
|
312
|
+
const w = Math.min(64, Math.max(...steps.map(([c]) => widthOf(c))));
|
|
313
|
+
for (const [cmd, why] of steps)
|
|
314
|
+
out(` ${paint.gray(sym.arrow)} ${code(cmd.padEnd(w))}${why ? ` ${paint.gray(why)}` : ""}`);
|
|
315
|
+
}
|
|
316
|
+
/** Rows as aligned columns, the header in grey. The `flex` column gives way when the screen is too narrow. */
|
|
317
|
+
function table(rows, cols, o = {}) {
|
|
318
|
+
const indent = o.indent ?? 2;
|
|
319
|
+
const gap = o.gap ?? 2;
|
|
320
|
+
const cells = rows.map((r) => cols.map((c) => plain(c.value(r) ?? "").replace(/\n/g, " ")));
|
|
321
|
+
const widths = cols.map((c, i) => Math.max(o.header === false ? 0 : widthOf(c.label), ...cells.map((row) => widthOf(row[i]))));
|
|
322
|
+
const total = indent + widths.reduce((a, b) => a + b, 0) + gap * (cols.length - 1);
|
|
323
|
+
const flex = cols.findIndex((c) => c.flex);
|
|
324
|
+
if (flex >= 0 && total > columns())
|
|
325
|
+
widths[flex] = Math.max(cols[flex].min ?? 12, widths[flex] - (total - columns()));
|
|
326
|
+
const fit = (s, i) => truncate(s, widths[i], ellipsis);
|
|
327
|
+
const align = (s, i, shown) => {
|
|
328
|
+
const room = " ".repeat(Math.max(0, widths[i] - widthOf(s)));
|
|
329
|
+
return cols[i].align === "right" ? room + shown : shown + room;
|
|
330
|
+
};
|
|
331
|
+
const lineOf = (parts) => `${" ".repeat(indent)}${parts.join(" ".repeat(gap))}`.trimEnd();
|
|
332
|
+
if (o.header !== false)
|
|
333
|
+
out(lineOf(cols.map((c, i) => align(fit(c.label, i), i, paint.gray(fit(c.label, i))))));
|
|
334
|
+
rows.forEach((r, ri) => out(lineOf(cols.map((c, i) => {
|
|
335
|
+
const text = fit(cells[ri][i], i);
|
|
336
|
+
return align(text, i, c.paint ? c.paint(text, r) : text);
|
|
337
|
+
}))));
|
|
338
|
+
}
|
|
339
|
+
/** A yes/no question on a terminal; null when nobody can answer (a pipe, an agent, the local page), so the caller decides. */
|
|
340
|
+
async function confirm(question, byDefault = false) {
|
|
341
|
+
if (!stdin.isTTY || !stdout.isTTY)
|
|
342
|
+
return null;
|
|
343
|
+
clearSpin();
|
|
344
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
345
|
+
const answer = await new Promise((resolve) => rl.question(` ${paint.cyan(sym.question)} ${question} ${paint.gray(byDefault ? "[Y/n]" : "[y/N]")} `, resolve));
|
|
346
|
+
rl.close();
|
|
347
|
+
const a = String(answer).trim().toLowerCase();
|
|
348
|
+
return a ? a === "y" || a === "yes" : byDefault;
|
|
349
|
+
}
|
|
350
|
+
const rule = () => out(` ${paint.gray(sym.rule.repeat(Math.max(10, columns() - 4)))}`);
|
|
351
|
+
return { level, unicode: uni, sym, paint, mark, toned, columns, out, err, link, code, banner, section, rule, pairs, item, callout, quote, next, table, confirm, spin, busy, ellipsis, interactive: Boolean(stdin.isTTY && stdout.isTTY) };
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/cli/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The local page of `asturiu-v0-tenant ui` (ADR-074 §7): one HTML document with its style and script inline, served
|
|
3
|
+
* from the package, nothing fetched from elsewhere. `__NONCE__` and `__COMMAND__` are filled in per response. The
|
|
4
|
+
* script writes every answer as text (`textContent`), never as markup: ticket text, titles and server messages are
|
|
5
|
+
* data.
|
|
6
|
+
*/
|
|
7
|
+
export declare const UI_PAGE = "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<meta name=\"robots\" content=\"noindex\">\n<title>Tenant command line</title>\n<style nonce=\"__NONCE__\">\n:root { --bg: #f6f5f1; --panel: #ffffff; --line: #e2e0d8; --fg: #1b1d21; --muted: #626770; --accent: #2b6f6a; --accent-fg: #ffffff; --ok: #2f7d3a; --warn: #9a6a00; --fail: #b3261e; --code: #eeece6; }\n@media (prefers-color-scheme: dark) { :root { --bg: #0f1113; --panel: #171a1d; --line: #2a2f34; --fg: #e8e6e1; --muted: #9aa1a8; --accent: #5fb3aa; --accent-fg: #0f1113; --ok: #6cc47a; --warn: #e0b54a; --fail: #f07167; --code: #20252a; } }\n* { box-sizing: border-box; }\nbody { margin: 0; background: var(--bg); color: var(--fg); font: 15px/1.5 system-ui, -apple-system, \"Segoe UI\", sans-serif; }\nheader { padding: 16px 24px; border-bottom: 1px solid var(--line); display: flex; gap: 12px; align-items: baseline; flex-wrap: wrap; }\nheader h1 { font-size: 17px; margin: 0; }\nheader p { margin: 0; color: var(--muted); font-size: 13px; }\nmain { display: grid; grid-template-columns: minmax(240px, 300px) 1fr; gap: 24px; padding: 24px; max-width: 1280px; }\n@media (max-width: 800px) { main { grid-template-columns: 1fr; padding: 16px; } }\nnav section { margin-bottom: 20px; }\nnav h2 { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); margin: 0 0 8px; }\nbutton { font: inherit; border: 1px solid var(--line); background: var(--panel); color: var(--fg); border-radius: 8px; padding: 6px 12px; cursor: pointer; margin: 0 6px 6px 0; }\nbutton:hover { border-color: var(--accent); }\nbutton.write { border-color: var(--accent); }\nbutton[disabled] { opacity: .5; cursor: wait; }\ninput, select { font: inherit; border: 1px solid var(--line); background: var(--panel); color: var(--fg); border-radius: 8px; padding: 5px 8px; margin: 0 6px 6px 0; max-width: 100%; }\ninput[type=number] { width: 80px; }\nlabel.check { display: inline-flex; gap: 4px; align-items: center; margin-right: 10px; font-size: 14px; }\n#result { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 20px; min-height: 240px; overflow-x: auto; }\n#result .empty { color: var(--muted); }\n.line { font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-size: 13px; background: var(--code); padding: 6px 10px; border-radius: 6px; display: inline-block; margin: 4px 0 12px; word-break: break-all; }\n.exit { font-weight: 600; }\n.exit.ok { color: var(--ok); } .exit.warn { color: var(--warn); } .exit.fail { color: var(--fail); }\ndl { display: grid; grid-template-columns: minmax(120px, max-content) 1fr; gap: 4px 16px; margin: 4px 0 8px; }\ndt { color: var(--muted); }\ndd { margin: 0; min-width: 0; overflow-wrap: anywhere; }\ntable { border-collapse: collapse; font-size: 14px; margin: 4px 0 8px; }\nth, td { text-align: left; padding: 4px 10px 4px 0; border-bottom: 1px solid var(--line); vertical-align: top; overflow-wrap: anywhere; }\nth { color: var(--muted); font-weight: 500; }\npre { white-space: pre-wrap; overflow-wrap: anywhere; background: var(--code); padding: 12px; border-radius: 8px; font-size: 13px; }\n.prompt h3 { font-size: 14px; margin: 12px 0 4px; }\n.prompt p { color: var(--muted); margin: 0 0 6px; font-size: 13px; }\ndetails { margin-top: 16px; } summary { color: var(--muted); cursor: pointer; }\n.handover { border-left: 3px solid var(--warn); padding: 4px 12px; margin: 8px 0 12px; }\n</style>\n</head>\n<body>\n<header>\n <h1>Tenant command line</h1>\n <p>This page runs on this machine only. Each button runs the same command as the terminal; the key stays in the command's process.</p>\n</header>\n<main>\n <nav>\n <section>\n <h2>Overview</h2>\n <button data-action=\"status\">Status</button>\n <button data-action=\"doctor\">Doctor</button>\n <button data-action=\"engine\">Engine</button>\n </section>\n <section>\n <h2>Repository files</h2>\n <button data-action=\"definitions\">Definition set</button>\n <button data-action=\"branding\">Branding and portal</button>\n <div>\n <label class=\"check\"><input type=\"checkbox\" name=\"part\" value=\"definitions\" checked>definitions</label>\n <label class=\"check\"><input type=\"checkbox\" name=\"part\" value=\"branding\" checked>branding</label>\n <label class=\"check\"><input type=\"checkbox\" name=\"part\" value=\"portal\" checked>portal</label>\n </div>\n <button data-action=\"apply\" class=\"write\">Apply to the Engine</button>\n <div>\n <button data-action=\"pull\">Pull: show the differences</button>\n <button data-action=\"pull-write\" class=\"write\">Pull: write the files</button>\n </div>\n </section>\n <section>\n <h2>Changesets</h2>\n <button data-action=\"changesets\">List</button>\n <button data-action=\"changesets-pull\" class=\"write\">Pull the documents</button>\n <div><input id=\"changeset-number\" type=\"number\" min=\"1\" placeholder=\"#\"><button data-action=\"changeset\">Show one, with its prompt</button></div>\n </section>\n <section>\n <h2>Feedback</h2>\n <button data-action=\"feedback-queue\">Queue</button>\n <div><input id=\"feedback-file\" placeholder=\"file in this repository (.md or .json)\"></div>\n <div>\n <select id=\"feedback-kind\"><option value=\"defect\">defect</option><option value=\"limitation\">limitation</option><option value=\"question\">question</option></select>\n <input id=\"feedback-area\" placeholder=\"area\">\n <button data-action=\"feedback-add\" class=\"write\">Add to the queue</button>\n </div>\n <button data-action=\"feedback-dry-run\">Show the report</button>\n <button data-action=\"feedback-send\" class=\"write\">Send</button>\n </section>\n </nav>\n <div id=\"result\"><p class=\"empty\">Pick a task on the left. The answer shows here, beside the line to type in a terminal instead.</p></div>\n</main>\n<script nonce=\"__NONCE__\">\n(() => {\n const COMMAND = \"__COMMAND__\";\n const QUESTIONS = {\n apply: \"Send the repository's files to the Engine?\",\n \"pull-write\": \"Write the stored branding and portal into the repository's files? It replaces what is there.\",\n \"changesets-pull\": \"Copy the missing changeset documents into the repository?\",\n \"feedback-add\": \"Add this file to the feedback queue? Nothing is sent yet.\",\n \"feedback-drop\": \"Take this finding out of the queue?\",\n \"feedback-send\": \"Send the queued findings to the Engine team as one report?\",\n };\n const EXITS = { 0: [\"done\", \"ok\"], 1: [\"failed or refused\", \"fail\"], 2: [\"not understood\", \"fail\"], 3: [\"done here, not reported to the Engine\", \"warn\"] };\n const result = document.getElementById(\"result\");\n const el = (tag, text, cls) => { const e = document.createElement(tag); if (text !== undefined && text !== null) e.textContent = String(text); if (cls) e.className = cls; return e; };\n const words = (k) => String(k).replace(/_/g, \" \");\n const isUrl = (s) => typeof s === \"string\" && /^https?:\\/\\/[^\\s]+$/.test(s);\n\n function value(v, depth) {\n if (v === null || v === undefined || v === \"\") return el(\"span\", \"\u2014\");\n if (typeof v === \"boolean\") return el(\"span\", v ? \"yes\" : \"no\");\n if (typeof v === \"number\") return el(\"span\", v);\n if (typeof v === \"string\") {\n if (isUrl(v)) { const a = el(\"a\", v); a.href = v; a.rel = \"noreferrer noopener\"; a.target = \"_blank\"; return a; }\n return v.includes(\"\\n\") ? el(\"pre\", v) : el(\"span\", v);\n }\n if (Array.isArray(v)) {\n if (!v.length) return el(\"span\", \"none\");\n if (v.every((x) => x && typeof x === \"object\" && !Array.isArray(x))) return table(v, depth);\n return el(\"span\", v.map((x) => (typeof x === \"object\" ? JSON.stringify(x) : String(x))).join(\", \"));\n }\n if (depth > 3) return el(\"span\", JSON.stringify(v));\n return object(v, depth);\n }\n function object(o, depth) {\n const dl = el(\"dl\");\n for (const [k, v] of Object.entries(o)) {\n if (k === \"prompt\" && typeof v === \"string\") continue;\n dl.append(el(\"dt\", words(k)));\n const dd = el(\"dd\");\n dd.append(value(v, depth + 1));\n dl.append(dd);\n }\n return dl;\n }\n function table(rows, depth) {\n const cols = [...new Set(rows.flatMap((r) => Object.keys(r)))].filter((c) => ![\"detail\", \"stored\", \"posts\", \"parties\", \"decisions\"].includes(c)).slice(0, 8);\n const t = el(\"table\"); const head = el(\"tr\");\n for (const c of cols) head.append(el(\"th\", words(c)));\n t.append(head);\n for (const r of rows) {\n const tr = el(\"tr\");\n for (const c of cols) { const td = el(\"td\"); const v = r[c]; td.append(v && typeof v === \"object\" ? el(\"span\", JSON.stringify(v)) : value(v, depth + 1)); tr.append(td); }\n t.append(tr);\n }\n return t;\n }\n\n function show(answer) {\n result.replaceChildren();\n const [meaning, tone] = EXITS[answer.exit] || [\"exit \" + answer.exit, \"fail\"];\n const head = el(\"p\"); head.append(el(\"span\", meaning, \"exit \" + tone));\n result.append(head);\n result.append(el(\"p\", \"In a terminal:\"));\n result.append(el(\"code\", answer.terminal, \"line\"));\n const r = answer.result;\n if (r && typeof r === \"object\") {\n if (r.reported === false && r.command) {\n const h = el(\"div\", null, \"handover\");\n h.append(el(\"p\", \"Not reported to the Engine\" + (r.reason ? \": \" + r.reason : \".\")));\n h.append(el(\"code\", r.command, \"line\"));\n result.append(h);\n }\n if (typeof r.prompt === \"string\") {\n const p = el(\"div\", null, \"prompt\");\n p.append(el(\"h3\", \"Prompt for your coding agent\"));\n p.append(el(\"p\", \"Show this to your agent once you have read it and agree. This page never runs it.\"));\n p.append(el(\"pre\", r.prompt));\n result.append(p);\n }\n result.append(value(r, 0));\n const raw = el(\"details\"); raw.append(el(\"summary\", \"The answer as JSON\")); raw.append(el(\"pre\", JSON.stringify(r, null, 2)));\n result.append(raw);\n } else if (answer.output) result.append(el(\"pre\", answer.output));\n }\n\n async function runAction(action, params) {\n if (QUESTIONS[action] && !window.confirm(QUESTIONS[action])) return;\n const buttons = document.querySelectorAll(\"button\");\n buttons.forEach((b) => (b.disabled = true));\n result.replaceChildren(el(\"p\", \"Running \" + COMMAND + \" \u2026\", \"empty\"));\n try {\n const res = await fetch(\"/api/run\", { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify({ action, params }) });\n const answer = await res.json();\n if (!res.ok) { result.replaceChildren(el(\"p\", answer.error || \"The page refused the request.\", \"exit fail\")); return; }\n show(answer);\n } catch (err) {\n result.replaceChildren(el(\"p\", \"The command line stopped. Run it again for a new page.\", \"exit fail\"));\n } finally {\n buttons.forEach((b) => (b.disabled = false));\n }\n }\n\n document.querySelectorAll(\"button[data-action]\").forEach((b) => b.addEventListener(\"click\", () => {\n const action = b.dataset.action;\n const params = {};\n if (action === \"apply\") params.parts = [...document.querySelectorAll(\"input[name=part]:checked\")].map((i) => i.value);\n if (action === \"changeset\") params.number = Number(document.getElementById(\"changeset-number\").value);\n if (action === \"feedback-add\") { params.file = document.getElementById(\"feedback-file\").value; params.kind = document.getElementById(\"feedback-kind\").value; params.area = document.getElementById(\"feedback-area\").value; }\n runAction(action, params);\n }));\n})();\n</script>\n</body>\n</html>\n";
|
|
8
|
+
//# sourceMappingURL=ui-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-page.d.ts","sourceRoot":"","sources":["../../src/cli/ui-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,OAAO,w4XAgNnB,CAAC"}
|