@standards-kit/conform 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.
Files changed (71) hide show
  1. package/dist/artifactregistry-QQWBMEQN.js +38 -0
  2. package/dist/artifactregistry-QQWBMEQN.js.map +1 -0
  3. package/dist/chunk-J5S6GRGW.js +314 -0
  4. package/dist/chunk-J5S6GRGW.js.map +1 -0
  5. package/dist/chunk-KHO6NIAI.js +1367 -0
  6. package/dist/chunk-KHO6NIAI.js.map +1 -0
  7. package/dist/chunk-M7G73Q6P.js +662 -0
  8. package/dist/chunk-M7G73Q6P.js.map +1 -0
  9. package/dist/chunk-P7TIZJ4C.js +85 -0
  10. package/dist/chunk-P7TIZJ4C.js.map +1 -0
  11. package/dist/chunk-RXA4FO7L.js +279 -0
  12. package/dist/chunk-RXA4FO7L.js.map +1 -0
  13. package/dist/cli.js +7432 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/cloudrun-O36R23SH.js +31 -0
  16. package/dist/cloudrun-O36R23SH.js.map +1 -0
  17. package/dist/cloudwatch-KSZ4A256.js +56 -0
  18. package/dist/cloudwatch-KSZ4A256.js.map +1 -0
  19. package/dist/dynamodb-5KVESCVJ.js +51 -0
  20. package/dist/dynamodb-5KVESCVJ.js.map +1 -0
  21. package/dist/ec2-HKPE6GZV.js +151 -0
  22. package/dist/ec2-HKPE6GZV.js.map +1 -0
  23. package/dist/ecs-OS3NJZTA.js +141 -0
  24. package/dist/ecs-OS3NJZTA.js.map +1 -0
  25. package/dist/elasticache-7TCRHYYM.js +151 -0
  26. package/dist/elasticache-7TCRHYYM.js.map +1 -0
  27. package/dist/elb-PEDLXW5R.js +151 -0
  28. package/dist/elb-PEDLXW5R.js.map +1 -0
  29. package/dist/generate-D4MFMOHP.js +28 -0
  30. package/dist/generate-D4MFMOHP.js.map +1 -0
  31. package/dist/iam-7H5HFWVQ.js +96 -0
  32. package/dist/iam-7H5HFWVQ.js.map +1 -0
  33. package/dist/iam-DJI64AGK.js +39 -0
  34. package/dist/iam-DJI64AGK.js.map +1 -0
  35. package/dist/index.js +7980 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/infra-UXM5XQX3.js +566 -0
  38. package/dist/infra-UXM5XQX3.js.map +1 -0
  39. package/dist/lambda-NFB5UILT.js +60 -0
  40. package/dist/lambda-NFB5UILT.js.map +1 -0
  41. package/dist/manifest-7AIL2FK2.js +23 -0
  42. package/dist/manifest-7AIL2FK2.js.map +1 -0
  43. package/dist/mcp-O5O7XVFG.js +204 -0
  44. package/dist/mcp-O5O7XVFG.js.map +1 -0
  45. package/dist/rds-KLG5O5SI.js +151 -0
  46. package/dist/rds-KLG5O5SI.js.map +1 -0
  47. package/dist/registry-V65CC7IN.js +15 -0
  48. package/dist/registry-V65CC7IN.js.map +1 -0
  49. package/dist/s3-2DH7PRVR.js +49 -0
  50. package/dist/s3-2DH7PRVR.js.map +1 -0
  51. package/dist/scan-EELS42BP.js +593 -0
  52. package/dist/scan-EELS42BP.js.map +1 -0
  53. package/dist/secretmanager-RDL62EFW.js +31 -0
  54. package/dist/secretmanager-RDL62EFW.js.map +1 -0
  55. package/dist/secretsmanager-MOOIHLAO.js +50 -0
  56. package/dist/secretsmanager-MOOIHLAO.js.map +1 -0
  57. package/dist/sns-Y36LVTWA.js +50 -0
  58. package/dist/sns-Y36LVTWA.js.map +1 -0
  59. package/dist/sqs-RRS3GRHK.js +61 -0
  60. package/dist/sqs-RRS3GRHK.js.map +1 -0
  61. package/dist/src-KZRTG3EU.js +45 -0
  62. package/dist/src-KZRTG3EU.js.map +1 -0
  63. package/dist/standards-RXK5G4IG.js +37 -0
  64. package/dist/standards-RXK5G4IG.js.map +1 -0
  65. package/dist/sync-RLYBGYNY.js +877 -0
  66. package/dist/sync-RLYBGYNY.js.map +1 -0
  67. package/dist/validate-AABLVQJS.js +327 -0
  68. package/dist/validate-AABLVQJS.js.map +1 -0
  69. package/dist/validator-6PL5I5EC.js +156 -0
  70. package/dist/validator-6PL5I5EC.js.map +1 -0
  71. package/package.json +91 -0
@@ -0,0 +1,156 @@
1
+ // src/process/sync/validator.ts
2
+ import { execa } from "execa";
3
+ var VALID_REPO_ROLE_IDS = {
4
+ 1: "Read",
5
+ 2: "Triage",
6
+ 3: "Write",
7
+ 4: "Maintain",
8
+ 5: "Admin"
9
+ };
10
+ async function validateBypassActors(repoInfo, actors) {
11
+ const errors = [];
12
+ const warnings = [];
13
+ for (const actor of actors) {
14
+ const error = await validateSingleActor(repoInfo, actor);
15
+ if (error) {
16
+ errors.push({ actor, error });
17
+ }
18
+ }
19
+ const hasAdmin = actors.some((a) => a.actor_type === "RepositoryRole" && a.actor_id === 5);
20
+ if (hasAdmin) {
21
+ warnings.push(
22
+ "Warning: Repository Admin role (ID 5) can bypass rules. Consider if this is intended."
23
+ );
24
+ }
25
+ return {
26
+ valid: errors.length === 0,
27
+ errors,
28
+ warnings
29
+ };
30
+ }
31
+ async function validateSingleActor(repoInfo, actor) {
32
+ switch (actor.actor_type) {
33
+ case "RepositoryRole":
34
+ return validateRepositoryRole(actor);
35
+ case "OrganizationAdmin":
36
+ return null;
37
+ case "Team":
38
+ return validateTeam(repoInfo, actor);
39
+ case "Integration":
40
+ return validateIntegration(repoInfo, actor);
41
+ case "DeployKey":
42
+ return validateDeployKey(repoInfo, actor);
43
+ default:
44
+ return `Unknown actor type: ${actor.actor_type}`;
45
+ }
46
+ }
47
+ function validateRepositoryRole(actor) {
48
+ if (actor.actor_id === void 0) {
49
+ return "RepositoryRole requires an actor_id (1=Read, 2=Triage, 3=Write, 4=Maintain, 5=Admin)";
50
+ }
51
+ const roleName = VALID_REPO_ROLE_IDS[actor.actor_id];
52
+ if (!roleName) {
53
+ return `Invalid RepositoryRole ID: ${actor.actor_id}. Valid IDs: 1=Read, 2=Triage, 3=Write, 4=Maintain, 5=Admin`;
54
+ }
55
+ return null;
56
+ }
57
+ async function validateTeam(repoInfo, actor) {
58
+ if (actor.actor_id === void 0) {
59
+ return "Team requires an actor_id (the team's numeric ID)";
60
+ }
61
+ try {
62
+ await execa("gh", [
63
+ "api",
64
+ `orgs/${repoInfo.owner}/teams`,
65
+ "--jq",
66
+ `.[] | select(.id == ${actor.actor_id})`
67
+ ]);
68
+ return null;
69
+ } catch (error) {
70
+ const msg = error instanceof Error ? error.message : String(error);
71
+ if (msg.includes("404") || msg.includes("Not Found")) {
72
+ return `Team with ID ${actor.actor_id} not found in organization '${repoInfo.owner}'`;
73
+ }
74
+ if (msg.includes("403")) {
75
+ return null;
76
+ }
77
+ return `Failed to validate team: ${msg}`;
78
+ }
79
+ }
80
+ async function validateIntegration(repoInfo, actor) {
81
+ if (actor.actor_id === void 0) {
82
+ return "Integration requires an actor_id (the GitHub App installation ID)";
83
+ }
84
+ try {
85
+ const result = await execa("gh", [
86
+ "api",
87
+ `orgs/${repoInfo.owner}/installations`,
88
+ "--jq",
89
+ `.installations[] | select(.id == ${actor.actor_id}) | .id`
90
+ ]);
91
+ if (!result.stdout.trim()) {
92
+ const repoResult = await execa("gh", [
93
+ "api",
94
+ `repos/${repoInfo.owner}/${repoInfo.repo}/installation`,
95
+ "--jq",
96
+ ".id"
97
+ ]).catch(() => ({ stdout: "" }));
98
+ if (repoResult.stdout.trim() !== String(actor.actor_id)) {
99
+ return `GitHub App installation with ID ${actor.actor_id} not found`;
100
+ }
101
+ }
102
+ return null;
103
+ } catch (error) {
104
+ const msg = error instanceof Error ? error.message : String(error);
105
+ if (msg.includes("404") || msg.includes("Not Found")) {
106
+ return `GitHub App installation with ID ${actor.actor_id} not found`;
107
+ }
108
+ if (msg.includes("403")) {
109
+ return null;
110
+ }
111
+ return `Failed to validate integration: ${msg}`;
112
+ }
113
+ }
114
+ async function validateDeployKey(repoInfo, actor) {
115
+ if (actor.actor_id === void 0) {
116
+ return "DeployKey requires an actor_id (the deploy key's numeric ID)";
117
+ }
118
+ try {
119
+ await execa("gh", ["api", `repos/${repoInfo.owner}/${repoInfo.repo}/keys/${actor.actor_id}`]);
120
+ return null;
121
+ } catch (error) {
122
+ const msg = error instanceof Error ? error.message : String(error);
123
+ if (msg.includes("404") || msg.includes("Not Found")) {
124
+ return `Deploy key with ID ${actor.actor_id} not found in repository`;
125
+ }
126
+ if (msg.includes("403")) {
127
+ return null;
128
+ }
129
+ return `Failed to validate deploy key: ${msg}`;
130
+ }
131
+ }
132
+ function formatValidationResult(result) {
133
+ const lines = [];
134
+ if (result.valid) {
135
+ lines.push("All bypass actors are valid.");
136
+ } else {
137
+ lines.push("Bypass actor validation failed:");
138
+ for (const { actor, error } of result.errors) {
139
+ lines.push(
140
+ ` - ${actor.actor_type}${actor.actor_id ? ` (ID: ${actor.actor_id})` : ""}: ${error}`
141
+ );
142
+ }
143
+ }
144
+ if (result.warnings.length > 0) {
145
+ lines.push("");
146
+ for (const warning of result.warnings) {
147
+ lines.push(warning);
148
+ }
149
+ }
150
+ return lines.join("\n");
151
+ }
152
+ export {
153
+ formatValidationResult,
154
+ validateBypassActors
155
+ };
156
+ //# sourceMappingURL=validator-6PL5I5EC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/process/sync/validator.ts"],"sourcesContent":["import { execa } from \"execa\";\n\nimport { type RepoInfo } from \"./types.js\";\n\n/** Bypass actor configuration from standards.toml */\nexport interface BypassActorConfig {\n actor_type: \"Integration\" | \"OrganizationAdmin\" | \"RepositoryRole\" | \"Team\" | \"DeployKey\";\n actor_id?: number;\n bypass_mode?: \"always\" | \"pull_request\";\n}\n\n/** Validation error for a single actor */\nexport interface ActorValidationError {\n actor: BypassActorConfig;\n error: string;\n}\n\n/** Result of validating bypass actors */\nexport interface ValidationResult {\n valid: boolean;\n errors: ActorValidationError[];\n warnings: string[];\n}\n\n/** Valid repository role IDs */\nconst VALID_REPO_ROLE_IDS: Record<number, string> = {\n 1: \"Read\",\n 2: \"Triage\",\n 3: \"Write\",\n 4: \"Maintain\",\n 5: \"Admin\",\n};\n\n/** Validate bypass actors against GitHub API */\nexport async function validateBypassActors(\n repoInfo: RepoInfo,\n actors: BypassActorConfig[]\n): Promise<ValidationResult> {\n const errors: ActorValidationError[] = [];\n const warnings: string[] = [];\n\n for (const actor of actors) {\n const error = await validateSingleActor(repoInfo, actor);\n if (error) {\n errors.push({ actor, error });\n }\n }\n\n // Add warnings for common issues\n const hasAdmin = actors.some((a) => a.actor_type === \"RepositoryRole\" && a.actor_id === 5);\n if (hasAdmin) {\n warnings.push(\n \"Warning: Repository Admin role (ID 5) can bypass rules. Consider if this is intended.\"\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/** Validate a single bypass actor */\nasync function validateSingleActor(\n repoInfo: RepoInfo,\n actor: BypassActorConfig\n): Promise<string | null> {\n switch (actor.actor_type) {\n case \"RepositoryRole\":\n return validateRepositoryRole(actor);\n\n case \"OrganizationAdmin\":\n // OrganizationAdmin doesn't require an actor_id\n return null;\n\n case \"Team\":\n return validateTeam(repoInfo, actor);\n\n case \"Integration\":\n return validateIntegration(repoInfo, actor);\n\n case \"DeployKey\":\n return validateDeployKey(repoInfo, actor);\n\n default:\n return `Unknown actor type: ${actor.actor_type}`;\n }\n}\n\n/** Validate RepositoryRole actor */\nfunction validateRepositoryRole(actor: BypassActorConfig): string | null {\n if (actor.actor_id === undefined) {\n return \"RepositoryRole requires an actor_id (1=Read, 2=Triage, 3=Write, 4=Maintain, 5=Admin)\";\n }\n\n const roleName = VALID_REPO_ROLE_IDS[actor.actor_id];\n if (!roleName) {\n return `Invalid RepositoryRole ID: ${actor.actor_id}. Valid IDs: 1=Read, 2=Triage, 3=Write, 4=Maintain, 5=Admin`;\n }\n\n return null;\n}\n\n/** Validate Team actor by checking if team exists */\nasync function validateTeam(repoInfo: RepoInfo, actor: BypassActorConfig): Promise<string | null> {\n if (actor.actor_id === undefined) {\n return \"Team requires an actor_id (the team's numeric ID)\";\n }\n\n try {\n // Try to fetch the team - requires org membership\n await execa(\"gh\", [\n \"api\",\n `orgs/${repoInfo.owner}/teams`,\n \"--jq\",\n `.[] | select(.id == ${actor.actor_id})`,\n ]);\n return null;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes(\"404\") || msg.includes(\"Not Found\")) {\n return `Team with ID ${actor.actor_id} not found in organization '${repoInfo.owner}'`;\n }\n\n if (msg.includes(\"403\")) {\n // Can't validate due to permissions, but don't fail\n return null;\n }\n\n return `Failed to validate team: ${msg}`;\n }\n}\n\n/** Validate Integration (GitHub App) actor */\nasync function validateIntegration(\n repoInfo: RepoInfo,\n actor: BypassActorConfig\n): Promise<string | null> {\n if (actor.actor_id === undefined) {\n return \"Integration requires an actor_id (the GitHub App installation ID)\";\n }\n\n try {\n // Try to list installations and find the one with matching ID\n const result = await execa(\"gh\", [\n \"api\",\n `orgs/${repoInfo.owner}/installations`,\n \"--jq\",\n `.installations[] | select(.id == ${actor.actor_id}) | .id`,\n ]);\n\n if (!result.stdout.trim()) {\n // Also try repo-level installations for non-org repos\n const repoResult = await execa(\"gh\", [\n \"api\",\n `repos/${repoInfo.owner}/${repoInfo.repo}/installation`,\n \"--jq\",\n \".id\",\n ]).catch(() => ({ stdout: \"\" }));\n\n if (repoResult.stdout.trim() !== String(actor.actor_id)) {\n return `GitHub App installation with ID ${actor.actor_id} not found`;\n }\n }\n\n return null;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes(\"404\") || msg.includes(\"Not Found\")) {\n return `GitHub App installation with ID ${actor.actor_id} not found`;\n }\n\n if (msg.includes(\"403\")) {\n // Can't validate due to permissions, but don't fail\n return null;\n }\n\n return `Failed to validate integration: ${msg}`;\n }\n}\n\n/** Validate DeployKey actor */\nasync function validateDeployKey(\n repoInfo: RepoInfo,\n actor: BypassActorConfig\n): Promise<string | null> {\n if (actor.actor_id === undefined) {\n return \"DeployKey requires an actor_id (the deploy key's numeric ID)\";\n }\n\n try {\n await execa(\"gh\", [\"api\", `repos/${repoInfo.owner}/${repoInfo.repo}/keys/${actor.actor_id}`]);\n return null;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes(\"404\") || msg.includes(\"Not Found\")) {\n return `Deploy key with ID ${actor.actor_id} not found in repository`;\n }\n\n if (msg.includes(\"403\")) {\n // Can't validate due to permissions, but don't fail\n return null;\n }\n\n return `Failed to validate deploy key: ${msg}`;\n }\n}\n\n/** Format validation result for display */\nexport function formatValidationResult(result: ValidationResult): string {\n const lines: string[] = [];\n\n if (result.valid) {\n lines.push(\"All bypass actors are valid.\");\n } else {\n lines.push(\"Bypass actor validation failed:\");\n for (const { actor, error } of result.errors) {\n lines.push(\n ` - ${actor.actor_type}${actor.actor_id ? ` (ID: ${actor.actor_id})` : \"\"}: ${error}`\n );\n }\n }\n\n if (result.warnings.length > 0) {\n lines.push(\"\");\n for (const warning of result.warnings) {\n lines.push(warning);\n }\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@standards-kit/conform",
3
+ "version": "0.1.0",
4
+ "description": "Standards conformance checking - in-repo enforcement CLI",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "conform": "dist/cli.js"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "start": "node dist/cli.js",
22
+ "test": "vitest run tests/unit/",
23
+ "test:unit": "vitest run tests/unit/",
24
+ "test:watch": "vitest tests/unit/",
25
+ "test:coverage": "vitest run tests/unit/ --coverage",
26
+ "test:e2e": "vitest run tests/e2e/",
27
+ "test:all": "vitest run",
28
+ "typecheck": "tsc --noEmit",
29
+ "lint": "eslint src"
30
+ },
31
+ "keywords": [
32
+ "linting",
33
+ "code-quality",
34
+ "standards",
35
+ "process",
36
+ "ci",
37
+ "cli"
38
+ ],
39
+ "author": "",
40
+ "license": "MIT",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/chrismlittle123/standards-kit.git",
47
+ "directory": "packages/conform"
48
+ },
49
+ "engines": {
50
+ "node": ">=18"
51
+ },
52
+ "dependencies": {
53
+ "@iarna/toml": "^2.2.5",
54
+ "minimatch": "^10.1.1",
55
+ "zod": "^3.24.1",
56
+ "@aws-sdk/client-cloudwatch-logs": "^3.974.0",
57
+ "@aws-sdk/client-dynamodb": "^3.974.0",
58
+ "@aws-sdk/client-ec2": "^3.975.0",
59
+ "@aws-sdk/client-ecs": "^3.975.0",
60
+ "@aws-sdk/client-elastic-load-balancing-v2": "^3.975.0",
61
+ "@aws-sdk/client-elasticache": "^3.975.0",
62
+ "@aws-sdk/client-iam": "^3.974.0",
63
+ "@aws-sdk/client-lambda": "^3.974.0",
64
+ "@aws-sdk/client-rds": "^3.975.0",
65
+ "@aws-sdk/client-s3": "^3.967.0",
66
+ "@aws-sdk/client-secrets-manager": "^3.974.0",
67
+ "@aws-sdk/client-sns": "^3.974.0",
68
+ "@aws-sdk/client-sqs": "^3.974.0",
69
+ "@google-cloud/artifact-registry": "^4.6.0",
70
+ "@google-cloud/run": "^3.1.0",
71
+ "@google-cloud/secret-manager": "^6.1.1",
72
+ "@modelcontextprotocol/sdk": "^1.25.3",
73
+ "chalk": "^5.6.2",
74
+ "commander": "^13.0.0",
75
+ "execa": "^9.6.1",
76
+ "glob": "^13.0.0",
77
+ "google-auth-library": "^10.5.0",
78
+ "gray-matter": "^4.0.3",
79
+ "js-yaml": "^4.1.1",
80
+ "zod-to-json-schema": "^3.25.1"
81
+ },
82
+ "devDependencies": {
83
+ "@types/js-yaml": "^4.0.9",
84
+ "@types/node": "^22.10.2",
85
+ "@vitest/coverage-v8": "^2.1.9",
86
+ "aws-sdk-client-mock": "^4.1.0",
87
+ "tsup": "^8.0.0",
88
+ "typescript": "^5.4.0",
89
+ "vitest": "^2.1.8"
90
+ }
91
+ }