@xemahq/create-biome 0.2.3 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"template-files.js","sourceRoot":"","sources":["../../src/lib/template-files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-files.js","sourceRoot":"","sources":["../../src/lib/template-files.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xemahq/create-biome",
3
- "version": "0.2.3",
3
+ "version": "0.3.1",
4
4
  "description": "Scaffolder for real in-tree Xema biomes. `pnpm dlx @xemahq/create-biome <biomeId> --kind service|web|full` generates a biome whose xema-biome.json passes BiomeManifestSchema, whose server APIs bootstrap via XemaServiceModule.forBiome, and whose web surface registers through the host loader glob.",
5
5
  "type": "module",
6
6
  "license": "LicenseRef-Xema-BSL-1.1",
@@ -22,11 +22,12 @@
22
22
  "create-biome": "dist/bin/create-biome.js"
23
23
  },
24
24
  "files": [
25
- "dist"
25
+ "dist",
26
+ "src"
26
27
  ],
27
28
  "devDependencies": {
28
29
  "@types/node": "25.2.3",
29
- "@xemahq/kernel-contracts": "^0.23.0",
30
+ "@xemahq/kernel-contracts": "^0.58.0",
30
31
  "prettier": "3.6.2",
31
32
  "typescript": "5.9.3"
32
33
  },
@@ -0,0 +1,331 @@
1
+ #!/usr/bin/env node
2
+ import * as path from 'node:path';
3
+ import { stdin, stdout } from 'node:process';
4
+ import { createInterface } from 'node:readline/promises';
5
+
6
+ import { BiomeKind, isKnownKind, listKinds } from '../lib/kind.js';
7
+ import {
8
+ DEFAULT_BIOME_SCOPE,
9
+ validateBiomeId,
10
+ type ManifestScope,
11
+ } from '../lib/manifest-builder.js';
12
+ import {
13
+ ScaffolderError,
14
+ scaffoldBiome,
15
+ type ScaffoldedBiomeDir,
16
+ } from '../lib/scaffolder.js';
17
+
18
+ /**
19
+ * `pnpm dlx @xemahq/create-biome <biomeId>` entrypoint.
20
+ *
21
+ * Scaffolds a REAL in-tree biome — a `biomes/<id>/` directory whose
22
+ * `xema-biome.json` passes the canonical `BiomeManifestSchema`, whose server
23
+ * APIs opt into `XemaServiceModule.forBiome`, and whose web surface registers
24
+ * through the host's glob-driven loader. (The previous design emitted an
25
+ * external `@xemahq-biomes/<id>` npm package with a schema-invalid manifest;
26
+ * that is gone.)
27
+ *
28
+ * Modes:
29
+ * - All required args on the CLI → non-interactive (CI-safe).
30
+ * - Any required arg missing → interactive prompts via Node's readline (no
31
+ * third-party prompt library; keeps `pnpm dlx` fast).
32
+ *
33
+ * Flags:
34
+ * --kind <id> service | web | full | connector (default: service)
35
+ * --scope <tier> kernel | system | base | platform (default: platform)
36
+ * --display "<name>" Human-readable display name
37
+ * --desc "<text>" One-line manifest description
38
+ * --repo-root <path> Monorepo root (default: cwd)
39
+ * --server-biomes-dir Where server biomes live, relative to repo-root
40
+ * (default: repos/xema-community/biomes)
41
+ * --web-biomes-dir Where host-web web biomes live, relative to
42
+ * repo-root (default: submodules/xema-host-web/biomes)
43
+ * --yes / -y Skip confirmation prompt
44
+ * --help / -h Print usage and exit
45
+ */
46
+
47
+ const DEFAULT_SERVER_BIOMES_DIR = 'repos/xema-community/biomes';
48
+ const DEFAULT_WEB_BIOMES_DIR = 'submodules/xema-host-web/biomes';
49
+ const SCOPES: readonly ManifestScope[] = ['kernel', 'system', 'base', 'platform'];
50
+
51
+ interface CliArgs {
52
+ readonly biomeId: string | undefined;
53
+ readonly kind: string | undefined;
54
+ readonly scope: string | undefined;
55
+ readonly displayName: string | undefined;
56
+ readonly description: string | undefined;
57
+ readonly repoRoot: string | undefined;
58
+ readonly serverBiomesDir: string | undefined;
59
+ readonly webBiomesDir: string | undefined;
60
+ readonly yes: boolean;
61
+ readonly help: boolean;
62
+ }
63
+
64
+ function parseArgs(argv: readonly string[]): CliArgs {
65
+ let biomeId: string | undefined;
66
+ let kind: string | undefined;
67
+ let scope: string | undefined;
68
+ let displayName: string | undefined;
69
+ let description: string | undefined;
70
+ let repoRoot: string | undefined;
71
+ let serverBiomesDir: string | undefined;
72
+ let webBiomesDir: string | undefined;
73
+ let yes = false;
74
+ let help = false;
75
+ for (let i = 0; i < argv.length; i++) {
76
+ const token = argv[i];
77
+ if (token === undefined) {
78
+ continue;
79
+ }
80
+ switch (token) {
81
+ case '--help':
82
+ case '-h':
83
+ help = true;
84
+ break;
85
+ case '--yes':
86
+ case '-y':
87
+ yes = true;
88
+ break;
89
+ case '--kind':
90
+ kind = argv[++i];
91
+ break;
92
+ case '--scope':
93
+ scope = argv[++i];
94
+ break;
95
+ case '--display':
96
+ displayName = argv[++i];
97
+ break;
98
+ case '--desc':
99
+ description = argv[++i];
100
+ break;
101
+ case '--repo-root':
102
+ repoRoot = argv[++i];
103
+ break;
104
+ case '--server-biomes-dir':
105
+ serverBiomesDir = argv[++i];
106
+ break;
107
+ case '--web-biomes-dir':
108
+ webBiomesDir = argv[++i];
109
+ break;
110
+ default:
111
+ if (token.startsWith('--')) {
112
+ throw new ScaffolderError(`unknown flag: ${token} (use --help)`);
113
+ }
114
+ if (!biomeId) {
115
+ biomeId = token;
116
+ } else {
117
+ throw new ScaffolderError(`unexpected positional argument: ${token}`);
118
+ }
119
+ break;
120
+ }
121
+ }
122
+ return {
123
+ biomeId,
124
+ kind,
125
+ scope,
126
+ displayName,
127
+ description,
128
+ repoRoot,
129
+ serverBiomesDir,
130
+ webBiomesDir,
131
+ yes,
132
+ help,
133
+ };
134
+ }
135
+
136
+ function printUsage(): void {
137
+ stdout.write(`Usage: pnpm dlx @xemahq/create-biome <biomeId> [options]
138
+
139
+ Scaffolds a real in-tree Xema biome.
140
+
141
+ Options:
142
+ --kind <id> One of: ${listKinds().map((k) => k.id).join(' | ')} (default: service)
143
+ --scope <tier> ${SCOPES.join(' | ')} (default: ${DEFAULT_BIOME_SCOPE})
144
+ --display "<name>" Human-readable display name (default: biomeId)
145
+ --desc "<text>" One-line manifest description
146
+ --repo-root <path> Monorepo root (default: current directory)
147
+ --server-biomes-dir Server biomes dir, relative to repo-root
148
+ (default: ${DEFAULT_SERVER_BIOMES_DIR})
149
+ --web-biomes-dir Web biomes dir, relative to repo-root
150
+ (default: ${DEFAULT_WEB_BIOMES_DIR})
151
+ --yes Skip the final confirmation prompt
152
+ --help Print this help
153
+
154
+ Kinds:
155
+ ${listKinds()
156
+ .map((k) => ` • ${k.id} — ${k.displayName}\n ${k.summary}`)
157
+ .join('\n')}
158
+
159
+ Examples:
160
+ pnpm dlx @xemahq/create-biome acme-tickets --kind service
161
+ pnpm dlx @xemahq/create-biome acme-portal --kind full --scope base --yes
162
+ pnpm dlx @xemahq/create-biome connector-acme --kind connector --yes
163
+ `);
164
+ }
165
+
166
+ async function main(): Promise<void> {
167
+ const args = parseArgs(process.argv.slice(2));
168
+ if (args.help) {
169
+ printUsage();
170
+ return;
171
+ }
172
+ const rl = createInterface({ input: stdin, output: stdout });
173
+ try {
174
+ const biomeId = args.biomeId ?? (await prompt(rl, 'Biome id (kebab-case): '));
175
+ if (!biomeId) {
176
+ throw new ScaffolderError('biome id is required');
177
+ }
178
+ const idCheck = validateBiomeId(biomeId);
179
+ if (!idCheck.ok) {
180
+ throw new ScaffolderError(idCheck.reason);
181
+ }
182
+
183
+ const kindId = args.kind ?? (await promptKind(rl));
184
+ if (!isKnownKind(kindId)) {
185
+ throw new ScaffolderError(
186
+ `unknown kind "${kindId}". Choose one of: ${listKinds().map((k) => k.id).join(', ')}`,
187
+ );
188
+ }
189
+
190
+ // Scope has an unambiguous default (`platform` — a first-party domain
191
+ // biome), so it is never prompted — pass `--scope` to override. This
192
+ // keeps the non-interactive path fully driven by `--kind` + positional
193
+ // id (EOF on a piped stdin can't strand the run on a scope prompt).
194
+ const scope = args.scope ?? DEFAULT_BIOME_SCOPE;
195
+ if (!isKnownScope(scope)) {
196
+ throw new ScaffolderError(
197
+ `unknown scope "${scope}". Choose one of: ${SCOPES.join(', ')}`,
198
+ );
199
+ }
200
+
201
+ const displayName =
202
+ args.displayName ??
203
+ (await prompt(rl, `Display name [${humanize(biomeId)}]: `, humanize(biomeId)));
204
+ const description =
205
+ args.description ??
206
+ (await prompt(
207
+ rl,
208
+ 'One-line description: ',
209
+ `${humanize(biomeId)} biome scaffolded by @xemahq/create-biome`,
210
+ ));
211
+
212
+ const repoRoot = path.resolve(args.repoRoot ?? process.cwd());
213
+ const serverBiomesDir = args.serverBiomesDir ?? DEFAULT_SERVER_BIOMES_DIR;
214
+ const webBiomesDir = args.webBiomesDir ?? DEFAULT_WEB_BIOMES_DIR;
215
+
216
+ if (!args.yes) {
217
+ const confirm = await prompt(
218
+ rl,
219
+ `Create ${kindId} biome "${biomeId}" (scope ${scope}) under ${repoRoot}? [Y/n] `,
220
+ 'y',
221
+ );
222
+ if (!isYes(confirm)) {
223
+ stdout.write('Aborted — no files written.\n');
224
+ return;
225
+ }
226
+ }
227
+
228
+ const result = await scaffoldBiome({
229
+ biomeId,
230
+ displayName,
231
+ description,
232
+ kind: kindId,
233
+ scope,
234
+ repoRoot,
235
+ serverBiomesDir,
236
+ webBiomesDir,
237
+ });
238
+ printSuccessSummary(result.dirs, result.filesWritten.length, kindId);
239
+ } finally {
240
+ rl.close();
241
+ }
242
+ }
243
+
244
+ function printSuccessSummary(
245
+ dirs: readonly ScaffoldedBiomeDir[],
246
+ fileCount: number,
247
+ kind: BiomeKind,
248
+ ): void {
249
+ stdout.write(`\n✔ Created ${fileCount} files\n`);
250
+ for (const d of dirs) {
251
+ stdout.write(` ${d.target}: ${d.dir}\n`);
252
+ }
253
+ stdout.write(`\nNext steps (from the monorepo root):\n`);
254
+ stdout.write(` pnpm install\n`);
255
+ if (kind === BiomeKind.Service || kind === BiomeKind.Full) {
256
+ stdout.write(
257
+ ` node tooling/codegen/generate-service-bootstrap.mjs # sync the bootstrap descriptor\n`,
258
+ );
259
+ stdout.write(` pnpm refresh # openapi -> client -> build\n`);
260
+ stdout.write(` node tooling/codegen/biome-finalize.mjs # sync biome index + deps\n`);
261
+ }
262
+ if (kind === BiomeKind.Web || kind === BiomeKind.Full) {
263
+ stdout.write(
264
+ ` (cd submodules/xema-host-web && npm run biomes:generate) # regenerate loader/transpile/paths\n`,
265
+ );
266
+ stdout.write(
267
+ ` # transpilePackages + tsconfig paths are GLOB-DERIVED — no manual host list edit needed.\n`,
268
+ );
269
+ }
270
+ if (kind === BiomeKind.Connector) {
271
+ stdout.write(
272
+ ` node tooling/codegen/biome-finalize.mjs # sync biome index + deps\n`,
273
+ );
274
+ stdout.write(
275
+ ` node tooling/boundaries/check-connector-biome.mjs # the constraints a connector must keep\n`,
276
+ );
277
+ }
278
+ stdout.write(
279
+ `\nThe biome ships NO capability descriptor and needs none — capabilities are\n` +
280
+ `derived from what it already declares. Run its \`test\` script to see the set.\n`,
281
+ );
282
+ }
283
+
284
+ async function promptKind(rl: ReturnType<typeof createInterface>): Promise<string> {
285
+ stdout.write('\nAvailable kinds:\n');
286
+ for (const k of listKinds()) {
287
+ stdout.write(` • ${k.id} — ${k.displayName}\n ${k.summary}\n`);
288
+ }
289
+ return prompt(rl, `\nKind [${BiomeKind.Service}]: `, BiomeKind.Service);
290
+ }
291
+
292
+ async function prompt(
293
+ rl: ReturnType<typeof createInterface>,
294
+ question: string,
295
+ fallback?: string,
296
+ ): Promise<string> {
297
+ const raw = await rl.question(question);
298
+ const trimmed = raw.trim();
299
+ if (trimmed.length === 0 && fallback !== undefined) {
300
+ return fallback;
301
+ }
302
+ return trimmed;
303
+ }
304
+
305
+ function isKnownScope(value: string): value is ManifestScope {
306
+ return (SCOPES as readonly string[]).includes(value);
307
+ }
308
+
309
+ function isYes(value: string): boolean {
310
+ const v = value.trim().toLowerCase();
311
+ return v === '' || v === 'y' || v === 'yes';
312
+ }
313
+
314
+ function humanize(biomeId: string): string {
315
+ return biomeId
316
+ .split('-')
317
+ .filter((segment) => segment.length > 0)
318
+ .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
319
+ .join(' ');
320
+ }
321
+
322
+ main().catch((error) => {
323
+ if (error instanceof ScaffolderError) {
324
+ process.stderr.write(`create-biome: ${error.message}\n`);
325
+ process.exit(1);
326
+ }
327
+ process.stderr.write(
328
+ `create-biome: unexpected error\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`,
329
+ );
330
+ process.exit(1);
331
+ });
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './lib/kind.js';
2
+ export * from './lib/manifest-builder.js';
3
+ export * from './lib/scaffolder.js';
4
+ export * from './lib/template-files.js';
5
+ export * from './lib/host-wiring.js';
@@ -0,0 +1,123 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import * as path from 'node:path';
3
+
4
+ /**
5
+ * Host-web registration derivation.
6
+ *
7
+ * A web biome must be registered in THREE places in the Next.js host shell:
8
+ * 1. `next.config.mjs#transpilePackages` — biome `file:` deps ship raw
9
+ * `.tsx`, so Next must transpile them.
10
+ * 2. `tsconfig.json#paths` — the `@xemahq/biomes-*-web` → `src/index.tsx`
11
+ * module mappings.
12
+ * 3. The biome LOADER map (`generate-biome-loaders.mjs`) — already glob-
13
+ * driven and self-correcting.
14
+ *
15
+ * (1) and (2) were hand-maintained lists and DRIFTED (e.g. `xema-storefront-
16
+ * web` + `fleet-management-web` fell out of sync). This module derives all
17
+ * three from ONE glob over `<webRoot>/biomes/<tier>/<id>/xema-biome.json`
18
+ * (filtered to `xema.target === 'web'`), so adding a web biome never requires
19
+ * a manual list edit — the same scan the loader generator already uses.
20
+ *
21
+ * Used by `generate-biome-loaders.mjs` (to emit the derived
22
+ * transpilePackages + tsconfig-paths files the host consumes) and exported so
23
+ * the scaffolder / tests can assert the wiring without spawning the host
24
+ * build.
25
+ */
26
+
27
+ export interface WebBiomeEntry {
28
+ /** `xema.id` (e.g. `documents-web`). */
29
+ readonly id: string;
30
+ /** npm package name (`xema-biome.json#name`). */
31
+ readonly packageName: string;
32
+ /** Tier directory under `biomes/` (e.g. `platform`, `system`). */
33
+ readonly tier: string;
34
+ /** Directory name under the tier (e.g. `documents-web`). */
35
+ readonly dirName: string;
36
+ }
37
+
38
+ const SKIP = new Set(['node_modules', 'dist', '.git', '.turbo']);
39
+
40
+ function isDir(p: string): boolean {
41
+ try {
42
+ return statSync(p).isDirectory();
43
+ } catch {
44
+ return false;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Scan `<webRoot>/biomes/<tier>/<id>/xema-biome.json` for every web biome.
50
+ * Sorted by id for deterministic output. A malformed/absent manifest is
51
+ * skipped silently (matches the loader generator's tolerance).
52
+ */
53
+ export function scanWebBiomes(webRoot: string): readonly WebBiomeEntry[] {
54
+ const biomesRoot = path.join(webRoot, 'biomes');
55
+ const entries: WebBiomeEntry[] = [];
56
+ let tiers: string[] = [];
57
+ try {
58
+ tiers = readdirSync(biomesRoot).filter(
59
+ (t) => !SKIP.has(t) && isDir(path.join(biomesRoot, t)),
60
+ );
61
+ } catch {
62
+ return entries;
63
+ }
64
+ for (const tier of tiers) {
65
+ const tierDir = path.join(biomesRoot, tier);
66
+ let dirs: string[] = [];
67
+ try {
68
+ dirs = readdirSync(tierDir).filter(
69
+ (d) => !SKIP.has(d) && isDir(path.join(tierDir, d)),
70
+ );
71
+ } catch {
72
+ continue;
73
+ }
74
+ for (const dirName of dirs) {
75
+ const manifestPath = path.join(tierDir, dirName, 'xema-biome.json');
76
+ if (!existsSync(manifestPath)) {
77
+ continue;
78
+ }
79
+ let raw: unknown;
80
+ try {
81
+ raw = JSON.parse(readFileSync(manifestPath, 'utf8'));
82
+ } catch {
83
+ continue;
84
+ }
85
+ const m = raw as { name?: unknown; xema?: { id?: unknown; target?: unknown } };
86
+ if (m?.xema?.target !== 'web') {
87
+ continue;
88
+ }
89
+ const id = m.xema?.id;
90
+ const packageName = m.name;
91
+ if (typeof id !== 'string' || typeof packageName !== 'string') {
92
+ continue;
93
+ }
94
+ entries.push({ id, packageName, tier, dirName });
95
+ }
96
+ }
97
+ entries.sort((a, b) => a.id.localeCompare(b.id));
98
+ return entries;
99
+ }
100
+
101
+ /** Package names for `next.config.mjs#transpilePackages`. */
102
+ export function deriveTranspilePackages(
103
+ entries: readonly WebBiomeEntry[],
104
+ ): readonly string[] {
105
+ return entries.map((e) => e.packageName);
106
+ }
107
+
108
+ /**
109
+ * `tsconfig.json#paths` map for the web biomes — the two-form mapping per
110
+ * biome (bare specifier → `src/index.tsx`, sub-path → `src/*`). Paths are
111
+ * relative to the host root, matching the committed tsconfig convention.
112
+ */
113
+ export function deriveTsconfigPaths(
114
+ entries: readonly WebBiomeEntry[],
115
+ ): Readonly<Record<string, readonly string[]>> {
116
+ const paths: Record<string, readonly string[]> = {};
117
+ for (const e of entries) {
118
+ const base = `./biomes/${e.tier}/${e.dirName}`;
119
+ paths[e.packageName] = [`${base}/src/index.tsx`];
120
+ paths[`${e.packageName}/*`] = [`${base}/src/*`];
121
+ }
122
+ return paths;
123
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Closed set of biome KINDS the scaffolder emits. A "kind" decides the
3
+ * on-disk SHAPE of the generated biome (which files + folders), independent
4
+ * of the per-domain content an author later fills in.
5
+ *
6
+ * Keeping the set closed (not a free-form arg) means every kind's file map,
7
+ * manifest defaults, and `--help` copy live in one place rather than scattered
8
+ * across call sites. Adding a kind = one enum entry + one rendering function.
9
+ *
10
+ * Unlike the previous design (which emitted an EXTERNAL `@xemahq-biomes/<id>`
11
+ * npm package with a flat, schema-INVALID manifest), every kind here emits a
12
+ * REAL in-tree biome: a `biomes/<id>/` directory whose `xema-biome.json`
13
+ * passes the canonical `BiomeManifestSchema`, whose server APIs opt into
14
+ * `XemaServiceModule.forBiome` via the generated bootstrap descriptor, and
15
+ * whose web surface registers through the host's glob-driven loader.
16
+ *
17
+ * NOT the same axis as the kernel's `BiomeKind` (`app | connector | library`,
18
+ * declared as `xema.kind`). That enum says WHAT a biome IS to the platform;
19
+ * this one says WHICH FILES the scaffolder writes. They meet in exactly one
20
+ * place: {@link BiomeKind.Connector} is the only scaffold kind that stamps
21
+ * `xema.kind: "connector"`, because that marker carries real, CI-enforced
22
+ * constraints (`tooling/boundaries/check-connector-biome.mjs`) that only the
23
+ * connector file map satisfies.
24
+ */
25
+ export enum BiomeKind {
26
+ /**
27
+ * A SERVER biome (`xema.target: "server"`) that ships exactly one NestJS
28
+ * API under `api/<id>-api/` plus the content directories every real biome
29
+ * carries (`skills/`, `agents/`, `contributions/`, `workspace-manifests/`).
30
+ * The API is bootstrapped by `XemaServiceModule.forBiome(...)` reading the
31
+ * generated `<id>-api.bootstrap.generated.ts` descriptor — exactly the
32
+ * shape of the first-party biomes the platform runs.
33
+ */
34
+ Service = 'service',
35
+ /**
36
+ * A WEB biome (`xema.target: "web"`) that contributes a nav item + a
37
+ * project-scoped lazy route page using the `@xemahq/ui-kernel` bridge
38
+ * (`FrontendBiomeFactory`) and the host's `useBiomeRouteParams` hook. No
39
+ * NestJS service. Registers via the host's `generate-biome-loaders.mjs`
40
+ * glob — no manual list edits.
41
+ */
42
+ Web = 'web',
43
+ /**
44
+ * BOTH a server biome and its paired web surface: a server `biomes/<id>/`
45
+ * with an API, AND a `<id>-web` web biome whose `requiresServerBiomes`
46
+ * points back at the server biome. The full vertical a real product biome
47
+ * ships.
48
+ */
49
+ Full = 'full',
50
+ /**
51
+ * A CONNECTOR biome (`xema.target: "server"`, `xema.kind: "connector"`): a
52
+ * constrained, credential-bearing capability provider. It ships a
53
+ * `ConnectorAdapterModule` (`defineConnectorAdapter` from
54
+ * `@xemahq/biome-sdk/adapter`) carrying a webhook verifier, event mapper,
55
+ * deterministic idempotency extractor, provider/connector descriptors and an
56
+ * onboarding manifest — and from those declarations alone the platform
57
+ * derives the connector's capabilities, its connection-setup flow, credential
58
+ * custody, OAuth (when the provider declares it) and preflight.
59
+ *
60
+ * It deliberately ships NO NestJS API, NO web surface, and NO dependency on
61
+ * another biome: `tooling/boundaries/check-connector-biome.mjs` rejects all
62
+ * three, because a connector must be reusable by any app.
63
+ */
64
+ Connector = 'connector',
65
+ }
66
+
67
+ export interface BiomeKindMetadata {
68
+ readonly id: BiomeKind;
69
+ readonly displayName: string;
70
+ readonly summary: string;
71
+ }
72
+
73
+ export const BIOME_KINDS: Readonly<Record<BiomeKind, BiomeKindMetadata>> = {
74
+ [BiomeKind.Service]: {
75
+ id: BiomeKind.Service,
76
+ displayName: 'Service biome',
77
+ summary:
78
+ 'A server biome with one NestJS API (XemaServiceModule.forBiome) plus skills/, agents/, contributions/, workspace-manifests/. Mirrors first-party biomes like agent-runtime.',
79
+ },
80
+ [BiomeKind.Web]: {
81
+ id: BiomeKind.Web,
82
+ displayName: 'Web biome',
83
+ summary:
84
+ 'A frontend-only biome: a nav item + a project-scoped lazy route page using the @xemahq/ui-kernel bridge. Registers via the host loader glob.',
85
+ },
86
+ [BiomeKind.Full]: {
87
+ id: BiomeKind.Full,
88
+ displayName: 'Full-stack biome',
89
+ summary:
90
+ 'Both a server biome (NestJS API) and its paired web surface, wired together via requiresServerBiomes. The full vertical a product biome ships.',
91
+ },
92
+ [BiomeKind.Connector]: {
93
+ id: BiomeKind.Connector,
94
+ displayName: 'Connector biome',
95
+ summary:
96
+ 'A credential-bearing capability provider: one ConnectorAdapterModule (verifier + event mapper + idempotency + descriptors + onboarding) from which connector capabilities, connection setup, credential custody, OAuth and preflight are derived. No API, no web surface, no biome dependencies.',
97
+ },
98
+ };
99
+
100
+ export function listKinds(): readonly BiomeKindMetadata[] {
101
+ return Object.values(BIOME_KINDS);
102
+ }
103
+
104
+ export function getKind(id: BiomeKind): BiomeKindMetadata {
105
+ return BIOME_KINDS[id];
106
+ }
107
+
108
+ export function isKnownKind(value: string): value is BiomeKind {
109
+ return (Object.values(BiomeKind) as string[]).includes(value);
110
+ }