@cloudstreamsoftware/claude-tools 1.0.0 → 1.1.0
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.
- package/README.md +152 -37
- package/agents/INDEX.md +183 -0
- package/agents/architect.md +247 -0
- package/agents/build-error-resolver.md +555 -0
- package/agents/catalyst-deployer.md +132 -0
- package/agents/code-reviewer.md +121 -0
- package/agents/compliance-auditor.md +148 -0
- package/agents/creator-architect.md +395 -0
- package/agents/deluge-reviewer.md +98 -0
- package/agents/doc-updater.md +471 -0
- package/agents/e2e-runner.md +711 -0
- package/agents/planner.md +122 -0
- package/agents/refactor-cleaner.md +309 -0
- package/agents/security-reviewer.md +582 -0
- package/agents/tdd-guide.md +302 -0
- package/config/versions.json +63 -0
- package/dist/hooks/hooks.json +209 -0
- package/dist/index.js +47 -0
- package/dist/lib/asset-value.js +609 -0
- package/dist/lib/client-manager.js +300 -0
- package/dist/lib/command-matcher.js +242 -0
- package/dist/lib/cross-session-patterns.js +754 -0
- package/dist/lib/intent-classifier.js +1075 -0
- package/dist/lib/package-manager.js +374 -0
- package/dist/lib/recommendation-engine.js +597 -0
- package/dist/lib/session-memory.js +489 -0
- package/dist/lib/skill-effectiveness.js +486 -0
- package/dist/lib/skill-matcher.js +595 -0
- package/dist/lib/tutorial-metrics.js +242 -0
- package/dist/lib/tutorial-progress.js +209 -0
- package/dist/lib/tutorial-renderer.js +431 -0
- package/dist/lib/utils.js +380 -0
- package/dist/lib/verify-formatter.js +143 -0
- package/dist/lib/workflow-state.js +249 -0
- package/hooks/hooks.json +209 -0
- package/package.json +5 -1
- package/scripts/aggregate-sessions.js +290 -0
- package/scripts/branch-name-validator.js +291 -0
- package/scripts/build.js +101 -0
- package/scripts/commands/client-switch.js +231 -0
- package/scripts/deprecate-skill.js +610 -0
- package/scripts/diagnose.js +324 -0
- package/scripts/doc-freshness.js +168 -0
- package/scripts/generate-weekly-digest.js +393 -0
- package/scripts/health-check.js +270 -0
- package/scripts/hooks/credential-check.js +101 -0
- package/scripts/hooks/evaluate-session.js +81 -0
- package/scripts/hooks/pre-compact.js +66 -0
- package/scripts/hooks/prompt-analyzer.js +276 -0
- package/scripts/hooks/prompt-router.js +422 -0
- package/scripts/hooks/quality-gate-enforcer.js +371 -0
- package/scripts/hooks/session-end.js +156 -0
- package/scripts/hooks/session-start.js +195 -0
- package/scripts/hooks/skill-injector.js +333 -0
- package/scripts/hooks/suggest-compact.js +58 -0
- package/scripts/lib/asset-value.js +609 -0
- package/scripts/lib/client-manager.js +300 -0
- package/scripts/lib/command-matcher.js +242 -0
- package/scripts/lib/cross-session-patterns.js +754 -0
- package/scripts/lib/intent-classifier.js +1075 -0
- package/scripts/lib/package-manager.js +374 -0
- package/scripts/lib/recommendation-engine.js +597 -0
- package/scripts/lib/session-memory.js +489 -0
- package/scripts/lib/skill-effectiveness.js +486 -0
- package/scripts/lib/skill-matcher.js +595 -0
- package/scripts/lib/tutorial-metrics.js +242 -0
- package/scripts/lib/tutorial-progress.js +209 -0
- package/scripts/lib/tutorial-renderer.js +431 -0
- package/scripts/lib/utils.js +380 -0
- package/scripts/lib/verify-formatter.js +143 -0
- package/scripts/lib/workflow-state.js +249 -0
- package/scripts/onboard.js +363 -0
- package/scripts/quarterly-report.js +692 -0
- package/scripts/setup-package-manager.js +204 -0
- package/scripts/sync-upstream.js +391 -0
- package/scripts/test.js +108 -0
- package/scripts/tutorial-runner.js +351 -0
- package/scripts/validate-all.js +201 -0
- package/scripts/verifiers/agents.js +245 -0
- package/scripts/verifiers/config.js +186 -0
- package/scripts/verifiers/environment.js +123 -0
- package/scripts/verifiers/hooks.js +188 -0
- package/scripts/verifiers/index.js +38 -0
- package/scripts/verifiers/persistence.js +140 -0
- package/scripts/verifiers/plugin.js +215 -0
- package/scripts/verifiers/skills.js +209 -0
- package/scripts/verify-setup.js +164 -0
- package/skills/INDEX.md +157 -0
- package/skills/backend-patterns/SKILL.md +586 -0
- package/skills/backend-patterns/catalyst-patterns.md +128 -0
- package/skills/bigquery-patterns/SKILL.md +27 -0
- package/skills/bigquery-patterns/performance-optimization.md +518 -0
- package/skills/bigquery-patterns/query-patterns.md +372 -0
- package/skills/bigquery-patterns/schema-design.md +78 -0
- package/skills/cloudstream-project-template/SKILL.md +20 -0
- package/skills/cloudstream-project-template/structure.md +65 -0
- package/skills/coding-standards/SKILL.md +524 -0
- package/skills/coding-standards/deluge-standards.md +83 -0
- package/skills/compliance-patterns/SKILL.md +28 -0
- package/skills/compliance-patterns/hipaa/audit-requirements.md +251 -0
- package/skills/compliance-patterns/hipaa/baa-process.md +298 -0
- package/skills/compliance-patterns/hipaa/data-archival-strategy.md +387 -0
- package/skills/compliance-patterns/hipaa/phi-handling.md +52 -0
- package/skills/compliance-patterns/pci-dss/saq-a-requirements.md +307 -0
- package/skills/compliance-patterns/pci-dss/tokenization-patterns.md +382 -0
- package/skills/compliance-patterns/pci-dss/zoho-checkout-patterns.md +56 -0
- package/skills/compliance-patterns/soc2/access-controls.md +344 -0
- package/skills/compliance-patterns/soc2/audit-logging.md +458 -0
- package/skills/compliance-patterns/soc2/change-management.md +403 -0
- package/skills/compliance-patterns/soc2/deluge-execution-logging.md +407 -0
- package/skills/consultancy-workflows/SKILL.md +19 -0
- package/skills/consultancy-workflows/client-isolation.md +21 -0
- package/skills/consultancy-workflows/documentation-automation.md +454 -0
- package/skills/consultancy-workflows/handoff-procedures.md +257 -0
- package/skills/consultancy-workflows/knowledge-capture.md +513 -0
- package/skills/consultancy-workflows/time-tracking.md +26 -0
- package/skills/continuous-learning/SKILL.md +84 -0
- package/skills/continuous-learning/config.json +18 -0
- package/skills/continuous-learning/evaluate-session.sh +60 -0
- package/skills/continuous-learning-v2/SKILL.md +126 -0
- package/skills/continuous-learning-v2/config.json +61 -0
- package/skills/frontend-patterns/SKILL.md +635 -0
- package/skills/frontend-patterns/zoho-widget-patterns.md +103 -0
- package/skills/gcp-data-engineering/SKILL.md +36 -0
- package/skills/gcp-data-engineering/bigquery/performance-optimization.md +337 -0
- package/skills/gcp-data-engineering/dataflow/error-handling.md +496 -0
- package/skills/gcp-data-engineering/dataflow/pipeline-patterns.md +444 -0
- package/skills/gcp-data-engineering/dbt/model-organization.md +63 -0
- package/skills/gcp-data-engineering/dbt/testing-patterns.md +503 -0
- package/skills/gcp-data-engineering/medallion-architecture/bronze-layer.md +60 -0
- package/skills/gcp-data-engineering/medallion-architecture/gold-layer.md +311 -0
- package/skills/gcp-data-engineering/medallion-architecture/layer-transitions.md +517 -0
- package/skills/gcp-data-engineering/medallion-architecture/silver-layer.md +305 -0
- package/skills/gcp-data-engineering/zoho-to-gcp/data-extraction.md +543 -0
- package/skills/gcp-data-engineering/zoho-to-gcp/real-time-vs-batch.md +337 -0
- package/skills/security-review/SKILL.md +498 -0
- package/skills/security-review/compliance-checklist.md +53 -0
- package/skills/strategic-compact/SKILL.md +67 -0
- package/skills/tdd-workflow/SKILL.md +413 -0
- package/skills/tdd-workflow/zoho-testing.md +124 -0
- package/skills/tutorial/SKILL.md +249 -0
- package/skills/tutorial/docs/ACCESSIBILITY.md +169 -0
- package/skills/tutorial/lessons/00-philosophy-and-workflow.md +198 -0
- package/skills/tutorial/lessons/01-basics.md +81 -0
- package/skills/tutorial/lessons/02-training.md +86 -0
- package/skills/tutorial/lessons/03-commands.md +109 -0
- package/skills/tutorial/lessons/04-workflows.md +115 -0
- package/skills/tutorial/lessons/05-compliance.md +116 -0
- package/skills/tutorial/lessons/06-zoho.md +121 -0
- package/skills/tutorial/lessons/07-hooks-system.md +277 -0
- package/skills/tutorial/lessons/08-mcp-servers.md +316 -0
- package/skills/tutorial/lessons/09-client-management.md +215 -0
- package/skills/tutorial/lessons/10-testing-e2e.md +260 -0
- package/skills/tutorial/lessons/11-skills-deep-dive.md +272 -0
- package/skills/tutorial/lessons/12-rules-system.md +326 -0
- package/skills/tutorial/lessons/13-golden-standard-graduation.md +213 -0
- package/skills/tutorial/lessons/14-fork-setup-and-sync.md +312 -0
- package/skills/tutorial/lessons/15-living-examples-system.md +221 -0
- package/skills/tutorial/tracks/accelerated/README.md +134 -0
- package/skills/tutorial/tracks/accelerated/assessment/checkpoint-1.md +161 -0
- package/skills/tutorial/tracks/accelerated/assessment/checkpoint-2.md +175 -0
- package/skills/tutorial/tracks/accelerated/day-1-core-concepts.md +234 -0
- package/skills/tutorial/tracks/accelerated/day-2-essential-commands.md +270 -0
- package/skills/tutorial/tracks/accelerated/day-3-workflow-mastery.md +305 -0
- package/skills/tutorial/tracks/accelerated/day-4-compliance-zoho.md +304 -0
- package/skills/tutorial/tracks/accelerated/day-5-hooks-skills.md +344 -0
- package/skills/tutorial/tracks/accelerated/day-6-client-testing.md +386 -0
- package/skills/tutorial/tracks/accelerated/day-7-graduation.md +369 -0
- package/skills/zoho-patterns/CHANGELOG.md +108 -0
- package/skills/zoho-patterns/SKILL.md +446 -0
- package/skills/zoho-patterns/analytics/dashboard-patterns.md +352 -0
- package/skills/zoho-patterns/analytics/zoho-to-bigquery-pipeline.md +427 -0
- package/skills/zoho-patterns/catalyst/appsail-deployment.md +349 -0
- package/skills/zoho-patterns/catalyst/context-close-patterns.md +354 -0
- package/skills/zoho-patterns/catalyst/cron-batch-processing.md +374 -0
- package/skills/zoho-patterns/catalyst/function-patterns.md +439 -0
- package/skills/zoho-patterns/creator/form-design.md +304 -0
- package/skills/zoho-patterns/creator/publish-api-patterns.md +313 -0
- package/skills/zoho-patterns/creator/widget-integration.md +306 -0
- package/skills/zoho-patterns/creator/workflow-automation.md +253 -0
- package/skills/zoho-patterns/deluge/api-patterns.md +468 -0
- package/skills/zoho-patterns/deluge/batch-processing.md +403 -0
- package/skills/zoho-patterns/deluge/cross-app-integration.md +356 -0
- package/skills/zoho-patterns/deluge/error-handling.md +423 -0
- package/skills/zoho-patterns/deluge/syntax-reference.md +65 -0
- package/skills/zoho-patterns/integration/cors-proxy-architecture.md +426 -0
- package/skills/zoho-patterns/integration/crm-books-native-sync.md +277 -0
- package/skills/zoho-patterns/integration/oauth-token-management.md +461 -0
- package/skills/zoho-patterns/integration/zoho-flow-patterns.md +334 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Client Switch Command
|
|
5
|
+
*
|
|
6
|
+
* Switches to a specific client context by:
|
|
7
|
+
* 1. Loading client configuration from clients/[id]/.claude/CLAUDE.md
|
|
8
|
+
* 2. Setting environment variables from .env.client
|
|
9
|
+
* 3. Displaying client context with compliance requirements
|
|
10
|
+
* 4. Showing recent git activity for the client
|
|
11
|
+
*
|
|
12
|
+
* Usage: /client-switch [client-id]
|
|
13
|
+
* If no client-id provided, lists available clients.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const path = require('path');
|
|
17
|
+
const { log, ensureDir } = require('../lib/utils');
|
|
18
|
+
const {
|
|
19
|
+
getClientsDir,
|
|
20
|
+
discoverClients,
|
|
21
|
+
loadClient,
|
|
22
|
+
getComplianceRequirements,
|
|
23
|
+
setClientEnvironment,
|
|
24
|
+
} = require('../lib/client-manager');
|
|
25
|
+
|
|
26
|
+
// Box drawing characters for formatted output
|
|
27
|
+
const BOX = {
|
|
28
|
+
topLeft: '\u2554',
|
|
29
|
+
topRight: '\u2557',
|
|
30
|
+
bottomLeft: '\u255A',
|
|
31
|
+
bottomRight: '\u255D',
|
|
32
|
+
horizontal: '\u2550',
|
|
33
|
+
vertical: '\u2551',
|
|
34
|
+
leftT: '\u2560',
|
|
35
|
+
rightT: '\u2563',
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Draw a box line
|
|
40
|
+
*/
|
|
41
|
+
function boxLine(char, width) {
|
|
42
|
+
return char.repeat(width);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Draw a text line centered in a box
|
|
47
|
+
*/
|
|
48
|
+
function centeredLine(text, width) {
|
|
49
|
+
const padding = Math.max(0, width - text.length - 2);
|
|
50
|
+
const leftPad = Math.floor(padding / 2);
|
|
51
|
+
const rightPad = padding - leftPad;
|
|
52
|
+
return `${BOX.vertical} ${' '.repeat(leftPad)}${text}${' '.repeat(rightPad)} ${BOX.vertical}`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Draw a left-aligned text line in a box
|
|
57
|
+
*/
|
|
58
|
+
function leftLine(text, width) {
|
|
59
|
+
const padding = Math.max(0, width - text.length - 4);
|
|
60
|
+
return `${BOX.vertical} ${text}${' '.repeat(padding)} ${BOX.vertical}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Format client context for display
|
|
65
|
+
*/
|
|
66
|
+
function formatClientContext(client) {
|
|
67
|
+
const width = 65;
|
|
68
|
+
const lines = [];
|
|
69
|
+
|
|
70
|
+
// Header
|
|
71
|
+
lines.push(`${BOX.topLeft}${boxLine(BOX.horizontal, width)}${BOX.topRight}`);
|
|
72
|
+
lines.push(centeredLine(`Client Context: ${client.name || client.id}`, width));
|
|
73
|
+
lines.push(`${BOX.leftT}${boxLine(BOX.horizontal, width)}${BOX.rightT}`);
|
|
74
|
+
|
|
75
|
+
// Configuration section
|
|
76
|
+
lines.push(leftLine('', width));
|
|
77
|
+
lines.push(leftLine('\uD83D\uDCCB Configuration', width));
|
|
78
|
+
lines.push(leftLine(` Compliance Mode: ${client.complianceMode.toUpperCase()}`, width));
|
|
79
|
+
if (client.zohoOrg) {
|
|
80
|
+
lines.push(leftLine(` Zoho Org ID: ${client.zohoOrg}`, width));
|
|
81
|
+
}
|
|
82
|
+
lines.push(leftLine(` Project Path: clients/${client.id}/`, width));
|
|
83
|
+
if (client.industry) {
|
|
84
|
+
lines.push(leftLine(` Industry: ${client.industry}`, width));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Compliance requirements
|
|
88
|
+
lines.push(leftLine('', width));
|
|
89
|
+
lines.push(leftLine('\uD83D\uDD12 Compliance Requirements', width));
|
|
90
|
+
const requirements = getComplianceRequirements(client.complianceMode);
|
|
91
|
+
for (const req of requirements.slice(0, 4)) {
|
|
92
|
+
lines.push(leftLine(` - ${req}`, width));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Recent activity
|
|
96
|
+
lines.push(leftLine('', width));
|
|
97
|
+
lines.push(leftLine('\uD83D\uDCCA Recent Activity', width));
|
|
98
|
+
if (client.commits && client.commits.length > 0) {
|
|
99
|
+
for (const commit of client.commits.slice(0, 5)) {
|
|
100
|
+
const msg =
|
|
101
|
+
commit.message.length > 50 ? commit.message.substring(0, 47) + '...' : commit.message;
|
|
102
|
+
lines.push(leftLine(` ${commit.hash} ${msg}`, width));
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
lines.push(leftLine(' No recent commits found', width));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Reminders based on compliance mode
|
|
109
|
+
if (client.complianceMode !== 'standard') {
|
|
110
|
+
lines.push(leftLine('', width));
|
|
111
|
+
lines.push(leftLine('\u26A0\uFE0F Reminders', width));
|
|
112
|
+
if (client.complianceMode === 'hipaa') {
|
|
113
|
+
lines.push(leftLine(' - All PHI fields must use [PHI] prefix', width));
|
|
114
|
+
lines.push(leftLine(' - Run /compliance-check before any commit', width));
|
|
115
|
+
} else if (client.complianceMode === 'pci-dss') {
|
|
116
|
+
lines.push(leftLine(' - Never store PAN data directly', width));
|
|
117
|
+
lines.push(leftLine(' - Use Zoho Checkout for all payments', width));
|
|
118
|
+
} else if (client.complianceMode === 'soc2') {
|
|
119
|
+
lines.push(leftLine(' - Document all access control changes', width));
|
|
120
|
+
lines.push(leftLine(' - Audit logging must be enabled', width));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Footer
|
|
125
|
+
lines.push(leftLine('', width));
|
|
126
|
+
lines.push(`${BOX.bottomLeft}${boxLine(BOX.horizontal, width)}${BOX.bottomRight}`);
|
|
127
|
+
|
|
128
|
+
return lines.join('\n');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Format available clients list
|
|
133
|
+
*/
|
|
134
|
+
function formatClientList(clients, requestedId) {
|
|
135
|
+
const lines = [];
|
|
136
|
+
|
|
137
|
+
if (requestedId) {
|
|
138
|
+
lines.push(`\u274C Client Not Found: ${requestedId}`);
|
|
139
|
+
lines.push('');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (clients.length === 0) {
|
|
143
|
+
lines.push('No clients found.');
|
|
144
|
+
lines.push('');
|
|
145
|
+
lines.push('To create a new client:');
|
|
146
|
+
lines.push(' 1. Create directory: clients/[CLIENT-ID]/');
|
|
147
|
+
lines.push(' 2. Copy template: templates/client-project/.claude/CLAUDE.md');
|
|
148
|
+
lines.push(' 3. Configure: clients/[CLIENT-ID]/.claude/CLAUDE.md');
|
|
149
|
+
return lines.join('\n');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
lines.push('Available clients:');
|
|
153
|
+
for (let i = 0; i < clients.length; i++) {
|
|
154
|
+
const client = clients[i];
|
|
155
|
+
const isLast = i === clients.length - 1;
|
|
156
|
+
const prefix = isLast ? '\u2514\u2500\u2500' : '\u251C\u2500\u2500';
|
|
157
|
+
|
|
158
|
+
// Load full client to get compliance mode
|
|
159
|
+
const fullClient = loadClient(client.id);
|
|
160
|
+
const mode = fullClient ? fullClient.complianceMode : 'unknown';
|
|
161
|
+
const configStatus = client.hasConfig ? '' : ' (no config)';
|
|
162
|
+
|
|
163
|
+
lines.push(`${prefix} ${client.id} (${mode})${configStatus}`);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (requestedId) {
|
|
167
|
+
lines.push('');
|
|
168
|
+
lines.push(`Create new client directory: clients/${requestedId}/.claude/CLAUDE.md`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return lines.join('\n');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Main execution
|
|
176
|
+
*/
|
|
177
|
+
function main() {
|
|
178
|
+
// Get client ID from command line arguments
|
|
179
|
+
const args = process.argv.slice(2);
|
|
180
|
+
const clientId = args[0];
|
|
181
|
+
|
|
182
|
+
// If no client ID provided, list available clients
|
|
183
|
+
if (!clientId) {
|
|
184
|
+
const clients = discoverClients();
|
|
185
|
+
log('[ClientSwitch] No client specified. Listing available clients:\n');
|
|
186
|
+
log(formatClientList(clients));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Try to load the requested client
|
|
191
|
+
const client = loadClient(clientId);
|
|
192
|
+
|
|
193
|
+
if (!client) {
|
|
194
|
+
const clients = discoverClients();
|
|
195
|
+
log(formatClientList(clients, clientId));
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Set environment variables for this client
|
|
200
|
+
setClientEnvironment(client);
|
|
201
|
+
|
|
202
|
+
// Display client context
|
|
203
|
+
log('');
|
|
204
|
+
log(formatClientContext(client));
|
|
205
|
+
log('');
|
|
206
|
+
|
|
207
|
+
// Output confirmation for Claude Code
|
|
208
|
+
log(`[ClientSwitch] Active client: ${client.id}`);
|
|
209
|
+
log(`[ClientSwitch] Compliance mode: ${client.complianceMode}`);
|
|
210
|
+
if (client.zohoOrg) {
|
|
211
|
+
log(`[ClientSwitch] Zoho Org: ${client.zohoOrg}`);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Warn if no config file
|
|
215
|
+
if (!client.hasConfig) {
|
|
216
|
+
log('');
|
|
217
|
+
log('\u26A0\uFE0F Warning: No CLAUDE.md configuration found for this client.');
|
|
218
|
+
log(` Create: clients/${clientId}/.claude/CLAUDE.md`);
|
|
219
|
+
log(' Use template: templates/client-project/.claude/CLAUDE.md');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Run if executed directly
|
|
224
|
+
if (require.main === module) {
|
|
225
|
+
main();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
module.exports = {
|
|
229
|
+
formatClientContext,
|
|
230
|
+
formatClientList,
|
|
231
|
+
};
|