@xemahq/create-biome 0.1.2 → 0.2.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/README.md CHANGED
@@ -28,31 +28,48 @@
28
28
 
29
29
  ## Overview
30
30
 
31
- Generates a working biome folder from a single command, complete with a
32
- manifest, an ESM TypeScript layout, and sample tests. It ships three starter
33
- templates integration-provider, workflows-only, and storage-only — so a new
34
- biome begins from a structure that already builds and tests cleanly.
31
+ Generates a **real in-tree biome** from a single command a `biomes/<id>/`
32
+ directory whose `xema-biome.json` passes the canonical `BiomeManifestSchema`,
33
+ whose server APIs bootstrap through `XemaServiceModule.forBiome(...)`, and
34
+ whose web surface registers through the host shell's loader glob. The output
35
+ mirrors the first-party biomes the platform runs, so a new biome is immediately
36
+ valid against the biome validator, the boundary checks, and
37
+ `generate-service-bootstrap.mjs`.
38
+
39
+ ## Kinds
40
+
41
+ - `service` — a server biome with one NestJS API plus `skills/`, `agents/`,
42
+ `contributions/`, and `workspace-manifests/`.
43
+ - `web` — a frontend-only biome: a nav item + a project-scoped lazy route page
44
+ using the `@xemahq/ui-kernel` bridge.
45
+ - `full` — both a server biome and its paired web surface, wired together via
46
+ `requiresServerBiomes`.
35
47
 
36
48
  ## When to use it
37
49
 
38
- - Use it to bootstrap a brand-new biome package from a starter template.
50
+ - Use it to bootstrap a brand-new in-tree biome of any kind.
39
51
 
40
52
  ## Installation
41
53
 
42
54
  ```bash
43
- # No install needed — run it directly:
55
+ # No install needed — run it directly from the monorepo root:
44
56
  pnpm dlx @xemahq/create-biome <biomeId>
45
57
  ```
46
58
 
47
59
  ## Usage
48
60
 
49
61
  ```bash
50
- # Scaffold a biome, choosing a starter template:
51
- pnpm dlx @xemahq/create-biome my-biome --template integration-provider
52
- pnpm dlx @xemahq/create-biome my-biome --template workflows-only
53
- pnpm dlx @xemahq/create-biome my-biome --template storage-only
62
+ # Scaffold a biome, choosing a kind:
63
+ pnpm dlx @xemahq/create-biome my-biome --kind service
64
+ pnpm dlx @xemahq/create-biome my-portal --kind full --scope platform
54
65
  ```
55
66
 
67
+ After scaffolding a server/full biome, run `node
68
+ tooling/codegen/generate-service-bootstrap.mjs` and `pnpm refresh` from the
69
+ monorepo root. For web/full, the host's `transpilePackages` and tsconfig
70
+ `paths` are glob-derived — the host's `biomes:generate` script (run by its
71
+ `predev`/`prebuild`) picks the new biome up with no manual list edit.
72
+
56
73
  ## License
57
74
 
58
75
  Apache-2.0 &copy; Xema — [xema.dev](https://xema.dev)
@@ -2,16 +2,21 @@
2
2
  import * as path from 'node:path';
3
3
  import { stdin, stdout } from 'node:process';
4
4
  import { createInterface } from 'node:readline/promises';
5
- import { existsSync } from 'node:fs';
5
+ import { BiomeKind, isKnownKind, listKinds } from '../lib/kind.js';
6
6
  import { validateBiomeId } from '../lib/manifest-builder.js';
7
- import { ScaffolderError, scaffoldBiome } from '../lib/scaffolder.js';
8
- import { BiomeTemplateId, listTemplates } from '../lib/template.js';
7
+ import { ScaffolderError, scaffoldBiome, } from '../lib/scaffolder.js';
8
+ const DEFAULT_SERVER_BIOMES_DIR = 'repos/xema-community/biomes';
9
+ const DEFAULT_WEB_BIOMES_DIR = 'submodules/xema-host-web/biomes';
10
+ const SCOPES = ['kernel', 'system', 'base', 'platform'];
9
11
  function parseArgs(argv) {
10
12
  let biomeId;
11
- let template;
13
+ let kind;
14
+ let scope;
12
15
  let displayName;
13
16
  let description;
14
- let target;
17
+ let repoRoot;
18
+ let serverBiomesDir;
19
+ let webBiomesDir;
15
20
  let yes = false;
16
21
  let help = false;
17
22
  for (let i = 0; i < argv.length; i++) {
@@ -28,8 +33,11 @@ function parseArgs(argv) {
28
33
  case '-y':
29
34
  yes = true;
30
35
  break;
31
- case '--template':
32
- template = argv[++i];
36
+ case '--kind':
37
+ kind = argv[++i];
38
+ break;
39
+ case '--scope':
40
+ scope = argv[++i];
33
41
  break;
34
42
  case '--display':
35
43
  displayName = argv[++i];
@@ -37,8 +45,14 @@ function parseArgs(argv) {
37
45
  case '--desc':
38
46
  description = argv[++i];
39
47
  break;
40
- case '--target':
41
- target = argv[++i];
48
+ case '--repo-root':
49
+ repoRoot = argv[++i];
50
+ break;
51
+ case '--server-biomes-dir':
52
+ serverBiomesDir = argv[++i];
53
+ break;
54
+ case '--web-biomes-dir':
55
+ webBiomesDir = argv[++i];
42
56
  break;
43
57
  default:
44
58
  if (token.startsWith('--')) {
@@ -53,22 +67,45 @@ function parseArgs(argv) {
53
67
  break;
54
68
  }
55
69
  }
56
- return { biomeId, template, displayName, description, target, yes, help };
70
+ return {
71
+ biomeId,
72
+ kind,
73
+ scope,
74
+ displayName,
75
+ description,
76
+ repoRoot,
77
+ serverBiomesDir,
78
+ webBiomesDir,
79
+ yes,
80
+ help,
81
+ };
57
82
  }
58
83
  function printUsage() {
59
84
  stdout.write(`Usage: pnpm dlx @xemahq/create-biome <biomeId> [options]
60
85
 
86
+ Scaffolds a real in-tree Xema biome.
87
+
61
88
  Options:
62
- --template <id> One of: ${listTemplates().map((t) => t.id).join(' | ')}
63
- --display "<name>" Human-readable display name (default: biomeId)
64
- --desc "<text>" One-line manifest description
65
- --target <path> Where to create the biome (default: ./<biomeId>)
66
- --yes Skip the final confirmation prompt
67
- --help Print this help
89
+ --kind <id> One of: ${listKinds().map((k) => k.id).join(' | ')} (default: service)
90
+ --scope <tier> ${SCOPES.join(' | ')} (default: base)
91
+ --display "<name>" Human-readable display name (default: biomeId)
92
+ --desc "<text>" One-line manifest description
93
+ --repo-root <path> Monorepo root (default: current directory)
94
+ --server-biomes-dir Server biomes dir, relative to repo-root
95
+ (default: ${DEFAULT_SERVER_BIOMES_DIR})
96
+ --web-biomes-dir Web biomes dir, relative to repo-root
97
+ (default: ${DEFAULT_WEB_BIOMES_DIR})
98
+ --yes Skip the final confirmation prompt
99
+ --help Print this help
100
+
101
+ Kinds:
102
+ ${listKinds()
103
+ .map((k) => ` • ${k.id} — ${k.displayName}\n ${k.summary}`)
104
+ .join('\n')}
68
105
 
69
106
  Examples:
70
- pnpm dlx @xemahq/create-biome acme-tickets --template integration-provider
71
- pnpm dlx @xemahq/create-biome acme-cache --template storage-only --yes
107
+ pnpm dlx @xemahq/create-biome acme-tickets --kind service
108
+ pnpm dlx @xemahq/create-biome acme-portal --kind full --scope platform --yes
72
109
  `);
73
110
  }
74
111
  async function main() {
@@ -87,20 +124,23 @@ async function main() {
87
124
  if (!idCheck.ok) {
88
125
  throw new ScaffolderError(idCheck.reason);
89
126
  }
90
- const templateId = args.template ?? (await promptTemplate(rl));
91
- if (!isKnownTemplate(templateId)) {
92
- throw new ScaffolderError(`unknown template "${templateId}". Choose one of: ${listTemplates().map((t) => t.id).join(', ')}`);
127
+ const kindId = args.kind ?? (await promptKind(rl));
128
+ if (!isKnownKind(kindId)) {
129
+ throw new ScaffolderError(`unknown kind "${kindId}". Choose one of: ${listKinds().map((k) => k.id).join(', ')}`);
93
130
  }
94
- const targetDir = path.resolve(args.target ?? `./${biomeId}`);
95
- if (existsSync(targetDir)) {
96
- throw new ScaffolderError(`target directory already exists: ${targetDir} choose a fresh path or delete it first`);
131
+ const scope = args.scope ?? 'base';
132
+ if (!isKnownScope(scope)) {
133
+ throw new ScaffolderError(`unknown scope "${scope}". Choose one of: ${SCOPES.join(', ')}`);
97
134
  }
98
135
  const displayName = args.displayName ??
99
136
  (await prompt(rl, `Display name [${humanize(biomeId)}]: `, humanize(biomeId)));
100
137
  const description = args.description ??
101
138
  (await prompt(rl, 'One-line description: ', `${humanize(biomeId)} biome scaffolded by @xemahq/create-biome`));
139
+ const repoRoot = path.resolve(args.repoRoot ?? process.cwd());
140
+ const serverBiomesDir = args.serverBiomesDir ?? DEFAULT_SERVER_BIOMES_DIR;
141
+ const webBiomesDir = args.webBiomesDir ?? DEFAULT_WEB_BIOMES_DIR;
102
142
  if (!args.yes) {
103
- const confirm = await prompt(rl, `Create biome "${biomeId}" (${templateId}) at ${targetDir}? [Y/n] `, 'y');
143
+ const confirm = await prompt(rl, `Create ${kindId} biome "${biomeId}" (scope ${scope}) under ${repoRoot}? [Y/n] `, 'y');
104
144
  if (!isYes(confirm)) {
105
145
  stdout.write('Aborted — no files written.\n');
106
146
  return;
@@ -110,31 +150,42 @@ async function main() {
110
150
  biomeId,
111
151
  displayName,
112
152
  description,
113
- template: templateId,
114
- targetDir,
153
+ kind: kindId,
154
+ scope,
155
+ repoRoot,
156
+ serverBiomesDir,
157
+ webBiomesDir,
115
158
  });
116
- printSuccessSummary(result.targetDir, result.filesWritten.length);
159
+ printSuccessSummary(result.dirs, result.filesWritten.length, kindId);
117
160
  }
118
161
  finally {
119
162
  rl.close();
120
163
  }
121
164
  }
122
- function printSuccessSummary(targetDir, fileCount) {
123
- stdout.write(`\n✔ Created ${fileCount} files in ${targetDir}\n`);
124
- stdout.write(`\nNext steps:\n`);
125
- stdout.write(` cd ${path.relative(process.cwd(), targetDir) || '.'}\n`);
165
+ function printSuccessSummary(dirs, fileCount, kind) {
166
+ stdout.write(`\n✔ Created ${fileCount} files\n`);
167
+ for (const d of dirs) {
168
+ stdout.write(` ${d.target}: ${d.dir}\n`);
169
+ }
170
+ stdout.write(`\nNext steps (from the monorepo root):\n`);
126
171
  stdout.write(` pnpm install\n`);
127
- stdout.write(` pnpm build\n`);
128
- stdout.write(` pnpm test\n\n`);
129
- stdout.write(`Edit xema-biome.json to declare integration requirements, capabilities, and contributions.\n`);
172
+ if (kind === BiomeKind.Service || kind === BiomeKind.Full) {
173
+ stdout.write(` node tooling/codegen/generate-service-bootstrap.mjs # sync the bootstrap descriptor\n`);
174
+ stdout.write(` pnpm refresh # openapi -> client -> build\n`);
175
+ stdout.write(` node tooling/codegen/biome-finalize.mjs # sync biome index + deps\n`);
176
+ }
177
+ if (kind === BiomeKind.Web || kind === BiomeKind.Full) {
178
+ stdout.write(` (cd submodules/xema-host-web && npm run biomes:generate) # regenerate loader/transpile/paths\n`);
179
+ stdout.write(` # transpilePackages + tsconfig paths are GLOB-DERIVED — no manual host list edit needed.\n`);
180
+ }
181
+ stdout.write(`\nEdit xema-biome.json to declare capabilities, agents, and contributions.\n`);
130
182
  }
131
- async function promptTemplate(rl) {
132
- stdout.write('\nAvailable templates:\n');
133
- for (const t of listTemplates()) {
134
- stdout.write(` • ${t.id} — ${t.displayName}\n ${t.summary}\n`);
183
+ async function promptKind(rl) {
184
+ stdout.write('\nAvailable kinds:\n');
185
+ for (const k of listKinds()) {
186
+ stdout.write(` • ${k.id} — ${k.displayName}\n ${k.summary}\n`);
135
187
  }
136
- const answer = await prompt(rl, `\nTemplate [${BiomeTemplateId.Connector}]: `, BiomeTemplateId.Connector);
137
- return answer;
188
+ return prompt(rl, `\nKind [${BiomeKind.Service}]: `, BiomeKind.Service);
138
189
  }
139
190
  async function prompt(rl, question, fallback) {
140
191
  const raw = await rl.question(question);
@@ -144,8 +195,8 @@ async function prompt(rl, question, fallback) {
144
195
  }
145
196
  return trimmed;
146
197
  }
147
- function isKnownTemplate(value) {
148
- return Object.values(BiomeTemplateId).includes(value);
198
+ function isKnownScope(value) {
199
+ return SCOPES.includes(value);
149
200
  }
150
201
  function isYes(value) {
151
202
  const v = value.trim().toLowerCase();
@@ -163,7 +214,7 @@ main().catch((error) => {
163
214
  process.stderr.write(`create-biome: ${error.message}\n`);
164
215
  process.exit(1);
165
216
  }
166
- process.stderr.write(`create-biome: unexpected error\n${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
217
+ process.stderr.write(`create-biome: unexpected error\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`);
167
218
  process.exit(1);
168
219
  });
169
220
  //# sourceMappingURL=create-biome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-biome.js","sourceRoot":"","sources":["../../src/bin/create-biome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-biome.js","sourceRoot":"","sources":["../../src/bin/create-biome.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
+ export * from './lib/kind.js';
1
2
  export * from './lib/manifest-builder.js';
2
- export * from './lib/package-builder.js';
3
3
  export * from './lib/scaffolder.js';
4
- export * from './lib/template.js';
5
4
  export * from './lib/template-files.js';
5
+ export * from './lib/host-wiring.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
+ export * from './lib/kind.js';
1
2
  export * from './lib/manifest-builder.js';
2
- export * from './lib/package-builder.js';
3
3
  export * from './lib/scaffolder.js';
4
- export * from './lib/template.js';
5
4
  export * from './lib/template-files.js';
5
+ export * from './lib/host-wiring.js';
6
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface WebBiomeEntry {
2
+ readonly id: string;
3
+ readonly packageName: string;
4
+ readonly tier: string;
5
+ readonly dirName: string;
6
+ }
7
+ export declare function scanWebBiomes(webRoot: string): readonly WebBiomeEntry[];
8
+ export declare function deriveTranspilePackages(entries: readonly WebBiomeEntry[]): readonly string[];
9
+ export declare function deriveTsconfigPaths(entries: readonly WebBiomeEntry[]): Readonly<Record<string, readonly string[]>>;
10
+ //# sourceMappingURL=host-wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-wiring.d.ts","sourceRoot":"","sources":["../../src/lib/host-wiring.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,aAAa;IAE5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAiBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CA8CvE;AAGD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,SAAS,MAAM,EAAE,CAEnB;AAOD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAQ7C"}
@@ -0,0 +1,70 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import * as path from 'node:path';
3
+ const SKIP = new Set(['node_modules', 'dist', '.git', '.turbo']);
4
+ function isDir(p) {
5
+ try {
6
+ return statSync(p).isDirectory();
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ export function scanWebBiomes(webRoot) {
13
+ const biomesRoot = path.join(webRoot, 'biomes');
14
+ const entries = [];
15
+ let tiers = [];
16
+ try {
17
+ tiers = readdirSync(biomesRoot).filter((t) => !SKIP.has(t) && isDir(path.join(biomesRoot, t)));
18
+ }
19
+ catch {
20
+ return entries;
21
+ }
22
+ for (const tier of tiers) {
23
+ const tierDir = path.join(biomesRoot, tier);
24
+ let dirs = [];
25
+ try {
26
+ dirs = readdirSync(tierDir).filter((d) => !SKIP.has(d) && isDir(path.join(tierDir, d)));
27
+ }
28
+ catch {
29
+ continue;
30
+ }
31
+ for (const dirName of dirs) {
32
+ const manifestPath = path.join(tierDir, dirName, 'xema-biome.json');
33
+ if (!existsSync(manifestPath)) {
34
+ continue;
35
+ }
36
+ let raw;
37
+ try {
38
+ raw = JSON.parse(readFileSync(manifestPath, 'utf8'));
39
+ }
40
+ catch {
41
+ continue;
42
+ }
43
+ const m = raw;
44
+ if (m?.xema?.target !== 'web') {
45
+ continue;
46
+ }
47
+ const id = m.xema?.id;
48
+ const packageName = m.name;
49
+ if (typeof id !== 'string' || typeof packageName !== 'string') {
50
+ continue;
51
+ }
52
+ entries.push({ id, packageName, tier, dirName });
53
+ }
54
+ }
55
+ entries.sort((a, b) => a.id.localeCompare(b.id));
56
+ return entries;
57
+ }
58
+ export function deriveTranspilePackages(entries) {
59
+ return entries.map((e) => e.packageName);
60
+ }
61
+ export function deriveTsconfigPaths(entries) {
62
+ const paths = {};
63
+ for (const e of entries) {
64
+ const base = `./biomes/${e.tier}/${e.dirName}`;
65
+ paths[e.packageName] = [`${base}/src/index.tsx`];
66
+ paths[`${e.packageName}/*`] = [`${base}/src/*`];
67
+ }
68
+ return paths;
69
+ }
70
+ //# sourceMappingURL=host-wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-wiring.js","sourceRoot":"","sources":["../../src/lib/host-wiring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare enum BiomeKind {
2
+ Service = "service",
3
+ Web = "web",
4
+ Full = "full"
5
+ }
6
+ export interface BiomeKindMetadata {
7
+ readonly id: BiomeKind;
8
+ readonly displayName: string;
9
+ readonly summary: string;
10
+ }
11
+ export declare const BIOME_KINDS: Readonly<Record<BiomeKind, BiomeKindMetadata>>;
12
+ export declare function listKinds(): readonly BiomeKindMetadata[];
13
+ export declare function getKind(id: BiomeKind): BiomeKindMetadata;
14
+ export declare function isKnownKind(value: string): value is BiomeKind;
15
+ //# sourceMappingURL=kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kind.d.ts","sourceRoot":"","sources":["../../src/lib/kind.ts"],"names":[],"mappings":"AAgBA,oBAAY,SAAS;IASnB,OAAO,YAAY;IAQnB,GAAG,QAAQ;IAOX,IAAI,SAAS;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAmBtE,CAAC;AAEF,wBAAgB,SAAS,IAAI,SAAS,iBAAiB,EAAE,CAExD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,SAAS,GAAG,iBAAiB,CAExD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D"}
@@ -0,0 +1,33 @@
1
+ export var BiomeKind;
2
+ (function (BiomeKind) {
3
+ BiomeKind["Service"] = "service";
4
+ BiomeKind["Web"] = "web";
5
+ BiomeKind["Full"] = "full";
6
+ })(BiomeKind || (BiomeKind = {}));
7
+ export const BIOME_KINDS = {
8
+ [BiomeKind.Service]: {
9
+ id: BiomeKind.Service,
10
+ displayName: 'Service biome',
11
+ summary: 'A server biome with one NestJS API (XemaServiceModule.forBiome) plus skills/, agents/, contributions/, workspace-manifests/. Mirrors first-party biomes like agent-runtime.',
12
+ },
13
+ [BiomeKind.Web]: {
14
+ id: BiomeKind.Web,
15
+ displayName: 'Web biome',
16
+ summary: '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.',
17
+ },
18
+ [BiomeKind.Full]: {
19
+ id: BiomeKind.Full,
20
+ displayName: 'Full-stack biome',
21
+ summary: 'Both a server biome (NestJS API) and its paired web surface, wired together via requiresServerBiomes. The full vertical a product biome ships.',
22
+ },
23
+ };
24
+ export function listKinds() {
25
+ return Object.values(BIOME_KINDS);
26
+ }
27
+ export function getKind(id) {
28
+ return BIOME_KINDS[id];
29
+ }
30
+ export function isKnownKind(value) {
31
+ return Object.values(BiomeKind).includes(value);
32
+ }
33
+ //# sourceMappingURL=kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kind.js","sourceRoot":"","sources":["../../src/lib/kind.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAN,IAAY,SAyBX;AAzBD,WAAY,SAAS;IASnB,gCAAmB,CAAA;IAQnB,wBAAW,CAAA;IAOX,0BAAa,CAAA;AACf,CAAC,EAzBW,SAAS,KAAT,SAAS,QAyBpB;AAQD,MAAM,CAAC,MAAM,WAAW,GAAmD;IACzE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;QACnB,EAAE,EAAE,SAAS,CAAC,OAAO;QACrB,WAAW,EAAE,eAAe;QAC5B,OAAO,EACL,6KAA6K;KAChL;IACD,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;QACf,EAAE,EAAE,SAAS,CAAC,GAAG;QACjB,WAAW,EAAE,WAAW;QACxB,OAAO,EACL,8IAA8I;KACjJ;IACD,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QAChB,EAAE,EAAE,SAAS,CAAC,IAAI;QAClB,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EACL,gJAAgJ;KACnJ;CACF,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAa;IACnC,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAQ,MAAM,CAAC,MAAM,CAAC,SAAS,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -1,25 +1,65 @@
1
- import type { BiomeTemplateMetadata } from './template.js';
2
- export interface ManifestBuilderInput {
1
+ export type ManifestScope = 'kernel' | 'system' | 'base' | 'platform';
2
+ export interface ServerManifestBuilderInput {
3
3
  readonly biomeId: string;
4
4
  readonly displayName: string;
5
5
  readonly description: string;
6
- readonly template: BiomeTemplateMetadata;
6
+ readonly scope: ManifestScope;
7
+ readonly apiName: string;
7
8
  }
8
- export interface ManifestObject {
9
- readonly schemaVersion: 1;
10
- readonly id: string;
9
+ export interface WebManifestBuilderInput {
10
+ readonly biomeId: string;
11
+ readonly displayName: string;
12
+ readonly description: string;
13
+ readonly scope: ManifestScope;
14
+ readonly requiresServerBiomes: readonly string[];
15
+ }
16
+ export interface ServerApiDeclaration {
17
+ readonly name: string;
18
+ readonly path: string;
19
+ readonly displayName: string;
20
+ readonly serviceKind: 'biome-api';
21
+ readonly requiresServices: readonly string[];
22
+ readonly exposesCapabilities: readonly never[];
23
+ }
24
+ export interface ServerManifestObject {
11
25
  readonly name: string;
12
26
  readonly version: string;
13
- readonly trustTier: 'third-party';
14
- readonly engines: {
15
- readonly xema: string;
27
+ readonly xema: {
28
+ readonly id: string;
29
+ readonly displayName: string;
30
+ readonly description: string;
31
+ readonly scope: ManifestScope;
32
+ readonly target: 'server';
33
+ readonly engines: {
34
+ readonly xema: string;
35
+ };
36
+ readonly requiresCapabilities: readonly never[];
37
+ readonly exposesCapabilities: readonly never[];
38
+ readonly contributions: {
39
+ readonly directory: string;
40
+ };
41
+ readonly ships: {
42
+ readonly apis: readonly ServerApiDeclaration[];
43
+ };
44
+ };
45
+ }
46
+ export interface WebManifestObject {
47
+ readonly name: string;
48
+ readonly version: string;
49
+ readonly xema: {
50
+ readonly id: string;
51
+ readonly displayName: string;
52
+ readonly description: string;
53
+ readonly scope: ManifestScope;
54
+ readonly target: 'web';
55
+ readonly requiresServerBiomes?: readonly string[];
16
56
  };
17
- readonly requiresCapabilities: readonly never[];
18
- readonly exposesCapabilities: readonly never[];
19
- readonly contributes: readonly never[];
20
57
  }
21
- export declare function buildManifest(input: ManifestBuilderInput): ManifestObject;
22
- export declare function npmPackageName(biomeId: string): string;
58
+ export declare function buildServerManifest(input: ServerManifestBuilderInput): ServerManifestObject;
59
+ export declare function buildWebManifest(input: WebManifestBuilderInput): WebManifestObject;
60
+ export declare function firstPartyPackageName(biomeId: string): string;
61
+ export declare function apiNameForBiome(biomeId: string): string;
62
+ export declare function webBiomeId(biomeId: string): string;
23
63
  export declare function validateBiomeId(biomeId: string): {
24
64
  ok: true;
25
65
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-builder.d.ts","sourceRoot":"","sources":["../../src/lib/manifest-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAgB3D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,oBAAoB,EAAE,SAAS,KAAK,EAAE,CAAC;IAChD,QAAQ,CAAC,mBAAmB,EAAE,SAAS,KAAK,EAAE,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,SAAS,KAAK,EAAE,CAAC;CACxC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAczE;AAQD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AASD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQ7F"}
1
+ {"version":3,"file":"manifest-builder.d.ts","sourceRoot":"","sources":["../../src/lib/manifest-builder.ts"],"names":[],"mappings":"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"}