@semilayer/cli 1.1.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 (73) hide show
  1. package/dist/auth-config-3MWVCUTJ.js +117 -0
  2. package/dist/auth-config-3MWVCUTJ.js.map +1 -0
  3. package/dist/billing-OY5GJP5X.js +265 -0
  4. package/dist/billing-OY5GJP5X.js.map +1 -0
  5. package/dist/bin.d.ts +2 -0
  6. package/dist/bin.js +49 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/chunk-7TA63VHV.js +38 -0
  9. package/dist/chunk-7TA63VHV.js.map +1 -0
  10. package/dist/chunk-ALA4X7UU.js +19 -0
  11. package/dist/chunk-ALA4X7UU.js.map +1 -0
  12. package/dist/chunk-NIDLPHWY.js +53 -0
  13. package/dist/chunk-NIDLPHWY.js.map +1 -0
  14. package/dist/chunk-QMF7LD67.js +39 -0
  15. package/dist/chunk-QMF7LD67.js.map +1 -0
  16. package/dist/chunk-QXIVJY7K.js +56 -0
  17. package/dist/chunk-QXIVJY7K.js.map +1 -0
  18. package/dist/chunk-T3UROBMA.js +169 -0
  19. package/dist/chunk-T3UROBMA.js.map +1 -0
  20. package/dist/chunk-WZYOSGN3.js +88 -0
  21. package/dist/chunk-WZYOSGN3.js.map +1 -0
  22. package/dist/config-DACYO7JC.js +103 -0
  23. package/dist/config-DACYO7JC.js.map +1 -0
  24. package/dist/dev-R3AZSONQ.js +57 -0
  25. package/dist/dev-R3AZSONQ.js.map +1 -0
  26. package/dist/envs-RNZQ3OQP.js +105 -0
  27. package/dist/envs-RNZQ3OQP.js.map +1 -0
  28. package/dist/export-YRFR3JH2.js +81 -0
  29. package/dist/export-YRFR3JH2.js.map +1 -0
  30. package/dist/generate-QUETX3TN.js +41 -0
  31. package/dist/generate-QUETX3TN.js.map +1 -0
  32. package/dist/index.d.ts +43 -0
  33. package/dist/index.js +34 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/init-TWJAGUN3.js +187 -0
  36. package/dist/init-TWJAGUN3.js.map +1 -0
  37. package/dist/keys-JBKCYKJU.js +111 -0
  38. package/dist/keys-JBKCYKJU.js.map +1 -0
  39. package/dist/lenses-VZSDFH3D.js +51 -0
  40. package/dist/lenses-VZSDFH3D.js.map +1 -0
  41. package/dist/login-BZ6ZPFHC.js +119 -0
  42. package/dist/login-BZ6ZPFHC.js.map +1 -0
  43. package/dist/logout-VMPRV62T.js +38 -0
  44. package/dist/logout-VMPRV62T.js.map +1 -0
  45. package/dist/members-DVE5FDLZ.js +110 -0
  46. package/dist/members-DVE5FDLZ.js.map +1 -0
  47. package/dist/observe-W346RZBX.js +149 -0
  48. package/dist/observe-W346RZBX.js.map +1 -0
  49. package/dist/orgs-YA3TVA3T.js +67 -0
  50. package/dist/orgs-YA3TVA3T.js.map +1 -0
  51. package/dist/pause-GQ6PKBUA.js +50 -0
  52. package/dist/pause-GQ6PKBUA.js.map +1 -0
  53. package/dist/projects-DMA2AXH3.js +107 -0
  54. package/dist/projects-DMA2AXH3.js.map +1 -0
  55. package/dist/push-3ZK3W2AC.js +145 -0
  56. package/dist/push-3ZK3W2AC.js.map +1 -0
  57. package/dist/resume-KVRPLXZZ.js +50 -0
  58. package/dist/resume-KVRPLXZZ.js.map +1 -0
  59. package/dist/run-IR5B4AE3.js +375 -0
  60. package/dist/run-IR5B4AE3.js.map +1 -0
  61. package/dist/sources-S52HUWRK.js +170 -0
  62. package/dist/sources-S52HUWRK.js.map +1 -0
  63. package/dist/status-AUECH6RX.js +130 -0
  64. package/dist/status-AUECH6RX.js.map +1 -0
  65. package/dist/stream-V7RGHTPR.js +344 -0
  66. package/dist/stream-V7RGHTPR.js.map +1 -0
  67. package/dist/sync-NRTC3WX4.js +68 -0
  68. package/dist/sync-NRTC3WX4.js.map +1 -0
  69. package/dist/whoami-EQGW6V5D.js +50 -0
  70. package/dist/whoami-EQGW6V5D.js.map +1 -0
  71. package/dist/wizard-QLAR33T2.js +306 -0
  72. package/dist/wizard-QLAR33T2.js.map +1 -0
  73. package/package.json +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/envs.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { Environment, CreateEnvResponse } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { projectPath } from '../lib/env-path.js'\nimport { success, error, info, bold, dim, table, newline } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\nexport default defineCommand({\n meta: { name: 'envs', description: 'Manage environments' },\n subCommands: {\n list: defineCommand({\n meta: { name: 'list', description: 'List environments in the current project' },\n async run() {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { environments } = await api.get<{ environments: Environment[] }>(`${projectPath(ctx)}/envs`)\n if (environments.length === 0) {\n newline()\n bold('No environments found.')\n return\n }\n table(\n ['Slug', 'Name'],\n environments.map((e) => [e.slug, e.name]),\n )\n },\n }),\n\n create: defineCommand({\n meta: { name: 'create', description: 'Create a new environment' },\n args: {\n name: { type: 'string', description: 'Environment name', required: true },\n slug: { type: 'string', description: 'Environment slug', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const result = await api.post<CreateEnvResponse>(`${projectPath(ctx)}/envs`, { name: args.name, slug: args.slug })\n success(`Environment \"${args.name}\" (${args.slug}) created.`)\n newline()\n if (result.keys && result.keys.length > 0) {\n bold('API Keys:')\n for (const k of result.keys) {\n info(` ${k.type}: ${k.key}`)\n }\n newline()\n dim('Save these keys — they will not be shown again.')\n }\n },\n }),\n\n delete: defineCommand({\n meta: { name: 'delete', description: 'Delete an environment' },\n args: {\n env: { type: 'string', description: 'Environment slug to delete', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const ok = await confirm(\n `Delete environment \"${args.env}\" and all its data? This cannot be undone.`,\n )\n if (!ok) return\n const api = await createApiClient()\n await api.del(`${projectPath(ctx)}/envs/${args.env}`)\n success(`Environment \"${args.env}\" deleted.`)\n },\n }),\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAQ9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,sBAAsB;AAAA,EACzD,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,2CAA2C;AAAA,MAC9E,MAAM,MAAM;AACV,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,EAAE,aAAa,IAAI,MAAM,IAAI,IAAqC,GAAG,YAAY,GAAG,CAAC,OAAO;AAClG,YAAI,aAAa,WAAW,GAAG;AAC7B,kBAAQ;AACR,eAAK,wBAAwB;AAC7B;AAAA,QACF;AACA;AAAA,UACE,CAAC,QAAQ,MAAM;AAAA,UACf,aAAa,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MAChE,MAAM;AAAA,QACJ,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,QACxE,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,MAC1E;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,SAAS,MAAM,IAAI,KAAwB,GAAG,YAAY,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AACjH,gBAAQ,gBAAgB,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY;AAC5D,gBAAQ;AACR,YAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,eAAK,WAAW;AAChB,qBAAW,KAAK,OAAO,MAAM;AAC3B,iBAAK,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE;AAAA,UAC9B;AACA,kBAAQ;AACR,cAAI,sDAAiD;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,MAC7D,MAAM;AAAA,QACJ,KAAK,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,KAAK;AAAA,MACnF;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,KAAK,MAAM;AAAA,UACf,uBAAuB,KAAK,GAAG;AAAA,QACjC;AACA,YAAI,CAAC,GAAI;AACT,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,IAAI,IAAI,GAAG,YAAY,GAAG,CAAC,SAAS,KAAK,GAAG,EAAE;AACpD,gBAAQ,gBAAgB,KAAK,GAAG,YAAY;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ loadContext
4
+ } from "./chunk-QMF7LD67.js";
5
+ import {
6
+ confirm
7
+ } from "./chunk-QXIVJY7K.js";
8
+ import {
9
+ createApiClient
10
+ } from "./chunk-T3UROBMA.js";
11
+ import "./chunk-7TA63VHV.js";
12
+ import {
13
+ dim,
14
+ error,
15
+ info,
16
+ success,
17
+ warn
18
+ } from "./chunk-WZYOSGN3.js";
19
+
20
+ // src/commands/export.ts
21
+ import { defineCommand } from "citty";
22
+ import { existsSync, writeFileSync } from "fs";
23
+ import { resolve } from "path";
24
+ var export_default = defineCommand({
25
+ meta: { name: "export", description: "Export remote config to a local file" },
26
+ subCommands: {
27
+ config: defineCommand({
28
+ meta: { name: "config", description: "Export remote SemiLayer config to sl.config.ts" },
29
+ args: {
30
+ output: {
31
+ type: "string",
32
+ alias: "o",
33
+ description: "Output file path (default: sl.config.ts)"
34
+ }
35
+ },
36
+ async run({ args }) {
37
+ try {
38
+ const ctx = await loadContext();
39
+ if (!ctx) {
40
+ error("No .semilayerrc found. Run `semilayer init` first.");
41
+ process.exitCode = 1;
42
+ return;
43
+ }
44
+ const api = await createApiClient();
45
+ const exportPath = `/v1/orgs/${ctx.orgSlug}/projects/${ctx.projectSlug}/envs/${ctx.envSlug}/config/export`;
46
+ const { config } = await api.get(exportPath);
47
+ const outputPath = resolve(
48
+ typeof args.output === "string" ? args.output : "sl.config.ts"
49
+ );
50
+ if (existsSync(outputPath)) {
51
+ warn(`File exists: ${dim(outputPath)}`);
52
+ const ok = await confirm("Overwrite?");
53
+ if (!ok) {
54
+ info("Aborted.");
55
+ return;
56
+ }
57
+ }
58
+ const content = generateConfigFile(config);
59
+ writeFileSync(outputPath, content, "utf-8");
60
+ success(`Config exported to ${dim(outputPath)}`);
61
+ info("Note: Source credentials are omitted \u2014 configure them separately.");
62
+ } catch (err) {
63
+ error(err.message);
64
+ process.exitCode = 1;
65
+ }
66
+ }
67
+ })
68
+ }
69
+ });
70
+ function generateConfigFile(config) {
71
+ const json = JSON.stringify(config, null, 2);
72
+ return `// Exported from SemiLayer remote \u2014 source credentials omitted
73
+ import { defineConfig } from '@semilayer/core'
74
+
75
+ export default defineConfig(${json})
76
+ `;
77
+ }
78
+ export {
79
+ export_default as default
80
+ };
81
+ //# sourceMappingURL=export-YRFR3JH2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/export.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { SemiLayerConfig } from '@semilayer/core'\nimport { loadContext } from '../lib/context.js'\nimport { createApiClient } from '../lib/api.js'\nimport { success, error, info, warn, dim } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\nexport default defineCommand({\n meta: { name: 'export', description: 'Export remote config to a local file' },\n subCommands: {\n config: defineCommand({\n meta: { name: 'config', description: 'Export remote SemiLayer config to sl.config.ts' },\n args: {\n output: {\n type: 'string',\n alias: 'o',\n description: 'Output file path (default: sl.config.ts)',\n },\n },\n async run({ args }) {\n try {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n\n const api = await createApiClient()\n const exportPath = `/v1/orgs/${ctx.orgSlug}/projects/${ctx.projectSlug}/envs/${ctx.envSlug}/config/export`\n const { config } = await api.get<{ config: SemiLayerConfig }>(exportPath)\n\n const outputPath = resolve(\n typeof args.output === 'string' ? args.output : 'sl.config.ts',\n )\n\n // Safety: confirm before overwriting\n if (existsSync(outputPath)) {\n warn(`File exists: ${dim(outputPath)}`)\n const ok = await confirm('Overwrite?')\n if (!ok) {\n info('Aborted.')\n return\n }\n }\n\n // Generate TypeScript config file\n const content = generateConfigFile(config)\n writeFileSync(outputPath, content, 'utf-8')\n\n success(`Config exported to ${dim(outputPath)}`)\n info('Note: Source credentials are omitted — configure them separately.')\n } catch (err) {\n error((err as Error).message)\n process.exitCode = 1\n }\n },\n }),\n },\n})\n\nfunction generateConfigFile(config: SemiLayerConfig): string {\n const json = JSON.stringify(config, null, 2)\n return `// Exported from SemiLayer remote — source credentials omitted\nimport { defineConfig } from '@semilayer/core'\n\nexport default defineConfig(${json})\n`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,YAAY,qBAAqB;AAC1C,SAAS,eAAe;AAOxB,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,EAC5E,aAAa;AAAA,IACX,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,iDAAiD;AAAA,MACtF,MAAM;AAAA,QACJ,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAI;AACF,gBAAM,MAAM,MAAM,YAAY;AAC9B,cAAI,CAAC,KAAK;AACR,kBAAM,oDAAoD;AAC1D,oBAAQ,WAAW;AACnB;AAAA,UACF;AAEA,gBAAM,MAAM,MAAM,gBAAgB;AAClC,gBAAM,aAAa,YAAY,IAAI,OAAO,aAAa,IAAI,WAAW,SAAS,IAAI,OAAO;AAC1F,gBAAM,EAAE,OAAO,IAAI,MAAM,IAAI,IAAiC,UAAU;AAExE,gBAAM,aAAa;AAAA,YACjB,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,UAClD;AAGA,cAAI,WAAW,UAAU,GAAG;AAC1B,iBAAK,gBAAgB,IAAI,UAAU,CAAC,EAAE;AACtC,kBAAM,KAAK,MAAM,QAAQ,YAAY;AACrC,gBAAI,CAAC,IAAI;AACP,mBAAK,UAAU;AACf;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,UAAU,mBAAmB,MAAM;AACzC,wBAAc,YAAY,SAAS,OAAO;AAE1C,kBAAQ,sBAAsB,IAAI,UAAU,CAAC,EAAE;AAC/C,eAAK,wEAAmE;AAAA,QAC1E,SAAS,KAAK;AACZ,gBAAO,IAAc,OAAO;AAC5B,kBAAQ,WAAW;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAED,SAAS,mBAAmB,QAAiC;AAC3D,QAAM,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAC3C,SAAO;AAAA;AAAA;AAAA,8BAGqB,IAAI;AAAA;AAElC;","names":[]}
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ loadConfig
4
+ } from "./chunk-NIDLPHWY.js";
5
+ import {
6
+ dim,
7
+ error,
8
+ info,
9
+ success
10
+ } from "./chunk-WZYOSGN3.js";
11
+
12
+ // src/commands/generate.ts
13
+ import { defineCommand } from "citty";
14
+ var generate_default = defineCommand({
15
+ meta: { name: "generate", description: "Generate the typed Beam client" },
16
+ args: {
17
+ out: {
18
+ type: "string",
19
+ description: "Output directory",
20
+ default: "./generated/semilayer"
21
+ }
22
+ },
23
+ async run({ args }) {
24
+ try {
25
+ const { config, configPath } = await loadConfig();
26
+ info(`Config: ${dim(configPath)}`);
27
+ const { generate } = await import("@semilayer/codegen");
28
+ const result = await generate({ config, outDir: args.out, write: true });
29
+ success(
30
+ `Generated ${result.files.length} files for ${result.lenses.length} lenses (${result.lenses.join(", ")}) in ${result.durationMs}ms`
31
+ );
32
+ } catch (err) {
33
+ error(err.message);
34
+ process.exitCode = 1;
35
+ }
36
+ }
37
+ });
38
+ export {
39
+ generate_default as default
40
+ };
41
+ //# sourceMappingURL=generate-QUETX3TN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport { loadConfig } from '../lib/config-loader.js'\nimport { success, error, info, dim } from '../lib/output.js'\n\nexport default defineCommand({\n meta: { name: 'generate', description: 'Generate the typed Beam client' },\n args: {\n out: {\n type: 'string',\n description: 'Output directory',\n default: './generated/semilayer',\n },\n },\n async run({ args }) {\n try {\n const { config, configPath } = await loadConfig()\n info(`Config: ${dim(configPath)}`)\n\n const { generate } = await import('@semilayer/codegen')\n const result = await generate({ config, outDir: args.out, write: true })\n\n success(\n `Generated ${result.files.length} files for ${result.lenses.length} lenses ` +\n `(${result.lenses.join(', ')}) in ${result.durationMs}ms`,\n )\n } catch (err) {\n error((err as Error).message)\n process.exitCode = 1\n }\n },\n})\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAI9B,IAAO,mBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,YAAY,aAAa,iCAAiC;AAAA,EACxE,MAAM;AAAA,IACJ,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AACF,YAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,WAAW;AAChD,WAAK,WAAW,IAAI,UAAU,CAAC,EAAE;AAEjC,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,oBAAoB;AACtD,YAAM,SAAS,MAAM,SAAS,EAAE,QAAQ,QAAQ,KAAK,KAAK,OAAO,KAAK,CAAC;AAEvE;AAAA,QACE,aAAa,OAAO,MAAM,MAAM,cAAc,OAAO,OAAO,MAAM,YAC5D,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,UAAU;AAAA,MACzD;AAAA,IACF,SAAS,KAAK;AACZ,YAAO,IAAc,OAAO;AAC5B,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,43 @@
1
+ import { SemiLayerConfig } from '@semilayer/core';
2
+
3
+ interface Credentials {
4
+ accessToken: string;
5
+ refreshToken: string;
6
+ expiresAt: string;
7
+ email: string;
8
+ serviceUrl: string;
9
+ }
10
+ declare function credentialsPath(): string;
11
+ declare function loadCredentials(): Promise<Credentials | null>;
12
+ declare function saveCredentials(creds: Credentials): Promise<void>;
13
+ declare function clearCredentials(): Promise<void>;
14
+
15
+ interface ProjectContext {
16
+ orgSlug: string;
17
+ projectSlug: string;
18
+ envSlug: string;
19
+ serviceUrl: string;
20
+ }
21
+ declare function findContextFile(cwd?: string): string | null;
22
+ declare function loadContext(cwd?: string): Promise<ProjectContext | null>;
23
+ declare function saveContext(ctx: ProjectContext, cwd?: string): Promise<void>;
24
+
25
+ interface ApiClient {
26
+ get<T>(path: string): Promise<T>;
27
+ post<T>(path: string, body?: unknown): Promise<T>;
28
+ patch<T>(path: string, body?: unknown): Promise<T>;
29
+ put<T>(path: string, body?: unknown): Promise<T>;
30
+ del<T>(path: string): Promise<T>;
31
+ serviceUrl: string;
32
+ }
33
+ declare function createApiClient(): Promise<ApiClient>;
34
+
35
+ interface LoadedConfig {
36
+ config: SemiLayerConfig;
37
+ configPath: string;
38
+ }
39
+ declare function loadConfig(cwd?: string): Promise<LoadedConfig>;
40
+
41
+ declare const VERSION = "0.0.0";
42
+
43
+ export { type ApiClient, type Credentials, type LoadedConfig, type ProjectContext, VERSION, clearCredentials, createApiClient, credentialsPath, findContextFile, loadConfig, loadContext, loadCredentials, saveContext, saveCredentials };
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ findContextFile,
4
+ loadContext,
5
+ saveContext
6
+ } from "./chunk-QMF7LD67.js";
7
+ import {
8
+ createApiClient
9
+ } from "./chunk-T3UROBMA.js";
10
+ import {
11
+ clearCredentials,
12
+ credentialsPath,
13
+ loadCredentials,
14
+ saveCredentials
15
+ } from "./chunk-7TA63VHV.js";
16
+ import {
17
+ loadConfig
18
+ } from "./chunk-NIDLPHWY.js";
19
+
20
+ // src/index.ts
21
+ var VERSION = "0.0.0";
22
+ export {
23
+ VERSION,
24
+ clearCredentials,
25
+ createApiClient,
26
+ credentialsPath,
27
+ findContextFile,
28
+ loadConfig,
29
+ loadContext,
30
+ loadCredentials,
31
+ saveContext,
32
+ saveCredentials
33
+ };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const VERSION = '0.0.0'\n\n// Programmatic exports for consumers who want to use CLI lib modules directly\nexport { loadCredentials, saveCredentials, clearCredentials, credentialsPath } from './lib/credentials.js'\nexport type { Credentials } from './lib/credentials.js'\nexport { loadContext, saveContext, findContextFile } from './lib/context.js'\nexport type { ProjectContext } from './lib/context.js'\nexport { createApiClient } from './lib/api.js'\nexport type { ApiClient } from './lib/api.js'\nexport { loadConfig } from './lib/config-loader.js'\nexport type { LoadedConfig } from './lib/config-loader.js'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAO,IAAM,UAAU;","names":[]}
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ saveContext
4
+ } from "./chunk-QMF7LD67.js";
5
+ import {
6
+ confirm,
7
+ input,
8
+ select
9
+ } from "./chunk-QXIVJY7K.js";
10
+ import {
11
+ createApiClient
12
+ } from "./chunk-T3UROBMA.js";
13
+ import "./chunk-7TA63VHV.js";
14
+ import {
15
+ bold,
16
+ dim,
17
+ error,
18
+ info,
19
+ label,
20
+ newline,
21
+ success
22
+ } from "./chunk-WZYOSGN3.js";
23
+
24
+ // src/commands/init.ts
25
+ import { defineCommand } from "citty";
26
+ import { existsSync } from "fs";
27
+ import { writeFile } from "fs/promises";
28
+ import { join } from "path";
29
+ var CONFIG_NAMES = ["sl.config.ts", "sl.config.js", "semilayer.config.ts", "semilayer.config.js"];
30
+ var STARTER_CONFIG = `import { defineConfig } from '@semilayer/core'
31
+
32
+ export default defineConfig({
33
+ stack: '{{STACK}}',
34
+ sources: {
35
+ main: {
36
+ bridge: '@semilayer/bridge-postgres',
37
+ },
38
+ },
39
+ lenses: {
40
+ // Define your lenses here. Example:
41
+ //
42
+ // articles: {
43
+ // source: 'main',
44
+ // table: 'articles',
45
+ // fields: {
46
+ // id: { type: 'number', primaryKey: true },
47
+ // title: { type: 'text' },
48
+ // body: { type: 'text' },
49
+ // },
50
+ // facets: {
51
+ // search: { fields: ['title', 'body'] },
52
+ // },
53
+ // },
54
+ },
55
+ })
56
+ `;
57
+ var init_default = defineCommand({
58
+ meta: {
59
+ name: "init",
60
+ description: "Initialize project context, config, and API keys"
61
+ },
62
+ args: {
63
+ "service-url": {
64
+ type: "string",
65
+ description: "Service API URL"
66
+ }
67
+ },
68
+ async run({ args }) {
69
+ try {
70
+ const api = await createApiClient();
71
+ const serviceUrl = args["service-url"] || api.serviceUrl;
72
+ const me = await api.get("/auth/me");
73
+ if (me.orgs.length === 0) {
74
+ error("No organizations found. Run `semilayer orgs create` first.");
75
+ process.exitCode = 1;
76
+ return;
77
+ }
78
+ newline();
79
+ let orgSlug;
80
+ if (me.orgs.length === 1) {
81
+ orgSlug = me.orgs[0].slug;
82
+ info(`Org: ${bold(orgSlug)}`);
83
+ } else {
84
+ console.log(` ${bold("Select an organization:")}`);
85
+ orgSlug = await select("Choice:", me.orgs.map((o) => o.slug));
86
+ }
87
+ newline();
88
+ const { projects } = await api.get(`/v1/orgs/${orgSlug}/projects`);
89
+ let projectSlug;
90
+ let createdKeys = [];
91
+ if (projects.length === 0) {
92
+ info("No projects yet. Let's create one.");
93
+ const name = await input("Project name", "My Project");
94
+ const slug = await input("Project slug", name.toLowerCase().replace(/[^a-z0-9]+/g, "-"));
95
+ const result = await api.post(`/v1/orgs/${orgSlug}/projects`, {
96
+ name,
97
+ slug
98
+ });
99
+ projectSlug = result.project.slug;
100
+ createdKeys = result.keys ?? [];
101
+ success(`Created project ${bold(projectSlug)} with default environment`);
102
+ } else if (projects.length === 1) {
103
+ projectSlug = projects[0].slug;
104
+ info(`Project: ${bold(projectSlug)}`);
105
+ } else {
106
+ console.log(` ${bold("Select a project:")}`);
107
+ projectSlug = await select("Choice:", projects.map((p) => p.slug));
108
+ }
109
+ newline();
110
+ const { environments } = await api.get(
111
+ `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`
112
+ );
113
+ let envSlug;
114
+ if (environments.length === 0) {
115
+ info("No environments yet. Creating default...");
116
+ const result = await api.post(
117
+ `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`,
118
+ { name: "Development", slug: "development" }
119
+ );
120
+ envSlug = result.environment.slug;
121
+ createdKeys = [...createdKeys, ...result.keys ?? []];
122
+ success(`Created environment ${bold(envSlug)}`);
123
+ } else if (environments.length === 1) {
124
+ envSlug = environments[0].slug;
125
+ info(`Environment: ${bold(envSlug)}`);
126
+ } else {
127
+ console.log(` ${bold("Select an environment:")}`);
128
+ envSlug = await select("Choice:", environments.map((e) => e.slug));
129
+ }
130
+ newline();
131
+ if (createdKeys.length > 0) {
132
+ info("API keys were created with your new project/environment:");
133
+ for (const k of createdKeys) {
134
+ label(k.type === "service" ? "Service key" : "Publishable key", k.key);
135
+ }
136
+ newline();
137
+ console.log(` ${dim("Save these keys \u2014 they won't be shown again.")}`);
138
+ } else {
139
+ const wantKey = await confirm("Generate a new API key?");
140
+ if (wantKey) {
141
+ const envBase = `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs/${envSlug}`;
142
+ const sk = await api.post(`${envBase}/keys`, {
143
+ type: "service",
144
+ label: "CLI-generated"
145
+ });
146
+ newline();
147
+ label("Service key", sk.key);
148
+ console.log(` ${dim("Save this key \u2014 it won't be shown again.")}`);
149
+ }
150
+ }
151
+ newline();
152
+ await saveContext({ orgSlug, projectSlug, envSlug, serviceUrl });
153
+ success("Context saved to .semilayerrc");
154
+ const cwd = process.cwd();
155
+ const hasConfig = CONFIG_NAMES.some((name) => existsSync(join(cwd, name)));
156
+ if (!hasConfig) {
157
+ newline();
158
+ const wantConfig = await confirm("No config file found. Create sl.config.ts?", true);
159
+ if (wantConfig) {
160
+ const stack = projectSlug;
161
+ const content = STARTER_CONFIG.replace("{{STACK}}", stack);
162
+ await writeFile(join(cwd, "sl.config.ts"), content, "utf-8");
163
+ success("Created sl.config.ts");
164
+ info("Edit it to define your lenses, then run `semilayer push`");
165
+ }
166
+ }
167
+ newline();
168
+ info(`${bold("Next steps:")}`);
169
+ if (!hasConfig) {
170
+ info(` 1. Edit sl.config.ts to define your lenses`);
171
+ info(` 2. Run ${bold("semilayer sources connect")} to connect your database`);
172
+ info(` 3. Run ${bold("semilayer push --resume-ingest")} to push and start indexing`);
173
+ info(` 4. Run ${bold("semilayer generate")} to create your typed client`);
174
+ } else {
175
+ info(` 1. Run ${bold("semilayer sources connect")} to connect your database`);
176
+ info(` 2. Run ${bold("semilayer push --resume-ingest")} to push and start indexing`);
177
+ }
178
+ } catch (err) {
179
+ error(err.message);
180
+ process.exitCode = 1;
181
+ }
182
+ }
183
+ });
184
+ export {
185
+ init_default as default
186
+ };
187
+ //# sourceMappingURL=init-TWJAGUN3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type {\n MeResponse,\n Project,\n Environment,\n CreateProjectResponse,\n CreateEnvResponse,\n ApiKeyInfo,\n} from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { saveContext } from '../lib/context.js'\nimport { success, error, info, bold, dim, newline, label } from '../lib/output.js'\nimport { select, input, confirm } from '../lib/prompt.js'\nimport { existsSync } from 'node:fs'\nimport { writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst CONFIG_NAMES = ['sl.config.ts', 'sl.config.js', 'semilayer.config.ts', 'semilayer.config.js']\n\nconst STARTER_CONFIG = `import { defineConfig } from '@semilayer/core'\n\nexport default defineConfig({\n stack: '{{STACK}}',\n sources: {\n main: {\n bridge: '@semilayer/bridge-postgres',\n },\n },\n lenses: {\n // Define your lenses here. Example:\n //\n // articles: {\n // source: 'main',\n // table: 'articles',\n // fields: {\n // id: { type: 'number', primaryKey: true },\n // title: { type: 'text' },\n // body: { type: 'text' },\n // },\n // facets: {\n // search: { fields: ['title', 'body'] },\n // },\n // },\n },\n})\n`\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize project context, config, and API keys',\n },\n args: {\n 'service-url': {\n type: 'string',\n description: 'Service API URL',\n },\n },\n async run({ args }) {\n try {\n const api = await createApiClient()\n const serviceUrl = args['service-url'] || api.serviceUrl\n\n const me = await api.get<MeResponse>('/auth/me')\n\n if (me.orgs.length === 0) {\n error('No organizations found. Run `semilayer orgs create` first.')\n process.exitCode = 1\n return\n }\n\n // ── Step 1: Select org ──────────────────────────────────────\n newline()\n let orgSlug: string\n if (me.orgs.length === 1) {\n orgSlug = me.orgs[0]!.slug\n info(`Org: ${bold(orgSlug)}`)\n } else {\n console.log(` ${bold('Select an organization:')}`)\n orgSlug = await select('Choice:', me.orgs.map((o) => o.slug))\n }\n\n // ── Step 2: Select or create project ────────────────────────\n newline()\n const { projects } = await api.get<{ projects: Project[] }>(`/v1/orgs/${orgSlug}/projects`)\n\n let projectSlug: string\n let createdKeys: Array<{ key: string; type: string }> = []\n\n if (projects.length === 0) {\n info('No projects yet. Let\\'s create one.')\n const name = await input('Project name', 'My Project')\n const slug = await input('Project slug', name.toLowerCase().replace(/[^a-z0-9]+/g, '-'))\n\n const result = await api.post<CreateProjectResponse>(`/v1/orgs/${orgSlug}/projects`, {\n name,\n slug,\n })\n projectSlug = result.project.slug\n createdKeys = result.keys ?? []\n success(`Created project ${bold(projectSlug)} with default environment`)\n } else if (projects.length === 1) {\n projectSlug = projects[0]!.slug\n info(`Project: ${bold(projectSlug)}`)\n } else {\n console.log(` ${bold('Select a project:')}`)\n projectSlug = await select('Choice:', projects.map((p) => p.slug))\n }\n\n // ── Step 3: Select or create environment ────────────────────\n newline()\n const { environments } = await api.get<{ environments: Environment[] }>(\n `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`,\n )\n\n let envSlug: string\n\n if (environments.length === 0) {\n info('No environments yet. Creating default...')\n const result = await api.post<CreateEnvResponse>(\n `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`,\n { name: 'Development', slug: 'development' },\n )\n envSlug = result.environment.slug\n createdKeys = [...createdKeys, ...(result.keys ?? [])]\n success(`Created environment ${bold(envSlug)}`)\n } else if (environments.length === 1) {\n envSlug = environments[0]!.slug\n info(`Environment: ${bold(envSlug)}`)\n } else {\n console.log(` ${bold('Select an environment:')}`)\n envSlug = await select('Choice:', environments.map((e) => e.slug))\n }\n\n // ── Step 4: Optionally generate API key ─────────────────────\n newline()\n if (createdKeys.length > 0) {\n info('API keys were created with your new project/environment:')\n for (const k of createdKeys) {\n label(k.type === 'service' ? 'Service key' : 'Publishable key', k.key)\n }\n newline()\n console.log(` ${dim('Save these keys — they won\\'t be shown again.')}`)\n } else {\n const wantKey = await confirm('Generate a new API key?')\n if (wantKey) {\n const envBase = `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs/${envSlug}`\n const sk = await api.post<ApiKeyInfo>(`${envBase}/keys`, {\n type: 'service',\n label: 'CLI-generated',\n })\n newline()\n label('Service key', sk.key)\n console.log(` ${dim('Save this key — it won\\'t be shown again.')}`)\n }\n }\n\n // ── Step 5: Save .semilayerrc ───────────────────────────────\n newline()\n await saveContext({ orgSlug, projectSlug, envSlug, serviceUrl })\n success('Context saved to .semilayerrc')\n\n // ── Step 6: Scaffold sl.config.ts if missing ────────────────\n const cwd = process.cwd()\n const hasConfig = CONFIG_NAMES.some((name) => existsSync(join(cwd, name)))\n\n if (!hasConfig) {\n newline()\n const wantConfig = await confirm('No config file found. Create sl.config.ts?', true)\n if (wantConfig) {\n const stack = projectSlug\n const content = STARTER_CONFIG.replace('{{STACK}}', stack)\n await writeFile(join(cwd, 'sl.config.ts'), content, 'utf-8')\n success('Created sl.config.ts')\n info('Edit it to define your lenses, then run `semilayer push`')\n }\n }\n\n // ── Summary ─────────────────────────────────────────────────\n newline()\n info(`${bold('Next steps:')}`)\n if (!hasConfig) {\n info(` 1. Edit sl.config.ts to define your lenses`)\n info(` 2. Run ${bold('semilayer sources connect')} to connect your database`)\n info(` 3. Run ${bold('semilayer push --resume-ingest')} to push and start indexing`)\n info(` 4. Run ${bold('semilayer generate')} to create your typed client`)\n } else {\n info(` 1. Run ${bold('semilayer sources connect')} to connect your database`)\n info(` 2. Run ${bold('semilayer push --resume-ingest')} to push and start indexing`)\n }\n } catch (err) {\n error((err as Error).message)\n process.exitCode = 1\n }\n },\n})\n"],"mappings":"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","names":[]}
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ envPath
4
+ } from "./chunk-ALA4X7UU.js";
5
+ import {
6
+ loadContext
7
+ } from "./chunk-QMF7LD67.js";
8
+ import {
9
+ confirm
10
+ } from "./chunk-QXIVJY7K.js";
11
+ import {
12
+ createApiClient
13
+ } from "./chunk-T3UROBMA.js";
14
+ import "./chunk-7TA63VHV.js";
15
+ import {
16
+ bold,
17
+ error,
18
+ info,
19
+ newline,
20
+ success,
21
+ table
22
+ } from "./chunk-WZYOSGN3.js";
23
+
24
+ // src/commands/keys.ts
25
+ import { defineCommand } from "citty";
26
+ var keys_default = defineCommand({
27
+ meta: { name: "keys", description: "Manage API keys" },
28
+ subCommands: {
29
+ list: defineCommand({
30
+ meta: { name: "list", description: "List API keys for the current environment" },
31
+ async run() {
32
+ const ctx = await loadContext();
33
+ if (!ctx) {
34
+ error("No .semilayerrc found. Run `semilayer init` first.");
35
+ process.exitCode = 1;
36
+ return;
37
+ }
38
+ const api = await createApiClient();
39
+ const { keys } = await api.get(`${envPath(ctx)}/keys`);
40
+ if (keys.length === 0) {
41
+ newline();
42
+ bold("No API keys found.");
43
+ return;
44
+ }
45
+ table(
46
+ ["Key", "Type", "Label"],
47
+ keys.map((k) => [k.key, k.type, k.label ?? ""])
48
+ );
49
+ }
50
+ }),
51
+ create: defineCommand({
52
+ meta: { name: "create", description: "Create a new API key" },
53
+ args: {
54
+ type: {
55
+ type: "string",
56
+ description: 'Key type: "service" or "publishable"',
57
+ required: true
58
+ },
59
+ label: { type: "string", description: "Optional label for the key" }
60
+ },
61
+ async run({ args }) {
62
+ const ctx = await loadContext();
63
+ if (!ctx) {
64
+ error("No .semilayerrc found. Run `semilayer init` first.");
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ if (args.type !== "service" && args.type !== "publishable") {
69
+ error('Key type must be "service" or "publishable".');
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ const api = await createApiClient();
74
+ const result = await api.post(`${envPath(ctx)}/keys`, {
75
+ type: args.type,
76
+ ...args.label ? { label: args.label } : {}
77
+ });
78
+ newline();
79
+ bold("Your new API key:");
80
+ newline();
81
+ info(` ${result.key}`);
82
+ newline();
83
+ bold("Save this key now \u2014 it will not be shown again.");
84
+ newline();
85
+ }
86
+ }),
87
+ revoke: defineCommand({
88
+ meta: { name: "revoke", description: "Revoke an API key" },
89
+ args: {
90
+ "key-id": { type: "string", description: "Key ID to revoke", required: true }
91
+ },
92
+ async run({ args }) {
93
+ const ctx = await loadContext();
94
+ if (!ctx) {
95
+ error("No .semilayerrc found. Run `semilayer init` first.");
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ const ok = await confirm("Revoke this API key? Any services using it will lose access.");
100
+ if (!ok) return;
101
+ const api = await createApiClient();
102
+ await api.del(`${envPath(ctx)}/keys/${args["key-id"]}`);
103
+ success("API key revoked.");
104
+ }
105
+ })
106
+ }
107
+ });
108
+ export {
109
+ keys_default as default
110
+ };
111
+ //# sourceMappingURL=keys-JBKCYKJU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/keys.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { ApiKeyInfo } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { envPath } from '../lib/env-path.js'\nimport { success, error, info, bold, table, newline } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\nexport default defineCommand({\n meta: { name: 'keys', description: 'Manage API keys' },\n subCommands: {\n list: defineCommand({\n meta: { name: 'list', description: 'List API keys for the current environment' },\n async run() {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { keys } = await api.get<{ keys: ApiKeyInfo[] }>(`${envPath(ctx)}/keys`)\n if (keys.length === 0) {\n newline()\n bold('No API keys found.')\n return\n }\n table(\n ['Key', 'Type', 'Label'],\n keys.map((k) => [k.key, k.type, k.label ?? '']),\n )\n },\n }),\n\n create: defineCommand({\n meta: { name: 'create', description: 'Create a new API key' },\n args: {\n type: {\n type: 'string',\n description: 'Key type: \"service\" or \"publishable\"',\n required: true,\n },\n label: { type: 'string', description: 'Optional label for the key' },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n if (args.type !== 'service' && args.type !== 'publishable') {\n error('Key type must be \"service\" or \"publishable\".')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const result = await api.post<{ key: string; type: string }>(`${envPath(ctx)}/keys`, {\n type: args.type,\n ...(args.label ? { label: args.label } : {}),\n })\n newline()\n bold('Your new API key:')\n newline()\n info(` ${result.key}`)\n newline()\n bold('Save this key now — it will not be shown again.')\n newline()\n },\n }),\n\n revoke: defineCommand({\n meta: { name: 'revoke', description: 'Revoke an API key' },\n args: {\n 'key-id': { type: 'string', description: 'Key ID to revoke', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const ok = await confirm('Revoke this API key? Any services using it will lose access.')\n if (!ok) return\n const api = await createApiClient()\n await api.del(`${envPath(ctx)}/keys/${args['key-id']}`)\n success('API key revoked.')\n },\n }),\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAQ9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,kBAAkB;AAAA,EACrD,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,4CAA4C;AAAA,MAC/E,MAAM,MAAM;AACV,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,EAAE,KAAK,IAAI,MAAM,IAAI,IAA4B,GAAG,QAAQ,GAAG,CAAC,OAAO;AAC7E,YAAI,KAAK,WAAW,GAAG;AACrB,kBAAQ;AACR,eAAK,oBAAoB;AACzB;AAAA,QACF;AACA;AAAA,UACE,CAAC,OAAO,QAAQ,OAAO;AAAA,UACvB,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MAC5D,MAAM;AAAA,QACJ,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,QACZ;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,MACrE;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,YAAI,KAAK,SAAS,aAAa,KAAK,SAAS,eAAe;AAC1D,gBAAM,8CAA8C;AACpD,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,SAAS,MAAM,IAAI,KAAoC,GAAG,QAAQ,GAAG,CAAC,SAAS;AAAA,UACnF,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,QAC5C,CAAC;AACD,gBAAQ;AACR,aAAK,mBAAmB;AACxB,gBAAQ;AACR,aAAK,KAAK,OAAO,GAAG,EAAE;AACtB,gBAAQ;AACR,aAAK,sDAAiD;AACtD,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,MACzD,MAAM;AAAA,QACJ,UAAU,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,MAC9E;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,KAAK,MAAM,QAAQ,8DAA8D;AACvF,YAAI,CAAC,GAAI;AACT,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,EAAE;AACtD,gBAAQ,kBAAkB;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ envPath
4
+ } from "./chunk-ALA4X7UU.js";
5
+ import {
6
+ loadContext
7
+ } from "./chunk-QMF7LD67.js";
8
+ import {
9
+ createApiClient
10
+ } from "./chunk-T3UROBMA.js";
11
+ import "./chunk-7TA63VHV.js";
12
+ import {
13
+ bold,
14
+ error,
15
+ newline,
16
+ table
17
+ } from "./chunk-WZYOSGN3.js";
18
+
19
+ // src/commands/lenses.ts
20
+ import { defineCommand } from "citty";
21
+ var lenses_default = defineCommand({
22
+ meta: { name: "lenses", description: "Manage lenses" },
23
+ subCommands: {
24
+ list: defineCommand({
25
+ meta: { name: "list", description: "List lenses in the current environment" },
26
+ async run() {
27
+ const ctx = await loadContext();
28
+ if (!ctx) {
29
+ error("No .semilayerrc found. Run `semilayer init` first.");
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const api = await createApiClient();
34
+ const { lenses } = await api.get(`${envPath(ctx)}/lenses`);
35
+ if (lenses.length === 0) {
36
+ newline();
37
+ bold("No lenses found.");
38
+ return;
39
+ }
40
+ table(
41
+ ["Name", "Status", "Created"],
42
+ lenses.map((l) => [l.name, l.status, l.createdAt])
43
+ );
44
+ }
45
+ })
46
+ }
47
+ });
48
+ export {
49
+ lenses_default as default
50
+ };
51
+ //# sourceMappingURL=lenses-VZSDFH3D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/lenses.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { Lens } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { envPath } from '../lib/env-path.js'\nimport { error, bold, table, newline } from '../lib/output.js'\n\nexport default defineCommand({\n meta: { name: 'lenses', description: 'Manage lenses' },\n subCommands: {\n list: defineCommand({\n meta: { name: 'list', description: 'List lenses in the current environment' },\n async run() {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { lenses } = await api.get<{ lenses: Lens[] }>(`${envPath(ctx)}/lenses`)\n if (lenses.length === 0) {\n newline()\n bold('No lenses found.')\n return\n }\n table(\n ['Name', 'Status', 'Created'],\n lenses.map((l) => [l.name, l.status, l.createdAt]),\n )\n },\n }),\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAO9B,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,gBAAgB;AAAA,EACrD,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,yCAAyC;AAAA,MAC5E,MAAM,MAAM;AACV,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,EAAE,OAAO,IAAI,MAAM,IAAI,IAAwB,GAAG,QAAQ,GAAG,CAAC,SAAS;AAC7E,YAAI,OAAO,WAAW,GAAG;AACvB,kBAAQ;AACR,eAAK,kBAAkB;AACvB;AAAA,QACF;AACA;AAAA,UACE,CAAC,QAAQ,UAAU,SAAS;AAAA,UAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}