@tokenrip/cli 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/AGENTS.md +127 -0
  2. package/LICENSE +21 -0
  3. package/README.md +195 -0
  4. package/dist/auth-client.d.ts +8 -0
  5. package/dist/auth-client.js +14 -0
  6. package/dist/auth-client.js.map +1 -0
  7. package/dist/cjs/auth-client.js +17 -0
  8. package/dist/cjs/auth-client.js.map +1 -0
  9. package/dist/cjs/client.js +34 -0
  10. package/dist/cjs/client.js.map +1 -0
  11. package/dist/cjs/commands/auth.js +44 -0
  12. package/dist/cjs/commands/auth.js.map +1 -0
  13. package/dist/cjs/commands/config.js +20 -0
  14. package/dist/cjs/commands/config.js.map +1 -0
  15. package/dist/cjs/commands/delete-version.js +16 -0
  16. package/dist/cjs/commands/delete-version.js.map +1 -0
  17. package/dist/cjs/commands/delete.js +16 -0
  18. package/dist/cjs/commands/delete.js.map +1 -0
  19. package/dist/cjs/commands/publish.js +50 -0
  20. package/dist/cjs/commands/publish.js.map +1 -0
  21. package/dist/cjs/commands/stats.js +12 -0
  22. package/dist/cjs/commands/stats.js.map +1 -0
  23. package/dist/cjs/commands/status.js +19 -0
  24. package/dist/cjs/commands/status.js.map +1 -0
  25. package/dist/cjs/commands/update.js +55 -0
  26. package/dist/cjs/commands/update.js.map +1 -0
  27. package/dist/cjs/commands/upload.js +53 -0
  28. package/dist/cjs/commands/upload.js.map +1 -0
  29. package/dist/cjs/config.js +38 -0
  30. package/dist/cjs/config.js.map +1 -0
  31. package/dist/cjs/errors.js +20 -0
  32. package/dist/cjs/errors.js.map +1 -0
  33. package/dist/cjs/formatters.js +94 -0
  34. package/dist/cjs/formatters.js.map +1 -0
  35. package/dist/cjs/index.js +21 -0
  36. package/dist/cjs/index.js.map +1 -0
  37. package/dist/cjs/output.js +64 -0
  38. package/dist/cjs/output.js.map +1 -0
  39. package/dist/cjs/package.json +1 -0
  40. package/dist/cli.d.ts +2 -0
  41. package/dist/cli.js +211 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/client.d.ts +7 -0
  44. package/dist/client.js +28 -0
  45. package/dist/client.js.map +1 -0
  46. package/dist/commands/auth.d.ts +4 -0
  47. package/dist/commands/auth.js +41 -0
  48. package/dist/commands/auth.js.map +1 -0
  49. package/dist/commands/config.d.ts +2 -0
  50. package/dist/commands/config.js +16 -0
  51. package/dist/commands/config.js.map +1 -0
  52. package/dist/commands/delete-version.d.ts +3 -0
  53. package/dist/commands/delete-version.js +13 -0
  54. package/dist/commands/delete-version.js.map +1 -0
  55. package/dist/commands/delete.d.ts +3 -0
  56. package/dist/commands/delete.js +13 -0
  57. package/dist/commands/delete.js.map +1 -0
  58. package/dist/commands/publish.d.ts +8 -0
  59. package/dist/commands/publish.js +44 -0
  60. package/dist/commands/publish.js.map +1 -0
  61. package/dist/commands/stats.d.ts +1 -0
  62. package/dist/commands/stats.js +9 -0
  63. package/dist/commands/stats.js.map +1 -0
  64. package/dist/commands/status.d.ts +5 -0
  65. package/dist/commands/status.js +16 -0
  66. package/dist/commands/status.js.map +1 -0
  67. package/dist/commands/update.d.ts +6 -0
  68. package/dist/commands/update.js +49 -0
  69. package/dist/commands/update.js.map +1 -0
  70. package/dist/commands/upload.d.ts +7 -0
  71. package/dist/commands/upload.js +47 -0
  72. package/dist/commands/upload.js.map +1 -0
  73. package/dist/config.d.ts +10 -0
  74. package/dist/config.js +28 -0
  75. package/dist/config.js.map +1 -0
  76. package/dist/errors.d.ts +5 -0
  77. package/dist/errors.js +15 -0
  78. package/dist/errors.js.map +1 -0
  79. package/dist/formatters.d.ts +9 -0
  80. package/dist/formatters.js +83 -0
  81. package/dist/formatters.js.map +1 -0
  82. package/dist/index.d.ts +8 -0
  83. package/dist/index.js +6 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/output.d.ts +6 -0
  86. package/dist/output.js +58 -0
  87. package/dist/output.js.map +1 -0
  88. package/package.json +43 -0
package/dist/client.js ADDED
@@ -0,0 +1,28 @@
1
+ import axios from 'axios';
2
+ import { CliError } from './errors.js';
3
+ const DEFAULT_TIMEOUT = 30000;
4
+ export function createHttpClient(config = {}) {
5
+ const headers = {};
6
+ if (config.apiKey) {
7
+ headers['Authorization'] = `Bearer ${config.apiKey}`;
8
+ }
9
+ const client = axios.create({
10
+ baseURL: config.baseUrl || 'https://api.tokenrip.com',
11
+ timeout: config.timeout || DEFAULT_TIMEOUT,
12
+ headers,
13
+ });
14
+ client.interceptors.response.use((response) => response, (error) => {
15
+ if (error.response?.status === 401) {
16
+ throw new CliError('UNAUTHORIZED', 'API key required or invalid. Run `tokenrip auth create-key` or set TOKENRIP_API_KEY.');
17
+ }
18
+ if (error.response?.data?.error) {
19
+ throw new CliError(error.response.data.error, error.response.data.message || 'Unknown API error');
20
+ }
21
+ if (error.code === 'ECONNABORTED') {
22
+ throw new CliError('TIMEOUT', 'Request timeout — is the Tokenrip server running?');
23
+ }
24
+ throw new CliError('NETWORK_ERROR', 'Network error — is the Tokenrip server running?');
25
+ });
26
+ return client;
27
+ }
28
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,eAAe,GAAG,KAAK,CAAC;AAQ9B,MAAM,UAAU,gBAAgB,CAAC,SAAuB,EAAE;IACxD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,0BAA0B;QACrD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,eAAe;QAC1C,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAoE,EAAE,EAAE;QACvE,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,QAAQ,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,iDAAiD,CAAC,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function authCreateKey(options: {
2
+ name?: string;
3
+ save?: boolean;
4
+ }): Promise<void>;
@@ -0,0 +1,41 @@
1
+ import { hostname } from 'node:os';
2
+ import { loadConfig, getApiUrl, saveConfig } from '../config.js';
3
+ import { createHttpClient } from '../client.js';
4
+ import { CliError } from '../errors.js';
5
+ import { outputSuccess } from '../output.js';
6
+ import { formatAuthKey } from '../formatters.js';
7
+ export async function authCreateKey(options) {
8
+ const config = loadConfig();
9
+ const apiUrl = getApiUrl(config);
10
+ const keyName = options.name || `tokenrip-${hostname()}`;
11
+ const client = createHttpClient({ baseUrl: apiUrl });
12
+ try {
13
+ const { data } = await client.post('/v0/auth/keys', { name: keyName });
14
+ const apiKey = data.data.apiKey;
15
+ // Auto-save the key if requested or not explicitly disabled
16
+ if (options.save !== false) {
17
+ config.apiKey = apiKey;
18
+ saveConfig(config);
19
+ outputSuccess({
20
+ keyName,
21
+ apiKey,
22
+ message: 'API key created and saved',
23
+ note: 'Keep this key safe — treat it like a password',
24
+ }, formatAuthKey);
25
+ }
26
+ else {
27
+ outputSuccess({
28
+ keyName,
29
+ apiKey,
30
+ message: 'API key created',
31
+ note: 'To save it, run: tokenrip config set-key <key>',
32
+ }, formatAuthKey);
33
+ }
34
+ }
35
+ catch (error) {
36
+ if (error instanceof CliError)
37
+ throw error;
38
+ throw new CliError('AUTH_FAILED', 'Failed to create API key. Is the server running?');
39
+ }
40
+ }
41
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0C;IAC5E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,QAAQ,EAAE,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAEhC,4DAA4D;QAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,UAAU,CAAC,MAAM,CAAC,CAAC;YACnB,aAAa,CAAC;gBACZ,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,2BAA2B;gBACpC,IAAI,EAAE,+CAA+C;aACtD,EAAE,aAAa,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,aAAa,CAAC;gBACZ,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,iBAAiB;gBAC1B,IAAI,EAAE,gDAAgD;aACvD,EAAE,aAAa,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAC3C,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,kDAAkD,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function configSetKey(key: string): Promise<void>;
2
+ export declare function configSetUrl(url: string): Promise<void>;
@@ -0,0 +1,16 @@
1
+ import { loadConfig, saveConfig } from '../config.js';
2
+ import { outputSuccess } from '../output.js';
3
+ import { formatConfigSaved } from '../formatters.js';
4
+ export async function configSetKey(key) {
5
+ const config = loadConfig();
6
+ config.apiKey = key;
7
+ saveConfig(config);
8
+ outputSuccess({ message: 'API key saved' }, formatConfigSaved);
9
+ }
10
+ export async function configSetUrl(url) {
11
+ const config = loadConfig();
12
+ config.apiUrl = url;
13
+ saveConfig(config);
14
+ outputSuccess({ message: 'API URL saved', apiUrl: url }, formatConfigSaved);
15
+ }
16
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;IACpB,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;IACpB,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function deleteVersion(uuid: string, versionId: string, options?: {
2
+ dryRun?: boolean;
3
+ }): Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { requireAuthClient } from '../auth-client.js';
2
+ import { outputSuccess } from '../output.js';
3
+ import { formatVersionDeleted } from '../formatters.js';
4
+ export async function deleteVersion(uuid, versionId, options = {}) {
5
+ if (options.dryRun) {
6
+ outputSuccess({ dryRun: true, action: 'would delete version', assetId: uuid, versionId }, formatVersionDeleted);
7
+ return;
8
+ }
9
+ const { client } = requireAuthClient();
10
+ await client.delete(`/v0/assets/${uuid}/versions/${versionId}`);
11
+ outputSuccess({ assetId: uuid, versionId, deleted: true }, formatVersionDeleted);
12
+ }
13
+ //# sourceMappingURL=delete-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-version.js","sourceRoot":"","sources":["../../src/commands/delete-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,SAAiB,EACjB,UAAgC,EAAE;IAElC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAChH,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,aAAa,SAAS,EAAE,CAAC,CAAC;IAEhE,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function deleteAsset(uuid: string, options?: {
2
+ dryRun?: boolean;
3
+ }): Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { requireAuthClient } from '../auth-client.js';
2
+ import { outputSuccess } from '../output.js';
3
+ import { formatAssetDeleted } from '../formatters.js';
4
+ export async function deleteAsset(uuid, options = {}) {
5
+ if (options.dryRun) {
6
+ outputSuccess({ dryRun: true, action: 'would delete', id: uuid }, formatAssetDeleted);
7
+ return;
8
+ }
9
+ const { client } = requireAuthClient();
10
+ await client.delete(`/v0/assets/${uuid}`);
11
+ outputSuccess({ id: uuid, deleted: true }, formatAssetDeleted);
12
+ }
13
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,UAAgC,EAAE;IAChF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAE1C,aAAa,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function publish(filePath: string, options: {
2
+ type: string;
3
+ title?: string;
4
+ parent?: string;
5
+ context?: string;
6
+ refs?: string;
7
+ dryRun?: boolean;
8
+ }): Promise<void>;
@@ -0,0 +1,44 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { requireAuthClient } from '../auth-client.js';
4
+ import { CliError } from '../errors.js';
5
+ import { outputSuccess } from '../output.js';
6
+ import { formatAssetCreated } from '../formatters.js';
7
+ const VALID_TYPES = ['markdown', 'html', 'chart', 'code', 'text', 'json'];
8
+ export async function publish(filePath, options) {
9
+ if (!VALID_TYPES.includes(options.type)) {
10
+ throw new CliError('INVALID_TYPE', `Type must be one of: ${VALID_TYPES.join(', ')}`);
11
+ }
12
+ const absPath = path.resolve(filePath);
13
+ if (!fs.existsSync(absPath)) {
14
+ throw new CliError('FILE_NOT_FOUND', `File not found: ${absPath}`);
15
+ }
16
+ const title = options.title || path.basename(absPath);
17
+ const size = fs.statSync(absPath).size;
18
+ if (options.dryRun) {
19
+ outputSuccess({ dryRun: true, action: 'would publish', file: absPath, title, type: options.type, size }, formatAssetCreated);
20
+ return;
21
+ }
22
+ const { client } = requireAuthClient();
23
+ const content = fs.readFileSync(absPath, 'utf-8');
24
+ const body = {
25
+ type: options.type,
26
+ content,
27
+ title,
28
+ };
29
+ if (options.parent)
30
+ body.parentAssetId = options.parent;
31
+ if (options.context)
32
+ body.creatorContext = options.context;
33
+ if (options.refs)
34
+ body.inputReferences = options.refs.split(',').map((r) => r.trim());
35
+ const { data } = await client.post('/v0/assets', body);
36
+ const url = data.data.url || `https://tokenrip.com/s/${data.data.id}`;
37
+ outputSuccess({
38
+ id: data.data.id,
39
+ url,
40
+ title: data.data.title,
41
+ type: data.data.type,
42
+ }, formatAssetCreated);
43
+ }
44
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAGnF,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,OAA6G;IAE7G,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAmB,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,wBAAwB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAEvC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC7H,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO;QACP,KAAK;KACN,CAAC;IACF,IAAI,OAAO,CAAC,MAAM;QAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IACxD,IAAI,OAAO,CAAC,OAAO;QAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,CAAC,IAAI;QAAE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,0BAA0B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACtE,aAAa,CAAC;QACZ,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QAChB,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;KACrB,EAAE,kBAAkB,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function stats(): Promise<void>;
@@ -0,0 +1,9 @@
1
+ import { requireAuthClient } from '../auth-client.js';
2
+ import { outputSuccess } from '../output.js';
3
+ import { formatStats } from '../formatters.js';
4
+ export async function stats() {
5
+ const { client } = requireAuthClient();
6
+ const { data } = await client.get('/v0/assets/stats');
7
+ outputSuccess(data.data, formatStats);
8
+ }
9
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEtD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function status(options: {
2
+ since?: string;
3
+ limit?: string;
4
+ type?: string;
5
+ }): Promise<void>;
@@ -0,0 +1,16 @@
1
+ import { requireAuthClient } from '../auth-client.js';
2
+ import { outputSuccess } from '../output.js';
3
+ import { formatAssetList } from '../formatters.js';
4
+ export async function status(options) {
5
+ const { client } = requireAuthClient();
6
+ const params = {};
7
+ if (options.since)
8
+ params.since = options.since;
9
+ if (options.limit)
10
+ params.limit = options.limit;
11
+ if (options.type)
12
+ params.type = options.type;
13
+ const { data } = await client.get('/v0/assets/status', { params });
14
+ outputSuccess(data.data, formatAssetList);
15
+ }
16
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAA0D;IACrF,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAEvC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function update(uuid: string, filePath: string, options: {
2
+ type?: string;
3
+ label?: string;
4
+ context?: string;
5
+ dryRun?: boolean;
6
+ }): Promise<void>;
@@ -0,0 +1,49 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import FormData from 'form-data';
4
+ import { requireAuthClient } from '../auth-client.js';
5
+ import { CliError } from '../errors.js';
6
+ import { outputSuccess } from '../output.js';
7
+ import { formatVersionCreated } from '../formatters.js';
8
+ const VALID_TYPES = ['markdown', 'html', 'chart', 'code', 'text'];
9
+ export async function update(uuid, filePath, options) {
10
+ const absPath = path.resolve(filePath);
11
+ if (!fs.existsSync(absPath)) {
12
+ throw new CliError('FILE_NOT_FOUND', `File not found: ${absPath}`);
13
+ }
14
+ if (options.type && !VALID_TYPES.includes(options.type)) {
15
+ throw new CliError('INVALID_TYPE', `Type must be one of: ${VALID_TYPES.join(', ')}`);
16
+ }
17
+ if (options.dryRun) {
18
+ outputSuccess({ dryRun: true, action: 'would update', assetId: uuid, file: absPath }, formatVersionCreated);
19
+ return;
20
+ }
21
+ const { client } = requireAuthClient();
22
+ if (options.type) {
23
+ // Content publish mode
24
+ const content = fs.readFileSync(absPath, 'utf-8');
25
+ const body = { type: options.type, content };
26
+ if (options.label)
27
+ body.label = options.label;
28
+ if (options.context)
29
+ body.creatorContext = options.context;
30
+ const { data } = await client.post(`/v0/assets/${uuid}/versions`, body);
31
+ outputSuccess(data.data, formatVersionCreated);
32
+ }
33
+ else {
34
+ // File upload mode
35
+ const form = new FormData();
36
+ form.append('file', fs.createReadStream(absPath));
37
+ if (options.label)
38
+ form.append('label', options.label);
39
+ if (options.context)
40
+ form.append('creatorContext', options.context);
41
+ const { data } = await client.post(`/v0/assets/${uuid}/versions`, form, {
42
+ headers: form.getHeaders(),
43
+ maxContentLength: Infinity,
44
+ maxBodyLength: Infinity,
45
+ });
46
+ outputSuccess(data.data, formatVersionCreated);
47
+ }
48
+ }
49
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function upload(filePath: string, options: {
2
+ title?: string;
3
+ parent?: string;
4
+ context?: string;
5
+ refs?: string;
6
+ dryRun?: boolean;
7
+ }): Promise<void>;
@@ -0,0 +1,47 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import FormData from 'form-data';
4
+ import mime from 'mime-types';
5
+ import { requireAuthClient } from '../auth-client.js';
6
+ import { CliError } from '../errors.js';
7
+ import { outputSuccess } from '../output.js';
8
+ import { formatAssetCreated } from '../formatters.js';
9
+ export async function upload(filePath, options) {
10
+ const absPath = path.resolve(filePath);
11
+ if (!fs.existsSync(absPath)) {
12
+ throw new CliError('FILE_NOT_FOUND', `File not found: ${absPath}`);
13
+ }
14
+ const mimeType = mime.lookup(absPath) || 'application/octet-stream';
15
+ const title = options.title || path.basename(absPath);
16
+ const size = fs.statSync(absPath).size;
17
+ if (options.dryRun) {
18
+ outputSuccess({ dryRun: true, action: 'would upload', file: absPath, title, mimeType, size }, formatAssetCreated);
19
+ return;
20
+ }
21
+ const { client } = requireAuthClient();
22
+ const form = new FormData();
23
+ form.append('file', fs.createReadStream(absPath));
24
+ form.append('type', 'file');
25
+ form.append('mimeType', mimeType);
26
+ form.append('title', title);
27
+ if (options.parent)
28
+ form.append('parentAssetId', options.parent);
29
+ if (options.context)
30
+ form.append('creatorContext', options.context);
31
+ if (options.refs)
32
+ form.append('inputReferences', JSON.stringify(options.refs.split(',').map((r) => r.trim())));
33
+ const { data } = await client.post('/v0/assets', form, {
34
+ headers: form.getHeaders(),
35
+ maxContentLength: Infinity,
36
+ maxBodyLength: Infinity,
37
+ });
38
+ const url = data.data.url || `https://tokenrip.com/s/${data.data.id}`;
39
+ outputSuccess({
40
+ id: data.data.id,
41
+ url,
42
+ title: data.data.title,
43
+ type: data.data.type,
44
+ mimeType: data.data.mimeType,
45
+ }, formatAssetCreated);
46
+ }
47
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const CONFIG_DIR: string;
2
+ export interface TokenripConfig {
3
+ apiKey?: string;
4
+ apiUrl?: string;
5
+ preferences: Record<string, unknown>;
6
+ }
7
+ export declare function loadConfig(): TokenripConfig;
8
+ export declare function saveConfig(config: TokenripConfig): void;
9
+ export declare function getApiUrl(config: TokenripConfig): string;
10
+ export declare function getApiKey(config: TokenripConfig): string | undefined;
package/dist/config.js ADDED
@@ -0,0 +1,28 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ export const CONFIG_DIR = path.join(os.homedir(), '.config', 'tokenrip');
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
6
+ function defaultConfig() {
7
+ return { preferences: {} };
8
+ }
9
+ export function loadConfig() {
10
+ try {
11
+ const raw = fs.readFileSync(CONFIG_FILE, 'utf-8');
12
+ return JSON.parse(raw);
13
+ }
14
+ catch {
15
+ return defaultConfig();
16
+ }
17
+ }
18
+ export function saveConfig(config) {
19
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
20
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
21
+ }
22
+ export function getApiUrl(config) {
23
+ return config.apiUrl || process.env.TOKENRIP_API_URL || 'https://api.tokenrip.com';
24
+ }
25
+ export function getApiKey(config) {
26
+ return config.apiKey || process.env.TOKENRIP_API_KEY;
27
+ }
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACzE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAQzD,SAAS,aAAa;IACpB,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAsB;IAC/C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAsB;IAC9C,OAAO,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAsB;IAC9C,OAAO,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACvD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class CliError extends Error {
2
+ readonly code: string;
3
+ constructor(code: string, message: string);
4
+ }
5
+ export declare function toCliError(err: unknown): CliError;
package/dist/errors.js ADDED
@@ -0,0 +1,15 @@
1
+ export class CliError extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = 'CliError';
7
+ }
8
+ }
9
+ export function toCliError(err) {
10
+ if (err instanceof CliError)
11
+ return err;
12
+ const message = err instanceof Error ? err.message : String(err);
13
+ return new CliError('UNKNOWN_ERROR', message);
14
+ }
15
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IADlB,YACkB,IAAY,EAC5B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QAI5B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,IAAI,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type Formatter = (data: Record<string, unknown>) => string;
2
+ export declare const formatAssetCreated: Formatter;
3
+ export declare const formatAssetDeleted: Formatter;
4
+ export declare const formatAssetList: Formatter;
5
+ export declare const formatStats: Formatter;
6
+ export declare const formatVersionCreated: Formatter;
7
+ export declare const formatVersionDeleted: Formatter;
8
+ export declare const formatConfigSaved: Formatter;
9
+ export declare const formatAuthKey: Formatter;
@@ -0,0 +1,83 @@
1
+ export const formatAssetCreated = (data) => {
2
+ const lines = [`Created: ${data.title || '(untitled)'}`];
3
+ if (data.id)
4
+ lines.push(` ID: ${data.id}`);
5
+ if (data.url)
6
+ lines.push(` URL: ${data.url}`);
7
+ if (data.type)
8
+ lines.push(` Type: ${data.type}`);
9
+ if (data.mimeType)
10
+ lines.push(` MIME: ${data.mimeType}`);
11
+ return lines.join('\n');
12
+ };
13
+ export const formatAssetDeleted = (data) => {
14
+ return `Deleted: ${data.id}`;
15
+ };
16
+ export const formatAssetList = (data) => {
17
+ const assets = data;
18
+ if (!Array.isArray(assets) || assets.length === 0) {
19
+ return 'No assets found.';
20
+ }
21
+ const lines = [`${assets.length} asset(s):\n`];
22
+ for (const a of assets) {
23
+ const title = a.title || '(untitled)';
24
+ const type = a.type || '';
25
+ const id = a.id || '';
26
+ lines.push(` ${type.toString().padEnd(10)} ${title} (${id})`);
27
+ }
28
+ return lines.join('\n');
29
+ };
30
+ export const formatStats = (data) => {
31
+ const lines = [];
32
+ if (data.totalCount !== undefined)
33
+ lines.push(`Total assets: ${data.totalCount}`);
34
+ if (data.totalBytes !== undefined)
35
+ lines.push(`Total size: ${formatBytes(data.totalBytes)}`);
36
+ const byType = data.byType;
37
+ if (Array.isArray(byType) && byType.length > 0) {
38
+ lines.push('');
39
+ lines.push('By type:');
40
+ for (const t of byType) {
41
+ const name = (t.type || 'unknown');
42
+ const count = t.count ?? 0;
43
+ const bytes = t.totalBytes ?? 0;
44
+ lines.push(` ${name.padEnd(10)} ${String(count).padStart(4)} assets ${formatBytes(bytes)}`);
45
+ }
46
+ }
47
+ return lines.join('\n');
48
+ };
49
+ export const formatVersionCreated = (data) => {
50
+ const lines = [`Version ${data.version || '?'} published`];
51
+ if (data.id)
52
+ lines.push(` Version ID: ${data.id}`);
53
+ if (data.assetId)
54
+ lines.push(` Asset ID: ${data.assetId}`);
55
+ if (data.label)
56
+ lines.push(` Label: ${data.label}`);
57
+ return lines.join('\n');
58
+ };
59
+ export const formatVersionDeleted = (data) => {
60
+ return `Deleted version ${data.versionId} from asset ${data.assetId}`;
61
+ };
62
+ export const formatConfigSaved = (data) => {
63
+ return data.message || 'Configuration saved.';
64
+ };
65
+ export const formatAuthKey = (data) => {
66
+ const lines = [data.message || 'API key created.'];
67
+ if (data.keyName)
68
+ lines.push(` Name: ${data.keyName}`);
69
+ if (data.apiKey)
70
+ lines.push(` Key: ${data.apiKey}`);
71
+ if (data.note)
72
+ lines.push(` ${data.note}`);
73
+ return lines.join('\n');
74
+ };
75
+ function formatBytes(bytes) {
76
+ if (bytes === 0)
77
+ return '0 B';
78
+ const units = ['B', 'KB', 'MB', 'GB'];
79
+ const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);
80
+ const value = bytes / Math.pow(1024, i);
81
+ return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
82
+ }
83
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { loadConfig, saveConfig, getApiUrl, getApiKey, CONFIG_DIR } from './config.js';
2
+ export type { TokenripConfig } from './config.js';
3
+ export { createHttpClient } from './client.js';
4
+ export type { ClientConfig } from './client.js';
5
+ export { CliError, toCliError } from './errors.js';
6
+ export { outputSuccess, outputError, wrapCommand } from './output.js';
7
+ export { requireAuthClient } from './auth-client.js';
8
+ export type { AuthContext } from './auth-client.js';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { loadConfig, saveConfig, getApiUrl, getApiKey, CONFIG_DIR } from './config.js';
2
+ export { createHttpClient } from './client.js';
3
+ export { CliError, toCliError } from './errors.js';
4
+ export { outputSuccess, outputError, wrapCommand } from './output.js';
5
+ export { requireAuthClient } from './auth-client.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { CliError } from './errors.js';
2
+ import type { Formatter } from './formatters.js';
3
+ export declare function setForceJson(value: boolean): void;
4
+ export declare function outputSuccess(data: Record<string, unknown>, formatter?: Formatter): void;
5
+ export declare function outputError(err: CliError): never;
6
+ export declare function wrapCommand<T extends (...args: any[]) => Promise<void>>(fn: T): T;