@countfinancial/cli 0.1.8 → 0.2.2

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 (105) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +9 -1
  3. package/dist/__tests__/credentialStore.test.js +9 -0
  4. package/dist/__tests__/credentialStore.test.js.map +1 -1
  5. package/dist/__tests__/doctor.test.d.ts +1 -0
  6. package/dist/__tests__/doctor.test.js +30 -0
  7. package/dist/__tests__/doctor.test.js.map +1 -0
  8. package/dist/__tests__/mcpInstall.test.d.ts +1 -0
  9. package/dist/__tests__/mcpInstall.test.js +25 -0
  10. package/dist/__tests__/mcpInstall.test.js.map +1 -0
  11. package/dist/__tests__/profileStore.test.d.ts +1 -0
  12. package/dist/__tests__/profileStore.test.js +53 -0
  13. package/dist/__tests__/profileStore.test.js.map +1 -0
  14. package/dist/cli.js +122 -9
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/doctor.command.d.ts +6 -0
  17. package/dist/commands/doctor.command.js +12 -0
  18. package/dist/commands/doctor.command.js.map +1 -0
  19. package/dist/commands/init.command.d.ts +1 -0
  20. package/dist/commands/init.command.js +6 -1
  21. package/dist/commands/init.command.js.map +1 -1
  22. package/dist/commands/login.command.d.ts +1 -0
  23. package/dist/commands/login.command.js +3 -3
  24. package/dist/commands/login.command.js.map +1 -1
  25. package/dist/commands/logout.command.d.ts +5 -1
  26. package/dist/commands/logout.command.js +3 -3
  27. package/dist/commands/logout.command.js.map +1 -1
  28. package/dist/commands/mcp.command.d.ts +5 -1
  29. package/dist/commands/mcp.command.js +7 -4
  30. package/dist/commands/mcp.command.js.map +1 -1
  31. package/dist/commands/mcpInstall.command.d.ts +7 -0
  32. package/dist/commands/mcpInstall.command.js +9 -0
  33. package/dist/commands/mcpInstall.command.js.map +1 -0
  34. package/dist/commands/profiles.command.d.ts +17 -0
  35. package/dist/commands/profiles.command.js +48 -0
  36. package/dist/commands/profiles.command.js.map +1 -0
  37. package/dist/commands/setup.command.d.ts +11 -0
  38. package/dist/commands/setup.command.js +85 -0
  39. package/dist/commands/setup.command.js.map +1 -0
  40. package/dist/commands/status.command.d.ts +6 -1
  41. package/dist/commands/status.command.js +7 -4
  42. package/dist/commands/status.command.js.map +1 -1
  43. package/dist/commands/testTools.command.d.ts +7 -0
  44. package/dist/commands/testTools.command.js +42 -0
  45. package/dist/commands/testTools.command.js.map +1 -0
  46. package/dist/constants.d.ts +2 -2
  47. package/dist/constants.js +2 -2
  48. package/dist/constants.js.map +1 -1
  49. package/dist/helpers/toolSmokeTestFixtures.helper.d.ts +16 -0
  50. package/dist/helpers/toolSmokeTestFixtures.helper.js +491 -0
  51. package/dist/helpers/toolSmokeTestFixtures.helper.js.map +1 -0
  52. package/dist/partner-mcp/helpers/mcpKnowledge.helper.js +114 -4
  53. package/dist/partner-mcp/helpers/mcpKnowledge.helper.js.map +1 -1
  54. package/dist/partner-mcp/helpers/mcpPayloadValidation.helper.d.ts +1 -1
  55. package/dist/partner-mcp/helpers/mcpPayloadValidation.helper.js +61 -84
  56. package/dist/partner-mcp/helpers/mcpPayloadValidation.helper.js.map +1 -1
  57. package/dist/partner-mcp/helpers/mcpPlaybooks.helper.js +181 -2
  58. package/dist/partner-mcp/helpers/mcpPlaybooks.helper.js.map +1 -1
  59. package/dist/partner-mcp/helpers/mcpRecoveryHint.helper.js +79 -0
  60. package/dist/partner-mcp/helpers/mcpRecoveryHint.helper.js.map +1 -1
  61. package/dist/partner-mcp/schemas/bodies.d.ts +528 -0
  62. package/dist/partner-mcp/schemas/bodies.js +377 -0
  63. package/dist/partner-mcp/schemas/bodies.js.map +1 -0
  64. package/dist/partner-mcp/schemas/builders.d.ts +36 -0
  65. package/dist/partner-mcp/schemas/builders.js +106 -0
  66. package/dist/partner-mcp/schemas/builders.js.map +1 -0
  67. package/dist/partner-mcp/schemas/index.d.ts +5 -0
  68. package/dist/partner-mcp/schemas/index.js +6 -0
  69. package/dist/partner-mcp/schemas/index.js.map +1 -0
  70. package/dist/partner-mcp/schemas/primitives.d.ts +39 -0
  71. package/dist/partner-mcp/schemas/primitives.js +107 -0
  72. package/dist/partner-mcp/schemas/primitives.js.map +1 -0
  73. package/dist/partner-mcp/schemas/queries.d.ts +311 -0
  74. package/dist/partner-mcp/schemas/queries.js +175 -0
  75. package/dist/partner-mcp/schemas/queries.js.map +1 -0
  76. package/dist/partner-mcp/schemas/toolInputSchemas.d.ts +23 -0
  77. package/dist/partner-mcp/schemas/toolInputSchemas.js +248 -0
  78. package/dist/partner-mcp/schemas/toolInputSchemas.js.map +1 -0
  79. package/dist/partner-mcp/tools/definitions.js +26 -135
  80. package/dist/partner-mcp/tools/definitions.js.map +1 -1
  81. package/dist/partner-mcp/tools/registerTools.d.ts +8 -0
  82. package/dist/partner-mcp/tools/registerTools.js +8 -3
  83. package/dist/partner-mcp/tools/registerTools.js.map +1 -1
  84. package/dist/services/credentialStore.service.d.ts +8 -2
  85. package/dist/services/credentialStore.service.js +22 -10
  86. package/dist/services/credentialStore.service.js.map +1 -1
  87. package/dist/services/doctor.service.d.ts +22 -0
  88. package/dist/services/doctor.service.js +186 -0
  89. package/dist/services/doctor.service.js.map +1 -0
  90. package/dist/services/mcpInstall.service.d.ts +43 -0
  91. package/dist/services/mcpInstall.service.js +117 -0
  92. package/dist/services/mcpInstall.service.js.map +1 -0
  93. package/dist/services/mcpLauncher.service.d.ts +2 -0
  94. package/dist/services/mcpLauncher.service.js +6 -3
  95. package/dist/services/mcpLauncher.service.js.map +1 -1
  96. package/dist/services/profileStore.service.d.ts +53 -0
  97. package/dist/services/profileStore.service.js +129 -0
  98. package/dist/services/profileStore.service.js.map +1 -0
  99. package/dist/services/setupPrompt.service.d.ts +25 -0
  100. package/dist/services/setupPrompt.service.js +40 -0
  101. package/dist/services/setupPrompt.service.js.map +1 -0
  102. package/dist/services/toolSmokeTest.service.d.ts +38 -0
  103. package/dist/services/toolSmokeTest.service.js +495 -0
  104. package/dist/services/toolSmokeTest.service.js.map +1 -0
  105. package/package.json +3 -2
@@ -0,0 +1,495 @@
1
+ import { CLI_VERSION } from '../constants.js';
2
+ import { PartnerApiClient } from '../partner-mcp/partnerApiClient.js';
3
+ import { executeCountPartnerTool } from '../partner-mcp/tools/registerTools.js';
4
+ import { getToolDefinition, toolDefinitions } from '../partner-mcp/tools/definitions.js';
5
+ import { loadCredentials } from './credentialStore.service.js';
6
+ import { resolveCredentialsFilePath } from './profileStore.service.js';
7
+ import { runDoctorChecks } from './doctor.service.js';
8
+ import { extractRecordIdentifierFromApiResponse, seedSmokeTestFixtures, } from '../helpers/toolSmokeTestFixtures.helper.js';
9
+ function sleep(params) {
10
+ return new Promise((_resolve) => {
11
+ setTimeout(_resolve, params.milliseconds);
12
+ });
13
+ }
14
+ function listPathToFixtureResourceKey(pathTemplate) {
15
+ return pathTemplate.replace(/^\/partners\//, '');
16
+ }
17
+ function resolvePathParameterInput(params) {
18
+ const { tool, fixtureIdentifierCache } = params;
19
+ const pathParameterMatches = [...tool.pathTemplate.matchAll(/\{(\w+)\}/g)];
20
+ if (pathParameterMatches.length === 0) {
21
+ return {};
22
+ }
23
+ const pathParameterInput = {};
24
+ for (const pathParameterMatch of pathParameterMatches) {
25
+ const pathParameterName = pathParameterMatch[1];
26
+ if (pathParameterName === 'versionNumber') {
27
+ pathParameterInput.versionNumber = 1;
28
+ continue;
29
+ }
30
+ const resourcePathBeforeParameter = tool.pathTemplate
31
+ .slice(0, pathParameterMatch.index)
32
+ .replace(/\/$/, '')
33
+ .replace(/^\/partners\//, '');
34
+ const fixtureIdentifier = fixtureIdentifierCache.fixtureIdentifiersByResourcePath[resourcePathBeforeParameter];
35
+ if (!fixtureIdentifier) {
36
+ return null;
37
+ }
38
+ pathParameterInput[pathParameterName] = fixtureIdentifier;
39
+ }
40
+ return pathParameterInput;
41
+ }
42
+ function buildReportDateRangeQuery() {
43
+ const currentDate = new Date();
44
+ const year = currentDate.getUTCFullYear();
45
+ const month = String(currentDate.getUTCMonth() + 1).padStart(2, '0');
46
+ const lastDayOfMonth = new Date(Date.UTC(year, currentDate.getUTCMonth() + 1, 0)).getUTCDate();
47
+ return {
48
+ startDate: `${year}-01-01`,
49
+ endDate: `${year}-${month}-${String(lastDayOfMonth).padStart(2, '0')}`,
50
+ };
51
+ }
52
+ function buildSmokeTestInput(params) {
53
+ const { tool } = params;
54
+ if (tool.name === 'COUNT_auth_status' || tool.name === 'COUNT_refresh_access_token') {
55
+ return {};
56
+ }
57
+ if (tool.name === 'COUNT_describe_endpoint') {
58
+ return { toolName: 'COUNT_list_customers' };
59
+ }
60
+ if (tool.name === 'COUNT_knowledge' || tool.name === 'COUNT_playbooks') {
61
+ return {};
62
+ }
63
+ if (tool.name === 'COUNT_resolve_references') {
64
+ return { customerName: 'Aimee' };
65
+ }
66
+ if (tool.name === 'COUNT_validate_payload') {
67
+ return {
68
+ toolName: 'COUNT_list_customers',
69
+ query: { limit: 1 },
70
+ };
71
+ }
72
+ if (tool.pathTemplate.startsWith('/partners/reports/')) {
73
+ return { query: buildReportDateRangeQuery() };
74
+ }
75
+ const pathParameterInput = resolvePathParameterInput(params);
76
+ if (pathParameterInput === null) {
77
+ return null;
78
+ }
79
+ if (tool.method === 'GET' && Object.keys(pathParameterInput).length > 0) {
80
+ if (tool.pathTemplate.includes('/grid') || tool.pathTemplate.includes('/versions')) {
81
+ return {
82
+ ...pathParameterInput,
83
+ query: { limit: 1 },
84
+ };
85
+ }
86
+ return pathParameterInput;
87
+ }
88
+ if (tool.method === 'GET') {
89
+ if (tool.pathTemplate.endsWith('/overall') || tool.name === 'COUNT_get_workspace_stats') {
90
+ return {};
91
+ }
92
+ return { query: { limit: 1 } };
93
+ }
94
+ return {};
95
+ }
96
+ function extractToolErrorMessage(params) {
97
+ const firstContentBlock = params.toolResult.content[0];
98
+ if (firstContentBlock && firstContentBlock.type === 'text') {
99
+ return firstContentBlock.text.slice(0, 500);
100
+ }
101
+ return 'Unknown MCP tool error.';
102
+ }
103
+ function updateFixtureCacheFromSuccessfulListTool(params) {
104
+ if (params.toolResult.isError || params.tool.method !== 'GET' || !params.tool.readOnly) {
105
+ return;
106
+ }
107
+ if (params.tool.pathTemplate.includes('{')) {
108
+ return;
109
+ }
110
+ const recordIdentifier = extractRecordIdentifierFromApiResponse(params.toolResult.structuredContent?.result);
111
+ if (!recordIdentifier) {
112
+ return;
113
+ }
114
+ const fixtureResourceKey = listPathToFixtureResourceKey(params.tool.pathTemplate);
115
+ params.fixtureIdentifierCache.fixtureIdentifiersByResourcePath[fixtureResourceKey] = recordIdentifier;
116
+ }
117
+ function classifyLiveToolFailure(params) {
118
+ if (params.tool.readOnly &&
119
+ (params.errorMessage.includes('"statusCode": 404') ||
120
+ params.errorMessage.includes('statusCode": 404') ||
121
+ params.errorMessage.includes("Can't find GET"))) {
122
+ return 'skip';
123
+ }
124
+ return 'fail';
125
+ }
126
+ async function executeSmokeTest(params) {
127
+ const startedAtMilliseconds = Date.now();
128
+ const { tool, client, fixtureIdentifierCache, describeEndpointTool, validatePayloadTool } = params;
129
+ if (!tool.readOnly) {
130
+ const describeResult = await executeCountPartnerTool({
131
+ tool: describeEndpointTool,
132
+ input: { toolName: tool.name },
133
+ client,
134
+ });
135
+ if (describeResult.isError) {
136
+ return {
137
+ toolName: tool.name,
138
+ title: tool.title,
139
+ status: 'fail',
140
+ mode: 'registry',
141
+ readOnly: tool.readOnly,
142
+ destructive: tool.destructive,
143
+ durationMilliseconds: Date.now() - startedAtMilliseconds,
144
+ message: extractToolErrorMessage({ toolResult: describeResult }),
145
+ };
146
+ }
147
+ const validateResult = await executeCountPartnerTool({
148
+ tool: validatePayloadTool,
149
+ input: {
150
+ toolName: tool.name,
151
+ body: {},
152
+ },
153
+ client,
154
+ });
155
+ const validationMessage = validateResult.isError
156
+ ? extractToolErrorMessage({ toolResult: validateResult })
157
+ : 'Payload validation handler responded successfully.';
158
+ return {
159
+ toolName: tool.name,
160
+ title: tool.title,
161
+ status: 'pass',
162
+ mode: 'validation',
163
+ readOnly: tool.readOnly,
164
+ destructive: tool.destructive,
165
+ durationMilliseconds: Date.now() - startedAtMilliseconds,
166
+ message: `Registry and validation verified (write/destructive tool not executed). ${validationMessage}`,
167
+ };
168
+ }
169
+ const smokeTestInput = buildSmokeTestInput({ tool, fixtureIdentifierCache });
170
+ if (smokeTestInput === null) {
171
+ return {
172
+ toolName: tool.name,
173
+ title: tool.title,
174
+ status: 'skip',
175
+ mode: 'live',
176
+ readOnly: tool.readOnly,
177
+ destructive: tool.destructive,
178
+ durationMilliseconds: Date.now() - startedAtMilliseconds,
179
+ message: 'No fixture record available for required path parameters.',
180
+ };
181
+ }
182
+ const toolResult = await executeCountPartnerTool({
183
+ tool,
184
+ input: smokeTestInput,
185
+ client,
186
+ });
187
+ updateFixtureCacheFromSuccessfulListTool({
188
+ tool,
189
+ toolResult,
190
+ fixtureIdentifierCache,
191
+ });
192
+ if (toolResult.isError) {
193
+ const errorMessage = extractToolErrorMessage({ toolResult });
194
+ const failureStatus = classifyLiveToolFailure({ tool, errorMessage });
195
+ return {
196
+ toolName: tool.name,
197
+ title: tool.title,
198
+ status: failureStatus,
199
+ mode: 'live',
200
+ readOnly: tool.readOnly,
201
+ destructive: tool.destructive,
202
+ durationMilliseconds: Date.now() - startedAtMilliseconds,
203
+ message: failureStatus === 'skip'
204
+ ? `Partner API route not available in this environment. ${errorMessage}`
205
+ : errorMessage,
206
+ };
207
+ }
208
+ return {
209
+ toolName: tool.name,
210
+ title: tool.title,
211
+ status: 'pass',
212
+ mode: 'live',
213
+ readOnly: tool.readOnly,
214
+ destructive: tool.destructive,
215
+ durationMilliseconds: Date.now() - startedAtMilliseconds,
216
+ message: 'Live MCP tool call succeeded.',
217
+ };
218
+ }
219
+ export async function runToolSmokeTests(params = {}) {
220
+ const { profileName, homeDirectory, delayBetweenCallsMilliseconds = 75 } = params;
221
+ const credentialsFilePath = resolveCredentialsFilePath({ profileName, homeDirectory });
222
+ const credentials = await loadCredentials({ profileName, homeDirectory, configFilePath: credentialsFilePath });
223
+ if (!credentials?.clientId || !credentials.clientSecret) {
224
+ throw new Error('Partner credentials are not configured. Run `count init` or `count login` first.');
225
+ }
226
+ const partnerClient = new PartnerApiClient({
227
+ config: {
228
+ apiBaseUrl: credentials.apiBaseUrl,
229
+ clientId: credentials.clientId,
230
+ clientSecret: credentials.clientSecret,
231
+ accessToken: credentials.accessToken,
232
+ refreshToken: credentials.refreshToken,
233
+ requestTimeoutMs: credentials.requestTimeoutMs,
234
+ credentialsFilePath,
235
+ },
236
+ });
237
+ const describeEndpointTool = getToolDefinition({ toolName: 'COUNT_describe_endpoint' });
238
+ const validatePayloadTool = getToolDefinition({ toolName: 'COUNT_validate_payload' });
239
+ if (!describeEndpointTool || !validatePayloadTool) {
240
+ throw new Error('Required MCP meta tools are missing from the tool registry.');
241
+ }
242
+ const doctorResult = await runDoctorChecks({ profileName, homeDirectory });
243
+ const fixtureIdentifierCache = {
244
+ fixtureIdentifiersByResourcePath: {},
245
+ supportingAccountIdentifiers: {},
246
+ };
247
+ await seedSmokeTestFixtures({
248
+ client: partnerClient,
249
+ fixtureIdentifierCache,
250
+ delayBetweenCallsMilliseconds,
251
+ });
252
+ const toolResults = [];
253
+ const sortedToolDefinitions = [...toolDefinitions].sort((_leftTool, _rightTool) => {
254
+ if (_leftTool.readOnly !== _rightTool.readOnly) {
255
+ return _leftTool.readOnly ? -1 : 1;
256
+ }
257
+ const leftIsListTool = _leftTool.name.startsWith('COUNT_list_') ? 0 : 1;
258
+ const rightIsListTool = _rightTool.name.startsWith('COUNT_list_') ? 0 : 1;
259
+ if (leftIsListTool !== rightIsListTool) {
260
+ return leftIsListTool - rightIsListTool;
261
+ }
262
+ return _leftTool.name.localeCompare(_rightTool.name);
263
+ });
264
+ for (const tool of sortedToolDefinitions) {
265
+ const toolSmokeTestResult = await executeSmokeTest({
266
+ tool,
267
+ client: partnerClient,
268
+ fixtureIdentifierCache,
269
+ describeEndpointTool,
270
+ validatePayloadTool,
271
+ });
272
+ toolResults.push(toolSmokeTestResult);
273
+ if (delayBetweenCallsMilliseconds > 0) {
274
+ await sleep({ milliseconds: delayBetweenCallsMilliseconds });
275
+ }
276
+ }
277
+ const passed = toolResults.filter((_result) => _result.status === 'pass').length;
278
+ const failed = toolResults.filter((_result) => _result.status === 'fail').length;
279
+ const skipped = toolResults.filter((_result) => _result.status === 'skip').length;
280
+ const totalTools = toolResults.length;
281
+ const passRatePercent = totalTools === 0 ? 0 : Math.round((passed / totalTools) * 1000) / 10;
282
+ return {
283
+ generatedAtIso: new Date().toISOString(),
284
+ cliVersion: CLI_VERSION,
285
+ workspaceName: credentials.workspaceName ?? credentials.workspaceId ?? 'Authenticated workspace',
286
+ apiBaseUrl: credentials.apiBaseUrl,
287
+ doctorResult,
288
+ toolResults,
289
+ summary: {
290
+ totalTools,
291
+ passed,
292
+ failed,
293
+ skipped,
294
+ passRatePercent,
295
+ },
296
+ };
297
+ }
298
+ function escapeHtml(rawText) {
299
+ return rawText
300
+ .replaceAll('&', '&')
301
+ .replaceAll('<', '&lt;')
302
+ .replaceAll('>', '&gt;')
303
+ .replaceAll('"', '&quot;');
304
+ }
305
+ export function generateToolSmokeTestHtmlReport(params) {
306
+ const { report } = params;
307
+ const overallHealthy = report.summary.failed === 0 && report.doctorResult.passed;
308
+ const statusLabel = overallHealthy ? 'All systems operational' : 'Issues detected';
309
+ const statusClass = overallHealthy ? 'status-pass' : 'status-fail';
310
+ const doctorRows = report.doctorResult.checks
311
+ .map((_check) => {
312
+ return `<tr>
313
+ <td><span class="pill pill-${_check.status}">${escapeHtml(_check.status)}</span></td>
314
+ <td>${escapeHtml(_check.label)}</td>
315
+ <td>${escapeHtml(_check.message)}</td>
316
+ </tr>`;
317
+ })
318
+ .join('\n');
319
+ const toolRows = report.toolResults
320
+ .map((_result) => {
321
+ return `<tr>
322
+ <td><span class="pill pill-${_result.status}">${escapeHtml(_result.status)}</span></td>
323
+ <td><code>${escapeHtml(_result.toolName)}</code></td>
324
+ <td>${escapeHtml(_result.title)}</td>
325
+ <td>${escapeHtml(_result.mode)}</td>
326
+ <td>${_result.readOnly ? 'yes' : 'no'}</td>
327
+ <td>${_result.destructive ? 'yes' : 'no'}</td>
328
+ <td>${_result.durationMilliseconds} ms</td>
329
+ <td>${escapeHtml(_result.message)}</td>
330
+ </tr>`;
331
+ })
332
+ .join('\n');
333
+ return `<!DOCTYPE html>
334
+ <html lang="en">
335
+ <head>
336
+ <meta charset="utf-8" />
337
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
338
+ <title>COUNT CLI Tool Smoke Test Report</title>
339
+ <style>
340
+ :root {
341
+ color-scheme: light;
342
+ --brand: #e48642;
343
+ --pass: #15803d;
344
+ --fail: #b91c1c;
345
+ --skip: #a16207;
346
+ --warn: #b45309;
347
+ --bg: #f8fafc;
348
+ --card: #ffffff;
349
+ --text: #0f172a;
350
+ --muted: #475569;
351
+ --border: #e2e8f0;
352
+ }
353
+ * { box-sizing: border-box; }
354
+ body {
355
+ margin: 0;
356
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
357
+ background: var(--bg);
358
+ color: var(--text);
359
+ line-height: 1.5;
360
+ }
361
+ header {
362
+ background: linear-gradient(135deg, #1e293b, #334155);
363
+ color: white;
364
+ padding: 32px 24px;
365
+ }
366
+ header h1 { margin: 0 0 8px; font-size: 1.75rem; }
367
+ header p { margin: 0; color: #cbd5e1; }
368
+ main { max-width: 1400px; margin: 0 auto; padding: 24px; }
369
+ .grid {
370
+ display: grid;
371
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
372
+ gap: 16px;
373
+ margin-bottom: 24px;
374
+ }
375
+ .card {
376
+ background: var(--card);
377
+ border: 1px solid var(--border);
378
+ border-radius: 12px;
379
+ padding: 16px;
380
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06);
381
+ }
382
+ .card h2, .card h3 { margin: 0 0 8px; font-size: 1rem; }
383
+ .metric { font-size: 2rem; font-weight: 700; color: var(--brand); }
384
+ .muted { color: var(--muted); font-size: 0.925rem; }
385
+ .status-banner {
386
+ border-radius: 12px;
387
+ padding: 16px 20px;
388
+ margin-bottom: 24px;
389
+ font-weight: 600;
390
+ border: 1px solid transparent;
391
+ }
392
+ .status-pass {
393
+ background: #ecfdf5;
394
+ color: var(--pass);
395
+ border-color: #bbf7d0;
396
+ }
397
+ .status-fail {
398
+ background: #fef2f2;
399
+ color: var(--fail);
400
+ border-color: #fecaca;
401
+ }
402
+ table {
403
+ width: 100%;
404
+ border-collapse: collapse;
405
+ font-size: 0.875rem;
406
+ background: var(--card);
407
+ }
408
+ th, td {
409
+ border-bottom: 1px solid var(--border);
410
+ padding: 10px 12px;
411
+ vertical-align: top;
412
+ text-align: left;
413
+ }
414
+ th {
415
+ background: #f1f5f9;
416
+ position: sticky;
417
+ top: 0;
418
+ z-index: 1;
419
+ }
420
+ .table-wrap {
421
+ overflow: auto;
422
+ border: 1px solid var(--border);
423
+ border-radius: 12px;
424
+ max-height: 70vh;
425
+ }
426
+ .pill {
427
+ display: inline-block;
428
+ padding: 2px 8px;
429
+ border-radius: 999px;
430
+ font-size: 0.75rem;
431
+ font-weight: 700;
432
+ text-transform: uppercase;
433
+ letter-spacing: 0.03em;
434
+ }
435
+ .pill-pass, .pill-pass { background: #dcfce7; color: var(--pass); }
436
+ .pill-fail { background: #fee2e2; color: var(--fail); }
437
+ .pill-skip { background: #fef9c3; color: var(--skip); }
438
+ .pill-warn { background: #ffedd5; color: var(--warn); }
439
+ code { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.8125rem; }
440
+ section { margin-bottom: 32px; }
441
+ </style>
442
+ </head>
443
+ <body>
444
+ <header>
445
+ <h1>COUNT CLI MCP Tool Smoke Test Report</h1>
446
+ <p>Generated ${escapeHtml(report.generatedAtIso)} · CLI v${escapeHtml(report.cliVersion)} · ${escapeHtml(report.workspaceName)} · ${escapeHtml(report.apiBaseUrl)}</p>
447
+ </header>
448
+ <main>
449
+ <div class="status-banner ${statusClass}">${escapeHtml(statusLabel)}</div>
450
+
451
+ <div class="grid">
452
+ <div class="card"><h2>Total tools</h2><div class="metric">${report.summary.totalTools}</div></div>
453
+ <div class="card"><h2>Passed</h2><div class="metric">${report.summary.passed}</div></div>
454
+ <div class="card"><h2>Failed</h2><div class="metric">${report.summary.failed}</div></div>
455
+ <div class="card"><h2>Skipped</h2><div class="metric">${report.summary.skipped}</div></div>
456
+ <div class="card"><h2>Pass rate</h2><div class="metric">${report.summary.passRatePercent}%</div></div>
457
+ </div>
458
+
459
+ <section>
460
+ <h3>CLI health checks (count doctor)</h3>
461
+ <div class="table-wrap">
462
+ <table>
463
+ <thead><tr><th>Status</th><th>Check</th><th>Message</th></tr></thead>
464
+ <tbody>${doctorRows}</tbody>
465
+ </table>
466
+ </div>
467
+ </section>
468
+
469
+ <section>
470
+ <h3>MCP tool results</h3>
471
+ <p class="muted">Read-only tools were executed live against your workspace. Write/destructive tools were verified via registry + payload validation without mutating data.</p>
472
+ <div class="table-wrap">
473
+ <table>
474
+ <thead>
475
+ <tr>
476
+ <th>Status</th>
477
+ <th>Tool</th>
478
+ <th>Title</th>
479
+ <th>Mode</th>
480
+ <th>Read only</th>
481
+ <th>Destructive</th>
482
+ <th>Duration</th>
483
+ <th>Message</th>
484
+ </tr>
485
+ </thead>
486
+ <tbody>${toolRows}</tbody>
487
+ </table>
488
+ </div>
489
+ </section>
490
+ </main>
491
+ </body>
492
+ </html>
493
+ `;
494
+ }
495
+ //# sourceMappingURL=toolSmokeTest.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolSmokeTest.service.js","sourceRoot":"","sources":["../../src/services/toolSmokeTest.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAGzF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,eAAe,EAA8B,MAAM,qBAAqB,CAAC;AAqClF,OAAO,EACL,sCAAsC,EACtC,qBAAqB,GAEtB,MAAM,4CAA4C,CAAC;AA2BpD,SAAS,KAAK,CAAC,MAAmB;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9B,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,4BAA4B,CAAC,YAAoB;IACxD,OAAO,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAiC;IAClE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,MAAM,CAAC;IAChD,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAE3E,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,kBAAkB,GAA4B,EAAE,CAAC;IAEvD,KAAK,MAAM,kBAAkB,IAAI,oBAAoB,EAAE,CAAC;QACtD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAEhD,IAAI,iBAAiB,KAAK,eAAe,EAAE,CAAC;YAC1C,kBAAkB,CAAC,aAAa,GAAG,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,2BAA2B,GAAG,IAAI,CAAC,YAAY;aAClD,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC;aAClC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;aAClB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAEhC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,gCAAgC,CAAC,2BAA2B,CAAC,CAAC;QAC/G,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;IAC5D,CAAC;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC/F,OAAO;QACL,SAAS,EAAE,GAAG,IAAI,QAAQ;QAC1B,OAAO,EAAE,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;KACvE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiC;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAExB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;QACpF,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;QAC7C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;QAC3C,OAAO;YACL,QAAQ,EAAE,sBAAsB;YAChC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACpB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnF,OAAO;gBACL,GAAG,kBAAkB;gBACrB,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aACpB,CAAC;QACJ,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;YACxF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IACjC,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAqC;IACpE,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3D,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED,SAAS,wCAAwC,CAAC,MAIjD;IACC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,sCAAsC,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC7G,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,kBAAkB,GAAG,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClF,MAAM,CAAC,sBAAsB,CAAC,gCAAgC,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC;AACxG,CAAC;AAED,SAAS,uBAAuB,CAAC,MAGhC;IACC,IACE,MAAM,CAAC,IAAI,CAAC,QAAQ;QACpB,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAChD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAChD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EACjD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAA8B;IAC5D,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC;IAEnG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,MAAM,uBAAuB,CAAC;YACnD,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE;YAC9B,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB;gBACxD,OAAO,EAAE,uBAAuB,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;aACjE,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,uBAAuB,CAAC;YACnD,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE;gBACL,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,EAAE;aACT;YACD,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO;YAC9C,CAAC,CAAC,uBAAuB,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;YACzD,CAAC,CAAC,oDAAoD,CAAC;QAEzD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB;YACxD,OAAO,EAAE,2EAA2E,iBAAiB,EAAE;SACxG,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC7E,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB;YACxD,OAAO,EAAE,2DAA2D;SACrE,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC;QAC/C,IAAI;QACJ,KAAK,EAAE,cAAc;QACrB,MAAM;KACP,CAAC,CAAC;IAEH,wCAAwC,CAAC;QACvC,IAAI;QACJ,UAAU;QACV,sBAAsB;KACvB,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,uBAAuB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7D,MAAM,aAAa,GAAG,uBAAuB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAEtE,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB;YACxD,OAAO,EACL,aAAa,KAAK,MAAM;gBACtB,CAAC,CAAC,wDAAwD,YAAY,EAAE;gBACxE,CAAC,CAAC,YAAY;SACnB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB;QACxD,OAAO,EAAE,+BAA+B;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAkC,EAAE;IAC1E,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,6BAA6B,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAClF,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAE/G,IAAI,CAAC,WAAW,EAAE,QAAQ,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,gBAAgB,CAAC;QACzC,MAAM,EAAE;YACN,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,mBAAmB;SACpB;KACF,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACxF,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAEtF,IAAI,CAAC,oBAAoB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3E,MAAM,sBAAsB,GAAoC;QAC9D,gCAAgC,EAAE,EAAE;QACpC,4BAA4B,EAAE,EAAE;KACjC,CAAC;IAEF,MAAM,qBAAqB,CAAC;QAC1B,MAAM,EAAE,aAAa;QACrB,sBAAsB;QACtB,6BAA6B;KAC9B,CAAC,CAAC;IAEH,MAAM,WAAW,GAA0B,EAAE,CAAC;IAE9C,MAAM,qBAAqB,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE;QAChF,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;YACvC,OAAO,cAAc,GAAG,eAAe,CAAC;QAC1C,CAAC;QAED,OAAO,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE,CAAC;QACzC,MAAM,mBAAmB,GAAG,MAAM,gBAAgB,CAAC;YACjD,IAAI;YACJ,MAAM,EAAE,aAAa;YACrB,sBAAsB;YACtB,oBAAoB;YACpB,mBAAmB;SACpB,CAAC,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEtC,IAAI,6BAA6B,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC,EAAE,YAAY,EAAE,6BAA6B,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAClF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;IACtC,MAAM,eAAe,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7F,OAAO;QACL,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACxC,UAAU,EAAE,WAAW;QACvB,aAAa,EAAE,WAAW,CAAC,aAAa,IAAI,WAAW,CAAC,WAAW,IAAI,yBAAyB;QAChG,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,YAAY;QACZ,WAAW;QACX,OAAO,EAAE;YACP,UAAU;YACV,MAAM;YACN,MAAM;YACN,OAAO;YACP,eAAe;SAChB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,OAAO;SACX,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,MAA6C;IAC3F,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;IACjF,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACnF,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;IAEnE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM;SAC1C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,OAAO;qCACwB,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;cAClE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;cACxB,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5B,CAAC;IACT,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW;SAChC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,OAAO;qCACwB,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC9D,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;cAClC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;cACzB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;cACxB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;cAC/B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;cAClC,OAAO,CAAC,oBAAoB;cAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC;YAC7B,CAAC;IACT,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAiHU,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;;;gCAGrI,WAAW,KAAK,UAAU,CAAC,WAAW,CAAC;;;kEAGL,MAAM,CAAC,OAAO,CAAC,UAAU;6DAC9B,MAAM,CAAC,OAAO,CAAC,MAAM;6DACrB,MAAM,CAAC,OAAO,CAAC,MAAM;8DACpB,MAAM,CAAC,OAAO,CAAC,OAAO;gEACpB,MAAM,CAAC,OAAO,CAAC,eAAe;;;;;;;;mBAQ3E,UAAU;;;;;;;;;;;;;;;;;;;;;;mBAsBV,QAAQ;;;;;;;CAO1B,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@countfinancial/cli",
3
- "version": "0.1.8",
3
+ "version": "0.2.2",
4
4
  "description": "COUNT Partner CLI — OAuth login and local MCP server for Claude Code, Cursor, and agents.",
5
5
  "license": "ISC",
6
6
  "type": "module",
@@ -9,7 +9,8 @@
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
- "README.md"
12
+ "README.md",
13
+ "LICENSE"
13
14
  ],
14
15
  "repository": {
15
16
  "type": "git",