@operato/twin-kernel 0.6.4 → 0.6.5
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/dist/contract.d.ts +35 -0
- package/dist/domain-catalog.js +25 -0
- package/dist-cjs/index.cjs +30 -0
- package/package.json +1 -1
package/dist/contract.d.ts
CHANGED
|
@@ -149,6 +149,33 @@ export interface ResourceProperty {
|
|
|
149
149
|
* 자리가 없으면 사실이 들어오지 못한다.
|
|
150
150
|
*/
|
|
151
151
|
export type TestSpecificationRefs = string[];
|
|
152
|
+
/**
|
|
153
|
+
* 시험 명세 — **참조가 가리키는 대상.**
|
|
154
|
+
*
|
|
155
|
+
* ── 왜 최소 모양인가 ──────────────────────────────────────────────────────────
|
|
156
|
+
* 자원 아홉 종류가 이미 이것을 **가리키고 있었다**(`TestSpecificationRefs`). 그런데 가리켜지는 것이
|
|
157
|
+
* 모델에 없어서 그 참조는 **허공을 가리켰다** — 값을 실을 수는 있어도 그것이 무엇인지 아무도 답할 수
|
|
158
|
+
* 없었고, 화면은 그 사실을 조용히 넘겼다. 대상을 세우는 것이 이 선언의 일이다.
|
|
159
|
+
*
|
|
160
|
+
* 여기 담는 것은 **셋뿐이다**: 식별자·설명·판. 표준의 명세 타입(`B2MML-OperationsTest.xsd`)에는 재는
|
|
161
|
+
* 속성과 합격 기준이 더 있는데, 그 필드 이름을 **아직 1차 출처와 대조하지 않았다.** 짐작해 넣으면
|
|
162
|
+
* 표준 이름을 발명하는 것이고 이 저장소의 가드가 그것을 잡는다 — 대조한 뒤에 늘린다.
|
|
163
|
+
*
|
|
164
|
+
* 그래서 지금 이 축은 **"무엇으로 검증했다고 하는지"를 이름으로 답한다.** 그 이상을 주장하지 않는다.
|
|
165
|
+
*
|
|
166
|
+
* ── 결과는 여기 담지 않는다 ───────────────────────────────────────────────────
|
|
167
|
+
* 명세는 **선언**이고 시험 결과는 **관측**이다(누가 언제 통과했나). 결과의 집은 저널이고, 축이
|
|
168
|
+
* 필요해지면 일정·실적과 같은 방식(`source: 'state'|'journal'`)으로 따로 낸다. 한 축에 둘을 담으면
|
|
169
|
+
* 선언과 관측을 가르는 이 트윈의 뼈대가 무너진다.
|
|
170
|
+
*/
|
|
171
|
+
export interface TestSpecification {
|
|
172
|
+
/** 표준 `ID` — 자원의 `testSpecificationIds` 가 이 값을 가리킨다. */
|
|
173
|
+
id: string;
|
|
174
|
+
/** 표준 `Description`. i18n 키일 수 있다(사람 언어는 표현 계층이 렌더한다). */
|
|
175
|
+
description?: string;
|
|
176
|
+
/** 표준 `Version` — 같은 시험의 판이 바뀌면 자격의 뜻도 바뀐다(어느 판으로 검증했나). */
|
|
177
|
+
version?: string;
|
|
178
|
+
}
|
|
152
179
|
/**
|
|
153
180
|
* 유효 기간 — **ISA-95 `EffectiveStartDate` / `EffectiveEndDate`.**
|
|
154
181
|
*
|
|
@@ -1394,6 +1421,14 @@ export interface TwinModelDef {
|
|
|
1394
1421
|
* **절대 구간**(`StartDateTime`/`FinishDateTime`)을 계산해 넣는 것이다.
|
|
1395
1422
|
*/
|
|
1396
1423
|
utcOffsetMinutes?: number;
|
|
1424
|
+
/**
|
|
1425
|
+
* **시험 명세** — 표준 `TestSpecification`. 자원의 `testSpecificationIds` 가 가리키는 대상.
|
|
1426
|
+
*
|
|
1427
|
+
* 선언하지 않아도 트윈은 돈다 — 그때 그 참조는 **가리킬 것이 없다**(화면이 끊어진 참조로 센다).
|
|
1428
|
+
* 커널은 이 값으로 자격을 판정하지 않는다: 판정에는 **결과**가 필요하고 결과는 아직 모델에 없다.
|
|
1429
|
+
* 없는 것으로 판정하면 자격자가 전부 사라져 라인이 영구히 굶는다.
|
|
1430
|
+
*/
|
|
1431
|
+
testSpecifications?: TestSpecification[];
|
|
1397
1432
|
/**
|
|
1398
1433
|
* **등급 정의** — 표준 `PersonnelClass` · `EquipmentClass` · `PhysicalAssetClass`.
|
|
1399
1434
|
*
|
package/dist/domain-catalog.js
CHANGED
|
@@ -44,6 +44,16 @@ export const TWIN_AXES = [
|
|
|
44
44
|
standardClass: { isa95: 'OperationsSegment' } },
|
|
45
45
|
{ axis: 'materials', path: 'productionSpec.definition.materials', label: 'twin.axis.materials', kind: 'class',
|
|
46
46
|
standardClass: { isa95: 'MaterialDefinition' } },
|
|
47
|
+
/*
|
|
48
|
+
* 시험 명세 — **자원 아홉 종류가 가리키는 대상.**
|
|
49
|
+
*
|
|
50
|
+
* 이 축이 없던 동안 `testSpecificationIds` 는 허공을 가리켰다(값은 실리는데 무엇인지 아무도 모른다).
|
|
51
|
+
* 축이 서면 인스펙션의 선 채움이 **끊어진 참조를 센다** — 없는 명세를 가리키면 화면이 말한다.
|
|
52
|
+
*
|
|
53
|
+
* `kind: 'spec'` 이다: 자원도 등급도 아니고 **판정의 정의**다(공정·레시피와 같은 부류).
|
|
54
|
+
*/
|
|
55
|
+
{ axis: 'testSpecifications', path: 'testSpecifications', label: 'twin.axis.testSpecifications', kind: 'spec',
|
|
56
|
+
standardClass: { isa95: 'TestSpecification' } },
|
|
47
57
|
/*
|
|
48
58
|
* ── ISA-95 Part 4 — 일정과 실적 ────────────────────────────────────────────────
|
|
49
59
|
*
|
|
@@ -101,6 +111,21 @@ export const TWIN_RELATIONS = [
|
|
|
101
111
|
{ from: 'tasks', field: 'toNode', target: { kind: 'axis', axis: 'locations' }, via: 'twin.rel.at', optional: true },
|
|
102
112
|
{ from: 'tasks', field: 'resourceRef', target: { kind: 'axis', axis: 'equipment' }, via: 'twin.rel.by', optional: true },
|
|
103
113
|
{ from: 'tasks', field: 'personnel[]', target: { kind: 'axis', axis: 'persons' }, via: 'twin.rel.crew', optional: true },
|
|
114
|
+
/*
|
|
115
|
+
* 자격을 검증한 시험 — **여덟 갈래.** 자원(개체)과 등급 양쪽이 가리킨다: 표준이 그 둘 모두에 이
|
|
116
|
+
* 참조를 두었기 때문이다(개체는 "이 사람이 통과했다", 등급은 "이 자격은 이 시험을 요구한다").
|
|
117
|
+
*
|
|
118
|
+
* **자리(`locations`)에는 없다** — 표준이 자리를 시험 대상으로 두지 않았고 그 비대칭은 표준의
|
|
119
|
+
* 판단이다(`contract.ts` 가 "우리도 자리에 넣지 않는다" 고 적었다).
|
|
120
|
+
*/
|
|
121
|
+
{ from: 'persons', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
122
|
+
{ from: 'personnelClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
123
|
+
{ from: 'equipment', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
124
|
+
{ from: 'equipmentClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
125
|
+
{ from: 'assets', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
126
|
+
{ from: 'assetClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
127
|
+
{ from: 'materialDefinitions', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
128
|
+
{ from: 'materialClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
104
129
|
/* 공정이 도는 자리·자원 — 항목이 아니라 **타입**을 가리킨다 */
|
|
105
130
|
{ from: 'operations', field: 'locationType', target: { kind: 'type', role: 'location' }, via: 'twin.rel.at', optional: true },
|
|
106
131
|
{ from: 'operations', field: 'resourceType', target: { kind: 'type', role: 'equipment' }, via: 'twin.rel.by', optional: true }
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -1676,6 +1676,21 @@ var TWIN_AXES = [
|
|
|
1676
1676
|
kind: "class",
|
|
1677
1677
|
standardClass: { isa95: "MaterialDefinition" }
|
|
1678
1678
|
},
|
|
1679
|
+
/*
|
|
1680
|
+
* 시험 명세 — **자원 아홉 종류가 가리키는 대상.**
|
|
1681
|
+
*
|
|
1682
|
+
* 이 축이 없던 동안 `testSpecificationIds` 는 허공을 가리켰다(값은 실리는데 무엇인지 아무도 모른다).
|
|
1683
|
+
* 축이 서면 인스펙션의 선 채움이 **끊어진 참조를 센다** — 없는 명세를 가리키면 화면이 말한다.
|
|
1684
|
+
*
|
|
1685
|
+
* `kind: 'spec'` 이다: 자원도 등급도 아니고 **판정의 정의**다(공정·레시피와 같은 부류).
|
|
1686
|
+
*/
|
|
1687
|
+
{
|
|
1688
|
+
axis: "testSpecifications",
|
|
1689
|
+
path: "testSpecifications",
|
|
1690
|
+
label: "twin.axis.testSpecifications",
|
|
1691
|
+
kind: "spec",
|
|
1692
|
+
standardClass: { isa95: "TestSpecification" }
|
|
1693
|
+
},
|
|
1679
1694
|
/*
|
|
1680
1695
|
* ── ISA-95 Part 4 — 일정과 실적 ────────────────────────────────────────────────
|
|
1681
1696
|
*
|
|
@@ -1744,6 +1759,21 @@ var TWIN_RELATIONS = [
|
|
|
1744
1759
|
{ from: "tasks", field: "toNode", target: { kind: "axis", axis: "locations" }, via: "twin.rel.at", optional: true },
|
|
1745
1760
|
{ from: "tasks", field: "resourceRef", target: { kind: "axis", axis: "equipment" }, via: "twin.rel.by", optional: true },
|
|
1746
1761
|
{ from: "tasks", field: "personnel[]", target: { kind: "axis", axis: "persons" }, via: "twin.rel.crew", optional: true },
|
|
1762
|
+
/*
|
|
1763
|
+
* 자격을 검증한 시험 — **여덟 갈래.** 자원(개체)과 등급 양쪽이 가리킨다: 표준이 그 둘 모두에 이
|
|
1764
|
+
* 참조를 두었기 때문이다(개체는 "이 사람이 통과했다", 등급은 "이 자격은 이 시험을 요구한다").
|
|
1765
|
+
*
|
|
1766
|
+
* **자리(`locations`)에는 없다** — 표준이 자리를 시험 대상으로 두지 않았고 그 비대칭은 표준의
|
|
1767
|
+
* 판단이다(`contract.ts` 가 "우리도 자리에 넣지 않는다" 고 적었다).
|
|
1768
|
+
*/
|
|
1769
|
+
{ from: "persons", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1770
|
+
{ from: "personnelClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1771
|
+
{ from: "equipment", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1772
|
+
{ from: "equipmentClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1773
|
+
{ from: "assets", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1774
|
+
{ from: "assetClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1775
|
+
{ from: "materialDefinitions", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1776
|
+
{ from: "materialClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1747
1777
|
/* 공정이 도는 자리·자원 — 항목이 아니라 **타입**을 가리킨다 */
|
|
1748
1778
|
{ from: "operations", field: "locationType", target: { kind: "type", role: "location" }, via: "twin.rel.at", optional: true },
|
|
1749
1779
|
{ from: "operations", field: "resourceType", target: { kind: "type", role: "equipment" }, via: "twin.rel.by", optional: true }
|
package/package.json
CHANGED