snow-flow 2.0.2 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/{.claude/mcp-config.json → .mcp.json} +13 -12
  2. package/.releaserc.json +47 -0
  3. package/README.md +48 -1
  4. package/package.json +1 -1
  5. package/.claude/claude-settings.json +0 -15
  6. package/.claude/commands/analysis/README.md +0 -9
  7. package/.claude/commands/automation/README.md +0 -9
  8. package/.claude/commands/github/README.md +0 -11
  9. package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
  10. package/.claude/commands/hooks/README.md +0 -11
  11. package/.claude/commands/monitoring/README.md +0 -9
  12. package/.claude/commands/optimization/README.md +0 -9
  13. package/.claude/commands/training/README.md +0 -9
  14. package/.claude/commands/workflows/README.md +0 -9
  15. package/.claude/config.json +0 -36
  16. package/.claude/helpers/github-setup.sh +0 -28
  17. package/.claude/helpers/quick-start.sh +0 -19
  18. package/.claude/helpers/setup-mcp.sh +0 -18
  19. package/.claude/settings.json +0 -114
  20. package/.claude/settings.local.json +0 -33
  21. package/.claude-flow/metrics/agent-metrics.json +0 -1
  22. package/.claude-flow/metrics/performance.json +0 -9
  23. package/.claude-flow/metrics/system-metrics.json +0 -15986
  24. package/.claude-flow/metrics/task-metrics.json +0 -10
  25. package/.roo/README.md +0 -402
  26. package/.roo/mcp-list.txt +0 -257
  27. package/.roo/mcp.json +0 -32
  28. package/.roo/workflows/basic-tdd.json +0 -32
  29. package/.roomodes +0 -201
  30. package/CLAUDE.md +0 -393
  31. package/bin/snow-flow.js +0 -3
  32. package/dist/cli.js.bak +0 -2052
  33. package/dist/config/snow-flow-config.d.ts +0 -1492
  34. package/dist/config/snow-flow-config.js +0 -938
  35. package/scripts/create-env.js +0 -91
  36. package/scripts/postinstall.js +0 -30
  37. package/scripts/register-mcp-servers.js +0 -210
  38. package/scripts/reset-mcp-servers.js +0 -246
  39. package/scripts/setup-mcp.js +0 -106
  40. package/scripts/update-version.js +0 -31
  41. package/src/agents/README.md +0 -192
  42. package/src/agents/base-agent.ts +0 -251
  43. package/src/agents/coordinator.ts +0 -971
  44. package/src/agents/index.ts +0 -18
  45. package/src/agents/queen-403-handler.ts +0 -230
  46. package/src/agents/queen-agent.ts +0 -1399
  47. package/src/agents/script-writer-agent.ts +0 -769
  48. package/src/agents/security-agent.ts +0 -726
  49. package/src/agents/widget-creator-agent.ts +0 -568
  50. package/src/api/error-handling.ts +0 -1758
  51. package/src/api/natural-language-mapper.ts +0 -630
  52. package/src/api/performance-optimizer.ts +0 -891
  53. package/src/api/transaction-manager.ts +0 -754
  54. package/src/cli/deploy-artifact.ts +0 -304
  55. package/src/cli/snow-flow-cli-integration.ts +0 -434
  56. package/src/cli.ts +0 -4455
  57. package/src/cli.ts.bak +0 -5616
  58. package/src/compliance/advanced-compliance-system.ts +0 -1268
  59. package/src/compliance/index.ts +0 -19
  60. package/src/config/snow-flow-config.ts +0 -1019
  61. package/src/documentation/index.ts +0 -16
  62. package/src/documentation/self-documenting-system.ts +0 -1421
  63. package/src/dynamic-version.ts +0 -44
  64. package/src/healing/index.ts +0 -20
  65. package/src/healing/self-healing-system.ts +0 -1435
  66. package/src/health/README.md +0 -161
  67. package/src/health/system-health.ts +0 -995
  68. package/src/index.ts +0 -60
  69. package/src/intelligence/acl-analyzer.ts +0 -377
  70. package/src/intelligence/auto-resolution-engine.ts +0 -643
  71. package/src/intelligence/gap-analysis-engine.ts +0 -488
  72. package/src/intelligence/manual-instructions-generator.ts +0 -744
  73. package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
  74. package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
  75. package/src/intelligence/performance-recommendations-engine.ts +0 -1223
  76. package/src/intelligence/requirements-analyzer.ts +0 -1148
  77. package/src/intelligence/task-analyzer.ts +0 -628
  78. package/src/managers/scope-manager.ts +0 -555
  79. package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
  80. package/src/mcp/base-mcp-server.ts +0 -660
  81. package/src/mcp/http-transport-wrapper.ts +0 -426
  82. package/src/mcp/service-discovery-client.ts +0 -312
  83. package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
  84. package/src/mcp/servicenow-automation-mcp.ts +0 -838
  85. package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
  86. package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
  87. package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
  88. package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
  89. package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
  90. package/src/mcp/servicenow-integration-mcp.ts +0 -819
  91. package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
  92. package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
  93. package/src/mcp/servicenow-mcp-server.ts +0 -728
  94. package/src/mcp/servicenow-memory-mcp.ts +0 -474
  95. package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
  96. package/src/mcp/servicenow-operations-mcp.ts +0 -3384
  97. package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
  98. package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
  99. package/src/mcp/servicenow-progressive-indexer.ts +0 -370
  100. package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
  101. package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
  102. package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
  103. package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
  104. package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
  105. package/src/mcp/servicenow-update-set-mcp.ts +0 -811
  106. package/src/mcp/shared/agent-context-provider.ts +0 -365
  107. package/src/mcp/shared/base-mcp-server.ts +0 -2463
  108. package/src/mcp/shared/mcp-memory-manager.ts +0 -540
  109. package/src/mcp/shared/mcp-resource-manager.ts +0 -367
  110. package/src/mcp/snow-flow-mcp.ts +0 -911
  111. package/src/mcp/start-all-mcp-servers.ts +0 -102
  112. package/src/mcp/start-servicenow-mcp.ts +0 -67
  113. package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
  114. package/src/monitoring/performance-tracker.ts +0 -777
  115. package/src/optimization/cost-optimization-engine.ts +0 -1125
  116. package/src/optimization/index.ts +0 -10
  117. package/src/queen/README.md +0 -403
  118. package/src/queen/agent-factory.ts +0 -574
  119. package/src/queen/index.ts +0 -94
  120. package/src/queen/mcp-execution-bridge.ts +0 -681
  121. package/src/queen/neural-learning.ts +0 -319
  122. package/src/queen/parallel-agent-engine.ts +0 -848
  123. package/src/queen/queen-memory-system.ts +0 -490
  124. package/src/queen/queen-memory.ts +0 -456
  125. package/src/queen/servicenow-queen.ts +0 -1029
  126. package/src/queen/types.ts +0 -87
  127. package/src/rollback/smart-rollback-system.ts +0 -866
  128. package/src/schemas/deployment.schema.json +0 -58
  129. package/src/schemas/flow.schema.json +0 -79
  130. package/src/schemas/widget.schema.json +0 -72
  131. package/src/snow-flow-system.ts +0 -541
  132. package/src/sparc/sparc-help.ts +0 -49
  133. package/src/sparc/team-sparc.ts +0 -88
  134. package/src/strategies/global-scope-strategy.ts +0 -736
  135. package/src/templates/base/application.template.json +0 -45
  136. package/src/templates/base/business_rule.template.json +0 -33
  137. package/src/templates/base/script_include.template.json +0 -18
  138. package/src/templates/base/table.template.json +0 -64
  139. package/src/templates/base/widget.template.json +0 -25
  140. package/src/templates/patterns/composite.incident-management.template.json +0 -140
  141. package/src/templates/patterns/widget.dashboard.template.json +0 -238
  142. package/src/templates/patterns/widget.datatable.template.json +0 -292
  143. package/src/testing/integration-test-suite.ts +0 -1276
  144. package/src/types/index.ts +0 -183
  145. package/src/types/neo4j-driver.d.ts +0 -23
  146. package/src/types/servicenow.types.ts +0 -307
  147. package/src/types/snow-flow.types.ts +0 -186
  148. package/src/types/todo.types.ts +0 -70
  149. package/src/utils/action-type-cache.ts +0 -286
  150. package/src/utils/agent-detector.ts +0 -573
  151. package/src/utils/artifact-tracker.ts +0 -379
  152. package/src/utils/dependency-detector.ts +0 -233
  153. package/src/utils/deployment-metadata-handler.ts +0 -518
  154. package/src/utils/error-recovery.ts +0 -680
  155. package/src/utils/logger.ts +0 -60
  156. package/src/utils/mcp-auth-middleware.ts +0 -262
  157. package/src/utils/mcp-config-manager.ts +0 -270
  158. package/src/utils/mcp-server-manager.ts +0 -446
  159. package/src/utils/mcp-tool-registry.ts +0 -298
  160. package/src/utils/migrate-snow-flow.ts +0 -98
  161. package/src/utils/oauth-html-templates.ts +0 -188
  162. package/src/utils/scope-utils.ts +0 -443
  163. package/src/utils/servicenow-client.ts +0 -3321
  164. package/src/utils/servicenow-id-generator.ts +0 -181
  165. package/src/utils/snow-memory-manager.ts +0 -605
  166. package/src/utils/snow-oauth.ts +0 -797
  167. package/src/utils/template-engine.ts +0 -463
  168. package/src/utils/theme-manager.ts +0 -295
  169. package/src/utils/unified-auth-store.ts +0 -222
  170. package/src/utils/update-set-importer.ts +0 -422
  171. package/src/utils/update-set-xml-packager.ts +0 -371
  172. package/src/utils/widget-template-generator.ts +0 -1744
  173. package/src/version.ts +0 -1950
@@ -1,769 +0,0 @@
1
- /**
2
- * Script Writer Agent
3
- * Specializes in creating ServiceNow scripts (Business Rules, Script Includes, Client Scripts)
4
- */
5
-
6
- import { BaseAgent, AgentConfig, AgentResult } from './base-agent';
7
- import { ServiceNowArtifact } from '../queen/types';
8
-
9
- export class ScriptWriterAgent extends BaseAgent {
10
- constructor(config?: Partial<AgentConfig>) {
11
- super({
12
- type: 'script-writer',
13
- capabilities: [
14
- 'Business rule creation',
15
- 'Script include development',
16
- 'Client script implementation',
17
- 'Data transformation scripts',
18
- 'Performance optimization',
19
- 'GlideRecord operations',
20
- 'GlideSystem methods',
21
- 'REST API scripting',
22
- 'Scheduled job scripts'
23
- ],
24
- mcpTools: [
25
- 'snow_create_script_include',
26
- 'snow_create_business_rule',
27
- 'snow_create_client_script',
28
- 'snow_create_ui_action',
29
- 'snow_create_scheduled_job',
30
- 'snow_discover_table_fields',
31
- 'snow_table_schema_discovery'
32
- ],
33
- ...config
34
- });
35
- }
36
-
37
- async execute(instruction: string, context?: Record<string, any>): Promise<AgentResult> {
38
- try {
39
- this.setStatus('working');
40
- await this.reportProgress('Starting script creation', 0);
41
-
42
- // Analyze script requirements
43
- const requirements = await this.analyzeScriptRequirements(instruction);
44
- await this.reportProgress('Analyzed script requirements', 20);
45
-
46
- // Discover table schema if needed
47
- if (requirements.targetTable) {
48
- const schema = await this.discoverTableSchema(requirements.targetTable);
49
- requirements.tableFields = schema.fields;
50
- await this.reportProgress('Discovered table schema', 30);
51
- }
52
-
53
- // Generate script based on type
54
- let script: string;
55
- let scriptConfig: any;
56
-
57
- switch (requirements.scriptType) {
58
- case 'business_rule':
59
- script = await this.createBusinessRuleScript(requirements);
60
- scriptConfig = this.createBusinessRuleConfig(requirements, script);
61
- break;
62
-
63
- case 'script_include':
64
- script = await this.createScriptIncludeScript(requirements);
65
- scriptConfig = this.createScriptIncludeConfig(requirements, script);
66
- break;
67
-
68
- case 'client_script':
69
- script = await this.createClientScript(requirements);
70
- scriptConfig = this.createClientScriptConfig(requirements, script);
71
- break;
72
-
73
- case 'scheduled_job':
74
- script = await this.createScheduledJobScript(requirements);
75
- scriptConfig = this.createScheduledJobConfig(requirements, script);
76
- break;
77
-
78
- default:
79
- throw new Error(`Unknown script type: ${requirements.scriptType}`);
80
- }
81
-
82
- await this.reportProgress(`Created ${requirements.scriptType} script`, 60);
83
-
84
- // Add performance optimizations
85
- if (requirements.needsOptimization) {
86
- script = await this.optimizeScript(script, requirements);
87
- scriptConfig.script = script;
88
- await this.reportProgress('Optimized script performance', 70);
89
- }
90
-
91
- // Create script artifact
92
- const artifact: ServiceNowArtifact = {
93
- type: 'script',
94
- name: requirements.name,
95
- config: scriptConfig,
96
- dependencies: requirements.dependencies
97
- };
98
-
99
- // Store artifact for other agents
100
- await this.storeArtifact(artifact);
101
- await this.reportProgress('Script artifact created and stored', 85);
102
-
103
- // Generate documentation
104
- const documentation = this.generateDocumentation(requirements, script);
105
- await this.reportProgress('Generated script documentation', 95);
106
-
107
- await this.reportProgress('Script creation completed', 100);
108
- this.setStatus('completed');
109
-
110
- await this.logActivity('script_creation', true, {
111
- scriptName: requirements.name,
112
- scriptType: requirements.scriptType,
113
- targetTable: requirements.targetTable
114
- });
115
-
116
- return {
117
- success: true,
118
- artifacts: [artifact],
119
- message: `${requirements.scriptType} "${requirements.name}" created successfully`,
120
- metadata: {
121
- scriptType: requirements.scriptType,
122
- targetTable: requirements.targetTable,
123
- when: requirements.when,
124
- documentation,
125
- performanceOptimized: requirements.needsOptimization
126
- }
127
- };
128
-
129
- } catch (error) {
130
- this.setStatus('failed');
131
- await this.logActivity('script_creation', false, { error: error.message });
132
-
133
- return {
134
- success: false,
135
- error: error as Error,
136
- message: `Failed to create script: ${error.message}`
137
- };
138
- }
139
- }
140
-
141
- private async analyzeScriptRequirements(instruction: string): Promise<any> {
142
- const requirements = {
143
- name: '',
144
- scriptType: '',
145
- targetTable: '',
146
- when: '',
147
- async: false,
148
- needsOptimization: false,
149
- operations: [] as string[],
150
- dependencies: [] as string[],
151
- tableFields: [] as any[],
152
- conditions: [] as string[],
153
- features: [] as string[]
154
- };
155
-
156
- // Determine script type
157
- if (/business\s*rule/i.test(instruction)) {
158
- requirements.scriptType = 'business_rule';
159
- } else if (/script\s*include/i.test(instruction)) {
160
- requirements.scriptType = 'script_include';
161
- } else if (/client\s*script/i.test(instruction)) {
162
- requirements.scriptType = 'client_script';
163
- } else if (/scheduled\s*job|scheduled\s*script/i.test(instruction)) {
164
- requirements.scriptType = 'scheduled_job';
165
- } else {
166
- // Default to business rule if table is mentioned
167
- requirements.scriptType = /table|record/i.test(instruction) ? 'business_rule' : 'script_include';
168
- }
169
-
170
- // Extract script name
171
- const nameMatch = instruction.match(/(?:create|write|build)\s+(?:a\s+)?([a-zA-Z0-9_\s]+?)(?:\s+(?:business\s*rule|script\s*include|client\s*script|for))/i);
172
- if (nameMatch) {
173
- requirements.name = nameMatch[1].trim().toLowerCase().replace(/\s+/g, '_');
174
- } else {
175
- requirements.name = `custom_${requirements.scriptType}_${Date.now()}`;
176
- }
177
-
178
- // Detect target table
179
- const tableMatch = instruction.match(/(?:for|on|table)\s+([a-zA-Z0-9_]+)/i);
180
- if (tableMatch) {
181
- requirements.targetTable = tableMatch[1];
182
- } else if (/incident/i.test(instruction)) {
183
- requirements.targetTable = 'incident';
184
- } else if (/request/i.test(instruction)) {
185
- requirements.targetTable = 'sc_request';
186
- } else if (/task/i.test(instruction)) {
187
- requirements.targetTable = 'task';
188
- }
189
-
190
- // Determine when to execute (for business rules)
191
- if (/before/i.test(instruction)) {
192
- requirements.when = 'before';
193
- } else if (/after/i.test(instruction)) {
194
- requirements.when = 'after';
195
- } else if (/async/i.test(instruction)) {
196
- requirements.when = 'async';
197
- requirements.async = true;
198
- } else if (/display/i.test(instruction)) {
199
- requirements.when = 'display';
200
- }
201
-
202
- // Detect operations
203
- if (/create|insert/i.test(instruction)) {
204
- requirements.operations.push('insert');
205
- }
206
- if (/update|modify/i.test(instruction)) {
207
- requirements.operations.push('update');
208
- }
209
- if (/delete|remove/i.test(instruction)) {
210
- requirements.operations.push('delete');
211
- }
212
- if (!requirements.operations.length && requirements.scriptType === 'business_rule') {
213
- requirements.operations = ['insert', 'update']; // Default
214
- }
215
-
216
- // Feature detection
217
- if (/validat/i.test(instruction)) {
218
- requirements.features.push('validation');
219
- }
220
- if (/calculat|compute/i.test(instruction)) {
221
- requirements.features.push('calculation');
222
- }
223
- if (/notification|email/i.test(instruction)) {
224
- requirements.features.push('notification');
225
- requirements.dependencies.push('sys_email');
226
- }
227
- if (/api|rest|integration/i.test(instruction)) {
228
- requirements.features.push('api_call');
229
- requirements.dependencies.push('sys_rest_message');
230
- }
231
- if (/transform|convert/i.test(instruction)) {
232
- requirements.features.push('data_transformation');
233
- }
234
- if (/performance|optimi/i.test(instruction)) {
235
- requirements.needsOptimization = true;
236
- }
237
-
238
- return requirements;
239
- }
240
-
241
- private async discoverTableSchema(tableName: string): Promise<any> {
242
- // This would use snow_table_schema_discovery MCP tool
243
- // For now, return common fields
244
- return {
245
- fields: [
246
- { name: 'sys_id', type: 'GUID', mandatory: true },
247
- { name: 'number', type: 'string', mandatory: true },
248
- { name: 'short_description', type: 'string', mandatory: false },
249
- { name: 'description', type: 'text', mandatory: false },
250
- { name: 'state', type: 'integer', mandatory: false },
251
- { name: 'priority', type: 'integer', mandatory: false },
252
- { name: 'assigned_to', type: 'reference', reference: 'sys_user' },
253
- { name: 'assignment_group', type: 'reference', reference: 'sys_user_group' },
254
- { name: 'sys_created_on', type: 'glide_date_time', mandatory: true },
255
- { name: 'sys_updated_on', type: 'glide_date_time', mandatory: true }
256
- ]
257
- };
258
- }
259
-
260
- private async createBusinessRuleScript(requirements: any): Promise<string> {
261
- let script = '(function executeRule(current, previous /*null when async*/) {\n\n';
262
-
263
- // Add header comment
264
- script += ` // Business Rule: ${requirements.name}\n`;
265
- script += ` // Table: ${requirements.targetTable}\n`;
266
- script += ` // When: ${requirements.when}\n`;
267
- script += ` // Operations: ${requirements.operations.join(', ')}\n\n`;
268
-
269
- // Add validation if needed
270
- if (requirements.features.includes('validation')) {
271
- script += ' // Validation logic\n';
272
- script += ' if (!current.short_description || current.short_description.toString().trim() === "") {\n';
273
- script += ' gs.addErrorMessage("Short description is required");\n';
274
- script += ' current.setAbortAction(true);\n';
275
- script += ' return;\n';
276
- script += ' }\n\n';
277
- }
278
-
279
- // Add calculation if needed
280
- if (requirements.features.includes('calculation')) {
281
- script += ' // Calculation logic\n';
282
- script += ' if (current.priority == 1 && current.impact == 1) {\n';
283
- script += ' current.urgency = 1; // High urgency for P1 high impact\n';
284
- script += ' }\n\n';
285
- }
286
-
287
- // Add main business logic based on when
288
- switch (requirements.when) {
289
- case 'before':
290
- script += ' // Before business logic\n';
291
- script += ' // Set field values before the record is saved\n';
292
- script += ' if (current.isNewRecord()) {\n';
293
- script += ' current.active = true;\n';
294
- script += ` current.created_by_rule = "${requirements.name}";\n`;
295
- script += ' }\n\n';
296
-
297
- script += ' // Track changes\n';
298
- script += ' if (!current.isNewRecord() && current.state.changes()) {\n';
299
- script += ' current.work_notes = "State changed from " + previous.getDisplayValue("state") + " to " + current.getDisplayValue("state");\n';
300
- script += ' }\n';
301
- break;
302
-
303
- case 'after':
304
- script += ' // After business logic\n';
305
- script += ' // Perform actions after the record is saved\n';
306
-
307
- if (requirements.features.includes('notification')) {
308
- script += ' \n // Send notification\n';
309
- script += ' if (current.isNewRecord() || current.state.changes()) {\n';
310
- script += ' gs.eventQueue("record.updated", current, current.assigned_to, current.assignment_group);\n';
311
- script += ' }\n';
312
- }
313
-
314
- script += ' \n // Create related records if needed\n';
315
- script += ' if (current.isNewRecord() && current.priority == 1) {\n';
316
- script += ' // Example: Create a task for high priority items\n';
317
- script += ' var task = new GlideRecord("task");\n';
318
- script += ' task.initialize();\n';
319
- script += ' task.parent = current.sys_id;\n';
320
- script += ' task.short_description = "Review high priority " + current.getDisplayValue();\n';
321
- script += ' task.insert();\n';
322
- script += ' }\n';
323
- break;
324
-
325
- case 'async':
326
- script += ' // Async business logic\n';
327
- script += ' // This runs in the background after the record is saved\n';
328
-
329
- if (requirements.features.includes('api_call')) {
330
- script += ' \n // Make API call\n';
331
- script += ' try {\n';
332
- script += ' var r = new sn_ws.RESTMessageV2();\n';
333
- script += ' r.setEndpoint("https://api.example.com/webhook");\n';
334
- script += ' r.setHttpMethod("POST");\n';
335
- script += ' r.setRequestBody(JSON.stringify({\n';
336
- script += ' record_number: current.number.toString(),\n';
337
- script += ' record_type: current.getTableName(),\n';
338
- script += ' action: "created"\n';
339
- script += ' }));\n';
340
- script += ' var response = r.execute();\n';
341
- script += ' gs.info("API Response: " + response.getStatusCode());\n';
342
- script += ' } catch (ex) {\n';
343
- script += ' gs.error("API call failed: " + ex.getMessage());\n';
344
- script += ' }\n';
345
- }
346
- break;
347
- }
348
-
349
- // Add error handling
350
- script += '\n // Error handling\n';
351
- script += ' try {\n';
352
- script += ' // Additional processing can go here\n';
353
- script += ' } catch (e) {\n';
354
- script += ` gs.error("Error in business rule ${requirements.name}: " + e.getMessage());\n`;
355
- script += ' }\n';
356
-
357
- script += '\n})(current, previous);';
358
-
359
- return script;
360
- }
361
-
362
- private async createScriptIncludeScript(requirements: any): Promise<string> {
363
- let script = `var ${requirements.name} = Class.create();\n`;
364
- script += `${requirements.name}.prototype = {\n`;
365
- script += ' initialize: function() {\n';
366
- script += ' // Initialize the script include\n';
367
- script += ' this.log_source = "' + requirements.name + '";\n';
368
- script += ' },\n\n';
369
-
370
- // Add main methods based on features
371
- if (requirements.features.includes('data_transformation')) {
372
- script += ' /**\n';
373
- script += ' * Transform data from one format to another\n';
374
- script += ' * @param {Object} sourceData - The data to transform\n';
375
- script += ' * @return {Object} Transformed data\n';
376
- script += ' */\n';
377
- script += ' transformData: function(sourceData) {\n';
378
- script += ' var transformedData = {};\n';
379
- script += ' \n';
380
- script += ' try {\n';
381
- script += ' // Transformation logic\n';
382
- script += ' for (var key in sourceData) {\n';
383
- script += ' if (sourceData.hasOwnProperty(key)) {\n';
384
- script += ' transformedData[this._normalizeKey(key)] = sourceData[key];\n';
385
- script += ' }\n';
386
- script += ' }\n';
387
- script += ' } catch (e) {\n';
388
- script += ' gs.error(this.log_source + ": Error transforming data - " + e.getMessage());\n';
389
- script += ' }\n';
390
- script += ' \n';
391
- script += ' return transformedData;\n';
392
- script += ' },\n\n';
393
-
394
- script += ' _normalizeKey: function(key) {\n';
395
- script += ' return key.toLowerCase().replace(/[^a-z0-9]/g, "_");\n';
396
- script += ' },\n\n';
397
- }
398
-
399
- if (requirements.features.includes('api_call')) {
400
- script += ' /**\n';
401
- script += ' * Make an API call to external service\n';
402
- script += ' * @param {String} endpoint - API endpoint\n';
403
- script += ' * @param {Object} payload - Request payload\n';
404
- script += ' * @return {Object} API response\n';
405
- script += ' */\n';
406
- script += ' callAPI: function(endpoint, payload) {\n';
407
- script += ' var response = {\n';
408
- script += ' success: false,\n';
409
- script += ' data: null,\n';
410
- script += ' error: null\n';
411
- script += ' };\n';
412
- script += ' \n';
413
- script += ' try {\n';
414
- script += ' var r = new sn_ws.RESTMessageV2();\n';
415
- script += ' r.setEndpoint(endpoint);\n';
416
- script += ' r.setHttpMethod("POST");\n';
417
- script += ' r.setRequestHeader("Content-Type", "application/json");\n';
418
- script += ' r.setRequestBody(JSON.stringify(payload));\n';
419
- script += ' \n';
420
- script += ' var httpResponse = r.execute();\n';
421
- script += ' response.success = httpResponse.getStatusCode() == 200;\n';
422
- script += ' response.data = JSON.parse(httpResponse.getBody());\n';
423
- script += ' } catch (e) {\n';
424
- script += ' response.error = e.getMessage();\n';
425
- script += ' gs.error(this.log_source + ": API call failed - " + e.getMessage());\n';
426
- script += ' }\n';
427
- script += ' \n';
428
- script += ' return response;\n';
429
- script += ' },\n\n';
430
- }
431
-
432
- // Add utility methods
433
- script += ' /**\n';
434
- script += ' * Process records from a table\n';
435
- script += ' * @param {String} tableName - Table to process\n';
436
- script += ' * @param {String} query - Encoded query\n';
437
- script += ' * @param {Function} callback - Function to call for each record\n';
438
- script += ' */\n';
439
- script += ' processRecords: function(tableName, query, callback) {\n';
440
- script += ' var count = 0;\n';
441
- script += ' var gr = new GlideRecord(tableName);\n';
442
- script += ' \n';
443
- script += ' if (query) {\n';
444
- script += ' gr.addEncodedQuery(query);\n';
445
- script += ' }\n';
446
- script += ' \n';
447
- script += ' gr.query();\n';
448
- script += ' \n';
449
- script += ' while (gr.next()) {\n';
450
- script += ' try {\n';
451
- script += ' callback(gr);\n';
452
- script += ' count++;\n';
453
- script += ' } catch (e) {\n';
454
- script += ' gs.error(this.log_source + ": Error processing record " + gr.getUniqueValue() + " - " + e.getMessage());\n';
455
- script += ' }\n';
456
- script += ' }\n';
457
- script += ' \n';
458
- script += ' gs.info(this.log_source + ": Processed " + count + " records from " + tableName);\n';
459
- script += ' return count;\n';
460
- script += ' },\n\n';
461
-
462
- // Add type checking
463
- script += ' type: "' + requirements.name + '"\n';
464
- script += '};';
465
-
466
- return script;
467
- }
468
-
469
- private async createClientScript(requirements: any): Promise<string> {
470
- let script = 'function ';
471
-
472
- // Determine function name based on type
473
- let functionName = 'onLoad';
474
- if (requirements.when === 'onChange') {
475
- functionName = 'onChange';
476
- } else if (requirements.when === 'onSubmit') {
477
- functionName = 'onSubmit';
478
- }
479
-
480
- // Add appropriate function signature
481
- switch (functionName) {
482
- case 'onLoad':
483
- script += 'onLoad() {\n';
484
- break;
485
- case 'onChange':
486
- script += 'onChange(control, oldValue, newValue, isLoading, isTemplate) {\n';
487
- script += ' if (isLoading || newValue === "") {\n';
488
- script += ' return;\n';
489
- script += ' }\n\n';
490
- break;
491
- case 'onSubmit':
492
- script += 'onSubmit() {\n';
493
- break;
494
- }
495
-
496
- // Add script logic based on features
497
- if (requirements.features.includes('validation')) {
498
- script += ' // Client-side validation\n';
499
- script += ' var shortDesc = g_form.getValue("short_description");\n';
500
- script += ' if (!shortDesc || shortDesc.trim() === "") {\n';
501
- script += ' g_form.showFieldMsg("short_description", "Short description is required", "error");\n';
502
- script += ' g_form.setMandatory("short_description", true);\n';
503
- if (functionName === 'onSubmit') {
504
- script += ' return false; // Prevent form submission\n';
505
- }
506
- script += ' }\n\n';
507
- }
508
-
509
- if (requirements.features.includes('calculation')) {
510
- script += ' // Field calculations\n';
511
- script += ' var priority = g_form.getValue("priority");\n';
512
- script += ' var impact = g_form.getValue("impact");\n';
513
- script += ' \n';
514
- script += ' if (priority == "1" && impact == "1") {\n';
515
- script += ' g_form.setValue("urgency", "1");\n';
516
- script += ' g_form.showFieldMsg("urgency", "Urgency set to High due to P1/High Impact", "info");\n';
517
- script += ' }\n\n';
518
- }
519
-
520
- // Add UI behavior logic
521
- script += ' // UI behavior\n';
522
- script += ' var state = g_form.getValue("state");\n';
523
- script += ' \n';
524
- script += ' // Show/hide fields based on state\n';
525
- script += ' if (state == "1") { // New\n';
526
- script += ' g_form.setDisplay("resolution_notes", false);\n';
527
- script += ' g_form.setDisplay("resolved_at", false);\n';
528
- script += ' } else if (state == "6") { // Resolved\n';
529
- script += ' g_form.setDisplay("resolution_notes", true);\n';
530
- script += ' g_form.setMandatory("resolution_notes", true);\n';
531
- script += ' }\n\n';
532
-
533
- // Add AJAX example if needed
534
- if (requirements.features.includes('api_call')) {
535
- script += ' // AJAX call example\n';
536
- script += ' var ga = new GlideAjax("' + requirements.name + '_Ajax");\n';
537
- script += ' ga.addParam("sysparm_name", "getData");\n';
538
- script += ' ga.addParam("sysparm_value", g_form.getValue("number"));\n';
539
- script += ' ga.getXMLAnswer(function(response) {\n';
540
- script += ' if (response) {\n';
541
- script += ' g_form.addInfoMessage("Data retrieved: " + response);\n';
542
- script += ' }\n';
543
- script += ' });\n\n';
544
- }
545
-
546
- // Close function
547
- if (functionName === 'onSubmit') {
548
- script += ' return true; // Allow form submission\n';
549
- }
550
- script += '}';
551
-
552
- return script;
553
- }
554
-
555
- private async createScheduledJobScript(requirements: any): Promise<string> {
556
- let script = '// Scheduled Job: ' + requirements.name + '\n';
557
- script += '// Schedule: Daily at midnight (adjust as needed)\n\n';
558
- script += '(function executeScheduledJob() {\n';
559
- script += ' var startTime = new GlideDateTime();\n';
560
- script += ' gs.info("' + requirements.name + ' - Started at " + startTime.getDisplayValue());\n\n';
561
-
562
- script += ' try {\n';
563
- script += ' var recordCount = 0;\n';
564
- script += ' var errorCount = 0;\n\n';
565
-
566
- if (requirements.targetTable) {
567
- script += ' // Process records from ' + requirements.targetTable + '\n';
568
- script += ' var gr = new GlideRecord("' + requirements.targetTable + '");\n';
569
- script += ' gr.addQuery("active", true);\n';
570
-
571
- // Add date filter for scheduled cleanup jobs
572
- if (requirements.features.includes('cleanup')) {
573
- script += ' // Process records older than 30 days\n';
574
- script += ' gr.addQuery("sys_updated_on", "<", gs.daysAgoStart(30));\n';
575
- }
576
-
577
- script += ' gr.query();\n\n';
578
- script += ' while (gr.next()) {\n';
579
- script += ' try {\n';
580
- script += ' // Process each record\n';
581
- script += ' recordCount++;\n';
582
-
583
- if (requirements.features.includes('data_transformation')) {
584
- script += ' \n // Transform data\n';
585
- script += ' var transformedData = transformRecord(gr);\n';
586
- script += ' if (transformedData) {\n';
587
- script += ' gr.work_notes = "Processed by scheduled job: " + transformedData.summary;\n';
588
- script += ' gr.update();\n';
589
- script += ' }\n';
590
- }
591
-
592
- script += ' } catch (e) {\n';
593
- script += ' errorCount++;\n';
594
- script += ' gs.error("' + requirements.name + ' - Error processing record " + gr.getDisplayValue() + ": " + e.getMessage());\n';
595
- script += ' }\n';
596
- script += ' }\n';
597
- }
598
-
599
- // Add summary reporting
600
- script += '\n // Summary report\n';
601
- script += ' var endTime = new GlideDateTime();\n';
602
- script += ' var duration = GlideDateTime.subtract(startTime, endTime);\n';
603
- script += ' \n';
604
- script += ' var summary = {\n';
605
- script += ' job_name: "' + requirements.name + '",\n';
606
- script += ' start_time: startTime.getDisplayValue(),\n';
607
- script += ' end_time: endTime.getDisplayValue(),\n';
608
- script += ' duration: duration.getDisplayValue(),\n';
609
- script += ' records_processed: recordCount,\n';
610
- script += ' errors: errorCount,\n';
611
- script += ' status: errorCount === 0 ? "Success" : "Completed with errors"\n';
612
- script += ' };\n';
613
- script += ' \n';
614
- script += ' gs.info("' + requirements.name + ' - Summary: " + JSON.stringify(summary));\n';
615
-
616
- // Send notification if configured
617
- if (requirements.features.includes('notification')) {
618
- script += ' \n // Send completion notification\n';
619
- script += ' if (errorCount > 0) {\n';
620
- script += ' gs.eventQueue("scheduled_job.error", null, JSON.stringify(summary));\n';
621
- script += ' }\n';
622
- }
623
-
624
- script += ' } catch (e) {\n';
625
- script += ' gs.error("' + requirements.name + ' - Fatal error: " + e.getMessage());\n';
626
- script += ' }\n';
627
-
628
- // Add helper function if needed
629
- if (requirements.features.includes('data_transformation')) {
630
- script += '\n function transformRecord(record) {\n';
631
- script += ' // Transform record data\n';
632
- script += ' return {\n';
633
- script += ' summary: record.short_description + " - Processed",\n';
634
- script += ' processed_date: new GlideDateTime().getDisplayValue()\n';
635
- script += ' };\n';
636
- script += ' }\n';
637
- }
638
-
639
- script += '})();';
640
-
641
- return script;
642
- }
643
-
644
- private async optimizeScript(script: string, requirements: any): Promise<string> {
645
- let optimizedScript = script;
646
-
647
- // Add caching for repeated queries
648
- if (script.includes('new GlideRecord') && script.includes('while')) {
649
- optimizedScript = '// Performance optimization: Use setLimit for large queries\n' + optimizedScript;
650
- optimizedScript = optimizedScript.replace(
651
- /gr\.query\(\);/g,
652
- 'gr.setLimit(1000); // Prevent memory issues\n gr.query();'
653
- );
654
- }
655
-
656
- // Use GlideAggregate for counting
657
- if (script.includes('count') || script.includes('COUNT')) {
658
- const aggregateExample = '\n// Performance tip: Use GlideAggregate for counting:\n' +
659
- '// var ga = new GlideAggregate("table_name");\n' +
660
- '// ga.addAggregate("COUNT");\n' +
661
- '// ga.query();\n' +
662
- '// var count = ga.next() ? ga.getAggregate("COUNT") : 0;\n\n';
663
- optimizedScript = aggregateExample + optimizedScript;
664
- }
665
-
666
- // Add bulk operations tip
667
- if (script.includes('.update()') && script.includes('while')) {
668
- const bulkTip = '\n// Performance tip: Consider using updateMultiple() for bulk updates\n' +
669
- '// gr.setValue("field", "value");\n' +
670
- '// gr.updateMultiple();\n\n';
671
- optimizedScript = bulkTip + optimizedScript;
672
- }
673
-
674
- return optimizedScript;
675
- }
676
-
677
- private createBusinessRuleConfig(requirements: any, script: string): any {
678
- return {
679
- name: requirements.name,
680
- table: requirements.targetTable,
681
- active: true,
682
- when: requirements.when,
683
- order: 100,
684
- script: script,
685
- condition: requirements.conditions.join(' AND ') || '',
686
- description: `Auto-generated business rule: ${requirements.name}`,
687
- advanced: true,
688
- actions: {
689
- insert: requirements.operations.includes('insert'),
690
- update: requirements.operations.includes('update'),
691
- delete: requirements.operations.includes('delete'),
692
- query: requirements.operations.includes('query')
693
- }
694
- };
695
- }
696
-
697
- private createScriptIncludeConfig(requirements: any, script: string): any {
698
- return {
699
- name: requirements.name,
700
- api_name: requirements.name,
701
- client_callable: false,
702
- active: true,
703
- script: script,
704
- description: `Auto-generated script include: ${requirements.name}`,
705
- access: 'package_private'
706
- };
707
- }
708
-
709
- private createClientScriptConfig(requirements: any, script: string): any {
710
- return {
711
- name: requirements.name,
712
- table: requirements.targetTable,
713
- type: requirements.when || 'onLoad',
714
- field: '', // Set if onChange script
715
- script: script,
716
- active: true,
717
- description: `Auto-generated client script: ${requirements.name}`,
718
- messages: [],
719
- global: false,
720
- isolate_script: true,
721
- ui_type: 10 // Desktop
722
- };
723
- }
724
-
725
- private createScheduledJobConfig(requirements: any, script: string): any {
726
- return {
727
- name: requirements.name,
728
- script: script,
729
- active: true,
730
- run_type: 'periodically',
731
- run_period: '1 day',
732
- run_time: '00:00:00',
733
- run_dayofweek: 'all',
734
- conditional: false,
735
- condition: ''
736
- };
737
- }
738
-
739
- private generateDocumentation(requirements: any, script: string): string {
740
- let doc = `# ${requirements.name}\n\n`;
741
- doc += `## Type\n${requirements.scriptType}\n\n`;
742
-
743
- if (requirements.targetTable) {
744
- doc += `## Target Table\n${requirements.targetTable}\n\n`;
745
- }
746
-
747
- if (requirements.when) {
748
- doc += `## When\n${requirements.when}\n\n`;
749
- }
750
-
751
- doc += `## Features\n`;
752
- requirements.features.forEach(feature => {
753
- doc += `- ${feature}\n`;
754
- });
755
-
756
- doc += `\n## Dependencies\n`;
757
- if (requirements.dependencies.length > 0) {
758
- requirements.dependencies.forEach(dep => {
759
- doc += `- ${dep}\n`;
760
- });
761
- } else {
762
- doc += 'None\n';
763
- }
764
-
765
- doc += `\n## Performance Optimized\n${requirements.needsOptimization ? 'Yes' : 'No'}\n`;
766
-
767
- return doc;
768
- }
769
- }