@solidnumber/cli 1.7.2 → 1.7.4

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 (110) hide show
  1. package/dist/commands/audit.js +1 -1
  2. package/dist/commands/audit.js.map +1 -1
  3. package/dist/commands/brand.js +122 -0
  4. package/dist/commands/brand.js.map +1 -1
  5. package/dist/commands/clone.d.ts.map +1 -1
  6. package/dist/commands/clone.js +67 -0
  7. package/dist/commands/clone.js.map +1 -1
  8. package/dist/commands/completion.d.ts.map +1 -1
  9. package/dist/commands/completion.js +4 -0
  10. package/dist/commands/completion.js.map +1 -1
  11. package/dist/commands/demo.d.ts +12 -0
  12. package/dist/commands/demo.d.ts.map +1 -0
  13. package/dist/commands/demo.js +260 -0
  14. package/dist/commands/demo.js.map +1 -0
  15. package/dist/commands/init.d.ts +11 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +377 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/inventory.js +5 -5
  20. package/dist/commands/inventory.js.map +1 -1
  21. package/dist/commands/payment.js +101 -0
  22. package/dist/commands/payment.js.map +1 -1
  23. package/dist/commands/push.d.ts.map +1 -1
  24. package/dist/commands/push.js +42 -0
  25. package/dist/commands/push.js.map +1 -1
  26. package/dist/commands/sandbox.d.ts.map +1 -1
  27. package/dist/commands/sandbox.js +113 -0
  28. package/dist/commands/sandbox.js.map +1 -1
  29. package/dist/index.js +4 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/config.d.ts.map +1 -1
  32. package/dist/lib/config.js +4 -4
  33. package/dist/lib/config.js.map +1 -1
  34. package/package.json +2 -1
  35. package/dist/__tests__/commands/auth.test.d.ts +0 -6
  36. package/dist/__tests__/commands/auth.test.d.ts.map +0 -1
  37. package/dist/__tests__/commands/auth.test.js +0 -91
  38. package/dist/__tests__/commands/auth.test.js.map +0 -1
  39. package/dist/__tests__/commands/billing.test.d.ts +0 -6
  40. package/dist/__tests__/commands/billing.test.d.ts.map +0 -1
  41. package/dist/__tests__/commands/billing.test.js +0 -141
  42. package/dist/__tests__/commands/billing.test.js.map +0 -1
  43. package/dist/__tests__/commands/company.test.d.ts +0 -6
  44. package/dist/__tests__/commands/company.test.d.ts.map +0 -1
  45. package/dist/__tests__/commands/company.test.js +0 -129
  46. package/dist/__tests__/commands/company.test.js.map +0 -1
  47. package/dist/__tests__/commands/deploy.test.d.ts +0 -8
  48. package/dist/__tests__/commands/deploy.test.d.ts.map +0 -1
  49. package/dist/__tests__/commands/deploy.test.js +0 -190
  50. package/dist/__tests__/commands/deploy.test.js.map +0 -1
  51. package/dist/__tests__/commands/history.test.d.ts +0 -8
  52. package/dist/__tests__/commands/history.test.d.ts.map +0 -1
  53. package/dist/__tests__/commands/history.test.js +0 -213
  54. package/dist/__tests__/commands/history.test.js.map +0 -1
  55. package/dist/__tests__/commands/import.test.d.ts +0 -4
  56. package/dist/__tests__/commands/import.test.d.ts.map +0 -1
  57. package/dist/__tests__/commands/import.test.js +0 -71
  58. package/dist/__tests__/commands/import.test.js.map +0 -1
  59. package/dist/__tests__/commands/logs.test.d.ts +0 -5
  60. package/dist/__tests__/commands/logs.test.d.ts.map +0 -1
  61. package/dist/__tests__/commands/logs.test.js +0 -124
  62. package/dist/__tests__/commands/logs.test.js.map +0 -1
  63. package/dist/__tests__/commands/migrate.test.d.ts +0 -9
  64. package/dist/__tests__/commands/migrate.test.d.ts.map +0 -1
  65. package/dist/__tests__/commands/migrate.test.js +0 -277
  66. package/dist/__tests__/commands/migrate.test.js.map +0 -1
  67. package/dist/__tests__/commands/pages.test.d.ts +0 -5
  68. package/dist/__tests__/commands/pages.test.d.ts.map +0 -1
  69. package/dist/__tests__/commands/pages.test.js +0 -103
  70. package/dist/__tests__/commands/pages.test.js.map +0 -1
  71. package/dist/__tests__/commands/push.test.d.ts +0 -6
  72. package/dist/__tests__/commands/push.test.d.ts.map +0 -1
  73. package/dist/__tests__/commands/push.test.js +0 -113
  74. package/dist/__tests__/commands/push.test.js.map +0 -1
  75. package/dist/__tests__/commands/sandbox.test.d.ts +0 -5
  76. package/dist/__tests__/commands/sandbox.test.d.ts.map +0 -1
  77. package/dist/__tests__/commands/sandbox.test.js +0 -132
  78. package/dist/__tests__/commands/sandbox.test.js.map +0 -1
  79. package/dist/__tests__/commands/serve.test.d.ts +0 -5
  80. package/dist/__tests__/commands/serve.test.d.ts.map +0 -1
  81. package/dist/__tests__/commands/serve.test.js +0 -115
  82. package/dist/__tests__/commands/serve.test.js.map +0 -1
  83. package/dist/__tests__/commands/site.test.d.ts +0 -5
  84. package/dist/__tests__/commands/site.test.d.ts.map +0 -1
  85. package/dist/__tests__/commands/site.test.js +0 -92
  86. package/dist/__tests__/commands/site.test.js.map +0 -1
  87. package/dist/__tests__/commands/test.test.d.ts +0 -5
  88. package/dist/__tests__/commands/test.test.d.ts.map +0 -1
  89. package/dist/__tests__/commands/test.test.js +0 -220
  90. package/dist/__tests__/commands/test.test.js.map +0 -1
  91. package/dist/__tests__/integration/smoke.test.d.ts +0 -7
  92. package/dist/__tests__/integration/smoke.test.d.ts.map +0 -1
  93. package/dist/__tests__/integration/smoke.test.js +0 -135
  94. package/dist/__tests__/integration/smoke.test.js.map +0 -1
  95. package/dist/__tests__/lib/api-client.test.d.ts +0 -6
  96. package/dist/__tests__/lib/api-client.test.d.ts.map +0 -1
  97. package/dist/__tests__/lib/api-client.test.js +0 -74
  98. package/dist/__tests__/lib/api-client.test.js.map +0 -1
  99. package/dist/__tests__/lib/company-isolation.test.d.ts +0 -19
  100. package/dist/__tests__/lib/company-isolation.test.d.ts.map +0 -1
  101. package/dist/__tests__/lib/company-isolation.test.js +0 -96
  102. package/dist/__tests__/lib/company-isolation.test.js.map +0 -1
  103. package/dist/__tests__/lib/config.test.d.ts +0 -6
  104. package/dist/__tests__/lib/config.test.d.ts.map +0 -1
  105. package/dist/__tests__/lib/config.test.js +0 -131
  106. package/dist/__tests__/lib/config.test.js.map +0 -1
  107. package/dist/__tests__/setup.d.ts +0 -4
  108. package/dist/__tests__/setup.d.ts.map +0 -1
  109. package/dist/__tests__/setup.js +0 -25
  110. package/dist/__tests__/setup.js.map +0 -1
@@ -1,220 +0,0 @@
1
- "use strict";
2
- /**
3
- * Agent test command tests
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const api_client_1 = require("../../lib/api-client");
7
- jest.mock('../../lib/api-client', () => ({
8
- apiClient: {
9
- agentTest: jest.fn(),
10
- agentTestResults: jest.fn(),
11
- },
12
- handleApiError: jest.fn((e) => ({ message: e?.message || 'Error', status: 500 })),
13
- }));
14
- const mockApi = api_client_1.apiClient;
15
- describe('test command', () => {
16
- beforeEach(() => jest.clearAllMocks());
17
- describe('single test — pass', () => {
18
- it('sends prompt and validates contains assertions', async () => {
19
- mockApi.agentTest.mockResolvedValue({
20
- data: {
21
- passed: true,
22
- agent_type: 'customer_service',
23
- prompt: 'what are your hours',
24
- response: 'We are open Monday through Friday, 9am to 5pm.',
25
- latency_ms: 450,
26
- assertions_passed: [
27
- { type: 'contains', value: 'monday', passed: true },
28
- { type: 'contains', value: 'friday', passed: true },
29
- ],
30
- assertions_failed: [],
31
- assertion_count: 2,
32
- },
33
- status: 200,
34
- success: true,
35
- });
36
- const result = await mockApi.agentTest({
37
- agent_type: 'customer_service',
38
- prompt: 'what are your hours',
39
- assertions: ['monday', 'friday'],
40
- });
41
- expect(result.data.passed).toBe(true);
42
- expect(result.data.assertions_passed).toHaveLength(2);
43
- expect(result.data.assertions_failed).toHaveLength(0);
44
- });
45
- });
46
- describe('single test — fail', () => {
47
- it('fails when response missing required content', async () => {
48
- mockApi.agentTest.mockResolvedValue({
49
- data: {
50
- passed: false,
51
- agent_type: 'customer_service',
52
- prompt: 'what are your hours',
53
- response: 'Please contact us for more information.',
54
- latency_ms: 380,
55
- assertions_passed: [],
56
- assertions_failed: [
57
- { type: 'contains', value: 'monday', passed: false },
58
- ],
59
- assertion_count: 1,
60
- },
61
- status: 200,
62
- success: true,
63
- });
64
- const result = await mockApi.agentTest({
65
- agent_type: 'customer_service',
66
- prompt: 'what are your hours',
67
- assertions: ['monday'],
68
- });
69
- expect(result.data.passed).toBe(false);
70
- expect(result.data.assertions_failed).toHaveLength(1);
71
- });
72
- });
73
- describe('not-contains assertions', () => {
74
- it('passes when forbidden content is absent', async () => {
75
- mockApi.agentTest.mockResolvedValue({
76
- data: {
77
- passed: true,
78
- assertions_passed: [
79
- { type: 'not_contains', value: 'competitor', passed: true },
80
- ],
81
- assertions_failed: [],
82
- },
83
- status: 200,
84
- success: true,
85
- });
86
- const result = await mockApi.agentTest({
87
- agent_type: 'customer_service',
88
- prompt: 'tell me about your product',
89
- not_assertions: ['competitor'],
90
- });
91
- expect(result.data.passed).toBe(true);
92
- });
93
- it('fails when forbidden content is present', async () => {
94
- mockApi.agentTest.mockResolvedValue({
95
- data: {
96
- passed: false,
97
- assertions_passed: [],
98
- assertions_failed: [
99
- { type: 'not_contains', value: 'free trial', passed: false },
100
- ],
101
- },
102
- status: 200,
103
- success: true,
104
- });
105
- const result = await mockApi.agentTest({
106
- agent_type: 'customer_service',
107
- prompt: 'pricing info',
108
- not_assertions: ['free trial'],
109
- });
110
- expect(result.data.passed).toBe(false);
111
- });
112
- });
113
- describe('combined assertions', () => {
114
- it('supports both contains and not-contains in same test', async () => {
115
- mockApi.agentTest.mockResolvedValue({
116
- data: {
117
- passed: true,
118
- assertions_passed: [
119
- { type: 'contains', value: 'pricing', passed: true },
120
- { type: 'not_contains', value: 'competitor', passed: true },
121
- ],
122
- assertions_failed: [],
123
- assertion_count: 2,
124
- },
125
- status: 200,
126
- success: true,
127
- });
128
- const result = await mockApi.agentTest({
129
- agent_type: 'customer_service',
130
- prompt: 'tell me about pricing',
131
- assertions: ['pricing'],
132
- not_assertions: ['competitor'],
133
- });
134
- expect(result.data.passed).toBe(true);
135
- expect(result.data.assertion_count).toBe(2);
136
- });
137
- });
138
- describe('no assertions (response-only mode)', () => {
139
- it('returns response without pass/fail when no assertions given', async () => {
140
- mockApi.agentTest.mockResolvedValue({
141
- data: {
142
- passed: true,
143
- agent_type: 'customer_service',
144
- prompt: 'hello',
145
- response: 'Hi! How can I help you today?',
146
- latency_ms: 200,
147
- assertions_passed: [],
148
- assertions_failed: [],
149
- assertion_count: 0,
150
- },
151
- status: 200,
152
- success: true,
153
- });
154
- const result = await mockApi.agentTest({
155
- agent_type: 'customer_service',
156
- prompt: 'hello',
157
- });
158
- expect(result.data.response).toBeDefined();
159
- expect(result.data.assertion_count).toBe(0);
160
- });
161
- });
162
- describe('test execution errors', () => {
163
- it('handles agent execution failures', async () => {
164
- mockApi.agentTest.mockResolvedValue({
165
- data: {
166
- passed: false,
167
- agent_type: 'customer_service',
168
- prompt: 'test',
169
- response: null,
170
- error: 'Agent timeout after 30s',
171
- latency_ms: 30000,
172
- assertions_passed: [],
173
- assertions_failed: [{ type: 'execution', detail: 'Agent timeout after 30s' }],
174
- },
175
- status: 200,
176
- success: true,
177
- });
178
- const result = await mockApi.agentTest({
179
- agent_type: 'customer_service',
180
- prompt: 'test',
181
- timeout_seconds: 30,
182
- });
183
- expect(result.data.passed).toBe(false);
184
- expect(result.data.error).toContain('timeout');
185
- });
186
- });
187
- describe('test results history', () => {
188
- it('fetches recent test results', async () => {
189
- mockApi.agentTestResults.mockResolvedValue({
190
- data: {
191
- results: [
192
- { timestamp: '2026-03-28T14:00:00Z', agent_type: 'customer_service', success: true, latency_ms: 450, tokens_used: 120 },
193
- { timestamp: '2026-03-28T13:00:00Z', agent_type: 'growth_intelligence', success: false, latency_ms: 1200, tokens_used: 300 },
194
- ],
195
- count: 2,
196
- },
197
- status: 200,
198
- success: true,
199
- });
200
- const result = await mockApi.agentTestResults(24, 50);
201
- expect(mockApi.agentTestResults).toHaveBeenCalledWith(24, 50);
202
- expect(result.data.results).toHaveLength(2);
203
- });
204
- });
205
- describe('agent name resolution', () => {
206
- it('resolves agent names to types', () => {
207
- // Verify the mapping is used in test calls
208
- const nameMap = {
209
- sarah: 'customer_service',
210
- marcus: 'growth_intelligence',
211
- ada: 'orchestrator',
212
- };
213
- for (const [name, type] of Object.entries(nameMap)) {
214
- expect(type).toBeDefined();
215
- expect(type).not.toBe(name); // Name !== type
216
- }
217
- });
218
- });
219
- });
220
- //# sourceMappingURL=test.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/test.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Smoke tests — verify the CLI binary doesn't crash on basic operations.
3
- * These run the actual compiled JS, not the TypeScript source.
4
- * NO API calls — just verifies the CLI starts, shows help, and exits cleanly.
5
- */
6
- export {};
7
- //# sourceMappingURL=smoke.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smoke.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/smoke.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,135 +0,0 @@
1
- "use strict";
2
- /**
3
- * Smoke tests — verify the CLI binary doesn't crash on basic operations.
4
- * These run the actual compiled JS, not the TypeScript source.
5
- * NO API calls — just verifies the CLI starts, shows help, and exits cleanly.
6
- */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __importStar = (this && this.__importStar) || (function () {
24
- var ownKeys = function(o) {
25
- ownKeys = Object.getOwnPropertyNames || function (o) {
26
- var ar = [];
27
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
- return ar;
29
- };
30
- return ownKeys(o);
31
- };
32
- return function (mod) {
33
- if (mod && mod.__esModule) return mod;
34
- var result = {};
35
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
- __setModuleDefault(result, mod);
37
- return result;
38
- };
39
- })();
40
- Object.defineProperty(exports, "__esModule", { value: true });
41
- const child_process_1 = require("child_process");
42
- const path = __importStar(require("path"));
43
- const fs = __importStar(require("fs"));
44
- const CLI_PATH = path.join(__dirname, '..', '..', '..', 'dist', 'index.js');
45
- function run(args) {
46
- return (0, child_process_1.execSync)(`node ${CLI_PATH} ${args}`, {
47
- timeout: 10000,
48
- env: { ...process.env, HOME: '/tmp/solid-test-home', SOLID_API_KEY: '' },
49
- }).toString();
50
- }
51
- function runSafe(args) {
52
- try {
53
- const stdout = (0, child_process_1.execSync)(`node ${CLI_PATH} ${args}`, {
54
- timeout: 10000,
55
- env: { ...process.env, HOME: '/tmp/solid-test-home', SOLID_API_KEY: '' },
56
- stdio: ['pipe', 'pipe', 'pipe'],
57
- }).toString();
58
- return { stdout, exitCode: 0 };
59
- }
60
- catch (e) {
61
- return { stdout: e.stdout?.toString() || '', exitCode: e.status || 1 };
62
- }
63
- }
64
- describe('CLI Smoke Tests', () => {
65
- beforeAll(() => {
66
- // Verify dist exists
67
- if (!fs.existsSync(CLI_PATH)) {
68
- throw new Error(`CLI not built. Run: npm run build\nExpected: ${CLI_PATH}`);
69
- }
70
- });
71
- it('--version prints a valid semver', () => {
72
- const output = run('--version');
73
- expect(output.trim()).toMatch(/^\d+\.\d+\.\d+$/);
74
- });
75
- it('--version matches package.json', () => {
76
- const output = run('--version').trim();
77
- const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', '..', 'package.json'), 'utf-8'));
78
- expect(output).toBe(pkg.version);
79
- });
80
- it('--help shows command list', () => {
81
- const output = run('--help');
82
- expect(output).toContain('auth');
83
- expect(output).toContain('company');
84
- expect(output).toContain('pages');
85
- expect(output).toContain('site');
86
- expect(output).toContain('clone');
87
- expect(output).toContain('billing');
88
- });
89
- it('completion outputs zsh script', () => {
90
- const output = run('completion');
91
- expect(output).toContain('#compdef solid');
92
- expect(output).toContain('_solid');
93
- });
94
- it('completion --bash outputs bash script', () => {
95
- const output = run('completion --bash');
96
- expect(output).toContain('_solid_completions');
97
- expect(output).toContain('complete -F');
98
- });
99
- it('completion --fish outputs fish script', () => {
100
- const output = run('completion --fish');
101
- expect(output).toContain('complete -c solid');
102
- });
103
- it('auth status without credentials exits without crashing', () => {
104
- const result = runSafe('auth status');
105
- // Should not hang or segfault — exit code 0 or 1 are both fine
106
- expect(result.exitCode).toBeLessThanOrEqual(1);
107
- });
108
- it('unknown command shows help, not a crash', () => {
109
- const result = runSafe('nonexistent-command');
110
- expect(result.exitCode).toBeLessThanOrEqual(1);
111
- });
112
- it('pages --help does not crash', () => {
113
- const output = run('pages --help');
114
- expect(output).toContain('list');
115
- expect(output).toContain('publish');
116
- });
117
- it('site --help does not crash', () => {
118
- const output = run('site --help');
119
- expect(output).toContain('list');
120
- expect(output).toContain('create');
121
- expect(output).toContain('templates');
122
- });
123
- it('billing --help does not crash', () => {
124
- const output = run('billing --help');
125
- expect(output).toContain('status');
126
- expect(output).toContain('checkout-link');
127
- expect(output).toContain('invoice');
128
- });
129
- it('seo --help does not crash', () => {
130
- const output = run('seo --help');
131
- expect(output).toContain('site-audit');
132
- expect(output).toContain('report');
133
- });
134
- });
135
- //# sourceMappingURL=smoke.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smoke.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/smoke.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * API Client tests — verifies error handling and request shapes.
3
- * Mocks axios so NO real HTTP calls are made.
4
- */
5
- export {};
6
- //# sourceMappingURL=api-client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/api-client.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,74 +0,0 @@
1
- "use strict";
2
- /**
3
- * API Client tests — verifies error handling and request shapes.
4
- * Mocks axios so NO real HTTP calls are made.
5
- */
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- const api_client_1 = require("../../lib/api-client");
11
- const axios_1 = __importDefault(require("axios"));
12
- describe('handleApiError', () => {
13
- it('extracts detail from axios error response', () => {
14
- jest.spyOn(axios_1.default, 'isAxiosError').mockReturnValue(true);
15
- const error = {
16
- isAxiosError: true,
17
- response: { status: 404, data: { detail: 'Not found' } },
18
- message: 'Request failed',
19
- };
20
- const result = (0, api_client_1.handleApiError)(error);
21
- expect(result.message).toBe('Not found');
22
- expect(result.status).toBe(404);
23
- });
24
- it('extracts message field when detail is missing', () => {
25
- jest.spyOn(axios_1.default, 'isAxiosError').mockReturnValue(true);
26
- const error = {
27
- isAxiosError: true,
28
- response: { status: 400, data: { message: 'Bad request' } },
29
- message: 'Request failed',
30
- };
31
- const result = (0, api_client_1.handleApiError)(error);
32
- expect(result.message).toBe('Bad request');
33
- expect(result.status).toBe(400);
34
- });
35
- it('falls back to axios message when no response data', () => {
36
- jest.spyOn(axios_1.default, 'isAxiosError').mockReturnValue(true);
37
- const error = {
38
- isAxiosError: true,
39
- response: { status: 500, data: {} },
40
- message: 'Network Error',
41
- };
42
- const result = (0, api_client_1.handleApiError)(error);
43
- expect(result.message).toBe('Network Error');
44
- });
45
- it('handles non-axios Error objects', () => {
46
- jest.spyOn(axios_1.default, 'isAxiosError').mockReturnValue(false);
47
- const result = (0, api_client_1.handleApiError)(new Error('Connection timeout'));
48
- expect(result.message).toBe('Connection timeout');
49
- expect(result.status).toBe(500);
50
- });
51
- it('handles unknown error types', () => {
52
- jest.spyOn(axios_1.default, 'isAxiosError').mockReturnValue(false);
53
- const result = (0, api_client_1.handleApiError)('some string error');
54
- expect(result.message).toBe('Unknown error');
55
- expect(result.status).toBe(500);
56
- });
57
- it('handles null/undefined errors', () => {
58
- jest.spyOn(axios_1.default, 'isAxiosError').mockReturnValue(false);
59
- const result = (0, api_client_1.handleApiError)(null);
60
- expect(result.message).toBe('Unknown error');
61
- });
62
- it('returns 401 status for auth errors', () => {
63
- jest.spyOn(axios_1.default, 'isAxiosError').mockReturnValue(true);
64
- const error = {
65
- isAxiosError: true,
66
- response: { status: 401, data: { detail: 'Token expired' } },
67
- message: 'Unauthorized',
68
- };
69
- const result = (0, api_client_1.handleApiError)(error);
70
- expect(result.status).toBe(401);
71
- expect(result.message).toBe('Token expired');
72
- });
73
- });
74
- //# sourceMappingURL=api-client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/api-client.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Company Isolation Tests — CRITICAL SECURITY
3
- *
4
- * Verifies that the CLI cannot cross company boundaries.
5
- * An AI agent bot with a JWT for company 42 must NEVER be able to
6
- * read, write, or modify data belonging to company 43.
7
- *
8
- * The CLI relies on the backend for enforcement (JWT contains company_id,
9
- * RLS policies on all 420 tables, middleware checks). These tests verify
10
- * the CLI's CONTRIBUTION to isolation:
11
- *
12
- * 1. Every API call includes X-Company-ID header
13
- * 2. Company switch replaces the JWT entirely (not just a header)
14
- * 3. Config never falls back to a default company_id
15
- * 4. Logout clears ALL company context
16
- * 5. Reserved company IDs (1, 2, 3) are never used in normal operations
17
- */
18
- export {};
19
- //# sourceMappingURL=company-isolation.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"company-isolation.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/company-isolation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,96 +0,0 @@
1
- "use strict";
2
- /**
3
- * Company Isolation Tests — CRITICAL SECURITY
4
- *
5
- * Verifies that the CLI cannot cross company boundaries.
6
- * An AI agent bot with a JWT for company 42 must NEVER be able to
7
- * read, write, or modify data belonging to company 43.
8
- *
9
- * The CLI relies on the backend for enforcement (JWT contains company_id,
10
- * RLS policies on all 420 tables, middleware checks). These tests verify
11
- * the CLI's CONTRIBUTION to isolation:
12
- *
13
- * 1. Every API call includes X-Company-ID header
14
- * 2. Company switch replaces the JWT entirely (not just a header)
15
- * 3. Config never falls back to a default company_id
16
- * 4. Logout clears ALL company context
17
- * 5. Reserved company IDs (1, 2, 3) are never used in normal operations
18
- */
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- const config_1 = require("../../lib/config");
21
- describe('Company Isolation — Security Critical', () => {
22
- describe('company_id is always explicit', () => {
23
- it('config.companyId is set in test environment', () => {
24
- expect(config_1.config.companyId).toBe(99999);
25
- });
26
- it('companyId is a number, never a string', () => {
27
- expect(typeof config_1.config.companyId).toBe('number');
28
- });
29
- it('companyId is never 0 (which could bypass RLS)', () => {
30
- expect(config_1.config.companyId).not.toBe(0);
31
- });
32
- it('companyId is never negative', () => {
33
- expect(config_1.config.companyId).toBeGreaterThan(0);
34
- });
35
- });
36
- describe('reserved company IDs are protected', () => {
37
- const RESERVED = [1, 2, 3];
38
- it('company 1 (SolidNumber Dev) is never used in tests', () => {
39
- expect(config_1.config.companyId).not.toBe(1);
40
- });
41
- it('company 2 (Template Company) is never used in tests', () => {
42
- expect(config_1.config.companyId).not.toBe(2);
43
- });
44
- it('company 3 (SolidNumber Production) is never used in tests', () => {
45
- expect(config_1.config.companyId).not.toBe(3);
46
- });
47
- it('test company_id 99999 is not a reserved ID', () => {
48
- expect(RESERVED).not.toContain(99999);
49
- });
50
- });
51
- describe('logout clears all company context', () => {
52
- it('logout is callable', () => {
53
- expect(typeof config_1.config.logout).toBe('function');
54
- });
55
- // The actual logout behavior is tested in config.test.ts
56
- // Here we verify the CONTRACT: logout must clear company_id
57
- it('after logout, a re-login is required before any API call', () => {
58
- // The isLoggedIn check gates every command
59
- // If logout works correctly, isLoggedIn() returns false after
60
- expect(config_1.config.isLoggedIn).toBeDefined();
61
- });
62
- });
63
- describe('API key isolation', () => {
64
- it('SOLID_API_KEY env var is not set in test environment', () => {
65
- // Tests must NEVER use a real API key
66
- const testEnvKey = process.env.SOLID_API_KEY;
67
- expect(testEnvKey).toBeFalsy();
68
- });
69
- it('access token in test config is clearly fake', () => {
70
- expect(config_1.config.accessToken).toContain('test');
71
- expect(config_1.config.accessToken).not.toContain('sk_');
72
- expect(config_1.config.accessToken).not.toContain('solid_');
73
- });
74
- });
75
- describe('cross-company protection contract', () => {
76
- it('API client sends X-Company-ID header from config', () => {
77
- // The api-client.ts interceptor attaches X-Company-ID from config.companyId
78
- // This test documents the CONTRACT — the interceptor is tested in api-client tests
79
- // Backend rejects requests where JWT company_id != X-Company-ID
80
- expect(config_1.config.companyId).toBeDefined();
81
- });
82
- it('company switch requires a new JWT, not just a header change', () => {
83
- // companySwitch returns a NEW access_token + refresh_token
84
- // The old JWT is replaced entirely
85
- // This prevents an attacker from just changing X-Company-ID header
86
- // while keeping an old JWT (backend would reject mismatched JWT)
87
- expect(true).toBe(true); // Contract documentation
88
- });
89
- it('no fallback to company_id=1 anywhere', () => {
90
- // A common vulnerability: code falls back to company_id=1 when auth fails
91
- // The CLI must NEVER do this — missing auth = error, not fallback
92
- expect(config_1.config.companyId).not.toBe(1);
93
- });
94
- });
95
- });
96
- //# sourceMappingURL=company-isolation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"company-isolation.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/company-isolation.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Config manager tests — verifies auth state, token expiry, logout, company isolation.
3
- * Mocks filesystem so no real ~/.solid/config.json is touched.
4
- */
5
- export {};
6
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/config.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}