scene-capability-engine 3.6.44 → 3.6.46

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 (61) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/bin/scene-capability-engine.js +36 -2
  3. package/docs/command-reference.md +5 -0
  4. package/docs/releases/README.md +2 -0
  5. package/docs/releases/v3.6.45.md +18 -0
  6. package/docs/releases/v3.6.46.md +23 -0
  7. package/docs/zh/releases/README.md +2 -0
  8. package/docs/zh/releases/v3.6.45.md +18 -0
  9. package/docs/zh/releases/v3.6.46.md +23 -0
  10. package/lib/workspace/collab-governance-audit.js +575 -0
  11. package/package.json +4 -2
  12. package/scripts/auto-strategy-router.js +231 -0
  13. package/scripts/capability-mapping-report.js +339 -0
  14. package/scripts/check-branding-consistency.js +140 -0
  15. package/scripts/check-sce-tracking.js +54 -0
  16. package/scripts/check-skip-allowlist.js +94 -0
  17. package/scripts/errorbook-registry-health-gate.js +172 -0
  18. package/scripts/errorbook-release-gate.js +132 -0
  19. package/scripts/failure-attribution-repair.js +317 -0
  20. package/scripts/git-managed-gate.js +464 -0
  21. package/scripts/interactive-approval-event-projection.js +400 -0
  22. package/scripts/interactive-approval-workflow.js +829 -0
  23. package/scripts/interactive-authorization-tier-evaluate.js +413 -0
  24. package/scripts/interactive-change-plan-gate.js +225 -0
  25. package/scripts/interactive-context-bridge.js +617 -0
  26. package/scripts/interactive-customization-loop.js +1690 -0
  27. package/scripts/interactive-dialogue-governance.js +842 -0
  28. package/scripts/interactive-feedback-log.js +253 -0
  29. package/scripts/interactive-flow-smoke.js +238 -0
  30. package/scripts/interactive-flow.js +1059 -0
  31. package/scripts/interactive-governance-report.js +1112 -0
  32. package/scripts/interactive-intent-build.js +707 -0
  33. package/scripts/interactive-loop-smoke.js +215 -0
  34. package/scripts/interactive-moqui-adapter.js +304 -0
  35. package/scripts/interactive-plan-build.js +426 -0
  36. package/scripts/interactive-runtime-policy-evaluate.js +495 -0
  37. package/scripts/interactive-work-order-build.js +552 -0
  38. package/scripts/matrix-regression-gate.js +167 -0
  39. package/scripts/moqui-core-regression-suite.js +397 -0
  40. package/scripts/moqui-lexicon-audit.js +651 -0
  41. package/scripts/moqui-matrix-remediation-phased-runner.js +865 -0
  42. package/scripts/moqui-matrix-remediation-queue.js +852 -0
  43. package/scripts/moqui-metadata-extract.js +1340 -0
  44. package/scripts/moqui-rebuild-gate.js +167 -0
  45. package/scripts/moqui-release-summary.js +729 -0
  46. package/scripts/moqui-standard-rebuild.js +1370 -0
  47. package/scripts/moqui-template-baseline-report.js +682 -0
  48. package/scripts/npm-package-runtime-asset-check.js +221 -0
  49. package/scripts/problem-closure-gate.js +441 -0
  50. package/scripts/release-asset-integrity-check.js +216 -0
  51. package/scripts/release-asset-nonempty-normalize.js +166 -0
  52. package/scripts/release-drift-evaluate.js +223 -0
  53. package/scripts/release-drift-signals.js +255 -0
  54. package/scripts/release-governance-snapshot-export.js +132 -0
  55. package/scripts/release-ops-weekly-summary.js +934 -0
  56. package/scripts/release-risk-remediation-bundle.js +315 -0
  57. package/scripts/release-weekly-ops-gate.js +423 -0
  58. package/scripts/state-migration-reconciliation-gate.js +110 -0
  59. package/scripts/state-storage-tiering-audit.js +337 -0
  60. package/scripts/steering-content-audit.js +393 -0
  61. package/scripts/symbol-evidence-locate.js +366 -0
@@ -0,0 +1,253 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const path = require('path');
5
+ const fs = require('fs-extra');
6
+ const crypto = require('crypto');
7
+
8
+ const DEFAULT_FEEDBACK_FILE = '.sce/reports/interactive-user-feedback.jsonl';
9
+ const ALLOWED_CHANNELS = new Set(['ui', 'cli', 'api', 'other']);
10
+
11
+ function parseArgs(argv) {
12
+ const options = {
13
+ score: null,
14
+ comment: null,
15
+ userId: 'anonymous-user',
16
+ sessionId: null,
17
+ intentId: null,
18
+ planId: null,
19
+ executionId: null,
20
+ channel: 'ui',
21
+ tags: [],
22
+ product: null,
23
+ module: null,
24
+ page: null,
25
+ sceneId: null,
26
+ feedbackFile: DEFAULT_FEEDBACK_FILE,
27
+ json: false
28
+ };
29
+
30
+ for (let index = 0; index < argv.length; index += 1) {
31
+ const token = argv[index];
32
+ const next = argv[index + 1];
33
+
34
+ if (token === '--score' && next) {
35
+ options.score = Number(next);
36
+ index += 1;
37
+ } else if (token === '--comment' && next) {
38
+ options.comment = next;
39
+ index += 1;
40
+ } else if (token === '--user-id' && next) {
41
+ options.userId = next;
42
+ index += 1;
43
+ } else if (token === '--session-id' && next) {
44
+ options.sessionId = next;
45
+ index += 1;
46
+ } else if (token === '--intent-id' && next) {
47
+ options.intentId = next;
48
+ index += 1;
49
+ } else if (token === '--plan-id' && next) {
50
+ options.planId = next;
51
+ index += 1;
52
+ } else if (token === '--execution-id' && next) {
53
+ options.executionId = next;
54
+ index += 1;
55
+ } else if (token === '--channel' && next) {
56
+ options.channel = next;
57
+ index += 1;
58
+ } else if (token === '--tags' && next) {
59
+ options.tags = next
60
+ .split(',')
61
+ .map(item => item.trim())
62
+ .filter(Boolean);
63
+ index += 1;
64
+ } else if (token === '--product' && next) {
65
+ options.product = next;
66
+ index += 1;
67
+ } else if (token === '--module' && next) {
68
+ options.module = next;
69
+ index += 1;
70
+ } else if (token === '--page' && next) {
71
+ options.page = next;
72
+ index += 1;
73
+ } else if (token === '--scene-id' && next) {
74
+ options.sceneId = next;
75
+ index += 1;
76
+ } else if (token === '--feedback-file' && next) {
77
+ options.feedbackFile = next;
78
+ index += 1;
79
+ } else if (token === '--json') {
80
+ options.json = true;
81
+ } else if (token === '--help' || token === '-h') {
82
+ printHelpAndExit(0);
83
+ }
84
+ }
85
+
86
+ if (!Number.isFinite(options.score)) {
87
+ throw new Error('--score is required and must be a number between 0 and 5.');
88
+ }
89
+ if (options.score < 0 || options.score > 5) {
90
+ throw new Error('--score must be between 0 and 5.');
91
+ }
92
+
93
+ options.channel = `${options.channel || ''}`.trim().toLowerCase();
94
+ if (!ALLOWED_CHANNELS.has(options.channel)) {
95
+ throw new Error(`--channel must be one of: ${Array.from(ALLOWED_CHANNELS).join(', ')}`);
96
+ }
97
+
98
+ options.userId = `${options.userId || ''}`.trim() || 'anonymous-user';
99
+ options.sessionId = normalizeOptionalString(options.sessionId);
100
+ options.intentId = normalizeOptionalString(options.intentId);
101
+ options.planId = normalizeOptionalString(options.planId);
102
+ options.executionId = normalizeOptionalString(options.executionId);
103
+ options.comment = normalizeOptionalString(options.comment);
104
+ options.product = normalizeOptionalString(options.product);
105
+ options.module = normalizeOptionalString(options.module);
106
+ options.page = normalizeOptionalString(options.page);
107
+ options.sceneId = normalizeOptionalString(options.sceneId);
108
+ options.tags = normalizeTags(options.tags);
109
+
110
+ return options;
111
+ }
112
+
113
+ function printHelpAndExit(code) {
114
+ const lines = [
115
+ 'Usage: node scripts/interactive-feedback-log.js --score <0..5> [options]',
116
+ '',
117
+ 'Options:',
118
+ ' --score <n> Feedback score (required, 0-5)',
119
+ ' --comment <text> Optional feedback comment',
120
+ ' --user-id <id> User identifier (default: anonymous-user)',
121
+ ' --session-id <id> Optional interactive session id',
122
+ ' --intent-id <id> Optional intent id',
123
+ ' --plan-id <id> Optional plan id',
124
+ ' --execution-id <id> Optional execution id',
125
+ ' --channel <name> ui|cli|api|other (default: ui)',
126
+ ' --tags <csv> Optional tags, comma separated',
127
+ ' --product <name> Optional product context',
128
+ ' --module <name> Optional module context',
129
+ ' --page <name> Optional page context',
130
+ ' --scene-id <name> Optional scene id context',
131
+ ` --feedback-file <path> Feedback JSONL file (default: ${DEFAULT_FEEDBACK_FILE})`,
132
+ ' --json Print JSON result',
133
+ ' -h, --help Show this help'
134
+ ];
135
+ console.log(lines.join('\n'));
136
+ process.exit(code);
137
+ }
138
+
139
+ function normalizeOptionalString(value) {
140
+ const text = `${value || ''}`.trim();
141
+ return text.length > 0 ? text : null;
142
+ }
143
+
144
+ function normalizeTags(input) {
145
+ if (!Array.isArray(input)) {
146
+ return [];
147
+ }
148
+ const normalized = [];
149
+ const seen = new Set();
150
+ for (const item of input) {
151
+ const value = `${item || ''}`.trim().toLowerCase();
152
+ if (!value || seen.has(value)) {
153
+ continue;
154
+ }
155
+ seen.add(value);
156
+ normalized.push(value);
157
+ }
158
+ return normalized;
159
+ }
160
+
161
+ function resolvePath(cwd, value) {
162
+ return path.isAbsolute(value) ? value : path.resolve(cwd, value);
163
+ }
164
+
165
+ function inferSentiment(score) {
166
+ if (score >= 4) {
167
+ return 'positive';
168
+ }
169
+ if (score <= 2) {
170
+ return 'negative';
171
+ }
172
+ return 'neutral';
173
+ }
174
+
175
+ function buildContextRef(options) {
176
+ const context = {
177
+ product: options.product,
178
+ module: options.module,
179
+ page: options.page,
180
+ scene_id: options.sceneId
181
+ };
182
+
183
+ const hasValue = Object.values(context).some(item => item != null);
184
+ return hasValue ? context : null;
185
+ }
186
+
187
+ function buildFeedbackRecord(options, createdAt) {
188
+ return {
189
+ feedback_id: `feedback-${crypto.randomUUID()}`,
190
+ event_type: 'interactive.feedback.submitted',
191
+ timestamp: createdAt,
192
+ user_id: options.userId,
193
+ session_id: options.sessionId,
194
+ intent_id: options.intentId,
195
+ plan_id: options.planId,
196
+ execution_id: options.executionId,
197
+ score: Number(options.score),
198
+ sentiment: inferSentiment(options.score),
199
+ comment: options.comment,
200
+ channel: options.channel,
201
+ tags: options.tags,
202
+ context_ref: buildContextRef(options)
203
+ };
204
+ }
205
+
206
+ async function main() {
207
+ const options = parseArgs(process.argv.slice(2));
208
+ const cwd = process.cwd();
209
+ const feedbackPath = resolvePath(cwd, options.feedbackFile);
210
+ const createdAt = new Date().toISOString();
211
+ const record = buildFeedbackRecord(options, createdAt);
212
+
213
+ await fs.ensureDir(path.dirname(feedbackPath));
214
+ await fs.appendFile(feedbackPath, `${JSON.stringify(record)}\n`, 'utf8');
215
+
216
+ const payload = {
217
+ mode: 'interactive-feedback-log',
218
+ generated_at: createdAt,
219
+ record,
220
+ output: {
221
+ feedback_file: path.relative(cwd, feedbackPath) || '.'
222
+ }
223
+ };
224
+
225
+ if (options.json) {
226
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
227
+ } else {
228
+ process.stdout.write('Interactive feedback logged.\n');
229
+ process.stdout.write(`- Feedback file: ${payload.output.feedback_file}\n`);
230
+ process.stdout.write(`- Score: ${record.score}\n`);
231
+ process.stdout.write(`- Sentiment: ${record.sentiment}\n`);
232
+ }
233
+ }
234
+
235
+ if (require.main === module) {
236
+ main().catch((error) => {
237
+ console.error(`Interactive feedback log failed: ${error.message}`);
238
+ process.exit(1);
239
+ });
240
+ }
241
+
242
+ module.exports = {
243
+ DEFAULT_FEEDBACK_FILE,
244
+ ALLOWED_CHANNELS,
245
+ parseArgs,
246
+ normalizeOptionalString,
247
+ normalizeTags,
248
+ resolvePath,
249
+ inferSentiment,
250
+ buildContextRef,
251
+ buildFeedbackRecord,
252
+ main
253
+ };
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const path = require('path');
5
+ const fs = require('fs-extra');
6
+ const crypto = require('crypto');
7
+ const { spawnSync } = require('child_process');
8
+
9
+ const DEFAULT_INPUT = 'docs/interactive-customization/moqui-context-provider.sample.json';
10
+ const DEFAULT_GOAL = 'Adjust order screen field layout for clearer input flow';
11
+ const DEFAULT_POLICY = 'docs/interactive-customization/guardrail-policy-baseline.json';
12
+ const DEFAULT_CATALOG = 'docs/interactive-customization/high-risk-action-catalog.json';
13
+ const DEFAULT_APPROVAL_ROLE_POLICY = 'docs/interactive-customization/approval-role-policy-baseline.json';
14
+ const DEFAULT_APPROVAL_ACTOR_ROLE = 'workflow-operator';
15
+ const DEFAULT_APPROVER_ACTOR_ROLE = 'workflow-operator';
16
+ const DEFAULT_DIALOGUE_PROFILE = 'system-maintainer';
17
+ const DEFAULT_OUT = '.sce/reports/interactive-flow-smoke/interactive-flow-smoke.summary.json';
18
+
19
+ function parseArgs(argv) {
20
+ const options = {
21
+ input: DEFAULT_INPUT,
22
+ goal: DEFAULT_GOAL,
23
+ policy: DEFAULT_POLICY,
24
+ catalog: DEFAULT_CATALOG,
25
+ approvalRolePolicy: DEFAULT_APPROVAL_ROLE_POLICY,
26
+ approvalActorRole: DEFAULT_APPROVAL_ACTOR_ROLE,
27
+ approverActorRole: DEFAULT_APPROVER_ACTOR_ROLE,
28
+ dialogueProfile: DEFAULT_DIALOGUE_PROFILE,
29
+ out: DEFAULT_OUT,
30
+ json: false
31
+ };
32
+
33
+ for (let index = 0; index < argv.length; index += 1) {
34
+ const token = argv[index];
35
+ const next = argv[index + 1];
36
+ if (token === '--input' && next) {
37
+ options.input = next;
38
+ index += 1;
39
+ } else if (token === '--goal' && next) {
40
+ options.goal = next;
41
+ index += 1;
42
+ } else if (token === '--policy' && next) {
43
+ options.policy = next;
44
+ index += 1;
45
+ } else if (token === '--catalog' && next) {
46
+ options.catalog = next;
47
+ index += 1;
48
+ } else if (token === '--approval-role-policy' && next) {
49
+ options.approvalRolePolicy = next;
50
+ index += 1;
51
+ } else if (token === '--approval-actor-role' && next) {
52
+ options.approvalActorRole = next;
53
+ index += 1;
54
+ } else if (token === '--approver-actor-role' && next) {
55
+ options.approverActorRole = next;
56
+ index += 1;
57
+ } else if (token === '--dialogue-profile' && next) {
58
+ options.dialogueProfile = next;
59
+ index += 1;
60
+ } else if (token === '--out' && next) {
61
+ options.out = next;
62
+ index += 1;
63
+ } else if (token === '--json') {
64
+ options.json = true;
65
+ } else if (token === '--help' || token === '-h') {
66
+ printHelpAndExit(0);
67
+ }
68
+ }
69
+
70
+ return options;
71
+ }
72
+
73
+ function printHelpAndExit(code) {
74
+ const lines = [
75
+ 'Usage: node scripts/interactive-flow-smoke.js [options]',
76
+ '',
77
+ 'Options:',
78
+ ` --input <path> Provider payload JSON path (default: ${DEFAULT_INPUT})`,
79
+ ` --goal <text> Smoke goal text (default: ${DEFAULT_GOAL})`,
80
+ ` --policy <path> Guardrail policy path (default: ${DEFAULT_POLICY})`,
81
+ ` --catalog <path> High-risk catalog path (default: ${DEFAULT_CATALOG})`,
82
+ ` --approval-role-policy <path> Role policy path (default: ${DEFAULT_APPROVAL_ROLE_POLICY})`,
83
+ ` --approval-actor-role <name> Approval actor role (default: ${DEFAULT_APPROVAL_ACTOR_ROLE})`,
84
+ ` --approver-actor-role <name> Approver actor role (default: ${DEFAULT_APPROVER_ACTOR_ROLE})`,
85
+ ` --dialogue-profile <name> Dialogue profile (default: ${DEFAULT_DIALOGUE_PROFILE})`,
86
+ ` --out <path> Flow summary output path (default: ${DEFAULT_OUT})`,
87
+ ' --json Print smoke payload as JSON',
88
+ ' -h, --help Show this help'
89
+ ];
90
+ console.log(lines.join('\n'));
91
+ process.exit(code);
92
+ }
93
+
94
+ function resolvePath(cwd, value) {
95
+ return path.isAbsolute(value) ? value : path.resolve(cwd, value);
96
+ }
97
+
98
+ function parseJson(text, label) {
99
+ const raw = `${text || ''}`.trim();
100
+ if (!raw) {
101
+ throw new Error(`${label} output is empty`);
102
+ }
103
+ try {
104
+ return JSON.parse(raw);
105
+ } catch (error) {
106
+ throw new Error(`${label} output is not valid JSON: ${error.message}`);
107
+ }
108
+ }
109
+
110
+ function assert(condition, message) {
111
+ if (!condition) {
112
+ throw new Error(message);
113
+ }
114
+ }
115
+
116
+ async function main() {
117
+ const options = parseArgs(process.argv.slice(2));
118
+ const cwd = process.cwd();
119
+ const flowScript = path.resolve(__dirname, 'interactive-flow.js');
120
+ const inputPath = resolvePath(cwd, options.input);
121
+ const policyPath = resolvePath(cwd, options.policy);
122
+ const catalogPath = resolvePath(cwd, options.catalog);
123
+ const approvalRolePolicyPath = resolvePath(cwd, options.approvalRolePolicy);
124
+ const outPath = resolvePath(cwd, options.out);
125
+
126
+ if (!(await fs.pathExists(flowScript))) {
127
+ throw new Error(`interactive flow script not found: ${flowScript}`);
128
+ }
129
+ if (!(await fs.pathExists(inputPath))) {
130
+ throw new Error(`input file not found: ${inputPath}`);
131
+ }
132
+ if (!(await fs.pathExists(policyPath))) {
133
+ throw new Error(`policy file not found: ${policyPath}`);
134
+ }
135
+ if (!(await fs.pathExists(catalogPath))) {
136
+ throw new Error(`catalog file not found: ${catalogPath}`);
137
+ }
138
+ if (!(await fs.pathExists(approvalRolePolicyPath))) {
139
+ throw new Error(`approval role policy file not found: ${approvalRolePolicyPath}`);
140
+ }
141
+
142
+ const args = [
143
+ flowScript,
144
+ '--input', inputPath,
145
+ '--goal', options.goal,
146
+ '--policy', policyPath,
147
+ '--catalog', catalogPath,
148
+ '--approval-role-policy', approvalRolePolicyPath,
149
+ '--approval-actor-role', options.approvalActorRole,
150
+ '--approver-actor-role', options.approverActorRole,
151
+ '--dialogue-profile', options.dialogueProfile,
152
+ '--execution-mode', 'apply',
153
+ '--auto-execute-low-risk',
154
+ '--auth-password-hash', crypto.createHash('sha256').update('smoke-pass').digest('hex'),
155
+ '--auth-password', 'smoke-pass',
156
+ '--feedback-score', '5',
157
+ '--out', outPath,
158
+ '--json'
159
+ ];
160
+
161
+ const runResult = spawnSync(process.execPath, args, {
162
+ cwd,
163
+ encoding: 'utf8'
164
+ });
165
+
166
+ const exitCode = Number.isInteger(runResult.status) ? runResult.status : 1;
167
+ if (exitCode !== 0) {
168
+ const stderr = `${runResult.stderr || ''}`.trim();
169
+ throw new Error(`interactive flow exited with ${exitCode}${stderr ? `: ${stderr}` : ''}`);
170
+ }
171
+
172
+ const payload = parseJson(runResult.stdout, 'interactive flow');
173
+ const flowSummary = resolvePath(cwd, payload && payload.artifacts ? payload.artifacts.flow_summary_json : '');
174
+ const bridgeContext = resolvePath(cwd, payload && payload.artifacts ? payload.artifacts.bridge_context_json : '');
175
+
176
+ assert(payload.mode === 'interactive-flow', 'flow mode mismatch');
177
+ assert(payload.summary && payload.summary.status === 'completed', 'flow summary status must be completed');
178
+ assert(payload.summary && payload.summary.gate_decision === 'allow', 'flow gate decision must be allow');
179
+ assert(payload.summary && payload.summary.execution_result === 'success', 'flow execution result must be success');
180
+ assert(payload.pipeline && payload.pipeline.bridge && payload.pipeline.bridge.exit_code === 0, 'bridge stage must succeed');
181
+ assert(payload.pipeline && payload.pipeline.loop && payload.pipeline.loop.exit_code === 0, 'loop stage must succeed');
182
+ assert(payload.pipeline && payload.pipeline.loop && payload.pipeline.loop.payload &&
183
+ payload.pipeline.loop.payload.approval &&
184
+ payload.pipeline.loop.payload.approval.authorization &&
185
+ payload.pipeline.loop.payload.approval.authorization.role_requirements &&
186
+ Array.isArray(payload.pipeline.loop.payload.approval.authorization.role_requirements.execute),
187
+ 'flow loop payload role requirements must be present');
188
+ assert(await fs.pathExists(flowSummary), `flow summary file missing: ${flowSummary}`);
189
+ assert(await fs.pathExists(bridgeContext), `bridge context file missing: ${bridgeContext}`);
190
+
191
+ const smokePayload = {
192
+ mode: 'interactive-flow-smoke',
193
+ generated_at: new Date().toISOString(),
194
+ status: 'passed',
195
+ checks: {
196
+ summary_status: payload.summary.status,
197
+ gate_decision: payload.summary.gate_decision,
198
+ execution_result: payload.summary.execution_result,
199
+ bridge_exit_code: payload.pipeline.bridge.exit_code,
200
+ loop_exit_code: payload.pipeline.loop.exit_code
201
+ },
202
+ artifacts: {
203
+ flow_summary: path.relative(cwd, flowSummary) || '.',
204
+ bridge_context: path.relative(cwd, bridgeContext) || '.'
205
+ }
206
+ };
207
+
208
+ if (options.json) {
209
+ process.stdout.write(`${JSON.stringify(smokePayload, null, 2)}\n`);
210
+ } else {
211
+ process.stdout.write('Interactive flow smoke passed.\n');
212
+ process.stdout.write(`- Flow summary: ${smokePayload.artifacts.flow_summary}\n`);
213
+ process.stdout.write(`- Bridge context: ${smokePayload.artifacts.bridge_context}\n`);
214
+ }
215
+ }
216
+
217
+ if (require.main === module) {
218
+ main().catch((error) => {
219
+ console.error(`Interactive flow smoke failed: ${error.message}`);
220
+ process.exit(1);
221
+ });
222
+ }
223
+
224
+ module.exports = {
225
+ DEFAULT_INPUT,
226
+ DEFAULT_GOAL,
227
+ DEFAULT_POLICY,
228
+ DEFAULT_CATALOG,
229
+ DEFAULT_APPROVAL_ROLE_POLICY,
230
+ DEFAULT_APPROVAL_ACTOR_ROLE,
231
+ DEFAULT_APPROVER_ACTOR_ROLE,
232
+ DEFAULT_DIALOGUE_PROFILE,
233
+ DEFAULT_OUT,
234
+ parseArgs,
235
+ resolvePath,
236
+ parseJson,
237
+ main
238
+ };