universal-dev-standards 5.5.0 → 5.7.0
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/bundled/ai/options/testing/integration-testing.ai.yaml +2 -2
- package/bundled/ai/options/testing/unit-testing.ai.yaml +2 -2
- package/bundled/ai/standards/agent-communication-protocol.ai.yaml +8 -9
- package/bundled/ai/standards/agent-dispatch.ai.yaml +8 -9
- package/bundled/ai/standards/branch-completion.ai.yaml +8 -10
- package/bundled/ai/standards/browser-compatibility-standards.ai.yaml +63 -0
- package/bundled/ai/standards/capability-declaration.ai.yaml +4 -4
- package/bundled/ai/standards/change-batching-standards.ai.yaml +8 -10
- package/bundled/ai/standards/circuit-breaker.ai.yaml +7 -7
- package/bundled/ai/standards/contract-testing-standards.ai.yaml +62 -0
- package/bundled/ai/standards/cross-flow-regression.ai.yaml +61 -0
- package/bundled/ai/standards/disaster-recovery-drill.ai.yaml +1 -1
- package/bundled/ai/standards/dual-phase-output.ai.yaml +3 -3
- package/bundled/ai/standards/execution-history.ai.yaml +8 -10
- package/bundled/ai/standards/failure-source-taxonomy.ai.yaml +8 -10
- package/bundled/ai/standards/full-coverage-testing.ai.yaml +192 -0
- package/bundled/ai/standards/git-worktree.ai.yaml +1 -1
- package/bundled/ai/standards/governance-layer.ai.yaml +114 -0
- package/bundled/ai/standards/mock-boundary.ai.yaml +1 -1
- package/bundled/ai/standards/model-selection.ai.yaml +1 -1
- package/bundled/ai/standards/packaging-standards.ai.yaml +8 -8
- package/bundled/ai/standards/pipeline-integration-standards.ai.yaml +8 -9
- package/bundled/ai/standards/pipeline-security-gates.ai.yaml +4 -0
- package/bundled/ai/standards/recovery-recipe-registry.ai.yaml +6 -10
- package/bundled/ai/standards/release-readiness-gate.ai.yaml +77 -0
- package/bundled/ai/standards/security-decision.ai.yaml +3 -3
- package/bundled/ai/standards/server-ops-security.ai.yaml +1 -1
- package/bundled/ai/standards/standard-admission-criteria.ai.yaml +1 -1
- package/bundled/ai/standards/standard-lifecycle-management.ai.yaml +1 -1
- package/bundled/ai/standards/supply-chain-attestation.ai.yaml +1 -1
- package/bundled/ai/standards/testing.ai.yaml +20 -13
- package/bundled/ai/standards/token-budget.ai.yaml +3 -3
- package/bundled/ai/standards/workflow-enforcement.ai.yaml +8 -11
- package/bundled/ai/standards/workflow-state-protocol.ai.yaml +8 -10
- package/bundled/core/accessibility-standards.md +58 -0
- package/bundled/core/adversarial-test.md +1 -1
- package/bundled/core/agent-behavior-discipline.md +4 -4
- package/bundled/core/agent-communication-protocol.md +5 -5
- package/bundled/core/branch-completion.md +4 -0
- package/bundled/core/browser-compatibility-standards.md +220 -0
- package/bundled/core/checkin-standards.md +1 -0
- package/bundled/core/circuit-breaker.md +4 -4
- package/bundled/core/container-security.md +8 -8
- package/bundled/core/contract-testing-standards.md +182 -0
- package/bundled/core/cross-flow-regression.md +190 -0
- package/bundled/core/disaster-recovery-drill.md +3 -3
- package/bundled/core/dual-phase-output.md +1 -1
- package/bundled/core/failure-source-taxonomy.md +3 -3
- package/bundled/core/flow-based-testing.md +135 -2
- package/bundled/core/full-coverage-testing.md +183 -0
- package/bundled/core/git-worktree.md +1 -1
- package/bundled/core/governance-layer.md +151 -0
- package/bundled/core/llm-output-validation.md +2 -2
- package/bundled/core/mock-boundary.md +1 -1
- package/bundled/core/packaging-standards.md +14 -14
- package/bundled/core/performance-standards.md +65 -0
- package/bundled/core/policy-as-code-testing.md +9 -9
- package/bundled/core/recovery-recipe-registry.md +2 -2
- package/bundled/core/release-quality-manifest.md +58 -12
- package/bundled/core/release-readiness-gate.md +184 -0
- package/bundled/core/sast-advanced.md +5 -5
- package/bundled/core/secure-op.md +5 -5
- package/bundled/core/security-decision.md +1 -1
- package/bundled/core/server-ops-security.md +15 -15
- package/bundled/core/smoke-test.md +1 -1
- package/bundled/core/standard-admission-criteria.md +1 -1
- package/bundled/core/standard-lifecycle-management.md +1 -1
- package/bundled/core/supply-chain-attestation.md +4 -4
- package/bundled/core/token-budget.md +3 -3
- package/bundled/locales/zh-CN/CHANGELOG.md +51 -4
- package/bundled/locales/zh-CN/README.md +11 -27
- package/bundled/locales/zh-CN/core/agent-communication-protocol.md +5 -5
- package/bundled/locales/zh-CN/core/circuit-breaker.md +1 -1
- package/bundled/locales/zh-CN/core/git-worktree.md +1 -1
- package/bundled/locales/zh-CN/core/packaging-standards.md +14 -14
- package/bundled/locales/zh-CN/core/recovery-recipe-registry.md +6 -9
- package/bundled/locales/zh-CN/core/standard-admission-criteria.md +1 -1
- package/bundled/locales/zh-CN/core/standard-lifecycle-management.md +1 -1
- package/bundled/locales/zh-CN/core/token-budget.md +1 -1
- package/bundled/locales/zh-TW/CHANGELOG.md +51 -4
- package/bundled/locales/zh-TW/README.md +11 -27
- package/bundled/locales/zh-TW/core/agent-communication-protocol.md +5 -5
- package/bundled/locales/zh-TW/core/browser-compatibility-standards.md +11 -0
- package/bundled/locales/zh-TW/core/capability-declaration.md +4 -4
- package/bundled/locales/zh-TW/core/circuit-breaker.md +7 -7
- package/bundled/locales/zh-TW/core/contract-testing-standards.md +11 -0
- package/bundled/locales/zh-TW/core/cross-flow-regression.md +11 -0
- package/bundled/locales/zh-TW/core/dual-phase-output.md +3 -3
- package/bundled/locales/zh-TW/core/failure-source-taxonomy.md +7 -9
- package/bundled/locales/zh-TW/core/governance-layer.md +159 -0
- package/bundled/locales/zh-TW/core/packaging-standards.md +14 -14
- package/bundled/locales/zh-TW/core/recovery-recipe-registry.md +6 -9
- package/bundled/locales/zh-TW/core/release-readiness-gate.md +11 -0
- package/bundled/locales/zh-TW/core/security-decision.md +3 -3
- package/bundled/locales/zh-TW/core/standard-admission-criteria.md +1 -1
- package/bundled/locales/zh-TW/core/standard-lifecycle-management.md +1 -1
- package/bundled/locales/zh-TW/core/token-budget.md +3 -3
- package/bundled/skills/README.md +23 -0
- package/bundled/skills/atdd-assistant/SKILL.md +4 -5
- package/bundled/skills/bdd-assistant/SKILL.md +4 -5
- package/bundled/skills/checkin-assistant/SKILL.md +4 -6
- package/bundled/skills/code-review-assistant/SKILL.md +4 -5
- package/bundled/skills/commands/observability.md +42 -0
- package/bundled/skills/commands/runbook.md +44 -0
- package/bundled/skills/commands/slo.md +45 -0
- package/bundled/skills/journey-test-assistant/SKILL.md +1 -1
- package/bundled/skills/orchestrate/SKILL.md +1 -1
- package/bundled/skills/plan/SKILL.md +1 -1
- package/bundled/skills/pr-automation-assistant/SKILL.md +4 -5
- package/bundled/skills/push/SKILL.md +1 -1
- package/bundled/skills/spec-driven-dev/SKILL.md +4 -5
- package/bundled/skills/sweep/SKILL.md +3 -3
- package/bundled/skills/tdd-assistant/SKILL.md +4 -5
- package/package.json +6 -6
- package/src/commands/check.js +43 -0
- package/src/commands/flow.js +7 -5
- package/src/commands/init.js +2 -1
- package/src/commands/start.js +7 -6
- package/src/commands/sweep.js +7 -6
- package/src/commands/update.js +10 -0
- package/src/commands/workflow.js +7 -6
- package/src/core/agent-communication-protocol.js +10 -3
- package/standards-registry.json +107 -51
|
@@ -34,7 +34,7 @@ Optionally auto-fix safe patterns (console.log, debugger statements).
|
|
|
34
34
|
```bash
|
|
35
35
|
/sweep # Scan current directory, report findings
|
|
36
36
|
/sweep --fix # Scan and auto-fix fixable patterns
|
|
37
|
-
/sweep --report # Scan and save report to .
|
|
37
|
+
/sweep --report # Scan and save report to .uds/sweep-report.json
|
|
38
38
|
/sweep --path src/ # Scan specific directory
|
|
39
39
|
/sweep --exclude "**/*.test.ts" # Exclude patterns (glob)
|
|
40
40
|
```
|
|
@@ -78,7 +78,7 @@ Use Edit tool to apply changes file by file.
|
|
|
78
78
|
Report: "Fixed N findings in M files."
|
|
79
79
|
|
|
80
80
|
### Step 6: Save Report (if --report)
|
|
81
|
-
Write findings to `.
|
|
81
|
+
Write findings to `.uds/sweep-report.json`:
|
|
82
82
|
```json
|
|
83
83
|
{
|
|
84
84
|
"timestamp": "<ISO8601>",
|
|
@@ -136,7 +136,7 @@ After `/sweep` completes, suggest:
|
|
|
136
136
|
|
|
137
137
|
| Version | Date | Changes |
|
|
138
138
|
|---------|------|---------|
|
|
139
|
-
| 1.0.0 | 2026-04-28 | Initial release — XSPEC-097 Phase 1 (
|
|
139
|
+
| 1.0.0 | 2026-04-28 | Initial release — XSPEC-097 Phase 1 (從上游遷移) |
|
|
140
140
|
|
|
141
141
|
---
|
|
142
142
|
|
|
@@ -6,11 +6,10 @@ allowed-tools: Read, Write, Grep, Glob, Bash(npm test:*), Bash(npx vitest:*)
|
|
|
6
6
|
argument-hint: "[feature or file | 功能或檔案]"
|
|
7
7
|
---
|
|
8
8
|
<!-- DEPRECATION NOTICE (XSPEC-086 Phase 4, 2026-04-28):
|
|
9
|
-
TDD flow orchestration (RED→GREEN→REFACTOR cycle, test execution gates)
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Use `devap tdd` for enforced interactive cycle; this Skill for practice reference.
|
|
9
|
+
TDD flow orchestration (RED→GREEN→REFACTOR cycle, test execution gates) relocated to adoption
|
|
10
|
+
layer (XSPEC-095, 2026-04-28). This Skill retains: TDD principles, FIRST rules, AAA format,
|
|
11
|
+
language examples, workflow guide.
|
|
12
|
+
For enforced interactive cycle, use your adoption layer's toolchain.
|
|
14
13
|
-->
|
|
15
14
|
|
|
16
15
|
# TDD Assistant | TDD 助手
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-dev-standards",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.7.0",
|
|
4
4
|
"description": "CLI tool for adopting Universal Development Standards",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"documentation",
|
|
@@ -59,23 +59,23 @@
|
|
|
59
59
|
"prepack": "node scripts/prepack.mjs"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@inquirer/prompts": "8.4.
|
|
62
|
+
"@inquirer/prompts": "^8.4.2",
|
|
63
63
|
"chalk": "^5.3.0",
|
|
64
64
|
"commander": "^14.0.0",
|
|
65
65
|
"js-yaml": "^4.1.0",
|
|
66
|
-
"ora": "^9.
|
|
66
|
+
"ora": "^9.4.0"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
69
|
"@eslint/js": "^10.0.1",
|
|
70
|
-
"@vitest/coverage-v8": "^4.1.
|
|
71
|
-
"ajv": "^8.
|
|
70
|
+
"@vitest/coverage-v8": "^4.1.5",
|
|
71
|
+
"ajv": "^8.20.0",
|
|
72
72
|
"ajv-formats": "^3.0.1",
|
|
73
73
|
"eslint": "10.2.1",
|
|
74
74
|
"glob": "^13.0.1",
|
|
75
75
|
"globals": "17.5.0",
|
|
76
76
|
"husky": "^9.1.7",
|
|
77
77
|
"lint-staged": "^16.4.0",
|
|
78
|
-
"vitest": "^4.1.
|
|
78
|
+
"vitest": "^4.1.5"
|
|
79
79
|
},
|
|
80
80
|
"lint-staged": {
|
|
81
81
|
"src/**/*.js": [
|
package/src/commands/check.js
CHANGED
|
@@ -3,6 +3,7 @@ import { select } from '@inquirer/prompts';
|
|
|
3
3
|
import ora from 'ora';
|
|
4
4
|
import { existsSync, readFileSync } from 'fs';
|
|
5
5
|
import { join, basename } from 'path';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
6
7
|
import { readManifest, writeManifest, isInitialized, copyStandard, copyIntegration } from '../utils/copier.js';
|
|
7
8
|
import {
|
|
8
9
|
getAllStandards,
|
|
@@ -360,6 +361,9 @@ export async function checkCommand(options = {}) {
|
|
|
360
361
|
// Coverage report
|
|
361
362
|
displayCoverageReport(manifest, msg, common, projectPath);
|
|
362
363
|
|
|
364
|
+
// XSPEC-178: Full coverage compliance check
|
|
365
|
+
checkFullCoverageCompliance(manifest, projectPath);
|
|
366
|
+
|
|
363
367
|
// Workflow status
|
|
364
368
|
displayWorkflowStatus(projectPath);
|
|
365
369
|
|
|
@@ -923,6 +927,45 @@ function displaySkillsStatus(manifest, projectPath, msg) {
|
|
|
923
927
|
return { missingSkills, missingCommands };
|
|
924
928
|
}
|
|
925
929
|
|
|
930
|
+
/**
|
|
931
|
+
* XSPEC-178: Check full-coverage-testing standard presence and STUB markers
|
|
932
|
+
*/
|
|
933
|
+
function checkFullCoverageCompliance(manifest, projectPath) {
|
|
934
|
+
// Check 1: full-coverage-testing.ai.yaml presence
|
|
935
|
+
const fullCoveragePath = join(projectPath, '.standards', 'full-coverage-testing.ai.yaml');
|
|
936
|
+
const hasFullCoverage = existsSync(fullCoveragePath);
|
|
937
|
+
|
|
938
|
+
if (!hasFullCoverage) {
|
|
939
|
+
try {
|
|
940
|
+
const semver = manifest?.upstream?.version || '0.0.0';
|
|
941
|
+
const parts = semver.split('.').map(Number);
|
|
942
|
+
const isV5_5plus = parts[0] > 5 || (parts[0] === 5 && (parts[1] || 0) >= 5);
|
|
943
|
+
if (isV5_5plus) {
|
|
944
|
+
console.log(chalk.yellow(' ⚠ [XSPEC-178] full-coverage-testing.ai.yaml not found.'));
|
|
945
|
+
console.log(chalk.gray(' Run `uds update` to install the full-coverage testing standard.'));
|
|
946
|
+
console.log();
|
|
947
|
+
}
|
|
948
|
+
} catch { /* ignore semver parse errors */ }
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
// Check 2: STUB marker count (advisory)
|
|
952
|
+
const srcDir = join(projectPath, 'src');
|
|
953
|
+
if (existsSync(srcDir)) {
|
|
954
|
+
try {
|
|
955
|
+
const result = execSync(
|
|
956
|
+
`grep -rn "WARNING: STUB" "${srcDir}" --include="*.ts" --include="*.js" 2>/dev/null | wc -l`,
|
|
957
|
+
{ encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }
|
|
958
|
+
).trim();
|
|
959
|
+
const stubCount = parseInt(result, 10) || 0;
|
|
960
|
+
if (stubCount > 0) {
|
|
961
|
+
console.log(chalk.yellow(` ⚠ [STUB] ${stubCount} STUB marker(s) found in src/.`));
|
|
962
|
+
console.log(chalk.gray(' Must be removed before UAT/production deployment (XSPEC-178).'));
|
|
963
|
+
console.log();
|
|
964
|
+
}
|
|
965
|
+
} catch { /* grep not available or src not scannable */ }
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
|
|
926
969
|
/**
|
|
927
970
|
* Display coverage report
|
|
928
971
|
*/
|
package/src/commands/flow.js
CHANGED
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* CLI 命令:管理自訂 SDLC 流程(create/list/validate/diff/export/import)。
|
|
5
5
|
*
|
|
6
|
-
* @deprecated XSPEC-095 (2026-04-28):
|
|
7
|
-
* The list/validate/diff operations
|
|
8
|
-
*
|
|
6
|
+
* @deprecated XSPEC-095 (2026-04-28): Runtime relocated to adoption layer.
|
|
7
|
+
* The list/validate/diff operations are adoption-layer responsibility:
|
|
8
|
+
* adoption layers must implement equivalent flow management commands
|
|
9
|
+
* in their own toolchain.
|
|
9
10
|
*
|
|
10
|
-
* 棄用理由:UDS
|
|
11
|
+
* 棄用理由:UDS 專注於活動定義;流程編排由採用層承擔(XSPEC-086 /
|
|
12
|
+
* DEC-049 — orchestration runtime moved to adoption layer 2026-04-28)。
|
|
11
13
|
* UDS 5.x 仍維持本命令可用(向後相容),UDS 6.0.0 將移除。
|
|
12
|
-
*
|
|
14
|
+
* 建議遷移:實作於採用層工具鏈。
|
|
13
15
|
*/
|
|
14
16
|
|
|
15
17
|
import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
package/src/commands/init.js
CHANGED
|
@@ -399,7 +399,8 @@ function buildNonInteractiveConfig(options, detected, projectPath) {
|
|
|
399
399
|
workflow: options.workflow || 'github-flow',
|
|
400
400
|
merge_strategy: options.mergeStrategy || 'squash',
|
|
401
401
|
output_language: options.outputLang || 'english',
|
|
402
|
-
test_levels: options.testLevels ? options.testLevels.split(',') : ['unit-testing', 'integration-testing', 'system-testing', 'e2e-testing']
|
|
402
|
+
test_levels: options.testLevels ? options.testLevels.split(',') : ['unit-testing', 'integration-testing', 'system-testing', 'e2e-testing'],
|
|
403
|
+
coverage_model: options.coverageModel || 'full-coverage'
|
|
403
404
|
},
|
|
404
405
|
skillsConfig,
|
|
405
406
|
aiTools: aiToolsNormalized,
|
package/src/commands/start.js
CHANGED
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 啟動一個具名任務(Mission)並設定任務意圖。
|
|
5
5
|
*
|
|
6
|
-
* @deprecated XSPEC-095 (2026-04-28):
|
|
7
|
-
* The orchestration logic
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* @deprecated XSPEC-095 (2026-04-28): Runtime relocated to adoption layer.
|
|
7
|
+
* The orchestration logic is adoption-layer responsibility:
|
|
8
|
+
* adoption layers must implement equivalent mission start commands
|
|
9
|
+
* in their own toolchain.
|
|
10
10
|
*
|
|
11
|
-
* 棄用理由:UDS
|
|
11
|
+
* 棄用理由:UDS 專注於活動定義;流程編排由採用層承擔(XSPEC-086 /
|
|
12
|
+
* DEC-049 — orchestration runtime moved to adoption layer 2026-04-28)。
|
|
12
13
|
* UDS 5.x 仍維持本命令可用(向後相容),UDS 6.0.0 將移除。
|
|
13
|
-
*
|
|
14
|
+
* 建議遷移:實作於採用層工具鏈。
|
|
14
15
|
*/
|
|
15
16
|
import chalk from 'chalk';
|
|
16
17
|
import { select, input, confirm as inquirerConfirm } from '@inquirer/prompts';
|
package/src/commands/sweep.js
CHANGED
|
@@ -6,14 +6,15 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module commands/sweep
|
|
8
8
|
* @see docs/specs/system/vibe-coding-integration.md (AC-2)
|
|
9
|
-
* @deprecated XSPEC-095 (2026-04-28):
|
|
10
|
-
* The orchestration logic
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* @deprecated XSPEC-095 (2026-04-28): Runtime relocated to adoption layer.
|
|
10
|
+
* The orchestration logic is adoption-layer responsibility:
|
|
11
|
+
* adoption layers must implement equivalent sweep commands in their
|
|
12
|
+
* own toolchain.
|
|
13
13
|
*
|
|
14
|
-
* 棄用理由:UDS
|
|
14
|
+
* 棄用理由:UDS 專注於活動定義;流程編排由採用層承擔(XSPEC-086 /
|
|
15
|
+
* DEC-049 — orchestration runtime moved to adoption layer 2026-04-28)。
|
|
15
16
|
* UDS 5.x 仍維持本命令可用(向後相容),UDS 6.0.0 將移除。
|
|
16
|
-
*
|
|
17
|
+
* 建議遷移:實作於採用層工具鏈。
|
|
17
18
|
*/
|
|
18
19
|
|
|
19
20
|
import chalk from 'chalk';
|
package/src/commands/update.js
CHANGED
|
@@ -686,6 +686,16 @@ export async function updateCommand(options) {
|
|
|
686
686
|
}
|
|
687
687
|
}
|
|
688
688
|
|
|
689
|
+
// Migrate testing paradigm: pyramid thresholds → full-coverage (v5.5.0, XSPEC-178)
|
|
690
|
+
const isPreV5_5 = compareVersions(installedVersion, '5.5.0') < 0;
|
|
691
|
+
if (isPreV5_5) {
|
|
692
|
+
manifest.options = manifest.options || {};
|
|
693
|
+
manifest.options.coverage_model = manifest.options.coverage_model || 'full-coverage';
|
|
694
|
+
console.log();
|
|
695
|
+
console.log(chalk.yellow(msg.testParadigmMigrated || '⚠ Testing paradigm migrated: pyramid thresholds (UT≥80%/IT≥70%) → behavior-completeness full coverage (XSPEC-178)'));
|
|
696
|
+
console.log(chalk.cyan(msg.testParadigmNote || ' full-coverage-testing.ai.yaml installed. Review scripts/check-stubs.sh and scripts/check-anti-fake-tests.sh in your project.'));
|
|
697
|
+
}
|
|
698
|
+
|
|
689
699
|
// Update manifest
|
|
690
700
|
manifest.version = '3.3.0';
|
|
691
701
|
manifest.upstream.version = latestVersion;
|
package/src/commands/workflow.js
CHANGED
|
@@ -4,14 +4,15 @@
|
|
|
4
4
|
* CLI commands for listing and installing UDS workflows.
|
|
5
5
|
*
|
|
6
6
|
* @version 1.0.0
|
|
7
|
-
* @deprecated XSPEC-095 (2026-04-28):
|
|
8
|
-
* The orchestration logic
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* @deprecated XSPEC-095 (2026-04-28): Runtime relocated to adoption layer.
|
|
8
|
+
* The orchestration logic is adoption-layer responsibility:
|
|
9
|
+
* adoption layers must implement equivalent workflow commands in
|
|
10
|
+
* their own toolchain.
|
|
11
11
|
*
|
|
12
|
-
* 棄用理由:UDS
|
|
12
|
+
* 棄用理由:UDS 專注於活動定義;流程編排由採用層承擔(XSPEC-086 /
|
|
13
|
+
* DEC-049 — orchestration runtime moved to adoption layer 2026-04-28)。
|
|
13
14
|
* UDS 5.x 仍維持本命令可用(向後相容),UDS 6.0.0 將移除。
|
|
14
|
-
*
|
|
15
|
+
* 建議遷移:實作於採用層工具鏈。
|
|
15
16
|
*/
|
|
16
17
|
|
|
17
18
|
import chalk from 'chalk';
|
|
@@ -11,6 +11,12 @@ export const UNIFIED_STATUSES = [
|
|
|
11
11
|
'needs_context', 'skipped', 'timeout', 'unknown',
|
|
12
12
|
];
|
|
13
13
|
|
|
14
|
+
// Reference status mappings. `uds` is UDS's own native status set;
|
|
15
|
+
// the other two entries are illustrative example mappings showing how
|
|
16
|
+
// adoption-layer runtimes can plug their own status vocabularies into
|
|
17
|
+
// the unified status code set. Adoption layers should add their own
|
|
18
|
+
// keys (or call mapStatus with their own project name) — these example
|
|
19
|
+
// keys are not endorsements of any specific downstream product.
|
|
14
20
|
const STATUS_MAP = {
|
|
15
21
|
uds: {
|
|
16
22
|
DONE: 'success',
|
|
@@ -18,7 +24,7 @@ const STATUS_MAP = {
|
|
|
18
24
|
NEEDS_CONTEXT: 'needs_context',
|
|
19
25
|
BLOCKED: 'blocked',
|
|
20
26
|
},
|
|
21
|
-
|
|
27
|
+
adapter_example_a: {
|
|
22
28
|
success: 'success',
|
|
23
29
|
failed: 'failed',
|
|
24
30
|
skipped: 'skipped',
|
|
@@ -27,7 +33,7 @@ const STATUS_MAP = {
|
|
|
27
33
|
needs_context: 'needs_context',
|
|
28
34
|
blocked: 'blocked',
|
|
29
35
|
},
|
|
30
|
-
|
|
36
|
+
adapter_example_b: {
|
|
31
37
|
success: 'success',
|
|
32
38
|
partial: 'success_partial',
|
|
33
39
|
failure: 'failed',
|
|
@@ -38,7 +44,8 @@ const STATUS_MAP = {
|
|
|
38
44
|
* Map a project-specific status to unified status code.
|
|
39
45
|
* Unknown statuses map to 'unknown' with a warning.
|
|
40
46
|
* @param {string} status - Project-specific status code
|
|
41
|
-
* @param {string} project - Source project ('uds'
|
|
47
|
+
* @param {string} project - Source project (e.g. 'uds', 'adapter_example_a',
|
|
48
|
+
* 'adapter_example_b', or any custom adoption-layer project key)
|
|
42
49
|
* @returns {{ unified: string, warning?: { original: string, project: string } }}
|
|
43
50
|
*/
|
|
44
51
|
export function mapStatus(status, project) {
|
package/standards-registry.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.7.0",
|
|
4
4
|
"lastUpdated": "2026-04-16",
|
|
5
5
|
"description": "Standards registry for universal-dev-standards with integrated skills and AI-optimized formats",
|
|
6
6
|
"formats": {
|
|
@@ -58,14 +58,14 @@
|
|
|
58
58
|
"standards": {
|
|
59
59
|
"name": "universal-dev-standards",
|
|
60
60
|
"url": "https://github.com/AsiaOstrich/universal-dev-standards",
|
|
61
|
-
"version": "5.
|
|
61
|
+
"version": "5.7.0"
|
|
62
62
|
},
|
|
63
63
|
"skills": {
|
|
64
64
|
"name": "universal-dev-standards",
|
|
65
65
|
"url": "https://github.com/AsiaOstrich/universal-dev-standards",
|
|
66
66
|
"localPath": "skills",
|
|
67
67
|
"rawUrl": "https://raw.githubusercontent.com/AsiaOstrich/universal-dev-standards/main/skills",
|
|
68
|
-
"version": "5.
|
|
68
|
+
"version": "5.7.0",
|
|
69
69
|
"note": "Skills are now included in the main repository under skills/"
|
|
70
70
|
}
|
|
71
71
|
},
|
|
@@ -680,6 +680,17 @@
|
|
|
680
680
|
}
|
|
681
681
|
},
|
|
682
682
|
"standards": [
|
|
683
|
+
{
|
|
684
|
+
"id": "governance-layer",
|
|
685
|
+
"name": "Governance Layer Standard",
|
|
686
|
+
"nameZh": "治理層標準",
|
|
687
|
+
"source": {
|
|
688
|
+
"human": "core/governance-layer.md",
|
|
689
|
+
"ai": "ai/standards/governance-layer.ai.yaml"
|
|
690
|
+
},
|
|
691
|
+
"category": "core",
|
|
692
|
+
"description": "Standard #0: Vision/Mission/Goals three-layer governance schema with KPI mandatory fields, red lines format, and evaluator integration. Evaluated before all other standards."
|
|
693
|
+
},
|
|
683
694
|
{
|
|
684
695
|
"id": "anti-sycophancy-prompting",
|
|
685
696
|
"name": "Anti-Sycophancy Prompting Standards",
|
|
@@ -807,7 +818,7 @@
|
|
|
807
818
|
},
|
|
808
819
|
"category": "reference",
|
|
809
820
|
"skillName": null,
|
|
810
|
-
"description": "Recipe-based packaging framework for user projects using UDS
|
|
821
|
+
"description": "Recipe-based packaging framework for user projects using a UDS-aware toolchain"
|
|
811
822
|
},
|
|
812
823
|
{
|
|
813
824
|
"id": "api-design-standards",
|
|
@@ -1010,9 +1021,9 @@
|
|
|
1010
1021
|
"deprecated": true,
|
|
1011
1022
|
"deprecatedSince": "5.4.0",
|
|
1012
1023
|
"removalVersion": "6.0.0",
|
|
1013
|
-
"canonicalOwner": "
|
|
1014
|
-
"canonicalPath": "
|
|
1015
|
-
"description": "DEPRECATED:
|
|
1024
|
+
"canonicalOwner": "adoption-layer",
|
|
1025
|
+
"canonicalPath": "",
|
|
1026
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Workflow state persistence protocol — runtime is now adoption-layer responsibility."
|
|
1016
1027
|
},
|
|
1017
1028
|
{
|
|
1018
1029
|
"id": "workflow-enforcement",
|
|
@@ -1027,9 +1038,9 @@
|
|
|
1027
1038
|
"deprecated": true,
|
|
1028
1039
|
"deprecatedSince": "5.4.0",
|
|
1029
1040
|
"removalVersion": "6.0.0",
|
|
1030
|
-
"canonicalOwner": "
|
|
1031
|
-
"canonicalPath": "
|
|
1032
|
-
"description": "DEPRECATED:
|
|
1041
|
+
"canonicalOwner": "adoption-layer",
|
|
1042
|
+
"canonicalPath": "",
|
|
1043
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Machine-enforceable workflow gates — runtime is now adoption-layer responsibility."
|
|
1033
1044
|
},
|
|
1034
1045
|
{
|
|
1035
1046
|
"id": "testing",
|
|
@@ -1042,7 +1053,7 @@
|
|
|
1042
1053
|
},
|
|
1043
1054
|
"category": "skill",
|
|
1044
1055
|
"skillName": "testing-guide",
|
|
1045
|
-
"description": "Testing
|
|
1056
|
+
"description": "Testing structure, FIRST principles, AAA pattern, and framework options. Coverage policy superseded by full-coverage-testing (XSPEC-178).",
|
|
1046
1057
|
"options": {
|
|
1047
1058
|
"test_level": {
|
|
1048
1059
|
"default": null,
|
|
@@ -1088,6 +1099,18 @@
|
|
|
1088
1099
|
}
|
|
1089
1100
|
}
|
|
1090
1101
|
},
|
|
1102
|
+
{
|
|
1103
|
+
"id": "full-coverage-testing",
|
|
1104
|
+
"name": "Full Coverage Testing Standards",
|
|
1105
|
+
"nameZh": "全覆蓋測試標準",
|
|
1106
|
+
"source": {
|
|
1107
|
+
"human": "core/testing-standards.md",
|
|
1108
|
+
"ai": "ai/standards/full-coverage-testing.ai.yaml"
|
|
1109
|
+
},
|
|
1110
|
+
"category": "skill",
|
|
1111
|
+
"skillName": "testing-guide",
|
|
1112
|
+
"description": "Behavior-completeness full coverage paradigm: ratchet CI, anti-fake-test rules (no tautology/business-logic mock), STUB marker protocol (pre-push + deploy gates), @ac traceability. Replaces pyramid thresholds (XSPEC-178)."
|
|
1113
|
+
},
|
|
1091
1114
|
{
|
|
1092
1115
|
"id": "documentation-structure",
|
|
1093
1116
|
"name": "Documentation Structure",
|
|
@@ -1439,9 +1462,9 @@
|
|
|
1439
1462
|
"deprecated": true,
|
|
1440
1463
|
"deprecatedSince": "5.4.0",
|
|
1441
1464
|
"removalVersion": "6.0.0",
|
|
1442
|
-
"canonicalOwner": "
|
|
1443
|
-
"canonicalPath": "
|
|
1444
|
-
"description": "DEPRECATED:
|
|
1465
|
+
"canonicalOwner": "adoption-layer",
|
|
1466
|
+
"canonicalPath": "",
|
|
1467
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Execution history L1/L2/L3 protocol — runtime is now adoption-layer responsibility."
|
|
1445
1468
|
},
|
|
1446
1469
|
{
|
|
1447
1470
|
"id": "project-context-memory",
|
|
@@ -1631,9 +1654,9 @@
|
|
|
1631
1654
|
"deprecated": true,
|
|
1632
1655
|
"deprecatedSince": "5.4.0",
|
|
1633
1656
|
"removalVersion": "6.0.0",
|
|
1634
|
-
"canonicalOwner": "
|
|
1635
|
-
"canonicalPath": "
|
|
1636
|
-
"description": "DEPRECATED:
|
|
1657
|
+
"canonicalOwner": "adoption-layer",
|
|
1658
|
+
"canonicalPath": "",
|
|
1659
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Pipeline 6-stage model — runtime is now adoption-layer responsibility."
|
|
1637
1660
|
},
|
|
1638
1661
|
{
|
|
1639
1662
|
"id": "acceptance-criteria-traceability",
|
|
@@ -1660,9 +1683,9 @@
|
|
|
1660
1683
|
"deprecated": true,
|
|
1661
1684
|
"deprecatedSince": "5.4.0",
|
|
1662
1685
|
"removalVersion": "6.0.0",
|
|
1663
|
-
"canonicalOwner": "
|
|
1664
|
-
"canonicalPath": "
|
|
1665
|
-
"description": "DEPRECATED:
|
|
1686
|
+
"canonicalOwner": "adoption-layer",
|
|
1687
|
+
"canonicalPath": "",
|
|
1688
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Change batching state machine — runtime is now adoption-layer responsibility."
|
|
1666
1689
|
},
|
|
1667
1690
|
{
|
|
1668
1691
|
"id": "migration-template",
|
|
@@ -1699,9 +1722,9 @@
|
|
|
1699
1722
|
"deprecated": true,
|
|
1700
1723
|
"deprecatedSince": "5.4.0",
|
|
1701
1724
|
"removalVersion": "6.0.0",
|
|
1702
|
-
"canonicalOwner": "
|
|
1703
|
-
"canonicalPath": "
|
|
1704
|
-
"description": "DEPRECATED:
|
|
1725
|
+
"canonicalOwner": "adoption-layer",
|
|
1726
|
+
"canonicalPath": "",
|
|
1727
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Agent dispatch protocol — runtime is now adoption-layer responsibility."
|
|
1705
1728
|
},
|
|
1706
1729
|
{
|
|
1707
1730
|
"id": "agent-communication-protocol",
|
|
@@ -1716,9 +1739,9 @@
|
|
|
1716
1739
|
"deprecated": true,
|
|
1717
1740
|
"deprecatedSince": "5.4.0",
|
|
1718
1741
|
"removalVersion": "6.0.0",
|
|
1719
|
-
"canonicalOwner": "
|
|
1720
|
-
"canonicalPath": "
|
|
1721
|
-
"description": "DEPRECATED:
|
|
1742
|
+
"canonicalOwner": "adoption-layer",
|
|
1743
|
+
"canonicalPath": "",
|
|
1744
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Agent envelope/handoff protocol — runtime is now adoption-layer responsibility."
|
|
1722
1745
|
},
|
|
1723
1746
|
{
|
|
1724
1747
|
"id": "model-selection",
|
|
@@ -1757,9 +1780,9 @@
|
|
|
1757
1780
|
"deprecated": true,
|
|
1758
1781
|
"deprecatedSince": "5.4.0",
|
|
1759
1782
|
"removalVersion": "6.0.0",
|
|
1760
|
-
"canonicalOwner": "
|
|
1761
|
-
"canonicalPath": "
|
|
1762
|
-
"description": "DEPRECATED:
|
|
1783
|
+
"canonicalOwner": "adoption-layer",
|
|
1784
|
+
"canonicalPath": "",
|
|
1785
|
+
"description": "DEPRECATED: Runtime relocated to adoption layer (DEC-049 superseded 2026-05-07). Branch completion workflow — runtime is now adoption-layer responsibility."
|
|
1763
1786
|
},
|
|
1764
1787
|
{
|
|
1765
1788
|
"id": "verification-evidence",
|
|
@@ -2448,8 +2471,7 @@
|
|
|
2448
2471
|
},
|
|
2449
2472
|
"category": "security",
|
|
2450
2473
|
"description": "CodeQL semantic code analysis + secret scanning + Biome security rules. Complements dependency auditing with deep static analysis detecting injection vulnerabilities."
|
|
2451
|
-
}
|
|
2452
|
-
,
|
|
2474
|
+
},
|
|
2453
2475
|
{
|
|
2454
2476
|
"id": "prompt-regression",
|
|
2455
2477
|
"name": "Prompt Regression Standards",
|
|
@@ -2460,8 +2482,7 @@
|
|
|
2460
2482
|
},
|
|
2461
2483
|
"category": "testing",
|
|
2462
2484
|
"description": "Golden SHA-256 checksum tests for AI agent prompt files. Detects unintended prompt changes in CI; requires documented acknowledgment when checksums are updated."
|
|
2463
|
-
}
|
|
2464
|
-
,
|
|
2485
|
+
},
|
|
2465
2486
|
{
|
|
2466
2487
|
"id": "supply-chain-attestation",
|
|
2467
2488
|
"name": "Supply Chain Attestation Standards",
|
|
@@ -2472,8 +2493,7 @@
|
|
|
2472
2493
|
},
|
|
2473
2494
|
"category": "security",
|
|
2474
2495
|
"description": "CycloneDX SBOM generation, SLSA provenance (L1/L2), and cosign signing for verifiable software supply chain integrity from source to deployed artefact."
|
|
2475
|
-
}
|
|
2476
|
-
,
|
|
2496
|
+
},
|
|
2477
2497
|
{
|
|
2478
2498
|
"id": "cost-budget-test",
|
|
2479
2499
|
"name": "Cost Budget Test Standards",
|
|
@@ -2484,8 +2504,7 @@
|
|
|
2484
2504
|
},
|
|
2485
2505
|
"category": "testing",
|
|
2486
2506
|
"description": "Unit tests for AI agent token budget zone classification boundaries (safe/warning/danger/blocking), pipeline cost thresholds, and runaway-loop prevention guards."
|
|
2487
|
-
}
|
|
2488
|
-
,
|
|
2507
|
+
},
|
|
2489
2508
|
{
|
|
2490
2509
|
"id": "replay-test",
|
|
2491
2510
|
"name": "Replay Test Standards",
|
|
@@ -2496,8 +2515,7 @@
|
|
|
2496
2515
|
},
|
|
2497
2516
|
"category": "testing",
|
|
2498
2517
|
"description": "Golden fixture recording and deterministic replay for AI agent pipelines. Enables customer bug reproduction, verdict regression detection, and incident investigation without a live LLM."
|
|
2499
|
-
}
|
|
2500
|
-
,
|
|
2518
|
+
},
|
|
2501
2519
|
{
|
|
2502
2520
|
"id": "smoke-test",
|
|
2503
2521
|
"name": "Smoke Test Standards",
|
|
@@ -2508,8 +2526,7 @@
|
|
|
2508
2526
|
},
|
|
2509
2527
|
"category": "testing",
|
|
2510
2528
|
"description": "Post-deployment sanity checks verifying critical paths (health endpoint, core API) complete in under 30 seconds with zero external dependencies."
|
|
2511
|
-
}
|
|
2512
|
-
,
|
|
2529
|
+
},
|
|
2513
2530
|
{
|
|
2514
2531
|
"id": "property-based-testing",
|
|
2515
2532
|
"name": "Property-Based Testing Standards",
|
|
@@ -2520,8 +2537,7 @@
|
|
|
2520
2537
|
},
|
|
2521
2538
|
"category": "testing",
|
|
2522
2539
|
"description": "fast-check / Hypothesis property tests for pure functions: range clamping, determinism, monotonicity, round-trip. Complements example-based unit tests by generating hundreds of random inputs."
|
|
2523
|
-
}
|
|
2524
|
-
,
|
|
2540
|
+
},
|
|
2525
2541
|
{
|
|
2526
2542
|
"id": "disaster-recovery-drill",
|
|
2527
2543
|
"name": "Disaster Recovery Drill Standards",
|
|
@@ -2532,8 +2548,7 @@
|
|
|
2532
2548
|
},
|
|
2533
2549
|
"category": "operations",
|
|
2534
2550
|
"description": "Quarterly DR drill protocol: RTO/RPO targets, backup restore verification, Game Day exercises, drill records retained 12 months."
|
|
2535
|
-
}
|
|
2536
|
-
,
|
|
2551
|
+
},
|
|
2537
2552
|
{
|
|
2538
2553
|
"id": "flaky-test-management",
|
|
2539
2554
|
"name": "Flaky Test Management Standards",
|
|
@@ -2544,8 +2559,7 @@
|
|
|
2544
2559
|
},
|
|
2545
2560
|
"category": "testing",
|
|
2546
2561
|
"description": "Policies for detecting, quarantining (< 48h), and eliminating (< 30 days) flaky tests. Retry policy, root cause documentation, and quarantine annotation conventions."
|
|
2547
|
-
}
|
|
2548
|
-
,
|
|
2562
|
+
},
|
|
2549
2563
|
{
|
|
2550
2564
|
"id": "data-migration-testing",
|
|
2551
2565
|
"name": "Data Migration Testing Standards",
|
|
@@ -2556,8 +2570,7 @@
|
|
|
2556
2570
|
},
|
|
2557
2571
|
"category": "testing",
|
|
2558
2572
|
"description": "Standards for database schema migration tests: up/down/idempotency/data-preservation coverage. Requires isolated in-memory DB per test, verifiable rollback path, and data integrity after ALTER/DROP."
|
|
2559
|
-
}
|
|
2560
|
-
,
|
|
2573
|
+
},
|
|
2561
2574
|
{
|
|
2562
2575
|
"id": "chaos-injection-tests",
|
|
2563
2576
|
"name": "Chaos Injection Test Standards",
|
|
@@ -2568,8 +2581,7 @@
|
|
|
2568
2581
|
},
|
|
2569
2582
|
"category": "testing",
|
|
2570
2583
|
"description": "Executable chaos injection tests for AI agent systems: LLM timeout/rate-limit, DB disconnect rollback, policy-engine fail-closed, and inter-agent blast-radius containment tests."
|
|
2571
|
-
}
|
|
2572
|
-
,
|
|
2584
|
+
},
|
|
2573
2585
|
{
|
|
2574
2586
|
"id": "release-quality-manifest",
|
|
2575
2587
|
"name": "Release Quality Manifest Standards",
|
|
@@ -2580,6 +2592,50 @@
|
|
|
2580
2592
|
},
|
|
2581
2593
|
"category": "deployment",
|
|
2582
2594
|
"description": "Machine-readable per-release Quality Manifest aggregating all gate results (coverage, mutation, CVE, SAST, E2E, container scan, SBOM, LLM hallucination). Auto-generated by CI; customer-shareable."
|
|
2595
|
+
},
|
|
2596
|
+
{
|
|
2597
|
+
"id": "release-readiness-gate",
|
|
2598
|
+
"name": "Release Readiness Gate",
|
|
2599
|
+
"nameZh": "釋出準備閘門",
|
|
2600
|
+
"source": {
|
|
2601
|
+
"human": "core/release-readiness-gate.md",
|
|
2602
|
+
"ai": "ai/standards/release-readiness-gate.ai.yaml"
|
|
2603
|
+
},
|
|
2604
|
+
"category": "deployment",
|
|
2605
|
+
"description": "Single aggregated release gate covering 16 quality dimensions (Security, a11y, Performance, Contract, DB Migration, Cross-flow Regression, Operational Readiness, i18n, Browser Compat, Capacity, Compliance, Docs, Rollback, Smoke, Feature Flags, Multi-Gate Flow). Tiered sign-off template with RQM integration."
|
|
2606
|
+
},
|
|
2607
|
+
{
|
|
2608
|
+
"id": "contract-testing-standards",
|
|
2609
|
+
"name": "Contract Testing Standards",
|
|
2610
|
+
"nameZh": "合約測試標準",
|
|
2611
|
+
"source": {
|
|
2612
|
+
"human": "core/contract-testing-standards.md",
|
|
2613
|
+
"ai": "ai/standards/contract-testing-standards.ai.yaml"
|
|
2614
|
+
},
|
|
2615
|
+
"category": "testing",
|
|
2616
|
+
"description": "Consumer-driven contract testing (Pact/Spring Cloud Contract): consumer-driven flow, schema matchers, N-1 backward compatibility window, can-i-deploy release gate. Applies to projects with API consumers."
|
|
2617
|
+
},
|
|
2618
|
+
{
|
|
2619
|
+
"id": "cross-flow-regression",
|
|
2620
|
+
"name": "Cross-Flow Regression",
|
|
2621
|
+
"nameZh": "跨流程回歸測試",
|
|
2622
|
+
"source": {
|
|
2623
|
+
"human": "core/cross-flow-regression.md",
|
|
2624
|
+
"ai": "ai/standards/cross-flow-regression.ai.yaml"
|
|
2625
|
+
},
|
|
2626
|
+
"category": "testing",
|
|
2627
|
+
"description": "Cross-flow regression complementing per-flow Multi-Gate: Critical User Journey (CUJ) suite, sequential state threading, inter-flow state contamination detection. CUJ pass rate ≥ 95% required per release."
|
|
2628
|
+
},
|
|
2629
|
+
{
|
|
2630
|
+
"id": "browser-compatibility-standards",
|
|
2631
|
+
"name": "Browser Compatibility Standards",
|
|
2632
|
+
"nameZh": "瀏覽器相容性標準",
|
|
2633
|
+
"source": {
|
|
2634
|
+
"human": "core/browser-compatibility-standards.md",
|
|
2635
|
+
"ai": "ai/standards/browser-compatibility-standards.ai.yaml"
|
|
2636
|
+
},
|
|
2637
|
+
"category": "testing",
|
|
2638
|
+
"description": "Browser/device support matrix (Tier-1/2/3), Playwright matrix config, viewport coverage (360/768/1280px), real iOS device testing, release gate. Applies to frontend/web projects; N/A for CLI/backend."
|
|
2583
2639
|
}
|
|
2584
2640
|
]
|
|
2585
2641
|
}
|