snow-flow 2.0.2 → 2.0.3
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/{.claude/mcp-config.json → .mcp.json} +13 -12
- package/.releaserc.json +47 -0
- package/README.md +6 -0
- package/package.json +1 -1
- package/.claude/claude-settings.json +0 -15
- package/.claude/commands/analysis/README.md +0 -9
- package/.claude/commands/automation/README.md +0 -9
- package/.claude/commands/github/README.md +0 -11
- package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
- package/.claude/commands/hooks/README.md +0 -11
- package/.claude/commands/monitoring/README.md +0 -9
- package/.claude/commands/optimization/README.md +0 -9
- package/.claude/commands/training/README.md +0 -9
- package/.claude/commands/workflows/README.md +0 -9
- package/.claude/config.json +0 -36
- package/.claude/helpers/github-setup.sh +0 -28
- package/.claude/helpers/quick-start.sh +0 -19
- package/.claude/helpers/setup-mcp.sh +0 -18
- package/.claude/settings.json +0 -114
- package/.claude/settings.local.json +0 -33
- package/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude-flow/metrics/performance.json +0 -9
- package/.claude-flow/metrics/system-metrics.json +0 -15986
- package/.claude-flow/metrics/task-metrics.json +0 -10
- package/.roo/README.md +0 -402
- package/.roo/mcp-list.txt +0 -257
- package/.roo/mcp.json +0 -32
- package/.roo/workflows/basic-tdd.json +0 -32
- package/.roomodes +0 -201
- package/CLAUDE.md +0 -393
- package/bin/snow-flow.js +0 -3
- package/dist/cli.js.bak +0 -2052
- package/dist/config/snow-flow-config.d.ts +0 -1492
- package/dist/config/snow-flow-config.js +0 -938
- package/scripts/create-env.js +0 -91
- package/scripts/postinstall.js +0 -30
- package/scripts/register-mcp-servers.js +0 -210
- package/scripts/reset-mcp-servers.js +0 -246
- package/scripts/setup-mcp.js +0 -106
- package/scripts/update-version.js +0 -31
- package/src/agents/README.md +0 -192
- package/src/agents/base-agent.ts +0 -251
- package/src/agents/coordinator.ts +0 -971
- package/src/agents/index.ts +0 -18
- package/src/agents/queen-403-handler.ts +0 -230
- package/src/agents/queen-agent.ts +0 -1399
- package/src/agents/script-writer-agent.ts +0 -769
- package/src/agents/security-agent.ts +0 -726
- package/src/agents/widget-creator-agent.ts +0 -568
- package/src/api/error-handling.ts +0 -1758
- package/src/api/natural-language-mapper.ts +0 -630
- package/src/api/performance-optimizer.ts +0 -891
- package/src/api/transaction-manager.ts +0 -754
- package/src/cli/deploy-artifact.ts +0 -304
- package/src/cli/snow-flow-cli-integration.ts +0 -434
- package/src/cli.ts +0 -4455
- package/src/cli.ts.bak +0 -5616
- package/src/compliance/advanced-compliance-system.ts +0 -1268
- package/src/compliance/index.ts +0 -19
- package/src/config/snow-flow-config.ts +0 -1019
- package/src/documentation/index.ts +0 -16
- package/src/documentation/self-documenting-system.ts +0 -1421
- package/src/dynamic-version.ts +0 -44
- package/src/healing/index.ts +0 -20
- package/src/healing/self-healing-system.ts +0 -1435
- package/src/health/README.md +0 -161
- package/src/health/system-health.ts +0 -995
- package/src/index.ts +0 -60
- package/src/intelligence/acl-analyzer.ts +0 -377
- package/src/intelligence/auto-resolution-engine.ts +0 -643
- package/src/intelligence/gap-analysis-engine.ts +0 -488
- package/src/intelligence/manual-instructions-generator.ts +0 -744
- package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
- package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
- package/src/intelligence/performance-recommendations-engine.ts +0 -1223
- package/src/intelligence/requirements-analyzer.ts +0 -1148
- package/src/intelligence/task-analyzer.ts +0 -628
- package/src/managers/scope-manager.ts +0 -555
- package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
- package/src/mcp/base-mcp-server.ts +0 -660
- package/src/mcp/http-transport-wrapper.ts +0 -426
- package/src/mcp/service-discovery-client.ts +0 -312
- package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
- package/src/mcp/servicenow-automation-mcp.ts +0 -838
- package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
- package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
- package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
- package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
- package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
- package/src/mcp/servicenow-integration-mcp.ts +0 -819
- package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
- package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
- package/src/mcp/servicenow-mcp-server.ts +0 -728
- package/src/mcp/servicenow-memory-mcp.ts +0 -474
- package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
- package/src/mcp/servicenow-operations-mcp.ts +0 -3384
- package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
- package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
- package/src/mcp/servicenow-progressive-indexer.ts +0 -370
- package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
- package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
- package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
- package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
- package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
- package/src/mcp/servicenow-update-set-mcp.ts +0 -811
- package/src/mcp/shared/agent-context-provider.ts +0 -365
- package/src/mcp/shared/base-mcp-server.ts +0 -2463
- package/src/mcp/shared/mcp-memory-manager.ts +0 -540
- package/src/mcp/shared/mcp-resource-manager.ts +0 -367
- package/src/mcp/snow-flow-mcp.ts +0 -911
- package/src/mcp/start-all-mcp-servers.ts +0 -102
- package/src/mcp/start-servicenow-mcp.ts +0 -67
- package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
- package/src/monitoring/performance-tracker.ts +0 -777
- package/src/optimization/cost-optimization-engine.ts +0 -1125
- package/src/optimization/index.ts +0 -10
- package/src/queen/README.md +0 -403
- package/src/queen/agent-factory.ts +0 -574
- package/src/queen/index.ts +0 -94
- package/src/queen/mcp-execution-bridge.ts +0 -681
- package/src/queen/neural-learning.ts +0 -319
- package/src/queen/parallel-agent-engine.ts +0 -848
- package/src/queen/queen-memory-system.ts +0 -490
- package/src/queen/queen-memory.ts +0 -456
- package/src/queen/servicenow-queen.ts +0 -1029
- package/src/queen/types.ts +0 -87
- package/src/rollback/smart-rollback-system.ts +0 -866
- package/src/schemas/deployment.schema.json +0 -58
- package/src/schemas/flow.schema.json +0 -79
- package/src/schemas/widget.schema.json +0 -72
- package/src/snow-flow-system.ts +0 -541
- package/src/sparc/sparc-help.ts +0 -49
- package/src/sparc/team-sparc.ts +0 -88
- package/src/strategies/global-scope-strategy.ts +0 -736
- package/src/templates/base/application.template.json +0 -45
- package/src/templates/base/business_rule.template.json +0 -33
- package/src/templates/base/script_include.template.json +0 -18
- package/src/templates/base/table.template.json +0 -64
- package/src/templates/base/widget.template.json +0 -25
- package/src/templates/patterns/composite.incident-management.template.json +0 -140
- package/src/templates/patterns/widget.dashboard.template.json +0 -238
- package/src/templates/patterns/widget.datatable.template.json +0 -292
- package/src/testing/integration-test-suite.ts +0 -1276
- package/src/types/index.ts +0 -183
- package/src/types/neo4j-driver.d.ts +0 -23
- package/src/types/servicenow.types.ts +0 -307
- package/src/types/snow-flow.types.ts +0 -186
- package/src/types/todo.types.ts +0 -70
- package/src/utils/action-type-cache.ts +0 -286
- package/src/utils/agent-detector.ts +0 -573
- package/src/utils/artifact-tracker.ts +0 -379
- package/src/utils/dependency-detector.ts +0 -233
- package/src/utils/deployment-metadata-handler.ts +0 -518
- package/src/utils/error-recovery.ts +0 -680
- package/src/utils/logger.ts +0 -60
- package/src/utils/mcp-auth-middleware.ts +0 -262
- package/src/utils/mcp-config-manager.ts +0 -270
- package/src/utils/mcp-server-manager.ts +0 -446
- package/src/utils/mcp-tool-registry.ts +0 -298
- package/src/utils/migrate-snow-flow.ts +0 -98
- package/src/utils/oauth-html-templates.ts +0 -188
- package/src/utils/scope-utils.ts +0 -443
- package/src/utils/servicenow-client.ts +0 -3321
- package/src/utils/servicenow-id-generator.ts +0 -181
- package/src/utils/snow-memory-manager.ts +0 -605
- package/src/utils/snow-oauth.ts +0 -797
- package/src/utils/template-engine.ts +0 -463
- package/src/utils/theme-manager.ts +0 -295
- package/src/utils/unified-auth-store.ts +0 -222
- package/src/utils/update-set-importer.ts +0 -422
- package/src/utils/update-set-xml-packager.ts +0 -371
- package/src/utils/widget-template-generator.ts +0 -1744
- package/src/version.ts +0 -1950
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Update Set XML Packager
|
|
4
|
-
*
|
|
5
|
-
* Properly packages Flow Designer XML into ServiceNow Update Sets
|
|
6
|
-
* with all required metadata and escaping
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import * as crypto from 'crypto';
|
|
10
|
-
import * as fs from 'fs';
|
|
11
|
-
import * as path from 'path';
|
|
12
|
-
|
|
13
|
-
export interface UpdateSetMetadata {
|
|
14
|
-
name: string;
|
|
15
|
-
description?: string;
|
|
16
|
-
application?: string;
|
|
17
|
-
release_date?: string;
|
|
18
|
-
state?: 'loaded' | 'previewed' | 'committed';
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface UpdateSetRecord {
|
|
22
|
-
table: string;
|
|
23
|
-
sys_id: string;
|
|
24
|
-
action: 'INSERT_OR_UPDATE' | 'DELETE';
|
|
25
|
-
payload: string;
|
|
26
|
-
type: string;
|
|
27
|
-
name?: string;
|
|
28
|
-
category?: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export class UpdateSetXMLPackager {
|
|
32
|
-
private updateSetId: string;
|
|
33
|
-
private timestamp: string;
|
|
34
|
-
private records: UpdateSetRecord[] = [];
|
|
35
|
-
|
|
36
|
-
constructor() {
|
|
37
|
-
this.updateSetId = this.generateSysId();
|
|
38
|
-
this.timestamp = new Date().toISOString();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Generate ServiceNow-compatible sys_id
|
|
43
|
-
*/
|
|
44
|
-
private generateSysId(): string {
|
|
45
|
-
return crypto.randomBytes(16).toString('hex');
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Escape XML special characters
|
|
50
|
-
*/
|
|
51
|
-
private escapeXml(value: string): string {
|
|
52
|
-
if (!value) return '';
|
|
53
|
-
return value
|
|
54
|
-
.replace(/&/g, '&')
|
|
55
|
-
.replace(/</g, '<')
|
|
56
|
-
.replace(/>/g, '>')
|
|
57
|
-
.replace(/"/g, '"')
|
|
58
|
-
.replace(/'/g, ''');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Add a record to the update set
|
|
63
|
-
*/
|
|
64
|
-
addRecord(record: UpdateSetRecord): void {
|
|
65
|
-
this.records.push(record);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Add flow components to update set
|
|
70
|
-
*/
|
|
71
|
-
addFlowComponents(components: {
|
|
72
|
-
flow: any;
|
|
73
|
-
snapshot: any;
|
|
74
|
-
trigger: any;
|
|
75
|
-
actions: any[];
|
|
76
|
-
logic: any[];
|
|
77
|
-
variables?: any[];
|
|
78
|
-
}): void {
|
|
79
|
-
// Add flow record
|
|
80
|
-
if (components.flow) {
|
|
81
|
-
this.addRecord({
|
|
82
|
-
table: 'sys_hub_flow',
|
|
83
|
-
sys_id: components.flow.sys_id,
|
|
84
|
-
action: 'INSERT_OR_UPDATE',
|
|
85
|
-
payload: this.createRecordPayload('sys_hub_flow', components.flow),
|
|
86
|
-
type: 'Flow Designer Flow',
|
|
87
|
-
name: `sys_hub_flow_${components.flow.sys_id}`
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Add snapshot
|
|
92
|
-
if (components.snapshot) {
|
|
93
|
-
this.addRecord({
|
|
94
|
-
table: 'sys_hub_flow_snapshot',
|
|
95
|
-
sys_id: components.snapshot.sys_id,
|
|
96
|
-
action: 'INSERT_OR_UPDATE',
|
|
97
|
-
payload: this.createRecordPayload('sys_hub_flow_snapshot', components.snapshot),
|
|
98
|
-
type: 'Flow Designer Snapshot',
|
|
99
|
-
name: `sys_hub_flow_snapshot_${components.snapshot.sys_id}`
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Add trigger
|
|
104
|
-
if (components.trigger) {
|
|
105
|
-
this.addRecord({
|
|
106
|
-
table: 'sys_hub_trigger_instance_v2',
|
|
107
|
-
sys_id: components.trigger.sys_id,
|
|
108
|
-
action: 'INSERT_OR_UPDATE',
|
|
109
|
-
payload: this.createRecordPayload('sys_hub_trigger_instance_v2', components.trigger),
|
|
110
|
-
type: 'Flow Designer Trigger',
|
|
111
|
-
name: `sys_hub_trigger_instance_v2_${components.trigger.sys_id}`
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Add actions
|
|
116
|
-
components.actions?.forEach(action => {
|
|
117
|
-
this.addRecord({
|
|
118
|
-
table: 'sys_hub_action_instance_v2',
|
|
119
|
-
sys_id: action.sys_id,
|
|
120
|
-
action: 'INSERT_OR_UPDATE',
|
|
121
|
-
payload: this.createRecordPayload('sys_hub_action_instance_v2', action),
|
|
122
|
-
type: 'Flow Designer Action',
|
|
123
|
-
name: `sys_hub_action_instance_v2_${action.sys_id}`
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// Add logic
|
|
128
|
-
components.logic?.forEach(logic => {
|
|
129
|
-
this.addRecord({
|
|
130
|
-
table: 'sys_hub_flow_logic_instance_v2',
|
|
131
|
-
sys_id: logic.sys_id,
|
|
132
|
-
action: 'INSERT_OR_UPDATE',
|
|
133
|
-
payload: this.createRecordPayload('sys_hub_flow_logic_instance_v2', logic),
|
|
134
|
-
type: 'Flow Designer Logic',
|
|
135
|
-
name: `sys_hub_flow_logic_instance_v2_${logic.sys_id}`
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
// Add variables
|
|
140
|
-
components.variables?.forEach(variable => {
|
|
141
|
-
this.addRecord({
|
|
142
|
-
table: 'sys_hub_flow_variable',
|
|
143
|
-
sys_id: variable.sys_id,
|
|
144
|
-
action: 'INSERT_OR_UPDATE',
|
|
145
|
-
payload: this.createRecordPayload('sys_hub_flow_variable', variable),
|
|
146
|
-
type: 'Flow Designer Variable',
|
|
147
|
-
name: `sys_hub_flow_variable_${variable.sys_id}`
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Create record payload XML
|
|
154
|
-
*/
|
|
155
|
-
private createRecordPayload(table: string, record: any): string {
|
|
156
|
-
const fields = Object.entries(record)
|
|
157
|
-
.filter(([key]) => !key.startsWith('_') && key !== 'sys_id')
|
|
158
|
-
.map(([key, value]) => {
|
|
159
|
-
if (value === null || value === undefined) {
|
|
160
|
-
return `<${key}/>`;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Handle display values
|
|
164
|
-
const displayValue = record[`${key}_display_value`];
|
|
165
|
-
const displayAttr = displayValue ? ` display_value="${this.escapeXml(displayValue)}"` : '';
|
|
166
|
-
|
|
167
|
-
// Handle different value types
|
|
168
|
-
if (typeof value === 'boolean') {
|
|
169
|
-
return `<${key}${displayAttr}>${value}</${key}>`;
|
|
170
|
-
} else if (typeof value === 'object') {
|
|
171
|
-
return `<${key}${displayAttr}>${this.escapeXml(JSON.stringify(value))}</${key}>`;
|
|
172
|
-
} else {
|
|
173
|
-
return `<${key}${displayAttr}>${this.escapeXml(String(value))}</${key}>`;
|
|
174
|
-
}
|
|
175
|
-
})
|
|
176
|
-
.join('');
|
|
177
|
-
|
|
178
|
-
return `<?xml version="1.0" encoding="UTF-8"?><record_update table="${table}"><${table} action="INSERT_OR_UPDATE">${fields}<sys_id>${record.sys_id}</sys_id></${table}></record_update>`;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Generate complete Update Set XML
|
|
183
|
-
*/
|
|
184
|
-
generateXML(metadata: UpdateSetMetadata): string {
|
|
185
|
-
const updateSetSysId = this.generateSysId();
|
|
186
|
-
|
|
187
|
-
// Build update records
|
|
188
|
-
const updateRecords = this.records.map(record => {
|
|
189
|
-
const updateXmlSysId = this.generateSysId();
|
|
190
|
-
|
|
191
|
-
return `
|
|
192
|
-
<sys_update_xml action="INSERT_OR_UPDATE">
|
|
193
|
-
<sys_id>${updateXmlSysId}</sys_id>
|
|
194
|
-
<action>${record.action}</action>
|
|
195
|
-
<application display_value="${metadata.application || 'Global'}">global</application>
|
|
196
|
-
<category>${record.category || 'customer'}</category>
|
|
197
|
-
<comments/>
|
|
198
|
-
<name>${record.name || record.table + '_' + record.sys_id}</name>
|
|
199
|
-
<payload><![CDATA[${record.payload}]]></payload>
|
|
200
|
-
<remote_update_set display_value="${this.escapeXml(metadata.name)}">${updateSetSysId}</remote_update_set>
|
|
201
|
-
<replace_on_upgrade>false</replace_on_upgrade>
|
|
202
|
-
<source_table>${record.table}</source_table>
|
|
203
|
-
<sys_class_name>sys_update_xml</sys_class_name>
|
|
204
|
-
<sys_created_by>admin</sys_created_by>
|
|
205
|
-
<sys_created_on>${this.timestamp}</sys_created_on>
|
|
206
|
-
<sys_id>${updateXmlSysId}</sys_id>
|
|
207
|
-
<sys_mod_count>0</sys_mod_count>
|
|
208
|
-
<sys_recorded_at>${this.timestamp}</sys_recorded_at>
|
|
209
|
-
<sys_updated_by>admin</sys_updated_by>
|
|
210
|
-
<sys_updated_on>${this.timestamp}</sys_updated_on>
|
|
211
|
-
<type>${record.type}</type>
|
|
212
|
-
<update_domain>global</update_domain>
|
|
213
|
-
<update_guid>${this.generateSysId()}${this.generateSysId()}</update_guid>
|
|
214
|
-
<update_set display_value=""/>
|
|
215
|
-
<view display_value="Default view">Default view</view>
|
|
216
|
-
</sys_update_xml>`;
|
|
217
|
-
}).join('\n');
|
|
218
|
-
|
|
219
|
-
// Build complete XML
|
|
220
|
-
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
221
|
-
<unload unload_date="${this.timestamp}">
|
|
222
|
-
<!-- Remote Update Set -->
|
|
223
|
-
<sys_remote_update_set action="INSERT_OR_UPDATE">
|
|
224
|
-
<sys_id>${updateSetSysId}</sys_id>
|
|
225
|
-
<name>${this.escapeXml(metadata.name)}</name>
|
|
226
|
-
<description>${this.escapeXml(metadata.description || '')}</description>
|
|
227
|
-
<origin_sys_id>${updateSetSysId}</origin_sys_id>
|
|
228
|
-
<parent/>
|
|
229
|
-
<release_date>${metadata.release_date || ''}</release_date>
|
|
230
|
-
<remote_parent_id/>
|
|
231
|
-
<remote_sys_id>${updateSetSysId}</remote_sys_id>
|
|
232
|
-
<state>${metadata.state || 'loaded'}</state>
|
|
233
|
-
<summary/>
|
|
234
|
-
<sys_class_name>sys_remote_update_set</sys_class_name>
|
|
235
|
-
<sys_created_by>admin</sys_created_by>
|
|
236
|
-
<sys_created_on>${this.timestamp}</sys_created_on>
|
|
237
|
-
<sys_domain>global</sys_domain>
|
|
238
|
-
<sys_domain_path>/</sys_domain_path>
|
|
239
|
-
<sys_id>${updateSetSysId}</sys_id>
|
|
240
|
-
<sys_mod_count>0</sys_mod_count>
|
|
241
|
-
<sys_updated_by>admin</sys_updated_by>
|
|
242
|
-
<sys_updated_on>${this.timestamp}</sys_updated_on>
|
|
243
|
-
<update_set/>
|
|
244
|
-
<update_source/>
|
|
245
|
-
<version/>
|
|
246
|
-
</sys_remote_update_set>
|
|
247
|
-
|
|
248
|
-
${updateRecords}
|
|
249
|
-
</unload>`;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Save XML to file
|
|
254
|
-
*/
|
|
255
|
-
saveToFile(xml: string, filename?: string): string {
|
|
256
|
-
const outputDir = path.join(process.cwd(), 'flow-update-sets');
|
|
257
|
-
if (!fs.existsSync(outputDir)) {
|
|
258
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
const outputFile = path.join(outputDir, filename || `update_set_${this.updateSetId}.xml`);
|
|
262
|
-
fs.writeFileSync(outputFile, xml, 'utf8');
|
|
263
|
-
|
|
264
|
-
return outputFile;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Create Update Set from existing flow XML
|
|
269
|
-
*/
|
|
270
|
-
static packageFlowXML(flowXML: string, metadata: UpdateSetMetadata): { xml: string; filePath: string } {
|
|
271
|
-
const packager = new UpdateSetXMLPackager();
|
|
272
|
-
|
|
273
|
-
// Parse existing XML to extract components
|
|
274
|
-
// This is a simplified version - real implementation would parse properly
|
|
275
|
-
const flowMatch = flowXML.match(/<sys_hub_flow[^>]*>[\s\S]*?<\/sys_hub_flow>/);
|
|
276
|
-
const snapshotMatch = flowXML.match(/<sys_hub_flow_snapshot[^>]*>[\s\S]*?<\/sys_hub_flow_snapshot>/);
|
|
277
|
-
|
|
278
|
-
if (flowMatch) {
|
|
279
|
-
packager.addRecord({
|
|
280
|
-
table: 'sys_hub_flow',
|
|
281
|
-
sys_id: packager.generateSysId(),
|
|
282
|
-
action: 'INSERT_OR_UPDATE',
|
|
283
|
-
payload: flowMatch[0],
|
|
284
|
-
type: 'Flow Designer Flow'
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
if (snapshotMatch) {
|
|
289
|
-
packager.addRecord({
|
|
290
|
-
table: 'sys_hub_flow_snapshot',
|
|
291
|
-
sys_id: packager.generateSysId(),
|
|
292
|
-
action: 'INSERT_OR_UPDATE',
|
|
293
|
-
payload: snapshotMatch[0],
|
|
294
|
-
type: 'Flow Designer Snapshot'
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const xml = packager.generateXML(metadata);
|
|
299
|
-
const filePath = packager.saveToFile(xml);
|
|
300
|
-
|
|
301
|
-
return { xml, filePath };
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Validate Update Set XML structure
|
|
306
|
-
*/
|
|
307
|
-
static validateXML(xml: string): { valid: boolean; errors: string[] } {
|
|
308
|
-
const errors: string[] = [];
|
|
309
|
-
|
|
310
|
-
// Check for required elements
|
|
311
|
-
if (!xml.includes('<sys_remote_update_set')) {
|
|
312
|
-
errors.push('Missing sys_remote_update_set element');
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (!xml.includes('<sys_update_xml')) {
|
|
316
|
-
errors.push('Missing sys_update_xml records');
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Check for proper CDATA wrapping
|
|
320
|
-
const payloadMatches = xml.match(/<payload>/g);
|
|
321
|
-
const cdataMatches = xml.match(/<!\[CDATA\[/g);
|
|
322
|
-
if (payloadMatches && cdataMatches && payloadMatches.length !== cdataMatches.length) {
|
|
323
|
-
errors.push('Payload elements not properly wrapped in CDATA');
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Check XML declaration
|
|
327
|
-
if (!xml.startsWith('<?xml version="1.0" encoding="UTF-8"?>')) {
|
|
328
|
-
errors.push('Missing or incorrect XML declaration');
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return {
|
|
332
|
-
valid: errors.length === 0,
|
|
333
|
-
errors
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Export helper function
|
|
339
|
-
export function packageFlowForUpdateSet(
|
|
340
|
-
flowDefinition: any,
|
|
341
|
-
updateSetName: string,
|
|
342
|
-
description?: string
|
|
343
|
-
): { xml: string; filePath: string; validation: any } {
|
|
344
|
-
const packager = new UpdateSetXMLPackager();
|
|
345
|
-
|
|
346
|
-
// Add all flow components
|
|
347
|
-
packager.addFlowComponents({
|
|
348
|
-
flow: flowDefinition.flow,
|
|
349
|
-
snapshot: flowDefinition.snapshot,
|
|
350
|
-
trigger: flowDefinition.trigger,
|
|
351
|
-
actions: flowDefinition.actions || [],
|
|
352
|
-
logic: flowDefinition.logic || [],
|
|
353
|
-
variables: flowDefinition.variables || []
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
// Generate XML
|
|
357
|
-
const xml = packager.generateXML({
|
|
358
|
-
name: updateSetName,
|
|
359
|
-
description: description || `Flow deployment: ${flowDefinition.flow?.name || 'Unknown'}`
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
// Save to file
|
|
363
|
-
const filePath = packager.saveToFile(xml);
|
|
364
|
-
|
|
365
|
-
// Validate
|
|
366
|
-
const validation = UpdateSetXMLPackager.validateXML(xml);
|
|
367
|
-
|
|
368
|
-
return { xml, filePath, validation };
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
export default UpdateSetXMLPackager;
|