@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.
- package/.agents/skills/custom-codereview-guide.md +25 -0
- package/.github/pull_request_template.md +38 -0
- package/.github/release.yml +14 -0
- package/.github/workflows/check-extensions.yml +72 -0
- package/.github/workflows/npm-publish.yml +89 -0
- package/.github/workflows/pr.yml +30 -0
- package/.github/workflows/release.yml +24 -0
- package/.github/workflows/tests.yml +25 -0
- package/.github/workflows/vulnerability-scan.yml +87 -0
- package/.release-please-manifest.json +3 -0
- package/AGENTS.md +132 -0
- package/README.md +10 -0
- package/analysis_results.md +162 -0
- package/marketplaces/large-codebase.json +66 -0
- package/marketplaces/openhands-extensions.json +682 -0
- package/package.json +4 -10
- package/plugins/README.md +30 -0
- package/plugins/city-weather/.plugin/plugin.json +13 -0
- package/plugins/city-weather/README.md +145 -0
- package/plugins/city-weather/commands/now.md +56 -0
- package/plugins/cobol-modernization/.plugin/plugin.json +19 -0
- package/plugins/cobol-modernization/README.md +201 -0
- package/plugins/cobol-modernization/references/troubleshooting.md +18 -0
- package/plugins/cobol-modernization/skills/build-setup/SKILL.md +78 -0
- package/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +32 -0
- package/plugins/cobol-modernization/skills/cobol-modernization-overview/SKILL.md +113 -0
- package/plugins/cobol-modernization/skills/mainfraime-removal/SKILL.md +62 -0
- package/plugins/cobol-modernization/skills/mainfraime-removal/references/cics-transformation-examples.md +45 -0
- package/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +78 -0
- package/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +59 -0
- package/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +58 -0
- package/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +19 -0
- package/plugins/issue-duplicate-checker/.plugin/plugin.json +13 -0
- package/plugins/issue-duplicate-checker/README.md +51 -0
- package/plugins/issue-duplicate-checker/action.yml +349 -0
- package/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +569 -0
- package/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +681 -0
- package/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.js +220 -0
- package/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.js +27 -0
- package/plugins/magic-test/.plugin/plugin.json +13 -0
- package/plugins/magic-test/skills/magic-word/SKILL.md +33 -0
- package/plugins/migration-scoring/.plugin/plugin.json +19 -0
- package/plugins/migration-scoring/README.md +244 -0
- package/plugins/migration-scoring/skills/migration-mapping/SKILL.md +72 -0
- package/plugins/migration-scoring/skills/migration-report/SKILL.md +118 -0
- package/plugins/migration-scoring/skills/migration-scoring-overview/SKILL.md +126 -0
- package/plugins/migration-scoring/skills/score-quality/SKILL.md +54 -0
- package/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +30 -0
- package/plugins/migration-scoring/skills/score-style/SKILL.md +106 -0
- package/plugins/onboarding/.plugin/plugin.json +20 -0
- package/plugins/onboarding/README.md +30 -0
- package/plugins/onboarding/references/criteria.md +144 -0
- package/plugins/onboarding/skills/agent-readiness-report/README.md +23 -0
- package/plugins/onboarding/skills/agent-readiness-report/SKILL.md +122 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +88 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +114 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +133 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +113 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +127 -0
- package/plugins/onboarding/skills/improve-agent-readiness/README.md +19 -0
- package/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +167 -0
- package/plugins/onboarding/skills/setup-agents-md/README.md +15 -0
- package/plugins/onboarding/skills/setup-agents-md/SKILL.md +150 -0
- package/plugins/onboarding/skills/setup-openhands/README.md +20 -0
- package/plugins/onboarding/skills/setup-openhands/SKILL.md +56 -0
- package/plugins/onboarding/skills/setup-pr-review/README.md +23 -0
- package/plugins/onboarding/skills/setup-pr-review/SKILL.md +72 -0
- package/plugins/openhands/.plugin/plugin.json +13 -0
- package/plugins/openhands/README.md +52 -0
- package/plugins/openhands/SKILL.md +61 -0
- package/plugins/openhands/commands/create.md +55 -0
- package/plugins/openhands/commands/openhands-cloud.md +8 -0
- package/plugins/openhands/scripts/run.sh +69 -0
- package/plugins/pr-review/.plugin/plugin.json +13 -0
- package/plugins/pr-review/README.md +393 -0
- package/plugins/pr-review/action.yml +298 -0
- package/plugins/pr-review/scripts/agent_script.py +1282 -0
- package/plugins/pr-review/scripts/evaluate_review.py +655 -0
- package/plugins/pr-review/scripts/prompt.py +260 -0
- package/plugins/pr-review/workflows/pr-review-by-openhands.yml +51 -0
- package/plugins/pr-review/workflows/pr-review-evaluation.yml +85 -0
- package/plugins/qa-changes/.plugin/plugin.json +11 -0
- package/plugins/qa-changes/README.md +185 -0
- package/plugins/qa-changes/action.yml +181 -0
- package/plugins/qa-changes/scripts/agent_script.py +406 -0
- package/plugins/qa-changes/scripts/evaluate_qa_changes.py +385 -0
- package/plugins/qa-changes/scripts/prompt.py +174 -0
- package/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +50 -0
- package/plugins/qa-changes/workflows/qa-changes-evaluation.yml +85 -0
- package/plugins/release-notes/.plugin/plugin.json +19 -0
- package/plugins/release-notes/README.md +283 -0
- package/plugins/release-notes/SKILL.md +83 -0
- package/plugins/release-notes/action.yml +117 -0
- package/plugins/release-notes/commands/release-notes.md +8 -0
- package/plugins/release-notes/scripts/agent_script.py +292 -0
- package/plugins/release-notes/scripts/generate_release_notes.py +733 -0
- package/plugins/release-notes/scripts/prompt.py +90 -0
- package/plugins/release-notes/scripts/validate_release_notes.py +328 -0
- package/plugins/release-notes/workflows/release-notes.yml +76 -0
- package/plugins/vulnerability-remediation/.plugin/plugin.json +19 -0
- package/plugins/vulnerability-remediation/README.md +217 -0
- package/plugins/vulnerability-remediation/action.yml +187 -0
- package/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +561 -0
- package/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +87 -0
- package/pyproject.toml +12 -0
- package/release-please-config.json +16 -0
- package/scripts/sync_extensions.py +494 -0
- package/scripts/sync_openhands_sdk_skill.py +264 -0
- package/skills/README.md +159 -0
- package/skills/add-javadoc/.plugin/plugin.json +18 -0
- package/skills/add-javadoc/README.md +40 -0
- package/skills/add-javadoc/SKILL.md +35 -0
- package/skills/add-javadoc/references/example.md +32 -0
- package/skills/add-skill/.plugin/plugin.json +18 -0
- package/skills/add-skill/README.md +67 -0
- package/skills/add-skill/SKILL.md +47 -0
- package/skills/add-skill/scripts/fetch_skill.py +259 -0
- package/skills/agent-creator/.plugin/plugin.json +20 -0
- package/skills/agent-creator/README.md +104 -0
- package/skills/agent-creator/SKILL.md +190 -0
- package/skills/agent-creator/commands/agent-creator.md +8 -0
- package/skills/agent-creator/references/fallback.md +117 -0
- package/skills/agent-memory/.plugin/plugin.json +18 -0
- package/skills/agent-memory/README.md +35 -0
- package/skills/agent-memory/SKILL.md +30 -0
- package/skills/agent-memory/commands/remember.md +8 -0
- package/skills/agent-sdk-builder/.plugin/plugin.json +18 -0
- package/skills/agent-sdk-builder/README.md +40 -0
- package/skills/agent-sdk-builder/SKILL.md +37 -0
- package/skills/agent-sdk-builder/commands/agent-builder.md +8 -0
- package/skills/azure-devops/.plugin/plugin.json +18 -0
- package/skills/azure-devops/README.md +55 -0
- package/skills/azure-devops/SKILL.md +50 -0
- package/skills/bitbucket/.plugin/plugin.json +17 -0
- package/skills/bitbucket/README.md +50 -0
- package/skills/bitbucket/SKILL.md +45 -0
- package/skills/code-review/.plugin/plugin.json +19 -0
- package/skills/code-review/README.md +18 -0
- package/skills/code-review/SKILL.md +208 -0
- package/skills/code-review/commands/codereview-roasted.md +8 -0
- package/skills/code-review/commands/codereview.md +8 -0
- package/skills/code-review/references/risk-evaluation.md +41 -0
- package/skills/code-review/references/supply-chain-security.md +31 -0
- package/skills/code-simplifier/.plugin/plugin.json +21 -0
- package/skills/code-simplifier/README.md +30 -0
- package/skills/code-simplifier/SKILL.md +91 -0
- package/skills/code-simplifier/commands/simplify.md +8 -0
- package/skills/code-simplifier/references/code-quality-review.md +86 -0
- package/skills/code-simplifier/references/code-reuse-review.md +63 -0
- package/skills/code-simplifier/references/efficiency-review.md +81 -0
- package/skills/datadog/.plugin/plugin.json +19 -0
- package/skills/datadog/README.md +100 -0
- package/skills/datadog/SKILL.md +95 -0
- package/skills/deno/.plugin/plugin.json +18 -0
- package/skills/deno/README.md +5 -0
- package/skills/deno/SKILL.md +99 -0
- package/skills/deno/references/README.md +6 -0
- package/skills/discord/.plugin/plugin.json +18 -0
- package/skills/discord/README.md +31 -0
- package/skills/discord/SKILL.md +109 -0
- package/skills/discord/__init__.py +0 -0
- package/skills/discord/references/REFERENCE.md +78 -0
- package/skills/discord/scripts/__init__.py +0 -0
- package/skills/discord/scripts/_http.py +127 -0
- package/skills/discord/scripts/post_webhook.py +106 -0
- package/skills/discord/scripts/send_message.py +102 -0
- package/skills/docker/.plugin/plugin.json +17 -0
- package/skills/docker/README.md +34 -0
- package/skills/docker/SKILL.md +29 -0
- package/skills/evidence-based-citations/.plugin/plugin.json +20 -0
- package/skills/evidence-based-citations/README.md +31 -0
- package/skills/evidence-based-citations/SKILL.md +59 -0
- package/skills/flarglebargle/.plugin/plugin.json +16 -0
- package/skills/flarglebargle/README.md +14 -0
- package/skills/flarglebargle/SKILL.md +9 -0
- package/skills/frontend-design/.plugin/plugin.json +21 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/README.md +42 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/github/.plugin/plugin.json +19 -0
- package/skills/github/README.md +42 -0
- package/skills/github/SKILL.md +106 -0
- package/skills/github-pr-review/.plugin/plugin.json +18 -0
- package/skills/github-pr-review/README.md +145 -0
- package/skills/github-pr-review/SKILL.md +148 -0
- package/skills/github-pr-review/commands/github-pr-review.md +8 -0
- package/skills/github-pr-reviewer/.plugin/plugin.json +20 -0
- package/skills/github-pr-reviewer/README.md +34 -0
- package/skills/github-pr-reviewer/SKILL.md +89 -0
- package/skills/github-pr-reviewer/commands/pr-reviewer:setup.md +8 -0
- package/skills/github-repo-monitor/.plugin/plugin.json +22 -0
- package/skills/github-repo-monitor/README.md +70 -0
- package/skills/github-repo-monitor/SKILL.md +316 -0
- package/skills/github-repo-monitor/commands/github-monitor:poll.md +8 -0
- package/skills/github-repo-monitor/references/github-api.md +241 -0
- package/skills/github-repo-monitor/references/state-schema.md +160 -0
- package/skills/github-repo-monitor/scripts/main.py +915 -0
- package/skills/github-repo-monitor/tests/test_main.py +400 -0
- package/skills/gitlab/.plugin/plugin.json +17 -0
- package/skills/gitlab/README.md +37 -0
- package/skills/gitlab/SKILL.md +32 -0
- package/skills/incident-retrospective/.plugin/plugin.json +21 -0
- package/skills/incident-retrospective/README.md +34 -0
- package/skills/incident-retrospective/SKILL.md +98 -0
- package/skills/incident-retrospective/commands/incident-retro:setup.md +8 -0
- package/skills/iterate/.plugin/plugin.json +13 -0
- package/skills/iterate/README.md +25 -0
- package/skills/iterate/SKILL.md +399 -0
- package/skills/iterate/commands/babysit.md +8 -0
- package/skills/iterate/commands/iterate.md +8 -0
- package/skills/iterate/commands/verify.md +8 -0
- package/skills/iterate/references/heuristics.md +58 -0
- package/skills/iterate/references/verification.md +96 -0
- package/skills/jupyter/.plugin/plugin.json +18 -0
- package/skills/jupyter/README.md +55 -0
- package/skills/jupyter/SKILL.md +50 -0
- package/skills/kubernetes/.plugin/plugin.json +18 -0
- package/skills/kubernetes/README.md +53 -0
- package/skills/kubernetes/SKILL.md +48 -0
- package/skills/learn-from-code-review/.plugin/plugin.json +19 -0
- package/skills/learn-from-code-review/README.md +64 -0
- package/skills/learn-from-code-review/SKILL.md +186 -0
- package/skills/learn-from-code-review/commands/learn-from-reviews.md +8 -0
- package/skills/linear/.plugin/plugin.json +19 -0
- package/skills/linear/README.md +58 -0
- package/skills/linear/SKILL.md +213 -0
- package/skills/linear-triage/.plugin/plugin.json +21 -0
- package/skills/linear-triage/README.md +34 -0
- package/skills/linear-triage/SKILL.md +91 -0
- package/skills/linear-triage/commands/linear-triage:setup.md +8 -0
- package/skills/notion/.plugin/plugin.json +17 -0
- package/skills/notion/README.md +114 -0
- package/skills/notion/SKILL.md +109 -0
- package/skills/npm/.plugin/plugin.json +17 -0
- package/skills/npm/README.md +14 -0
- package/skills/npm/SKILL.md +9 -0
- package/skills/openhands-api/.plugin/plugin.json +22 -0
- package/skills/openhands-api/README.md +48 -0
- package/skills/openhands-api/SKILL.md +399 -0
- package/skills/openhands-api/references/README.md +33 -0
- package/skills/openhands-api/references/TROUBLESHOOTING.md +81 -0
- package/skills/openhands-api/references/example_prompt.md +12 -0
- package/skills/openhands-api/scripts/openhands_api.py +606 -0
- package/skills/openhands-api/scripts/openhands_api.ts +252 -0
- package/skills/openhands-automation/.plugin/plugin.json +19 -0
- package/skills/openhands-automation/README.md +89 -0
- package/skills/openhands-automation/SKILL.md +875 -0
- package/skills/openhands-automation/commands/automation:create.md +8 -0
- package/skills/openhands-automation/references/ab-testing.md +185 -0
- package/skills/openhands-automation/references/custom-automation.md +644 -0
- package/skills/openhands-sdk/.plugin/plugin.json +20 -0
- package/skills/openhands-sdk/README.md +22 -0
- package/skills/openhands-sdk/SKILL.md +229 -0
- package/skills/openhands-sdk/commands/sdk.md +8 -0
- package/skills/pdflatex/.plugin/plugin.json +18 -0
- package/skills/pdflatex/README.md +39 -0
- package/skills/pdflatex/SKILL.md +34 -0
- package/skills/prd/.plugin/plugin.json +19 -0
- package/skills/prd/README.md +28 -0
- package/skills/prd/SKILL.md +237 -0
- package/skills/prd/commands/prd.md +8 -0
- package/skills/qa-changes/README.md +18 -0
- package/skills/qa-changes/SKILL.md +229 -0
- package/skills/qa-changes/commands/qa-changes.md +8 -0
- package/skills/release-notes/README.md +24 -0
- package/skills/release-notes/SKILL.md +19 -0
- package/skills/release-notes/commands/release-notes.md +8 -0
- package/skills/research-brief/.plugin/plugin.json +20 -0
- package/skills/research-brief/README.md +34 -0
- package/skills/research-brief/SKILL.md +99 -0
- package/skills/research-brief/commands/research-brief:setup.md +8 -0
- package/skills/security/.plugin/plugin.json +18 -0
- package/skills/security/README.md +38 -0
- package/skills/security/SKILL.md +33 -0
- package/skills/skill-creator/.plugin/plugin.json +17 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/README.md +182 -0
- package/skills/skill-creator/SKILL.md +545 -0
- package/skills/skill-creator/references/output-patterns.md +82 -0
- package/skills/skill-creator/references/workflows.md +28 -0
- package/skills/skill-creator/scripts/init_skill.py +303 -0
- package/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/slack-channel-monitor/.plugin/plugin.json +21 -0
- package/skills/slack-channel-monitor/README.md +91 -0
- package/skills/slack-channel-monitor/SKILL.md +276 -0
- package/skills/slack-channel-monitor/commands/slack-monitor:poll.md +8 -0
- package/skills/slack-channel-monitor/references/slack-api.md +207 -0
- package/skills/slack-channel-monitor/references/state-schema.md +180 -0
- package/skills/slack-channel-monitor/scripts/main.py +962 -0
- package/skills/slack-standup-digest/.plugin/plugin.json +21 -0
- package/skills/slack-standup-digest/README.md +34 -0
- package/skills/slack-standup-digest/SKILL.md +92 -0
- package/skills/slack-standup-digest/commands/standup-digest:setup.md +8 -0
- package/skills/spark-version-upgrade/.plugin/plugin.json +20 -0
- package/skills/spark-version-upgrade/README.md +54 -0
- package/skills/spark-version-upgrade/SKILL.md +233 -0
- package/skills/ssh/.plugin/plugin.json +18 -0
- package/skills/ssh/README.md +140 -0
- package/skills/ssh/SKILL.md +135 -0
- package/skills/swift-linux/.plugin/plugin.json +17 -0
- package/skills/swift-linux/README.md +86 -0
- package/skills/swift-linux/SKILL.md +81 -0
- package/skills/theme-factory/.plugin/plugin.json +19 -0
- package/skills/theme-factory/LICENSE.txt +202 -0
- package/skills/theme-factory/README.md +58 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/theme-factory/themes/desert-rose.md +19 -0
- package/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/theme-factory/themes/golden-hour.md +19 -0
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/uv/.plugin/plugin.json +18 -0
- package/skills/uv/README.md +5 -0
- package/skills/uv/SKILL.md +95 -0
- package/skills/uv/references/README.md +5 -0
- package/skills/vercel/.plugin/plugin.json +18 -0
- package/skills/vercel/README.md +108 -0
- package/skills/vercel/SKILL.md +103 -0
- package/tests/test_add_skill_installs_to_agents_dir.py +42 -0
- package/tests/test_catalogs.py +109 -0
- package/tests/test_code_review_risk_evaluation.py +94 -0
- package/tests/test_issue_duplicate_checker.py +240 -0
- package/tests/test_openhands_api_python.py +152 -0
- package/tests/test_plugin_manifest.py +83 -0
- package/tests/test_pr_review_diff_payload.py +202 -0
- package/tests/test_pr_review_feedback.py +263 -0
- package/tests/test_pr_review_prompt.py +152 -0
- package/tests/test_pr_review_review_context.py +253 -0
- package/tests/test_qa_changes.py +232 -0
- package/tests/test_qa_changes_evaluation.py +259 -0
- package/tests/test_release_notes_generator.py +990 -0
- package/tests/test_sdk_loading.py +150 -0
- package/tests/test_skill_plugin_loading.py +149 -0
- package/tests/test_skills_have_readme.py +66 -0
- package/tests/test_sync_extensions.py +292 -0
- package/tests/test_workflow_sync.py +46 -0
- package/utils/analysis/README.md +7 -0
- package/utils/analysis/laminar_signals/README.md +211 -0
- package/utils/analysis/laminar_signals/analyze.py +780 -0
- package/utils/analysis/laminar_signals/templates/default.j2 +49 -0
- 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
|