@openhands/extensions 0.1.0 → 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 (347) hide show
  1. package/.agents/skills/custom-codereview-guide.md +25 -0
  2. package/.github/pull_request_template.md +38 -0
  3. package/.github/release.yml +14 -0
  4. package/.github/workflows/check-extensions.yml +72 -0
  5. package/.github/workflows/npm-publish.yml +89 -0
  6. package/.github/workflows/pr.yml +30 -0
  7. package/.github/workflows/release.yml +24 -0
  8. package/.github/workflows/tests.yml +25 -0
  9. package/.github/workflows/vulnerability-scan.yml +87 -0
  10. package/.release-please-manifest.json +3 -0
  11. package/AGENTS.md +132 -0
  12. package/README.md +10 -0
  13. package/analysis_results.md +162 -0
  14. package/marketplaces/large-codebase.json +66 -0
  15. package/marketplaces/openhands-extensions.json +682 -0
  16. package/package.json +4 -10
  17. package/plugins/README.md +30 -0
  18. package/plugins/city-weather/.plugin/plugin.json +13 -0
  19. package/plugins/city-weather/README.md +145 -0
  20. package/plugins/city-weather/commands/now.md +56 -0
  21. package/plugins/cobol-modernization/.plugin/plugin.json +19 -0
  22. package/plugins/cobol-modernization/README.md +201 -0
  23. package/plugins/cobol-modernization/references/troubleshooting.md +18 -0
  24. package/plugins/cobol-modernization/skills/build-setup/SKILL.md +78 -0
  25. package/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +32 -0
  26. package/plugins/cobol-modernization/skills/cobol-modernization-overview/SKILL.md +113 -0
  27. package/plugins/cobol-modernization/skills/mainfraime-removal/SKILL.md +62 -0
  28. package/plugins/cobol-modernization/skills/mainfraime-removal/references/cics-transformation-examples.md +45 -0
  29. package/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +78 -0
  30. package/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +59 -0
  31. package/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +58 -0
  32. package/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +19 -0
  33. package/plugins/issue-duplicate-checker/.plugin/plugin.json +13 -0
  34. package/plugins/issue-duplicate-checker/README.md +51 -0
  35. package/plugins/issue-duplicate-checker/action.yml +349 -0
  36. package/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +569 -0
  37. package/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +681 -0
  38. package/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.js +220 -0
  39. package/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.js +27 -0
  40. package/plugins/magic-test/.plugin/plugin.json +13 -0
  41. package/plugins/magic-test/skills/magic-word/SKILL.md +33 -0
  42. package/plugins/migration-scoring/.plugin/plugin.json +19 -0
  43. package/plugins/migration-scoring/README.md +244 -0
  44. package/plugins/migration-scoring/skills/migration-mapping/SKILL.md +72 -0
  45. package/plugins/migration-scoring/skills/migration-report/SKILL.md +118 -0
  46. package/plugins/migration-scoring/skills/migration-scoring-overview/SKILL.md +126 -0
  47. package/plugins/migration-scoring/skills/score-quality/SKILL.md +54 -0
  48. package/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +30 -0
  49. package/plugins/migration-scoring/skills/score-style/SKILL.md +106 -0
  50. package/plugins/onboarding/.plugin/plugin.json +20 -0
  51. package/plugins/onboarding/README.md +30 -0
  52. package/plugins/onboarding/references/criteria.md +144 -0
  53. package/plugins/onboarding/skills/agent-readiness-report/README.md +23 -0
  54. package/plugins/onboarding/skills/agent-readiness-report/SKILL.md +122 -0
  55. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +88 -0
  56. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +114 -0
  57. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +133 -0
  58. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +113 -0
  59. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +127 -0
  60. package/plugins/onboarding/skills/improve-agent-readiness/README.md +19 -0
  61. package/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +167 -0
  62. package/plugins/onboarding/skills/setup-agents-md/README.md +15 -0
  63. package/plugins/onboarding/skills/setup-agents-md/SKILL.md +150 -0
  64. package/plugins/onboarding/skills/setup-openhands/README.md +20 -0
  65. package/plugins/onboarding/skills/setup-openhands/SKILL.md +56 -0
  66. package/plugins/onboarding/skills/setup-pr-review/README.md +23 -0
  67. package/plugins/onboarding/skills/setup-pr-review/SKILL.md +72 -0
  68. package/plugins/openhands/.plugin/plugin.json +13 -0
  69. package/plugins/openhands/README.md +52 -0
  70. package/plugins/openhands/SKILL.md +61 -0
  71. package/plugins/openhands/commands/create.md +55 -0
  72. package/plugins/openhands/commands/openhands-cloud.md +8 -0
  73. package/plugins/openhands/scripts/run.sh +69 -0
  74. package/plugins/pr-review/.plugin/plugin.json +13 -0
  75. package/plugins/pr-review/README.md +393 -0
  76. package/plugins/pr-review/action.yml +298 -0
  77. package/plugins/pr-review/scripts/agent_script.py +1282 -0
  78. package/plugins/pr-review/scripts/evaluate_review.py +655 -0
  79. package/plugins/pr-review/scripts/prompt.py +260 -0
  80. package/plugins/pr-review/workflows/pr-review-by-openhands.yml +51 -0
  81. package/plugins/pr-review/workflows/pr-review-evaluation.yml +85 -0
  82. package/plugins/qa-changes/.plugin/plugin.json +11 -0
  83. package/plugins/qa-changes/README.md +185 -0
  84. package/plugins/qa-changes/action.yml +181 -0
  85. package/plugins/qa-changes/scripts/agent_script.py +406 -0
  86. package/plugins/qa-changes/scripts/evaluate_qa_changes.py +385 -0
  87. package/plugins/qa-changes/scripts/prompt.py +174 -0
  88. package/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +50 -0
  89. package/plugins/qa-changes/workflows/qa-changes-evaluation.yml +85 -0
  90. package/plugins/release-notes/.plugin/plugin.json +19 -0
  91. package/plugins/release-notes/README.md +283 -0
  92. package/plugins/release-notes/SKILL.md +83 -0
  93. package/plugins/release-notes/action.yml +117 -0
  94. package/plugins/release-notes/commands/release-notes.md +8 -0
  95. package/plugins/release-notes/scripts/agent_script.py +292 -0
  96. package/plugins/release-notes/scripts/generate_release_notes.py +733 -0
  97. package/plugins/release-notes/scripts/prompt.py +90 -0
  98. package/plugins/release-notes/scripts/validate_release_notes.py +328 -0
  99. package/plugins/release-notes/workflows/release-notes.yml +76 -0
  100. package/plugins/vulnerability-remediation/.plugin/plugin.json +19 -0
  101. package/plugins/vulnerability-remediation/README.md +217 -0
  102. package/plugins/vulnerability-remediation/action.yml +187 -0
  103. package/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +561 -0
  104. package/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +87 -0
  105. package/pyproject.toml +12 -0
  106. package/release-please-config.json +16 -0
  107. package/scripts/sync_extensions.py +494 -0
  108. package/scripts/sync_openhands_sdk_skill.py +264 -0
  109. package/skills/README.md +159 -0
  110. package/skills/add-javadoc/.plugin/plugin.json +18 -0
  111. package/skills/add-javadoc/README.md +40 -0
  112. package/skills/add-javadoc/SKILL.md +35 -0
  113. package/skills/add-javadoc/references/example.md +32 -0
  114. package/skills/add-skill/.plugin/plugin.json +18 -0
  115. package/skills/add-skill/README.md +67 -0
  116. package/skills/add-skill/SKILL.md +47 -0
  117. package/skills/add-skill/scripts/fetch_skill.py +259 -0
  118. package/skills/agent-creator/.plugin/plugin.json +20 -0
  119. package/skills/agent-creator/README.md +104 -0
  120. package/skills/agent-creator/SKILL.md +190 -0
  121. package/skills/agent-creator/commands/agent-creator.md +8 -0
  122. package/skills/agent-creator/references/fallback.md +117 -0
  123. package/skills/agent-memory/.plugin/plugin.json +18 -0
  124. package/skills/agent-memory/README.md +35 -0
  125. package/skills/agent-memory/SKILL.md +30 -0
  126. package/skills/agent-memory/commands/remember.md +8 -0
  127. package/skills/agent-sdk-builder/.plugin/plugin.json +18 -0
  128. package/skills/agent-sdk-builder/README.md +40 -0
  129. package/skills/agent-sdk-builder/SKILL.md +37 -0
  130. package/skills/agent-sdk-builder/commands/agent-builder.md +8 -0
  131. package/skills/azure-devops/.plugin/plugin.json +18 -0
  132. package/skills/azure-devops/README.md +55 -0
  133. package/skills/azure-devops/SKILL.md +50 -0
  134. package/skills/bitbucket/.plugin/plugin.json +17 -0
  135. package/skills/bitbucket/README.md +50 -0
  136. package/skills/bitbucket/SKILL.md +45 -0
  137. package/skills/code-review/.plugin/plugin.json +19 -0
  138. package/skills/code-review/README.md +18 -0
  139. package/skills/code-review/SKILL.md +208 -0
  140. package/skills/code-review/commands/codereview-roasted.md +8 -0
  141. package/skills/code-review/commands/codereview.md +8 -0
  142. package/skills/code-review/references/risk-evaluation.md +41 -0
  143. package/skills/code-review/references/supply-chain-security.md +31 -0
  144. package/skills/code-simplifier/.plugin/plugin.json +21 -0
  145. package/skills/code-simplifier/README.md +30 -0
  146. package/skills/code-simplifier/SKILL.md +91 -0
  147. package/skills/code-simplifier/commands/simplify.md +8 -0
  148. package/skills/code-simplifier/references/code-quality-review.md +86 -0
  149. package/skills/code-simplifier/references/code-reuse-review.md +63 -0
  150. package/skills/code-simplifier/references/efficiency-review.md +81 -0
  151. package/skills/datadog/.plugin/plugin.json +19 -0
  152. package/skills/datadog/README.md +100 -0
  153. package/skills/datadog/SKILL.md +95 -0
  154. package/skills/deno/.plugin/plugin.json +18 -0
  155. package/skills/deno/README.md +5 -0
  156. package/skills/deno/SKILL.md +99 -0
  157. package/skills/deno/references/README.md +6 -0
  158. package/skills/discord/.plugin/plugin.json +18 -0
  159. package/skills/discord/README.md +31 -0
  160. package/skills/discord/SKILL.md +109 -0
  161. package/skills/discord/__init__.py +0 -0
  162. package/skills/discord/references/REFERENCE.md +78 -0
  163. package/skills/discord/scripts/__init__.py +0 -0
  164. package/skills/discord/scripts/_http.py +127 -0
  165. package/skills/discord/scripts/post_webhook.py +106 -0
  166. package/skills/discord/scripts/send_message.py +102 -0
  167. package/skills/docker/.plugin/plugin.json +17 -0
  168. package/skills/docker/README.md +34 -0
  169. package/skills/docker/SKILL.md +29 -0
  170. package/skills/evidence-based-citations/.plugin/plugin.json +20 -0
  171. package/skills/evidence-based-citations/README.md +31 -0
  172. package/skills/evidence-based-citations/SKILL.md +59 -0
  173. package/skills/flarglebargle/.plugin/plugin.json +16 -0
  174. package/skills/flarglebargle/README.md +14 -0
  175. package/skills/flarglebargle/SKILL.md +9 -0
  176. package/skills/frontend-design/.plugin/plugin.json +21 -0
  177. package/skills/frontend-design/LICENSE.txt +177 -0
  178. package/skills/frontend-design/README.md +42 -0
  179. package/skills/frontend-design/SKILL.md +42 -0
  180. package/skills/github/.plugin/plugin.json +19 -0
  181. package/skills/github/README.md +42 -0
  182. package/skills/github/SKILL.md +106 -0
  183. package/skills/github-pr-review/.plugin/plugin.json +18 -0
  184. package/skills/github-pr-review/README.md +145 -0
  185. package/skills/github-pr-review/SKILL.md +148 -0
  186. package/skills/github-pr-review/commands/github-pr-review.md +8 -0
  187. package/skills/github-pr-reviewer/.plugin/plugin.json +20 -0
  188. package/skills/github-pr-reviewer/README.md +34 -0
  189. package/skills/github-pr-reviewer/SKILL.md +89 -0
  190. package/skills/github-pr-reviewer/commands/pr-reviewer:setup.md +8 -0
  191. package/skills/github-repo-monitor/.plugin/plugin.json +22 -0
  192. package/skills/github-repo-monitor/README.md +70 -0
  193. package/skills/github-repo-monitor/SKILL.md +316 -0
  194. package/skills/github-repo-monitor/commands/github-monitor:poll.md +8 -0
  195. package/skills/github-repo-monitor/references/github-api.md +241 -0
  196. package/skills/github-repo-monitor/references/state-schema.md +160 -0
  197. package/skills/github-repo-monitor/scripts/main.py +915 -0
  198. package/skills/github-repo-monitor/tests/test_main.py +400 -0
  199. package/skills/gitlab/.plugin/plugin.json +17 -0
  200. package/skills/gitlab/README.md +37 -0
  201. package/skills/gitlab/SKILL.md +32 -0
  202. package/skills/incident-retrospective/.plugin/plugin.json +21 -0
  203. package/skills/incident-retrospective/README.md +34 -0
  204. package/skills/incident-retrospective/SKILL.md +98 -0
  205. package/skills/incident-retrospective/commands/incident-retro:setup.md +8 -0
  206. package/skills/iterate/.plugin/plugin.json +13 -0
  207. package/skills/iterate/README.md +25 -0
  208. package/skills/iterate/SKILL.md +399 -0
  209. package/skills/iterate/commands/babysit.md +8 -0
  210. package/skills/iterate/commands/iterate.md +8 -0
  211. package/skills/iterate/commands/verify.md +8 -0
  212. package/skills/iterate/references/heuristics.md +58 -0
  213. package/skills/iterate/references/verification.md +96 -0
  214. package/skills/jupyter/.plugin/plugin.json +18 -0
  215. package/skills/jupyter/README.md +55 -0
  216. package/skills/jupyter/SKILL.md +50 -0
  217. package/skills/kubernetes/.plugin/plugin.json +18 -0
  218. package/skills/kubernetes/README.md +53 -0
  219. package/skills/kubernetes/SKILL.md +48 -0
  220. package/skills/learn-from-code-review/.plugin/plugin.json +19 -0
  221. package/skills/learn-from-code-review/README.md +64 -0
  222. package/skills/learn-from-code-review/SKILL.md +186 -0
  223. package/skills/learn-from-code-review/commands/learn-from-reviews.md +8 -0
  224. package/skills/linear/.plugin/plugin.json +19 -0
  225. package/skills/linear/README.md +58 -0
  226. package/skills/linear/SKILL.md +213 -0
  227. package/skills/linear-triage/.plugin/plugin.json +21 -0
  228. package/skills/linear-triage/README.md +34 -0
  229. package/skills/linear-triage/SKILL.md +91 -0
  230. package/skills/linear-triage/commands/linear-triage:setup.md +8 -0
  231. package/skills/notion/.plugin/plugin.json +17 -0
  232. package/skills/notion/README.md +114 -0
  233. package/skills/notion/SKILL.md +109 -0
  234. package/skills/npm/.plugin/plugin.json +17 -0
  235. package/skills/npm/README.md +14 -0
  236. package/skills/npm/SKILL.md +9 -0
  237. package/skills/openhands-api/.plugin/plugin.json +22 -0
  238. package/skills/openhands-api/README.md +48 -0
  239. package/skills/openhands-api/SKILL.md +399 -0
  240. package/skills/openhands-api/references/README.md +33 -0
  241. package/skills/openhands-api/references/TROUBLESHOOTING.md +81 -0
  242. package/skills/openhands-api/references/example_prompt.md +12 -0
  243. package/skills/openhands-api/scripts/openhands_api.py +606 -0
  244. package/skills/openhands-api/scripts/openhands_api.ts +252 -0
  245. package/skills/openhands-automation/.plugin/plugin.json +19 -0
  246. package/skills/openhands-automation/README.md +89 -0
  247. package/skills/openhands-automation/SKILL.md +875 -0
  248. package/skills/openhands-automation/commands/automation:create.md +8 -0
  249. package/skills/openhands-automation/references/ab-testing.md +185 -0
  250. package/skills/openhands-automation/references/custom-automation.md +644 -0
  251. package/skills/openhands-sdk/.plugin/plugin.json +20 -0
  252. package/skills/openhands-sdk/README.md +22 -0
  253. package/skills/openhands-sdk/SKILL.md +229 -0
  254. package/skills/openhands-sdk/commands/sdk.md +8 -0
  255. package/skills/pdflatex/.plugin/plugin.json +18 -0
  256. package/skills/pdflatex/README.md +39 -0
  257. package/skills/pdflatex/SKILL.md +34 -0
  258. package/skills/prd/.plugin/plugin.json +19 -0
  259. package/skills/prd/README.md +28 -0
  260. package/skills/prd/SKILL.md +237 -0
  261. package/skills/prd/commands/prd.md +8 -0
  262. package/skills/qa-changes/README.md +18 -0
  263. package/skills/qa-changes/SKILL.md +229 -0
  264. package/skills/qa-changes/commands/qa-changes.md +8 -0
  265. package/skills/release-notes/README.md +24 -0
  266. package/skills/release-notes/SKILL.md +19 -0
  267. package/skills/release-notes/commands/release-notes.md +8 -0
  268. package/skills/research-brief/.plugin/plugin.json +20 -0
  269. package/skills/research-brief/README.md +34 -0
  270. package/skills/research-brief/SKILL.md +99 -0
  271. package/skills/research-brief/commands/research-brief:setup.md +8 -0
  272. package/skills/security/.plugin/plugin.json +18 -0
  273. package/skills/security/README.md +38 -0
  274. package/skills/security/SKILL.md +33 -0
  275. package/skills/skill-creator/.plugin/plugin.json +17 -0
  276. package/skills/skill-creator/LICENSE.txt +202 -0
  277. package/skills/skill-creator/README.md +182 -0
  278. package/skills/skill-creator/SKILL.md +545 -0
  279. package/skills/skill-creator/references/output-patterns.md +82 -0
  280. package/skills/skill-creator/references/workflows.md +28 -0
  281. package/skills/skill-creator/scripts/init_skill.py +303 -0
  282. package/skills/skill-creator/scripts/quick_validate.py +95 -0
  283. package/skills/slack-channel-monitor/.plugin/plugin.json +21 -0
  284. package/skills/slack-channel-monitor/README.md +91 -0
  285. package/skills/slack-channel-monitor/SKILL.md +276 -0
  286. package/skills/slack-channel-monitor/commands/slack-monitor:poll.md +8 -0
  287. package/skills/slack-channel-monitor/references/slack-api.md +207 -0
  288. package/skills/slack-channel-monitor/references/state-schema.md +180 -0
  289. package/skills/slack-channel-monitor/scripts/main.py +962 -0
  290. package/skills/slack-standup-digest/.plugin/plugin.json +21 -0
  291. package/skills/slack-standup-digest/README.md +34 -0
  292. package/skills/slack-standup-digest/SKILL.md +92 -0
  293. package/skills/slack-standup-digest/commands/standup-digest:setup.md +8 -0
  294. package/skills/spark-version-upgrade/.plugin/plugin.json +20 -0
  295. package/skills/spark-version-upgrade/README.md +54 -0
  296. package/skills/spark-version-upgrade/SKILL.md +233 -0
  297. package/skills/ssh/.plugin/plugin.json +18 -0
  298. package/skills/ssh/README.md +140 -0
  299. package/skills/ssh/SKILL.md +135 -0
  300. package/skills/swift-linux/.plugin/plugin.json +17 -0
  301. package/skills/swift-linux/README.md +86 -0
  302. package/skills/swift-linux/SKILL.md +81 -0
  303. package/skills/theme-factory/.plugin/plugin.json +19 -0
  304. package/skills/theme-factory/LICENSE.txt +202 -0
  305. package/skills/theme-factory/README.md +58 -0
  306. package/skills/theme-factory/SKILL.md +59 -0
  307. package/skills/theme-factory/theme-showcase.pdf +0 -0
  308. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  309. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  310. package/skills/theme-factory/themes/desert-rose.md +19 -0
  311. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  312. package/skills/theme-factory/themes/golden-hour.md +19 -0
  313. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  314. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  315. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  316. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  317. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  318. package/skills/uv/.plugin/plugin.json +18 -0
  319. package/skills/uv/README.md +5 -0
  320. package/skills/uv/SKILL.md +95 -0
  321. package/skills/uv/references/README.md +5 -0
  322. package/skills/vercel/.plugin/plugin.json +18 -0
  323. package/skills/vercel/README.md +108 -0
  324. package/skills/vercel/SKILL.md +103 -0
  325. package/tests/test_add_skill_installs_to_agents_dir.py +42 -0
  326. package/tests/test_catalogs.py +109 -0
  327. package/tests/test_code_review_risk_evaluation.py +94 -0
  328. package/tests/test_issue_duplicate_checker.py +240 -0
  329. package/tests/test_openhands_api_python.py +152 -0
  330. package/tests/test_plugin_manifest.py +83 -0
  331. package/tests/test_pr_review_diff_payload.py +202 -0
  332. package/tests/test_pr_review_feedback.py +263 -0
  333. package/tests/test_pr_review_prompt.py +152 -0
  334. package/tests/test_pr_review_review_context.py +253 -0
  335. package/tests/test_qa_changes.py +232 -0
  336. package/tests/test_qa_changes_evaluation.py +259 -0
  337. package/tests/test_release_notes_generator.py +990 -0
  338. package/tests/test_sdk_loading.py +150 -0
  339. package/tests/test_skill_plugin_loading.py +149 -0
  340. package/tests/test_skills_have_readme.py +66 -0
  341. package/tests/test_sync_extensions.py +292 -0
  342. package/tests/test_workflow_sync.py +46 -0
  343. package/utils/analysis/README.md +7 -0
  344. package/utils/analysis/laminar_signals/README.md +211 -0
  345. package/utils/analysis/laminar_signals/analyze.py +780 -0
  346. package/utils/analysis/laminar_signals/templates/default.j2 +49 -0
  347. package/utils/analysis/laminar_signals/templates/pr_review.j2 +61 -0
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: agent-readiness-report
3
+ description: Evaluate how well a codebase supports autonomous AI-assisted development. Analyzes repositories across five pillars (Agent Instructions, Feedback Loops, Workflows & Automation, Policy & Governance, Build & Dev Environment) covering 74 features. Use when users want to assess how agent-ready a repository is.
4
+ triggers:
5
+ - agent-readiness-report
6
+ - readiness report
7
+ ---
8
+
9
+ # Agent Readiness Report
10
+
11
+ Evaluate how well a repository supports autonomous AI-assisted development.
12
+
13
+ ## What this does
14
+
15
+ Assess a codebase across five pillars that determine whether an AI agent can
16
+ work effectively in a repository. The output is a structured report identifying
17
+ what's present and what's missing.
18
+
19
+ ## Five Pillars
20
+
21
+ | Pillar | Question | Features |
22
+ |--------|----------|----------|
23
+ | **Agent Instructions** | Does the agent know what to do? | 18 |
24
+ | **Feedback Loops** | Does the agent know if it's right? | 16 |
25
+ | **Workflows & Automation** | Does the process support agent work? | 15 |
26
+ | **Policy & Governance** | Does the agent know the rules? | 13 |
27
+ | **Build & Dev Environment** | Can the agent build and run the project? | 12 |
28
+
29
+ 74 features total. See `references/criteria.md` for the full list with
30
+ descriptions and evidence examples.
31
+
32
+ ## How to run
33
+
34
+ ### Step 1: Run the scanner scripts
35
+
36
+ Five shell scripts gather filesystem signals — file existence, config patterns,
37
+ directory structures. They surface what's present so you don't have to run
38
+ dozens of `find` commands manually.
39
+
40
+ ```bash
41
+ bash scripts/scan_agent_instructions.sh /path/to/repo
42
+ bash scripts/scan_feedback_loops.sh /path/to/repo
43
+ bash scripts/scan_workflows.sh /path/to/repo
44
+ bash scripts/scan_policy.sh /path/to/repo
45
+ bash scripts/scan_build_env.sh /path/to/repo
46
+ ```
47
+
48
+ Or scan all five at once:
49
+
50
+ ```bash
51
+ for s in scripts/scan_*.sh; do bash "$s" /path/to/repo; echo; done
52
+ ```
53
+
54
+ **Important**: The scripts are helpers, not scorers. They find files and
55
+ patterns but do not evaluate quality. Many features require judgment that only
56
+ reading the actual files can provide — for example, whether a README includes
57
+ real build commands or just badges, whether inline documentation is systematic or
58
+ scattered, whether an AI usage policy has meaningful boundaries.
59
+
60
+ ### Step 2: Evaluate each feature
61
+
62
+ Walk through `references/criteria.md` pillar by pillar. For each feature:
63
+
64
+ 1. Check the scanner output for relevant signals
65
+ 2. For features the scanner can't fully evaluate, inspect the files yourself
66
+ 3. Mark each feature: **✓** (present), **✗** (missing), or **—** (not applicable)
67
+
68
+ Features that require judgment (not fully covered by scanners):
69
+ - Does the README actually contain build/run/test commands? (not just that it exists)
70
+ - Is inline documentation systematic across the public API?
71
+ - Are examples actually runnable?
72
+ - Does the contributing guide include code standards?
73
+ - Is there a meaningful AI usage policy?
74
+ - Is the architecture documentation current?
75
+ - Are tests documented well enough for an agent to run them?
76
+
77
+ ### Step 3: Write the report
78
+
79
+ Structure the output as:
80
+
81
+ ```
82
+ # Agent Readiness Report: {repo name}
83
+
84
+ ## Summary
85
+ - Features present: X / 74
86
+ - Strongest pillar: {pillar}
87
+ - Weakest pillar: {pillar}
88
+
89
+ ## Pillar 1 · Agent Instructions (X / 18)
90
+ ✓ Agent instruction file — AGENTS.md at root
91
+ ✓ AI IDE configuration — .cursor/rules/ with 3 rule files
92
+ ✗ Multi-model support — only Cursor configured
93
+ ...
94
+
95
+ ## Pillar 2 · Feedback Loops (X / 16)
96
+ ...
97
+
98
+ ## Pillar 3 · Workflows & Automation (X / 15)
99
+ ...
100
+
101
+ ## Pillar 4 · Policy & Governance (X / 13)
102
+ ...
103
+
104
+ ## Pillar 5 · Build & Dev Environment (X / 12)
105
+ ...
106
+
107
+ ```
108
+
109
+ For each passing feature, briefly note what evidence you found.
110
+ For each failing feature, note what's missing.
111
+
112
+ ## What makes these features useful
113
+
114
+ Every feature answers: *if this is missing, what goes wrong for the AI agent?*
115
+ Features like "agent instruction file" and "tool server configuration" exist
116
+ because agents need them. Features like "linter" and "CI pipeline" exist because
117
+ agents need fast, clear feedback on whether their changes are correct — not
118
+ because they're general best practices.
119
+
120
+ The criteria were derived from analysis of 123 real repositories across five
121
+ AI-readiness categories, then filtered for features that actually affect agent
122
+ effectiveness.
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env bash
2
+ # Scan for Agent Instructions signals (Pillar 1)
3
+ # Helps the agent find relevant files — not a substitute for judgment.
4
+
5
+ REPO="${1:-.}"
6
+ cd "$REPO" 2>/dev/null || { echo "Cannot access $REPO"; exit 1; }
7
+
8
+ echo "=== Pillar 1: Agent Instructions ==="
9
+ echo ""
10
+
11
+ echo "-- Agent instruction files --"
12
+ find . -maxdepth 3 -iname 'AGENTS.md' -o -iname 'CLAUDE.md' -o -iname 'COPILOT.md' \
13
+ -o -iname 'CONVENTIONS.md' -o -iname 'CODING_GUIDELINES.md' 2>/dev/null | sort
14
+
15
+ echo ""
16
+ echo "-- AI IDE configuration --"
17
+ for f in .cursor .cursor/rules .cursorrules .github/copilot-instructions.md \
18
+ .github/instructions .claude .claude/settings.json; do
19
+ [ -e "$f" ] && echo "./$f"
20
+ done
21
+
22
+ echo ""
23
+ echo "-- Agent skills --"
24
+ for d in .claude/skills .factory/skills; do
25
+ [ -d "$d" ] && echo "./$d/ ($(find "$d" -type f | wc -l | tr -d ' ') files)"
26
+ done
27
+ find . -maxdepth 3 -iname 'skill.md' 2>/dev/null | sort
28
+
29
+ echo ""
30
+ echo "-- Tool server configuration --"
31
+ find . -maxdepth 2 -name '.mcp.json' -o -name 'mcp.config.*' 2>/dev/null | sort
32
+
33
+ echo ""
34
+ echo "-- Agent prompt library --"
35
+ for d in .github/prompts prompts; do
36
+ [ -d "$d" ] && echo "./$d/ ($(find "$d" -type f | wc -l | tr -d ' ') files)"
37
+ done
38
+
39
+ echo ""
40
+ echo "-- README --"
41
+ [ -f README.md ] && echo "./README.md ($(wc -l < README.md) lines)" || echo "(not found)"
42
+
43
+ echo ""
44
+ echo "-- Contributing guide --"
45
+ find . -maxdepth 2 -iname 'CONTRIBUTING*' 2>/dev/null | sort
46
+
47
+ echo ""
48
+ echo "-- Architecture docs --"
49
+ find . -maxdepth 3 -iname 'ARCHITECTURE*' -o -iname 'DESIGN*' 2>/dev/null | sort
50
+ for d in doc/adr docs/adr decisions rfcs doc/design; do
51
+ [ -d "$d" ] && echo "./$d/ ($(find "$d" -type f | wc -l | tr -d ' ') files)"
52
+ done
53
+
54
+ echo ""
55
+ echo "-- API documentation --"
56
+ find . -maxdepth 3 -name 'openapi.yaml' -o -name 'openapi.json' -o -name 'swagger.yaml' \
57
+ -o -name 'swagger.json' 2>/dev/null | sort
58
+ find . -maxdepth 2 -name 'doc.go' 2>/dev/null | head -5
59
+ api_doc_count=$(find . -maxdepth 2 -name 'doc.go' 2>/dev/null | wc -l | tr -d ' ')
60
+ [ "$api_doc_count" -gt 5 ] && echo " ... and $((api_doc_count - 5)) more doc.go files"
61
+
62
+ echo ""
63
+ echo "-- Changelog --"
64
+ find . -maxdepth 1 -iname 'CHANGELOG*' -o -iname 'CHANGES*' -o -iname 'HISTORY*' 2>/dev/null | sort
65
+
66
+ echo ""
67
+ echo "-- Environment variable docs --"
68
+ find . -maxdepth 2 -name '.env.example' -o -name '.env.template' -o -name '.env.sample' 2>/dev/null | sort
69
+
70
+ echo ""
71
+ echo "-- Documentation site / directory --"
72
+ [ -d docs ] && echo "./docs/ ($(find docs -type f | wc -l | tr -d ' ') files)"
73
+ for f in docusaurus.config.* mkdocs.yml conf.py .vitepress/config.*; do
74
+ find . -maxdepth 2 -name "$(basename "$f")" 2>/dev/null
75
+ done
76
+
77
+ echo ""
78
+ echo "-- Examples directory --"
79
+ for d in examples _examples; do
80
+ [ -d "$d" ] && echo "./$d/ ($(find "$d" -type f | wc -l | tr -d ' ') files)"
81
+ done
82
+
83
+ echo ""
84
+ echo "-- Module-level READMEs --"
85
+ find . -mindepth 2 -maxdepth 3 -name 'README.md' 2>/dev/null | head -10
86
+ readme_count=$(find . -mindepth 2 -maxdepth 3 -name 'README.md' 2>/dev/null | wc -l | tr -d ' ')
87
+ [ "$readme_count" -gt 10 ] && echo " ... and $((readme_count - 10)) more"
88
+ echo " Total: $readme_count module READMEs"
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env bash
2
+ # Scan for Build & Dev Environment signals (Pillar 5)
3
+ # Helps the agent find relevant files — not a substitute for judgment.
4
+
5
+ REPO="${1:-.}"
6
+ cd "$REPO" 2>/dev/null || { echo "Cannot access $REPO"; exit 1; }
7
+
8
+ echo "=== Pillar 5: Build & Dev Environment ==="
9
+ echo ""
10
+
11
+ echo "-- Dependency lockfiles --"
12
+ for f in package-lock.json yarn.lock pnpm-lock.yaml bun.lockb \
13
+ Cargo.lock go.sum Gemfile.lock poetry.lock uv.lock \
14
+ Pipfile.lock composer.lock pubspec.lock; do
15
+ [ -f "$f" ] && echo "./$f"
16
+ done
17
+
18
+ echo ""
19
+ echo "-- Build commands --"
20
+ # Check for documented build commands in common files
21
+ for f in README.md AGENTS.md CONTRIBUTING.md Makefile Justfile; do
22
+ if [ -f "$f" ]; then
23
+ build_refs=$(grep -ci 'make build\|npm run build\|cargo build\|go build\|gradle build\|mvn.*package\|bundle exec' "$f" 2>/dev/null)
24
+ [ "$build_refs" -gt 0 ] && echo " $build_refs build command references in $f"
25
+ fi
26
+ done
27
+
28
+ echo ""
29
+ echo "-- Setup scripts --"
30
+ for f in bin/setup script/setup scripts/setup.sh scripts/bootstrap.sh \
31
+ script/bootstrap Makefile Justfile; do
32
+ [ -f "$f" ] && echo "./$f"
33
+ done
34
+
35
+ echo ""
36
+ echo "-- Dev container --"
37
+ if [ -d .devcontainer ]; then
38
+ echo ".devcontainer/:"
39
+ ls -1 .devcontainer/ 2>/dev/null | while read f; do echo " $f"; done
40
+ elif [ -f devcontainer.json ]; then
41
+ echo "./devcontainer.json"
42
+ else
43
+ echo " (not found)"
44
+ fi
45
+
46
+ echo ""
47
+ echo "-- Containerized services --"
48
+ find . -maxdepth 2 -name 'Dockerfile*' -o -name 'docker-compose*.yml' \
49
+ -o -name 'docker-compose*.yaml' -o -name 'compose.yml' -o -name 'compose.yaml' 2>/dev/null | sort
50
+
51
+ echo ""
52
+ echo "-- Reproducible environment --"
53
+ for f in flake.nix shell.nix default.nix devbox.json devbox.lock; do
54
+ [ -f "$f" ] && echo "./$f"
55
+ done
56
+
57
+ echo ""
58
+ echo "-- Tool version pinning --"
59
+ for f in .tool-versions mise.toml .mise.toml .node-version .nvmrc \
60
+ .python-version .ruby-version .go-version rust-toolchain.toml \
61
+ rust-toolchain .java-version .sdkmanrc; do
62
+ [ -f "$f" ] && echo "./$f"
63
+ done
64
+
65
+ echo ""
66
+ echo "-- Monorepo orchestration --"
67
+ # Check for workspace configs
68
+ if [ -f package.json ]; then
69
+ grep -q '"workspaces"' package.json 2>/dev/null && echo " workspaces in package.json"
70
+ fi
71
+ for f in pnpm-workspace.yaml lerna.json nx.json turbo.json rush.json; do
72
+ [ -f "$f" ] && echo "./$f"
73
+ done
74
+ if [ -f Cargo.toml ]; then
75
+ grep -q '\[workspace\]' Cargo.toml 2>/dev/null && echo " Cargo workspace in Cargo.toml"
76
+ fi
77
+ if [ -f go.work ]; then
78
+ echo "./go.work"
79
+ fi
80
+
81
+ echo ""
82
+ echo "-- Build caching --"
83
+ if [ -d .github/workflows ]; then
84
+ cache_count=$(grep -rl 'actions/cache\|buildx.*cache\|turbo.*cache\|ccache\|sccache' .github/workflows/ 2>/dev/null | wc -l | tr -d ' ')
85
+ echo " $cache_count workflows with cache configuration"
86
+ fi
87
+ [ -f turbo.json ] && grep -q 'cache' turbo.json 2>/dev/null && echo " Turborepo cache config"
88
+
89
+ echo ""
90
+ echo "-- Cross-platform support --"
91
+ if [ -d .github/workflows ]; then
92
+ for f in .github/workflows/*.yml .github/workflows/*.yaml; do
93
+ [ -f "$f" ] || continue
94
+ if grep -q 'matrix:' "$f" 2>/dev/null; then
95
+ os_line=$(grep -A10 'matrix:' "$f" | grep -i 'os:' | head -1 | tr -d ' ')
96
+ [ -n "$os_line" ] && echo " $(basename "$f"): $os_line"
97
+ fi
98
+ done
99
+ fi
100
+
101
+ echo ""
102
+ echo "-- Cloud dev environment --"
103
+ [ -f .gitpod.yml ] && echo "./.gitpod.yml"
104
+ if [ -d .devcontainer ]; then
105
+ grep -q 'codespaces\|ghcr.io' .devcontainer/devcontainer.json 2>/dev/null \
106
+ && echo " Codespaces support in devcontainer.json"
107
+ fi
108
+
109
+ echo ""
110
+ echo "-- Package manager configuration --"
111
+ for f in .npmrc .yarnrc .yarnrc.yml .pnpmrc pip.conf .cargo/config.toml \
112
+ .cargo/config gradle.properties; do
113
+ [ -f "$f" ] && echo "./$f"
114
+ done
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env bash
2
+ # Scan for Feedback Loops signals (Pillar 2)
3
+ # Helps the agent find relevant files — not a substitute for judgment.
4
+
5
+ REPO="${1:-.}"
6
+ cd "$REPO" 2>/dev/null || { echo "Cannot access $REPO"; exit 1; }
7
+
8
+ echo "=== Pillar 2: Feedback Loops ==="
9
+ echo ""
10
+
11
+ echo "-- Linter configuration --"
12
+ find . -maxdepth 2 \( \
13
+ -name '.eslintrc*' -o -name 'eslint.config.*' \
14
+ -o -name 'ruff.toml' -o -name '.golangci.yml' -o -name '.golangci.yaml' \
15
+ -o -name 'clippy.toml' -o -name '.clippy.toml' \
16
+ -o -name '.pylintrc' -o -name 'pylintrc' \
17
+ -o -name 'biome.json' -o -name 'biome.jsonc' \
18
+ -o -name '.swiftlint.yml' -o -name '.ktlint*' \
19
+ \) 2>/dev/null | sort
20
+ # Check pyproject.toml for ruff/pylint
21
+ if [ -f pyproject.toml ]; then
22
+ grep -l -i '\[tool\.ruff\]\|\[tool\.pylint\]\|\[tool\.flake8\]' pyproject.toml 2>/dev/null \
23
+ && echo " (also: linter config in pyproject.toml)"
24
+ fi
25
+
26
+ echo ""
27
+ echo "-- Formatter configuration --"
28
+ find . -maxdepth 2 \( \
29
+ -name '.prettierrc*' -o -name 'prettier.config.*' \
30
+ -o -name 'rustfmt.toml' -o -name '.rustfmt.toml' \
31
+ -o -name '.clang-format' \
32
+ -o -name '.editorconfig' \
33
+ \) 2>/dev/null | sort
34
+ if [ -f pyproject.toml ]; then
35
+ grep -l -i '\[tool\.black\]\|\[tool\.ruff\.format\]\|\[tool\.isort\]' pyproject.toml 2>/dev/null \
36
+ && echo " (also: formatter config in pyproject.toml)"
37
+ fi
38
+
39
+ echo ""
40
+ echo "-- Type checking --"
41
+ find . -maxdepth 2 -name 'tsconfig.json' -o -name 'tsconfig.*.json' 2>/dev/null | sort
42
+ if [ -f tsconfig.json ]; then
43
+ grep -q '"strict"' tsconfig.json 2>/dev/null && echo " (strict mode in tsconfig.json)"
44
+ fi
45
+ find . -maxdepth 2 -name 'mypy.ini' -o -name '.mypy.ini' 2>/dev/null | sort
46
+ if [ -f pyproject.toml ]; then
47
+ grep -q '\[tool\.mypy\]\|\[tool\.pyright\]' pyproject.toml 2>/dev/null \
48
+ && echo " (type checker config in pyproject.toml)"
49
+ fi
50
+ find . -maxdepth 1 -name 'py.typed' 2>/dev/null
51
+
52
+ echo ""
53
+ echo "-- Pre-commit hooks --"
54
+ for f in .pre-commit-config.yaml .husky lefthook.yml .lefthook.yml; do
55
+ [ -e "$f" ] && echo "./$f"
56
+ done
57
+ if [ -f package.json ]; then
58
+ grep -q 'lint-staged' package.json 2>/dev/null && echo " (lint-staged in package.json)"
59
+ fi
60
+
61
+ echo ""
62
+ echo "-- Test directories --"
63
+ for d in test tests __tests__ spec test/unit test/integration tests/unit tests/integration \
64
+ test/e2e tests/e2e e2e cypress playwright; do
65
+ [ -d "$d" ] && echo "./$d/ ($(find "$d" -maxdepth 1 -type f | wc -l | tr -d ' ') top-level files)"
66
+ done
67
+
68
+ echo ""
69
+ echo "-- Test file count --"
70
+ test_files=$(find . -maxdepth 5 \( \
71
+ -name '*_test.go' -o -name '*_test.py' -o -name 'test_*.py' \
72
+ -o -name '*.spec.ts' -o -name '*.test.ts' -o -name '*.spec.js' -o -name '*.test.js' \
73
+ -o -name '*_test.rb' -o -name '*_spec.rb' \
74
+ -o -name '*_test.rs' \
75
+ \) 2>/dev/null | wc -l | tr -d ' ')
76
+ echo " $test_files test files found"
77
+
78
+ echo ""
79
+ echo "-- Test coverage --"
80
+ find . -maxdepth 2 \( \
81
+ -name '.codecov.yml' -o -name 'codecov.yml' \
82
+ -o -name '.coveragerc' -o -name 'coverage.config.*' \
83
+ -o -name 'jest.config.*' \
84
+ \) 2>/dev/null | sort
85
+ if [ -f pyproject.toml ]; then
86
+ grep -q '\[tool\.coverage\]\|\[tool\.pytest\.ini_options\]' pyproject.toml 2>/dev/null \
87
+ && echo " (coverage/pytest config in pyproject.toml)"
88
+ fi
89
+ if [ -f jest.config.js ] || [ -f jest.config.ts ]; then
90
+ grep -l 'coverageThreshold' jest.config.* 2>/dev/null
91
+ fi
92
+
93
+ echo ""
94
+ echo "-- CI pipelines --"
95
+ if [ -d .github/workflows ]; then
96
+ echo ".github/workflows/:"
97
+ ls -1 .github/workflows/*.yml .github/workflows/*.yaml 2>/dev/null | while read f; do
98
+ echo " $(basename "$f")"
99
+ done
100
+ fi
101
+ for f in .circleci/config.yml .gitlab-ci.yml Jenkinsfile .travis.yml; do
102
+ [ -f "$f" ] && echo "./$f"
103
+ done
104
+
105
+ echo ""
106
+ echo "-- Config/schema validation --"
107
+ find . -maxdepth 2 -name '.yamllint*' -o -name 'taplo.toml' 2>/dev/null | sort
108
+ if [ -d .github/workflows ]; then
109
+ grep -rl 'actionlint\|yamllint\|schema.*validate' .github/workflows/ 2>/dev/null | head -3
110
+ fi
111
+
112
+ echo ""
113
+ echo "-- Snapshot tests --"
114
+ snap_count=$(find . -maxdepth 5 -name '__snapshots__' -o -name '*.snap' 2>/dev/null | wc -l | tr -d ' ')
115
+ golden_count=$(find . -maxdepth 4 -name 'testdata' -type d 2>/dev/null | wc -l | tr -d ' ')
116
+ echo " $snap_count snapshot dirs/files, $golden_count testdata dirs"
117
+
118
+ echo ""
119
+ echo "-- Benchmark suite --"
120
+ for d in bench benchmarks benchmark; do
121
+ [ -d "$d" ] && echo "./$d/ ($(find "$d" -type f | wc -l | tr -d ' ') files)"
122
+ done
123
+ bench_files=$(find . -maxdepth 4 -name '*_bench_test.go' -o -name '*benchmark*' -type f 2>/dev/null | wc -l | tr -d ' ')
124
+ echo " $bench_files benchmark files found"
125
+
126
+ echo ""
127
+ echo "-- Spell checking --"
128
+ find . -maxdepth 2 -name '.cspell.json' -o -name 'cspell.json' -o -name 'typos.toml' \
129
+ -o -name '.typos.toml' 2>/dev/null | sort
130
+ if [ -f .pre-commit-config.yaml ]; then
131
+ grep -q 'codespell\|cspell\|typos' .pre-commit-config.yaml 2>/dev/null \
132
+ && echo " (spell checker in pre-commit config)"
133
+ fi
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env bash
2
+ # Scan for Policy & Governance signals (Pillar 4)
3
+ # Helps the agent find relevant files — not a substitute for judgment.
4
+
5
+ REPO="${1:-.}"
6
+ cd "$REPO" 2>/dev/null || { echo "Cannot access $REPO"; exit 1; }
7
+
8
+ echo "=== Pillar 4: Policy & Governance ==="
9
+ echo ""
10
+
11
+ echo "-- .gitignore --"
12
+ if [ -f .gitignore ]; then
13
+ lines=$(wc -l < .gitignore | tr -d ' ')
14
+ echo "./.gitignore ($lines lines)"
15
+ # Check for agent-aware entries
16
+ agent_entries=$(grep -ci 'cursor\|claude\|copilot\|\.agent\|\.mcp' .gitignore 2>/dev/null)
17
+ [ "$agent_entries" -gt 0 ] && echo " ($agent_entries agent-related ignore entries)"
18
+ else
19
+ echo " (not found)"
20
+ fi
21
+
22
+ echo ""
23
+ echo "-- License --"
24
+ find . -maxdepth 1 -iname 'LICENSE*' -o -iname 'COPYING*' -o -iname 'MIT-LICENSE' 2>/dev/null | sort
25
+
26
+ echo ""
27
+ echo "-- Code ownership --"
28
+ find . -maxdepth 3 -name 'CODEOWNERS' 2>/dev/null | sort
29
+ if [ -f CODEOWNERS ] || [ -f .github/CODEOWNERS ] || [ -f docs/CODEOWNERS ]; then
30
+ f=$(find . -maxdepth 3 -name 'CODEOWNERS' 2>/dev/null | head -1)
31
+ rules=$(grep -c '^[^#]' "$f" 2>/dev/null | tr -d ' ')
32
+ echo " ($rules ownership rules)"
33
+ fi
34
+
35
+ echo ""
36
+ echo "-- Security policy --"
37
+ find . -maxdepth 3 -iname 'SECURITY*' 2>/dev/null | sort
38
+
39
+ echo ""
40
+ echo "-- Code of conduct --"
41
+ find . -maxdepth 2 -iname 'CODE_OF_CONDUCT*' -o -iname 'CONDUCT*' 2>/dev/null | sort
42
+
43
+ echo ""
44
+ echo "-- AI usage policy --"
45
+ # Check common locations for AI policy mentions
46
+ for f in AGENTS.md CLAUDE.md CONTRIBUTING.md; do
47
+ if [ -f "$f" ]; then
48
+ ai_mentions=$(grep -ci 'ai policy\|ai usage\|agent boundar\|ai contribut\|llm\|copilot' "$f" 2>/dev/null)
49
+ [ "$ai_mentions" -gt 0 ] && echo " $ai_mentions AI policy references in $f"
50
+ fi
51
+ done
52
+
53
+ echo ""
54
+ echo "-- Secrets management --"
55
+ if [ -d .github/workflows ]; then
56
+ secrets_refs=$(grep -roh '\${{ secrets\.[A-Z_]*' .github/workflows/ 2>/dev/null | sort -u | wc -l | tr -d ' ')
57
+ echo " $secrets_refs distinct secrets referenced in CI"
58
+ fi
59
+ find . -maxdepth 2 -name '.env.example' -o -name '.env.template' 2>/dev/null | sort
60
+ find . -maxdepth 2 -name 'vault.hcl' -o -name '.vault-token' 2>/dev/null | sort
61
+
62
+ echo ""
63
+ echo "-- Security scanning --"
64
+ if [ -d .github/workflows ]; then
65
+ for scanner in codeql snyk trivy gosec semgrep; do
66
+ grep -ril "$scanner" .github/workflows/ 2>/dev/null | while read f; do
67
+ echo " $scanner in $(basename "$f")"
68
+ done
69
+ done
70
+ fi
71
+ find . -maxdepth 2 -name '.snyk' -o -name '.trivyignore' 2>/dev/null | sort
72
+
73
+ echo ""
74
+ echo "-- Git attributes --"
75
+ if [ -f .gitattributes ]; then
76
+ lines=$(wc -l < .gitattributes | tr -d ' ')
77
+ echo "./.gitattributes ($lines lines)"
78
+ linguist=$(grep -c 'linguist' .gitattributes 2>/dev/null)
79
+ [ "$linguist" -gt 0 ] && echo " ($linguist linguist overrides)"
80
+ lfs=$(grep -c 'filter=lfs' .gitattributes 2>/dev/null)
81
+ [ "$lfs" -gt 0 ] && echo " ($lfs LFS-tracked patterns)"
82
+ else
83
+ echo " (not found)"
84
+ fi
85
+
86
+ echo ""
87
+ echo "-- Contributor agreement --"
88
+ find . -maxdepth 2 -iname 'DCO*' -o -iname 'CLA*' 2>/dev/null | sort
89
+ for f in CONTRIBUTING.md .github/workflows/*.yml; do
90
+ [ -f "$f" ] && grep -qi 'signed-off-by\|DCO\|CLA\|contributor license' "$f" 2>/dev/null \
91
+ && echo " DCO/CLA reference in $(basename "$f")"
92
+ done
93
+
94
+ echo ""
95
+ echo "-- Governance model --"
96
+ find . -maxdepth 2 -iname 'GOVERNANCE*' -o -iname 'MAINTAINERS*' -o -iname 'OWNERS*' 2>/dev/null | sort
97
+
98
+ echo ""
99
+ echo "-- CI workflow validation --"
100
+ if [ -d .github/workflows ]; then
101
+ grep -rl 'actionlint' .github/workflows/ 2>/dev/null | head -3
102
+ fi
103
+ if [ -f .pre-commit-config.yaml ]; then
104
+ grep -q 'actionlint' .pre-commit-config.yaml 2>/dev/null && echo " actionlint in pre-commit"
105
+ fi
106
+
107
+ echo ""
108
+ echo "-- Environment separation --"
109
+ find . -maxdepth 2 -name '.env.test' -o -name '.env.production' -o -name '.env.staging' \
110
+ -o -name '.env.development' 2>/dev/null | sort
111
+ for d in config/environments environments; do
112
+ [ -d "$d" ] && echo "./$d/ ($(ls "$d" | wc -l | tr -d ' ') environments)"
113
+ done