scene-capability-engine 3.0.2 → 3.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/CHANGELOG.md +2 -0
- package/docs/command-reference.md +20 -5
- package/docs/images/wechat-qr.png +0 -0
- package/docs/moqui-capability-matrix.md +21 -0
- package/docs/moqui-template-core-library-playbook.md +29 -1
- package/lib/commands/auto.js +1055 -13
- package/lib/commands/scene.js +1 -1
- package/lib/data/moqui-capability-lexicon.json +257 -1
- package/lib/orchestrator/orchestration-engine.js +55 -6
- package/package.json +1 -1
package/lib/commands/scene.js
CHANGED
|
@@ -61,7 +61,7 @@ const SCENE_PACKAGE_KINDS = new Set([
|
|
|
61
61
|
const SCENE_PACKAGE_RISK_LEVELS = new Set(['low', 'medium', 'high', 'critical']);
|
|
62
62
|
const SCENE_PACKAGE_TEMPLATE_API_VERSION = 'sce.scene.template/v0.1';
|
|
63
63
|
const SCENE_PACKAGE_TEMPLATE_DEFAULT_DIR = '.kiro/templates/scene-packages';
|
|
64
|
-
const SCENE_MOQUI_BASELINE_DEFAULT_MATCH = '(moqui|erp)';
|
|
64
|
+
const SCENE_MOQUI_BASELINE_DEFAULT_MATCH = '(moqui|erp|suite|playbook|runbook|decision|action|governance)';
|
|
65
65
|
const SCENE_MOQUI_BASELINE_DEFAULT_MIN_SCORE = 70;
|
|
66
66
|
const SCENE_MOQUI_BASELINE_DEFAULT_MIN_VALID_RATE = 100;
|
|
67
67
|
const SCENE_PACKAGE_BATCH_DEFAULT_ONTOLOGY_MIN_AVERAGE_SCORE = 70;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2026.02.
|
|
2
|
+
"version": "2026.02.18",
|
|
3
3
|
"source": "sce-moqui-core",
|
|
4
4
|
"capabilities": [
|
|
5
5
|
{
|
|
@@ -40,6 +40,262 @@
|
|
|
40
40
|
"inventory-adjustment",
|
|
41
41
|
"inventory-reservation-adjustment"
|
|
42
42
|
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"canonical": "erp-party-management",
|
|
46
|
+
"aliases": [
|
|
47
|
+
"party-management",
|
|
48
|
+
"party-master",
|
|
49
|
+
"party-domain-management",
|
|
50
|
+
"moqui-party-management"
|
|
51
|
+
],
|
|
52
|
+
"deprecated_aliases": [
|
|
53
|
+
"party-mgmt"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"canonical": "erp-product-management",
|
|
58
|
+
"aliases": [
|
|
59
|
+
"product-management",
|
|
60
|
+
"product-master-management",
|
|
61
|
+
"moqui-product-management"
|
|
62
|
+
],
|
|
63
|
+
"deprecated_aliases": [
|
|
64
|
+
"product-mgmt"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"canonical": "erp-order-management",
|
|
69
|
+
"aliases": [
|
|
70
|
+
"order-management",
|
|
71
|
+
"moqui-order-management"
|
|
72
|
+
],
|
|
73
|
+
"deprecated_aliases": [
|
|
74
|
+
"order-mgmt"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"canonical": "erp-shipment-management",
|
|
79
|
+
"aliases": [
|
|
80
|
+
"shipment-management",
|
|
81
|
+
"shipment-flow-management",
|
|
82
|
+
"moqui-shipment-management"
|
|
83
|
+
],
|
|
84
|
+
"deprecated_aliases": [
|
|
85
|
+
"shipment-mgmt"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"canonical": "erp-return-rma-management",
|
|
90
|
+
"aliases": [
|
|
91
|
+
"return-rma-management",
|
|
92
|
+
"rma-management",
|
|
93
|
+
"return-management",
|
|
94
|
+
"moqui-return-rma-management"
|
|
95
|
+
],
|
|
96
|
+
"deprecated_aliases": [
|
|
97
|
+
"return-rma"
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"canonical": "erp-accounting-invoice",
|
|
102
|
+
"aliases": [
|
|
103
|
+
"accounting-invoice",
|
|
104
|
+
"invoice-management",
|
|
105
|
+
"moqui-accounting-invoice"
|
|
106
|
+
],
|
|
107
|
+
"deprecated_aliases": [
|
|
108
|
+
"invoice-accounting"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"canonical": "erp-procurement-management",
|
|
113
|
+
"aliases": [
|
|
114
|
+
"procurement-management",
|
|
115
|
+
"purchase-management",
|
|
116
|
+
"moqui-procurement-management"
|
|
117
|
+
],
|
|
118
|
+
"deprecated_aliases": [
|
|
119
|
+
"procurement-mgmt"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"canonical": "erp-inventory-management",
|
|
124
|
+
"aliases": [
|
|
125
|
+
"inventory-management",
|
|
126
|
+
"facility-inventory",
|
|
127
|
+
"moqui-inventory-management"
|
|
128
|
+
],
|
|
129
|
+
"deprecated_aliases": [
|
|
130
|
+
"inventory-mgmt"
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"canonical": "erp-production-run",
|
|
135
|
+
"aliases": [
|
|
136
|
+
"production-run",
|
|
137
|
+
"production-execution",
|
|
138
|
+
"moqui-production-run"
|
|
139
|
+
],
|
|
140
|
+
"deprecated_aliases": [
|
|
141
|
+
"production-job-run"
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"canonical": "erp-bom-management",
|
|
146
|
+
"aliases": [
|
|
147
|
+
"bom-management",
|
|
148
|
+
"bill-of-material-management",
|
|
149
|
+
"moqui-bom-management"
|
|
150
|
+
],
|
|
151
|
+
"deprecated_aliases": [
|
|
152
|
+
"bom-mgmt"
|
|
153
|
+
]
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"canonical": "erp-routing-management",
|
|
157
|
+
"aliases": [
|
|
158
|
+
"routing-management",
|
|
159
|
+
"production-routing-management",
|
|
160
|
+
"moqui-routing-management"
|
|
161
|
+
],
|
|
162
|
+
"deprecated_aliases": [
|
|
163
|
+
"routing-mgmt"
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"canonical": "erp-quality-inspection",
|
|
168
|
+
"aliases": [
|
|
169
|
+
"quality-inspection",
|
|
170
|
+
"quality-gate-inspection",
|
|
171
|
+
"moqui-quality-inspection"
|
|
172
|
+
],
|
|
173
|
+
"deprecated_aliases": [
|
|
174
|
+
"quality-inspect"
|
|
175
|
+
]
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"canonical": "erp-equipment-management",
|
|
179
|
+
"aliases": [
|
|
180
|
+
"equipment-management",
|
|
181
|
+
"asset-equipment-management",
|
|
182
|
+
"moqui-equipment-management"
|
|
183
|
+
],
|
|
184
|
+
"deprecated_aliases": [
|
|
185
|
+
"equipment-mgmt"
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"canonical": "erp-cost-management",
|
|
190
|
+
"aliases": [
|
|
191
|
+
"cost-management",
|
|
192
|
+
"costing-management",
|
|
193
|
+
"moqui-cost-management"
|
|
194
|
+
],
|
|
195
|
+
"deprecated_aliases": [
|
|
196
|
+
"cost-mgmt"
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"canonical": "erp-engineering-change",
|
|
201
|
+
"aliases": [
|
|
202
|
+
"engineering-change",
|
|
203
|
+
"engineering-change-management",
|
|
204
|
+
"moqui-engineering-change"
|
|
205
|
+
],
|
|
206
|
+
"deprecated_aliases": [
|
|
207
|
+
"ecm-management"
|
|
208
|
+
]
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"canonical": "erp-hr-employee-management",
|
|
212
|
+
"aliases": [
|
|
213
|
+
"hr-employee-management",
|
|
214
|
+
"employee-management",
|
|
215
|
+
"moqui-hr-employee-management"
|
|
216
|
+
],
|
|
217
|
+
"deprecated_aliases": [
|
|
218
|
+
"employee-hr-management"
|
|
219
|
+
]
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"canonical": "erp-work-calendar",
|
|
223
|
+
"aliases": [
|
|
224
|
+
"work-calendar",
|
|
225
|
+
"calendar-management",
|
|
226
|
+
"moqui-work-calendar"
|
|
227
|
+
],
|
|
228
|
+
"deprecated_aliases": [
|
|
229
|
+
"work-schedule-calendar"
|
|
230
|
+
]
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"canonical": "platform-workflow-approval-engine",
|
|
234
|
+
"aliases": [
|
|
235
|
+
"workflow-approval-engine",
|
|
236
|
+
"workflow-approval",
|
|
237
|
+
"approval-engine",
|
|
238
|
+
"moqui-workflow-approval-engine"
|
|
239
|
+
],
|
|
240
|
+
"deprecated_aliases": [
|
|
241
|
+
"workflow-approval-center"
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"canonical": "platform-reporting-audit-ops",
|
|
246
|
+
"aliases": [
|
|
247
|
+
"reporting-audit-ops",
|
|
248
|
+
"audit-ops",
|
|
249
|
+
"ops-audit-reporting",
|
|
250
|
+
"moqui-reporting-audit-ops"
|
|
251
|
+
],
|
|
252
|
+
"deprecated_aliases": [
|
|
253
|
+
"audit-reporting-ops"
|
|
254
|
+
]
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"canonical": "platform-data-migration-domestic-validation",
|
|
258
|
+
"aliases": [
|
|
259
|
+
"data-migration-domestic-validation",
|
|
260
|
+
"data-migration-validation",
|
|
261
|
+
"moqui-data-migration-domestic-validation"
|
|
262
|
+
],
|
|
263
|
+
"deprecated_aliases": [
|
|
264
|
+
"domestic-data-migration-validation"
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"canonical": "platform-suite-hub-ui-integration",
|
|
269
|
+
"aliases": [
|
|
270
|
+
"suite-hub-ui-integration",
|
|
271
|
+
"suite-hub-ui",
|
|
272
|
+
"moqui-suite-hub-ui-integration"
|
|
273
|
+
],
|
|
274
|
+
"deprecated_aliases": [
|
|
275
|
+
"suite-ui-hub-integration"
|
|
276
|
+
]
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"canonical": "platform-suite-capability-observability",
|
|
280
|
+
"aliases": [
|
|
281
|
+
"suite-capability-observability",
|
|
282
|
+
"capability-observability",
|
|
283
|
+
"moqui-suite-capability-observability"
|
|
284
|
+
],
|
|
285
|
+
"deprecated_aliases": [
|
|
286
|
+
"suite-capability-visibility"
|
|
287
|
+
]
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"canonical": "platform-suite-native-ui-parity-audit",
|
|
291
|
+
"aliases": [
|
|
292
|
+
"suite-native-ui-parity-audit",
|
|
293
|
+
"native-ui-parity-audit",
|
|
294
|
+
"moqui-suite-native-ui-parity-audit"
|
|
295
|
+
],
|
|
296
|
+
"deprecated_aliases": [
|
|
297
|
+
"suite-ui-parity-audit"
|
|
298
|
+
]
|
|
43
299
|
}
|
|
44
300
|
]
|
|
45
301
|
}
|
|
@@ -24,6 +24,8 @@ const DEFAULT_RATE_LIMIT_PARALLEL_FLOOR = 1;
|
|
|
24
24
|
const DEFAULT_RATE_LIMIT_COOLDOWN_MS = 30000;
|
|
25
25
|
const DEFAULT_RATE_LIMIT_LAUNCH_BUDGET_PER_MINUTE = 12;
|
|
26
26
|
const DEFAULT_RATE_LIMIT_LAUNCH_BUDGET_WINDOW_MS = 60000;
|
|
27
|
+
const DEFAULT_AGENT_WAIT_TIMEOUT_SECONDS = 600;
|
|
28
|
+
const AGENT_WAIT_TIMEOUT_GRACE_MS = 30000;
|
|
27
29
|
const RATE_LIMIT_BACKOFF_JITTER_RATIO = 0.5;
|
|
28
30
|
const RATE_LIMIT_RETRY_AFTER_MAX_MS = 10 * 60 * 1000;
|
|
29
31
|
const RATE_LIMIT_ERROR_PATTERNS = [
|
|
@@ -104,6 +106,8 @@ class OrchestrationEngine extends EventEmitter {
|
|
|
104
106
|
this._launchBudgetLastHoldSignalAt = 0;
|
|
105
107
|
/** @type {number} last launch-budget hold duration emitted to telemetry (ms) */
|
|
106
108
|
this._launchBudgetLastHoldMs = 0;
|
|
109
|
+
/** @type {number} fallback wait timeout to avoid indefinite hangs when lifecycle events are missing */
|
|
110
|
+
this._agentWaitTimeoutMs = (DEFAULT_AGENT_WAIT_TIMEOUT_SECONDS * 1000) + AGENT_WAIT_TIMEOUT_GRACE_MS;
|
|
107
111
|
/** @type {() => number} */
|
|
108
112
|
this._random = typeof options.random === 'function' ? options.random : Math.random;
|
|
109
113
|
/** @type {() => number} */
|
|
@@ -190,6 +194,7 @@ class OrchestrationEngine extends EventEmitter {
|
|
|
190
194
|
// Get config for maxParallel and maxRetries
|
|
191
195
|
const config = await this._orchestratorConfig.getConfig();
|
|
192
196
|
this._applyRetryPolicyConfig(config);
|
|
197
|
+
this._agentWaitTimeoutMs = this._resolveAgentWaitTimeoutMs(config);
|
|
193
198
|
const maxParallel = options.maxParallel || config.maxParallel || 3;
|
|
194
199
|
const maxRetries = config.maxRetries || 2;
|
|
195
200
|
this._initializeAdaptiveParallel(maxParallel);
|
|
@@ -407,29 +412,46 @@ class OrchestrationEngine extends EventEmitter {
|
|
|
407
412
|
*/
|
|
408
413
|
_waitForAgent(specName, agentId) {
|
|
409
414
|
return new Promise((resolve) => {
|
|
415
|
+
const fallbackTimeoutMs = this._toPositiveInteger(
|
|
416
|
+
this._agentWaitTimeoutMs,
|
|
417
|
+
(DEFAULT_AGENT_WAIT_TIMEOUT_SECONDS * 1000) + AGENT_WAIT_TIMEOUT_GRACE_MS
|
|
418
|
+
);
|
|
419
|
+
let settled = false;
|
|
420
|
+
let fallbackTimer = null;
|
|
421
|
+
|
|
422
|
+
const finalize = (payload) => {
|
|
423
|
+
if (settled) {
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
settled = true;
|
|
427
|
+
cleanup();
|
|
428
|
+
resolve(payload);
|
|
429
|
+
};
|
|
430
|
+
|
|
410
431
|
const onCompleted = (data) => {
|
|
411
432
|
if (data.agentId === agentId) {
|
|
412
|
-
|
|
413
|
-
resolve({ status: 'completed', error: null });
|
|
433
|
+
finalize({ status: 'completed', error: null });
|
|
414
434
|
}
|
|
415
435
|
};
|
|
416
436
|
|
|
417
437
|
const onFailed = (data) => {
|
|
418
438
|
if (data.agentId === agentId) {
|
|
419
|
-
cleanup();
|
|
420
439
|
const error = data.stderr || data.error || `Exit code: ${data.exitCode}`;
|
|
421
|
-
|
|
440
|
+
finalize({ status: 'failed', error });
|
|
422
441
|
}
|
|
423
442
|
};
|
|
424
443
|
|
|
425
444
|
const onTimeout = (data) => {
|
|
426
445
|
if (data.agentId === agentId) {
|
|
427
|
-
|
|
428
|
-
resolve({ status: 'timeout', error: `Timeout after ${data.timeoutSeconds}s` });
|
|
446
|
+
finalize({ status: 'timeout', error: `Timeout after ${data.timeoutSeconds}s` });
|
|
429
447
|
}
|
|
430
448
|
};
|
|
431
449
|
|
|
432
450
|
const cleanup = () => {
|
|
451
|
+
if (fallbackTimer) {
|
|
452
|
+
clearTimeout(fallbackTimer);
|
|
453
|
+
fallbackTimer = null;
|
|
454
|
+
}
|
|
433
455
|
this._agentSpawner.removeListener('agent:completed', onCompleted);
|
|
434
456
|
this._agentSpawner.removeListener('agent:failed', onFailed);
|
|
435
457
|
this._agentSpawner.removeListener('agent:timeout', onTimeout);
|
|
@@ -438,6 +460,16 @@ class OrchestrationEngine extends EventEmitter {
|
|
|
438
460
|
this._agentSpawner.on('agent:completed', onCompleted);
|
|
439
461
|
this._agentSpawner.on('agent:failed', onFailed);
|
|
440
462
|
this._agentSpawner.on('agent:timeout', onTimeout);
|
|
463
|
+
|
|
464
|
+
fallbackTimer = setTimeout(() => {
|
|
465
|
+
finalize({
|
|
466
|
+
status: 'timeout',
|
|
467
|
+
error: (
|
|
468
|
+
`Agent wait timeout after ${Math.ceil(fallbackTimeoutMs / 1000)}s for ` +
|
|
469
|
+
`${specName} (${agentId}) without lifecycle events`
|
|
470
|
+
),
|
|
471
|
+
});
|
|
472
|
+
}, fallbackTimeoutMs);
|
|
441
473
|
});
|
|
442
474
|
}
|
|
443
475
|
|
|
@@ -689,6 +721,23 @@ class OrchestrationEngine extends EventEmitter {
|
|
|
689
721
|
);
|
|
690
722
|
}
|
|
691
723
|
|
|
724
|
+
/**
|
|
725
|
+
* Resolve a fallback wait timeout for _waitForAgent.
|
|
726
|
+
* This protects orchestration from hanging forever if lifecycle events
|
|
727
|
+
* are unexpectedly missing.
|
|
728
|
+
*
|
|
729
|
+
* @param {object} config
|
|
730
|
+
* @returns {number}
|
|
731
|
+
* @private
|
|
732
|
+
*/
|
|
733
|
+
_resolveAgentWaitTimeoutMs(config) {
|
|
734
|
+
const timeoutSeconds = this._toPositiveInteger(
|
|
735
|
+
config && config.timeoutSeconds,
|
|
736
|
+
DEFAULT_AGENT_WAIT_TIMEOUT_SECONDS
|
|
737
|
+
);
|
|
738
|
+
return (timeoutSeconds * 1000) + AGENT_WAIT_TIMEOUT_GRACE_MS;
|
|
739
|
+
}
|
|
740
|
+
|
|
692
741
|
/**
|
|
693
742
|
* @param {number} maxParallel
|
|
694
743
|
* @private
|
package/package.json
CHANGED