{"_id":"@bernierllc/validators-ci-workflow","_rev":"7-dfc741027df0953c0949d91c6fa3d39f","name":"@bernierllc/validators-ci-workflow","dist-tags":{"latest":"1.5.0"},"versions":{"1.0.0":{"name":"@bernierllc/validators-ci-workflow","version":"1.0.0","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-ci-workflow@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"50afaf4a5efdd9928e42be413210867507e88c82","tarball":"https://registry.npmjs.org/@bernierllc/validators-ci-workflow/-/validators-ci-workflow-1.0.0.tgz","fileCount":31,"integrity":"sha512-gcdatDO2GahS1vMKHckDWqEZivPSbvogovZZSxbBTeaH6YMRbLr5YRnjOoalX0z+kClRjE0slpThOaslicvBJg==","signatures":[{"sig":"MEUCIQCYOgmvrnuiZDA6jMzYdj2bPL+0ATghYVGyj4zetWcEeQIgZktcxiR99GWIek4tR/D0zGur6j1IW6RDAVRszgJnCug=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107165},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"c615c66f67e9dd83810a648e223eed604a44d652","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","typecheck":"tsc --noEmit","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/validators/validators-ci-workflow"},"_npmVersion":"11.4.2","description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@bernierllc/validators-core":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","js-yaml":"^4.1.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-ci-workflow_1.0.0_1760289778717_0.6938153416190704","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/validators-ci-workflow","version":"1.2.0","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-ci-workflow@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"39f37191405b68569ba2cb89d7758b2e0a30648b","tarball":"https://registry.npmjs.org/@bernierllc/validators-ci-workflow/-/validators-ci-workflow-1.2.0.tgz","fileCount":31,"integrity":"sha512-fzASAy1jTn3l/dhCqJMiXfR6XAHBOXVQK/xc1TASiAbuNG6ip0kfz3jmzhehRzDayJCD+UOD9QPPaPa7C5CY7g==","signatures":[{"sig":"MEQCIAzsz23A0p6Etu6r1nKdnSozpQDTie7v9xZgpiHGGKAqAiBiNpGCcq9cOolvCr2HALq1tY2VBs5gdQWB4zZH1O488Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107268},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","typecheck":"tsc --noEmit","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3c4ae5e7-b992-4321-8bf6-f0bc7915c8b1"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/validators/validators-ci-workflow"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@bernierllc/validators-core":"0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","js-yaml":"^4.1.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-ci-workflow_1.2.0_1767642360877_0.051997987969564674","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bernierllc/validators-ci-workflow","version":"1.2.1","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-ci-workflow@1.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"9db8846263ab24daf25208ff3423c75c5436b3d2","tarball":"https://registry.npmjs.org/@bernierllc/validators-ci-workflow/-/validators-ci-workflow-1.2.1.tgz","fileCount":31,"integrity":"sha512-A/RUn1d7y64HlklfxTkX+aq0EllYtFkqiZci/DeycmZDpg8uu5vfsFTHzPhzKEGkRNlC90sp0TB9oyJ7Ow6bCA==","signatures":[{"sig":"MEYCIQDoGRuhx7fvLK9sdTPr3wZa3aEV17w5T4MWtPYDl8OLLQIhAJg0omncgNL4juWm3+kvW4hRdwqbO41/VdWHrEjWqkAv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107210},"main":"./dist/index.js","type":"module","_from":"file:bernierllc-validators-ci-workflow-1.2.1.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","typecheck":"tsc --noEmit","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3c4ae5e7-b992-4321-8bf6-f0bc7915c8b1"}},"_resolved":"/tmp/578dd5d5937c507e32b3ebdb00ca64ae/bernierllc-validators-ci-workflow-1.2.1.tgz","_integrity":"sha512-A/RUn1d7y64HlklfxTkX+aq0EllYtFkqiZci/DeycmZDpg8uu5vfsFTHzPhzKEGkRNlC90sp0TB9oyJ7Ow6bCA==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/validators/validators-ci-workflow"},"_npmVersion":"11.11.0","description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","js-yaml":"^4.1.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-ci-workflow_1.2.1_1773078267838_0.29610840144446304","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/validators-ci-workflow","version":"1.2.2","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-ci-workflow@1.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"c16a5fd3b11b821b34d2a8e8d34be79e1f627123","tarball":"https://registry.npmjs.org/@bernierllc/validators-ci-workflow/-/validators-ci-workflow-1.2.2.tgz","fileCount":31,"integrity":"sha512-C7YUIMp8c0STY9ThQSIOkqExPu+6C3BECjJDcA31xkuaGpbsSd+wFJoWzwk8fAHxE73/RNbl4oc7CmdPidwLUA==","signatures":[{"sig":"MEQCIHXO6PnGxknugMOouBjsWHm1SR6P5TJXvXpiqJPZFDTtAiBngqi5e2SyMcJr+qfMLPimq/qOA2tWlYuA09BhnwSvbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107210},"main":"./dist/index.js","type":"module","_from":"file:bernierllc-validators-ci-workflow-1.2.2.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","typecheck":"tsc --noEmit","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3c4ae5e7-b992-4321-8bf6-f0bc7915c8b1"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-ci-workflow/bernierllc-validators-ci-workflow-1.2.2.tgz","_integrity":"sha512-C7YUIMp8c0STY9ThQSIOkqExPu+6C3BECjJDcA31xkuaGpbsSd+wFJoWzwk8fAHxE73/RNbl4oc7CmdPidwLUA==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/validators/validators-ci-workflow"},"_npmVersion":"11.11.0","description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","js-yaml":"^4.1.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-ci-workflow_1.2.2_1773163883799_0.6946574997464052","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/validators-ci-workflow","version":"1.3.0","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-ci-workflow@1.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"034611dffdca77a0a18ada567edf0a0f1b318419","tarball":"https://registry.npmjs.org/@bernierllc/validators-ci-workflow/-/validators-ci-workflow-1.3.0.tgz","fileCount":31,"integrity":"sha512-jmmN0ExGn7zc9dQPkscaPhRxi2UtEFdilfHfkTirH44pmylqjoM9pIAiQCVeXwuek3Reyyse4stvzId1c68ZAw==","signatures":[{"sig":"MEQCID8qNcCPB6QKKDcpox+ebhZmhKZUTO0nF3Xgz5T+F25sAiB1c37c4Inj0w4wLjUFYX0HUAQyJH7/pJPEAnx2bbB6vg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107210},"main":"./dist/index.js","type":"module","_from":"file:bernierllc-validators-ci-workflow-1.3.0.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","typecheck":"tsc --noEmit","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3c4ae5e7-b992-4321-8bf6-f0bc7915c8b1"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-ci-workflow/bernierllc-validators-ci-workflow-1.3.0.tgz","_integrity":"sha512-jmmN0ExGn7zc9dQPkscaPhRxi2UtEFdilfHfkTirH44pmylqjoM9pIAiQCVeXwuek3Reyyse4stvzId1c68ZAw==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/validators/validators-ci-workflow"},"_npmVersion":"11.14.1","description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","js-yaml":"^4.1.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-ci-workflow_1.3.0_1779242114359_0.996962009873176","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/validators-ci-workflow","version":"1.4.0","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-ci-workflow@1.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"ab03794595cd76f6673f7fb3c3b38316b2901f44","tarball":"https://registry.npmjs.org/@bernierllc/validators-ci-workflow/-/validators-ci-workflow-1.4.0.tgz","fileCount":31,"integrity":"sha512-669oYLMNnxlVg6DeolDJ8eJVtrem9T8MgwTcE0Nqb1cYmJlWKx12MELxebZ+jdsSiGoBNjNs6u/MnsKsPz2X0A==","signatures":[{"sig":"MEYCIQCH6DBD3WM0pXvJdreoGWFHIQFuZbrsU47iGg/nDISR3gIhAMRtA06BrnbQBvkduAUeg+vYaqmFyLUj/pAwwfvpH8vD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107210},"main":"./dist/index.js","type":"module","_from":"file:bernierllc-validators-ci-workflow-1.4.0.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","typecheck":"tsc --noEmit","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3c4ae5e7-b992-4321-8bf6-f0bc7915c8b1"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-ci-workflow/bernierllc-validators-ci-workflow-1.4.0.tgz","_integrity":"sha512-669oYLMNnxlVg6DeolDJ8eJVtrem9T8MgwTcE0Nqb1cYmJlWKx12MELxebZ+jdsSiGoBNjNs6u/MnsKsPz2X0A==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/validators/validators-ci-workflow"},"_npmVersion":"11.14.1","description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.40.0","js-yaml":"^4.1.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/js-yaml":"^4.0.9","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-ci-workflow_1.4.0_1779250870787_0.5135480732516762","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/validators-ci-workflow","version":"1.5.0","description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","dependencies":{"@bernierllc/validators-core":"0.4.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/js-yaml":"^4.0.9","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.40.0","jest":"^29.5.0","js-yaml":"^4.1.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"repository":{"type":"git","url":"git+https://github.com/BernierLLC/tools.git","directory":"packages/validators/validators-ci-workflow"},"scripts":{"build":"tsc","clean":"rm -rf dist","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","typecheck":"tsc --noEmit"},"_id":"@bernierllc/validators-ci-workflow@1.5.0","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"homepage":"https://github.com/BernierLLC/tools#readme","_integrity":"sha512-NvDSdXxgHoHMDYhn/wBmdvqoI0rVqRJdi4jrmQnORo8KkMWQZeDM9HmQdriMcxkQi3nQH0O/j2Gf3EIh3TlIeA==","_resolved":"/home/runner/work/tools/tools/packages/validators/validators-ci-workflow/bernierllc-validators-ci-workflow-1.5.0.tgz","_from":"file:bernierllc-validators-ci-workflow-1.5.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-NvDSdXxgHoHMDYhn/wBmdvqoI0rVqRJdi4jrmQnORo8KkMWQZeDM9HmQdriMcxkQi3nQH0O/j2Gf3EIh3TlIeA==","shasum":"5fd8fbfe4f2f610a165e1b84d5b63231d5056e33","tarball":"https://registry.npmjs.org/@bernierllc/validators-ci-workflow/-/validators-ci-workflow-1.5.0.tgz","fileCount":35,"unpackedSize":110036,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDMlMvgofWvgd9dNAFCm0N0O2uaB0eNad/XW74aZ0joLgIhAKR3oJqKfNDB7K4QN2YQ6dp4DspL2uPS3cWY80VC1i9s"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3c4ae5e7-b992-4321-8bf6-f0bc7915c8b1"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/validators-ci-workflow_1.5.0_1779252161205_0.26380318782210965"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-12T17:22:58.630Z","modified":"2026-05-20T04:42:41.507Z","1.0.0":"2025-10-12T17:22:58.919Z","1.2.0":"2026-01-05T19:46:01.046Z","1.2.1":"2026-03-09T17:44:27.997Z","1.2.2":"2026-03-10T17:31:23.967Z","1.3.0":"2026-05-20T01:55:14.501Z","1.4.0":"2026-05-20T04:21:10.937Z","1.5.0":"2026-05-20T04:42:41.344Z"},"bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"author":{"name":"Bernier LLC"},"license":"UNLICENSED","homepage":"https://github.com/BernierLLC/tools#readme","keywords":["validator","ci","cd","github-actions","workflow","validation","primitive","bernierllc"],"repository":{"type":"git","url":"git+https://github.com/BernierLLC/tools.git","directory":"packages/validators/validators-ci-workflow"},"description":"Primitive validator for CI/CD workflow validation - GitHub Actions cache, secrets, matrix strategies, and triggers","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/validators-ci-workflow\n\nPrimitive validator for GitHub Actions CI/CD workflow validation including cache configuration, secrets handling, matrix strategies, triggers, and job dependencies.\n\n## Installation\n\n```bash\nnpm install @bernierllc/validators-ci-workflow\n```\n\n## Overview\n\nThis validator provides comprehensive validation for GitHub Actions workflows, ensuring best practices for:\n\n- **Cache Configuration** - Validates cache keys, paths, and restore strategies\n- **Secrets Handling** - Detects insecure secret usage and potential exposure\n- **Matrix Strategies** - Validates matrix job configurations and limits\n- **Workflow Triggers** - Ensures proper trigger configuration\n- **Job Dependencies** - Detects circular dependencies and validates job chains\n\n## Usage\n\n### Basic Validation\n\n```typescript\nimport { validateCIWorkflow } from '@bernierllc/validators-ci-workflow';\n\nconst workflowContent = JSON.stringify({\n  name: 'CI',\n  on: { push: { branches: ['main'] } },\n  jobs: {\n    test: {\n      'runs-on': 'ubuntu-latest',\n      steps: [{ uses: 'actions/checkout@v3' }]\n    }\n  }\n});\n\nconst problems = await validateCIWorkflow(workflowContent);\n\nif (problems.length === 0) {\n  console.log('✓ Workflow validation passed');\n} else {\n  problems.forEach(p => {\n    console.log(`${p.severity}: ${p.message} [${p.ruleId}]`);\n  });\n}\n```\n\n### Validate Specific Aspects\n\n```typescript\nimport {\n  hasValidCacheConfig,\n  hasSecureSecretsHandling,\n  validateMatrixStrategy,\n  validateWorkflowTriggers,\n  validateJobDependencies,\n} from '@bernierllc/validators-ci-workflow';\n\n// Check cache configuration\nconst workflow = {\n  jobs: {\n    build: {\n      steps: [\n        {\n          uses: 'actions/cache@v3',\n          with: {\n            key: 'node-${{ hashFiles(\\'**/package-lock.json\\') }}',\n            path: 'node_modules'\n          }\n        }\n      ]\n    }\n  }\n};\n\nconst hasValidCache = await hasValidCacheConfig(workflow);\nconst isSecure = await hasSecureSecretsHandling(workflow);\n\n// Validate matrix with custom limits\nconst matrixProblems = await validateMatrixStrategy(workflow, 50);\n\n// Validate allowed triggers\nconst triggerProblems = await validateWorkflowTriggers(\n  workflow,\n  ['push', 'pull_request', 'workflow_dispatch']\n);\n\n// Check for dependency issues\nconst depProblems = await validateJobDependencies(workflow);\n```\n\n### Custom Validation Options\n\n```typescript\nimport { validateCIWorkflow } from '@bernierllc/validators-ci-workflow';\n\nconst problems = await validateCIWorkflow(workflowContent, {\n  // Cache configuration\n  validateCacheConfig: true,\n  requireCacheKey: true,\n  allowDynamicCacheKeys: true,\n\n  // Secrets handling\n  validateSecretsHandling: true,\n  requireSecretPrefix: 'PROD_',\n  forbiddenSecretNames: ['PASSWORD', 'SECRET', 'API_KEY'],\n\n  // Matrix strategy\n  validateMatrixStrategy: true,\n  maxMatrixJobs: 100,\n  requireFailFast: true,\n\n  // Workflow triggers\n  validateTriggers: true,\n  allowedTriggers: ['push', 'pull_request'],\n  requirePullRequestTrigger: true,\n\n  // Job dependencies\n  validateJobDependencies: true,\n  maxDependencyDepth: 5,\n  allowCircularDependencies: false,\n\n  // General workflow\n  maxWorkflowDuration: 360, // minutes\n  requireTimeoutMinutes: true,\n  allowedRunners: ['ubuntu-latest', 'macos-latest'],\n});\n```\n\n## Validation Rules\n\n### Cache Configuration Rules\n\n- **cache-config** - Validates GitHub Actions cache usage\n  - Requires cache key and path\n  - Warns about static cache keys\n  - Detects secrets in cache keys\n  - Validates restore-keys format\n\n```typescript\n// ✓ Good - Dynamic cache key with hashFiles\n{\n  uses: 'actions/cache@v3',\n  with: {\n    key: 'node-${{ hashFiles(\\'**/package-lock.json\\') }}',\n    path: 'node_modules'\n  }\n}\n\n// ✗ Bad - Static cache key\n{\n  uses: 'actions/cache@v3',\n  with: {\n    key: 'my-static-key',\n    path: 'node_modules'\n  }\n}\n\n// ✗ Bad - Secret in cache key\n{\n  uses: 'actions/cache@v3',\n  with: {\n    key: 'cache-${{ secrets.API_KEY }}',\n    path: 'data'\n  }\n}\n```\n\n### Secrets Handling Rules\n\n- **secrets-handling** - Validates secure secrets usage\n  - Detects secrets in echo commands\n  - Warns about secrets written to files\n  - Validates secret naming conventions\n  - Checks for forbidden secret names\n\n```typescript\n// ✓ Good - Secure secrets usage\n{\n  env: {\n    API_KEY: '${{ secrets.API_KEY }}'\n  },\n  steps: [\n    { run: 'curl -H \"Authorization: Bearer $API_KEY\" api.example.com' }\n  ]\n}\n\n// ✗ Bad - Echoing secrets\n{\n  steps: [\n    { run: 'echo ${{ secrets.API_KEY }}' }\n  ]\n}\n\n// ✗ Bad - Writing secrets to file\n{\n  steps: [\n    { run: 'echo ${{ secrets.API_KEY }} > key.txt' }\n  ]\n}\n```\n\n### Matrix Strategy Rules\n\n- **matrix-strategy** - Validates matrix configurations\n  - Calculates total matrix jobs\n  - Enforces max matrix jobs limit\n  - Validates variable names\n  - Checks include/exclude consistency\n\n```typescript\n// ✓ Good - Valid matrix\n{\n  strategy: {\n    matrix: {\n      os: ['ubuntu-latest', 'macos-latest'],\n      node: [16, 18, 20]\n    },\n    'fail-fast': false\n  }\n}\n\n// ✗ Bad - Invalid variable name\n{\n  strategy: {\n    matrix: {\n      'Invalid-Name': ['value']\n    }\n  }\n}\n\n// ✗ Bad - Too many jobs\n{\n  strategy: {\n    matrix: {\n      os: [1,2,3,4,5],\n      node: [1,2,3,4,5],\n      arch: [1,2,3,4,5]\n    }\n  }\n  // 125 jobs exceeds typical limits\n}\n```\n\n### Workflow Triggers Rules\n\n- **workflow-triggers** - Validates trigger configuration\n  - Validates push/pull_request filters\n  - Checks schedule cron syntax\n  - Validates workflow_dispatch inputs\n  - Warns about overly broad triggers\n\n```typescript\n// ✓ Good - Specific triggers\n{\n  on: {\n    push: {\n      branches: ['main', 'develop'],\n      paths: ['src/**']\n    },\n    pull_request: {\n      types: ['opened', 'synchronize']\n    }\n  }\n}\n\n// ✗ Bad - Overly broad trigger\n{\n  on: {\n    push: {} // Runs on ALL branches\n  }\n}\n\n// ✗ Bad - Invalid cron syntax\n{\n  on: {\n    schedule: [\n      { cron: 'invalid cron' }\n    ]\n  }\n}\n```\n\n### Job Dependencies Rules\n\n- **job-dependencies** - Validates job dependency chains\n  - Detects circular dependencies\n  - Validates job references\n  - Checks dependency depth\n  - Validates timeout configurations\n\n```typescript\n// ✓ Good - Linear dependency chain\n{\n  jobs: {\n    build: { steps: [] },\n    test: { needs: 'build', steps: [] },\n    deploy: { needs: 'test', steps: [] }\n  }\n}\n\n// ✗ Bad - Circular dependency\n{\n  jobs: {\n    job1: { needs: 'job2', steps: [] },\n    job2: { needs: 'job1', steps: [] }\n  }\n}\n\n// ✗ Bad - Non-existent dependency\n{\n  jobs: {\n    test: { needs: 'build', steps: [] }\n    // 'build' job doesn't exist\n  }\n}\n```\n\n## API Reference\n\n### validateCIWorkflow(content, options?, utils?)\n\nMain validation function for GitHub Actions workflows.\n\n**Parameters:**\n- `content` (string) - Workflow JSON or YAML string\n- `options` (Partial<CIWorkflowOptions>) - Optional validation options\n- `utils` (SharedUtils) - Optional shared utilities\n\n**Returns:** `Promise<Problem[]>`\n\n### hasValidCacheConfig(workflowData)\n\nChecks if workflow has valid cache configuration.\n\n**Parameters:**\n- `workflowData` (unknown) - Workflow object\n\n**Returns:** `Promise<boolean>`\n\n### hasSecureSecretsHandling(workflowData)\n\nChecks if workflow handles secrets securely.\n\n**Parameters:**\n- `workflowData` (unknown) - Workflow object\n\n**Returns:** `Promise<boolean>`\n\n### validateMatrixStrategy(workflowData, maxJobs?)\n\nValidates matrix strategy configuration.\n\n**Parameters:**\n- `workflowData` (unknown) - Workflow object\n- `maxJobs` (number) - Optional max matrix jobs limit\n\n**Returns:** `Promise<Problem[]>`\n\n### validateWorkflowTriggers(workflowData, allowedTriggers?)\n\nValidates workflow trigger configuration.\n\n**Parameters:**\n- `workflowData` (unknown) - Workflow object\n- `allowedTriggers` (string[]) - Optional allowed trigger types\n\n**Returns:** `Promise<Problem[]>`\n\n### validateJobDependencies(workflowData)\n\nValidates job dependencies and detects issues.\n\n**Parameters:**\n- `workflowData` (unknown) - Workflow object\n\n**Returns:** `Promise<Problem[]>`\n\n## Configuration Options\n\n### CIWorkflowOptions\n\n```typescript\ninterface CIWorkflowOptions {\n  // Cache configuration validation\n  validateCacheConfig?: boolean;\n  requireCacheKey?: boolean;\n  allowDynamicCacheKeys?: boolean;\n\n  // Secrets management validation\n  validateSecretsHandling?: boolean;\n  requireSecretPrefix?: string;\n  forbiddenSecretNames?: string[];\n\n  // Matrix strategy validation\n  validateMatrixStrategy?: boolean;\n  maxMatrixJobs?: number;\n  requireFailFast?: boolean;\n\n  // Workflow trigger validation\n  validateTriggers?: boolean;\n  allowedTriggers?: string[];\n  requirePullRequestTrigger?: boolean;\n\n  // Job dependency validation\n  validateJobDependencies?: boolean;\n  maxDependencyDepth?: number;\n  allowCircularDependencies?: boolean;\n\n  // General workflow validation\n  maxWorkflowDuration?: number; // minutes\n  requireTimeoutMinutes?: boolean;\n  allowedRunners?: string[];\n}\n```\n\n## Integration\n\n### With Validators Runner\n\n```typescript\nimport { createValidatorRunner } from '@bernierllc/validators-runner';\nimport { ciWorkflowValidator } from '@bernierllc/validators-ci-workflow';\n\nconst runner = createValidatorRunner({\n  validators: [ciWorkflowValidator],\n  stopOnError: false,\n});\n\nconst results = await runner.validate(workflowContent);\n```\n\n### With CI/CD Pipeline\n\n```yaml\n# .github/workflows/validate-workflows.yml\nname: Validate Workflows\n\non:\n  pull_request:\n    paths:\n      - '.github/workflows/**'\n\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n      - run: npm install -g @bernierllc/validators-cli\n      - run: validators-cli validate-workflow .github/workflows/*.yml\n```\n\n## Error Handling\n\nAll validation functions return `Problem[]` with the following structure:\n\n```typescript\ninterface Problem {\n  ruleId: string;\n  message: string;\n  severity: 'error' | 'warning' | 'info';\n  location: {\n    start: number;\n    end: number;\n  };\n  source?: string;\n}\n```\n\n**Severity Levels:**\n- `error` - Critical issues that must be fixed\n- `warning` - Potential problems that should be reviewed\n- `info` - Informational messages for best practices\n\n## Best Practices\n\n1. **Always validate workflows in CI** - Catch issues before they reach production\n2. **Use dynamic cache keys** - Include file hashes for better cache invalidation\n3. **Never echo secrets** - Secrets should only be used in secure contexts\n4. **Limit matrix jobs** - Set reasonable limits to prevent resource exhaustion\n5. **Specify trigger filters** - Avoid overly broad triggers that run unnecessarily\n6. **Set job timeouts** - Prevent runaway jobs from consuming resources\n7. **Avoid circular dependencies** - Keep job dependency chains linear and shallow\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n\n## Integration Status\n\n- **Logger**: Optional - Can integrate for validation event logging\n- **Docs-Suite**: Ready - Full API documentation with TypeDoc\n- **NeverHub**: Not applicable - Primitive validator\n","readmeFilename":"README.md"}