@polyhedral/cli 0.1.0-beta.1 → 0.1.0-beta.3

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 (62) hide show
  1. package/README.md +35 -10
  2. package/dist/commands/delete.d.ts +4 -0
  3. package/dist/commands/delete.d.ts.map +1 -0
  4. package/dist/commands/delete.js +36 -0
  5. package/dist/commands/delete.js.map +1 -0
  6. package/dist/commands/dev.d.ts.map +1 -1
  7. package/dist/commands/dev.js +29 -9
  8. package/dist/commands/dev.js.map +1 -1
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +18 -1
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/list.d.ts.map +1 -1
  13. package/dist/commands/list.js +12 -0
  14. package/dist/commands/list.js.map +1 -1
  15. package/dist/commands/login.d.ts.map +1 -1
  16. package/dist/commands/login.js +14 -0
  17. package/dist/commands/login.js.map +1 -1
  18. package/dist/commands/logout.d.ts +2 -0
  19. package/dist/commands/logout.d.ts.map +1 -0
  20. package/dist/commands/logout.js +22 -0
  21. package/dist/commands/logout.js.map +1 -0
  22. package/dist/commands/pull.d.ts +3 -1
  23. package/dist/commands/pull.d.ts.map +1 -1
  24. package/dist/commands/pull.js +25 -5
  25. package/dist/commands/pull.js.map +1 -1
  26. package/dist/commands/push.d.ts +9 -1
  27. package/dist/commands/push.d.ts.map +1 -1
  28. package/dist/commands/push.js +69 -11
  29. package/dist/commands/push.js.map +1 -1
  30. package/dist/commands/validate.d.ts.map +1 -1
  31. package/dist/commands/validate.js +17 -9
  32. package/dist/commands/validate.js.map +1 -1
  33. package/dist/commands/versions.d.ts +2 -0
  34. package/dist/commands/versions.d.ts.map +1 -0
  35. package/dist/commands/versions.js +34 -0
  36. package/dist/commands/versions.js.map +1 -0
  37. package/dist/commands/whoami.d.ts +2 -0
  38. package/dist/commands/whoami.d.ts.map +1 -0
  39. package/dist/commands/whoami.js +35 -0
  40. package/dist/commands/whoami.js.map +1 -0
  41. package/dist/index.js +33 -15
  42. package/dist/index.js.map +1 -1
  43. package/dist/lib/api-client.d.ts +9 -1
  44. package/dist/lib/api-client.d.ts.map +1 -1
  45. package/dist/lib/api-client.js +9 -0
  46. package/dist/lib/api-client.js.map +1 -1
  47. package/dist/lib/output.d.ts +10 -0
  48. package/dist/lib/output.d.ts.map +1 -0
  49. package/dist/lib/output.js +21 -0
  50. package/dist/lib/output.js.map +1 -0
  51. package/dist/lib/prompt.d.ts +2 -0
  52. package/dist/lib/prompt.d.ts.map +1 -0
  53. package/dist/lib/prompt.js +16 -0
  54. package/dist/lib/prompt.js.map +1 -0
  55. package/dist/lib/validate-local.d.ts +3 -0
  56. package/dist/lib/validate-local.d.ts.map +1 -0
  57. package/dist/lib/validate-local.js +32 -0
  58. package/dist/lib/validate-local.js.map +1 -0
  59. package/dist/types.d.ts +11 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/package.json +4 -1
  62. package/templates/sheet.jsx +4 -9
package/README.md CHANGED
@@ -26,21 +26,46 @@ polyhedral dev
26
26
 
27
27
  ## Commands
28
28
 
29
- | Command | Description |
30
- | -------------------- | --------------------------------------------------- |
31
- | `polyhedral login` | Authenticate with your API key |
32
- | `polyhedral init` | Scaffold a new template project |
33
- | `polyhedral dev` | Watch file, auto-push on save, open live preview |
34
- | `polyhedral push` | Validate and upload the local template |
35
- | `polyhedral pull` | Download a template to a local file |
36
- | `polyhedral list` | List all your custom sheet templates |
37
- | `polyhedral validate`| Check a template file for syntax errors |
29
+ | Command | Description |
30
+ | --------------------- | ------------------------------------------------ |
31
+ | `polyhedral login` | Authenticate with your API key |
32
+ | `polyhedral logout` | Remove stored credentials |
33
+ | `polyhedral whoami` | Show current login status |
34
+ | `polyhedral init` | Scaffold a new template project |
35
+ | `polyhedral dev` | Watch file, auto-push on save, open live preview |
36
+ | `polyhedral push` | Validate, upload, and publish a new version |
37
+ | `polyhedral pull` | Download a template to a local file |
38
+ | `polyhedral delete` | Delete a template |
39
+ | `polyhedral list` | List all your custom sheet templates |
40
+ | `polyhedral versions` | List version history for a template |
41
+ | `polyhedral validate` | Check a template file for syntax errors (offline)|
42
+
43
+ ### Push Options
44
+
45
+ ```bash
46
+ polyhedral push # Patch bump (default)
47
+ polyhedral push --minor # Minor version bump
48
+ polyhedral push --major --changelog "breaking changes description"
49
+ polyhedral push -f # Skip confirmation prompt
50
+ ```
51
+
52
+ ### Global Options
53
+
54
+ | Flag | Description |
55
+ | ---------- | ----------------------------------------------------- |
56
+ | `--json` | Output structured JSON (skips prompts, useful for CI) |
57
+ | `--version`| Show CLI version |
58
+ | `--help` | Show help |
59
+
60
+ Commands that modify data (`push`, `pull`, `delete`) prompt for confirmation. Use `--force` / `-f` to skip, or `--json` which implies `--force`.
38
61
 
39
62
  ## How It Works
40
63
 
41
64
  Templates are JSX files using the Polyhedral SDK component library. The CLI wraps the [REST API](https://polyhedral.co/developers/api) to manage templates from the terminal.
42
65
 
43
- The `dev` command is the main workflow: it pushes your template, opens the preview page, and watches for file changes. When you save, it validates and pushes automatically. The preview page uses realtime subscriptions, so it updates without a manual refresh.
66
+ The `dev` command is the main workflow: it pushes your template, opens the preview page, and watches for file changes (including `polyhedral.json`). When you save, it validates locally and pushes automatically. The preview page uses realtime subscriptions, so it updates without a manual refresh.
67
+
68
+ Validation runs offline using Babel — no network connection or login required.
44
69
 
45
70
  ## Docs
46
71
 
@@ -0,0 +1,4 @@
1
+ export declare function deleteCommand(id?: string, options?: {
2
+ force?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC7F"}
@@ -0,0 +1,36 @@
1
+ import { requireConfig } from '../lib/config.js';
2
+ import { ApiClient } from '../lib/api-client.js';
3
+ import { tryLoadManifest, saveManifest } from '../lib/manifest.js';
4
+ import { isJsonMode, jsonOutput, log } from '../lib/output.js';
5
+ import { confirm } from '../lib/prompt.js';
6
+ export async function deleteCommand(id, options) {
7
+ const config = await requireConfig();
8
+ const client = new ApiClient(config);
9
+ const manifest = await tryLoadManifest();
10
+ const templateId = id ?? manifest?.templateId;
11
+ if (!templateId) {
12
+ console.error('No template ID provided. Pass an ID or run from a project directory.');
13
+ console.error('Usage: polyhedral delete [id]');
14
+ process.exit(1);
15
+ }
16
+ const template = await client.getTemplate(templateId);
17
+ if (!options?.force) {
18
+ log(`Template: ${template.name} (${templateId})`);
19
+ const ok = await confirm(`Delete "${template.name}"? This cannot be undone. (y/N) `);
20
+ if (!ok) {
21
+ log('Aborted.');
22
+ return;
23
+ }
24
+ }
25
+ await client.deleteTemplate(templateId);
26
+ log(`Deleted template ${templateId}.`);
27
+ if (manifest && manifest.templateId === templateId) {
28
+ delete manifest.templateId;
29
+ await saveManifest(manifest);
30
+ log('Removed templateId from polyhedral.json.');
31
+ }
32
+ if (isJsonMode()) {
33
+ jsonOutput({ success: true, id: templateId });
34
+ }
35
+ }
36
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAW,EAAE,OAA6B;IAC5E,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IAEpC,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAA;IAExC,MAAM,UAAU,GAAG,EAAE,IAAI,QAAQ,EAAE,UAAU,CAAA;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACrF,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IAErD,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,GAAG,CAAC,aAAa,QAAQ,CAAC,IAAI,KAAK,UAAU,GAAG,CAAC,CAAA;QACjD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,QAAQ,CAAC,IAAI,kCAAkC,CAAC,CAAA;QACpF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,GAAG,CAAC,UAAU,CAAC,CAAA;YACf,OAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;IACvC,GAAG,CAAC,oBAAoB,UAAU,GAAG,CAAC,CAAA;IAEtC,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACnD,OAAO,QAAQ,CAAC,UAAU,CAAA;QAC1B,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC5B,GAAG,CAAC,0CAA0C,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAUA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA2ChD"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAWA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDhD"}
@@ -6,11 +6,13 @@ import { ApiClient } from '../lib/api-client.js';
6
6
  import { loadManifest, saveManifest } from '../lib/manifest.js';
7
7
  import { formatValidationError } from '../lib/format.js';
8
8
  import { buildTemplatePayload } from '../lib/template-data.js';
9
+ import { validateLocal } from '../lib/validate-local.js';
9
10
  export async function devCommand() {
10
11
  const config = await requireConfig();
11
12
  const client = new ApiClient(config);
12
- const manifest = await loadManifest();
13
+ let manifest = await loadManifest();
13
14
  const filePath = join(process.cwd(), manifest.file);
15
+ const manifestPath = join(process.cwd(), 'polyhedral.json');
14
16
  console.log('Pushing current version...');
15
17
  const previewUrl = await initialPush(config, client, manifest, filePath);
16
18
  if (!previewUrl) {
@@ -20,19 +22,31 @@ export async function devCommand() {
20
22
  console.log(`\nOpening preview: ${previewUrl}`);
21
23
  const open = (await import('open')).default;
22
24
  await open(previewUrl);
23
- console.log(`\nWatching ${manifest.file} for changes... (Ctrl+C to stop)\n`);
25
+ console.log(`\nWatching ${manifest.file} and polyhedral.json for changes... (Ctrl+C to stop)\n`);
24
26
  let debounceTimer = null;
25
- const watcher = watch(filePath, {
27
+ const watcher = watch([filePath, manifestPath], {
26
28
  ignoreInitial: true,
27
29
  awaitWriteFinish: {
28
30
  stabilityThreshold: 300,
29
31
  pollInterval: 100,
30
32
  },
31
33
  });
32
- watcher.on('change', () => {
34
+ watcher.on('change', (changedPath) => {
33
35
  if (debounceTimer)
34
36
  clearTimeout(debounceTimer);
35
37
  debounceTimer = setTimeout(async () => {
38
+ if (changedPath === manifestPath) {
39
+ const timestamp = new Date().toLocaleTimeString();
40
+ try {
41
+ manifest = await loadManifest();
42
+ console.log(`[${timestamp}] Manifest updated, pushing...`);
43
+ }
44
+ catch (err) {
45
+ const message = err instanceof Error ? err.message : 'Unknown error';
46
+ console.error(`[${timestamp}] Failed to reload manifest: ${message}`);
47
+ return;
48
+ }
49
+ }
36
50
  await pushOnChange(client, manifest, filePath);
37
51
  }, 500);
38
52
  });
@@ -44,9 +58,9 @@ export async function devCommand() {
44
58
  }
45
59
  async function initialPush(config, client, manifest, filePath) {
46
60
  const code = await readFile(filePath, 'utf-8');
47
- const validation = await client.validate(code);
61
+ const validation = await validateLocal(code);
48
62
  if (!validation.valid) {
49
- console.error(`Validation failed: ${formatValidationError(validation)}`);
63
+ console.error(`Syntax error: ${formatValidationError(validation)}`);
50
64
  return undefined;
51
65
  }
52
66
  const data = buildTemplatePayload(manifest, code);
@@ -68,9 +82,9 @@ async function pushOnChange(client, manifest, filePath) {
68
82
  const timestamp = new Date().toLocaleTimeString();
69
83
  try {
70
84
  const code = await readFile(filePath, 'utf-8');
71
- const validation = await client.validate(code);
85
+ const validation = await validateLocal(code);
72
86
  if (!validation.valid) {
73
- console.error(`[${timestamp}] Invalid: ${formatValidationError(validation)}`);
87
+ console.error(`[${timestamp}] Syntax error: ${formatValidationError(validation)}`);
74
88
  return;
75
89
  }
76
90
  const data = buildTemplatePayload(manifest, code);
@@ -79,7 +93,13 @@ async function pushOnChange(client, manifest, filePath) {
79
93
  }
80
94
  catch (err) {
81
95
  const message = err instanceof Error ? err.message : 'Unknown error';
82
- console.error(`[${timestamp}] Push failed: ${message}`);
96
+ const isServerError = (err && typeof err === 'object' && 'status' in err) || message.includes('status');
97
+ if (isServerError) {
98
+ console.error(`[${timestamp}] Push failed (server): ${message}`);
99
+ }
100
+ else {
101
+ console.error(`[${timestamp}] Push failed (network): ${message}. Check your connection and try again.`);
102
+ }
83
103
  }
84
104
  }
85
105
  //# sourceMappingURL=dev.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC7D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD7D"}
@@ -1,7 +1,8 @@
1
- import { mkdir, copyFile, access } from 'node:fs/promises';
1
+ import { mkdir, copyFile, access, readFile, writeFile } from 'node:fs/promises';
2
2
  import { join, dirname, resolve, basename } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
  import { saveManifest } from '../lib/manifest.js';
5
+ import { isJsonMode, jsonOutput, log } from '../lib/output.js';
5
6
  const __dirname = dirname(fileURLToPath(import.meta.url));
6
7
  export async function initCommand(dir) {
7
8
  const targetDir = dir ? resolve(dir) : process.cwd();
@@ -27,11 +28,27 @@ export async function initCommand(dir) {
27
28
  const templateSrc = join(__dirname, '..', '..', 'templates', 'sheet.jsx');
28
29
  const templateDest = join(targetDir, 'sheet.jsx');
29
30
  await copyFile(templateSrc, templateDest);
31
+ // Handle .gitignore
32
+ const gitignorePath = join(targetDir, '.gitignore');
33
+ try {
34
+ const existing = await readFile(gitignorePath, 'utf-8');
35
+ if (!existing.includes('node_modules/')) {
36
+ log('Warning: .gitignore exists but does not include node_modules/');
37
+ }
38
+ }
39
+ catch {
40
+ await writeFile(gitignorePath, 'node_modules/\n', 'utf-8');
41
+ }
42
+ if (isJsonMode()) {
43
+ jsonOutput({ dir: targetDir, name, file: './sheet.jsx' });
44
+ return;
45
+ }
30
46
  console.log(`Initialized polyhedral project in ${targetDir}`);
31
47
  console.log('');
32
48
  console.log('Files created:');
33
49
  console.log(' polyhedral.json — project manifest');
34
50
  console.log(' sheet.jsx — starter template');
51
+ console.log(' .gitignore — git ignore rules');
35
52
  console.log('');
36
53
  console.log('Next steps:');
37
54
  console.log(' 1. Edit sheet.jsx in your editor');
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAY;IAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAA;QAChD,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;QAClE,OAAM;IACR,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IAED,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAEtD,MAAM,QAAQ,GAAa;QACzB,IAAI;QACJ,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,MAAM;KAClB,CAAA;IAED,MAAM,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;IACzE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IACjD,MAAM,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IAEzC,OAAO,CAAC,GAAG,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAA;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC7B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;IACpD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;IACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;AAC3D,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCjD"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAgDjD"}
@@ -1,9 +1,21 @@
1
1
  import { requireConfig } from '../lib/config.js';
2
2
  import { ApiClient } from '../lib/api-client.js';
3
+ import { isJsonMode, jsonOutput } from '../lib/output.js';
3
4
  export async function listCommand() {
4
5
  const config = await requireConfig();
5
6
  const client = new ApiClient(config);
6
7
  const templates = await client.listTemplates();
8
+ if (isJsonMode()) {
9
+ jsonOutput(templates.map((t) => ({
10
+ id: t.id,
11
+ name: t.name,
12
+ buildType: t.build_type,
13
+ description: t.description,
14
+ updatedAt: t.updated_at,
15
+ createdAt: t.created_at,
16
+ })));
17
+ return;
18
+ }
7
19
  if (templates.length === 0) {
8
20
  console.log('No templates found. Run `polyhedral init` to create one.');
9
21
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IAEpC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;IAE9C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;QACvE,OAAM;IACR,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAA;IAC1E,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,MAAM,MAAM,GAAG;QACb,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACpB,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;QAC9B,SAAS;KACV,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAEtC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAA;QAC3D,OAAO,CAAC,GAAG,CACT;YACE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACxB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC;YAC9B,OAAO;SACR,CAAC,IAAI,CAAC,EAAE,CAAC,CACX,CAAA;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IAEpC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;IAE9C,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CACR,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,SAAS,EAAE,CAAC,CAAC,UAAU;SACxB,CAAC,CAAC,CACJ,CAAA;QACD,OAAM;IACR,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;QACvE,OAAM;IACR,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAA;IAC1E,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,MAAM,MAAM,GAAG;QACb,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACpB,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;QAC9B,SAAS;KACV,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAEtC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAA;QAC3D,OAAO,CAAC,GAAG,CACT;YACE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACxB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC;YAC9B,OAAO;SACR,CAAC,IAAI,CAAC,EAAE,CAAC,CACX,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAqClD"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAoDlD"}
@@ -2,10 +2,20 @@ import { createInterface } from 'node:readline/promises';
2
2
  import { stdin, stdout } from 'node:process';
3
3
  import { loadConfig, saveConfig } from '../lib/config.js';
4
4
  import { ApiClient } from '../lib/api-client.js';
5
+ import { isJsonMode, jsonOutput } from '../lib/output.js';
5
6
  export async function loginCommand() {
6
7
  const rl = createInterface({ input: stdin, output: stdout });
7
8
  try {
8
9
  const existing = await loadConfig();
10
+ if (existing.apiKey) {
11
+ console.log('You are already logged in.');
12
+ const overwrite = await rl.question('Overwrite existing credentials? (y/N) ');
13
+ if (overwrite.trim().toLowerCase() !== 'y') {
14
+ console.log('Aborted.');
15
+ return;
16
+ }
17
+ console.log('');
18
+ }
9
19
  console.log('Log in to Polyhedral with your API key.');
10
20
  console.log('Generate one at https://polyhedral.co/home/connected-apps\n');
11
21
  const apiKey = await rl.question('API key: ');
@@ -30,6 +40,10 @@ export async function loginCommand() {
30
40
  }
31
41
  await saveConfig(config);
32
42
  console.log('Logged in successfully. Config saved to ~/.polyhedral/config.json');
43
+ console.log('Note: API key stored in plaintext at ~/.polyhedral/config.json');
44
+ if (isJsonMode()) {
45
+ jsonOutput({ success: true, apiUrl: config.apiUrl });
46
+ }
33
47
  }
34
48
  finally {
35
49
  rl.close();
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAE5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAA;QAEnC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;QAE1E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;QAElE,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,MAAM;SACzC,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;YACpE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAA;YAClD,OAAM;QACR,CAAC;QAED,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;QACxB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAA;IAClF,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAE5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAA;QAEnC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;YACzC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAA;YAC7E,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACvB,OAAM;YACR,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;QAE1E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;QAElE,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,MAAM;SACzC,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;YACpE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAA;YAClD,OAAM;QACR,CAAC;QAED,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;QACxB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAA;QAChF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;QAE7E,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function logoutCommand(): Promise<void>;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBnD"}
@@ -0,0 +1,22 @@
1
+ import { unlink } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { isJsonMode, jsonOutput } from '../lib/output.js';
5
+ export async function logoutCommand() {
6
+ const configPath = join(homedir(), '.polyhedral', 'config.json');
7
+ let removed = false;
8
+ try {
9
+ await unlink(configPath);
10
+ removed = true;
11
+ }
12
+ catch {
13
+ // Config file doesn't exist — already logged out
14
+ }
15
+ if (isJsonMode()) {
16
+ jsonOutput({ success: true });
17
+ }
18
+ else {
19
+ console.log(removed ? 'Logged out. Removed ~/.polyhedral/config.json' : 'Already logged out.');
20
+ }
21
+ }
22
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;IAEhE,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACxB,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IAED,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAA;IAChG,CAAC;AACH,CAAC"}
@@ -1,2 +1,4 @@
1
- export declare function pullCommand(id?: string): Promise<void>;
1
+ export declare function pullCommand(id?: string, options?: {
2
+ force?: boolean;
3
+ }): Promise<void>;
2
4
  //# sourceMappingURL=pull.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5D"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AASA,wBAAsB,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD3F"}
@@ -1,9 +1,11 @@
1
- import { writeFile } from 'node:fs/promises';
1
+ import { access, writeFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { requireConfig } from '../lib/config.js';
4
4
  import { ApiClient } from '../lib/api-client.js';
5
5
  import { tryLoadManifest, saveManifest } from '../lib/manifest.js';
6
- export async function pullCommand(id) {
6
+ import { isJsonMode, jsonOutput, log } from '../lib/output.js';
7
+ import { confirm } from '../lib/prompt.js';
8
+ export async function pullCommand(id, options) {
7
9
  const config = await requireConfig();
8
10
  const client = new ApiClient(config);
9
11
  const manifest = await tryLoadManifest();
@@ -13,10 +15,24 @@ export async function pullCommand(id) {
13
15
  console.error('Usage: polyhedral pull [id]');
14
16
  process.exit(1);
15
17
  }
16
- console.log(`Pulling template ${templateId}...`);
18
+ log(`Pulling template ${templateId}...`);
17
19
  const template = await client.getTemplate(templateId);
18
20
  const filePath = manifest?.file ?? './sheet.jsx';
19
21
  const fullPath = join(process.cwd(), filePath);
22
+ if (!options?.force) {
23
+ try {
24
+ await access(fullPath);
25
+ log(`Local file "${filePath}" will be overwritten.`);
26
+ const ok = await confirm('Continue? (y/N) ');
27
+ if (!ok) {
28
+ log('Aborted.');
29
+ return;
30
+ }
31
+ }
32
+ catch {
33
+ // File doesn't exist, no warning needed
34
+ }
35
+ }
20
36
  await writeFile(fullPath, template.code, 'utf-8');
21
37
  const updatedManifest = {
22
38
  name: template.name,
@@ -26,9 +42,13 @@ export async function pullCommand(id) {
26
42
  description: template.description ?? undefined,
27
43
  fieldSchema: template.field_schema ?? undefined,
28
44
  nameField: template.name_field,
45
+ version: template.version,
29
46
  };
30
47
  await saveManifest(updatedManifest);
31
- console.log(`Wrote ${filePath}`);
32
- console.log(`Updated polyhedral.json`);
48
+ log(`Wrote ${filePath}`);
49
+ log('Updated polyhedral.json');
50
+ if (isJsonMode()) {
51
+ jsonOutput({ templateId: template.id, file: filePath });
52
+ }
33
53
  }
34
54
  //# sourceMappingURL=pull.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGlE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAW;IAC3C,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IAEpC,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAA;IAExC,MAAM,UAAU,GAAG,EAAE,IAAI,QAAQ,EAAE,UAAU,CAAA;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACrF,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,KAAK,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IAErD,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,IAAI,aAAa,CAAA;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC9C,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAEjD,MAAM,eAAe,GAAa;QAChC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,QAAQ,CAAC,UAAmC;QACvD,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,SAAS;QAC9C,WAAW,EAAE,QAAQ,CAAC,YAAY,IAAI,SAAS;QAC/C,SAAS,EAAE,QAAQ,CAAC,UAAU;KAC/B,CAAA;IAED,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;IAEnC,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAA;IAChC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;AACxC,CAAC"}
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAW,EAAE,OAA6B;IAC1E,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IAEpC,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAA;IAExC,MAAM,UAAU,GAAG,EAAE,IAAI,QAAQ,EAAE,UAAU,CAAA;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACrF,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,GAAG,CAAC,oBAAoB,UAAU,KAAK,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IAErD,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,IAAI,aAAa,CAAA;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;IAE9C,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;YACtB,GAAG,CAAC,eAAe,QAAQ,wBAAwB,CAAC,CAAA;YACpD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAA;YAC5C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,GAAG,CAAC,UAAU,CAAC,CAAA;gBACf,OAAM;YACR,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAEjD,MAAM,eAAe,GAAa;QAChC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,QAAQ,CAAC,UAAmC;QACvD,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,SAAS;QAC9C,WAAW,EAAE,QAAQ,CAAC,YAAY,IAAI,SAAS;QAC/C,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAA;IAED,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;IAEnC,GAAG,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAA;IACxB,GAAG,CAAC,yBAAyB,CAAC,CAAA;IAE9B,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC"}
@@ -1,2 +1,10 @@
1
- export declare function pushCommand(): Promise<void>;
1
+ interface PushOptions {
2
+ force?: boolean;
3
+ patch?: boolean;
4
+ minor?: boolean;
5
+ major?: boolean;
6
+ changelog?: string;
7
+ }
8
+ export declare function pushCommand(options: PushOptions): Promise<void>;
9
+ export {};
2
10
  //# sourceMappingURL=push.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BjD"}
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAYA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAeD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ErE"}
@@ -5,32 +5,90 @@ import { ApiClient } from '../lib/api-client.js';
5
5
  import { loadManifest, saveManifest } from '../lib/manifest.js';
6
6
  import { formatValidationError } from '../lib/format.js';
7
7
  import { buildTemplatePayload } from '../lib/template-data.js';
8
- export async function pushCommand() {
8
+ import { validateLocal } from '../lib/validate-local.js';
9
+ import { isJsonMode, jsonOutput, log } from '../lib/output.js';
10
+ import { confirm } from '../lib/prompt.js';
11
+ function resolveBump(options) {
12
+ if (options.major)
13
+ return 'major';
14
+ if (options.minor)
15
+ return 'minor';
16
+ return 'patch';
17
+ }
18
+ async function confirmUpdate(manifest, options) {
19
+ if (options.force)
20
+ return true;
21
+ log(`Template: ${manifest.name} (${manifest.templateId})`);
22
+ log(`File: ${manifest.file}`);
23
+ return confirm(`Push update to "${manifest.name}"? (y/N) `);
24
+ }
25
+ export async function pushCommand(options) {
9
26
  const config = await requireConfig();
10
27
  const client = new ApiClient(config);
11
28
  const manifest = await loadManifest();
12
29
  const filePath = join(process.cwd(), manifest.file);
13
30
  const code = await readFile(filePath, 'utf-8');
14
- const validation = await client.validate(code);
31
+ const validation = await validateLocal(code);
15
32
  if (!validation.valid) {
16
- console.error(`Validation failed: ${formatValidationError(validation)}`);
17
- return;
33
+ if (isJsonMode()) {
34
+ jsonOutput({ error: `Validation failed: ${formatValidationError(validation)}` });
35
+ }
36
+ else {
37
+ console.error(`Validation failed: ${formatValidationError(validation)}`);
38
+ }
39
+ process.exit(1);
40
+ }
41
+ const bump = resolveBump(options);
42
+ if (bump === 'major' && !options.changelog) {
43
+ if (isJsonMode()) {
44
+ jsonOutput({ error: 'Changelog is required for major version bumps.' });
45
+ }
46
+ else {
47
+ console.error('A changelog message is required for major version bumps.');
48
+ console.error('Use: polyhedral push --major --changelog "description of breaking changes"');
49
+ }
50
+ process.exit(1);
18
51
  }
19
52
  const data = buildTemplatePayload(manifest, code);
20
53
  let templateId = manifest.templateId;
54
+ let created = false;
21
55
  if (templateId) {
22
- console.log(`Updating template ${templateId}...`);
56
+ if (!(await confirmUpdate(manifest, options))) {
57
+ log('Aborted.');
58
+ return;
59
+ }
60
+ log(`Updating template ${templateId}...`);
23
61
  await client.updateTemplate(templateId, data);
24
- console.log('Template updated.');
62
+ log('Template updated.');
25
63
  }
26
64
  else {
27
- console.log('Creating new template...');
28
- const created = await client.createTemplate(data);
29
- templateId = created.id;
65
+ log('Creating new template...');
66
+ const result = await client.createTemplate(data);
67
+ templateId = result.id;
30
68
  manifest.templateId = templateId;
31
69
  await saveManifest(manifest);
32
- console.log(`Template created with ID: ${templateId}`);
70
+ log(`Template created with ID: ${templateId}`);
71
+ created = true;
72
+ }
73
+ log(`Publishing ${bump} version...`);
74
+ const publishResult = await client.publishVersion(templateId, {
75
+ bump,
76
+ changelog: options.changelog,
77
+ });
78
+ const version = publishResult.version.version;
79
+ manifest.version = version;
80
+ await saveManifest(manifest);
81
+ log(`Published v${version}`);
82
+ if (bump !== 'major') {
83
+ log('All linked instances have been auto-updated.');
84
+ }
85
+ else {
86
+ log('Major version published. Instances must be upgraded manually.');
87
+ }
88
+ const previewUrl = `${config.apiUrl}/home/sheets/preview/${templateId}`;
89
+ log(`Preview: ${previewUrl}`);
90
+ if (isJsonMode()) {
91
+ jsonOutput({ templateId, previewUrl, created, version });
33
92
  }
34
- console.log(`Preview: ${config.apiUrl}/home/sheets/preview/${templateId}`);
35
93
  }
36
94
  //# sourceMappingURL=push.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;IAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE9C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,sBAAsB,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACxE,OAAM;IACR,CAAC;IAED,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACjD,IAAI,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;IAEpC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,KAAK,CAAC,CAAA;QACjD,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACjD,UAAU,GAAG,OAAO,CAAC,EAAE,CAAA;QACvB,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAA;QAChC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,wBAAwB,UAAU,EAAE,CAAC,CAAA;AAC5E,CAAC"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAOA,wBAAsB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBlE"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAOA,wBAAsB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE"}
@@ -1,22 +1,30 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
- import { requireConfig } from '../lib/config.js';
4
- import { ApiClient } from '../lib/api-client.js';
5
3
  import { loadManifest } from '../lib/manifest.js';
6
4
  import { formatValidationError } from '../lib/format.js';
5
+ import { validateLocal } from '../lib/validate-local.js';
6
+ import { isJsonMode, jsonOutput, log } from '../lib/output.js';
7
7
  export async function validateCommand(file) {
8
- const config = await requireConfig();
9
- const client = new ApiClient(config);
10
- const filePath = file ?? await getFileFromManifest();
8
+ const filePath = file ?? (await getFileFromManifest());
11
9
  const fullPath = join(process.cwd(), filePath);
12
10
  const code = await readFile(fullPath, 'utf-8');
13
- console.log(`Validating ${filePath}...`);
14
- const result = await client.validate(code);
11
+ log(`Validating ${filePath}...`);
12
+ const result = await validateLocal(code);
15
13
  if (result.valid) {
16
- console.log('Valid.');
14
+ if (isJsonMode()) {
15
+ jsonOutput({ valid: true });
16
+ }
17
+ else {
18
+ console.log('Valid.');
19
+ }
17
20
  return;
18
21
  }
19
- console.error(`Invalid: ${formatValidationError(result)}`);
22
+ if (isJsonMode()) {
23
+ jsonOutput({ valid: false, error: result.error, line: result.line, column: result.column });
24
+ }
25
+ else {
26
+ console.error(`Invalid: ${formatValidationError(result)}`);
27
+ }
20
28
  process.exit(1);
21
29
  }
22
30
  async function getFileFromManifest() {
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAa;IACjD,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IAEpC,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,mBAAmB,EAAE,CAAA;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE9C,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,KAAK,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE1C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACrB,OAAM;IACR,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,YAAY,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;QACrC,OAAO,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;QAChE,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE9D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAa;IACjD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAA;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE9C,GAAG,CAAC,cAAc,QAAQ,KAAK,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IAExC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvB,CAAC;QACD,OAAM;IACR,CAAC;IAED,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,YAAY,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;QACrC,OAAO,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;QAChE,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function versionsCommand(): Promise<void>;
2
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCrD"}
@@ -0,0 +1,34 @@
1
+ import { requireConfig } from '../lib/config.js';
2
+ import { ApiClient } from '../lib/api-client.js';
3
+ import { loadManifest } from '../lib/manifest.js';
4
+ import { isJsonMode, jsonOutput, log } from '../lib/output.js';
5
+ export async function versionsCommand() {
6
+ const config = await requireConfig();
7
+ const client = new ApiClient(config);
8
+ const manifest = await loadManifest();
9
+ if (!manifest.templateId) {
10
+ if (isJsonMode()) {
11
+ jsonOutput({ error: 'No template ID found. Push a template first.' });
12
+ }
13
+ else {
14
+ console.error('No template ID found in polyhedral.json. Push a template first.');
15
+ }
16
+ process.exit(1);
17
+ }
18
+ const versions = await client.listVersions(manifest.templateId);
19
+ if (isJsonMode()) {
20
+ jsonOutput(versions);
21
+ return;
22
+ }
23
+ if (versions.length === 0) {
24
+ log('No versions published yet. Use `polyhedral push` to publish a version.');
25
+ return;
26
+ }
27
+ log(`Version history for "${manifest.name}":\n`);
28
+ for (const v of versions) {
29
+ const date = new Date(v.created_at).toLocaleDateString();
30
+ const changelogSuffix = v.changelog ? ` — ${v.changelog}` : '';
31
+ log(` v${v.version} ${date}${changelogSuffix}`);
32
+ }
33
+ }
34
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE9D,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;IAErC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC,CAAA;QACvE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAA;QAClF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IAE/D,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC,QAAQ,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,wEAAwE,CAAC,CAAA;QAC7E,OAAM;IACR,CAAC;IAED,GAAG,CAAC,wBAAwB,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAA;IAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAA;QACxD,MAAM,eAAe,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAC9D,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,IAAI,GAAG,eAAe,EAAE,CAAC,CAAA;IACnD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function whoamiCommand(): Promise<void>;
2
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BnD"}
@@ -0,0 +1,35 @@
1
+ import { loadConfig } from '../lib/config.js';
2
+ import { ApiClient } from '../lib/api-client.js';
3
+ import { isJsonMode, jsonOutput } from '../lib/output.js';
4
+ export async function whoamiCommand() {
5
+ const config = await loadConfig();
6
+ if (!config.apiKey) {
7
+ if (isJsonMode()) {
8
+ jsonOutput({ loggedIn: false });
9
+ }
10
+ else {
11
+ console.log('Not logged in. Run `polyhedral login` first.');
12
+ }
13
+ return;
14
+ }
15
+ const client = new ApiClient(config);
16
+ try {
17
+ const templates = await client.listTemplates();
18
+ if (isJsonMode()) {
19
+ jsonOutput({ loggedIn: true, apiUrl: config.apiUrl, templateCount: templates.length });
20
+ return;
21
+ }
22
+ console.log(`API URL: ${config.apiUrl}`);
23
+ console.log(`Status: Logged in`);
24
+ console.log(`Templates: ${templates.length}`);
25
+ }
26
+ catch (err) {
27
+ const message = err instanceof Error ? err.message : 'Unknown error';
28
+ if (isJsonMode()) {
29
+ jsonOutput({ loggedIn: false, error: message });
30
+ return;
31
+ }
32
+ console.error(`Logged in but API check failed: ${message}`);
33
+ }
34
+ }
35
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IAEjC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC7D,CAAC;QACD,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IAEpC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;QAC9C,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;YACtF,OAAM;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;QACpE,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;YAC/C,OAAM;QACR,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -3,40 +3,54 @@ import { readFileSync } from 'node:fs';
3
3
  import { dirname, join } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import { Command } from 'commander';
6
- const __dirname = dirname(fileURLToPath(import.meta.url));
7
- const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
8
- import { loginCommand } from './commands/login.js';
6
+ import { deleteCommand } from './commands/delete.js';
7
+ import { devCommand } from './commands/dev.js';
9
8
  import { initCommand } from './commands/init.js';
10
9
  import { listCommand } from './commands/list.js';
10
+ import { loginCommand } from './commands/login.js';
11
+ import { logoutCommand } from './commands/logout.js';
11
12
  import { pullCommand } from './commands/pull.js';
12
13
  import { pushCommand } from './commands/push.js';
13
14
  import { validateCommand } from './commands/validate.js';
14
- import { devCommand } from './commands/dev.js';
15
+ import { versionsCommand } from './commands/versions.js';
16
+ import { whoamiCommand } from './commands/whoami.js';
17
+ import { setProgram } from './lib/output.js';
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
15
20
  const program = new Command();
16
21
  program
17
22
  .name('polyhedral')
18
23
  .description('CLI for local Polyhedral custom sheet template development')
19
- .version(pkg.version);
24
+ .version(pkg.version)
25
+ .option('--json', 'Output results as JSON');
26
+ setProgram(program);
20
27
  program
21
28
  .command('login')
22
29
  .description('Authenticate with your Polyhedral API key')
23
30
  .action(loginCommand);
24
- program
25
- .command('init [dir]')
26
- .description('Scaffold a new template project')
27
- .action(initCommand);
28
- program
29
- .command('list')
30
- .description('List all your custom sheet templates')
31
- .action(listCommand);
31
+ program.command('logout').description('Remove stored credentials').action(logoutCommand);
32
+ program.command('whoami').description('Show current login status').action(whoamiCommand);
33
+ program.command('init [dir]').description('Scaffold a new template project').action(initCommand);
34
+ program.command('list').description('List all your custom sheet templates').action(listCommand);
32
35
  program
33
36
  .command('pull [id]')
34
37
  .description('Download a template to a local file')
35
- .action(pullCommand);
38
+ .option('-f, --force', 'Skip overwrite confirmation')
39
+ .action((id, options) => pullCommand(id, options));
36
40
  program
37
41
  .command('push')
38
- .description('Validate and upload the local template')
42
+ .description('Validate, upload, and publish a new version of the template')
43
+ .option('-f, --force', 'Skip confirmation prompt')
44
+ .option('--patch', 'Bump patch version (default)')
45
+ .option('--minor', 'Bump minor version')
46
+ .option('--major', 'Bump major version (requires --changelog)')
47
+ .option('--changelog <message>', 'Changelog message for the version')
39
48
  .action(pushCommand);
49
+ program
50
+ .command('delete [id]')
51
+ .description('Delete a template')
52
+ .option('-f, --force', 'Skip delete confirmation')
53
+ .action((id, options) => deleteCommand(id, options));
40
54
  program
41
55
  .command('validate [file]')
42
56
  .description('Validate a template file without pushing')
@@ -45,5 +59,9 @@ program
45
59
  .command('dev')
46
60
  .description('Watch file, auto-push on save, and open live preview')
47
61
  .action(devCommand);
62
+ program
63
+ .command('versions')
64
+ .description('List version history for the current template')
65
+ .action(versionsCommand);
48
66
  program.parse();
49
67
  //# 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":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,eAAe,CAAC,CAAA;AAE1B,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,OAAO,CAAC,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { CliConfig, Template, ValidationResult } from '../types.js';
1
+ import type { CliConfig, Template, TemplateVersion, ValidationResult } from '../types.js';
2
2
  export declare class ApiClient {
3
3
  private baseUrl;
4
4
  private apiKey;
@@ -26,5 +26,13 @@ export declare class ApiClient {
26
26
  success: boolean;
27
27
  }>;
28
28
  validate(code: string): Promise<ValidationResult>;
29
+ publishVersion(templateId: string, options: {
30
+ bump: string;
31
+ changelog?: string;
32
+ }): Promise<{
33
+ version: TemplateVersion;
34
+ template: Template;
35
+ }>;
36
+ listVersions(templateId: string): Promise<TemplateVersion[]>;
29
37
  }
30
38
  //# sourceMappingURL=api-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAY,MAAM,aAAa,CAAA;AAElF,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,SAAS;YAKf,OAAO;IAqBf,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIpC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI1C,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAC1B,GAAG,OAAO,CAAC,QAAQ,CAAC;IAOf,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAC1B,GACA,OAAO,CAAC,QAAQ,CAAC;IAOd,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAMzD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAMxD"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAY,MAAM,aAAa,CAAA;AAEnG,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,SAAS;YAKf,OAAO;IAqBf,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIpC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI1C,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAC1B,GAAG,OAAO,CAAC,QAAQ,CAAC;IAOf,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAC1B,GACA,OAAO,CAAC,QAAQ,CAAC;IAOd,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAMzD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAOjD,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC;QAAE,OAAO,EAAE,eAAe,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;IAUtD,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAGnE"}
@@ -51,5 +51,14 @@ export class ApiClient {
51
51
  body: JSON.stringify({ code }),
52
52
  });
53
53
  }
54
+ async publishVersion(templateId, options) {
55
+ return this.request(`/api/custom-sheet-templates/${templateId}/publish`, {
56
+ method: 'POST',
57
+ body: JSON.stringify(options),
58
+ });
59
+ }
60
+ async listVersions(templateId) {
61
+ return this.request(`/api/custom-sheet-templates/${templateId}/versions`);
62
+ }
54
63
  }
55
64
  //# sourceMappingURL=api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,SAAS;IACZ,OAAO,CAAQ;IACf,MAAM,CAAQ;IAEtB,YAAY,MAAiB;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC7B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,UAAuB,EAAE;QAC9D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAA;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACtC,GAAG,OAAO,CAAC,OAAO;aACnB;SACF,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAgB,CAAA;YAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,8BAA8B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,IAAS,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAa,6BAA6B,CAAC,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAW,+BAA+B,EAAE,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAOpB;QACC,OAAO,IAAI,CAAC,OAAO,CAAW,6BAA6B,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,EAAU,EACV,IAOC;QAED,OAAO,IAAI,CAAC,OAAO,CAAW,+BAA+B,EAAE,EAAE,EAAE;YACjE,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAuB,+BAA+B,EAAE,EAAE,EAAE;YAC7E,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,OAAO,CAAmB,sCAAsC,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,SAAS;IACZ,OAAO,CAAQ;IACf,MAAM,CAAQ;IAEtB,YAAY,MAAiB;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC7B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,UAAuB,EAAE;QAC9D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAA;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACtC,GAAG,OAAO,CAAC,OAAO;aACnB;SACF,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAgB,CAAA;YAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,8BAA8B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,IAAS,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAa,6BAA6B,CAAC,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAW,+BAA+B,EAAE,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAOpB;QACC,OAAO,IAAI,CAAC,OAAO,CAAW,6BAA6B,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,EAAU,EACV,IAOC;QAED,OAAO,IAAI,CAAC,OAAO,CAAW,+BAA+B,EAAE,EAAE,EAAE;YACjE,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAuB,+BAA+B,EAAE,EAAE,EAAE;YAC7E,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,OAAO,CAAmB,sCAAsC,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,UAAkB,EAClB,OAA6C;QAE7C,OAAO,IAAI,CAAC,OAAO,CACjB,+BAA+B,UAAU,UAAU,EACnD;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CACF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAoB,+BAA+B,UAAU,WAAW,CAAC,CAAA;IAC9F,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export declare function setProgram(program: {
2
+ opts(): {
3
+ json?: boolean;
4
+ };
5
+ }): void;
6
+ export declare function isJsonMode(): boolean;
7
+ export declare function jsonOutput(data: unknown): void;
8
+ export declare function log(message: string): void;
9
+ export declare function logError(message: string): void;
10
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAAE,IAAI,IAAI;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,CAExE;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIzC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI9C"}
@@ -0,0 +1,21 @@
1
+ let _program = null;
2
+ export function setProgram(program) {
3
+ _program = program;
4
+ }
5
+ export function isJsonMode() {
6
+ return _program?.opts().json === true;
7
+ }
8
+ export function jsonOutput(data) {
9
+ console.log(JSON.stringify(data));
10
+ }
11
+ export function log(message) {
12
+ if (!isJsonMode()) {
13
+ console.log(message);
14
+ }
15
+ }
16
+ export function logError(message) {
17
+ if (!isJsonMode()) {
18
+ console.error(message);
19
+ }
20
+ }
21
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,IAAI,QAAQ,GAA0C,IAAI,CAAA;AAE1D,MAAM,UAAU,UAAU,CAAC,OAAuC;IAChE,QAAQ,GAAG,OAAO,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function confirm(message: string): Promise<boolean>;
2
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/D"}
@@ -0,0 +1,16 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { stdin, stdout } from 'node:process';
3
+ import { isJsonMode } from './output.js';
4
+ export async function confirm(message) {
5
+ if (isJsonMode())
6
+ return true;
7
+ const rl = createInterface({ input: stdin, output: stdout });
8
+ try {
9
+ const answer = await rl.question(message);
10
+ return answer.trim().toLowerCase() === 'y';
11
+ }
12
+ finally {
13
+ rl.close();
14
+ }
15
+ }
16
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,IAAI,UAAU,EAAE;QAAE,OAAO,IAAI,CAAA;IAE7B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACzC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAA;IAC5C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ValidationResult } from '../types.js';
2
+ export declare function validateLocal(code: string): Promise<ValidationResult>;
3
+ //# sourceMappingURL=validate-local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-local.d.ts","sourceRoot":"","sources":["../../src/lib/validate-local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AASnD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB3E"}
@@ -0,0 +1,32 @@
1
+ /** Strips absolute paths that might leak through Babel error messages */
2
+ const ABSOLUTE_PATH_RE = /\/[^\s:]*\/(?=\w+\.jsx)/g;
3
+ function stripPaths(message) {
4
+ return message.replace(ABSOLUTE_PATH_RE, '');
5
+ }
6
+ export async function validateLocal(code) {
7
+ try {
8
+ const babel = await import('@babel/core');
9
+ babel.transformSync(code, {
10
+ presets: [['@babel/preset-react', { runtime: 'classic' }]],
11
+ plugins: ['@babel/plugin-transform-modules-commonjs'],
12
+ filename: 'sheet.jsx',
13
+ ast: false,
14
+ code: false,
15
+ });
16
+ return { valid: true };
17
+ }
18
+ catch (err) {
19
+ if (err && typeof err === 'object' && 'loc' in err) {
20
+ const babelErr = err;
21
+ return {
22
+ valid: false,
23
+ error: stripPaths(babelErr.message ?? 'Unknown syntax error'),
24
+ line: babelErr.loc?.line,
25
+ column: babelErr.loc?.column,
26
+ };
27
+ }
28
+ const message = err instanceof Error ? err.message : 'Unknown validation error';
29
+ return { valid: false, error: stripPaths(message) };
30
+ }
31
+ }
32
+ //# sourceMappingURL=validate-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-local.js","sourceRoot":"","sources":["../../src/lib/validate-local.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,gBAAgB,GAAG,0BAA0B,CAAA;AAEnD,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;QACzC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE;YACxB,OAAO,EAAE,CAAC,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1D,OAAO,EAAE,CAAC,0CAA0C,CAAC;YACrD,QAAQ,EAAE,WAAW;YACrB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAA;QACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACxB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,GAAqE,CAAA;YACtF,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,IAAI,sBAAsB,CAAC;gBAC7D,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI;gBACxB,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM;aAC7B,CAAA;QACH,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAA;QAC/E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAA;IACrD,CAAC;AACH,CAAC"}
package/dist/types.d.ts CHANGED
@@ -10,6 +10,7 @@ export interface Manifest {
10
10
  description?: string;
11
11
  fieldSchema?: FieldSchemaEntry[];
12
12
  nameField?: string | null;
13
+ version?: string;
13
14
  }
14
15
  export interface FieldSchemaEntry {
15
16
  name: string;
@@ -27,10 +28,20 @@ export interface Template {
27
28
  field_schema: FieldSchemaEntry[] | null;
28
29
  name_field: string | null;
29
30
  thumbnail_url: string | null;
31
+ version: string;
30
32
  user_id: string;
31
33
  created_at: string;
32
34
  updated_at: string;
33
35
  }
36
+ export interface TemplateVersion {
37
+ id: string;
38
+ template_id: string;
39
+ version: string;
40
+ code: string;
41
+ field_schema: FieldSchemaEntry[] | null;
42
+ changelog: string | null;
43
+ created_at: string;
44
+ }
34
45
  export interface ValidationResult {
35
46
  valid: boolean;
36
47
  error?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAA;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;CACd"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAA;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAA;IACvC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;CACd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polyhedral/cli",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.3",
4
4
  "description": "CLI tool for local Polyhedral custom sheet template development",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,6 +27,9 @@
27
27
  "node": ">=20"
28
28
  },
29
29
  "dependencies": {
30
+ "@babel/core": "^7.29.0",
31
+ "@babel/plugin-transform-modules-commonjs": "^7.28.6",
32
+ "@babel/preset-react": "^7.28.5",
30
33
  "chokidar": "^4.0.3",
31
34
  "commander": "^13.1.0",
32
35
  "open": "^10.1.0"
@@ -1,5 +1,4 @@
1
- const { Sheet, Section, Row, EditableText, Portrait, NumberInput } =
2
- Polyhedral.components;
1
+ const { Sheet, Section, Row, EditableText, Portrait, NumberInput } = Polyhedral.components
3
2
 
4
3
  function CharacterSheet() {
5
4
  return (
@@ -8,11 +7,7 @@ function CharacterSheet() {
8
7
  <Row gap={16}>
9
8
  <Portrait field="portrait" size="lg" />
10
9
  <div style={{ flex: 1 }}>
11
- <EditableText
12
- field="name"
13
- label="Character Name"
14
- placeholder="Enter name..."
15
- />
10
+ <EditableText field="name" label="Character Name" placeholder="Enter name..." />
16
11
  <EditableText field="race" label="Race" />
17
12
  <EditableText field="class" label="Class" />
18
13
  </div>
@@ -34,7 +29,7 @@ function CharacterSheet() {
34
29
  <EditableText field="notes" label="Notes" multiline />
35
30
  </Section>
36
31
  </Sheet>
37
- );
32
+ )
38
33
  }
39
34
 
40
- ReactDOM.render(<CharacterSheet />, document.getElementById("root"));
35
+ Polyhedral.render(<CharacterSheet />)