Skip to content

Commit faca5fe

Browse files
Copilothotlong
andcommitted
Add .describe() annotations to under-documented Zod schema files
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 62c5e3b commit faca5fe

9 files changed

Lines changed: 135 additions & 135 deletions

File tree

packages/spec/src/kernel/plugin-structure.zod.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const OPS_FILE_SUFFIX_REGEX = /\.(object|field|trigger|function|view|page|dashbo
2727
* - "src/CRM/LeadObject.ts" (PascalCase)
2828
* - "src/utils/helper.js" (Wrong extension)
2929
*/
30-
export const OpsFilePathSchema = z.string().superRefine((path, ctx) => {
30+
export const OpsFilePathSchema = z.string().describe('Validates a file path against OPS naming conventions').superRefine((path, ctx) => {
3131
// 1. Must be in src/
3232
if (!path.startsWith('src/')) {
3333
// Non-source files (package.json, config) are ignored by this specific validator
@@ -79,7 +79,7 @@ export const OpsFilePathSchema = z.string().superRefine((path, ctx) => {
7979
export const OpsDomainModuleSchema = z.object({
8080
name: z.string().regex(SNAKE_CASE_REGEX).describe('Module name (snake_case)'),
8181
files: z.array(z.string()).describe('List of files in this module'),
82-
}).superRefine((module, ctx) => {
82+
}).describe('Scanned domain module representing a plugin folder').superRefine((module, ctx) => {
8383
// Rule: Must have an index.ts
8484
if (!module.files.includes('index.ts')) {
8585
ctx.addIssue({
@@ -95,7 +95,7 @@ export const OpsDomainModuleSchema = z.object({
9595
export const OpsPluginStructureSchema = z.object({
9696
root: z.string().describe('Root directory path of the plugin project'),
9797
files: z.array(z.string()).describe('List of all file paths relative to root'),
98-
}).superRefine((project, ctx) => {
98+
}).describe('Full plugin project layout validated against OPS conventions').superRefine((project, ctx) => {
9999
// Check for configuration file
100100
if (!project.files.includes('objectstack.config.ts')) {
101101
ctx.addIssue({

packages/spec/src/system/cache.zod.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const CacheStrategySchema = z.enum([
3030
'fifo', // First In First Out
3131
'ttl', // Time To Live only
3232
'adaptive', // Dynamic strategy selection
33-
]);
33+
]).describe('Cache eviction strategy');
3434

3535
export type CacheStrategy = z.infer<typeof CacheStrategySchema>;
3636

@@ -41,7 +41,7 @@ export const CacheTierSchema = z.object({
4141
ttl: z.number().default(300).describe('Default TTL in seconds'),
4242
strategy: CacheStrategySchema.default('lru').describe('Eviction strategy'),
4343
warmup: z.boolean().default(false).describe('Pre-populate cache on startup'),
44-
});
44+
}).describe('Configuration for a single cache tier in the hierarchy');
4545

4646
export type CacheTier = z.infer<typeof CacheTierSchema>;
4747
export type CacheTierInput = z.input<typeof CacheTierSchema>;
@@ -51,7 +51,7 @@ export const CacheInvalidationSchema = z.object({
5151
scope: z.enum(['key', 'pattern', 'tag', 'all']).describe('Invalidation scope'),
5252
pattern: z.string().optional().describe('Key pattern for pattern-based invalidation'),
5353
tags: z.array(z.string()).optional().describe('Cache tags to invalidate'),
54-
});
54+
}).describe('Rule defining when and how cached entries are invalidated');
5555

5656
export type CacheInvalidation = z.infer<typeof CacheInvalidationSchema>;
5757

@@ -62,7 +62,7 @@ export const CacheConfigSchema = z.object({
6262
prefetch: z.boolean().default(false).describe('Enable cache prefetching'),
6363
compression: z.boolean().default(false).describe('Enable data compression in cache'),
6464
encryption: z.boolean().default(false).describe('Enable encryption for cached data'),
65-
});
65+
}).describe('Top-level application cache configuration');
6666

6767
export type CacheConfig = z.infer<typeof CacheConfigSchema>;
6868
export type CacheConfigInput = z.input<typeof CacheConfigSchema>;

packages/spec/src/system/compliance.zod.ts

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,62 @@ import { z } from 'zod';
44
* Compliance protocol for GDPR, CCPA, HIPAA, SOX, PCI-DSS
55
*/
66
export const GDPRConfigSchema = z.object({
7-
enabled: z.boolean(),
7+
enabled: z.boolean().describe('Enable GDPR compliance controls'),
88
dataSubjectRights: z.object({
9-
rightToAccess: z.boolean().default(true),
10-
rightToRectification: z.boolean().default(true),
11-
rightToErasure: z.boolean().default(true),
12-
rightToRestriction: z.boolean().default(true),
13-
rightToPortability: z.boolean().default(true),
14-
rightToObjection: z.boolean().default(true),
15-
}),
9+
rightToAccess: z.boolean().default(true).describe('Allow data subjects to access their data'),
10+
rightToRectification: z.boolean().default(true).describe('Allow data subjects to correct their data'),
11+
rightToErasure: z.boolean().default(true).describe('Allow data subjects to request deletion'),
12+
rightToRestriction: z.boolean().default(true).describe('Allow data subjects to restrict processing'),
13+
rightToPortability: z.boolean().default(true).describe('Allow data subjects to export their data'),
14+
rightToObjection: z.boolean().default(true).describe('Allow data subjects to object to processing'),
15+
}).describe('Data subject rights configuration per GDPR Articles 15-21'),
1616
legalBasis: z.enum([
1717
'consent',
1818
'contract',
1919
'legal-obligation',
2020
'vital-interests',
2121
'public-task',
2222
'legitimate-interests',
23-
]),
24-
consentTracking: z.boolean().default(true),
25-
dataRetentionDays: z.number().optional(),
26-
dataProcessingAgreement: z.string().optional(),
27-
});
23+
]).describe('Legal basis for data processing under GDPR Article 6'),
24+
consentTracking: z.boolean().default(true).describe('Track and record user consent'),
25+
dataRetentionDays: z.number().optional().describe('Maximum data retention period in days'),
26+
dataProcessingAgreement: z.string().optional().describe('URL or reference to the data processing agreement'),
27+
}).describe('GDPR (General Data Protection Regulation) compliance configuration');
2828

2929
export type GDPRConfig = z.infer<typeof GDPRConfigSchema>;
3030
export type GDPRConfigInput = z.input<typeof GDPRConfigSchema>;
3131

3232
export const HIPAAConfigSchema = z.object({
33-
enabled: z.boolean(),
33+
enabled: z.boolean().describe('Enable HIPAA compliance controls'),
3434
phi: z.object({
35-
encryption: z.boolean().default(true),
36-
accessControl: z.boolean().default(true),
37-
auditTrail: z.boolean().default(true),
38-
backupAndRecovery: z.boolean().default(true),
39-
}),
40-
businessAssociateAgreement: z.boolean().default(false),
41-
});
35+
encryption: z.boolean().default(true).describe('Encrypt Protected Health Information at rest'),
36+
accessControl: z.boolean().default(true).describe('Enforce role-based access to PHI'),
37+
auditTrail: z.boolean().default(true).describe('Log all PHI access events'),
38+
backupAndRecovery: z.boolean().default(true).describe('Enable PHI backup and disaster recovery'),
39+
}).describe('Protected Health Information safeguards'),
40+
businessAssociateAgreement: z.boolean().default(false).describe('BAA is in place with third-party processors'),
41+
}).describe('HIPAA (Health Insurance Portability and Accountability Act) compliance configuration');
4242

4343
export type HIPAAConfig = z.infer<typeof HIPAAConfigSchema>;
4444
export type HIPAAConfigInput = z.input<typeof HIPAAConfigSchema>;
4545

4646
export const PCIDSSConfigSchema = z.object({
47-
enabled: z.boolean(),
48-
level: z.enum(['1', '2', '3', '4']),
49-
cardDataFields: z.array(z.string()),
50-
tokenization: z.boolean().default(true),
51-
encryptionInTransit: z.boolean().default(true),
52-
encryptionAtRest: z.boolean().default(true),
53-
});
47+
enabled: z.boolean().describe('Enable PCI-DSS compliance controls'),
48+
level: z.enum(['1', '2', '3', '4']).describe('PCI-DSS compliance level (1 = highest)'),
49+
cardDataFields: z.array(z.string()).describe('Field names containing cardholder data'),
50+
tokenization: z.boolean().default(true).describe('Replace card data with secure tokens'),
51+
encryptionInTransit: z.boolean().default(true).describe('Encrypt cardholder data during transmission'),
52+
encryptionAtRest: z.boolean().default(true).describe('Encrypt stored cardholder data'),
53+
}).describe('PCI-DSS (Payment Card Industry Data Security Standard) compliance configuration');
5454

5555
export type PCIDSSConfig = z.infer<typeof PCIDSSConfigSchema>;
5656
export type PCIDSSConfigInput = z.input<typeof PCIDSSConfigSchema>;
5757

5858
export const AuditLogConfigSchema = z.object({
59-
enabled: z.boolean().default(true),
60-
retentionDays: z.number().default(365),
61-
immutable: z.boolean().default(true),
62-
signLogs: z.boolean().default(false),
59+
enabled: z.boolean().default(true).describe('Enable audit logging'),
60+
retentionDays: z.number().default(365).describe('Number of days to retain audit logs'),
61+
immutable: z.boolean().default(true).describe('Prevent modification or deletion of audit logs'),
62+
signLogs: z.boolean().default(false).describe('Cryptographically sign log entries for tamper detection'),
6363
events: z.array(z.enum([
6464
'create',
6565
'read',
@@ -70,18 +70,18 @@ export const AuditLogConfigSchema = z.object({
7070
'login',
7171
'logout',
7272
'failed-login',
73-
])),
74-
});
73+
])).describe('Event types to capture in the audit log'),
74+
}).describe('Audit log configuration for compliance and security monitoring');
7575

7676
export type AuditLogConfig = z.infer<typeof AuditLogConfigSchema>;
7777
export type AuditLogConfigInput = z.input<typeof AuditLogConfigSchema>;
7878

7979
export const ComplianceConfigSchema = z.object({
80-
gdpr: GDPRConfigSchema.optional(),
81-
hipaa: HIPAAConfigSchema.optional(),
82-
pciDss: PCIDSSConfigSchema.optional(),
83-
auditLog: AuditLogConfigSchema,
84-
});
80+
gdpr: GDPRConfigSchema.optional().describe('GDPR compliance settings'),
81+
hipaa: HIPAAConfigSchema.optional().describe('HIPAA compliance settings'),
82+
pciDss: PCIDSSConfigSchema.optional().describe('PCI-DSS compliance settings'),
83+
auditLog: AuditLogConfigSchema.describe('Audit log configuration'),
84+
}).describe('Unified compliance configuration spanning GDPR, HIPAA, and PCI-DSS');
8585

8686
export type ComplianceConfig = z.infer<typeof ComplianceConfigSchema>;
8787
export type ComplianceConfigInput = z.input<typeof ComplianceConfigSchema>;

packages/spec/src/system/encryption.zod.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const EncryptionAlgorithmSchema = z.enum([
88
'aes-256-gcm',
99
'aes-256-cbc',
1010
'chacha20-poly1305',
11-
]);
11+
]).describe('Supported encryption algorithm');
1212

1313
export type EncryptionAlgorithm = z.infer<typeof EncryptionAlgorithmSchema>;
1414

@@ -18,7 +18,7 @@ export const KeyManagementProviderSchema = z.enum([
1818
'azure-key-vault',
1919
'gcp-kms',
2020
'hashicorp-vault',
21-
]);
21+
]).describe('Key management service provider');
2222

2323
export type KeyManagementProvider = z.infer<typeof KeyManagementProviderSchema>;
2424

@@ -27,7 +27,7 @@ export const KeyRotationPolicySchema = z.object({
2727
frequencyDays: z.number().min(1).default(90).describe('Rotation frequency in days'),
2828
retainOldVersions: z.number().default(3).describe('Number of old key versions to retain'),
2929
autoRotate: z.boolean().default(true).describe('Automatically rotate without manual approval'),
30-
});
30+
}).describe('Policy for automatic encryption key rotation');
3131

3232
export type KeyRotationPolicy = z.infer<typeof KeyRotationPolicySchema>;
3333
export type KeyRotationPolicyInput = z.input<typeof KeyRotationPolicySchema>;
@@ -43,7 +43,7 @@ export const EncryptionConfigSchema = z.object({
4343
scope: z.enum(['field', 'record', 'table', 'database']).describe('Encryption scope level'),
4444
deterministicEncryption: z.boolean().default(false).describe('Allows equality queries on encrypted data'),
4545
searchableEncryption: z.boolean().default(false).describe('Allows search on encrypted data'),
46-
});
46+
}).describe('Field-level encryption configuration');
4747

4848
export type EncryptionConfig = z.infer<typeof EncryptionConfigSchema>;
4949
export type EncryptionConfigInput = z.input<typeof EncryptionConfigSchema>;
@@ -52,7 +52,7 @@ export const FieldEncryptionSchema = z.object({
5252
fieldName: z.string().describe('Name of the field to encrypt'),
5353
encryptionConfig: EncryptionConfigSchema.describe('Encryption settings for this field'),
5454
indexable: z.boolean().default(false).describe('Allow indexing on encrypted field'),
55-
});
55+
}).describe('Per-field encryption assignment');
5656

5757
export type FieldEncryption = z.infer<typeof FieldEncryptionSchema>;
5858
export type FieldEncryptionInput = z.input<typeof FieldEncryptionSchema>;

packages/spec/src/system/masking.zod.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,28 @@ export const MaskingStrategySchema = z.enum([
1111
'randomize', // Randomize: generate random value
1212
'nullify', // Null value: null
1313
'substitute', // Substitute with dummy data
14-
]);
14+
]).describe('Data masking strategy for PII protection');
1515

1616
export type MaskingStrategy = z.infer<typeof MaskingStrategySchema>;
1717

1818
export const MaskingRuleSchema = z.object({
19-
field: z.string(),
20-
strategy: MaskingStrategySchema,
19+
field: z.string().describe('Field name to apply masking to'),
20+
strategy: MaskingStrategySchema.describe('Masking strategy to use'),
2121
pattern: z.string().optional().describe('Regex pattern for partial masking'),
22-
preserveFormat: z.boolean().default(true),
23-
preserveLength: z.boolean().default(true),
22+
preserveFormat: z.boolean().default(true).describe('Keep the original data format after masking'),
23+
preserveLength: z.boolean().default(true).describe('Keep the original data length after masking'),
2424
roles: z.array(z.string()).optional().describe('Roles that see masked data'),
2525
exemptRoles: z.array(z.string()).optional().describe('Roles that see unmasked data'),
26-
});
26+
}).describe('Masking rule for a single field');
2727

2828
export type MaskingRule = z.infer<typeof MaskingRuleSchema>;
2929
export type MaskingRuleInput = z.input<typeof MaskingRuleSchema>;
3030

3131
export const MaskingConfigSchema = z.object({
32-
enabled: z.boolean().default(false),
33-
rules: z.array(MaskingRuleSchema),
34-
auditUnmasking: z.boolean().default(true),
35-
});
32+
enabled: z.boolean().default(false).describe('Enable data masking'),
33+
rules: z.array(MaskingRuleSchema).describe('List of field-level masking rules'),
34+
auditUnmasking: z.boolean().default(true).describe('Log when masked data is accessed unmasked'),
35+
}).describe('Top-level data masking configuration for PII protection');
3636

3737
export type MaskingConfig = z.infer<typeof MaskingConfigSchema>;
3838
export type MaskingConfigInput = z.input<typeof MaskingConfigSchema>;

packages/spec/src/system/message-queue.zod.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,48 +11,48 @@ export const MessageQueueProviderSchema = z.enum([
1111
'redis-pubsub',
1212
'google-pubsub',
1313
'azure-service-bus',
14-
]);
14+
]).describe('Supported message queue backend provider');
1515

1616
export type MessageQueueProvider = z.infer<typeof MessageQueueProviderSchema>;
1717

1818
export const TopicConfigSchema = z.object({
19-
name: z.string(),
20-
partitions: z.number().default(1),
21-
replicationFactor: z.number().default(1),
22-
retentionMs: z.number().optional(),
23-
compressionType: z.enum(['none', 'gzip', 'snappy', 'lz4']).default('none'),
24-
});
19+
name: z.string().describe('Topic name identifier'),
20+
partitions: z.number().default(1).describe('Number of partitions for parallel consumption'),
21+
replicationFactor: z.number().default(1).describe('Number of replicas for fault tolerance'),
22+
retentionMs: z.number().optional().describe('Message retention period in milliseconds'),
23+
compressionType: z.enum(['none', 'gzip', 'snappy', 'lz4']).default('none').describe('Message compression algorithm'),
24+
}).describe('Configuration for a message queue topic');
2525

2626
export type TopicConfig = z.infer<typeof TopicConfigSchema>;
2727

2828
export const ConsumerConfigSchema = z.object({
29-
groupId: z.string(),
30-
autoOffsetReset: z.enum(['earliest', 'latest']).default('latest'),
31-
enableAutoCommit: z.boolean().default(true),
32-
maxPollRecords: z.number().default(500),
33-
});
29+
groupId: z.string().describe('Consumer group identifier'),
30+
autoOffsetReset: z.enum(['earliest', 'latest']).default('latest').describe('Where to start reading when no offset exists'),
31+
enableAutoCommit: z.boolean().default(true).describe('Automatically commit consumed offsets'),
32+
maxPollRecords: z.number().default(500).describe('Maximum records returned per poll'),
33+
}).describe('Consumer group configuration for topic consumption');
3434

3535
export type ConsumerConfig = z.infer<typeof ConsumerConfigSchema>;
3636

3737
export const DeadLetterQueueSchema = z.object({
38-
enabled: z.boolean().default(false),
39-
maxRetries: z.number().default(3),
40-
queueName: z.string(),
41-
});
38+
enabled: z.boolean().default(false).describe('Enable dead letter queue for failed messages'),
39+
maxRetries: z.number().default(3).describe('Maximum delivery attempts before sending to DLQ'),
40+
queueName: z.string().describe('Name of the dead letter queue'),
41+
}).describe('Dead letter queue configuration for unprocessable messages');
4242

4343
export type DeadLetterQueue = z.infer<typeof DeadLetterQueueSchema>;
4444

4545
export const MessageQueueConfigSchema = z.object({
46-
provider: MessageQueueProviderSchema,
47-
topics: z.array(TopicConfigSchema),
48-
consumers: z.array(ConsumerConfigSchema).optional(),
49-
deadLetterQueue: DeadLetterQueueSchema.optional(),
50-
ssl: z.boolean().default(false),
46+
provider: MessageQueueProviderSchema.describe('Message queue backend provider'),
47+
topics: z.array(TopicConfigSchema).describe('List of topic configurations'),
48+
consumers: z.array(ConsumerConfigSchema).optional().describe('Consumer group configurations'),
49+
deadLetterQueue: DeadLetterQueueSchema.optional().describe('Dead letter queue for failed messages'),
50+
ssl: z.boolean().default(false).describe('Enable SSL/TLS for broker connections'),
5151
sasl: z.object({
52-
mechanism: z.enum(['plain', 'scram-sha-256', 'scram-sha-512']),
53-
username: z.string(),
54-
password: z.string(),
55-
}).optional(),
56-
});
52+
mechanism: z.enum(['plain', 'scram-sha-256', 'scram-sha-512']).describe('SASL authentication mechanism'),
53+
username: z.string().describe('SASL username'),
54+
password: z.string().describe('SASL password'),
55+
}).optional().describe('SASL authentication configuration'),
56+
}).describe('Top-level message queue configuration');
5757

5858
export type MessageQueueConfig = z.infer<typeof MessageQueueConfigSchema>;

0 commit comments

Comments
 (0)