@enterpriseai/cli 3.10.0 → 3.11.1
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/README.md +41 -3
- package/dist/commands/init.js +5 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/resources.js +2 -2
- package/dist/commands/resources.js.map +1 -1
- package/dist/commands/types.d.ts +1 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js +37 -29
- package/dist/commands/types.js.map +1 -1
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +45 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/gofer-installer.d.ts.map +1 -1
- package/dist/lib/gofer-installer.js +4 -0
- package/dist/lib/gofer-installer.js.map +1 -1
- package/dist/lib/object-type-identifiers.d.ts +31 -0
- package/dist/lib/object-type-identifiers.d.ts.map +1 -0
- package/dist/lib/object-type-identifiers.js +68 -0
- package/dist/lib/object-type-identifiers.js.map +1 -0
- package/dist/lib/utils.d.ts +0 -4
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +2 -7
- package/dist/lib/utils.js.map +1 -1
- package/package.json +2 -2
- package/resources/gofer/agents-skills/6_gofer_validate/SKILL.md +13 -0
- package/resources/gofer/claude-commands/6_gofer_validate.md +13 -0
- package/resources/gofer/commands/6_gofer_validate.md +13 -0
- package/resources/gofer/config/object-type-routing.json +24 -0
- package/resources/gofer/contracts/object-type-routing-v1.json +69 -0
- package/resources/gofer/copilot-prompts/6_gofer_validate.prompt.md +13 -0
- package/resources/gofer/gemini/commands/gofer/6_gofer_validate.md +13 -0
- package/resources/gofer/references/platform/eai-app-template.md +6 -2
- package/resources/gofer/references/platform/eai-repo-contract.md +8 -2
- package/resources/gofer/references/platform/eai-service-patterns.md +7 -0
- package/resources/gofer/schemas/object-type-identifier-audit-v1.schema.json +207 -0
- package/resources/gofer/schemas/object-type-routing-phase-bundle-v1.schema.json +39 -0
- package/resources/gofer/specify-commands/6_gofer_validate.md +13 -0
- package/resources/gofer/system-skills/6_gofer_validate/SKILL.md +13 -0
|
@@ -31,6 +31,13 @@ patterns in `eai-app-template/docs/platform/eai-service-patterns.md`.
|
|
|
31
31
|
|
|
32
32
|
## Storage Backend Rules
|
|
33
33
|
|
|
34
|
+
Keep Object Type identifiers in their correct layer. Configuration/model
|
|
35
|
+
`name` is PascalCase; the exact stored `slug` is the lowercase
|
|
36
|
+
kebab-case identifier used by relationship targets, runtime `target_type`,
|
|
37
|
+
resource commands, paths, and governed v4 fields. Resolve same-manifest model
|
|
38
|
+
name shorthand through the declared slug before publication. Never normalize
|
|
39
|
+
or rename a historical stored slug.
|
|
40
|
+
|
|
34
41
|
- `postgresql`: canonical structured resource storage.
|
|
35
42
|
- `documentdb`: document-model persistence when the data genuinely needs it.
|
|
36
43
|
- `blob`: large files or file-like resources behind API-mediated access.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "urn:eai:schema:object-type-identifier-audit:v1",
|
|
4
|
+
"title": "EAI Object Type Identifier Audit",
|
|
5
|
+
"description": "Read-only findings and regional inventory reports for eai.object-type-routing/v1.",
|
|
6
|
+
"oneOf": [{ "$ref": "#/$defs/IdentifierFinding" }, { "$ref": "#/$defs/InventoryRun" }],
|
|
7
|
+
"$defs": {
|
|
8
|
+
"Digest": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"pattern": "^sha256:[a-f0-9]{64}$"
|
|
11
|
+
},
|
|
12
|
+
"JsonScalar": {
|
|
13
|
+
"type": ["string", "number", "integer", "boolean", "null"]
|
|
14
|
+
},
|
|
15
|
+
"SourceLocation": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"required": ["kind", "file", "line"],
|
|
19
|
+
"properties": {
|
|
20
|
+
"kind": { "const": "source" },
|
|
21
|
+
"file": { "type": "string", "minLength": 1 },
|
|
22
|
+
"line": { "type": "integer", "minimum": 1 },
|
|
23
|
+
"column": { "type": "integer", "minimum": 1 }
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"PersistedLocation": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"required": ["kind", "tenantRef", "recordRef"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"kind": { "const": "persisted" },
|
|
32
|
+
"tenantRef": { "type": "string", "minLength": 1 },
|
|
33
|
+
"recordRef": { "type": "string", "minLength": 1 }
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"InventoryLocation": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"additionalProperties": false,
|
|
39
|
+
"required": ["kind", "environment", "region"],
|
|
40
|
+
"properties": {
|
|
41
|
+
"kind": { "const": "inventory" },
|
|
42
|
+
"environment": { "enum": ["dev", "test", "prod"] },
|
|
43
|
+
"region": { "enum": ["ae", "cc", "gwc"] }
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"IdentifierFinding": {
|
|
47
|
+
"type": "object",
|
|
48
|
+
"additionalProperties": false,
|
|
49
|
+
"required": [
|
|
50
|
+
"contractVersion",
|
|
51
|
+
"rule",
|
|
52
|
+
"classification",
|
|
53
|
+
"severity",
|
|
54
|
+
"location",
|
|
55
|
+
"field",
|
|
56
|
+
"offendingValue",
|
|
57
|
+
"remediation"
|
|
58
|
+
],
|
|
59
|
+
"properties": {
|
|
60
|
+
"contractVersion": { "const": "eai.object-type-routing/v1" },
|
|
61
|
+
"rule": {
|
|
62
|
+
"enum": [
|
|
63
|
+
"OBJECT_TYPE_NAME_NON_CANONICAL",
|
|
64
|
+
"OBJECT_TYPE_SLUG_MISSING",
|
|
65
|
+
"OBJECT_TYPE_SLUG_NON_CANONICAL",
|
|
66
|
+
"OBJECT_TYPE_SLUG_DERIVATION_MISMATCH",
|
|
67
|
+
"OBJECT_TYPE_DIRECT_ROUTE_CONSTRUCTION",
|
|
68
|
+
"OBJECT_TYPE_INVENTORY_INCOMPLETE"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"classification": {
|
|
72
|
+
"enum": ["blocking_source_drift", "report_only_persisted_legacy_drift", "activation_blocker"]
|
|
73
|
+
},
|
|
74
|
+
"severity": { "enum": ["error", "warning", "info"] },
|
|
75
|
+
"location": {
|
|
76
|
+
"oneOf": [
|
|
77
|
+
{ "$ref": "#/$defs/SourceLocation" },
|
|
78
|
+
{ "$ref": "#/$defs/PersistedLocation" },
|
|
79
|
+
{ "$ref": "#/$defs/InventoryLocation" }
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"field": { "type": ["string", "null"] },
|
|
83
|
+
"offendingValue": { "$ref": "#/$defs/JsonScalar" },
|
|
84
|
+
"expectedValue": {
|
|
85
|
+
"oneOf": [{ "$ref": "#/$defs/JsonScalar" }, { "type": "object" }]
|
|
86
|
+
},
|
|
87
|
+
"remediation": { "type": "string", "minLength": 1 }
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"PaginationEvidence": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"additionalProperties": false,
|
|
93
|
+
"required": ["pageCount", "recordCount", "terminal"],
|
|
94
|
+
"properties": {
|
|
95
|
+
"pageCount": { "type": "integer", "minimum": 0 },
|
|
96
|
+
"recordCount": { "type": "integer", "minimum": 0 },
|
|
97
|
+
"terminal": { "const": true }
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"ObjectTypePaginationEvidence": {
|
|
101
|
+
"type": "object",
|
|
102
|
+
"additionalProperties": false,
|
|
103
|
+
"required": ["tenantRef", "pageCount", "recordCount", "terminal"],
|
|
104
|
+
"properties": {
|
|
105
|
+
"tenantRef": { "type": "string", "minLength": 1 },
|
|
106
|
+
"pageCount": { "type": "integer", "minimum": 0 },
|
|
107
|
+
"recordCount": { "type": "integer", "minimum": 0 },
|
|
108
|
+
"terminal": { "const": true }
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"InventoryRun": {
|
|
112
|
+
"type": "object",
|
|
113
|
+
"additionalProperties": false,
|
|
114
|
+
"required": [
|
|
115
|
+
"schemaVersion",
|
|
116
|
+
"contractVersion",
|
|
117
|
+
"status",
|
|
118
|
+
"writeAttemptCount",
|
|
119
|
+
"environment",
|
|
120
|
+
"region",
|
|
121
|
+
"snapshotStartedAt",
|
|
122
|
+
"snapshotCompletedAt",
|
|
123
|
+
"releaseOwnerUserRef",
|
|
124
|
+
"identityKind",
|
|
125
|
+
"roleVisibilityComplete",
|
|
126
|
+
"snapshotBasis",
|
|
127
|
+
"sourceEndpoints",
|
|
128
|
+
"tenantSetDigestAlgorithm",
|
|
129
|
+
"expectedActiveTenantCount",
|
|
130
|
+
"scannedTenantCount",
|
|
131
|
+
"expectedTenantSetDigest",
|
|
132
|
+
"scannedTenantSetDigest",
|
|
133
|
+
"prePostUniverseStable",
|
|
134
|
+
"tenantPagination",
|
|
135
|
+
"objectTypePagination",
|
|
136
|
+
"objectTypePageCount",
|
|
137
|
+
"objectTypeRecordCount",
|
|
138
|
+
"sourceErrorCount",
|
|
139
|
+
"findingsSummary",
|
|
140
|
+
"findings",
|
|
141
|
+
"digestAlgorithm",
|
|
142
|
+
"digest"
|
|
143
|
+
],
|
|
144
|
+
"properties": {
|
|
145
|
+
"schemaVersion": { "const": "eai.object-type-routing.inventory/v1" },
|
|
146
|
+
"contractVersion": { "const": "eai.object-type-routing/v1" },
|
|
147
|
+
"status": { "enum": ["complete", "incomplete"] },
|
|
148
|
+
"writeAttemptCount": { "type": "integer", "const": 0 },
|
|
149
|
+
"environment": { "enum": ["dev", "test", "prod"] },
|
|
150
|
+
"region": { "enum": ["ae", "cc", "gwc"] },
|
|
151
|
+
"snapshotStartedAt": { "type": "string", "format": "date-time" },
|
|
152
|
+
"snapshotCompletedAt": { "type": "string", "format": "date-time" },
|
|
153
|
+
"releaseOwnerUserRef": { "type": "string", "minLength": 1 },
|
|
154
|
+
"identityKind": { "const": "USER" },
|
|
155
|
+
"roleVisibilityComplete": { "type": "boolean" },
|
|
156
|
+
"snapshotBasis": { "enum": ["server_snapshot", "stable_pre_post_enumeration"] },
|
|
157
|
+
"sourceEndpoints": {
|
|
158
|
+
"type": "object",
|
|
159
|
+
"additionalProperties": false,
|
|
160
|
+
"required": ["tenants", "objectTypes"],
|
|
161
|
+
"properties": {
|
|
162
|
+
"tenants": { "type": "string", "pattern": "^GET /v4/platform/tenants" },
|
|
163
|
+
"objectTypes": { "type": "string", "pattern": "^GET /v4/data/resources/object-types" }
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
"tenantSetDigestAlgorithm": { "const": "HMAC-SHA256" },
|
|
167
|
+
"expectedActiveTenantCount": { "type": "integer", "minimum": 0 },
|
|
168
|
+
"scannedTenantCount": { "type": "integer", "minimum": 0 },
|
|
169
|
+
"expectedTenantSetDigest": { "$ref": "#/$defs/Digest" },
|
|
170
|
+
"scannedTenantSetDigest": { "$ref": "#/$defs/Digest" },
|
|
171
|
+
"preTenantSetDigest": { "$ref": "#/$defs/Digest" },
|
|
172
|
+
"postTenantSetDigest": { "$ref": "#/$defs/Digest" },
|
|
173
|
+
"prePostUniverseStable": { "type": "boolean" },
|
|
174
|
+
"tenantPagination": { "$ref": "#/$defs/PaginationEvidence" },
|
|
175
|
+
"objectTypePagination": {
|
|
176
|
+
"type": "array",
|
|
177
|
+
"items": { "$ref": "#/$defs/ObjectTypePaginationEvidence" }
|
|
178
|
+
},
|
|
179
|
+
"objectTypePageCount": { "type": "integer", "minimum": 0 },
|
|
180
|
+
"objectTypeRecordCount": { "type": "integer", "minimum": 0 },
|
|
181
|
+
"sourceErrorCount": { "type": "integer", "minimum": 0 },
|
|
182
|
+
"findingsSummary": {
|
|
183
|
+
"type": "object",
|
|
184
|
+
"additionalProperties": false,
|
|
185
|
+
"required": ["blocking_source_drift", "report_only_persisted_legacy_drift", "activation_blocker"],
|
|
186
|
+
"properties": {
|
|
187
|
+
"blocking_source_drift": { "type": "integer", "minimum": 0 },
|
|
188
|
+
"report_only_persisted_legacy_drift": { "type": "integer", "minimum": 0 },
|
|
189
|
+
"activation_blocker": { "type": "integer", "minimum": 0 }
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
"findings": {
|
|
193
|
+
"type": "array",
|
|
194
|
+
"items": { "$ref": "#/$defs/IdentifierFinding" }
|
|
195
|
+
},
|
|
196
|
+
"digestAlgorithm": { "const": "SHA-256/RFC8785" },
|
|
197
|
+
"digest": { "$ref": "#/$defs/Digest" }
|
|
198
|
+
},
|
|
199
|
+
"allOf": [
|
|
200
|
+
{
|
|
201
|
+
"if": { "properties": { "snapshotBasis": { "const": "stable_pre_post_enumeration" } } },
|
|
202
|
+
"then": { "required": ["preTenantSetDigest", "postTenantSetDigest"] }
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "urn:eai:schema:object-type-routing-phase-bundle:v1",
|
|
4
|
+
"title": "EAI Object Type Routing Phase Bundle",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schemaVersion", "repository", "phase", "baselineSha", "semantics", "entries", "rootDigest"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schemaVersion": { "const": "eai.object-type-routing.phase-bundle/v1" },
|
|
10
|
+
"repository": { "type": "string", "minLength": 1 },
|
|
11
|
+
"phase": { "enum": ["P0", "A0", "P1", "A1"] },
|
|
12
|
+
"baselineSha": { "type": "string", "pattern": "^[a-f0-9]{40,64}$" },
|
|
13
|
+
"semantics": { "const": "cumulative_from_baseline" },
|
|
14
|
+
"entries": {
|
|
15
|
+
"type": "array",
|
|
16
|
+
"items": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"required": ["path", "kind", "mode", "deleted", "contentBase64", "contentDigest", "entryDigest"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"path": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"minLength": 1,
|
|
24
|
+
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+$"
|
|
25
|
+
},
|
|
26
|
+
"kind": { "enum": ["file", "symlink", "deletion"] },
|
|
27
|
+
"mode": { "enum": ["100644", "100755", "120000"] },
|
|
28
|
+
"deleted": { "type": "boolean" },
|
|
29
|
+
"contentBase64": { "type": ["string", "null"] },
|
|
30
|
+
"contentDigest": {
|
|
31
|
+
"oneOf": [{ "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }, { "type": "null" }]
|
|
32
|
+
},
|
|
33
|
+
"entryDigest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"rootDigest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -300,6 +300,19 @@ Validation MUST treat the closed-loop and loop audits as objective gates:
|
|
|
300
300
|
- If the audit only reports low-severity warnings with no recommended reopen
|
|
301
301
|
stage, continue but record them in the validation report.
|
|
302
302
|
|
|
303
|
+
## Object Type Identifier Contract
|
|
304
|
+
|
|
305
|
+
- Preserve PascalCase source/model `name` and exact lowercase kebab-case
|
|
306
|
+
transport/storage `slug` as distinct identifiers.
|
|
307
|
+
- Generated `linkTypes[].targetObjectType`, runtime `target_type`, paths, and
|
|
308
|
+
governed v4 fields contain exact stored slugs.
|
|
309
|
+
- Resolve same-manifest model-name shorthand through the declared slug before
|
|
310
|
+
publication; reject unresolved names instead of guessing.
|
|
311
|
+
- Use the shared platform SDK for app routes. Never hand-write v4 resource
|
|
312
|
+
paths or add a local slugifier.
|
|
313
|
+
- Historical stored slugs are authoritative. Never normalize, alias, or rename
|
|
314
|
+
them to match current derivation.
|
|
315
|
+
|
|
303
316
|
---
|
|
304
317
|
|
|
305
318
|
# Phase A — Rubric Validation
|
|
@@ -324,6 +324,19 @@ Validation MUST treat the closed-loop and loop audits as objective gates:
|
|
|
324
324
|
- If the audit only reports low-severity warnings with no recommended reopen
|
|
325
325
|
stage, continue but record them in the validation report.
|
|
326
326
|
|
|
327
|
+
## Object Type Identifier Contract
|
|
328
|
+
|
|
329
|
+
- Preserve PascalCase source/model `name` and exact lowercase kebab-case
|
|
330
|
+
transport/storage `slug` as distinct identifiers.
|
|
331
|
+
- Generated `linkTypes[].targetObjectType`, runtime `target_type`, paths, and
|
|
332
|
+
governed v4 fields contain exact stored slugs.
|
|
333
|
+
- Resolve same-manifest model-name shorthand through the declared slug before
|
|
334
|
+
publication; reject unresolved names instead of guessing.
|
|
335
|
+
- Use the shared platform SDK for app routes. Never hand-write v4 resource
|
|
336
|
+
paths or add a local slugifier.
|
|
337
|
+
- Historical stored slugs are authoritative. Never normalize, alias, or rename
|
|
338
|
+
them to match current derivation.
|
|
339
|
+
|
|
327
340
|
---
|
|
328
341
|
|
|
329
342
|
# Phase A — Rubric Validation
|