@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.
Files changed (39) hide show
  1. package/README.md +41 -3
  2. package/dist/commands/init.js +5 -1
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/commands/resources.js +2 -2
  5. package/dist/commands/resources.js.map +1 -1
  6. package/dist/commands/types.d.ts +1 -1
  7. package/dist/commands/types.d.ts.map +1 -1
  8. package/dist/commands/types.js +37 -29
  9. package/dist/commands/types.js.map +1 -1
  10. package/dist/lib/config.d.ts +14 -0
  11. package/dist/lib/config.d.ts.map +1 -1
  12. package/dist/lib/config.js +45 -0
  13. package/dist/lib/config.js.map +1 -1
  14. package/dist/lib/gofer-installer.d.ts.map +1 -1
  15. package/dist/lib/gofer-installer.js +4 -0
  16. package/dist/lib/gofer-installer.js.map +1 -1
  17. package/dist/lib/object-type-identifiers.d.ts +31 -0
  18. package/dist/lib/object-type-identifiers.d.ts.map +1 -0
  19. package/dist/lib/object-type-identifiers.js +68 -0
  20. package/dist/lib/object-type-identifiers.js.map +1 -0
  21. package/dist/lib/utils.d.ts +0 -4
  22. package/dist/lib/utils.d.ts.map +1 -1
  23. package/dist/lib/utils.js +2 -7
  24. package/dist/lib/utils.js.map +1 -1
  25. package/package.json +2 -2
  26. package/resources/gofer/agents-skills/6_gofer_validate/SKILL.md +13 -0
  27. package/resources/gofer/claude-commands/6_gofer_validate.md +13 -0
  28. package/resources/gofer/commands/6_gofer_validate.md +13 -0
  29. package/resources/gofer/config/object-type-routing.json +24 -0
  30. package/resources/gofer/contracts/object-type-routing-v1.json +69 -0
  31. package/resources/gofer/copilot-prompts/6_gofer_validate.prompt.md +13 -0
  32. package/resources/gofer/gemini/commands/gofer/6_gofer_validate.md +13 -0
  33. package/resources/gofer/references/platform/eai-app-template.md +6 -2
  34. package/resources/gofer/references/platform/eai-repo-contract.md +8 -2
  35. package/resources/gofer/references/platform/eai-service-patterns.md +7 -0
  36. package/resources/gofer/schemas/object-type-identifier-audit-v1.schema.json +207 -0
  37. package/resources/gofer/schemas/object-type-routing-phase-bundle-v1.schema.json +39 -0
  38. package/resources/gofer/specify-commands/6_gofer_validate.md +13 -0
  39. 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