@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.
Files changed (239) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +82 -2
  5. package/contract/assertion-vectors.json +90 -0
  6. package/contract/schemas/branding.schema.json +46 -0
  7. package/contract/schemas/definitions.schema.json +376 -0
  8. package/contract/schemas/portal.schema.json +56 -0
  9. package/contract/tenant-api-routes.json +165 -0
  10. package/dist/branding.d.ts +131 -0
  11. package/dist/branding.d.ts.map +1 -0
  12. package/dist/branding.js +206 -0
  13. package/dist/branding.js.map +1 -0
  14. package/dist/changesets.d.ts +58 -0
  15. package/dist/changesets.d.ts.map +1 -0
  16. package/dist/changesets.js +18 -0
  17. package/dist/changesets.js.map +1 -0
  18. package/dist/cli/bin.d.ts +3 -0
  19. package/dist/cli/bin.d.ts.map +1 -0
  20. package/dist/cli/bin.js +12 -0
  21. package/dist/cli/bin.js.map +1 -0
  22. package/dist/cli/changesets.d.ts +14 -0
  23. package/dist/cli/changesets.d.ts.map +1 -0
  24. package/dist/cli/changesets.js +252 -0
  25. package/dist/cli/changesets.js.map +1 -0
  26. package/dist/cli/cli.d.ts +37 -0
  27. package/dist/cli/cli.d.ts.map +1 -0
  28. package/dist/cli/cli.js +415 -0
  29. package/dist/cli/cli.js.map +1 -0
  30. package/dist/cli/context.d.ts +147 -0
  31. package/dist/cli/context.d.ts.map +1 -0
  32. package/dist/cli/context.js +258 -0
  33. package/dist/cli/context.js.map +1 -0
  34. package/dist/cli/engine.d.ts +59 -0
  35. package/dist/cli/engine.d.ts.map +1 -0
  36. package/dist/cli/engine.js +85 -0
  37. package/dist/cli/engine.js.map +1 -0
  38. package/dist/cli/feedback.d.ts +40 -0
  39. package/dist/cli/feedback.d.ts.map +1 -0
  40. package/dist/cli/feedback.js +420 -0
  41. package/dist/cli/feedback.js.map +1 -0
  42. package/dist/cli/files.d.ts +83 -0
  43. package/dist/cli/files.d.ts.map +1 -0
  44. package/dist/cli/files.js +389 -0
  45. package/dist/cli/files.js.map +1 -0
  46. package/dist/cli/index.d.ts +8 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +8 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/cli/overview.d.ts +6 -0
  51. package/dist/cli/overview.d.ts.map +1 -0
  52. package/dist/cli/overview.js +379 -0
  53. package/dist/cli/overview.js.map +1 -0
  54. package/dist/cli/parts.d.ts +5 -0
  55. package/dist/cli/parts.d.ts.map +1 -0
  56. package/dist/cli/parts.js +414 -0
  57. package/dist/cli/parts.js.map +1 -0
  58. package/dist/cli/sources.d.ts +37 -0
  59. package/dist/cli/sources.d.ts.map +1 -0
  60. package/dist/cli/sources.js +91 -0
  61. package/dist/cli/sources.js.map +1 -0
  62. package/dist/cli/terminal.d.ts +135 -0
  63. package/dist/cli/terminal.d.ts.map +1 -0
  64. package/dist/cli/terminal.js +353 -0
  65. package/dist/cli/terminal.js.map +1 -0
  66. package/dist/cli/ui-page.d.ts +8 -0
  67. package/dist/cli/ui-page.d.ts.map +1 -0
  68. package/dist/cli/ui-page.js +216 -0
  69. package/dist/cli/ui-page.js.map +1 -0
  70. package/dist/cli/ui.d.ts +54 -0
  71. package/dist/cli/ui.d.ts.map +1 -0
  72. package/dist/cli/ui.js +251 -0
  73. package/dist/cli/ui.js.map +1 -0
  74. package/dist/client.d.ts +88 -0
  75. package/dist/client.d.ts.map +1 -0
  76. package/dist/client.js +165 -0
  77. package/dist/client.js.map +1 -0
  78. package/dist/contacts.d.ts +43 -0
  79. package/dist/contacts.d.ts.map +1 -0
  80. package/dist/contacts.js +46 -0
  81. package/dist/contacts.js.map +1 -0
  82. package/dist/definition-set.d.ts +731 -0
  83. package/dist/definition-set.d.ts.map +1 -0
  84. package/dist/definition-set.js +659 -0
  85. package/dist/definition-set.js.map +1 -0
  86. package/dist/definitions.d.ts +42 -0
  87. package/dist/definitions.d.ts.map +1 -0
  88. package/dist/definitions.js +154 -0
  89. package/dist/definitions.js.map +1 -0
  90. package/dist/enrolment.d.ts +9 -0
  91. package/dist/enrolment.d.ts.map +1 -0
  92. package/dist/enrolment.js +8 -0
  93. package/dist/enrolment.js.map +1 -0
  94. package/dist/fill.d.ts +73 -0
  95. package/dist/fill.d.ts.map +1 -0
  96. package/dist/fill.js +46 -0
  97. package/dist/fill.js.map +1 -0
  98. package/dist/index.d.ts +39 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +39 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/notifications.d.ts +33 -0
  103. package/dist/notifications.d.ts.map +1 -0
  104. package/dist/notifications.js +36 -0
  105. package/dist/notifications.js.map +1 -0
  106. package/dist/oidc.d.ts +122 -0
  107. package/dist/oidc.d.ts.map +1 -0
  108. package/dist/oidc.js +150 -0
  109. package/dist/oidc.js.map +1 -0
  110. package/dist/overlay.d.ts +109 -0
  111. package/dist/overlay.d.ts.map +1 -0
  112. package/dist/overlay.js +58 -0
  113. package/dist/overlay.js.map +1 -0
  114. package/dist/passes.d.ts +95 -0
  115. package/dist/passes.d.ts.map +1 -0
  116. package/dist/passes.js +140 -0
  117. package/dist/passes.js.map +1 -0
  118. package/dist/portal-options.d.ts +65 -0
  119. package/dist/portal-options.d.ts.map +1 -0
  120. package/dist/portal-options.js +120 -0
  121. package/dist/portal-options.js.map +1 -0
  122. package/dist/reads.d.ts +41 -0
  123. package/dist/reads.d.ts.map +1 -0
  124. package/dist/reads.js +44 -0
  125. package/dist/reads.js.map +1 -0
  126. package/dist/recovery-words.d.ts +8 -0
  127. package/dist/recovery-words.d.ts.map +1 -0
  128. package/dist/recovery-words.js +136 -0
  129. package/dist/recovery-words.js.map +1 -0
  130. package/dist/recovery.d.ts +198 -0
  131. package/dist/recovery.d.ts.map +1 -0
  132. package/dist/recovery.js +112 -0
  133. package/dist/recovery.js.map +1 -0
  134. package/dist/reveal.d.ts +35 -0
  135. package/dist/reveal.d.ts.map +1 -0
  136. package/dist/reveal.js +66 -0
  137. package/dist/reveal.js.map +1 -0
  138. package/dist/seal.d.ts +15 -0
  139. package/dist/seal.d.ts.map +1 -0
  140. package/dist/seal.js +0 -0
  141. package/dist/seal.js.map +1 -0
  142. package/dist/session.d.ts +66 -0
  143. package/dist/session.d.ts.map +1 -0
  144. package/dist/session.js +61 -0
  145. package/dist/session.js.map +1 -0
  146. package/dist/signing-in-mark.d.ts +14 -0
  147. package/dist/signing-in-mark.d.ts.map +1 -0
  148. package/dist/signing-in-mark.js +24 -0
  149. package/dist/signing-in-mark.js.map +1 -0
  150. package/dist/signing-in.d.ts +22 -0
  151. package/dist/signing-in.d.ts.map +1 -0
  152. package/dist/signing-in.js +203 -0
  153. package/dist/signing-in.js.map +1 -0
  154. package/dist/tags.d.ts +96 -0
  155. package/dist/tags.d.ts.map +1 -0
  156. package/dist/tags.js +88 -0
  157. package/dist/tags.js.map +1 -0
  158. package/dist/tenant-subscription.d.ts +47 -0
  159. package/dist/tenant-subscription.d.ts.map +1 -0
  160. package/dist/tenant-subscription.js +7 -0
  161. package/dist/tenant-subscription.js.map +1 -0
  162. package/dist/testing/index.d.ts +125 -0
  163. package/dist/testing/index.d.ts.map +1 -0
  164. package/dist/testing/index.js +320 -0
  165. package/dist/testing/index.js.map +1 -0
  166. package/dist/theme.d.ts +237 -0
  167. package/dist/theme.d.ts.map +1 -0
  168. package/dist/theme.js +504 -0
  169. package/dist/theme.js.map +1 -0
  170. package/dist/tickets.d.ts +152 -0
  171. package/dist/tickets.d.ts.map +1 -0
  172. package/dist/tickets.js +65 -0
  173. package/dist/tickets.js.map +1 -0
  174. package/dist/tiers.d.ts +168 -0
  175. package/dist/tiers.d.ts.map +1 -0
  176. package/dist/tiers.js +341 -0
  177. package/dist/tiers.js.map +1 -0
  178. package/dist/types.d.ts +885 -0
  179. package/dist/types.d.ts.map +1 -0
  180. package/dist/types.js +12 -0
  181. package/dist/types.js.map +1 -0
  182. package/dist/urlid.d.ts +50 -0
  183. package/dist/urlid.d.ts.map +1 -0
  184. package/dist/urlid.js +78 -0
  185. package/dist/urlid.js.map +1 -0
  186. package/dist/version.d.ts +15 -0
  187. package/dist/version.d.ts.map +1 -0
  188. package/dist/version.js +15 -0
  189. package/dist/version.js.map +1 -0
  190. package/make/asturiu.mk +43 -0
  191. package/package.json +63 -4
  192. package/src/branding.ts +221 -0
  193. package/src/changesets.ts +61 -0
  194. package/src/cli/bin.ts +12 -0
  195. package/src/cli/changesets.ts +233 -0
  196. package/src/cli/cli.ts +425 -0
  197. package/src/cli/context.ts +299 -0
  198. package/src/cli/engine.ts +112 -0
  199. package/src/cli/feedback.ts +406 -0
  200. package/src/cli/files.ts +371 -0
  201. package/src/cli/index.ts +7 -0
  202. package/src/cli/overview.ts +343 -0
  203. package/src/cli/parts.ts +371 -0
  204. package/src/cli/sources.ts +111 -0
  205. package/src/cli/terminal.ts +384 -0
  206. package/src/cli/ui-page.ts +215 -0
  207. package/src/cli/ui.ts +266 -0
  208. package/src/client.ts +202 -0
  209. package/src/contacts.ts +61 -0
  210. package/src/definition-set.ts +965 -0
  211. package/src/definitions.ts +156 -0
  212. package/src/enrolment.ts +10 -0
  213. package/src/fill.ts +83 -0
  214. package/src/index.ts +38 -0
  215. package/src/notifications.ts +55 -0
  216. package/src/oidc.ts +199 -0
  217. package/src/overlay.ts +137 -0
  218. package/src/passes.ts +168 -0
  219. package/src/portal-options.ts +125 -0
  220. package/src/reads.ts +71 -0
  221. package/src/recovery-words.ts +137 -0
  222. package/src/recovery.ts +269 -0
  223. package/src/reveal.ts +72 -0
  224. package/src/seal.ts +0 -0
  225. package/src/session.ts +93 -0
  226. package/src/signing-in-mark.ts +23 -0
  227. package/src/signing-in.ts +213 -0
  228. package/src/tags.ts +146 -0
  229. package/src/tenant-subscription.ts +44 -0
  230. package/src/testing/index.ts +337 -0
  231. package/src/theme.ts +628 -0
  232. package/src/tickets.ts +195 -0
  233. package/src/tiers.ts +397 -0
  234. package/src/types.ts +847 -0
  235. package/src/urlid.ts +77 -0
  236. package/src/version.ts +15 -0
  237. package/templates/asturiu/branding.json +4 -0
  238. package/templates/asturiu/definitions.json +23 -0
  239. package/templates/asturiu/portal.json +16 -0
@@ -0,0 +1,379 @@
1
+ /**
2
+ * The overview (ADR-074 §5): `status` (everything at a glance, ending with what to run next), `doctor` (the set-up,
3
+ * with how to fix each problem), `engine` and `key`. The key's value is never shown: only its Tenant, its id, what it
4
+ * reaches and when it expires, from `GET /tenant/v0/key` (§8).
5
+ */
6
+ import { existsSync } from "node:fs";
7
+ import path from "node:path";
8
+ import { readKey } from "../definition-set.js";
9
+ import { SDK_NAME, SDK_VERSION } from "../version.js";
10
+ import { EXIT, agentsSection, call, emit, gitIgnores, hostOf, keyIdOf, places, pulledDocuments, readFailure, rel, slugOf, sources } from "./context.js";
11
+ import { CLOSED, LOOK, byUrgency, changesetList, engineInfo, isOpen } from "./engine.js";
12
+ import { queued, repliesWaiting } from "./feedback.js";
13
+ import { brandingFileCheck, presentation, readDefinitionStatus, repositorySet, setState, tabRead, withoutStored } from "./files.js";
14
+ import { ago, pad3, plain, plural, widthOf } from "./terminal.js";
15
+ /** The scopes a repository's files need: what `apply` and `pull` reach. */
16
+ const REPOSITORY_SCOPES = ["definitions", "branding", "portal"];
17
+ const SOON_MS = 30 * 86_400_000;
18
+ async function keyRecord(ctx) {
19
+ return call(ctx, (fetch, cfg) => readKey({ ...cfg, fetch }));
20
+ }
21
+ /** The SDK beside the Engine, in a line: what the person should know about the installed version. */
22
+ function sdkLine(s) {
23
+ if (s.fit === "unknown")
24
+ return { tone: "muted", text: `${SDK_NAME} ${s.installed}`, detail: "the Engine did not say which SDK versions it serves" };
25
+ if (s.fit === "below-minimum")
26
+ return { tone: "fail", text: `${SDK_NAME} ${s.installed} is older than the Engine serves`, detail: `install ${s.minimum} or newer (built with ${s.built_with})` };
27
+ if (s.newer_available)
28
+ return { tone: "info", text: `${SDK_NAME} ${s.installed}`, detail: `the Engine was built with ${s.built_with}; the changesets say when to move` };
29
+ if (s.ahead_of_engine)
30
+ return { tone: "warn", text: `${SDK_NAME} ${s.installed} is newer than this Engine`, detail: `built with ${s.built_with}: calls added since may answer 404` };
31
+ return { tone: "ok", text: `${SDK_NAME} ${s.installed}`, detail: "the version this Engine was built with" };
32
+ }
33
+ // ================================================================== status
34
+ export async function cmdStatus(ctx) {
35
+ const { t } = ctx;
36
+ const P = places(ctx);
37
+ const [engine, defs, pres, cs, news, repo, key] = await t.busy(`Asking the Tenant API at ${hostOf(ctx.baseUrl)}`, () => Promise.all([engineInfo(ctx), readDefinitionStatus(ctx), presentation(ctx), changesetList(ctx, 0), repliesWaiting(ctx), repositorySet(ctx), keyRecord(ctx)]));
38
+ const setNow = setState(defs.ok ? defs.value : null, repo.hash);
39
+ const section = agentsSection(ctx);
40
+ const queue = queued(ctx);
41
+ const have = pulledDocuments(ctx);
42
+ const open = cs.list.filter(isOpen).sort(byUrgency);
43
+ const unpulled = cs.list.filter((c) => c.action_required && !have.has(c.file) && !CLOSED.has(c.status ?? ""));
44
+ // Unreachable, or the key refused: said once, and every row reads "not read".
45
+ const blocked = !defs.ok && (defs.why === "network" || defs.status === 401) ? defs : null;
46
+ const quiet = Boolean(blocked) || !ctx.key;
47
+ const expires = key.ok ? key.value.expires_at : ctx.keyExpires;
48
+ const steps = blocked ? [[`${ctx.cmd} doctor`, "find out why, and how to fix it"]] : [];
49
+ if (ctx.json) {
50
+ return emit(ctx, {
51
+ product: ctx.product,
52
+ tenant_api: ctx.baseUrl,
53
+ key: { set: Boolean(ctx.key), tenant: slugOf(ctx.key), id: keyIdOf(ctx.key), ...(key.ok ? { name: plain(key.value.name), scopes: key.value.scopes, expires_at: key.value.expires_at } : { expires_at: ctx.keyExpires }) },
54
+ sdk: engine.sdk,
55
+ engine: { live: engine.live, version: engine.version, released_at: engine.released_at, latest_changeset: engine.latest, site: engine.site, reason: engine.reason },
56
+ definitions: defs.ok ? { ...defs.value, repository: setNow } : { error: readFailure(defs, "definitions") },
57
+ branding: withoutStored(pres.branding),
58
+ portal: withoutStored(pres.portal),
59
+ changesets: { live: cs.live, latest: cs.latest, open: open.map((c) => ({ number: c.number, status: c.status, deadline: c.deadline })), not_pulled: unpulled.map((c) => c.number), agents_md: section, reason: cs.reason },
60
+ feedback: { queued: queue.length, tickets_with_news: news.count, reason: news.reason },
61
+ });
62
+ }
63
+ t.banner(ctx.product, [`Tenant API ${hostOf(ctx.baseUrl)}`, `SDK ${SDK_VERSION}`]);
64
+ // A row's line; its grey detail is left out when the line would not fit the screen.
65
+ const line = (tone, text, detail = "") => {
66
+ const fits = detail && 2 + 14 + 2 + widthOf(text) + 2 + widthOf(detail) <= t.columns();
67
+ return `${t.mark(tone)} ${text}${fits ? ` ${t.paint.gray(detail)}` : ""}`;
68
+ };
69
+ // The Engine, the SDK and the key.
70
+ const engineLine = engine.live ? line("ok", `${engine.version}${engine.released_at ? ` ${t.sym.dot} released ${engine.released_at.slice(0, 10)}` : ""} ${t.sym.dot} latest changeset ${pad3(engine.latest ?? 0)}`) : line("muted", "not read", quiet ? "" : (engine.reason ?? ""));
71
+ const sdk = sdkLine(engine.sdk);
72
+ if (engine.sdk.fit === "below-minimum")
73
+ steps.push([`${ctx.cmd} changesets --open`, "the changeset that says how to move"]);
74
+ let keyLine;
75
+ const slug = slugOf(ctx.key);
76
+ if (!ctx.key) {
77
+ keyLine = line("fail", "ASTURIU_TENANT_KEY is not set", "nothing below is read live");
78
+ steps.push([`${ctx.cmd} doctor`, "what is missing, and how to set it up"]);
79
+ }
80
+ else if (!slug)
81
+ keyLine = line("fail", "ASTURIU_TENANT_KEY is not a Tenant key", "expected atk.<slug>.<key id>.<private key>");
82
+ else if (expires && Date.parse(expires) - Date.now() < SOON_MS)
83
+ keyLine = line("warn", `set for ${slug}, expires ${expires.slice(0, 10)}`, `${ago(expires)}: make its successor in the Admin UI`);
84
+ else
85
+ keyLine = line("ok", `set for Tenant ${t.paint.bold(slug)}${key.ok ? ` ${t.sym.dot} ${key.value.scopes.join(", ")}` : ""}`, "the value is never shown");
86
+ const head = [
87
+ ["Engine", engineLine],
88
+ ["SDK", line(sdk.tone, sdk.text, quiet && engine.sdk.fit === "unknown" ? "" : sdk.detail)],
89
+ ["Key", keyLine],
90
+ ];
91
+ if (blocked?.why === "network")
92
+ head.push(["Tenant API", line("fail", `no answer from ${hostOf(ctx.baseUrl)}`, blocked.message.replace(/^.*?: /, ""))]);
93
+ else if (blocked)
94
+ head.push(["Tenant API", line("fail", "refused the key", "revoked, expired, or for another Tenant")]);
95
+ t.pairs(head, { width: 14 });
96
+ t.out();
97
+ // Definitions.
98
+ const src = sources(ctx);
99
+ const theRepository = src.label === "asturiu/" ? "the repository's" : `${src.label}'s`;
100
+ const defLines = [];
101
+ if (!defs.ok)
102
+ defLines.push(blocked || defs.why === "no-key" ? line("muted", "not read") : line("fail", readFailure(defs, "definitions")));
103
+ else {
104
+ const d = defs.value;
105
+ const by = d.source === "repository" ? "edited in the repository" : "edited in the Admin UI";
106
+ defLines.push(line(d.source === "repository" ? "ok" : "warn", `revision ${d.revision} ${t.sym.dot} ${by}`, d.auto_apply === "safe" ? "safe changes apply on their own" : "every change waits for approval"));
107
+ if (d.source !== "repository")
108
+ defLines.push(line("muted", "apply is refused until a tenant administrator hands the Definitions to the repository"));
109
+ if (setNow === "live")
110
+ defLines.push(line("ok", `the live set is ${theRepository}`));
111
+ if (setNow === "differs") {
112
+ defLines.push(line("warn", `the live set is not ${theRepository}`, "it goes out at the next start"));
113
+ steps.push([`${ctx.cmd} definitions`, "see both, and send it now"]);
114
+ }
115
+ if (!repo.set)
116
+ defLines.push(line("fail", plain(repo.error ?? "the repository's set does not read")));
117
+ for (const w of d.waiting)
118
+ defLines.push(line("warn", w.hash === repo.hash ? "the repository's set waits for a tenant administrator's approval" : "a change waits for a tenant administrator's approval", `since ${ago(w.created_at)}`));
119
+ }
120
+ // Branding and portal.
121
+ const tabLines = (tab) => {
122
+ const s = pres[tab];
123
+ if (!tabRead(s))
124
+ return [blocked || s.why === "no-key" ? line("muted", "not read") : line("fail", s.error)];
125
+ const by = s.source === "repository" ? "edited in the repository" : "edited in the Admin UI";
126
+ const lines = [];
127
+ if (s.source_error)
128
+ lines.push(line("fail", `${by} ${t.sym.dot} ${plain(s.source_error)}`));
129
+ else if (s.differences.length) {
130
+ lines.push(line("warn", `${by} ${t.sym.dot} ${plural(s.differences.length, "difference")} from ${src.label}`));
131
+ if (!steps.some(([c]) => c === `${ctx.cmd} pull`))
132
+ steps.push([`${ctx.cmd} pull`, "see the differences, and take the stored state in"]);
133
+ }
134
+ else
135
+ lines.push(line(s.source === "repository" ? "ok" : "warn", `${by} ${t.sym.dot} equal to ${src.label}`));
136
+ if (tab === "branding" && !s.theme)
137
+ lines.push(line("info", "no theme stored: the portal runs on its default look"));
138
+ if (tab === "portal" && s.redirected?.length)
139
+ lines.push(line("info", `${s.redirected.join(", ")} ${s.redirected.length === 1 ? "stays" : "stay"} in the application`, "an administrator moved them there"));
140
+ return lines;
141
+ };
142
+ // Changesets.
143
+ const csLines = [];
144
+ if (!cs.live)
145
+ csLines.push(line("muted", "not read", quiet ? "" : (cs.reason ?? "")));
146
+ else if (open.length) {
147
+ csLines.push(line("warn", `${plural(open.length, "changeset")} open: ${open.map((c) => `${pad3(c.number)} ${LOOK[c.status ?? ""]?.[0] ?? c.status}`).join(", ")}`));
148
+ steps.push([`${ctx.cmd} changeset ${open[0].number}`, "see what it asks"]);
149
+ }
150
+ else
151
+ csLines.push(line("ok", `none open ${t.sym.dot} latest ${pad3(cs.latest ?? 0)}`));
152
+ if (cs.live && section && cs.latest !== null && section.changeset < cs.latest)
153
+ csLines.push(line("warn", `AGENTS.md was written for ${pad3(section.changeset)}, the latest is ${pad3(cs.latest)}`, "rewrite its Asturiu section"));
154
+ else if (!section)
155
+ csLines.push(line("warn", "AGENTS.md has no Asturiu section", "implement.md, step 8"));
156
+ if (unpulled.length) {
157
+ csLines.push(line("info", `${plural(unpulled.length, "document")} not in ${rel(ctx, P.changesets)}`));
158
+ steps.push([`${ctx.cmd} changesets pull`, "copy them in"]);
159
+ }
160
+ // Feedback.
161
+ const fbLines = [];
162
+ if (queue.length) {
163
+ fbLines.push(line("info", `${plural(queue.length, "finding")} queued, not sent`));
164
+ steps.push([`${ctx.cmd} feedback queue`, "see what waits to be sent"]);
165
+ }
166
+ if (news.count) {
167
+ fbLines.push(line("warn", `${plural(news.count, "ticket")} with new answers`));
168
+ steps.push([`${ctx.cmd} feedback --replies`, "read them"]);
169
+ }
170
+ if (!fbLines.length)
171
+ fbLines.push(line(news.reason ? "muted" : "ok", "nothing queued", news.reason ? (blocked ? "answers not read" : news.reason) : "no new answers"));
172
+ t.pairs([
173
+ ["Definitions", defLines],
174
+ ["Branding", tabLines("branding")],
175
+ ["Portal", tabLines("portal")],
176
+ ["Changesets", csLines],
177
+ ["Feedback", fbLines],
178
+ ], { width: 14 });
179
+ t.next(steps);
180
+ t.out();
181
+ }
182
+ // ================================================================== doctor
183
+ export async function cmdDoctor(ctx) {
184
+ const { t } = ctx;
185
+ const P = places(ctx);
186
+ const checks = [];
187
+ const add = (tone, text, detail = "", fix = "") => checks.push({ tone, text, ...(detail ? { detail } : {}), ...(fix ? { fix } : {}) });
188
+ // Node and the SDK.
189
+ const major = Number(process.versions.node.split(".")[0]);
190
+ add(major >= 22 ? "ok" : "fail", `Node ${process.versions.node}`, major >= 22 ? "22 or newer, as the SDK needs" : "", major >= 22 ? "" : "Install Node 22 or newer.");
191
+ // The key, never shown.
192
+ const envFile = path.join(ctx.root, ".env");
193
+ const slug = slugOf(ctx.key);
194
+ if (!ctx.key)
195
+ add("fail", "ASTURIU_TENANT_KEY is not set", "", "Make a Tenant key in the Admin UI (your Tenant › Tenant keys) with the scopes definitions, branding and portal, and put it in .env as ASTURIU_TENANT_KEY.");
196
+ else if (!slug)
197
+ add("fail", "ASTURIU_TENANT_KEY is not a Tenant key", "expected atk.<slug>.<key id>.<private key>", "Copy the whole key from the Admin UI again.");
198
+ else
199
+ add("ok", "ASTURIU_TENANT_KEY is set", `Tenant ${slug}, key ${keyIdOf(ctx.key)}; the value is never shown`);
200
+ if (existsSync(envFile)) {
201
+ const ignored = gitIgnores(ctx, envFile);
202
+ if (ignored === false)
203
+ add("fail", ".env is not git-ignored", "it can hold the Tenant key", "Add .env to .gitignore before the next commit.");
204
+ else if (ignored)
205
+ add("ok", ".env is git-ignored");
206
+ }
207
+ if (!ctx.baseUrl)
208
+ add("fail", "ASTURIU_TENANT_API_URL is not set", "", "Set it to the Tenant API's address, given with your Tenant.");
209
+ // The Tenant API: the Engine, then the key's own record (no probing, ADR-074 §8).
210
+ let engine = null;
211
+ if (ctx.cfg && slug) {
212
+ const started = Date.now();
213
+ const [e, key] = await t.busy(`Asking the Tenant API at ${hostOf(ctx.baseUrl)}`, () => Promise.all([engineInfo(ctx), keyRecord(ctx)]));
214
+ engine = e;
215
+ const ms = Date.now() - started;
216
+ if (!key.ok && key.why === "network")
217
+ add("fail", `The Tenant API at ${hostOf(ctx.baseUrl)} does not answer`, key.message, "Check ASTURIU_TENANT_API_URL, and that the Tenant API is running and reachable from here. In an agent's sandbox, hand the command to the person.");
218
+ else if (!key.ok && key.status === 401) {
219
+ add("ok", `The Tenant API answers at ${hostOf(ctx.baseUrl)}`, `${ms} ms`);
220
+ add("fail", "The Tenant API refused the key", "revoked, expired, or for another Tenant", "Make a new key in the Admin UI (your Tenant › Tenant keys) and replace it in .env.");
221
+ }
222
+ else {
223
+ add("ok", `The Tenant API answers at ${hostOf(ctx.baseUrl)}`, `${ms} ms`);
224
+ if (e.live)
225
+ add("ok", `Engine ${e.version}, latest changeset ${pad3(e.latest ?? 0)}`);
226
+ else
227
+ add("warn", "The Engine does not tell its version", e.reason ?? "", "An older Engine, or a refusal: `engine` and `changesets` cannot be read.");
228
+ const s = sdkLine(e.sdk);
229
+ add(s.tone === "muted" ? "info" : s.tone, s.text, s.detail, e.sdk.fit === "below-minimum" ? `Install ${SDK_NAME} at ${e.sdk.minimum} or newer, as the open changeset says.` : "");
230
+ if (key.ok) {
231
+ const k = key.value;
232
+ add(k.tenant === slug ? "ok" : "fail", `The key is “${plain(k.name)}” for Tenant ${plain(k.tenant)}`, `scopes ${k.scopes.join(", ") || "none"}`, k.tenant === slug ? "" : "The key's record names another Tenant: copy the key from the Admin UI again.");
233
+ const missing = REPOSITORY_SCOPES.filter((sc) => !k.scopes.includes(sc));
234
+ if (missing.length)
235
+ add("warn", `The key does not reach ${missing.join(", ")}`, "apply and pull need them", `Use a key with the scopes ${REPOSITORY_SCOPES.join(", ")}: the Admin UI, your Tenant › Tenant keys.`);
236
+ const left = Date.parse(k.expires_at) - Date.now();
237
+ if (left < SOON_MS)
238
+ add("warn", `The key expires ${k.expires_at.slice(0, 10)}`, ago(k.expires_at), "Make its successor in the Admin UI and replace it in .env.");
239
+ else
240
+ add("ok", `The key expires ${k.expires_at.slice(0, 10)}`, ago(k.expires_at));
241
+ }
242
+ else if (key.why === "no-route")
243
+ add("warn", "This Engine does not tell a key what it reaches", "GET /tenant/v0/key answered 404", "An Engine from before ADR-074: the scopes cannot be checked here.");
244
+ else
245
+ add("fail", "The key's record could not be read", key.message);
246
+ }
247
+ }
248
+ // The repository's files.
249
+ const src = sources(ctx);
250
+ for (const [what, read] of [
251
+ ["definitions", () => src.definitions()],
252
+ ["branding", () => src.branding()],
253
+ ["portal", () => src.portal()],
254
+ ]) {
255
+ try {
256
+ const value = read();
257
+ if (what === "branding") {
258
+ const c = brandingFileCheck(value);
259
+ if (c.problems.length)
260
+ add("fail", `${src.files.branding}: ${plural(c.problems.length, "image")} the portal refuses`, c.problems.map((p) => `${p.path.join(".")}: ${p.message}`).join("; "));
261
+ else if (c.drops.length)
262
+ add("warn", `${src.files.branding}: the Engine drops ${c.drops.map((d) => `theme.${d}`).join(", ")}`, "not in the theme reference", "Take those keys out, or check their spelling.");
263
+ else
264
+ add("ok", `${src.files.branding} reads`, `${plural(c.images, "image")} inline`);
265
+ }
266
+ else if (what === "definitions")
267
+ add("ok", `${src.files.definitions} reads`, plural(Object.keys(value.wallets ?? {}).length, "Wallet type"));
268
+ else
269
+ add("ok", `${src.files.portal} reads`);
270
+ }
271
+ catch (err) {
272
+ add("fail", `${src.files[what]} does not read`, err.message, "implement.md, step 2: start from the SDK's templates/asturiu/.");
273
+ }
274
+ }
275
+ // Local state and AGENTS.md.
276
+ const stateIgnored = gitIgnores(ctx, P.state);
277
+ if (stateIgnored === false)
278
+ add("warn", `${rel(ctx, P.state)} is not git-ignored`, "it is this machine's place in the feedback answers", `Add /${rel(ctx, P.state)} to .gitignore.`);
279
+ const section = agentsSection(ctx);
280
+ const latest = engine?.live ? engine.latest : null;
281
+ if (!section)
282
+ add("warn", `${rel(ctx, P.agents)} has no Asturiu section`, "", "implement.md, step 8: write it between the asturiu:begin and asturiu:end markers.");
283
+ else if (latest !== null && section.changeset < latest)
284
+ add("warn", `${rel(ctx, P.agents)} was written for changeset ${pad3(section.changeset)}`, `the Engine is at ${pad3(latest)}`, "Take the open changesets in, then rewrite the Asturiu section.");
285
+ else
286
+ add("ok", `${rel(ctx, P.agents)} has its Asturiu section`, `engine ${section.engine}, changeset ${pad3(section.changeset)}`);
287
+ const queue = queued(ctx);
288
+ if (queue.length)
289
+ add("info", `${plural(queue.length, "finding")} queued, not sent`, "", `${ctx.cmd} feedback queue`);
290
+ const failed = checks.filter((c) => c.tone === "fail").length;
291
+ const warned = checks.filter((c) => c.tone === "warn").length;
292
+ ctx.exit = failed ? EXIT.failed : EXIT.done;
293
+ if (ctx.json)
294
+ return emit(ctx, { ok: !failed, checks });
295
+ t.banner(ctx.product, ["doctor", `${checks.length} checks`]);
296
+ for (const c of checks) {
297
+ t.item(c.tone, c.text, c.detail);
298
+ if (c.fix && c.tone !== "ok")
299
+ t.out(` ${t.paint.gray(`${t.sym.arrow} ${c.fix}`)}`);
300
+ }
301
+ t.out();
302
+ if (failed)
303
+ t.item("fail", t.paint.bold(`${plural(failed, "problem")} to fix`), warned ? `and ${plural(warned, "warning")}` : "");
304
+ else if (warned)
305
+ t.item("warn", t.paint.bold(`Ready, with ${plural(warned, "warning")}`));
306
+ else
307
+ t.item("ok", t.paint.bold("Everything is set up"));
308
+ t.out();
309
+ }
310
+ // ================================================================== engine
311
+ export async function cmdEngine(ctx) {
312
+ const { t } = ctx;
313
+ const e = await t.busy("Asking the Tenant API", () => engineInfo(ctx));
314
+ if (!e.live)
315
+ ctx.exit = EXIT.failed;
316
+ if (ctx.json)
317
+ return emit(ctx, e);
318
+ t.banner("Engine", [e.live ? `read from ${hostOf(ctx.baseUrl)}` : "not read"]);
319
+ if (!e.live) {
320
+ t.callout("fail", "The Engine could not be read", [`${e.reason}.`]);
321
+ t.next([[`${ctx.cmd} doctor`, "find out why, and how to fix it"]]);
322
+ t.out();
323
+ return;
324
+ }
325
+ const s = sdkLine(e.sdk);
326
+ t.pairs([
327
+ ["Version", t.paint.bold(plain(e.version))],
328
+ ...(e.released_at ? [["Released", `${e.released_at.slice(0, 10)} ${t.paint.gray(ago(e.released_at))}`]] : []),
329
+ ["Latest changeset", pad3(e.latest ?? 0)],
330
+ ["SDK", `${t.mark(s.tone)} ${s.text} ${t.paint.gray(s.detail)}`],
331
+ ...(e.sdk.minimum ? [["SDK served", `${e.sdk.minimum} and newer ${t.sym.dot} built with ${e.sdk.built_with}`]] : []),
332
+ ...(e.site.changesets ? [["Changesets", t.link(plain(e.site.changesets), e.site.changesets)]] : []),
333
+ ...(e.site.docs ? [["Documentation", t.link(plain(e.site.docs), e.site.docs)]] : []),
334
+ ], { width: 18 });
335
+ t.next([[`${ctx.cmd} changesets`, "every changeset, with this application's tickets"]]);
336
+ t.out();
337
+ }
338
+ // ================================================================== key
339
+ export async function cmdKey(ctx) {
340
+ const { t } = ctx;
341
+ const slug = slugOf(ctx.key);
342
+ const r = ctx.cfg && slug ? await t.busy("Asking the Tenant API", () => keyRecord(ctx)) : null;
343
+ const local = { set: Boolean(ctx.key), tenant: slug, id: keyIdOf(ctx.key) };
344
+ if (r && !r.ok)
345
+ ctx.exit = EXIT.failed;
346
+ if (!ctx.key || !slug)
347
+ ctx.exit = EXIT.failed;
348
+ if (ctx.json)
349
+ return emit(ctx, r?.ok ? { ...local, live: true, ...r.value, name: plain(r.value.name) } : { ...local, live: false, reason: r ? readFailure(r) : !ctx.key ? "ASTURIU_TENANT_KEY is not set" : !slug ? "ASTURIU_TENANT_KEY is not a Tenant key" : "ASTURIU_TENANT_API_URL is not set" });
350
+ t.banner("Key", [r?.ok ? `read from ${hostOf(ctx.baseUrl)}` : "from its shape"]);
351
+ if (!ctx.key) {
352
+ t.item("fail", "ASTURIU_TENANT_KEY is not set");
353
+ t.next([[`${ctx.cmd} doctor`, "how to set it up"]]);
354
+ t.out();
355
+ return;
356
+ }
357
+ if (!slug) {
358
+ t.item("fail", "ASTURIU_TENANT_KEY is not a Tenant key", "expected atk.<slug>.<key id>.<private key>");
359
+ t.out();
360
+ return;
361
+ }
362
+ const rows = [
363
+ ["Tenant", t.paint.bold(r?.ok ? plain(r.value.tenant) : slug)],
364
+ ["Key id", local.id ?? "—"],
365
+ ];
366
+ if (r?.ok) {
367
+ const k = r.value;
368
+ const left = Date.parse(k.expires_at) - Date.now();
369
+ rows.push(["Name", plain(k.name)], ["Scopes", k.scopes.join(", ") || "none"], ["Created", k.created_at.slice(0, 10)], ["Expires", `${left < SOON_MS ? t.paint.yellow(k.expires_at.slice(0, 10)) : k.expires_at.slice(0, 10)} ${t.paint.gray(ago(k.expires_at))}`]);
370
+ }
371
+ t.pairs(rows, { width: 12 });
372
+ t.out();
373
+ if (r && !r.ok)
374
+ t.callout(r.why === "no-route" ? "warn" : "fail", "The key's record could not be read", [`${readFailure(r).replace(/^not read: /, "")}.`, "Only what the key's shape says is shown. The value is never shown."]);
375
+ else
376
+ t.out(` ${t.paint.gray("The value is never shown.")}`);
377
+ t.out();
378
+ }
379
+ //# sourceMappingURL=overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/cli/overview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Ctx } from "./context.js";
2
+ export declare function cmdTags(ctx: Ctx, args: string[]): Promise<void>;
3
+ export declare function cmdTickets(ctx: Ctx, args: string[]): Promise<void>;
4
+ export declare function cmdAnnouncements(ctx: Ctx, args: string[]): Promise<void>;
5
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/cli/parts.ts"],"names":[],"mappings":"AAWA,OAAO,EAAmB,KAAK,GAAG,EAAmE,MAAM,cAAc,CAAC;AAwD1H,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,iBAiErD;AA8BD,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,iBAqFxD;AA6CD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,iBA8E9D"}