@countfinancial/cli 0.2.1 → 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 (50) hide show
  1. package/LICENSE +15 -0
  2. package/dist/__tests__/credentialStore.test.js +9 -0
  3. package/dist/__tests__/credentialStore.test.js.map +1 -1
  4. package/dist/cli.js +14 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/testTools.command.d.ts +7 -0
  7. package/dist/commands/testTools.command.js +42 -0
  8. package/dist/commands/testTools.command.js.map +1 -0
  9. package/dist/constants.d.ts +2 -2
  10. package/dist/constants.js +2 -2
  11. package/dist/constants.js.map +1 -1
  12. package/dist/helpers/toolSmokeTestFixtures.helper.d.ts +16 -0
  13. package/dist/helpers/toolSmokeTestFixtures.helper.js +491 -0
  14. package/dist/helpers/toolSmokeTestFixtures.helper.js.map +1 -0
  15. package/dist/partner-mcp/helpers/mcpKnowledge.helper.js +114 -4
  16. package/dist/partner-mcp/helpers/mcpKnowledge.helper.js.map +1 -1
  17. package/dist/partner-mcp/helpers/mcpPayloadValidation.helper.d.ts +1 -1
  18. package/dist/partner-mcp/helpers/mcpPayloadValidation.helper.js +61 -84
  19. package/dist/partner-mcp/helpers/mcpPayloadValidation.helper.js.map +1 -1
  20. package/dist/partner-mcp/helpers/mcpPlaybooks.helper.js +181 -2
  21. package/dist/partner-mcp/helpers/mcpPlaybooks.helper.js.map +1 -1
  22. package/dist/partner-mcp/helpers/mcpRecoveryHint.helper.js +79 -0
  23. package/dist/partner-mcp/helpers/mcpRecoveryHint.helper.js.map +1 -1
  24. package/dist/partner-mcp/schemas/bodies.d.ts +528 -0
  25. package/dist/partner-mcp/schemas/bodies.js +377 -0
  26. package/dist/partner-mcp/schemas/bodies.js.map +1 -0
  27. package/dist/partner-mcp/schemas/builders.d.ts +36 -0
  28. package/dist/partner-mcp/schemas/builders.js +106 -0
  29. package/dist/partner-mcp/schemas/builders.js.map +1 -0
  30. package/dist/partner-mcp/schemas/index.d.ts +5 -0
  31. package/dist/partner-mcp/schemas/index.js +6 -0
  32. package/dist/partner-mcp/schemas/index.js.map +1 -0
  33. package/dist/partner-mcp/schemas/primitives.d.ts +39 -0
  34. package/dist/partner-mcp/schemas/primitives.js +107 -0
  35. package/dist/partner-mcp/schemas/primitives.js.map +1 -0
  36. package/dist/partner-mcp/schemas/queries.d.ts +311 -0
  37. package/dist/partner-mcp/schemas/queries.js +175 -0
  38. package/dist/partner-mcp/schemas/queries.js.map +1 -0
  39. package/dist/partner-mcp/schemas/toolInputSchemas.d.ts +23 -0
  40. package/dist/partner-mcp/schemas/toolInputSchemas.js +248 -0
  41. package/dist/partner-mcp/schemas/toolInputSchemas.js.map +1 -0
  42. package/dist/partner-mcp/tools/definitions.js +26 -135
  43. package/dist/partner-mcp/tools/definitions.js.map +1 -1
  44. package/dist/partner-mcp/tools/registerTools.d.ts +8 -0
  45. package/dist/partner-mcp/tools/registerTools.js +8 -3
  46. package/dist/partner-mcp/tools/registerTools.js.map +1 -1
  47. package/dist/services/toolSmokeTest.service.d.ts +38 -0
  48. package/dist/services/toolSmokeTest.service.js +495 -0
  49. package/dist/services/toolSmokeTest.service.js.map +1 -0
  50. 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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@countfinancial/cli",
3
- "version": "0.2.1",
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",