@mimir-labs/core 0.1.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/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/implementation/adapters/agents-md/adapter.d.ts +2 -0
- package/dist/implementation/adapters/agents-md/adapter.js +35 -0
- package/dist/implementation/adapters/agents-md/adapter.js.map +1 -0
- package/dist/implementation/adapters/copilot/adapter.d.ts +2 -0
- package/dist/implementation/adapters/copilot/adapter.js +34 -0
- package/dist/implementation/adapters/copilot/adapter.js.map +1 -0
- package/dist/implementation/adapters/cursor/adapter.d.ts +2 -0
- package/dist/implementation/adapters/cursor/adapter.js +33 -0
- package/dist/implementation/adapters/cursor/adapter.js.map +1 -0
- package/dist/implementation/adapters/index.d.ts +5 -0
- package/dist/implementation/adapters/index.js +23 -0
- package/dist/implementation/adapters/index.js.map +1 -0
- package/dist/implementation/adapters/managed-section.d.ts +5 -0
- package/dist/implementation/adapters/managed-section.js +37 -0
- package/dist/implementation/adapters/managed-section.js.map +1 -0
- package/dist/implementation/adapters/registry.d.ts +11 -0
- package/dist/implementation/adapters/registry.js +50 -0
- package/dist/implementation/adapters/registry.js.map +1 -0
- package/dist/implementation/adapters/types.d.ts +19 -0
- package/dist/implementation/adapters/types.js +3 -0
- package/dist/implementation/adapters/types.js.map +1 -0
- package/dist/implementation/configuration/manifest-loader.d.ts +16 -0
- package/dist/implementation/configuration/manifest-loader.js +64 -0
- package/dist/implementation/configuration/manifest-loader.js.map +1 -0
- package/dist/implementation/configuration/package-config.d.ts +12 -0
- package/dist/implementation/configuration/package-config.js +33 -0
- package/dist/implementation/configuration/package-config.js.map +1 -0
- package/dist/implementation/dependency-discovery/discover-providers.d.ts +6 -0
- package/dist/implementation/dependency-discovery/discover-providers.js +39 -0
- package/dist/implementation/dependency-discovery/discover-providers.js.map +1 -0
- package/dist/implementation/doctor/evaluator.d.ts +16 -0
- package/dist/implementation/doctor/evaluator.js +269 -0
- package/dist/implementation/doctor/evaluator.js.map +1 -0
- package/dist/implementation/generation/examples/existing-aps/src/Modal.d.ts +4 -0
- package/dist/implementation/generation/examples/existing-aps/src/Modal.js +7 -0
- package/dist/implementation/generation/examples/existing-aps/src/Modal.js.map +1 -0
- package/dist/implementation/generation/examples/existing-aps/src/index.d.ts +1 -0
- package/dist/implementation/generation/examples/existing-aps/src/index.js +6 -0
- package/dist/implementation/generation/examples/existing-aps/src/index.js.map +1 -0
- package/dist/implementation/generation/examples/missing-metadata/src/Input.d.ts +6 -0
- package/dist/implementation/generation/examples/missing-metadata/src/Input.js +6 -0
- package/dist/implementation/generation/examples/missing-metadata/src/Input.js.map +1 -0
- package/dist/implementation/generation/examples/missing-metadata/src/index.d.ts +1 -0
- package/dist/implementation/generation/examples/missing-metadata/src/index.js +6 -0
- package/dist/implementation/generation/examples/missing-metadata/src/index.js.map +1 -0
- package/dist/implementation/generation/examples/react-exports/src/Button.d.ts +5 -0
- package/dist/implementation/generation/examples/react-exports/src/Button.js +7 -0
- package/dist/implementation/generation/examples/react-exports/src/Button.js.map +1 -0
- package/dist/implementation/generation/examples/react-exports/src/Button.stories.d.ts +16 -0
- package/dist/implementation/generation/examples/react-exports/src/Button.stories.js +20 -0
- package/dist/implementation/generation/examples/react-exports/src/Button.stories.js.map +1 -0
- package/dist/implementation/generation/examples/react-exports/src/index.d.ts +1 -0
- package/dist/implementation/generation/examples/react-exports/src/index.js +6 -0
- package/dist/implementation/generation/examples/react-exports/src/index.js.map +1 -0
- package/dist/implementation/generation/extractors/readme-extractor.d.ts +2 -0
- package/dist/implementation/generation/extractors/readme-extractor.js +58 -0
- package/dist/implementation/generation/extractors/readme-extractor.js.map +1 -0
- package/dist/implementation/generation/extractors/storybook-extractor.d.ts +2 -0
- package/dist/implementation/generation/extractors/storybook-extractor.js +64 -0
- package/dist/implementation/generation/extractors/storybook-extractor.js.map +1 -0
- package/dist/implementation/generation/extractors/typescript-extractor.d.ts +2 -0
- package/dist/implementation/generation/extractors/typescript-extractor.js +138 -0
- package/dist/implementation/generation/extractors/typescript-extractor.js.map +1 -0
- package/dist/implementation/generation/generate-service.d.ts +6 -0
- package/dist/implementation/generation/generate-service.js +121 -0
- package/dist/implementation/generation/generate-service.js.map +1 -0
- package/dist/implementation/generation/provenance/provenance-builder.d.ts +6 -0
- package/dist/implementation/generation/provenance/provenance-builder.js +44 -0
- package/dist/implementation/generation/provenance/provenance-builder.js.map +1 -0
- package/dist/implementation/generation/resource-builders/component-builder.d.ts +2 -0
- package/dist/implementation/generation/resource-builders/component-builder.js +68 -0
- package/dist/implementation/generation/resource-builders/component-builder.js.map +1 -0
- package/dist/implementation/generation/resource-builders/example-builder.d.ts +5 -0
- package/dist/implementation/generation/resource-builders/example-builder.js +10 -0
- package/dist/implementation/generation/resource-builders/example-builder.js.map +1 -0
- package/dist/implementation/generation/types.d.ts +80 -0
- package/dist/implementation/generation/types.js +3 -0
- package/dist/implementation/generation/types.js.map +1 -0
- package/dist/implementation/generators/aps-generator.d.ts +7 -0
- package/dist/implementation/generators/aps-generator.js +11 -0
- package/dist/implementation/generators/aps-generator.js.map +1 -0
- package/dist/implementation/generators/index.d.ts +4 -0
- package/dist/implementation/generators/index.js +15 -0
- package/dist/implementation/generators/index.js.map +1 -0
- package/dist/implementation/generators/registry.d.ts +8 -0
- package/dist/implementation/generators/registry.js +30 -0
- package/dist/implementation/generators/registry.js.map +1 -0
- package/dist/implementation/generators/types.d.ts +4 -0
- package/dist/implementation/generators/types.js +3 -0
- package/dist/implementation/generators/types.js.map +1 -0
- package/dist/implementation/io/fs.d.ts +6 -0
- package/dist/implementation/io/fs.js +47 -0
- package/dist/implementation/io/fs.js.map +1 -0
- package/dist/implementation/io/json.d.ts +1 -0
- package/dist/implementation/io/json.js +7 -0
- package/dist/implementation/io/json.js.map +1 -0
- package/dist/implementation/query/resource-summary.d.ts +4 -0
- package/dist/implementation/query/resource-summary.js +32 -0
- package/dist/implementation/query/resource-summary.js.map +1 -0
- package/dist/implementation/services/context-service.d.ts +4 -0
- package/dist/implementation/services/context-service.js +22 -0
- package/dist/implementation/services/context-service.js.map +1 -0
- package/dist/implementation/services/discovery-service.d.ts +1 -0
- package/dist/implementation/services/discovery-service.js +8 -0
- package/dist/implementation/services/discovery-service.js.map +1 -0
- package/dist/implementation/services/doctor-service.d.ts +1 -0
- package/dist/implementation/services/doctor-service.js +8 -0
- package/dist/implementation/services/doctor-service.js.map +1 -0
- package/dist/implementation/services/generate-service.d.ts +7 -0
- package/dist/implementation/services/generate-service.js +10 -0
- package/dist/implementation/services/generate-service.js.map +1 -0
- package/dist/implementation/services/governance-service.d.ts +1 -0
- package/dist/implementation/services/governance-service.js +28 -0
- package/dist/implementation/services/governance-service.js.map +1 -0
- package/dist/implementation/services/init-service.d.ts +6 -0
- package/dist/implementation/services/init-service.js +49 -0
- package/dist/implementation/services/init-service.js.map +1 -0
- package/dist/implementation/services/sync-service.d.ts +8 -0
- package/dist/implementation/services/sync-service.js +35 -0
- package/dist/implementation/services/sync-service.js.map +1 -0
- package/dist/implementation/services/validate-service.d.ts +1 -0
- package/dist/implementation/services/validate-service.js +8 -0
- package/dist/implementation/services/validate-service.js.map +1 -0
- package/dist/implementation/synchronization/agents-md.d.ts +2 -0
- package/dist/implementation/synchronization/agents-md.js +46 -0
- package/dist/implementation/synchronization/agents-md.js.map +1 -0
- package/dist/implementation/synchronization/context-generator.d.ts +7 -0
- package/dist/implementation/synchronization/context-generator.js +110 -0
- package/dist/implementation/synchronization/context-generator.js.map +1 -0
- package/dist/implementation/validation-engine/validate-package.d.ts +10 -0
- package/dist/implementation/validation-engine/validate-package.js +123 -0
- package/dist/implementation/validation-engine/validate-package.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/compatibility/aps-component-schema.d.ts +17 -0
- package/dist/protocol/compatibility/aps-component-schema.js +85 -0
- package/dist/protocol/compatibility/aps-component-schema.js.map +1 -0
- package/dist/protocol/compatibility/aps-example-schema.d.ts +14 -0
- package/dist/protocol/compatibility/aps-example-schema.js +63 -0
- package/dist/protocol/compatibility/aps-example-schema.js.map +1 -0
- package/dist/protocol/compatibility/aps-manifest-schema.d.ts +15 -0
- package/dist/protocol/compatibility/aps-manifest-schema.js +115 -0
- package/dist/protocol/compatibility/aps-manifest-schema.js.map +1 -0
- package/dist/protocol/compatibility/aps-migration-schema.d.ts +14 -0
- package/dist/protocol/compatibility/aps-migration-schema.js +65 -0
- package/dist/protocol/compatibility/aps-migration-schema.js.map +1 -0
- package/dist/protocol/compatibility/aps-pattern-schema.d.ts +15 -0
- package/dist/protocol/compatibility/aps-pattern-schema.js +67 -0
- package/dist/protocol/compatibility/aps-pattern-schema.js.map +1 -0
- package/dist/protocol/compatibility/aps-rule-schema.d.ts +13 -0
- package/dist/protocol/compatibility/aps-rule-schema.js +55 -0
- package/dist/protocol/compatibility/aps-rule-schema.js.map +1 -0
- package/dist/protocol/compatibility/index.d.ts +14 -0
- package/dist/protocol/compatibility/index.js +6 -0
- package/dist/protocol/compatibility/index.js.map +1 -0
- package/dist/protocol/governance/applicability-validator.d.ts +2 -0
- package/dist/protocol/governance/applicability-validator.js +108 -0
- package/dist/protocol/governance/applicability-validator.js.map +1 -0
- package/dist/protocol/governance/conflict-validator.d.ts +2 -0
- package/dist/protocol/governance/conflict-validator.js +129 -0
- package/dist/protocol/governance/conflict-validator.js.map +1 -0
- package/dist/protocol/governance/evidence-validator.d.ts +2 -0
- package/dist/protocol/governance/evidence-validator.js +97 -0
- package/dist/protocol/governance/evidence-validator.js.map +1 -0
- package/dist/protocol/governance/identity-validator.d.ts +2 -0
- package/dist/protocol/governance/identity-validator.js +79 -0
- package/dist/protocol/governance/identity-validator.js.map +1 -0
- package/dist/protocol/governance/index.d.ts +79 -0
- package/dist/protocol/governance/index.js +115 -0
- package/dist/protocol/governance/index.js.map +1 -0
- package/dist/protocol/governance/lifecycle-validator.d.ts +2 -0
- package/dist/protocol/governance/lifecycle-validator.js +93 -0
- package/dist/protocol/governance/lifecycle-validator.js.map +1 -0
- package/dist/protocol/governance/provenance-validator.d.ts +2 -0
- package/dist/protocol/governance/provenance-validator.js +170 -0
- package/dist/protocol/governance/provenance-validator.js.map +1 -0
- package/dist/protocol/manifest/api-resource.d.ts +26 -0
- package/dist/protocol/manifest/api-resource.js +3 -0
- package/dist/protocol/manifest/api-resource.js.map +1 -0
- package/dist/protocol/manifest/common.d.ts +44 -0
- package/dist/protocol/manifest/common.js +3 -0
- package/dist/protocol/manifest/common.js.map +1 -0
- package/dist/protocol/manifest/component-resource.d.ts +48 -0
- package/dist/protocol/manifest/component-resource.js +3 -0
- package/dist/protocol/manifest/component-resource.js.map +1 -0
- package/dist/protocol/manifest/event-resource.d.ts +16 -0
- package/dist/protocol/manifest/event-resource.js +3 -0
- package/dist/protocol/manifest/event-resource.js.map +1 -0
- package/dist/protocol/manifest/example-resource.d.ts +17 -0
- package/dist/protocol/manifest/example-resource.js +3 -0
- package/dist/protocol/manifest/example-resource.js.map +1 -0
- package/dist/protocol/manifest/index.d.ts +13 -0
- package/dist/protocol/manifest/index.js +3 -0
- package/dist/protocol/manifest/index.js.map +1 -0
- package/dist/protocol/manifest/legacy-v1.d.ts +47 -0
- package/dist/protocol/manifest/legacy-v1.js +3 -0
- package/dist/protocol/manifest/legacy-v1.js.map +1 -0
- package/dist/protocol/manifest/manifest.d.ts +28 -0
- package/dist/protocol/manifest/manifest.js +3 -0
- package/dist/protocol/manifest/manifest.js.map +1 -0
- package/dist/protocol/manifest/migration-resource.d.ts +22 -0
- package/dist/protocol/manifest/migration-resource.js +3 -0
- package/dist/protocol/manifest/migration-resource.js.map +1 -0
- package/dist/protocol/manifest/model-resource.d.ts +21 -0
- package/dist/protocol/manifest/model-resource.js +3 -0
- package/dist/protocol/manifest/model-resource.js.map +1 -0
- package/dist/protocol/manifest/pattern-resource.d.ts +14 -0
- package/dist/protocol/manifest/pattern-resource.js +3 -0
- package/dist/protocol/manifest/pattern-resource.js.map +1 -0
- package/dist/protocol/manifest/resource.d.ts +24 -0
- package/dist/protocol/manifest/resource.js +3 -0
- package/dist/protocol/manifest/resource.js.map +1 -0
- package/dist/protocol/manifest/rule-resource.d.ts +27 -0
- package/dist/protocol/manifest/rule-resource.js +3 -0
- package/dist/protocol/manifest/rule-resource.js.map +1 -0
- package/dist/protocol/manifest/service-resource.d.ts +14 -0
- package/dist/protocol/manifest/service-resource.js +3 -0
- package/dist/protocol/manifest/service-resource.js.map +1 -0
- package/dist/shared/json.d.ts +2 -0
- package/dist/shared/json.js +14 -0
- package/dist/shared/json.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateApsPattern = validateApsPattern;
|
|
4
|
+
const json_1 = require("../../shared/json");
|
|
5
|
+
function validateApsPattern(value, path) {
|
|
6
|
+
const errors = [];
|
|
7
|
+
const warnings = [];
|
|
8
|
+
if (!(0, json_1.isObject)(value)) {
|
|
9
|
+
return {
|
|
10
|
+
valid: false,
|
|
11
|
+
errors: [
|
|
12
|
+
{
|
|
13
|
+
code: "APS_INVALID_PATTERN",
|
|
14
|
+
path,
|
|
15
|
+
message: "Pattern must be an object"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
warnings
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (typeof value.name !== "string" || value.name.trim() === "") {
|
|
22
|
+
errors.push({
|
|
23
|
+
code: "APS_INVALID_PATTERN",
|
|
24
|
+
path,
|
|
25
|
+
message: "Pattern.name is required and must be a non-empty string"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (value.description !== undefined && typeof value.description !== "string") {
|
|
29
|
+
errors.push({
|
|
30
|
+
code: "APS_INVALID_PATTERN_DESCRIPTION",
|
|
31
|
+
path,
|
|
32
|
+
message: "Pattern.description must be a string"
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const tags = value.tags === undefined ? undefined : (0, json_1.toStringArray)(value.tags);
|
|
36
|
+
if (value.tags !== undefined &&
|
|
37
|
+
(!Array.isArray(value.tags) || (tags !== undefined && tags.length !== value.tags.length))) {
|
|
38
|
+
warnings.push(`${path}: pattern.tags should be an array of strings`);
|
|
39
|
+
}
|
|
40
|
+
const examples = value.examples === undefined ? undefined : (0, json_1.toStringArray)(value.examples);
|
|
41
|
+
if (value.examples !== undefined &&
|
|
42
|
+
(!Array.isArray(value.examples) || (examples !== undefined && examples.length !== value.examples.length))) {
|
|
43
|
+
warnings.push(`${path}: pattern.examples should be an array of strings`);
|
|
44
|
+
}
|
|
45
|
+
const rules = value.rules === undefined ? undefined : (0, json_1.toStringArray)(value.rules);
|
|
46
|
+
if (value.rules !== undefined &&
|
|
47
|
+
(!Array.isArray(value.rules) || (rules !== undefined && rules.length !== value.rules.length))) {
|
|
48
|
+
warnings.push(`${path}: pattern.rules should be an array of strings`);
|
|
49
|
+
}
|
|
50
|
+
if (errors.length > 0) {
|
|
51
|
+
return { valid: false, errors, warnings };
|
|
52
|
+
}
|
|
53
|
+
const name = value.name;
|
|
54
|
+
return {
|
|
55
|
+
valid: true,
|
|
56
|
+
value: {
|
|
57
|
+
name: typeof name === "string" ? name : "",
|
|
58
|
+
description: typeof value.description === "string" ? value.description : undefined,
|
|
59
|
+
tags,
|
|
60
|
+
examples,
|
|
61
|
+
rules
|
|
62
|
+
},
|
|
63
|
+
errors,
|
|
64
|
+
warnings
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=aps-pattern-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aps-pattern-schema.js","sourceRoot":"","sources":["../../../src/protocol/compatibility/aps-pattern-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ValidationIssue } from "./index";
|
|
2
|
+
export type ApsRule = {
|
|
3
|
+
name: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
tags?: string[];
|
|
6
|
+
};
|
|
7
|
+
export type ResourceValidationResult<T> = {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
value?: T;
|
|
10
|
+
errors: ValidationIssue[];
|
|
11
|
+
warnings: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare function validateApsRule(value: unknown, path: string): ResourceValidationResult<ApsRule>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateApsRule = validateApsRule;
|
|
4
|
+
const json_1 = require("../../shared/json");
|
|
5
|
+
function validateApsRule(value, path) {
|
|
6
|
+
const errors = [];
|
|
7
|
+
const warnings = [];
|
|
8
|
+
if (!(0, json_1.isObject)(value)) {
|
|
9
|
+
return {
|
|
10
|
+
valid: false,
|
|
11
|
+
errors: [
|
|
12
|
+
{
|
|
13
|
+
code: "APS_INVALID_RULE",
|
|
14
|
+
path,
|
|
15
|
+
message: "Rule must be an object"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
warnings
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (typeof value.name !== "string" || value.name.trim() === "") {
|
|
22
|
+
errors.push({
|
|
23
|
+
code: "APS_INVALID_RULE",
|
|
24
|
+
path,
|
|
25
|
+
message: "Rule.name is required and must be a non-empty string"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (value.description !== undefined && typeof value.description !== "string") {
|
|
29
|
+
errors.push({
|
|
30
|
+
code: "APS_INVALID_RULE_DESCRIPTION",
|
|
31
|
+
path,
|
|
32
|
+
message: "Rule.description must be a string"
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const tags = value.tags === undefined ? undefined : (0, json_1.toStringArray)(value.tags);
|
|
36
|
+
if (value.tags !== undefined &&
|
|
37
|
+
(!Array.isArray(value.tags) || (tags !== undefined && tags.length !== value.tags.length))) {
|
|
38
|
+
warnings.push(`${path}: rule.tags should be an array of strings`);
|
|
39
|
+
}
|
|
40
|
+
if (errors.length > 0) {
|
|
41
|
+
return { valid: false, errors, warnings };
|
|
42
|
+
}
|
|
43
|
+
const name = value.name;
|
|
44
|
+
return {
|
|
45
|
+
valid: true,
|
|
46
|
+
value: {
|
|
47
|
+
name: typeof name === "string" ? name : "",
|
|
48
|
+
description: typeof value.description === "string" ? value.description : undefined,
|
|
49
|
+
tags
|
|
50
|
+
},
|
|
51
|
+
errors,
|
|
52
|
+
warnings
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=aps-rule-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aps-rule-schema.js","sourceRoot":"","sources":["../../../src/protocol/compatibility/aps-rule-schema.ts"],"names":[],"mappings":";;AAgBA,0CA0DC;AA1ED,4CAA4D;AAgB5D,SAAgB,eAAe,CAAC,KAAc,EAAE,IAAY;IAC1D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,IAAA,eAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,kBAAkB;oBACxB,IAAI;oBACJ,OAAO,EAAE,wBAAwB;iBAClC;aACF;YACD,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,IAAI;YACJ,OAAO,EAAE,sDAAsD;SAChE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,8BAA8B;YACpC,IAAI;YACJ,OAAO,EAAE,mCAAmC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,oBAAa,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9E,IACE,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EACzF,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,2CAA2C,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAExB,OAAO;QACL,KAAK,EAAE,IAAI;QACX,KAAK,EAAE;YACL,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAC1C,WAAW,EAAE,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YAClF,IAAI;SACL;QACD,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { validateApsManifest, type ApsManifest } from "./aps-manifest-schema";
|
|
2
|
+
export type ValidationIssue = {
|
|
3
|
+
code: string;
|
|
4
|
+
path: string;
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
export type SchemaValidationResult<T> = {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
value?: T;
|
|
10
|
+
errors: ValidationIssue[];
|
|
11
|
+
warnings: string[];
|
|
12
|
+
validResources: string[];
|
|
13
|
+
};
|
|
14
|
+
export { validateApsManifest, type ApsManifest };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateApsManifest = void 0;
|
|
4
|
+
const aps_manifest_schema_1 = require("./aps-manifest-schema");
|
|
5
|
+
Object.defineProperty(exports, "validateApsManifest", { enumerable: true, get: function () { return aps_manifest_schema_1.validateApsManifest; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocol/compatibility/index.ts"],"names":[],"mappings":";;;AAAA,+DAA8E;AAgBrE,oGAhBA,yCAAmB,OAgBA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateApplicability = validateApplicability;
|
|
4
|
+
const json_1 = require("../../shared/json");
|
|
5
|
+
function getGovernance(resource) {
|
|
6
|
+
if (!(0, json_1.isObject)(resource.metadata)) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
const governance = resource.metadata.governance;
|
|
10
|
+
return (0, json_1.isObject)(governance) ? governance : {};
|
|
11
|
+
}
|
|
12
|
+
function hasApplicabilityContext(value) {
|
|
13
|
+
if (!(0, json_1.isObject)(value)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const keys = ["framework", "language", "runtime", "platform", "layer", "boundedContext"];
|
|
17
|
+
return keys.some((key) => {
|
|
18
|
+
const item = value[key];
|
|
19
|
+
return (typeof item === "string" ||
|
|
20
|
+
(Array.isArray(item) && item.some((entry) => typeof entry === "string" && entry.trim() !== "")));
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function readAuthority(resource) {
|
|
24
|
+
const governance = getGovernance(resource);
|
|
25
|
+
return typeof governance.authority === "string" ? governance.authority : "advisory";
|
|
26
|
+
}
|
|
27
|
+
function looksReactSpecific(resource) {
|
|
28
|
+
const text = [resource.name, resource.id, resource.description]
|
|
29
|
+
.filter((item) => typeof item === "string")
|
|
30
|
+
.join(" ")
|
|
31
|
+
.toLowerCase();
|
|
32
|
+
return text.includes("react") || text.includes("jsx") || text.includes("tsx");
|
|
33
|
+
}
|
|
34
|
+
function looksBackendSpecific(resource) {
|
|
35
|
+
const text = [resource.name, resource.id, resource.description]
|
|
36
|
+
.filter((item) => typeof item === "string")
|
|
37
|
+
.join(" ")
|
|
38
|
+
.toLowerCase();
|
|
39
|
+
return (text.includes("backend") ||
|
|
40
|
+
text.includes("api") ||
|
|
41
|
+
text.includes("service") ||
|
|
42
|
+
text.includes("node"));
|
|
43
|
+
}
|
|
44
|
+
function validateApplicability(resources) {
|
|
45
|
+
const errors = [];
|
|
46
|
+
const warnings = [];
|
|
47
|
+
for (let index = 0; index < resources.length; index += 1) {
|
|
48
|
+
const resource = resources[index];
|
|
49
|
+
if (resource.type !== "rule" && resource.type !== "pattern") {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const governance = getGovernance(resource);
|
|
53
|
+
const authority = readAuthority(resource);
|
|
54
|
+
const strongAuthority = authority === "policy" || authority === "required";
|
|
55
|
+
const applicability = governance.applicability;
|
|
56
|
+
const hasContext = hasApplicabilityContext(applicability);
|
|
57
|
+
if (!strongAuthority) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const basePath = `resources[${index}].metadata.governance.applicability`;
|
|
61
|
+
if (!hasContext) {
|
|
62
|
+
if (authority === "policy" && looksBackendSpecific(resource)) {
|
|
63
|
+
errors.push({
|
|
64
|
+
code: "APS_GOV_BACKEND_POLICY_GLOBAL",
|
|
65
|
+
path: basePath,
|
|
66
|
+
message: "Backend policy cannot be global; applicability context is required"
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else if (looksReactSpecific(resource)) {
|
|
70
|
+
warnings.push({
|
|
71
|
+
code: "APS_GOV_REACT_RULE_MISSING_CONTEXT",
|
|
72
|
+
path: basePath,
|
|
73
|
+
message: "React-oriented rule should define framework applicability"
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
warnings.push({
|
|
78
|
+
code: "APS_GOV_STRONG_AUTHORITY_CONTEXT_RECOMMENDED",
|
|
79
|
+
path: basePath,
|
|
80
|
+
message: "Rules and patterns with strong authority should define applicability context"
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (authority === "policy" && (0, json_1.isObject)(applicability)) {
|
|
86
|
+
const layer = applicability.layer;
|
|
87
|
+
if ((layer === undefined || layer === "") &&
|
|
88
|
+
applicability.framework === undefined &&
|
|
89
|
+
applicability.runtime === undefined) {
|
|
90
|
+
errors.push({
|
|
91
|
+
code: "APS_GOV_POLICY_CONTEXT_TOO_GENERIC",
|
|
92
|
+
path: basePath,
|
|
93
|
+
message: "Policy applicability is too generic; define at least layer/framework/runtime"
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
errors,
|
|
100
|
+
warnings,
|
|
101
|
+
counters: {
|
|
102
|
+
governedFields: 0,
|
|
103
|
+
fieldsWithEvidence: 0,
|
|
104
|
+
fieldsWithProvenance: 0
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=applicability-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicability-validator.js","sourceRoot":"","sources":["../../../src/protocol/governance/applicability-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateConflicts = validateConflicts;
|
|
4
|
+
const json_1 = require("../../shared/json");
|
|
5
|
+
function getConflicts(resource) {
|
|
6
|
+
if (!(0, json_1.isObject)(resource.metadata)) {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
const governance = resource.metadata.governance;
|
|
10
|
+
if (!(0, json_1.isObject)(governance) || !Array.isArray(governance.conflicts)) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
return governance.conflicts.filter((item) => (0, json_1.isObject)(item));
|
|
14
|
+
}
|
|
15
|
+
function readCandidateIds(conflict) {
|
|
16
|
+
if (!Array.isArray(conflict.candidates)) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
return conflict.candidates
|
|
20
|
+
.map((candidate) => ((0, json_1.isObject)(candidate) && typeof candidate.id === "string" ? candidate.id : null))
|
|
21
|
+
.filter((item) => Boolean(item));
|
|
22
|
+
}
|
|
23
|
+
function validateConflicts(resources) {
|
|
24
|
+
const errors = [];
|
|
25
|
+
const warnings = [];
|
|
26
|
+
for (let index = 0; index < resources.length; index += 1) {
|
|
27
|
+
const conflicts = getConflicts(resources[index]);
|
|
28
|
+
for (let conflictIndex = 0; conflictIndex < conflicts.length; conflictIndex += 1) {
|
|
29
|
+
const conflict = conflicts[conflictIndex];
|
|
30
|
+
const basePath = `resources[${index}].metadata.governance.conflicts[${conflictIndex}]`;
|
|
31
|
+
if (typeof conflict.id !== "string" || conflict.id.trim() === "") {
|
|
32
|
+
errors.push({
|
|
33
|
+
code: "APS_GOV_CONFLICT_ID_REQUIRED",
|
|
34
|
+
path: `${basePath}.id`,
|
|
35
|
+
message: "Conflict id is required"
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (typeof conflict.fieldPath !== "string" || conflict.fieldPath.trim() === "") {
|
|
39
|
+
errors.push({
|
|
40
|
+
code: "APS_GOV_CONFLICT_FIELD_PATH_REQUIRED",
|
|
41
|
+
path: `${basePath}.fieldPath`,
|
|
42
|
+
message: "Conflict fieldPath is required"
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const candidateIds = readCandidateIds(conflict);
|
|
46
|
+
if (candidateIds.length < 2) {
|
|
47
|
+
errors.push({
|
|
48
|
+
code: "APS_GOV_CONFLICT_CANDIDATES_INSUFFICIENT",
|
|
49
|
+
path: `${basePath}.candidates`,
|
|
50
|
+
message: "Conflict must contain at least two candidates"
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (typeof conflict.selectedCandidateId !== "string" || conflict.selectedCandidateId.trim() === "") {
|
|
54
|
+
errors.push({
|
|
55
|
+
code: "APS_GOV_CONFLICT_SELECTED_MISSING",
|
|
56
|
+
path: `${basePath}.selectedCandidateId`,
|
|
57
|
+
message: "Conflict must define selectedCandidateId"
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else if (!candidateIds.includes(conflict.selectedCandidateId)) {
|
|
61
|
+
errors.push({
|
|
62
|
+
code: "APS_GOV_CONFLICT_SELECTED_NOT_FOUND",
|
|
63
|
+
path: `${basePath}.selectedCandidateId`,
|
|
64
|
+
message: "selectedCandidateId must reference an existing candidate"
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (!Array.isArray(conflict.rejectedCandidateIds) || conflict.rejectedCandidateIds.length === 0) {
|
|
68
|
+
errors.push({
|
|
69
|
+
code: "APS_GOV_CONFLICT_REJECTED_MISSING",
|
|
70
|
+
path: `${basePath}.rejectedCandidateIds`,
|
|
71
|
+
message: "Conflict must define rejectedCandidateIds"
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
for (const rejected of conflict.rejectedCandidateIds) {
|
|
76
|
+
if (typeof rejected !== "string" || !candidateIds.includes(rejected)) {
|
|
77
|
+
errors.push({
|
|
78
|
+
code: "APS_GOV_CONFLICT_REJECTED_NOT_FOUND",
|
|
79
|
+
path: `${basePath}.rejectedCandidateIds`,
|
|
80
|
+
message: "All rejectedCandidateIds must reference existing candidates"
|
|
81
|
+
});
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
if (rejected === conflict.selectedCandidateId) {
|
|
85
|
+
errors.push({
|
|
86
|
+
code: "APS_GOV_CONFLICT_SELECTED_REJECTED_COLLISION",
|
|
87
|
+
path: `${basePath}.rejectedCandidateIds`,
|
|
88
|
+
message: "selectedCandidateId cannot appear in rejectedCandidateIds"
|
|
89
|
+
});
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (typeof conflict.explanation !== "string" || conflict.explanation.trim() === "") {
|
|
95
|
+
errors.push({
|
|
96
|
+
code: "APS_GOV_CONFLICT_EXPLANATION_REQUIRED",
|
|
97
|
+
path: `${basePath}.explanation`,
|
|
98
|
+
message: "Conflict resolution requires explanation"
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const rejectedCandidateIds = Array.isArray(conflict.rejectedCandidateIds)
|
|
102
|
+
? conflict.rejectedCandidateIds
|
|
103
|
+
: [];
|
|
104
|
+
if (rejectedCandidateIds.length > 0 &&
|
|
105
|
+
typeof conflict.selectedCandidateId === "string" &&
|
|
106
|
+
candidateIds.length > 0) {
|
|
107
|
+
const unresolved = candidateIds.filter((candidateId) => candidateId !== conflict.selectedCandidateId &&
|
|
108
|
+
!rejectedCandidateIds.includes(candidateId));
|
|
109
|
+
if (unresolved.length > 0) {
|
|
110
|
+
warnings.push({
|
|
111
|
+
code: "APS_GOV_CONFLICT_UNRESOLVED_CANDIDATES",
|
|
112
|
+
path: basePath,
|
|
113
|
+
message: `Conflict has candidates without explicit disposition: ${unresolved.join(", ")}`
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
errors,
|
|
121
|
+
warnings,
|
|
122
|
+
counters: {
|
|
123
|
+
governedFields: 0,
|
|
124
|
+
fieldsWithEvidence: 0,
|
|
125
|
+
fieldsWithProvenance: 0
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=conflict-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-validator.js","sourceRoot":"","sources":["../../../src/protocol/governance/conflict-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateEvidence = validateEvidence;
|
|
4
|
+
const json_1 = require("../../shared/json");
|
|
5
|
+
function getGovernance(resource) {
|
|
6
|
+
if (!(0, json_1.isObject)(resource.metadata)) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
const governance = resource.metadata.governance;
|
|
10
|
+
return (0, json_1.isObject)(governance) ? governance : {};
|
|
11
|
+
}
|
|
12
|
+
function getConflicts(resource) {
|
|
13
|
+
const governance = getGovernance(resource);
|
|
14
|
+
if (!Array.isArray(governance.conflicts)) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
return governance.conflicts.filter((item) => (0, json_1.isObject)(item));
|
|
18
|
+
}
|
|
19
|
+
function validateEvidence(resources) {
|
|
20
|
+
const errors = [];
|
|
21
|
+
const warnings = [];
|
|
22
|
+
let governedFields = 0;
|
|
23
|
+
let fieldsWithEvidence = 0;
|
|
24
|
+
let fieldsWithProvenance = 0;
|
|
25
|
+
for (let index = 0; index < resources.length; index += 1) {
|
|
26
|
+
const resource = resources[index];
|
|
27
|
+
const governance = getGovernance(resource);
|
|
28
|
+
const conflicts = getConflicts(resource);
|
|
29
|
+
const knownConflictIds = new Set(conflicts
|
|
30
|
+
.map((item) => (typeof item.id === "string" ? item.id : null))
|
|
31
|
+
.filter((item) => Boolean(item)));
|
|
32
|
+
if (!(0, json_1.isObject)(governance.fields)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
for (const [fieldName, fieldConfig] of Object.entries(governance.fields)) {
|
|
36
|
+
if (!(0, json_1.isObject)(fieldConfig)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
governedFields += 1;
|
|
40
|
+
const basePath = `resources[${index}].metadata.governance.fields.${fieldName}`;
|
|
41
|
+
const evidence = Array.isArray(fieldConfig.evidence)
|
|
42
|
+
? fieldConfig.evidence.filter((item) => (0, json_1.isObject)(item))
|
|
43
|
+
: [];
|
|
44
|
+
if (evidence.length > 0) {
|
|
45
|
+
fieldsWithEvidence += 1;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
errors.push({
|
|
49
|
+
code: "APS_GOV_TRACEABLE_EVIDENCE_REQUIRED",
|
|
50
|
+
path: basePath,
|
|
51
|
+
message: "Every governed field must define traceable evidence"
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const evidenceIds = new Set(evidence
|
|
55
|
+
.map((item) => (typeof item.evidenceId === "string" ? item.evidenceId : null))
|
|
56
|
+
.filter((item) => Boolean(item)));
|
|
57
|
+
const selectedEvidenceId = typeof fieldConfig.selectedEvidenceId === "string" ? fieldConfig.selectedEvidenceId : null;
|
|
58
|
+
if (selectedEvidenceId) {
|
|
59
|
+
if (evidenceIds.size === 0 || !evidenceIds.has(selectedEvidenceId)) {
|
|
60
|
+
errors.push({
|
|
61
|
+
code: "APS_GOV_SELECTED_EVIDENCE_NOT_FOUND",
|
|
62
|
+
path: `${basePath}.selectedEvidenceId`,
|
|
63
|
+
message: "selectedEvidenceId must reference an existing evidence entry"
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
fieldsWithProvenance += 1;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const conflictId = typeof fieldConfig.conflictId === "string" ? fieldConfig.conflictId : null;
|
|
71
|
+
if (conflictId && !knownConflictIds.has(conflictId)) {
|
|
72
|
+
errors.push({
|
|
73
|
+
code: "APS_GOV_CONFLICT_REFERENCE_MISSING",
|
|
74
|
+
path: `${basePath}.conflictId`,
|
|
75
|
+
message: "conflictId must reference an existing governance conflict"
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (!conflictId && evidence.length > 1) {
|
|
79
|
+
warnings.push({
|
|
80
|
+
code: "APS_GOV_MULTIPLE_EVIDENCE_NO_CONFLICT",
|
|
81
|
+
path: basePath,
|
|
82
|
+
message: "Multiple evidence entries found without explicit conflict linkage"
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
errors,
|
|
89
|
+
warnings,
|
|
90
|
+
counters: {
|
|
91
|
+
governedFields,
|
|
92
|
+
fieldsWithEvidence,
|
|
93
|
+
fieldsWithProvenance
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=evidence-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-validator.js","sourceRoot":"","sources":["../../../src/protocol/governance/evidence-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateIdentity = validateIdentity;
|
|
4
|
+
const json_1 = require("../../shared/json");
|
|
5
|
+
const RESOURCE_ID_PATTERN = /^[a-z0-9]+(?:\.[a-z0-9]+){3,}$/;
|
|
6
|
+
function getRetiredIds(manifest) {
|
|
7
|
+
const metadata = manifest.metadata;
|
|
8
|
+
if (!(0, json_1.isObject)(metadata)) {
|
|
9
|
+
return new Set();
|
|
10
|
+
}
|
|
11
|
+
const governance = metadata.governance;
|
|
12
|
+
if (!(0, json_1.isObject)(governance) || !Array.isArray(governance.retiredResourceIds)) {
|
|
13
|
+
return new Set();
|
|
14
|
+
}
|
|
15
|
+
return new Set(governance.retiredResourceIds.filter((item) => typeof item === "string" && item.trim() !== ""));
|
|
16
|
+
}
|
|
17
|
+
function validateIdentity(resources, manifest) {
|
|
18
|
+
const errors = [];
|
|
19
|
+
const warnings = [];
|
|
20
|
+
const seenIds = new Map();
|
|
21
|
+
const retiredIds = getRetiredIds(manifest);
|
|
22
|
+
for (let index = 0; index < resources.length; index += 1) {
|
|
23
|
+
const resource = resources[index];
|
|
24
|
+
const basePath = `resources[${index}].id`;
|
|
25
|
+
if (typeof resource.id !== "string" || resource.id.trim() === "") {
|
|
26
|
+
warnings.push({
|
|
27
|
+
code: "APS_GOV_RESOURCE_ID_RECOMMENDED",
|
|
28
|
+
path: basePath,
|
|
29
|
+
message: "Resource id is strongly recommended for governance"
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const id = resource.id.trim();
|
|
34
|
+
if (!RESOURCE_ID_PATTERN.test(id)) {
|
|
35
|
+
errors.push({
|
|
36
|
+
code: "APS_GOV_INVALID_RESOURCE_ID_FORMAT",
|
|
37
|
+
path: basePath,
|
|
38
|
+
message: "Resource id must match org.domain.resourceType.resourceName in lowercase"
|
|
39
|
+
});
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const segments = id.split(".");
|
|
43
|
+
if (segments.length >= 3 && typeof resource.type === "string" && segments[2] !== resource.type) {
|
|
44
|
+
warnings.push({
|
|
45
|
+
code: "APS_GOV_RESOURCE_ID_TYPE_MISMATCH",
|
|
46
|
+
path: basePath,
|
|
47
|
+
message: `Resource id type segment '${segments[2]}' does not match resource.type '${resource.type}'`
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (seenIds.has(id)) {
|
|
51
|
+
const firstIndex = seenIds.get(id) ?? 0;
|
|
52
|
+
errors.push({
|
|
53
|
+
code: "APS_GOV_DUPLICATE_RESOURCE_ID",
|
|
54
|
+
path: basePath,
|
|
55
|
+
message: `Duplicate resource id also found at resources[${firstIndex}]`
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
seenIds.set(id, index);
|
|
60
|
+
}
|
|
61
|
+
if (retiredIds.has(id)) {
|
|
62
|
+
errors.push({
|
|
63
|
+
code: "APS_GOV_RECYCLED_RESOURCE_ID",
|
|
64
|
+
path: basePath,
|
|
65
|
+
message: "Resource id is recycled from retiredResourceIds"
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
errors,
|
|
71
|
+
warnings,
|
|
72
|
+
counters: {
|
|
73
|
+
governedFields: 0,
|
|
74
|
+
fieldsWithEvidence: 0,
|
|
75
|
+
fieldsWithProvenance: 0
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=identity-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-validator.js","sourceRoot":"","sources":["../../../src/protocol/governance/identity-validator.ts"],"names":[],"mappings":"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"}
|