@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.
Files changed (354) hide show
  1. package/dist/index.js +11 -4
  2. package/package.json +3 -4
  3. package/skills/ATTRIBUTION.md +80 -0
  4. package/skills/accessibility-audit/SKILL.md +325 -0
  5. package/skills/accessibility-audit/reference/wcag-checklist.md +103 -0
  6. package/skills/apns-notifier/SKILL.md +86 -0
  7. package/skills/approval-policy-enforcer/SKILL.md +66 -0
  8. package/skills/apps-sdk-builder/LICENSE.txt +201 -0
  9. package/skills/apps-sdk-builder/SKILL.md +328 -0
  10. package/skills/apps-sdk-builder/agents/openai.yaml +13 -0
  11. package/skills/apps-sdk-builder/references/app-archetypes.md +132 -0
  12. package/skills/apps-sdk-builder/references/apps-sdk-docs-workflow.md +135 -0
  13. package/skills/apps-sdk-builder/references/interactive-state-sync-patterns.md +113 -0
  14. package/skills/apps-sdk-builder/references/repo-contract-and-validation.md +93 -0
  15. package/skills/apps-sdk-builder/references/search-fetch-standard.md +67 -0
  16. package/skills/apps-sdk-builder/references/upstream-example-workflow.md +79 -0
  17. package/skills/apps-sdk-builder/references/window-openai-patterns.md +79 -0
  18. package/skills/apps-sdk-builder/scripts/scaffold_node_ext_apps.mjs +606 -0
  19. package/skills/architecture-selector/SKILL.md +64 -0
  20. package/skills/backlog-planner/SKILL.md +68 -0
  21. package/skills/carplay-entitlement-checker/SKILL.md +82 -0
  22. package/skills/concept-deepener/SKILL.md +86 -0
  23. package/skills/concept-discovery/SKILL.md +517 -0
  24. package/skills/concept-discovery/assets/sample-analysis.json +81 -0
  25. package/skills/concept-discovery/expected_outputs/sample-enum-dictionary.md +25 -0
  26. package/skills/concept-discovery/expected_outputs/sample-page-user-list.md +83 -0
  27. package/skills/concept-discovery/expected_outputs/sample-prd-readme.md +43 -0
  28. package/skills/concept-discovery/references/framework-patterns.md +228 -0
  29. package/skills/concept-discovery/references/prd-quality-checklist.md +65 -0
  30. package/skills/concept-discovery/scripts/codebase_analyzer.py +732 -0
  31. package/skills/concept-discovery/scripts/prd_scaffolder.py +435 -0
  32. package/skills/dast-zap/SKILL.md +453 -0
  33. package/skills/dast-zap/assets/.gitkeep +9 -0
  34. package/skills/dast-zap/assets/github_action.yml +207 -0
  35. package/skills/dast-zap/assets/gitlab_ci.yml +226 -0
  36. package/skills/dast-zap/assets/zap_automation.yaml +196 -0
  37. package/skills/dast-zap/assets/zap_context.xml +192 -0
  38. package/skills/dast-zap/references/EXAMPLE.md +40 -0
  39. package/skills/dast-zap/references/api_testing_guide.md +475 -0
  40. package/skills/dast-zap/references/authentication_guide.md +431 -0
  41. package/skills/dast-zap/references/false_positive_handling.md +427 -0
  42. package/skills/dast-zap/references/owasp_mapping.md +255 -0
  43. package/skills/dep-sbom-scan/SKILL.md +466 -0
  44. package/skills/deploy-cloudflare/SKILL.md +930 -0
  45. package/skills/deploy-docker/SKILL.md +55 -0
  46. package/skills/deploy-fly/SKILL.md +228 -0
  47. package/skills/deploy-k8s/SKILL.md +108 -0
  48. package/skills/deploy-k8s/assets/logo.png +0 -0
  49. package/skills/deploy-k8s/docs/README.md +29 -0
  50. package/skills/deploy-k8s/docs/SUMMARY.md +56 -0
  51. package/skills/deploy-k8s/docs/advanced/token-efficiency.md +61 -0
  52. package/skills/deploy-k8s/docs/architecture/multi-tenancy.md +96 -0
  53. package/skills/deploy-k8s/docs/architecture/storage-and-state.md +102 -0
  54. package/skills/deploy-k8s/docs/architecture/workload-patterns.md +87 -0
  55. package/skills/deploy-k8s/docs/book.json +16 -0
  56. package/skills/deploy-k8s/docs/community/changelog.md +34 -0
  57. package/skills/deploy-k8s/docs/community/contributing.md +67 -0
  58. package/skills/deploy-k8s/docs/core-concepts/failure-modes.md +153 -0
  59. package/skills/deploy-k8s/docs/core-concepts/philosophy.md +83 -0
  60. package/skills/deploy-k8s/docs/core-concepts/workflow.md +124 -0
  61. package/skills/deploy-k8s/docs/examples/bad-patterns.md +47 -0
  62. package/skills/deploy-k8s/docs/examples/do-dont-checklist.md +37 -0
  63. package/skills/deploy-k8s/docs/examples/good-patterns.md +49 -0
  64. package/skills/deploy-k8s/docs/failure-modes/api-drift.md +104 -0
  65. package/skills/deploy-k8s/docs/failure-modes/fragile-rollouts.md +99 -0
  66. package/skills/deploy-k8s/docs/failure-modes/insecure-workload-defaults.md +80 -0
  67. package/skills/deploy-k8s/docs/failure-modes/network-exposure.md +98 -0
  68. package/skills/deploy-k8s/docs/failure-modes/privilege-sprawl.md +91 -0
  69. package/skills/deploy-k8s/docs/failure-modes/resource-starvation.md +85 -0
  70. package/skills/deploy-k8s/docs/getting-started/installation.md +152 -0
  71. package/skills/deploy-k8s/docs/getting-started/quick-start.md +115 -0
  72. package/skills/deploy-k8s/docs/guides/helm-patterns.md +71 -0
  73. package/skills/deploy-k8s/docs/guides/kustomize-patterns.md +65 -0
  74. package/skills/deploy-k8s/docs/guides/observability.md +67 -0
  75. package/skills/deploy-k8s/docs/guides/security-hardening.md +59 -0
  76. package/skills/deploy-k8s/docs/guides/validation-and-policy.md +66 -0
  77. package/skills/deploy-k8s/docs/integrations/mcp-integration.md +52 -0
  78. package/skills/deploy-k8s/docs/package-lock.json +2892 -0
  79. package/skills/deploy-k8s/docs/package.json +13 -0
  80. package/skills/deploy-k8s/references/api-drift.md +298 -0
  81. package/skills/deploy-k8s/references/conditional/aks-patterns.md +70 -0
  82. package/skills/deploy-k8s/references/conditional/eks-patterns.md +79 -0
  83. package/skills/deploy-k8s/references/conditional/gitops-controllers.md +71 -0
  84. package/skills/deploy-k8s/references/conditional/gke-patterns.md +74 -0
  85. package/skills/deploy-k8s/references/conditional/observability-stacks.md +80 -0
  86. package/skills/deploy-k8s/references/conditional/openshift-patterns.md +67 -0
  87. package/skills/deploy-k8s/references/daemonset-operator-patterns.md +155 -0
  88. package/skills/deploy-k8s/references/deployment-patterns.md +146 -0
  89. package/skills/deploy-k8s/references/do-dont-patterns.md +87 -0
  90. package/skills/deploy-k8s/references/examples-bad.md +282 -0
  91. package/skills/deploy-k8s/references/examples-good.md +440 -0
  92. package/skills/deploy-k8s/references/fragile-rollouts.md +303 -0
  93. package/skills/deploy-k8s/references/helm-patterns.md +203 -0
  94. package/skills/deploy-k8s/references/insecure-workload-defaults.md +300 -0
  95. package/skills/deploy-k8s/references/job-patterns.md +120 -0
  96. package/skills/deploy-k8s/references/kustomize-patterns.md +239 -0
  97. package/skills/deploy-k8s/references/multi-tenancy.md +343 -0
  98. package/skills/deploy-k8s/references/network-exposure.md +481 -0
  99. package/skills/deploy-k8s/references/observability.md +302 -0
  100. package/skills/deploy-k8s/references/privilege-sprawl.md +273 -0
  101. package/skills/deploy-k8s/references/resource-starvation.md +374 -0
  102. package/skills/deploy-k8s/references/security-hardening.md +209 -0
  103. package/skills/deploy-k8s/references/stateful-patterns.md +130 -0
  104. package/skills/deploy-k8s/references/storage-and-state.md +330 -0
  105. package/skills/deploy-k8s/references/validation-and-policy.md +242 -0
  106. package/skills/deploy-railway/SKILL.md +235 -0
  107. package/skills/deploy-railway/references/analyze-db-mongo.md +84 -0
  108. package/skills/deploy-railway/references/analyze-db-mysql.md +254 -0
  109. package/skills/deploy-railway/references/analyze-db-postgres.md +479 -0
  110. package/skills/deploy-railway/references/analyze-db-redis.md +208 -0
  111. package/skills/deploy-railway/references/analyze-db.md +344 -0
  112. package/skills/deploy-railway/references/configure.md +309 -0
  113. package/skills/deploy-railway/references/deploy.md +195 -0
  114. package/skills/deploy-railway/references/operate.md +214 -0
  115. package/skills/deploy-railway/references/request.md +248 -0
  116. package/skills/deploy-railway/references/setup.md +312 -0
  117. package/skills/deploy-railway/scripts/analyze-mongo.py +1549 -0
  118. package/skills/deploy-railway/scripts/analyze-mysql.py +1195 -0
  119. package/skills/deploy-railway/scripts/analyze-postgres.py +3058 -0
  120. package/skills/deploy-railway/scripts/analyze-redis.py +1090 -0
  121. package/skills/deploy-railway/scripts/dal.py +671 -0
  122. package/skills/deploy-railway/scripts/enable-pg-stats.py +170 -0
  123. package/skills/deploy-railway/scripts/pg-extensions.py +370 -0
  124. package/skills/deploy-railway/scripts/railway-api.sh +52 -0
  125. package/skills/deploy-ssh/SKILL.md +91 -0
  126. package/skills/deploy-vercel/SKILL.md +304 -0
  127. package/skills/deploy-vercel/resources/deploy-codex.sh +301 -0
  128. package/skills/deploy-vercel/resources/deploy.sh +301 -0
  129. package/skills/docs-runbooks/SKILL.md +399 -0
  130. package/skills/drive-status-renderer/SKILL.md +62 -0
  131. package/skills/iac-scan/SKILL.md +680 -0
  132. package/skills/iac-scan/assets/.gitkeep +9 -0
  133. package/skills/iac-scan/assets/checkov_config.yaml +94 -0
  134. package/skills/iac-scan/assets/github_actions.yml +199 -0
  135. package/skills/iac-scan/assets/gitlab_ci.yml +218 -0
  136. package/skills/iac-scan/assets/pre_commit_config.yaml +92 -0
  137. package/skills/iac-scan/references/EXAMPLE.md +40 -0
  138. package/skills/iac-scan/references/compliance_mapping.md +237 -0
  139. package/skills/iac-scan/references/custom_policies.md +460 -0
  140. package/skills/iac-scan/references/suppression_guide.md +431 -0
  141. package/skills/incident-briefing/SKILL.md +66 -0
  142. package/skills/incident-triage/SKILL.md +481 -0
  143. package/{LICENSE → skills/mcp-builder/LICENSE.txt} +15 -14
  144. package/skills/mcp-builder/SKILL.md +244 -0
  145. package/skills/mcp-builder/reference/evaluation.md +602 -0
  146. package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  147. package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  148. package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  149. package/skills/mcp-builder/scripts/connections.py +151 -0
  150. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  151. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  152. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  153. package/skills/mobile-pairing/SKILL.md +52 -0
  154. package/skills/ops-sre/SKILL.md +297 -0
  155. package/skills/playwright-qa/LICENSE.txt +201 -0
  156. package/skills/playwright-qa/NOTICE.txt +14 -0
  157. package/skills/playwright-qa/SKILL.md +156 -0
  158. package/skills/playwright-qa/agents/openai.yaml +6 -0
  159. package/skills/playwright-qa/assets/playwright-small.svg +3 -0
  160. package/skills/playwright-qa/assets/playwright.png +0 -0
  161. package/skills/playwright-qa/references/cli.md +116 -0
  162. package/skills/playwright-qa/references/workflows.md +95 -0
  163. package/skills/playwright-qa/scripts/playwright_cli.sh +25 -0
  164. package/skills/release-publish/SKILL.md +85 -0
  165. package/skills/repo-bootstrap/SKILL.md +92 -0
  166. package/skills/repo-bootstrap/assets/example-workflows/validate-agents.yml +89 -0
  167. package/skills/repo-bootstrap/assets/root-thin.md +141 -0
  168. package/skills/repo-bootstrap/assets/root-verbose.md +149 -0
  169. package/skills/repo-bootstrap/assets/scoped/backend-go.md +107 -0
  170. package/skills/repo-bootstrap/assets/scoped/backend-php.md +94 -0
  171. package/skills/repo-bootstrap/assets/scoped/backend-python.md +84 -0
  172. package/skills/repo-bootstrap/assets/scoped/backend-typescript.md +89 -0
  173. package/skills/repo-bootstrap/assets/scoped/claude-code-skill.md +101 -0
  174. package/skills/repo-bootstrap/assets/scoped/cli.md +83 -0
  175. package/skills/repo-bootstrap/assets/scoped/concourse.md +196 -0
  176. package/skills/repo-bootstrap/assets/scoped/ddev.md +68 -0
  177. package/skills/repo-bootstrap/assets/scoped/docker.md +160 -0
  178. package/skills/repo-bootstrap/assets/scoped/documentation.md +98 -0
  179. package/skills/repo-bootstrap/assets/scoped/examples.md +96 -0
  180. package/skills/repo-bootstrap/assets/scoped/frontend-typescript.md +88 -0
  181. package/skills/repo-bootstrap/assets/scoped/github-actions.md +174 -0
  182. package/skills/repo-bootstrap/assets/scoped/gitlab-ci.md +174 -0
  183. package/skills/repo-bootstrap/assets/scoped/oro-bundle.md +209 -0
  184. package/skills/repo-bootstrap/assets/scoped/oro-project.md +170 -0
  185. package/skills/repo-bootstrap/assets/scoped/python-modern.md +170 -0
  186. package/skills/repo-bootstrap/assets/scoped/resources.md +96 -0
  187. package/skills/repo-bootstrap/assets/scoped/skill-repo.md +139 -0
  188. package/skills/repo-bootstrap/assets/scoped/symfony.md +168 -0
  189. package/skills/repo-bootstrap/assets/scoped/testing.md +87 -0
  190. package/skills/repo-bootstrap/assets/scoped/typo3-docs.md +103 -0
  191. package/skills/repo-bootstrap/assets/scoped/typo3-extension.md +133 -0
  192. package/skills/repo-bootstrap/assets/scoped/typo3-project.md +137 -0
  193. package/skills/repo-bootstrap/assets/scoped/typo3-testing.md +80 -0
  194. package/skills/repo-bootstrap/checkpoints.yaml +279 -0
  195. package/skills/repo-bootstrap/evals/evals.json +385 -0
  196. package/skills/repo-bootstrap/references/ai-contribution-guidelines.md +63 -0
  197. package/skills/repo-bootstrap/references/ai-tool-compatibility.md +223 -0
  198. package/skills/repo-bootstrap/references/directory-coverage.md +82 -0
  199. package/skills/repo-bootstrap/references/examples/coding-agent-cli/AGENTS.md +70 -0
  200. package/skills/repo-bootstrap/references/examples/coding-agent-cli/go.mod +3 -0
  201. package/skills/repo-bootstrap/references/examples/coding-agent-cli/scripts-AGENTS.md +389 -0
  202. package/skills/repo-bootstrap/references/examples/express-api-ts/.env.example +13 -0
  203. package/skills/repo-bootstrap/references/examples/express-api-ts/AGENTS.md +91 -0
  204. package/skills/repo-bootstrap/references/examples/express-api-ts/package.json +33 -0
  205. package/skills/repo-bootstrap/references/examples/express-api-ts/pnpm-lock.yaml +3 -0
  206. package/skills/repo-bootstrap/references/examples/express-api-ts/src/AGENTS.md +91 -0
  207. package/skills/repo-bootstrap/references/examples/express-api-ts/src/config.ts +28 -0
  208. package/skills/repo-bootstrap/references/examples/express-api-ts/src/controllers/userController.ts +74 -0
  209. package/skills/repo-bootstrap/references/examples/express-api-ts/src/index.ts +26 -0
  210. package/skills/repo-bootstrap/references/examples/express-api-ts/src/middleware/errorHandler.ts +45 -0
  211. package/skills/repo-bootstrap/references/examples/express-api-ts/src/middleware/requestLogger.ts +18 -0
  212. package/skills/repo-bootstrap/references/examples/express-api-ts/src/routes/health.ts +18 -0
  213. package/skills/repo-bootstrap/references/examples/express-api-ts/src/routes/users.ts +13 -0
  214. package/skills/repo-bootstrap/references/examples/express-api-ts/src/utils/errors.ts +40 -0
  215. package/skills/repo-bootstrap/references/examples/express-api-ts/src/utils/logger.ts +14 -0
  216. package/skills/repo-bootstrap/references/examples/express-api-ts/tsconfig.json +24 -0
  217. package/skills/repo-bootstrap/references/examples/fastapi-app/.env.example +19 -0
  218. package/skills/repo-bootstrap/references/examples/fastapi-app/AGENTS.md +92 -0
  219. package/skills/repo-bootstrap/references/examples/fastapi-app/pyproject.toml +88 -0
  220. package/skills/repo-bootstrap/references/examples/fastapi-app/src/AGENTS.md +85 -0
  221. package/skills/repo-bootstrap/references/examples/fastapi-app/src/__init__.py +3 -0
  222. package/skills/repo-bootstrap/references/examples/fastapi-app/src/config.py +49 -0
  223. package/skills/repo-bootstrap/references/examples/fastapi-app/src/main.py +66 -0
  224. package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/__init__.py +13 -0
  225. package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/item.py +43 -0
  226. package/skills/repo-bootstrap/references/examples/fastapi-app/src/models/user.py +40 -0
  227. package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/__init__.py +5 -0
  228. package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/health.py +20 -0
  229. package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/items.py +61 -0
  230. package/skills/repo-bootstrap/references/examples/fastapi-app/src/routes/users.py +55 -0
  231. package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/__init__.py +6 -0
  232. package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/item_service.py +77 -0
  233. package/skills/repo-bootstrap/references/examples/fastapi-app/src/services/user_service.py +69 -0
  234. package/skills/repo-bootstrap/references/examples/fastapi-app/uv.lock +4 -0
  235. package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/.scopes +3 -0
  236. package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/AGENTS.md +86 -0
  237. package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/admin/package.json +20 -0
  238. package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/admin/src/App.tsx +5 -0
  239. package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/cmd/api/main.go +7 -0
  240. package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/go.mod +2 -0
  241. package/skills/repo-bootstrap/references/examples/go-api-with-react-admin/main.go +7 -0
  242. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/.scopes +3 -0
  243. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/AGENTS.md +89 -0
  244. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/go.mod +2 -0
  245. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/AGENTS.md +90 -0
  246. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/package.json +17 -0
  247. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/App.tsx +1 -0
  248. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Button.tsx +1 -0
  249. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Footer.tsx +1 -0
  250. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Header.tsx +1 -0
  251. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/internal/web/src/Sidebar.tsx +1 -0
  252. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/main.go +7 -0
  253. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/package-lock.json +0 -0
  254. package/skills/repo-bootstrap/references/examples/go-with-internal-web-tsx/package.json +12 -0
  255. package/skills/repo-bootstrap/references/examples/ldap-selfservice/AGENTS.md +70 -0
  256. package/skills/repo-bootstrap/references/examples/ldap-selfservice/go.mod +3 -0
  257. package/skills/repo-bootstrap/references/examples/ldap-selfservice/internal-AGENTS.md +371 -0
  258. package/skills/repo-bootstrap/references/examples/ldap-selfservice/internal-web-AGENTS.md +448 -0
  259. package/skills/repo-bootstrap/references/examples/php-with-frontend/.scopes +3 -0
  260. package/skills/repo-bootstrap/references/examples/php-with-frontend/AGENTS.md +91 -0
  261. package/skills/repo-bootstrap/references/examples/php-with-frontend/composer.json +8 -0
  262. package/skills/repo-bootstrap/references/examples/php-with-frontend/package.json +15 -0
  263. package/skills/repo-bootstrap/references/examples/php-with-frontend/pnpm-lock.yaml +0 -0
  264. package/skills/repo-bootstrap/references/examples/php-with-frontend/src/Controller.php +3 -0
  265. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/AGENTS.md +92 -0
  266. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/package.json +26 -0
  267. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/App.tsx +3 -0
  268. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Button.tsx +10 -0
  269. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Footer.tsx +9 -0
  270. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/Header.tsx +9 -0
  271. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/src/main.tsx +3 -0
  272. package/skills/repo-bootstrap/references/examples/php-with-frontend/web/tsconfig.json +13 -0
  273. package/skills/repo-bootstrap/references/examples/pnpm-workspace/AGENTS.md +75 -0
  274. package/skills/repo-bootstrap/references/examples/pnpm-workspace/package.json +7 -0
  275. package/skills/repo-bootstrap/references/examples/pnpm-workspace/packages/web/package.json +11 -0
  276. package/skills/repo-bootstrap/references/examples/pnpm-workspace/packages/web/src/index.ts +11 -0
  277. package/skills/repo-bootstrap/references/examples/pnpm-workspace/pnpm-lock.yaml +42 -0
  278. package/skills/repo-bootstrap/references/examples/pnpm-workspace/pnpm-workspace.yaml +2 -0
  279. package/skills/repo-bootstrap/references/examples/simple-ldap-go/AGENTS.md +70 -0
  280. package/skills/repo-bootstrap/references/examples/simple-ldap-go/examples-AGENTS.md +45 -0
  281. package/skills/repo-bootstrap/references/examples/simple-ldap-go/go.mod +3 -0
  282. package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/AGENTS.md +70 -0
  283. package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/Classes-AGENTS.md +392 -0
  284. package/skills/repo-bootstrap/references/examples/t3x-rte-ckeditor-image/composer.json +8 -0
  285. package/skills/repo-bootstrap/references/feedback-memory-schema.md +135 -0
  286. package/skills/repo-bootstrap/references/git-hooks-setup.md +79 -0
  287. package/skills/repo-bootstrap/references/output-structure.md +124 -0
  288. package/skills/repo-bootstrap/references/scripts-guide.md +175 -0
  289. package/skills/repo-bootstrap/references/verification-guide.md +137 -0
  290. package/skills/repo-bootstrap/scripts/analyze-git-history.sh +315 -0
  291. package/skills/repo-bootstrap/scripts/check-freshness.sh +230 -0
  292. package/skills/repo-bootstrap/scripts/detect-golden-samples.sh +161 -0
  293. package/skills/repo-bootstrap/scripts/detect-heuristics.sh +93 -0
  294. package/skills/repo-bootstrap/scripts/detect-project.sh +486 -0
  295. package/skills/repo-bootstrap/scripts/detect-scopes.sh +330 -0
  296. package/skills/repo-bootstrap/scripts/detect-utilities.sh +133 -0
  297. package/skills/repo-bootstrap/scripts/extract-adrs.sh +194 -0
  298. package/skills/repo-bootstrap/scripts/extract-agent-configs.sh +331 -0
  299. package/skills/repo-bootstrap/scripts/extract-architecture-rules.sh +522 -0
  300. package/skills/repo-bootstrap/scripts/extract-ci-commands.sh +385 -0
  301. package/skills/repo-bootstrap/scripts/extract-ci-rules.sh +384 -0
  302. package/skills/repo-bootstrap/scripts/extract-commands.sh +358 -0
  303. package/skills/repo-bootstrap/scripts/extract-documentation.sh +308 -0
  304. package/skills/repo-bootstrap/scripts/extract-github-rulesets.sh +96 -0
  305. package/skills/repo-bootstrap/scripts/extract-github-settings.sh +88 -0
  306. package/skills/repo-bootstrap/scripts/extract-ide-settings.sh +228 -0
  307. package/skills/repo-bootstrap/scripts/extract-platform-files.sh +290 -0
  308. package/skills/repo-bootstrap/scripts/extract-quality-configs.sh +442 -0
  309. package/skills/repo-bootstrap/scripts/generate-agents.sh +2424 -0
  310. package/skills/repo-bootstrap/scripts/generate-file-map.sh +153 -0
  311. package/skills/repo-bootstrap/scripts/lib/config-root.sh +211 -0
  312. package/skills/repo-bootstrap/scripts/lib/summary.sh +244 -0
  313. package/skills/repo-bootstrap/scripts/lib/template.sh +397 -0
  314. package/skills/repo-bootstrap/scripts/validate-structure.sh +324 -0
  315. package/skills/repo-bootstrap/scripts/verify-commands.sh +615 -0
  316. package/skills/repo-bootstrap/scripts/verify-content.sh +302 -0
  317. package/skills/schema-api-contracts/SKILL.md +56 -0
  318. package/skills/secret-hygiene/SKILL.md +511 -0
  319. package/skills/secret-hygiene/assets/.gitkeep +9 -0
  320. package/skills/secret-hygiene/assets/config-balanced.toml +81 -0
  321. package/skills/secret-hygiene/assets/config-custom.toml +178 -0
  322. package/skills/secret-hygiene/assets/config-strict.toml +48 -0
  323. package/skills/secret-hygiene/assets/github-action.yml +181 -0
  324. package/skills/secret-hygiene/assets/gitlab-ci.yml +257 -0
  325. package/skills/secret-hygiene/assets/precommit-config.yaml +70 -0
  326. package/skills/secret-hygiene/references/EXAMPLE.md +40 -0
  327. package/skills/secret-hygiene/references/compliance_mapping.md +538 -0
  328. package/skills/secret-hygiene/references/detection_rules.md +276 -0
  329. package/skills/secret-hygiene/references/false_positives.md +598 -0
  330. package/skills/secret-hygiene/references/remediation_guide.md +530 -0
  331. package/skills/stack-selector/SKILL.md +56 -0
  332. package/skills/telegram-control/SKILL.md +110 -0
  333. package/skills/telegram-control/references/architecture.md +184 -0
  334. package/skills/telegram-control/references/convex.md +173 -0
  335. package/skills/telegram-control/references/error_handling.md +212 -0
  336. package/skills/telegram-control/references/initial_setup.md +165 -0
  337. package/skills/telegram-control/references/telegram_api.md +156 -0
  338. package/skills/telegram-control/scripts/cancel_message.ts +53 -0
  339. package/skills/telegram-control/scripts/list_scheduled.ts +103 -0
  340. package/skills/telegram-control/scripts/logger.ts +121 -0
  341. package/skills/telegram-control/scripts/proxy-util.ts +11 -0
  342. package/skills/telegram-control/scripts/schedule_message.ts +216 -0
  343. package/skills/telegram-control/scripts/send_message.ts +115 -0
  344. package/skills/telegram-control/scripts/setup.ts +185 -0
  345. package/skills/telegram-control/scripts/types.ts +75 -0
  346. package/skills/telegram-control/scripts/view_history.ts +74 -0
  347. package/skills/test-strategy/SKILL.md +352 -0
  348. package/skills/threat-model/SKILL.md +303 -0
  349. package/skills/threat-model/examples/example-output.md +196 -0
  350. package/skills/threat-model/template.md +96 -0
  351. package/skills/ts-lint/SKILL.md +80 -0
  352. package/skills/ui-flow/SKILL.md +668 -0
  353. package/skills/voice-command-router/SKILL.md +51 -0
  354. package/skills/widget-live-activity-sync/SKILL.md +66 -0
@@ -0,0 +1,384 @@
1
+ #!/usr/bin/env bash
2
+ # Extract CI workflow rules that agents need to follow:
3
+ # version matrices, quality gates, coverage thresholds, security workflows, linter configs, pinned actions
4
+ set -euo pipefail
5
+
6
+ PROJECT_DIR="${1:-.}"
7
+ cd "$PROJECT_DIR"
8
+
9
+ # ---------------------------------------------------------------------------
10
+ # Helpers
11
+ # ---------------------------------------------------------------------------
12
+
13
+ # Collect unique values into a bash array via a nameref
14
+ # Usage: collect_unique arr_name "value"
15
+ collect_unique() {
16
+ local -n _arr="$1"
17
+ local val="$2"
18
+ for existing in "${_arr[@]+"${_arr[@]}"}"; do
19
+ [[ "$existing" == "$val" ]] && return
20
+ done
21
+ _arr+=("$val")
22
+ }
23
+
24
+ # Turn a bash array into a JSON array via jq
25
+ arr_to_json() {
26
+ local -n _a="$1"
27
+ if [[ ${#_a[@]} -eq 0 ]]; then
28
+ echo "[]"
29
+ else
30
+ printf '%s\n' "${_a[@]}" | jq -R . | jq -s .
31
+ fi
32
+ }
33
+
34
+ # Try yq first, fall back to grep/sed parsing
35
+ has_yq() { command -v yq &>/dev/null; }
36
+
37
+ # ---------------------------------------------------------------------------
38
+ # GitHub Actions parsing
39
+ # ---------------------------------------------------------------------------
40
+ parse_github_actions() {
41
+ local wf_dir=".github/workflows"
42
+ [[ -d "$wf_dir" ]] || { echo "{}"; return; }
43
+
44
+ local php_versions=()
45
+ local node_versions=()
46
+ local go_version=""
47
+ local python_versions=()
48
+ local quality_gates=()
49
+ local required_checks=()
50
+ local linter_configs=()
51
+ local security_workflows=()
52
+ local coverage_threshold=""
53
+ local pinned_actions=true
54
+ local permissions=()
55
+
56
+ for wf in "$wf_dir"/*.yml "$wf_dir"/*.yaml; do
57
+ [[ -f "$wf" ]] || continue
58
+ local basename
59
+ basename=$(basename "$wf")
60
+
61
+ # --- Security workflows ---
62
+ case "$basename" in
63
+ codeql*|scorecard*|dependency-review*|trivy*|snyk*|semgrep*)
64
+ collect_unique security_workflows "$basename"
65
+ ;;
66
+ esac
67
+
68
+ local content
69
+ content=$(<"$wf")
70
+
71
+ # --- Pinned actions check ---
72
+ # SHA-pinned: uses: foo/bar@<40-hex-chars> (may have # vX.Y.Z comment)
73
+ # NOT pinned: uses: foo/bar@v1.2.3 or @main
74
+ # Exclude reusable workflow calls (.github/workflows/) — those often can't be SHA-pinned
75
+ # Strategy: find all uses: lines, exclude reusable workflows, then check if any lack a 40-char hex SHA
76
+ local unpinned_count
77
+ unpinned_count=$(echo "$content" \
78
+ | grep -E '^[[:space:]]*uses:' \
79
+ | grep -vE '\.github/workflows/' \
80
+ | { grep -vE '@[0-9a-f]{40}' || true; } \
81
+ | wc -l)
82
+ if [[ "$unpinned_count" -gt 0 ]]; then
83
+ pinned_actions=false
84
+ fi
85
+
86
+ # --- Permissions block ---
87
+ while IFS= read -r line; do
88
+ if [[ "$line" =~ ^[[:space:]]+(contents|pull-requests|security-events|id-token|packages|actions|checks|issues|statuses|deployments):[[:space:]]+(read|write|none) ]]; then
89
+ local perm="${BASH_REMATCH[1]}: ${BASH_REMATCH[2]}"
90
+ collect_unique permissions "$perm"
91
+ fi
92
+ done <<< "$content"
93
+
94
+ # --- PHP version matrix ---
95
+ # Matches patterns like: php: ['8.2', '8.3'] or php-version: ['8.2']
96
+ # Also matrix entries like php: [8.2, 8.3]
97
+ while IFS= read -r ver; do
98
+ ver=$(echo "$ver" | tr -d "\"' ")
99
+ [[ -n "$ver" ]] && collect_unique php_versions "$ver"
100
+ done < <(echo "$content" | grep -E '(php|php-version|php_version).*\[' | grep -oE "[0-9]+\.[0-9]+" || true)
101
+
102
+ # Single php-version value
103
+ while IFS= read -r ver; do
104
+ ver=$(echo "$ver" | tr -d "\"' ")
105
+ [[ -n "$ver" ]] && collect_unique php_versions "$ver"
106
+ done < <(echo "$content" | grep -E 'php-version:[[:space:]]*[0-9]' | grep -oE "[0-9]+\.[0-9]+" || true)
107
+
108
+ # --- Node version matrix ---
109
+ while IFS= read -r ver; do
110
+ ver=$(echo "$ver" | tr -d "\"' ")
111
+ [[ -n "$ver" ]] && collect_unique node_versions "$ver"
112
+ done < <(echo "$content" | grep -E '(node|node-version|node_version).*\[' | grep -oE "[0-9]+" || true)
113
+
114
+ while IFS= read -r ver; do
115
+ ver=$(echo "$ver" | tr -d "\"' ")
116
+ [[ -n "$ver" ]] && collect_unique node_versions "$ver"
117
+ done < <(echo "$content" | grep -E 'node-version:[[:space:]]*[0-9]' | grep -oE "[0-9]+" || true)
118
+
119
+ # --- Go version ---
120
+ # go-version-file: go.mod → read from go.mod
121
+ if echo "$content" | grep -qE 'go-version-file:'; then
122
+ if [[ -f "go.mod" ]]; then
123
+ local gv
124
+ gv=$(grep -E '^go ' go.mod | head -1 | awk '{print $2}')
125
+ [[ -n "$gv" ]] && go_version="$gv"
126
+ fi
127
+ fi
128
+ # Explicit go-version: 1.x
129
+ while IFS= read -r ver; do
130
+ ver=$(echo "$ver" | tr -d "\"' ")
131
+ [[ -n "$ver" ]] && go_version="$ver"
132
+ done < <(echo "$content" | grep -E 'go-version:[[:space:]]*[0-9]' | grep -oE "[0-9]+\.[0-9]+[0-9.]*" | head -1 || true)
133
+
134
+ # --- Python version matrix ---
135
+ while IFS= read -r ver; do
136
+ ver=$(echo "$ver" | tr -d "\"' ")
137
+ [[ -n "$ver" ]] && collect_unique python_versions "$ver"
138
+ done < <(echo "$content" | grep -E '(python|python-version).*\[' | grep -oE "[0-9]+\.[0-9]+" || true)
139
+
140
+ while IFS= read -r ver; do
141
+ ver=$(echo "$ver" | tr -d "\"' ")
142
+ [[ -n "$ver" ]] && collect_unique python_versions "$ver"
143
+ done < <(echo "$content" | grep -E 'python-version:[[:space:]]*[0-9]' | grep -oE "[0-9]+\.[0-9]+" || true)
144
+
145
+ # --- Quality gates (detect from job names and run commands) ---
146
+ # PHPStan
147
+ if echo "$content" | grep -qiE 'phpstan|phpstan\.neon'; then
148
+ # Try to extract level from the command line
149
+ local phpstan_level
150
+ phpstan_level=$(echo "$content" | grep -oE 'phpstan[[:space:]]+analyse.*--level[=[:space:]]*[0-9]+' | grep -oE '[0-9]+$' | head -1 || true)
151
+ if [[ -z "$phpstan_level" ]] && [[ -f "phpstan.neon" || -f "phpstan.neon.dist" || -f "phpstan.dist.neon" ]]; then
152
+ local neon_file
153
+ for neon_file in phpstan.neon phpstan.neon.dist phpstan.dist.neon; do
154
+ [[ -f "$neon_file" ]] || continue
155
+ phpstan_level=$(grep -E '^[[:space:]]*level:' "$neon_file" | head -1 | grep -oE '[0-9]+' || true)
156
+ [[ -n "$phpstan_level" ]] && break
157
+ done
158
+ fi
159
+ if [[ -n "$phpstan_level" ]]; then
160
+ collect_unique quality_gates "phpstan-level-${phpstan_level}"
161
+ else
162
+ collect_unique quality_gates "phpstan"
163
+ fi
164
+ fi
165
+
166
+ # PHPUnit / phpunit
167
+ echo "$content" | grep -qiE 'phpunit|ci:test:php:unit' && collect_unique quality_gates "phpunit"
168
+
169
+ # Rector
170
+ echo "$content" | grep -qiE 'rector.*--dry-run|ci:test:php:rector' && collect_unique quality_gates "rector-dry-run"
171
+
172
+ # PHP-CS-Fixer
173
+ echo "$content" | grep -qiE 'php-cs-fixer|ci:test:php:cgl' && collect_unique quality_gates "php-cs-fixer"
174
+
175
+ # golangci-lint
176
+ echo "$content" | grep -qiE 'golangci-lint' && collect_unique quality_gates "golangci-lint"
177
+
178
+ # ESLint
179
+ echo "$content" | grep -qiE 'eslint' && collect_unique quality_gates "eslint"
180
+
181
+ # Jest / Vitest
182
+ echo "$content" | grep -qiE '\bjest\b|\bvitest\b' && collect_unique quality_gates "jest"
183
+
184
+ # pytest
185
+ echo "$content" | grep -qiE '\bpytest\b' && collect_unique quality_gates "pytest"
186
+
187
+ # go test
188
+ echo "$content" | grep -qE 'go test' && collect_unique quality_gates "go-test"
189
+
190
+ # go vet
191
+ echo "$content" | grep -qE 'go vet' && collect_unique quality_gates "go-vet"
192
+
193
+ # govulncheck
194
+ echo "$content" | grep -qiE 'govulncheck' && collect_unique quality_gates "govulncheck"
195
+
196
+ # fuzz tests
197
+ echo "$content" | grep -qE '\-fuzz=' && collect_unique quality_gates "fuzz-tests"
198
+
199
+ # mutation testing
200
+ echo "$content" | grep -qiE 'mutation|infection' && collect_unique quality_gates "mutation-testing"
201
+
202
+ # CodeQL (also a security workflow)
203
+ if echo "$content" | grep -qiE 'codeql'; then
204
+ collect_unique quality_gates "codeql"
205
+ collect_unique security_workflows "$basename"
206
+ fi
207
+
208
+ # Trivy
209
+ if echo "$content" | grep -qiE 'trivy'; then
210
+ collect_unique quality_gates "trivy"
211
+ collect_unique security_workflows "$basename"
212
+ fi
213
+
214
+ # --- Coverage threshold ---
215
+ # Patterns: THRESHOLD=60, --min-coverage=80, coverage-threshold: 80, fail_ci_if_error
216
+ local threshold
217
+ threshold=$(echo "$content" | grep -oE 'THRESHOLD=[0-9]+\.?[0-9]*' | head -1 | grep -oE '[0-9]+\.?[0-9]*' || true)
218
+ [[ -n "$threshold" && -z "$coverage_threshold" ]] && coverage_threshold="${threshold}%"
219
+
220
+ threshold=$(echo "$content" | grep -oE '(--min-coverage|coverage-threshold|minimum_coverage)[=:[:space:]]*[0-9]+' | head -1 | grep -oE '[0-9]+' || true)
221
+ [[ -n "$threshold" && -z "$coverage_threshold" ]] && coverage_threshold="${threshold}%"
222
+
223
+ # --- Required checks (from workflow names) ---
224
+ local wf_name
225
+ wf_name=$(echo "$content" | grep -E '^name:' | head -1 | sed 's/^name:[[:space:]]*//')
226
+ [[ -n "$wf_name" ]] && collect_unique required_checks "$wf_name"
227
+
228
+ # --- Linter config references ---
229
+ for cfg in .php-cs-fixer.php .php-cs-fixer.dist.php phpstan.neon phpstan.neon.dist phpstan.dist.neon \
230
+ .eslintrc .eslintrc.js .eslintrc.json eslint.config.js eslint.config.mjs \
231
+ .golangci.yml .golangci.yaml .prettierrc .prettierrc.json \
232
+ ruff.toml .flake8 .pylintrc mypy.ini .mypy.ini \
233
+ .markdownlint.json .markdownlint-cli2.jsonc .yamllint.yml; do
234
+ if [[ -f "$cfg" ]]; then
235
+ collect_unique linter_configs "$cfg"
236
+ fi
237
+ done
238
+ done
239
+
240
+ # Build JSON
241
+ local php_json node_json python_json gates_json checks_json linters_json security_json perms_json
242
+ php_json=$(arr_to_json php_versions)
243
+ node_json=$(arr_to_json node_versions)
244
+ python_json=$(arr_to_json python_versions)
245
+ gates_json=$(arr_to_json quality_gates)
246
+ checks_json=$(arr_to_json required_checks)
247
+ linters_json=$(arr_to_json linter_configs)
248
+ security_json=$(arr_to_json security_workflows)
249
+ perms_json=$(arr_to_json permissions)
250
+
251
+ jq -n \
252
+ --arg ci_platform "github-actions" \
253
+ --argjson php_versions "$php_json" \
254
+ --argjson node_versions "$node_json" \
255
+ --arg go_version "$go_version" \
256
+ --argjson python_versions "$python_json" \
257
+ --argjson quality_gates "$gates_json" \
258
+ --arg coverage_threshold "$coverage_threshold" \
259
+ --argjson required_checks "$checks_json" \
260
+ --argjson pinned_actions "$pinned_actions" \
261
+ --argjson linter_configs "$linters_json" \
262
+ --argjson security_workflows "$security_json" \
263
+ --argjson permissions "$perms_json" \
264
+ '{
265
+ ci_platform: $ci_platform,
266
+ php_versions: $php_versions,
267
+ node_versions: $node_versions,
268
+ go_version: $go_version,
269
+ python_versions: $python_versions,
270
+ quality_gates: $quality_gates,
271
+ coverage_threshold: $coverage_threshold,
272
+ required_checks: $required_checks,
273
+ pinned_actions: $pinned_actions,
274
+ linter_configs: $linter_configs,
275
+ security_workflows: $security_workflows,
276
+ permissions: $permissions
277
+ } | with_entries(select(.value != "" and .value != [] and .value != null))'
278
+ }
279
+
280
+ # ---------------------------------------------------------------------------
281
+ # GitLab CI parsing
282
+ # ---------------------------------------------------------------------------
283
+ parse_gitlab_ci() {
284
+ [[ -f ".gitlab-ci.yml" ]] || { echo "{}"; return; }
285
+
286
+ local content
287
+ content=$(<".gitlab-ci.yml")
288
+
289
+ local quality_gates=()
290
+ local stages=()
291
+
292
+ # Extract stages
293
+ while IFS= read -r line; do
294
+ if [[ "$line" =~ ^[[:space:]]*-[[:space:]]*(.+) ]]; then
295
+ local stage="${BASH_REMATCH[1]}"
296
+ stage=$(echo "$stage" | tr -d "\"' ")
297
+ collect_unique stages "$stage"
298
+ fi
299
+ done < <(sed -n '/^stages:/,/^[^[:space:]-]/p' ".gitlab-ci.yml" | tail -n +2)
300
+
301
+ # Detect quality gates from script blocks
302
+ echo "$content" | grep -qiE 'phpstan' && collect_unique quality_gates "phpstan"
303
+ echo "$content" | grep -qiE 'phpunit' && collect_unique quality_gates "phpunit"
304
+ echo "$content" | grep -qiE 'eslint' && collect_unique quality_gates "eslint"
305
+ echo "$content" | grep -qiE 'jest|vitest' && collect_unique quality_gates "jest"
306
+ echo "$content" | grep -qiE 'pytest' && collect_unique quality_gates "pytest"
307
+ echo "$content" | grep -qiE 'golangci-lint' && collect_unique quality_gates "golangci-lint"
308
+ echo "$content" | grep -qE 'go test' && collect_unique quality_gates "go-test"
309
+
310
+ local stages_json gates_json
311
+ stages_json=$(arr_to_json stages)
312
+ gates_json=$(arr_to_json quality_gates)
313
+
314
+ jq -n \
315
+ --arg ci_platform "gitlab-ci" \
316
+ --argjson stages "$stages_json" \
317
+ --argjson quality_gates "$gates_json" \
318
+ '{
319
+ ci_platform: $ci_platform,
320
+ stages: $stages,
321
+ quality_gates: $quality_gates
322
+ } | with_entries(select(.value != "" and .value != [] and .value != null))'
323
+ }
324
+
325
+ # ---------------------------------------------------------------------------
326
+ # Concourse CI parsing
327
+ # ---------------------------------------------------------------------------
328
+ parse_concourse() {
329
+ local pipeline_file=""
330
+ for f in ci/pipeline.yml ci/pipeline.yaml pipeline.yml pipeline.yaml ci/*.yml; do
331
+ [[ -f "$f" ]] && pipeline_file="$f" && break
332
+ done
333
+ [[ -z "$pipeline_file" ]] && { echo "{}"; return; }
334
+
335
+ local content
336
+ content=$(<"$pipeline_file")
337
+
338
+ local resource_types=()
339
+ local jobs=()
340
+
341
+ # Extract resource types
342
+ while IFS= read -r line; do
343
+ if [[ "$line" =~ ^[[:space:]]*-[[:space:]]*name:[[:space:]]*(.+) ]]; then
344
+ collect_unique resource_types "${BASH_REMATCH[1]}"
345
+ fi
346
+ done < <(sed -n '/^resource_types:/,/^[a-z]/p' "$pipeline_file" | tail -n +2)
347
+
348
+ # Extract job names
349
+ while IFS= read -r line; do
350
+ if [[ "$line" =~ ^[[:space:]]*-[[:space:]]*name:[[:space:]]*(.+) ]]; then
351
+ collect_unique jobs "${BASH_REMATCH[1]}"
352
+ fi
353
+ done < <(sed -n '/^jobs:/,/^[a-z]/p' "$pipeline_file" | tail -n +2)
354
+
355
+ local rt_json jobs_json
356
+ rt_json=$(arr_to_json resource_types)
357
+ jobs_json=$(arr_to_json jobs)
358
+
359
+ jq -n \
360
+ --arg ci_platform "concourse" \
361
+ --arg pipeline_file "$pipeline_file" \
362
+ --argjson resource_types "$rt_json" \
363
+ --argjson jobs "$jobs_json" \
364
+ '{
365
+ ci_platform: $ci_platform,
366
+ pipeline_file: $pipeline_file,
367
+ resource_types: $resource_types,
368
+ jobs: $jobs
369
+ } | with_entries(select(.value != "" and .value != [] and .value != null))'
370
+ }
371
+
372
+ # ---------------------------------------------------------------------------
373
+ # Detect CI platform and parse
374
+ # ---------------------------------------------------------------------------
375
+ if [[ -d ".github/workflows" ]]; then
376
+ parse_github_actions
377
+ elif [[ -f ".gitlab-ci.yml" ]]; then
378
+ parse_gitlab_ci
379
+ elif [[ -f "ci/pipeline.yml" || -f "ci/pipeline.yaml" || -f "pipeline.yml" || -f "pipeline.yaml" ]]; then
380
+ parse_concourse
381
+ else
382
+ # No CI detected
383
+ echo '{}'
384
+ fi