@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,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every command of `asturiu-v0-tenant` shares: the run's context, failures the person can act on, the Tenant
|
|
3
|
+
* API through the SDK's own calls, and the repository's local state. The Tenant key is read from the environment and
|
|
4
|
+
* never printed (ADR-074 §14).
|
|
5
|
+
*/
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { pathToFileURL } from "node:url";
|
|
10
|
+
import * as sdk from "../index.js";
|
|
11
|
+
import { TenantApiError, parseTenantKey } from "../definition-set.js";
|
|
12
|
+
import { folderSources } from "./sources.js";
|
|
13
|
+
import { plain } from "./terminal.js";
|
|
14
|
+
/** The exit codes (ADR-074 §5). */
|
|
15
|
+
export const EXIT = { done: 0, failed: 1, misunderstood: 2, notReported: 3 };
|
|
16
|
+
/** A failure the person can act on: a title, what happened, what to do. */
|
|
17
|
+
export class Fail extends Error {
|
|
18
|
+
hint;
|
|
19
|
+
lines;
|
|
20
|
+
code;
|
|
21
|
+
data;
|
|
22
|
+
constructor(message, o = {}) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.hint = o.hint;
|
|
25
|
+
this.lines = o.lines ?? [];
|
|
26
|
+
this.code = o.code ?? EXIT.failed;
|
|
27
|
+
this.data = o.data;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** The repository's configuration: `asturiu.config.mjs` at its root, else `asturiu/config.mjs`, else none. */
|
|
31
|
+
export async function loadConfig(root) {
|
|
32
|
+
for (const name of ["asturiu.config.mjs", path.join("asturiu", "config.mjs")]) {
|
|
33
|
+
const file = path.join(root, name);
|
|
34
|
+
if (!existsSync(file))
|
|
35
|
+
continue;
|
|
36
|
+
const mod = (await import(pathToFileURL(file).href));
|
|
37
|
+
return { ...(mod.default ?? mod), file: name };
|
|
38
|
+
}
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
/** How the person runs this, for the hints: the package script when there is one, else `npx --no-install asturiu-v0-tenant`. */
|
|
42
|
+
export function commandPrefix(env, fallback) {
|
|
43
|
+
const script = env.npm_lifecycle_event;
|
|
44
|
+
const ua = env.npm_config_user_agent ?? "";
|
|
45
|
+
if (!script || script === "npx")
|
|
46
|
+
return fallback;
|
|
47
|
+
if (ua.startsWith("pnpm"))
|
|
48
|
+
return `pnpm ${script}`;
|
|
49
|
+
if (ua.startsWith("yarn"))
|
|
50
|
+
return `yarn ${script}`;
|
|
51
|
+
if (ua.startsWith("bun"))
|
|
52
|
+
return `bun run ${script}`;
|
|
53
|
+
return `npm run ${script} --`;
|
|
54
|
+
}
|
|
55
|
+
/** The Tenant's slug, out of the key's first part (`atk.<slug>.…`): not a secret. */
|
|
56
|
+
export function slugOf(key) {
|
|
57
|
+
if (!key)
|
|
58
|
+
return null;
|
|
59
|
+
try {
|
|
60
|
+
return parseTenantKey(key).slug;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** The key's id, out of its second part: not a secret either. */
|
|
67
|
+
export function keyIdOf(key) {
|
|
68
|
+
if (!key)
|
|
69
|
+
return null;
|
|
70
|
+
try {
|
|
71
|
+
return parseTenantKey(key).kid;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* One SDK call, with what the network answered: its HTTP status, or why it could not reach the Tenant API. A
|
|
79
|
+
* `TenantApiError` carries the status itself; the calls that never throw (`applyDefinitions` and the like) are read
|
|
80
|
+
* through the status the wrapped `fetch` saw.
|
|
81
|
+
*/
|
|
82
|
+
export async function call(ctx, fn) {
|
|
83
|
+
if (!ctx.key)
|
|
84
|
+
return { ok: false, why: "no-key", status: 0, network: "", message: "ASTURIU_TENANT_KEY is not set", type: null };
|
|
85
|
+
if (!ctx.cfg)
|
|
86
|
+
return { ok: false, why: "no-url", status: 0, network: "", message: "ASTURIU_TENANT_API_URL is not set", type: null };
|
|
87
|
+
const seen = { status: 0, network: "" };
|
|
88
|
+
const cfg = ctx.cfg;
|
|
89
|
+
const tracked = async (input, init) => {
|
|
90
|
+
try {
|
|
91
|
+
const res = await (ctx.fetch ?? ((i, n) => globalThis.fetch(i, n)))(input, init);
|
|
92
|
+
seen.status = res.status;
|
|
93
|
+
const expires = res.headers.get("asturiu-key-expires");
|
|
94
|
+
if (expires)
|
|
95
|
+
ctx.keyExpires = expires;
|
|
96
|
+
return res;
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
seen.network = unreachable(err, cfg.baseUrl);
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
try {
|
|
104
|
+
return { ok: true, value: await fn(tracked, cfg), ...seen };
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
const status = err instanceof TenantApiError ? err.status : seen.status;
|
|
108
|
+
const message = seen.network || plain(err instanceof Error ? err.message : String(err));
|
|
109
|
+
const why = seen.network ? "network" : status === 404 ? "no-route" : "refused";
|
|
110
|
+
return { ok: false, why, status, network: seen.network, message, type: err instanceof TenantApiError ? err.type : null };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Why the Tenant API could not be reached, in words. */
|
|
114
|
+
export function unreachable(err, baseUrl) {
|
|
115
|
+
const cause = err?.cause;
|
|
116
|
+
const code = cause?.code ?? "";
|
|
117
|
+
const words = {
|
|
118
|
+
ECONNREFUSED: "nothing answers there",
|
|
119
|
+
ENOTFOUND: "the host is unknown",
|
|
120
|
+
EAI_AGAIN: "the host could not be looked up",
|
|
121
|
+
ETIMEDOUT: "it did not answer in time",
|
|
122
|
+
UND_ERR_CONNECT_TIMEOUT: "it did not answer in time",
|
|
123
|
+
ECONNRESET: "the connection was cut",
|
|
124
|
+
EPERM: "the connection was not permitted here (a sandbox?)",
|
|
125
|
+
EHOSTUNREACH: "the host cannot be reached",
|
|
126
|
+
CERT_HAS_EXPIRED: "its certificate has expired",
|
|
127
|
+
DEPTH_ZERO_SELF_SIGNED_CERT: "its certificate is self-signed",
|
|
128
|
+
UNABLE_TO_VERIFY_LEAF_SIGNATURE: "its certificate could not be verified",
|
|
129
|
+
};
|
|
130
|
+
return `could not reach the Tenant API at ${hostOf(baseUrl)}: ${words[code] ?? plain(cause?.message ?? (err instanceof Error ? err.message : String(err)))}`;
|
|
131
|
+
}
|
|
132
|
+
export const hostOf = (url) => {
|
|
133
|
+
if (!url)
|
|
134
|
+
return "—";
|
|
135
|
+
try {
|
|
136
|
+
return new URL(url).host;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return url;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
/** A failed read in a few words, for a status line. */
|
|
143
|
+
export function readFailure(r, scope) {
|
|
144
|
+
if (r.why === "no-key")
|
|
145
|
+
return "not read: ASTURIU_TENANT_KEY is not set";
|
|
146
|
+
if (r.why === "no-url")
|
|
147
|
+
return "not read: ASTURIU_TENANT_API_URL is not set";
|
|
148
|
+
if (r.why === "no-route")
|
|
149
|
+
return scope ? `not read: the key lacks the scope “${scope}”, or the Engine has no such route` : "not read: the Engine has no such route";
|
|
150
|
+
if (r.status === 401)
|
|
151
|
+
return "not read: the Tenant API refused the key (revoked, expired, or for another Tenant)";
|
|
152
|
+
return `not read: ${r.message}`;
|
|
153
|
+
}
|
|
154
|
+
/** The repository's sources, made once. */
|
|
155
|
+
export function sources(ctx) {
|
|
156
|
+
if (!ctx._sources) {
|
|
157
|
+
const s = ctx.config.sources;
|
|
158
|
+
ctx._sources = typeof s === "function" ? s({ root: ctx.root, kit: sdk }) : (s ?? folderSources({ root: ctx.root }));
|
|
159
|
+
}
|
|
160
|
+
return ctx._sources;
|
|
161
|
+
}
|
|
162
|
+
/** Fails when no key or address is set: for commands that cannot do anything without. */
|
|
163
|
+
export function needTenantApi(ctx, what) {
|
|
164
|
+
if (!ctx.key)
|
|
165
|
+
throw new Fail(`ASTURIU_TENANT_KEY is not set: ${what}`, { lines: ["The Tenant key is made in the Admin UI (your Tenant › Tenant keys) with the scopes the repository needs. Put it in the server's environment, or in .env, as ASTURIU_TENANT_KEY. Never paste it into a chat, a file under version control or a report."], hint: `${ctx.cmd} doctor checks the whole set-up` });
|
|
166
|
+
if (!ctx.cfg)
|
|
167
|
+
throw new Fail(`ASTURIU_TENANT_API_URL is not set: ${what}`, { lines: ["It is the Tenant API's address, given with your Tenant."] });
|
|
168
|
+
}
|
|
169
|
+
/** One JSON document on stdout. */
|
|
170
|
+
export function emit(ctx, data) {
|
|
171
|
+
ctx.t.out(JSON.stringify(data, null, 2));
|
|
172
|
+
}
|
|
173
|
+
// ================================================================== local state
|
|
174
|
+
export function places(ctx) {
|
|
175
|
+
return {
|
|
176
|
+
state: path.join(ctx.root, "asturiu", ".state.json"),
|
|
177
|
+
queue: path.join(ctx.root, "asturiu", "feedback", "queue"),
|
|
178
|
+
sent: path.join(ctx.root, "asturiu", "feedback", "sent"),
|
|
179
|
+
offline: path.join(ctx.root, "asturiu-feedback"),
|
|
180
|
+
changesets: path.join(ctx.root, ctx.config.changesetsDir ?? path.join("asturiu", "changesets")),
|
|
181
|
+
agents: path.join(ctx.root, ctx.config.agentsFile ?? "AGENTS.md"),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export const rel = (ctx, file) => path.relative(ctx.root, file) || ".";
|
|
185
|
+
export function readState(ctx) {
|
|
186
|
+
try {
|
|
187
|
+
return JSON.parse(readFileSync(places(ctx).state, "utf8"));
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return {};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export function writeState(ctx, patch) {
|
|
194
|
+
const file = places(ctx).state;
|
|
195
|
+
mkdirSync(path.dirname(file), { recursive: true });
|
|
196
|
+
writeFileSync(file, `${JSON.stringify({ ...readState(ctx), ...patch }, null, 2)}\n`);
|
|
197
|
+
}
|
|
198
|
+
/** The Engine version and changeset the Asturiu section in AGENTS.md was written for. */
|
|
199
|
+
export function agentsSection(ctx) {
|
|
200
|
+
try {
|
|
201
|
+
const m = /<!-- asturiu:begin engine=(\S+) changeset=(\d+) -->/.exec(readFileSync(places(ctx).agents, "utf8"));
|
|
202
|
+
return m ? { engine: m[1], changeset: Number(m[2]) } : null;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** The changesets the repository records as done. */
|
|
209
|
+
export function recorded(ctx) {
|
|
210
|
+
if (ctx.config.recorded)
|
|
211
|
+
return ctx.config.recorded(ctx.root);
|
|
212
|
+
const upTo = agentsSection(ctx)?.changeset ?? 0;
|
|
213
|
+
return new Set(Array.from({ length: upTo }, (_, i) => i + 1));
|
|
214
|
+
}
|
|
215
|
+
export function pulledDocuments(ctx) {
|
|
216
|
+
const dir = places(ctx).changesets;
|
|
217
|
+
return new Set(existsSync(dir) ? readdirSync(dir) : []);
|
|
218
|
+
}
|
|
219
|
+
/** Whether git ignores a path: true, false, or null outside a repository. */
|
|
220
|
+
export function gitIgnores(ctx, file) {
|
|
221
|
+
const r = spawnSync("git", ["check-ignore", "-q", rel(ctx, file)], { cwd: ctx.root, stdio: "ignore" });
|
|
222
|
+
if (r.error || (r.status !== 0 && r.status !== 1))
|
|
223
|
+
return null;
|
|
224
|
+
return r.status === 0;
|
|
225
|
+
}
|
|
226
|
+
// ================================================================== secrets
|
|
227
|
+
/** Text that looks like a secret: the Tenant key, a token, a session, a password. Reports and notes never carry one. */
|
|
228
|
+
export function secretIn(ctx, text) {
|
|
229
|
+
if (ctx.key && text.includes(ctx.key))
|
|
230
|
+
return "the Tenant key";
|
|
231
|
+
if (/\batk\.[a-z0-9-]+\.[0-9a-f]{8,}\./i.test(text))
|
|
232
|
+
return "a Tenant key";
|
|
233
|
+
if (/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(text))
|
|
234
|
+
return "a private key";
|
|
235
|
+
if (/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\./.test(text))
|
|
236
|
+
return "a token";
|
|
237
|
+
if (/\b(authorization:\s*(bearer|asturiu-assertion)\s+\S{12,}|x-asturiu-session:\s*\S{12,})/i.test(text))
|
|
238
|
+
return "a credential header";
|
|
239
|
+
if (/\b[a-z0-9_]*session=[A-Za-z0-9._~%-]{16,}/i.test(text))
|
|
240
|
+
return "a session identifier";
|
|
241
|
+
if (/\b(app_password|client_secret|password)\s*[:=]\s*\S{6,}/i.test(text))
|
|
242
|
+
return "a password or client secret";
|
|
243
|
+
for (const re of ctx.config.secrets ?? [])
|
|
244
|
+
if (re.test(text))
|
|
245
|
+
return "a secret this repository names";
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
/** Fails when the text holds a secret: nothing is sent. */
|
|
249
|
+
export function refuseSecrets(ctx, ...texts) {
|
|
250
|
+
for (const text of texts) {
|
|
251
|
+
const secret = text ? secretIn(ctx, text) : null;
|
|
252
|
+
if (secret)
|
|
253
|
+
throw new Fail(`The text looks like it holds ${secret}. Nothing was sent.`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/** A flag's string value. */
|
|
257
|
+
export const str = (v) => (typeof v === "string" ? v : undefined);
|
|
258
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAA2B,aAAa,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAiB,KAAK,EAAE,MAAM,eAAe,CAAC;AAiDrD,mCAAmC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAW,CAAC;AAEtF,2EAA2E;AAC3E,MAAM,OAAO,IAAK,SAAQ,KAAK;IAC7B,IAAI,CAAU;IACd,KAAK,CAAW;IAChB,IAAI,CAAS;IACb,IAAI,CAAQ;IACZ,YAAY,OAAe,EAAE,IAAqE,EAAE;QAClG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,CAAC;CACF;AAED,8GAA8G;AAC9G,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,KAAK,MAAM,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAkC,CAAC;QACtF,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,gIAAgI;AAChI,MAAM,UAAU,aAAa,CAAC,GAAQ,EAAE,QAAgB;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC;IACvC,MAAM,EAAE,GAAG,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,MAAM,EAAE,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,MAAM,EAAE,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,MAAM,EAAE,CAAC;IACrD,OAAO,WAAW,MAAM,KAAK,CAAC;AAChC,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,MAAM,CAAC,GAAkB;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,OAAO,CAAC,GAAkB;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAOD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAI,GAAQ,EAAE,EAA2E;IACjH,IAAI,CAAC,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChI,IAAI,CAAC,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpI,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,OAAO,GAAc,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAS,EAAE,CAAe,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACvG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACvD,IAAI,OAAO;gBAAE,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3H,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAAC,GAAY,EAAE,OAAe;IACvD,MAAM,KAAK,GAAI,GAAuD,EAAE,KAAK,CAAC;IAC9E,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAA2B;QACpC,YAAY,EAAE,uBAAuB;QACrC,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,iCAAiC;QAC5C,SAAS,EAAE,2BAA2B;QACtC,uBAAuB,EAAE,2BAA2B;QACpD,UAAU,EAAE,wBAAwB;QACpC,KAAK,EAAE,oDAAoD;QAC3D,YAAY,EAAE,4BAA4B;QAC1C,gBAAgB,EAAE,6BAA6B;QAC/C,2BAA2B,EAAE,gCAAgC;QAC7D,+BAA+B,EAAE,uCAAuC;KACzE,CAAC;IACF,OAAO,qCAAqC,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/J,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAA8B,EAAU,EAAE;IAC/D,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,WAAW,CAAC,CAAmD,EAAE,KAAc;IAC7F,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,yCAAyC,CAAC;IACzE,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,6CAA6C,CAAC;IAC7E,IAAI,CAAC,CAAC,GAAG,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,sCAAsC,KAAK,oCAAoC,CAAC,CAAC,CAAC,wCAAwC,CAAC;IACpK,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,oFAAoF,CAAC;IAClH,OAAO,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,OAAO,CAAC,GAAQ;IAC9B,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7B,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtH,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC;AACtB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,GAAQ,EAAE,IAAY;IAClD,IAAI,CAAC,GAAG,CAAC,GAAG;QAAE,MAAM,IAAI,IAAI,CAAC,kCAAkC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,uPAAuP,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,iCAAiC,EAAE,CAAC,CAAC;IAChY,IAAI,CAAC,GAAG,CAAC,GAAG;QAAE,MAAM,IAAI,IAAI,CAAC,sCAAsC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,yDAAyD,CAAC,EAAE,CAAC,CAAC;AACrJ,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,IAAI,CAAC,GAAQ,EAAE,IAAa;IAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,MAAM,CAAC,GAAQ;IAC7B,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC;QACpD,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC;QAC1D,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC;QACxD,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC;QAChD,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC/F,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAQ,EAAE,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC;AAE5F,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAS,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAQ,EAAE,KAAW;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC/B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACvF,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,qDAAqD,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/G,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,QAAQ,CAAC,GAAQ;IAC/B,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC;IAChD,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACnC,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,UAAU,CAAC,GAAQ,EAAE,IAAY;IAC/C,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,6EAA6E;AAE7E,wHAAwH;AACxH,MAAM,UAAU,QAAQ,CAAC,GAAgC,EAAE,IAAY;IACrE,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAC/D,IAAI,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,cAAc,CAAC;IAC3E,IAAI,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,eAAe,CAAC;IAC5E,IAAI,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACjF,IAAI,yFAAyF,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,qBAAqB,CAAC;IACvI,IAAI,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAC3F,IAAI,0DAA0D,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,6BAA6B,CAAC;IAChH,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,gCAAgC,CAAC;IACtG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAAC,GAAQ,EAAE,GAAG,KAA6B;IACtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,IAAI,MAAM;YAAE,MAAM,IAAI,IAAI,CAAC,gCAAgC,MAAM,qBAAqB,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAA4B,EAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Engine as the Tenant API tells it, the SDK versions it serves (ADR-074 §4), and its changesets with this
|
|
3
|
+
* Tenant's tickets. The SDK carries no changesets (§9): without the Tenant API the list is not known, and every
|
|
4
|
+
* command says so instead of guessing.
|
|
5
|
+
*/
|
|
6
|
+
import type { ChangesetEntry, TenantChangeset } from "../changesets.js";
|
|
7
|
+
import { type Ctx } from "./context.js";
|
|
8
|
+
import type { Terminal } from "./terminal.js";
|
|
9
|
+
export type Changeset = ChangesetEntry & Partial<TenantChangeset>;
|
|
10
|
+
export interface EngineState {
|
|
11
|
+
live: boolean;
|
|
12
|
+
version: string | null;
|
|
13
|
+
released_at: string | null;
|
|
14
|
+
latest: number | null;
|
|
15
|
+
site: {
|
|
16
|
+
docs: string | null;
|
|
17
|
+
changesets: string | null;
|
|
18
|
+
};
|
|
19
|
+
sdk: SdkFit;
|
|
20
|
+
reason: string | null;
|
|
21
|
+
}
|
|
22
|
+
/** How the installed SDK stands with the Engine: `minimum` and `built_with` from `GET /tenant/v0/engine`. */
|
|
23
|
+
export interface SdkFit {
|
|
24
|
+
installed: string;
|
|
25
|
+
built_with: string | null;
|
|
26
|
+
minimum: string | null;
|
|
27
|
+
/** `served`: at or above the minimum; `below-minimum`: the Engine no longer serves it without a break; `unknown`: the Engine did not say. */
|
|
28
|
+
fit: "served" | "below-minimum" | "unknown";
|
|
29
|
+
/** Whether the Engine was built with a newer SDK than the one installed. */
|
|
30
|
+
newer_available: boolean;
|
|
31
|
+
/** Whether the installed SDK is newer than the Engine knows: calls it adds may answer 404. */
|
|
32
|
+
ahead_of_engine: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Semantic versions compared by their numbers; a pre-release comes before its release. */
|
|
35
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
36
|
+
export declare function sdkFit(sdk: {
|
|
37
|
+
built_with: string;
|
|
38
|
+
minimum: string;
|
|
39
|
+
} | null | undefined, installed?: string): SdkFit;
|
|
40
|
+
export declare function engineInfo(ctx: Ctx): Promise<EngineState>;
|
|
41
|
+
/** The changesets after `since`, with the Tenant's ticket and status, when the Tenant API answers. */
|
|
42
|
+
export declare function changesetList(ctx: Ctx, since: number): Promise<{
|
|
43
|
+
live: boolean;
|
|
44
|
+
latest: number | null;
|
|
45
|
+
list: Changeset[];
|
|
46
|
+
reason: string | null;
|
|
47
|
+
}>;
|
|
48
|
+
export declare const CLOSED: Set<string>;
|
|
49
|
+
export declare const isOpen: (c: Changeset) => boolean;
|
|
50
|
+
/** Open changesets in the order AGENTS.md asks for: the earliest deadline first, then the oldest. */
|
|
51
|
+
export declare function byUrgency(a: Changeset, b: Changeset): number;
|
|
52
|
+
/** How each status looks: its words, its colour, its symbol. */
|
|
53
|
+
export declare const LOOK: Record<string, [string, "blue" | "cyan" | "yellow" | "magenta" | "green" | "gray", keyof Terminal["sym"]]>;
|
|
54
|
+
/** A status as text, and painted. */
|
|
55
|
+
export declare function pill(t: Terminal, key: string): {
|
|
56
|
+
text: string;
|
|
57
|
+
painted: string;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/cli/engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxE,OAAO,EAAE,KAAK,GAAG,EAAqB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,6GAA6G;AAC7G,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,6IAA6I;IAC7I,GAAG,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,CAAC;IAC5C,4EAA4E;IAC5E,eAAe,EAAE,OAAO,CAAC;IACzB,8FAA8F;IAC9F,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAY5D;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,SAAc,GAAG,MAAM,CAUvH;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAI/D;AAED,sGAAsG;AACtG,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAIxJ;AAED,eAAO,MAAM,MAAM,aAAoC,CAAC;AACxD,eAAO,MAAM,MAAM,GAAI,GAAG,SAAS,KAAG,OAAiE,CAAC;AAExG,qGAAqG;AACrG,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAK5D;AAED,gEAAgE;AAChE,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,EAAE,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,CAe3H,CAAC;AAEF,qCAAqC;AACrC,wBAAgB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAKhF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { readChangesets, readEngine } from "../definition-set.js";
|
|
2
|
+
import { SDK_VERSION } from "../version.js";
|
|
3
|
+
import { call, readFailure } from "./context.js";
|
|
4
|
+
/** Semantic versions compared by their numbers; a pre-release comes before its release. */
|
|
5
|
+
export function compareVersions(a, b) {
|
|
6
|
+
const parse = (v) => {
|
|
7
|
+
const [main, pre] = v.split("-", 2);
|
|
8
|
+
return { n: main.split(".").map((x) => Number(x) || 0), pre: pre ?? null };
|
|
9
|
+
};
|
|
10
|
+
const x = parse(a);
|
|
11
|
+
const y = parse(b);
|
|
12
|
+
for (let i = 0; i < 3; i++)
|
|
13
|
+
if ((x.n[i] ?? 0) !== (y.n[i] ?? 0))
|
|
14
|
+
return (x.n[i] ?? 0) - (y.n[i] ?? 0);
|
|
15
|
+
if (x.pre === y.pre)
|
|
16
|
+
return 0;
|
|
17
|
+
if (x.pre === null)
|
|
18
|
+
return 1;
|
|
19
|
+
if (y.pre === null)
|
|
20
|
+
return -1;
|
|
21
|
+
return x.pre < y.pre ? -1 : 1;
|
|
22
|
+
}
|
|
23
|
+
export function sdkFit(sdk, installed = SDK_VERSION) {
|
|
24
|
+
if (!sdk)
|
|
25
|
+
return { installed, built_with: null, minimum: null, fit: "unknown", newer_available: false, ahead_of_engine: false };
|
|
26
|
+
return {
|
|
27
|
+
installed,
|
|
28
|
+
built_with: sdk.built_with,
|
|
29
|
+
minimum: sdk.minimum,
|
|
30
|
+
fit: compareVersions(installed, sdk.minimum) >= 0 ? "served" : "below-minimum",
|
|
31
|
+
newer_available: compareVersions(installed, sdk.built_with) < 0,
|
|
32
|
+
ahead_of_engine: compareVersions(installed, sdk.built_with) > 0,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function engineInfo(ctx) {
|
|
36
|
+
const r = await call(ctx, (fetch, cfg) => readEngine({ ...cfg, fetch }));
|
|
37
|
+
if (r.ok)
|
|
38
|
+
return { live: true, version: r.value.version, released_at: r.value.released_at, latest: r.value.latest_changeset, site: r.value.site, sdk: sdkFit(r.value.sdk), reason: null };
|
|
39
|
+
return { live: false, version: null, released_at: null, latest: null, site: { docs: null, changesets: null }, sdk: sdkFit(null), reason: readFailure(r) };
|
|
40
|
+
}
|
|
41
|
+
/** The changesets after `since`, with the Tenant's ticket and status, when the Tenant API answers. */
|
|
42
|
+
export async function changesetList(ctx, since) {
|
|
43
|
+
const r = await call(ctx, (fetch, cfg) => readChangesets({ ...cfg, since, fetch }));
|
|
44
|
+
if (r.ok)
|
|
45
|
+
return { live: true, latest: r.value.latest, list: r.value.changesets, reason: null };
|
|
46
|
+
return { live: false, latest: null, list: [], reason: readFailure(r) };
|
|
47
|
+
}
|
|
48
|
+
export const CLOSED = new Set(["resolved", "canceled"]);
|
|
49
|
+
export const isOpen = (c) => Boolean(c.ticket && c.status && !CLOSED.has(c.status));
|
|
50
|
+
/** Open changesets in the order AGENTS.md asks for: the earliest deadline first, then the oldest. */
|
|
51
|
+
export function byUrgency(a, b) {
|
|
52
|
+
if (a.deadline && b.deadline)
|
|
53
|
+
return a.deadline.localeCompare(b.deadline) || a.number - b.number;
|
|
54
|
+
if (a.deadline)
|
|
55
|
+
return -1;
|
|
56
|
+
if (b.deadline)
|
|
57
|
+
return 1;
|
|
58
|
+
return a.number - b.number;
|
|
59
|
+
}
|
|
60
|
+
/** How each status looks: its words, its colour, its symbol. */
|
|
61
|
+
export const LOOK = {
|
|
62
|
+
new: ["new", "blue", "info"],
|
|
63
|
+
acknowledged: ["acknowledged", "cyan", "open"],
|
|
64
|
+
in_progress: ["in progress", "yellow", "half"],
|
|
65
|
+
waiting: ["waiting for you", "yellow", "warn"],
|
|
66
|
+
on_hold: ["on hold", "magenta", "pause"],
|
|
67
|
+
resolved: ["resolved", "green", "ok"],
|
|
68
|
+
canceled: ["canceled", "gray", "cross"],
|
|
69
|
+
draft: ["draft", "gray", "open"],
|
|
70
|
+
scheduled: ["scheduled", "cyan", "half"],
|
|
71
|
+
published: ["published", "green", "ok"],
|
|
72
|
+
expired: ["expired", "gray", "dash"],
|
|
73
|
+
withdrawn: ["withdrawn", "gray", "cross"],
|
|
74
|
+
"nothing asked": ["nothing asked", "gray", "dash"],
|
|
75
|
+
"no ticket": ["no ticket", "gray", "dash"],
|
|
76
|
+
};
|
|
77
|
+
/** A status as text, and painted. */
|
|
78
|
+
export function pill(t, key) {
|
|
79
|
+
const look = LOOK[key];
|
|
80
|
+
if (!look)
|
|
81
|
+
return { text: key || "—", painted: t.paint.gray(key || "—") };
|
|
82
|
+
const text = `${t.sym[look[2]]} ${look[0]}`;
|
|
83
|
+
return { text, painted: t.paint[look[1]](text) };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/cli/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { FeedbackReport } from "../changesets.js";
|
|
2
|
+
import { type Ctx } from "./context.js";
|
|
3
|
+
/** The skill version this command line goes with (implement.md version 3, ADR-074 §13). */
|
|
4
|
+
export declare const SKILL = "implement 3";
|
|
5
|
+
/** One finding as the queue keeps it: a report's parts, before bundling. */
|
|
6
|
+
export interface Finding {
|
|
7
|
+
kind: "defect" | "limitation" | "question";
|
|
8
|
+
area: string;
|
|
9
|
+
summary: string;
|
|
10
|
+
detail: string;
|
|
11
|
+
refusal?: FeedbackReport["refusal"];
|
|
12
|
+
source?: string;
|
|
13
|
+
queued_at: string;
|
|
14
|
+
}
|
|
15
|
+
/** The queued findings, oldest first. */
|
|
16
|
+
export declare function queued(ctx: Ctx): {
|
|
17
|
+
file: string;
|
|
18
|
+
finding: Finding;
|
|
19
|
+
}[];
|
|
20
|
+
/**
|
|
21
|
+
* Findings in as few reports as fit: one, unless they pass 64 KiB. The kind is the most pressing of them (a defect
|
|
22
|
+
* before a limitation before a question), the areas are named together, each finding is a section of the detail. A
|
|
23
|
+
* lone finding keeps its own summary and refusal.
|
|
24
|
+
*/
|
|
25
|
+
export declare function bundle(findings: Finding[], o?: {
|
|
26
|
+
product?: string;
|
|
27
|
+
engine?: string;
|
|
28
|
+
changeset?: number | null;
|
|
29
|
+
}): {
|
|
30
|
+
report: FeedbackReport;
|
|
31
|
+
findings: number[];
|
|
32
|
+
}[];
|
|
33
|
+
export declare function cmdFeedback(ctx: Ctx, args: string[]): Promise<void>;
|
|
34
|
+
/** How many feedback tickets have answers since the saved place, without moving it. */
|
|
35
|
+
export declare function repliesWaiting(ctx: Ctx): Promise<{
|
|
36
|
+
count: number;
|
|
37
|
+
reason: string | null;
|
|
38
|
+
}>;
|
|
39
|
+
export declare function cmdReply(ctx: Ctx, args: string[]): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/cli/feedback.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,KAAK,GAAG,EAAgI,MAAM,cAAc,CAAC;AAItK,2FAA2F;AAC3F,eAAO,MAAM,KAAK,gBAAgB,CAAC;AAQnC,4EAA4E;AAC5E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD,yCAAyC;AACzC,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,CAOrE;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,CAiCtK;AA+BD,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,iBASzD;AAoLD,uFAAuF;AACvF,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAMhG;AAkCD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,iBAuBtD"}
|