@chatlychat/cli 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/commands/ai.d.ts +4 -0
  2. package/dist/commands/ai.d.ts.map +1 -0
  3. package/dist/commands/ai.js +149 -0
  4. package/dist/commands/ai.js.map +1 -0
  5. package/dist/commands/common.d.ts +79 -0
  6. package/dist/commands/common.d.ts.map +1 -0
  7. package/dist/commands/common.js +194 -0
  8. package/dist/commands/common.js.map +1 -0
  9. package/dist/commands/config.d.ts +40 -0
  10. package/dist/commands/config.d.ts.map +1 -0
  11. package/dist/commands/config.js +336 -0
  12. package/dist/commands/config.js.map +1 -0
  13. package/dist/commands/insights.d.ts +5 -0
  14. package/dist/commands/insights.d.ts.map +1 -0
  15. package/dist/commands/insights.js +277 -0
  16. package/dist/commands/insights.js.map +1 -0
  17. package/dist/commands/integrations.d.ts +15 -0
  18. package/dist/commands/integrations.d.ts.map +1 -0
  19. package/dist/commands/integrations.js +256 -0
  20. package/dist/commands/integrations.js.map +1 -0
  21. package/dist/commands/resources.d.ts +19 -7
  22. package/dist/commands/resources.d.ts.map +1 -1
  23. package/dist/commands/resources.js +92 -167
  24. package/dist/commands/resources.js.map +1 -1
  25. package/dist/commands/workspace-as-code.d.ts +27 -0
  26. package/dist/commands/workspace-as-code.d.ts.map +1 -0
  27. package/dist/commands/workspace-as-code.js +377 -0
  28. package/dist/commands/workspace-as-code.js.map +1 -0
  29. package/dist/help.d.ts +25 -1
  30. package/dist/help.d.ts.map +1 -1
  31. package/dist/help.js +104 -8
  32. package/dist/help.js.map +1 -1
  33. package/dist/run.d.ts +17 -0
  34. package/dist/run.d.ts.map +1 -1
  35. package/dist/run.js +88 -41
  36. package/dist/run.js.map +1 -1
  37. package/dist/wac/__tests__/wac-fixtures.d.ts +20 -0
  38. package/dist/wac/__tests__/wac-fixtures.d.ts.map +1 -0
  39. package/dist/wac/__tests__/wac-fixtures.js +38 -0
  40. package/dist/wac/__tests__/wac-fixtures.js.map +1 -0
  41. package/dist/wac/apply.d.ts +113 -0
  42. package/dist/wac/apply.d.ts.map +1 -0
  43. package/dist/wac/apply.js +265 -0
  44. package/dist/wac/apply.js.map +1 -0
  45. package/dist/wac/diff.d.ts +137 -0
  46. package/dist/wac/diff.d.ts.map +1 -0
  47. package/dist/wac/diff.js +413 -0
  48. package/dist/wac/diff.js.map +1 -0
  49. package/dist/wac/document.d.ts +110 -0
  50. package/dist/wac/document.d.ts.map +1 -0
  51. package/dist/wac/document.js +429 -0
  52. package/dist/wac/document.js.map +1 -0
  53. package/dist/wac/render.d.ts +52 -0
  54. package/dist/wac/render.d.ts.map +1 -0
  55. package/dist/wac/render.js +156 -0
  56. package/dist/wac/render.js.map +1 -0
  57. package/dist/wac/resource-def.d.ts +116 -0
  58. package/dist/wac/resource-def.d.ts.map +1 -0
  59. package/dist/wac/resource-def.js +44 -0
  60. package/dist/wac/resource-def.js.map +1 -0
  61. package/dist/wac/resources.d.ts +104 -0
  62. package/dist/wac/resources.d.ts.map +1 -0
  63. package/dist/wac/resources.js +541 -0
  64. package/dist/wac/resources.js.map +1 -0
  65. package/dist/wac/values.d.ts +16 -0
  66. package/dist/wac/values.d.ts.map +1 -0
  67. package/dist/wac/values.js +53 -0
  68. package/dist/wac/values.js.map +1 -0
  69. package/package.json +2 -1
  70. package/dist/cli.spec.d.ts +0 -2
  71. package/dist/cli.spec.d.ts.map +0 -1
  72. package/dist/cli.spec.js +0 -226
  73. package/dist/cli.spec.js.map +0 -1
package/dist/cli.spec.js DELETED
@@ -1,226 +0,0 @@
1
- /**
2
- * The CLI, exercised end to end with only the socket faked.
3
- *
4
- * `run()` takes argv and a client factory, so these tests drive the real
5
- * argument parser, the real `ChatlyClient`, the real transport, the real
6
- * retry policy and the real error mapping. A test that stubbed the SDK would
7
- * prove the CLI calls a mock, which is not the thing worth knowing.
8
- */
9
- import { mkdtempSync, readFileSync, statSync } from 'node:fs';
10
- import { tmpdir } from 'node:os';
11
- import { join } from 'node:path';
12
- import { ChatlyClient } from '@chatlychat/sdk-node';
13
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
14
- import { bool, num, parseArgs, str } from './args.js';
15
- import { resolveCredentials, writeConfig } from './config.js';
16
- import { itemsOf, nextCursorOf } from './output.js';
17
- import { explain, run } from './run.js';
18
- describe('parseArgs', () => {
19
- it('splits the command path from the flags', () => {
20
- const a = parseArgs(['conversations', 'send', 'conv_1', '--json']);
21
- expect(a.path).toEqual(['conversations', 'send', 'conv_1']);
22
- expect(a.flags).toEqual({ json: true });
23
- });
24
- it('accepts --key=value and --key value alike', () => {
25
- expect(str(parseArgs(['x', '--limit=5']).flags, 'limit')).toBe('5');
26
- expect(str(parseArgs(['x', '--limit', '5']).flags, 'limit')).toBe('5');
27
- });
28
- it('collects a repeated flag into an array', () => {
29
- const a = parseArgs(['events', 'track', '--prop', 'a=1', '--prop', 'b=2']);
30
- expect(a.flags['prop']).toEqual(['a=1', 'b=2']);
31
- });
32
- it('keeps a positional that follows a flag', () => {
33
- // `chatly search --limit 5 refunds` must work as well as the other order.
34
- const a = parseArgs(['search', '--limit', '5', 'refunds']);
35
- expect(a.path).toEqual(['search', 'refunds']);
36
- expect(str(a.flags, 'limit')).toBe('5');
37
- });
38
- it('rejects a non-numeric --limit instead of silently passing NaN', () => {
39
- expect(() => num(parseArgs(['x', '--limit', 'lots']).flags, 'limit')).toThrow(/expects a number/);
40
- });
41
- it('treats a trailing flag with no value as true', () => {
42
- expect(bool(parseArgs(['x', '--all']).flags, 'all')).toBe(true);
43
- });
44
- });
45
- describe('credential resolution', () => {
46
- let dir;
47
- let path;
48
- beforeEach(() => {
49
- dir = mkdtempSync(join(tmpdir(), 'chatly-cli-'));
50
- path = join(dir, 'config.json');
51
- });
52
- const write = (c) => {
53
- writeConfig(c, path);
54
- };
55
- it('prefers --key over the environment over the file', () => {
56
- write({ apiKey: 'ck_file' });
57
- const env = { CHATLY_API_KEY: 'ck_env' };
58
- expect(resolveCredentials('ck_flag', undefined, env, path).source).toBe('flag');
59
- expect(resolveCredentials(undefined, undefined, env, path).apiKey).toBe('ck_env');
60
- expect(resolveCredentials(undefined, undefined, {}, path).apiKey).toBe('ck_file');
61
- });
62
- it('writes the config 0600, because the key is a workspace-wide bearer token', () => {
63
- write({ apiKey: 'ck_secret' });
64
- expect(statSync(path).mode & 0o777).toBe(0o600);
65
- expect(JSON.parse(readFileSync(path, 'utf8')).apiKey).toBe('ck_secret');
66
- });
67
- it('re-chmods an existing file, since writeFileSync mode only applies on create', () => {
68
- write({ apiKey: 'ck_one' });
69
- write({ apiKey: 'ck_two' });
70
- expect(statSync(path).mode & 0o777).toBe(0o600);
71
- });
72
- it('says what to do when there is no key at all', () => {
73
- expect(() => resolveCredentials(undefined, undefined, {}, path)).toThrow(/chatly login/);
74
- });
75
- it('survives a corrupt config file rather than refusing to run', () => {
76
- writeConfig({}, path);
77
- const env = { CHATLY_API_KEY: 'ck_env' };
78
- expect(resolveCredentials(undefined, undefined, env, path).apiKey).toBe('ck_env');
79
- });
80
- });
81
- describe('output helpers', () => {
82
- it('finds items under either envelope and nowhere else', () => {
83
- expect(itemsOf({ items: [1, 2] })).toEqual([1, 2]);
84
- expect(itemsOf({ data: [3] })).toEqual([3]);
85
- expect(itemsOf([4])).toEqual([4]);
86
- expect(itemsOf({ nope: 1 })).toEqual([]);
87
- expect(itemsOf(null)).toEqual([]);
88
- });
89
- it('treats an empty cursor as no cursor', () => {
90
- expect(nextCursorOf({ nextCursor: 'c' })).toBe('c');
91
- expect(nextCursorOf({ nextCursor: '' })).toBeNull();
92
- expect(nextCursorOf({ nextCursor: null })).toBeNull();
93
- });
94
- });
95
- describe('run() against a faked socket', () => {
96
- let out;
97
- let err;
98
- beforeEach(() => {
99
- out = [];
100
- err = [];
101
- vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
102
- out.push(String(chunk));
103
- return true;
104
- });
105
- vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
106
- err.push(String(chunk));
107
- return true;
108
- });
109
- });
110
- afterEach(() => {
111
- vi.restoreAllMocks();
112
- });
113
- /** A factory whose client talks to a scripted fetch, not the network. */
114
- function factoryFor(responses, seen = []) {
115
- let i = 0;
116
- const fetchFn = (async (url, init) => {
117
- seen.push({ url: String(url), method: init?.method ?? 'GET' });
118
- const step = responses[Math.min(i, responses.length - 1)] ?? { status: 200, body: '{}' };
119
- i += 1;
120
- return new Response(step.body, {
121
- status: step.status,
122
- headers: { 'content-type': 'application/json' },
123
- });
124
- });
125
- return (opts) => new ChatlyClient({
126
- ...opts,
127
- fetchFn,
128
- sleepFn: async () => undefined,
129
- retry: { attempts: 1 },
130
- });
131
- }
132
- it('prints the version, not the help, for --version', async () => {
133
- const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
134
- expect(await run(['--version'], factoryFor([]))).toBe(0);
135
- /*
136
- * Against package.json, not against a literal.
137
- *
138
- * This asserted `'0.1.0\n'` and passed while the published package was
139
- * 0.1.2, so `chatly --version` lied to every user and to support. A test
140
- * that hard-codes the value it is checking cannot catch drift in it.
141
- */
142
- expect(out.join('')).toBe(`${version}\n`);
143
- });
144
- it('whoami prints the workspace and scopes', async () => {
145
- const code = await run(['whoami', '--key', 'ck_test'], factoryFor([{ status: 200, body: '{"workspaceId":"ws_1","scopes":["contacts:read"]}' }]));
146
- expect(code).toBe(0);
147
- expect(out.join('')).toContain('ws_1');
148
- expect(out.join('')).toContain('contacts:read');
149
- });
150
- it('renders a list as a table, and the raw envelope with --json', async () => {
151
- const body = '{"items":[{"id":"c_1","name":"Ada","email":"ada@x.test"}],"nextCursor":null}';
152
- await run(['contacts', 'list', '--key', 'ck_test'], factoryFor([{ status: 200, body }]));
153
- expect(out.join('')).toContain('ID');
154
- expect(out.join('')).toContain('Ada');
155
- out.length = 0;
156
- await run(['contacts', 'list', '--key', 'ck_test', '--json'], factoryFor([{ status: 200, body }]));
157
- expect(JSON.parse(out.join(''))).toEqual({
158
- items: [{ id: 'c_1', name: 'Ada', email: 'ada@x.test' }],
159
- nextCursor: null,
160
- });
161
- });
162
- it('--all walks every page', async () => {
163
- const seen = [];
164
- await run(['contacts', 'list', '--key', 'ck_test', '--all', '--json'], factoryFor([
165
- { status: 200, body: '{"items":[{"id":"a"}],"nextCursor":"p2"}' },
166
- { status: 200, body: '{"items":[{"id":"b"}],"nextCursor":null}' },
167
- ], seen));
168
- expect(seen).toHaveLength(2);
169
- expect(JSON.parse(out.join(''))).toEqual([{ id: 'a' }, { id: 'b' }]);
170
- });
171
- it('api passes an arbitrary route through, with the method it was given', async () => {
172
- const seen = [];
173
- await run(['api', 'POST', '/v1/feature-flags', '--key', 'ck_test', '--body', '{"key":"x"}'], factoryFor([{ status: 200, body: '{"ok":true}' }], seen));
174
- expect(seen[0]?.method).toBe('POST');
175
- expect(seen[0]?.url).toContain('/v1/feature-flags');
176
- });
177
- it('api refuses a body that is not JSON instead of sending it', async () => {
178
- await expect(run(['api', 'POST', '/v1/x', '--key', 'ck_test', '--body', 'not json'], factoryFor([]))).rejects.toThrow(/not valid JSON/);
179
- });
180
- it('api refuses a path that is not a path', async () => {
181
- await expect(run(['api', 'GET', 'v1/contacts', '--key', 'ck_test'], factoryFor([]))).rejects.toThrow(/Give a path/);
182
- });
183
- it('exits 2 and names the command for an unknown one', async () => {
184
- expect(await run(['nonsense', '--key', 'ck_test'], factoryFor([]))).toBe(2);
185
- expect(err.join('')).toContain('Unknown command "nonsense"');
186
- });
187
- it('refuses to send an empty reply', async () => {
188
- await expect(run(['conversations', 'send', 'conv_1', '--key', 'ck_test'], factoryFor([]))).rejects.toThrow(/Nothing to send/);
189
- });
190
- });
191
- describe('explain()', () => {
192
- it('turns a 401 into advice about the key, not a stack trace', async () => {
193
- const { ChatlyAuthenticationError } = await import('@chatlychat/sdk-node');
194
- const e = new ChatlyAuthenticationError({
195
- status: 401,
196
- code: 'unauthorized',
197
- message: 'bad key',
198
- requestId: 'req_9',
199
- body: '{}',
200
- retryAfter: null,
201
- });
202
- const { code, message } = explain(e);
203
- expect(code).toBe(1);
204
- expect(message).toContain('req_9');
205
- expect(message).toContain('chatly login');
206
- });
207
- it('distinguishes a missing scope (403) from a bad key (401)', async () => {
208
- const { ChatlyPermissionError } = await import('@chatlychat/sdk-node');
209
- const { message } = explain(new ChatlyPermissionError({
210
- status: 403,
211
- code: 'forbidden',
212
- message: 'no',
213
- requestId: null,
214
- body: '{}',
215
- retryAfter: null,
216
- }));
217
- expect(message).toContain('lacks a scope');
218
- expect(message).not.toContain('chatly login');
219
- });
220
- it('says a transport failure never reached Chatly', async () => {
221
- const { ChatlyTransportError } = await import('@chatlychat/sdk-node');
222
- const { message } = explain(new ChatlyTransportError('request failed: GET /v1/x'));
223
- expect(message).toContain('never reached Chatly');
224
- });
225
- });
226
- //# sourceMappingURL=cli.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.spec.js","sourceRoot":"","sources":["../src/cli.spec.ts"],"names":[],"mappings":"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"}