@synapta/skills 0.1.1 → 0.2.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/dist/index.js +11 -4
- package/package.json +3 -4
- package/skills/ATTRIBUTION.md +80 -0
- package/skills/accessibility-audit/SKILL.md +325 -0
- package/skills/accessibility-audit/reference/wcag-checklist.md +103 -0
- package/skills/apns-notifier/SKILL.md +86 -0
- package/skills/approval-policy-enforcer/SKILL.md +66 -0
- package/skills/apps-sdk-builder/LICENSE.txt +201 -0
- package/skills/apps-sdk-builder/SKILL.md +328 -0
- package/skills/apps-sdk-builder/agents/openai.yaml +13 -0
- package/skills/apps-sdk-builder/references/app-archetypes.md +132 -0
- package/skills/apps-sdk-builder/references/apps-sdk-docs-workflow.md +135 -0
- package/skills/apps-sdk-builder/references/interactive-state-sync-patterns.md +113 -0
- package/skills/apps-sdk-builder/references/repo-contract-and-validation.md +93 -0
- package/skills/apps-sdk-builder/references/search-fetch-standard.md +67 -0
- package/skills/apps-sdk-builder/references/upstream-example-workflow.md +79 -0
- package/skills/apps-sdk-builder/references/window-openai-patterns.md +79 -0
- package/skills/apps-sdk-builder/scripts/scaffold_node_ext_apps.mjs +606 -0
- package/skills/architecture-selector/SKILL.md +64 -0
- package/skills/backlog-planner/SKILL.md +68 -0
- package/skills/carplay-entitlement-checker/SKILL.md +82 -0
- package/skills/concept-deepener/SKILL.md +86 -0
- package/skills/concept-discovery/SKILL.md +517 -0
- package/skills/concept-discovery/assets/sample-analysis.json +81 -0
- package/skills/concept-discovery/expected_outputs/sample-enum-dictionary.md +25 -0
- package/skills/concept-discovery/expected_outputs/sample-page-user-list.md +83 -0
- package/skills/concept-discovery/expected_outputs/sample-prd-readme.md +43 -0
- package/skills/concept-discovery/references/framework-patterns.md +228 -0
- package/skills/concept-discovery/references/prd-quality-checklist.md +65 -0
- package/skills/concept-discovery/scripts/codebase_analyzer.py +732 -0
- package/skills/concept-discovery/scripts/prd_scaffolder.py +435 -0
- package/skills/dast-zap/SKILL.md +453 -0
- package/skills/dast-zap/assets/.gitkeep +9 -0
- package/skills/dast-zap/assets/github_action.yml +207 -0
- package/skills/dast-zap/assets/gitlab_ci.yml +226 -0
- package/skills/dast-zap/assets/zap_automation.yaml +196 -0
- package/skills/dast-zap/assets/zap_context.xml +192 -0
- package/skills/dast-zap/references/EXAMPLE.md +40 -0
- package/skills/dast-zap/references/api_testing_guide.md +475 -0
- package/skills/dast-zap/references/authentication_guide.md +431 -0
- package/skills/dast-zap/references/false_positive_handling.md +427 -0
- package/skills/dast-zap/references/owasp_mapping.md +255 -0
- package/skills/dep-sbom-scan/SKILL.md +466 -0
- package/skills/deploy-cloudflare/SKILL.md +930 -0
- package/skills/deploy-docker/SKILL.md +55 -0
- package/skills/deploy-fly/SKILL.md +228 -0
- package/skills/deploy-k8s/SKILL.md +108 -0
- package/skills/deploy-k8s/assets/logo.png +0 -0
- package/skills/deploy-k8s/docs/README.md +29 -0
- package/skills/deploy-k8s/docs/SUMMARY.md +56 -0
- package/skills/deploy-k8s/docs/advanced/token-efficiency.md +61 -0
- package/skills/deploy-k8s/docs/architecture/multi-tenancy.md +96 -0
- package/skills/deploy-k8s/docs/architecture/storage-and-state.md +102 -0
- package/skills/deploy-k8s/docs/architecture/workload-patterns.md +87 -0
- package/skills/deploy-k8s/docs/book.json +16 -0
- package/skills/deploy-k8s/docs/community/changelog.md +34 -0
- package/skills/deploy-k8s/docs/community/contributing.md +67 -0
- package/skills/deploy-k8s/docs/core-concepts/failure-modes.md +153 -0
- package/skills/deploy-k8s/docs/core-concepts/philosophy.md +83 -0
- package/skills/deploy-k8s/docs/core-concepts/workflow.md +124 -0
- package/skills/deploy-k8s/docs/examples/bad-patterns.md +47 -0
- package/skills/deploy-k8s/docs/examples/do-dont-checklist.md +37 -0
- package/skills/deploy-k8s/docs/examples/good-patterns.md +49 -0
- package/skills/deploy-k8s/docs/failure-modes/api-drift.md +104 -0
- package/skills/deploy-k8s/docs/failure-modes/fragile-rollouts.md +99 -0
- package/skills/deploy-k8s/docs/failure-modes/insecure-workload-defaults.md +80 -0
- package/skills/deploy-k8s/docs/failure-modes/network-exposure.md +98 -0
- package/skills/deploy-k8s/docs/failure-modes/privilege-sprawl.md +91 -0
- package/skills/deploy-k8s/docs/failure-modes/resource-starvation.md +85 -0
- package/skills/deploy-k8s/docs/getting-started/installation.md +152 -0
- package/skills/deploy-k8s/docs/getting-started/quick-start.md +115 -0
- package/skills/deploy-k8s/docs/guides/helm-patterns.md +71 -0
- package/skills/deploy-k8s/docs/guides/kustomize-patterns.md +65 -0
- package/skills/deploy-k8s/docs/guides/observability.md +67 -0
- package/skills/deploy-k8s/docs/guides/security-hardening.md +59 -0
- package/skills/deploy-k8s/docs/guides/validation-and-policy.md +66 -0
- package/skills/deploy-k8s/docs/integrations/mcp-integration.md +52 -0
- package/skills/deploy-k8s/docs/package-lock.json +2892 -0
- package/skills/deploy-k8s/docs/package.json +13 -0
- package/skills/deploy-k8s/references/api-drift.md +298 -0
- package/skills/deploy-k8s/references/conditional/aks-patterns.md +70 -0
- package/skills/deploy-k8s/references/conditional/eks-patterns.md +79 -0
- package/skills/deploy-k8s/references/conditional/gitops-controllers.md +71 -0
- package/skills/deploy-k8s/references/conditional/gke-patterns.md +74 -0
- package/skills/deploy-k8s/references/conditional/observability-stacks.md +80 -0
- package/skills/deploy-k8s/references/conditional/openshift-patterns.md +67 -0
- package/skills/deploy-k8s/references/daemonset-operator-patterns.md +155 -0
- package/skills/deploy-k8s/references/deployment-patterns.md +146 -0
- package/skills/deploy-k8s/references/do-dont-patterns.md +87 -0
- package/skills/deploy-k8s/references/examples-bad.md +282 -0
- package/skills/deploy-k8s/references/examples-good.md +440 -0
- package/skills/deploy-k8s/references/fragile-rollouts.md +303 -0
- package/skills/deploy-k8s/references/helm-patterns.md +203 -0
- package/skills/deploy-k8s/references/insecure-workload-defaults.md +300 -0
- package/skills/deploy-k8s/references/job-patterns.md +120 -0
- package/skills/deploy-k8s/references/kustomize-patterns.md +239 -0
- package/skills/deploy-k8s/references/multi-tenancy.md +343 -0
- package/skills/deploy-k8s/references/network-exposure.md +481 -0
- package/skills/deploy-k8s/references/observability.md +302 -0
- package/skills/deploy-k8s/references/privilege-sprawl.md +273 -0
- package/skills/deploy-k8s/references/resource-starvation.md +374 -0
- package/skills/deploy-k8s/references/security-hardening.md +209 -0
- package/skills/deploy-k8s/references/stateful-patterns.md +130 -0
- package/skills/deploy-k8s/references/storage-and-state.md +330 -0
- package/skills/deploy-k8s/references/validation-and-policy.md +242 -0
- package/skills/deploy-railway/SKILL.md +235 -0
- package/skills/deploy-railway/references/analyze-db-mongo.md +84 -0
- package/skills/deploy-railway/references/analyze-db-mysql.md +254 -0
- package/skills/deploy-railway/references/analyze-db-postgres.md +479 -0
- package/skills/deploy-railway/references/analyze-db-redis.md +208 -0
- package/skills/deploy-railway/references/analyze-db.md +344 -0
- package/skills/deploy-railway/references/configure.md +309 -0
- package/skills/deploy-railway/references/deploy.md +195 -0
- package/skills/deploy-railway/references/operate.md +214 -0
- package/skills/deploy-railway/references/request.md +248 -0
- package/skills/deploy-railway/references/setup.md +312 -0
- package/skills/deploy-railway/scripts/analyze-mongo.py +1549 -0
- package/skills/deploy-railway/scripts/analyze-mysql.py +1195 -0
- package/skills/deploy-railway/scripts/analyze-postgres.py +3058 -0
- package/skills/deploy-railway/scripts/analyze-redis.py +1090 -0
- package/skills/deploy-railway/scripts/dal.py +671 -0
- package/skills/deploy-railway/scripts/enable-pg-stats.py +170 -0
- package/skills/deploy-railway/scripts/pg-extensions.py +370 -0
- package/skills/deploy-railway/scripts/railway-api.sh +52 -0
- package/skills/deploy-ssh/SKILL.md +91 -0
- package/skills/deploy-vercel/SKILL.md +304 -0
- package/skills/deploy-vercel/resources/deploy-codex.sh +301 -0
- package/skills/deploy-vercel/resources/deploy.sh +301 -0
- package/skills/docs-runbooks/SKILL.md +399 -0
- package/skills/drive-status-renderer/SKILL.md +62 -0
- package/skills/iac-scan/SKILL.md +680 -0
- package/skills/iac-scan/assets/.gitkeep +9 -0
- package/skills/iac-scan/assets/checkov_config.yaml +94 -0
- package/skills/iac-scan/assets/github_actions.yml +199 -0
- package/skills/iac-scan/assets/gitlab_ci.yml +218 -0
- package/skills/iac-scan/assets/pre_commit_config.yaml +92 -0
- package/skills/iac-scan/references/EXAMPLE.md +40 -0
- package/skills/iac-scan/references/compliance_mapping.md +237 -0
- package/skills/iac-scan/references/custom_policies.md +460 -0
- package/skills/iac-scan/references/suppression_guide.md +431 -0
- package/skills/incident-briefing/SKILL.md +66 -0
- package/skills/incident-triage/SKILL.md +481 -0
- package/{LICENSE → skills/mcp-builder/LICENSE.txt} +15 -14
- package/skills/mcp-builder/SKILL.md +244 -0
- package/skills/mcp-builder/reference/evaluation.md +602 -0
- package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/mobile-pairing/SKILL.md +52 -0
- package/skills/ops-sre/SKILL.md +297 -0
- package/skills/playwright-qa/LICENSE.txt +201 -0
- package/skills/playwright-qa/NOTICE.txt +14 -0
- package/skills/playwright-qa/SKILL.md +156 -0
- package/skills/playwright-qa/agents/openai.yaml +6 -0
- package/skills/playwright-qa/assets/playwright-small.svg +3 -0
- package/skills/playwright-qa/assets/playwright.png +0 -0
- package/skills/playwright-qa/references/cli.md +116 -0
- package/skills/playwright-qa/references/workflows.md +95 -0
- package/skills/playwright-qa/scripts/playwright_cli.sh +25 -0
- package/skills/release-publish/SKILL.md +85 -0
- package/skills/repo-bootstrap/SKILL.md +92 -0
- package/skills/repo-bootstrap/assets/example-workflows/validate-agents.yml +89 -0
- package/skills/repo-bootstrap/assets/root-thin.md +141 -0
- package/skills/repo-bootstrap/assets/root-verbose.md +149 -0
- package/skills/repo-bootstrap/assets/scoped/backend-go.md +107 -0
- package/skills/repo-bootstrap/assets/scoped/backend-php.md +94 -0
- package/skills/repo-bootstrap/assets/scoped/backend-python.md +84 -0
- package/skills/repo-bootstrap/assets/scoped/backend-typescript.md +89 -0
- package/skills/repo-bootstrap/assets/scoped/claude-code-skill.md +101 -0
- package/skills/repo-bootstrap/assets/scoped/cli.md +83 -0
- package/skills/repo-bootstrap/assets/scoped/concourse.md +196 -0
- package/skills/repo-bootstrap/assets/scoped/ddev.md +68 -0
- package/skills/repo-bootstrap/assets/scoped/docker.md +160 -0
- package/skills/repo-bootstrap/assets/scoped/documentation.md +98 -0
- package/skills/repo-bootstrap/assets/scoped/examples.md +96 -0
- package/skills/repo-bootstrap/assets/scoped/frontend-typescript.md +88 -0
- package/skills/repo-bootstrap/assets/scoped/github-actions.md +174 -0
- package/skills/repo-bootstrap/assets/scoped/gitlab-ci.md +174 -0
- package/skills/repo-bootstrap/assets/scoped/oro-bundle.md +209 -0
- package/skills/repo-bootstrap/assets/scoped/oro-project.md +170 -0
- package/skills/repo-bootstrap/assets/scoped/python-modern.md +170 -0
- package/skills/repo-bootstrap/assets/scoped/resources.md +96 -0
- package/skills/repo-bootstrap/assets/scoped/skill-repo.md +139 -0
- package/skills/repo-bootstrap/assets/scoped/symfony.md +168 -0
- package/skills/repo-bootstrap/assets/scoped/testing.md +87 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-docs.md +103 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-extension.md +133 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-project.md +137 -0
- package/skills/repo-bootstrap/assets/scoped/typo3-testing.md +80 -0
- package/skills/repo-bootstrap/checkpoints.yaml +279 -0
- package/skills/repo-bootstrap/evals/evals.json +385 -0
- package/skills/repo-bootstrap/references/ai-contribution-guidelines.md +63 -0
- package/skills/repo-bootstrap/references/ai-tool-compatibility.md +223 -0
- package/skills/repo-bootstrap/references/directory-coverage.md +82 -0
- package/skills/repo-bootstrap/references/examples/coding-agent-cli/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/coding-agent-cli/go.mod +3 -0
- package/skills/repo-bootstrap/references/examples/coding-agent-cli/scripts-AGENTS.md +389 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/.env.example +13 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/AGENTS.md +91 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/package.json +33 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/pnpm-lock.yaml +3 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/AGENTS.md +91 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/config.ts +28 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/controllers/userController.ts +74 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/index.ts +26 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/middleware/errorHandler.ts +45 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/middleware/requestLogger.ts +18 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/routes/health.ts +18 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/routes/users.ts +13 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/utils/errors.ts +40 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/src/utils/logger.ts +14 -0
- package/skills/repo-bootstrap/references/examples/express-api-ts/tsconfig.json +24 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/.env.example +19 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/AGENTS.md +92 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/pyproject.toml +88 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/AGENTS.md +85 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/__init__.py +3 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/config.py +49 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/main.py +66 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/__init__.py +13 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/item.py +43 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/user.py +40 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/__init__.py +5 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/health.py +20 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/items.py +61 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/users.py +55 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/__init__.py +6 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/item_service.py +77 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/user_service.py +69 -0
- package/skills/repo-bootstrap/references/examples/fastapi-app/uv.lock +4 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/.scopes +3 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/AGENTS.md +86 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/admin/package.json +20 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/admin/src/App.tsx +5 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/cmd/api/main.go +7 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/go.mod +2 -0
- package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/main.go +7 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/.scopes +3 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/AGENTS.md +89 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/go.mod +2 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/AGENTS.md +90 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/package.json +17 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/App.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Button.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Footer.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Header.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Sidebar.tsx +1 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/main.go +7 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/package-lock.json +0 -0
- package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/package.json +12 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/go.mod +3 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/internal-AGENTS.md +371 -0
- package/skills/repo-bootstrap/references/examples/ldap-selfservice/internal-web-AGENTS.md +448 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/.scopes +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/AGENTS.md +91 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/composer.json +8 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/package.json +15 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/pnpm-lock.yaml +0 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/src/Controller.php +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/AGENTS.md +92 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/package.json +26 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/App.tsx +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Button.tsx +10 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Footer.tsx +9 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Header.tsx +9 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/main.tsx +3 -0
- package/skills/repo-bootstrap/references/examples/php-with-frontend/web/tsconfig.json +13 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/AGENTS.md +75 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/package.json +7 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/packages/web/package.json +11 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/packages/web/src/index.ts +11 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/pnpm-lock.yaml +42 -0
- package/skills/repo-bootstrap/references/examples/pnpm-workspace/pnpm-workspace.yaml +2 -0
- package/skills/repo-bootstrap/references/examples/simple-ldap-go/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/simple-ldap-go/examples-AGENTS.md +45 -0
- package/skills/repo-bootstrap/references/examples/simple-ldap-go/go.mod +3 -0
- package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/AGENTS.md +70 -0
- package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/Classes-AGENTS.md +392 -0
- package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/composer.json +8 -0
- package/skills/repo-bootstrap/references/feedback-memory-schema.md +135 -0
- package/skills/repo-bootstrap/references/git-hooks-setup.md +79 -0
- package/skills/repo-bootstrap/references/output-structure.md +124 -0
- package/skills/repo-bootstrap/references/scripts-guide.md +175 -0
- package/skills/repo-bootstrap/references/verification-guide.md +137 -0
- package/skills/repo-bootstrap/scripts/analyze-git-history.sh +315 -0
- package/skills/repo-bootstrap/scripts/check-freshness.sh +230 -0
- package/skills/repo-bootstrap/scripts/detect-golden-samples.sh +161 -0
- package/skills/repo-bootstrap/scripts/detect-heuristics.sh +93 -0
- package/skills/repo-bootstrap/scripts/detect-project.sh +486 -0
- package/skills/repo-bootstrap/scripts/detect-scopes.sh +330 -0
- package/skills/repo-bootstrap/scripts/detect-utilities.sh +133 -0
- package/skills/repo-bootstrap/scripts/extract-adrs.sh +194 -0
- package/skills/repo-bootstrap/scripts/extract-agent-configs.sh +331 -0
- package/skills/repo-bootstrap/scripts/extract-architecture-rules.sh +522 -0
- package/skills/repo-bootstrap/scripts/extract-ci-commands.sh +385 -0
- package/skills/repo-bootstrap/scripts/extract-ci-rules.sh +384 -0
- package/skills/repo-bootstrap/scripts/extract-commands.sh +358 -0
- package/skills/repo-bootstrap/scripts/extract-documentation.sh +308 -0
- package/skills/repo-bootstrap/scripts/extract-github-rulesets.sh +96 -0
- package/skills/repo-bootstrap/scripts/extract-github-settings.sh +88 -0
- package/skills/repo-bootstrap/scripts/extract-ide-settings.sh +228 -0
- package/skills/repo-bootstrap/scripts/extract-platform-files.sh +290 -0
- package/skills/repo-bootstrap/scripts/extract-quality-configs.sh +442 -0
- package/skills/repo-bootstrap/scripts/generate-agents.sh +2424 -0
- package/skills/repo-bootstrap/scripts/generate-file-map.sh +153 -0
- package/skills/repo-bootstrap/scripts/lib/config-root.sh +211 -0
- package/skills/repo-bootstrap/scripts/lib/summary.sh +244 -0
- package/skills/repo-bootstrap/scripts/lib/template.sh +397 -0
- package/skills/repo-bootstrap/scripts/validate-structure.sh +324 -0
- package/skills/repo-bootstrap/scripts/verify-commands.sh +615 -0
- package/skills/repo-bootstrap/scripts/verify-content.sh +302 -0
- package/skills/schema-api-contracts/SKILL.md +56 -0
- package/skills/secret-hygiene/SKILL.md +511 -0
- package/skills/secret-hygiene/assets/.gitkeep +9 -0
- package/skills/secret-hygiene/assets/config-balanced.toml +81 -0
- package/skills/secret-hygiene/assets/config-custom.toml +178 -0
- package/skills/secret-hygiene/assets/config-strict.toml +48 -0
- package/skills/secret-hygiene/assets/github-action.yml +181 -0
- package/skills/secret-hygiene/assets/gitlab-ci.yml +257 -0
- package/skills/secret-hygiene/assets/precommit-config.yaml +70 -0
- package/skills/secret-hygiene/references/EXAMPLE.md +40 -0
- package/skills/secret-hygiene/references/compliance_mapping.md +538 -0
- package/skills/secret-hygiene/references/detection_rules.md +276 -0
- package/skills/secret-hygiene/references/false_positives.md +598 -0
- package/skills/secret-hygiene/references/remediation_guide.md +530 -0
- package/skills/stack-selector/SKILL.md +56 -0
- package/skills/telegram-control/SKILL.md +110 -0
- package/skills/telegram-control/references/architecture.md +184 -0
- package/skills/telegram-control/references/convex.md +173 -0
- package/skills/telegram-control/references/error_handling.md +212 -0
- package/skills/telegram-control/references/initial_setup.md +165 -0
- package/skills/telegram-control/references/telegram_api.md +156 -0
- package/skills/telegram-control/scripts/cancel_message.ts +53 -0
- package/skills/telegram-control/scripts/list_scheduled.ts +103 -0
- package/skills/telegram-control/scripts/logger.ts +121 -0
- package/skills/telegram-control/scripts/proxy-util.ts +11 -0
- package/skills/telegram-control/scripts/schedule_message.ts +216 -0
- package/skills/telegram-control/scripts/send_message.ts +115 -0
- package/skills/telegram-control/scripts/setup.ts +185 -0
- package/skills/telegram-control/scripts/types.ts +75 -0
- package/skills/telegram-control/scripts/view_history.ts +74 -0
- package/skills/test-strategy/SKILL.md +352 -0
- package/skills/threat-model/SKILL.md +303 -0
- package/skills/threat-model/examples/example-output.md +196 -0
- package/skills/threat-model/template.md +96 -0
- package/skills/ts-lint/SKILL.md +80 -0
- package/skills/ui-flow/SKILL.md +668 -0
- package/skills/voice-command-router/SKILL.md +51 -0
- package/skills/widget-live-activity-sync/SKILL.md +66 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# Bad Examples -- Common LLM Anti-Patterns
|
|
2
|
+
|
|
3
|
+
> These are manifests that LLMs frequently generate. Each one compiles and appears
|
|
4
|
+
> valid but has serious issues in production. Study the annotations to understand
|
|
5
|
+
> what is wrong and why.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Deployment Running as Root with No Security Context
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
# BAD -- DO NOT USE
|
|
13
|
+
apiVersion: apps/v1
|
|
14
|
+
kind: Deployment
|
|
15
|
+
metadata:
|
|
16
|
+
name: my-app
|
|
17
|
+
spec:
|
|
18
|
+
replicas: 1
|
|
19
|
+
selector:
|
|
20
|
+
matchLabels:
|
|
21
|
+
app: my-app
|
|
22
|
+
template:
|
|
23
|
+
metadata:
|
|
24
|
+
labels:
|
|
25
|
+
app: my-app
|
|
26
|
+
spec:
|
|
27
|
+
containers:
|
|
28
|
+
- name: my-app
|
|
29
|
+
image: my-app:latest
|
|
30
|
+
ports:
|
|
31
|
+
- containerPort: 8080
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**What is wrong:**
|
|
35
|
+
- No `securityContext` at pod or container level -- container runs as root by default.
|
|
36
|
+
- Missing `runAsNonRoot: true`, `allowPrivilegeEscalation: false`, `readOnlyRootFilesystem: true`.
|
|
37
|
+
- Missing `capabilities.drop: ["ALL"]` -- container retains all Linux capabilities.
|
|
38
|
+
- No `seccompProfile` -- fails PSS restricted profile.
|
|
39
|
+
- No resource requests or limits -- can consume unbounded node resources.
|
|
40
|
+
- No probes -- Kubernetes cannot detect if the app is healthy or ready.
|
|
41
|
+
- No standard `app.kubernetes.io/*` labels.
|
|
42
|
+
- Uses `:latest` tag (see anti-pattern 5).
|
|
43
|
+
|
|
44
|
+
## 2. Service with Selector That Matches No Pods
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
# BAD -- DO NOT USE
|
|
48
|
+
apiVersion: apps/v1
|
|
49
|
+
kind: Deployment
|
|
50
|
+
metadata:
|
|
51
|
+
name: web-frontend
|
|
52
|
+
spec:
|
|
53
|
+
selector:
|
|
54
|
+
matchLabels:
|
|
55
|
+
app: web-frontend
|
|
56
|
+
template:
|
|
57
|
+
metadata:
|
|
58
|
+
labels:
|
|
59
|
+
app: web-frontend
|
|
60
|
+
version: v2
|
|
61
|
+
spec:
|
|
62
|
+
containers:
|
|
63
|
+
- name: web
|
|
64
|
+
image: ghcr.io/org/web:v2.0.0
|
|
65
|
+
---
|
|
66
|
+
apiVersion: v1
|
|
67
|
+
kind: Service
|
|
68
|
+
metadata:
|
|
69
|
+
name: web-frontend
|
|
70
|
+
spec:
|
|
71
|
+
selector:
|
|
72
|
+
app: web-frontend
|
|
73
|
+
version: v1 # <-- MISMATCH: pods have version: v2
|
|
74
|
+
ports:
|
|
75
|
+
- port: 80
|
|
76
|
+
targetPort: 8080
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**What is wrong:**
|
|
80
|
+
- Service selector includes `version: v1` but pods have `version: v2`.
|
|
81
|
+
- Kubernetes does not warn about selector mismatches -- the Service silently has zero endpoints.
|
|
82
|
+
- This is a frequent LLM mistake when updating version labels on the Deployment without updating the Service.
|
|
83
|
+
- Debug with `kubectl get endpoints web-frontend` -- it will show an empty subset.
|
|
84
|
+
|
|
85
|
+
## 3. ClusterRoleBinding with cluster-admin for a Single-Namespace App
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
# BAD -- DO NOT USE
|
|
89
|
+
apiVersion: v1
|
|
90
|
+
kind: ServiceAccount
|
|
91
|
+
metadata:
|
|
92
|
+
name: my-app
|
|
93
|
+
namespace: my-app
|
|
94
|
+
---
|
|
95
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
|
96
|
+
kind: ClusterRoleBinding
|
|
97
|
+
metadata:
|
|
98
|
+
name: my-app-admin
|
|
99
|
+
subjects:
|
|
100
|
+
- kind: ServiceAccount
|
|
101
|
+
name: my-app
|
|
102
|
+
namespace: my-app
|
|
103
|
+
roleRef:
|
|
104
|
+
kind: ClusterRole
|
|
105
|
+
name: cluster-admin
|
|
106
|
+
apiGroup: rbac.authorization.k8s.io
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**What is wrong:**
|
|
110
|
+
- `cluster-admin` grants unrestricted access to the entire cluster: every namespace, every resource, every verb.
|
|
111
|
+
- A single-namespace application needs only a namespace-scoped Role with specific verbs.
|
|
112
|
+
- If this service account token is compromised, the attacker owns the entire cluster.
|
|
113
|
+
- Use a namespace-scoped `Role` + `RoleBinding` with only the specific API groups, resources, and verbs needed.
|
|
114
|
+
|
|
115
|
+
## 4. Liveness Probe Checking External Database
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
# BAD -- DO NOT USE
|
|
119
|
+
apiVersion: apps/v1
|
|
120
|
+
kind: Deployment
|
|
121
|
+
metadata:
|
|
122
|
+
name: api-server
|
|
123
|
+
spec:
|
|
124
|
+
selector:
|
|
125
|
+
matchLabels:
|
|
126
|
+
app: api-server
|
|
127
|
+
template:
|
|
128
|
+
metadata:
|
|
129
|
+
labels:
|
|
130
|
+
app: api-server
|
|
131
|
+
spec:
|
|
132
|
+
containers:
|
|
133
|
+
- name: api
|
|
134
|
+
image: ghcr.io/org/api:v1.0.0
|
|
135
|
+
livenessProbe:
|
|
136
|
+
exec:
|
|
137
|
+
command:
|
|
138
|
+
- /bin/sh
|
|
139
|
+
- -c
|
|
140
|
+
- "pg_isready -h postgres.db.svc -p 5432"
|
|
141
|
+
periodSeconds: 10
|
|
142
|
+
failureThreshold: 3
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**What is wrong:**
|
|
146
|
+
- Liveness probe depends on an external database. If the database is briefly unavailable, Kubernetes kills all API pods.
|
|
147
|
+
- This causes cascading failure: database blip -> all pods restart -> thundering herd reconnects -> database overloaded further.
|
|
148
|
+
- Liveness probes must check only the process's own health (e.g., `/healthz` that returns 200 if the HTTP server is responsive).
|
|
149
|
+
- Use readiness probes (not liveness) to check dependency connectivity, so the pod is removed from Service endpoints but not killed.
|
|
150
|
+
|
|
151
|
+
## 5. Deployment with :latest Tag and No imagePullPolicy
|
|
152
|
+
|
|
153
|
+
```yaml
|
|
154
|
+
# BAD -- DO NOT USE
|
|
155
|
+
apiVersion: apps/v1
|
|
156
|
+
kind: Deployment
|
|
157
|
+
metadata:
|
|
158
|
+
name: worker
|
|
159
|
+
spec:
|
|
160
|
+
replicas: 3
|
|
161
|
+
selector:
|
|
162
|
+
matchLabels:
|
|
163
|
+
app: worker
|
|
164
|
+
template:
|
|
165
|
+
metadata:
|
|
166
|
+
labels:
|
|
167
|
+
app: worker
|
|
168
|
+
spec:
|
|
169
|
+
containers:
|
|
170
|
+
- name: worker
|
|
171
|
+
image: org/worker:latest
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**What is wrong:**
|
|
175
|
+
- `:latest` is a mutable tag. Different nodes may pull different versions, causing inconsistent behavior across replicas.
|
|
176
|
+
- When `imagePullPolicy` is not set and the tag is `:latest`, Kubernetes defaults to `Always`. But if the tag is anything else, it defaults to `IfNotPresent`.
|
|
177
|
+
- Rollbacks are impossible because every revision points to `:latest`.
|
|
178
|
+
- No way to audit which exact image is running.
|
|
179
|
+
- Use immutable tags (`v1.2.3`) or digests (`@sha256:abc...`). Set `imagePullPolicy: IfNotPresent` with immutable tags.
|
|
180
|
+
|
|
181
|
+
## 6. Ingress Using Removed API Version
|
|
182
|
+
|
|
183
|
+
```yaml
|
|
184
|
+
# BAD -- DO NOT USE
|
|
185
|
+
apiVersion: extensions/v1beta1
|
|
186
|
+
kind: Ingress
|
|
187
|
+
metadata:
|
|
188
|
+
name: app-ingress
|
|
189
|
+
annotations:
|
|
190
|
+
kubernetes.io/ingress.class: nginx
|
|
191
|
+
spec:
|
|
192
|
+
rules:
|
|
193
|
+
- host: app.example.com
|
|
194
|
+
http:
|
|
195
|
+
paths:
|
|
196
|
+
- path: /
|
|
197
|
+
backend:
|
|
198
|
+
serviceName: frontend
|
|
199
|
+
servicePort: 80
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**What is wrong:**
|
|
203
|
+
- `extensions/v1beta1` Ingress was removed in Kubernetes 1.22. This manifest fails on any modern cluster.
|
|
204
|
+
- The `kubernetes.io/ingress.class` annotation is deprecated; use `spec.ingressClassName: nginx`.
|
|
205
|
+
- The backend syntax (`serviceName`/`servicePort`) is the old format. The `networking.k8s.io/v1` API uses `service.name` and `service.port.number`.
|
|
206
|
+
- Missing `pathType` field, which is required in `networking.k8s.io/v1`.
|
|
207
|
+
- LLMs frequently generate this because training data contains many examples of the old API.
|
|
208
|
+
|
|
209
|
+
## 7. Secret Data in a ConfigMap
|
|
210
|
+
|
|
211
|
+
```yaml
|
|
212
|
+
# BAD -- DO NOT USE
|
|
213
|
+
apiVersion: v1
|
|
214
|
+
kind: ConfigMap
|
|
215
|
+
metadata:
|
|
216
|
+
name: app-config
|
|
217
|
+
namespace: my-app
|
|
218
|
+
data:
|
|
219
|
+
DATABASE_URL: "postgres://admin:s3cretP@ssw0rd@postgres:5432/mydb"
|
|
220
|
+
API_KEY: "sk-live-abc123def456"
|
|
221
|
+
AWS_SECRET_ACCESS_KEY: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
|
|
222
|
+
config.yaml: |
|
|
223
|
+
smtp:
|
|
224
|
+
username: noreply@company.com
|
|
225
|
+
password: emailP@ss123
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**What is wrong:**
|
|
229
|
+
- ConfigMaps are stored unencrypted in etcd and are readable by anyone with `get` access to the namespace.
|
|
230
|
+
- ConfigMap data appears in plain text in `kubectl describe`, in logs, and in version control if committed.
|
|
231
|
+
- Credentials, API keys, and passwords must be in Secrets (which are at least base64-encoded and can be encrypted at rest).
|
|
232
|
+
- Better: use ExternalSecrets or Sealed Secrets so credentials never appear in manifests at all.
|
|
233
|
+
- Connection strings with embedded passwords are especially dangerous because they are easily overlooked in review.
|
|
234
|
+
|
|
235
|
+
## 8. PVC with ReadWriteMany on an Unsupported Provider
|
|
236
|
+
|
|
237
|
+
```yaml
|
|
238
|
+
# BAD -- DO NOT USE
|
|
239
|
+
apiVersion: v1
|
|
240
|
+
kind: PersistentVolumeClaim
|
|
241
|
+
metadata:
|
|
242
|
+
name: shared-data
|
|
243
|
+
spec:
|
|
244
|
+
accessModes:
|
|
245
|
+
- ReadWriteMany
|
|
246
|
+
storageClassName: gp3
|
|
247
|
+
resources:
|
|
248
|
+
requests:
|
|
249
|
+
storage: 50Gi
|
|
250
|
+
---
|
|
251
|
+
apiVersion: apps/v1
|
|
252
|
+
kind: Deployment
|
|
253
|
+
metadata:
|
|
254
|
+
name: workers
|
|
255
|
+
spec:
|
|
256
|
+
replicas: 5
|
|
257
|
+
selector:
|
|
258
|
+
matchLabels:
|
|
259
|
+
app: workers
|
|
260
|
+
template:
|
|
261
|
+
metadata:
|
|
262
|
+
labels:
|
|
263
|
+
app: workers
|
|
264
|
+
spec:
|
|
265
|
+
containers:
|
|
266
|
+
- name: worker
|
|
267
|
+
image: ghcr.io/org/worker:v1.0.0
|
|
268
|
+
volumeMounts:
|
|
269
|
+
- name: shared
|
|
270
|
+
mountPath: /data
|
|
271
|
+
volumes:
|
|
272
|
+
- name: shared
|
|
273
|
+
persistentVolumeClaim:
|
|
274
|
+
claimName: shared-data
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
**What is wrong:**
|
|
278
|
+
- `gp3` (AWS EBS) does not support `ReadWriteMany`. The PVC will be stuck in `Pending` state with no clear error in pod events.
|
|
279
|
+
- EBS volumes are `ReadWriteOnce` only -- they can be attached to a single node.
|
|
280
|
+
- For RWX access, use EFS (`efs-sc`), NFS, or a distributed storage solution like Longhorn or Rook-Ceph.
|
|
281
|
+
- LLMs frequently pair `ReadWriteMany` with block storage classes because they do not track provider-specific storage capabilities.
|
|
282
|
+
- If only one pod needs write access, use `ReadWriteOnce` and a StatefulSet instead of a Deployment.
|
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
# Good Examples -- Production-Ready Patterns
|
|
2
|
+
|
|
3
|
+
> Annotated production-ready Kubernetes manifests. Every example follows the PSS
|
|
4
|
+
> "restricted" profile, includes proper labels, and sets explicit resource
|
|
5
|
+
> constraints.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Minimal Production Deployment
|
|
10
|
+
|
|
11
|
+
Full security context, resource bounds, probes, topology spread, and standard labels.
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
apiVersion: apps/v1
|
|
15
|
+
kind: Deployment
|
|
16
|
+
metadata:
|
|
17
|
+
name: api-server
|
|
18
|
+
labels:
|
|
19
|
+
app.kubernetes.io/name: api-server
|
|
20
|
+
app.kubernetes.io/version: "1.4.2"
|
|
21
|
+
app.kubernetes.io/component: backend
|
|
22
|
+
app.kubernetes.io/managed-by: kubectl
|
|
23
|
+
spec:
|
|
24
|
+
replicas: 3
|
|
25
|
+
revisionHistoryLimit: 5
|
|
26
|
+
selector:
|
|
27
|
+
matchLabels:
|
|
28
|
+
app.kubernetes.io/name: api-server
|
|
29
|
+
template:
|
|
30
|
+
metadata:
|
|
31
|
+
labels:
|
|
32
|
+
app.kubernetes.io/name: api-server
|
|
33
|
+
app.kubernetes.io/version: "1.4.2"
|
|
34
|
+
spec:
|
|
35
|
+
automountServiceAccountToken: false
|
|
36
|
+
securityContext:
|
|
37
|
+
runAsNonRoot: true
|
|
38
|
+
runAsUser: 65534
|
|
39
|
+
runAsGroup: 65534
|
|
40
|
+
fsGroup: 65534
|
|
41
|
+
seccompProfile:
|
|
42
|
+
type: RuntimeDefault
|
|
43
|
+
topologySpreadConstraints:
|
|
44
|
+
- maxSkew: 1
|
|
45
|
+
topologyKey: kubernetes.io/hostname
|
|
46
|
+
whenUnsatisfiable: DoNotSchedule
|
|
47
|
+
labelSelector:
|
|
48
|
+
matchLabels:
|
|
49
|
+
app.kubernetes.io/name: api-server
|
|
50
|
+
containers:
|
|
51
|
+
- name: api-server
|
|
52
|
+
image: ghcr.io/org/api-server:v1.4.2
|
|
53
|
+
imagePullPolicy: IfNotPresent
|
|
54
|
+
ports:
|
|
55
|
+
- name: http
|
|
56
|
+
containerPort: 8080
|
|
57
|
+
protocol: TCP
|
|
58
|
+
securityContext:
|
|
59
|
+
allowPrivilegeEscalation: false
|
|
60
|
+
readOnlyRootFilesystem: true
|
|
61
|
+
capabilities:
|
|
62
|
+
drop: ["ALL"]
|
|
63
|
+
resources:
|
|
64
|
+
requests:
|
|
65
|
+
cpu: 100m
|
|
66
|
+
memory: 128Mi
|
|
67
|
+
limits:
|
|
68
|
+
memory: 256Mi
|
|
69
|
+
livenessProbe:
|
|
70
|
+
httpGet:
|
|
71
|
+
path: /healthz
|
|
72
|
+
port: http
|
|
73
|
+
initialDelaySeconds: 10
|
|
74
|
+
periodSeconds: 15
|
|
75
|
+
failureThreshold: 3
|
|
76
|
+
readinessProbe:
|
|
77
|
+
httpGet:
|
|
78
|
+
path: /readyz
|
|
79
|
+
port: http
|
|
80
|
+
initialDelaySeconds: 5
|
|
81
|
+
periodSeconds: 5
|
|
82
|
+
volumeMounts:
|
|
83
|
+
- name: tmp
|
|
84
|
+
mountPath: /tmp
|
|
85
|
+
volumes:
|
|
86
|
+
- name: tmp
|
|
87
|
+
emptyDir: {}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Key points: readOnlyRootFilesystem requires a writable `/tmp` via emptyDir. Both pod-level and container-level securityContext are set. Topology spread prevents all replicas landing on one node.
|
|
91
|
+
|
|
92
|
+
## 2. Default-Deny NetworkPolicy
|
|
93
|
+
|
|
94
|
+
Block all traffic first, then allow only what is needed.
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
apiVersion: networking.k8s.io/v1
|
|
98
|
+
kind: NetworkPolicy
|
|
99
|
+
metadata:
|
|
100
|
+
name: default-deny-all
|
|
101
|
+
namespace: my-app
|
|
102
|
+
spec:
|
|
103
|
+
podSelector: {}
|
|
104
|
+
policyTypes:
|
|
105
|
+
- Ingress
|
|
106
|
+
- Egress
|
|
107
|
+
---
|
|
108
|
+
apiVersion: networking.k8s.io/v1
|
|
109
|
+
kind: NetworkPolicy
|
|
110
|
+
metadata:
|
|
111
|
+
name: allow-api-traffic
|
|
112
|
+
namespace: my-app
|
|
113
|
+
spec:
|
|
114
|
+
podSelector:
|
|
115
|
+
matchLabels:
|
|
116
|
+
app.kubernetes.io/name: api-server
|
|
117
|
+
policyTypes:
|
|
118
|
+
- Ingress
|
|
119
|
+
- Egress
|
|
120
|
+
ingress:
|
|
121
|
+
- from:
|
|
122
|
+
- namespaceSelector:
|
|
123
|
+
matchLabels:
|
|
124
|
+
kubernetes.io/metadata.name: ingress-nginx
|
|
125
|
+
podSelector:
|
|
126
|
+
matchLabels:
|
|
127
|
+
app.kubernetes.io/name: ingress-nginx-controller
|
|
128
|
+
ports:
|
|
129
|
+
- protocol: TCP
|
|
130
|
+
port: 8080
|
|
131
|
+
egress:
|
|
132
|
+
- to:
|
|
133
|
+
- podSelector:
|
|
134
|
+
matchLabels:
|
|
135
|
+
app.kubernetes.io/name: postgres
|
|
136
|
+
ports:
|
|
137
|
+
- protocol: TCP
|
|
138
|
+
port: 5432
|
|
139
|
+
- to: # DNS
|
|
140
|
+
- namespaceSelector: {}
|
|
141
|
+
podSelector:
|
|
142
|
+
matchLabels:
|
|
143
|
+
k8s-app: kube-dns
|
|
144
|
+
ports:
|
|
145
|
+
- protocol: UDP
|
|
146
|
+
port: 53
|
|
147
|
+
- protocol: TCP
|
|
148
|
+
port: 53
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Key points: default-deny with empty `podSelector` applies to every pod in the namespace. Always allow DNS egress or name resolution breaks. Combine `namespaceSelector` and `podSelector` to be specific.
|
|
152
|
+
|
|
153
|
+
## 3. Scoped RBAC for CI Deployer
|
|
154
|
+
|
|
155
|
+
Minimal permissions for a CI pipeline that deploys to a single namespace.
|
|
156
|
+
|
|
157
|
+
```yaml
|
|
158
|
+
apiVersion: v1
|
|
159
|
+
kind: ServiceAccount
|
|
160
|
+
metadata:
|
|
161
|
+
name: ci-deployer
|
|
162
|
+
namespace: my-app
|
|
163
|
+
---
|
|
164
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
|
165
|
+
kind: Role
|
|
166
|
+
metadata:
|
|
167
|
+
name: ci-deployer
|
|
168
|
+
namespace: my-app
|
|
169
|
+
rules:
|
|
170
|
+
- apiGroups: ["apps"]
|
|
171
|
+
resources: ["deployments"]
|
|
172
|
+
verbs: ["get", "list", "watch", "patch", "update"]
|
|
173
|
+
- apiGroups: [""]
|
|
174
|
+
resources: ["configmaps", "secrets"]
|
|
175
|
+
verbs: ["get", "list", "create", "update", "patch"]
|
|
176
|
+
- apiGroups: [""]
|
|
177
|
+
resources: ["services"]
|
|
178
|
+
verbs: ["get", "list"]
|
|
179
|
+
---
|
|
180
|
+
apiVersion: rbac.authorization.k8s.io/v1
|
|
181
|
+
kind: RoleBinding
|
|
182
|
+
metadata:
|
|
183
|
+
name: ci-deployer
|
|
184
|
+
namespace: my-app
|
|
185
|
+
subjects:
|
|
186
|
+
- kind: ServiceAccount
|
|
187
|
+
name: ci-deployer
|
|
188
|
+
namespace: my-app
|
|
189
|
+
roleRef:
|
|
190
|
+
kind: Role
|
|
191
|
+
name: ci-deployer
|
|
192
|
+
apiGroup: rbac.authorization.k8s.io
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Key points: namespace-scoped Role, not ClusterRole. Only the verbs needed for deployment. No `delete` verb unless the pipeline needs it.
|
|
196
|
+
|
|
197
|
+
## 4. CronJob with Lifecycle Controls
|
|
198
|
+
|
|
199
|
+
Proper concurrency policy, deadline, history limits, and backoff.
|
|
200
|
+
|
|
201
|
+
```yaml
|
|
202
|
+
apiVersion: batch/v1
|
|
203
|
+
kind: CronJob
|
|
204
|
+
metadata:
|
|
205
|
+
name: db-backup
|
|
206
|
+
labels:
|
|
207
|
+
app.kubernetes.io/name: db-backup
|
|
208
|
+
app.kubernetes.io/component: maintenance
|
|
209
|
+
spec:
|
|
210
|
+
schedule: "30 2 * * *"
|
|
211
|
+
timeZone: "UTC"
|
|
212
|
+
concurrencyPolicy: Forbid
|
|
213
|
+
startingDeadlineSeconds: 300
|
|
214
|
+
successfulJobsHistoryLimit: 3
|
|
215
|
+
failedJobsHistoryLimit: 5
|
|
216
|
+
jobTemplate:
|
|
217
|
+
spec:
|
|
218
|
+
backoffLimit: 2
|
|
219
|
+
activeDeadlineSeconds: 3600
|
|
220
|
+
ttlSecondsAfterFinished: 86400
|
|
221
|
+
template:
|
|
222
|
+
spec:
|
|
223
|
+
restartPolicy: Never
|
|
224
|
+
automountServiceAccountToken: false
|
|
225
|
+
securityContext:
|
|
226
|
+
runAsNonRoot: true
|
|
227
|
+
runAsUser: 65534
|
|
228
|
+
seccompProfile:
|
|
229
|
+
type: RuntimeDefault
|
|
230
|
+
containers:
|
|
231
|
+
- name: backup
|
|
232
|
+
image: ghcr.io/org/db-backup:v2.0.1
|
|
233
|
+
imagePullPolicy: IfNotPresent
|
|
234
|
+
securityContext:
|
|
235
|
+
allowPrivilegeEscalation: false
|
|
236
|
+
readOnlyRootFilesystem: true
|
|
237
|
+
capabilities:
|
|
238
|
+
drop: ["ALL"]
|
|
239
|
+
resources:
|
|
240
|
+
requests:
|
|
241
|
+
cpu: 250m
|
|
242
|
+
memory: 256Mi
|
|
243
|
+
limits:
|
|
244
|
+
memory: 512Mi
|
|
245
|
+
env:
|
|
246
|
+
- name: DB_HOST
|
|
247
|
+
value: "postgres.my-app.svc"
|
|
248
|
+
- name: DB_PASSWORD
|
|
249
|
+
valueFrom:
|
|
250
|
+
secretKeyRef:
|
|
251
|
+
name: db-credentials
|
|
252
|
+
key: password
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Key points: `concurrencyPolicy: Forbid` prevents overlapping runs. `startingDeadlineSeconds` skips if the schedule window is missed. `activeDeadlineSeconds` kills jobs that hang. `ttlSecondsAfterFinished` auto-cleans completed pods.
|
|
256
|
+
|
|
257
|
+
## 5. Ingress with TLS and Path-Based Routing
|
|
258
|
+
|
|
259
|
+
```yaml
|
|
260
|
+
apiVersion: networking.k8s.io/v1
|
|
261
|
+
kind: Ingress
|
|
262
|
+
metadata:
|
|
263
|
+
name: app-ingress
|
|
264
|
+
annotations:
|
|
265
|
+
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
|
266
|
+
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
|
267
|
+
spec:
|
|
268
|
+
ingressClassName: nginx
|
|
269
|
+
tls:
|
|
270
|
+
- hosts:
|
|
271
|
+
- app.example.com
|
|
272
|
+
secretName: app-tls-cert
|
|
273
|
+
rules:
|
|
274
|
+
- host: app.example.com
|
|
275
|
+
http:
|
|
276
|
+
paths:
|
|
277
|
+
- path: /api
|
|
278
|
+
pathType: Prefix
|
|
279
|
+
backend:
|
|
280
|
+
service:
|
|
281
|
+
name: api-server
|
|
282
|
+
port:
|
|
283
|
+
number: 8080
|
|
284
|
+
- path: /
|
|
285
|
+
pathType: Prefix
|
|
286
|
+
backend:
|
|
287
|
+
service:
|
|
288
|
+
name: frontend
|
|
289
|
+
port:
|
|
290
|
+
number: 3000
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
Key points: uses `networking.k8s.io/v1` (not the removed beta). `ingressClassName` replaces the deprecated `kubernetes.io/ingress.class` annotation. TLS secret must exist in the same namespace. More specific paths listed first.
|
|
294
|
+
|
|
295
|
+
## 6. HPA with Scale-Down Stabilization
|
|
296
|
+
|
|
297
|
+
```yaml
|
|
298
|
+
apiVersion: autoscaling/v2
|
|
299
|
+
kind: HorizontalPodAutoscaler
|
|
300
|
+
metadata:
|
|
301
|
+
name: api-server
|
|
302
|
+
spec:
|
|
303
|
+
scaleTargetRef:
|
|
304
|
+
apiVersion: apps/v1
|
|
305
|
+
kind: Deployment
|
|
306
|
+
name: api-server
|
|
307
|
+
minReplicas: 3
|
|
308
|
+
maxReplicas: 20
|
|
309
|
+
behavior:
|
|
310
|
+
scaleDown:
|
|
311
|
+
stabilizationWindowSeconds: 300
|
|
312
|
+
policies:
|
|
313
|
+
- type: Percent
|
|
314
|
+
value: 25
|
|
315
|
+
periodSeconds: 60
|
|
316
|
+
scaleUp:
|
|
317
|
+
stabilizationWindowSeconds: 0
|
|
318
|
+
policies:
|
|
319
|
+
- type: Percent
|
|
320
|
+
value: 100
|
|
321
|
+
periodSeconds: 30
|
|
322
|
+
- type: Pods
|
|
323
|
+
value: 4
|
|
324
|
+
periodSeconds: 30
|
|
325
|
+
selectPolicy: Max
|
|
326
|
+
metrics:
|
|
327
|
+
- type: Resource
|
|
328
|
+
resource:
|
|
329
|
+
name: cpu
|
|
330
|
+
target:
|
|
331
|
+
type: Utilization
|
|
332
|
+
averageUtilization: 70
|
|
333
|
+
- type: Resource
|
|
334
|
+
resource:
|
|
335
|
+
name: memory
|
|
336
|
+
target:
|
|
337
|
+
type: Utilization
|
|
338
|
+
averageUtilization: 80
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Key points: `scaleDown.stabilizationWindowSeconds: 300` prevents flapping. Scale-down limited to 25% per minute. Scale-up is aggressive with no stabilization. `autoscaling/v2` gives access to behavior configuration.
|
|
342
|
+
|
|
343
|
+
## 7. Namespace with Quota, LimitRange, and PSA Labels
|
|
344
|
+
|
|
345
|
+
```yaml
|
|
346
|
+
apiVersion: v1
|
|
347
|
+
kind: Namespace
|
|
348
|
+
metadata:
|
|
349
|
+
name: my-app
|
|
350
|
+
labels:
|
|
351
|
+
pod-security.kubernetes.io/enforce: restricted
|
|
352
|
+
pod-security.kubernetes.io/audit: restricted
|
|
353
|
+
pod-security.kubernetes.io/warn: restricted
|
|
354
|
+
---
|
|
355
|
+
apiVersion: v1
|
|
356
|
+
kind: ResourceQuota
|
|
357
|
+
metadata:
|
|
358
|
+
name: compute-quota
|
|
359
|
+
namespace: my-app
|
|
360
|
+
spec:
|
|
361
|
+
hard:
|
|
362
|
+
requests.cpu: "4"
|
|
363
|
+
requests.memory: 8Gi
|
|
364
|
+
limits.cpu: "8"
|
|
365
|
+
limits.memory: 16Gi
|
|
366
|
+
pods: "20"
|
|
367
|
+
services: "10"
|
|
368
|
+
persistentvolumeclaims: "5"
|
|
369
|
+
---
|
|
370
|
+
apiVersion: v1
|
|
371
|
+
kind: LimitRange
|
|
372
|
+
metadata:
|
|
373
|
+
name: default-limits
|
|
374
|
+
namespace: my-app
|
|
375
|
+
spec:
|
|
376
|
+
limits:
|
|
377
|
+
- type: Container
|
|
378
|
+
default:
|
|
379
|
+
cpu: 200m
|
|
380
|
+
memory: 256Mi
|
|
381
|
+
defaultRequest:
|
|
382
|
+
cpu: 50m
|
|
383
|
+
memory: 64Mi
|
|
384
|
+
max:
|
|
385
|
+
cpu: "2"
|
|
386
|
+
memory: 4Gi
|
|
387
|
+
min:
|
|
388
|
+
cpu: 10m
|
|
389
|
+
memory: 16Mi
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
Key points: PSA labels enforce the restricted profile at the namespace level. ResourceQuota caps total resource consumption. LimitRange provides defaults for containers that omit resource specs and prevents unreasonable single-container requests.
|
|
393
|
+
|
|
394
|
+
## 8. ExternalSecret for Vault Integration
|
|
395
|
+
|
|
396
|
+
```yaml
|
|
397
|
+
apiVersion: external-secrets.io/v1beta1
|
|
398
|
+
kind: SecretStore
|
|
399
|
+
metadata:
|
|
400
|
+
name: vault-backend
|
|
401
|
+
namespace: my-app
|
|
402
|
+
spec:
|
|
403
|
+
provider:
|
|
404
|
+
vault:
|
|
405
|
+
server: "https://vault.internal:8200"
|
|
406
|
+
path: "secret"
|
|
407
|
+
version: "v2"
|
|
408
|
+
auth:
|
|
409
|
+
kubernetes:
|
|
410
|
+
mountPath: "kubernetes"
|
|
411
|
+
role: "my-app"
|
|
412
|
+
serviceAccountRef:
|
|
413
|
+
name: my-app
|
|
414
|
+
---
|
|
415
|
+
apiVersion: external-secrets.io/v1beta1
|
|
416
|
+
kind: ExternalSecret
|
|
417
|
+
metadata:
|
|
418
|
+
name: app-secrets
|
|
419
|
+
namespace: my-app
|
|
420
|
+
spec:
|
|
421
|
+
refreshInterval: 1h
|
|
422
|
+
secretStoreRef:
|
|
423
|
+
name: vault-backend
|
|
424
|
+
kind: SecretStore
|
|
425
|
+
target:
|
|
426
|
+
name: app-secrets
|
|
427
|
+
creationPolicy: Owner
|
|
428
|
+
deletionPolicy: Retain
|
|
429
|
+
data:
|
|
430
|
+
- secretKey: db-password
|
|
431
|
+
remoteRef:
|
|
432
|
+
key: my-app/database
|
|
433
|
+
property: password
|
|
434
|
+
- secretKey: api-key
|
|
435
|
+
remoteRef:
|
|
436
|
+
key: my-app/external-api
|
|
437
|
+
property: key
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
Key points: SecretStore is namespace-scoped (use ClusterSecretStore only when multiple namespaces share the same Vault path). `refreshInterval` controls sync frequency. `deletionPolicy: Retain` keeps the Kubernetes Secret if the ExternalSecret is deleted, preventing accidental data loss.
|