Showing preview only (4,403K chars total). Download the full file or copy to clipboard to get everything.
Repository: hesreallyhim/awesome-claude-code
Branch: main
Commit: fd330b1625d2
Files: 260
Total size: 4.2 MB
Directory structure:
gitextract_qi3ecgdm/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── recommend-resource.yml
│ │ └── repository-enhancement.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── README.md
│ ├── check-repo-health.yml
│ ├── ci.yml
│ ├── close-resource-pr.yml
│ ├── close-resource-prs.yml
│ ├── handle-resource-submission-commands.yml
│ ├── notify-on-merge.yml
│ ├── submission-enforcement-v2.yml
│ ├── submission-enforcement.yml
│ ├── update-github-release-data.yml
│ ├── update-repo-ticker.yml
│ ├── validate-links.yml
│ └── validate-new-issue.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .python-version
├── LICENSE
├── Makefile
├── README.md
├── README_ALTERNATIVES/
│ ├── README_AWESOME.md
│ ├── README_CLASSIC.md
│ ├── README_EXTRA.md
│ ├── README_FLAT_ALL_AZ.md
│ ├── README_FLAT_ALL_CREATED.md
│ ├── README_FLAT_ALL_RELEASES.md
│ ├── README_FLAT_ALL_UPDATED.md
│ ├── README_FLAT_CLAUDE-MD_AZ.md
│ ├── README_FLAT_CLAUDE-MD_CREATED.md
│ ├── README_FLAT_CLAUDE-MD_RELEASES.md
│ ├── README_FLAT_CLAUDE-MD_UPDATED.md
│ ├── README_FLAT_CLIENTS_AZ.md
│ ├── README_FLAT_CLIENTS_CREATED.md
│ ├── README_FLAT_CLIENTS_RELEASES.md
│ ├── README_FLAT_CLIENTS_UPDATED.md
│ ├── README_FLAT_COMMANDS_AZ.md
│ ├── README_FLAT_COMMANDS_CREATED.md
│ ├── README_FLAT_COMMANDS_RELEASES.md
│ ├── README_FLAT_COMMANDS_UPDATED.md
│ ├── README_FLAT_DOCS_AZ.md
│ ├── README_FLAT_DOCS_CREATED.md
│ ├── README_FLAT_DOCS_RELEASES.md
│ ├── README_FLAT_DOCS_UPDATED.md
│ ├── README_FLAT_HOOKS_AZ.md
│ ├── README_FLAT_HOOKS_CREATED.md
│ ├── README_FLAT_HOOKS_RELEASES.md
│ ├── README_FLAT_HOOKS_UPDATED.md
│ ├── README_FLAT_SKILLS_AZ.md
│ ├── README_FLAT_SKILLS_CREATED.md
│ ├── README_FLAT_SKILLS_RELEASES.md
│ ├── README_FLAT_SKILLS_UPDATED.md
│ ├── README_FLAT_STATUSLINE_AZ.md
│ ├── README_FLAT_STATUSLINE_CREATED.md
│ ├── README_FLAT_STATUSLINE_RELEASES.md
│ ├── README_FLAT_STATUSLINE_UPDATED.md
│ ├── README_FLAT_STYLES_AZ.md
│ ├── README_FLAT_STYLES_CREATED.md
│ ├── README_FLAT_STYLES_RELEASES.md
│ ├── README_FLAT_STYLES_UPDATED.md
│ ├── README_FLAT_TOOLING_AZ.md
│ ├── README_FLAT_TOOLING_CREATED.md
│ ├── README_FLAT_TOOLING_RELEASES.md
│ ├── README_FLAT_TOOLING_UPDATED.md
│ ├── README_FLAT_WORKFLOWS_AZ.md
│ ├── README_FLAT_WORKFLOWS_CREATED.md
│ ├── README_FLAT_WORKFLOWS_RELEASES.md
│ └── README_FLAT_WORKFLOWS_UPDATED.md
├── THE_RESOURCES_TABLE.csv
├── acc-config.yaml
├── data/
│ ├── repo-ticker-previous.csv
│ └── repo-ticker.csv
├── docs/
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── COOLDOWN.md
│ ├── HOW_IT_LOOKS.md
│ ├── HOW_IT_WORKS.md
│ ├── README-GENERATION.md
│ ├── REPO_TICKER.md
│ ├── SECURITY.md
│ ├── TESTING.md
│ └── development/
│ ├── cooldown-enforcement.md
│ ├── do-not-forget.md
│ ├── path-resolution-migration-plan.md
│ ├── path-resolution-strategy.final.md
│ ├── summary-rendering-cheatsheet.md
│ ├── tech-debt.md
│ ├── toc-anchor-generation.md
│ └── vintage-manual-animation-style-guide.md
├── pyproject.toml
├── resources/
│ ├── README.md
│ ├── claude.md-files/
│ │ ├── AI-IntelliJ-Plugin/
│ │ │ └── CLAUDE.md
│ │ ├── AVS-Vibe-Developer-Guide/
│ │ │ └── CLAUDE.md
│ │ ├── AWS-MCP-Server/
│ │ │ └── CLAUDE.md
│ │ ├── Basic-Memory/
│ │ │ └── CLAUDE.md
│ │ ├── Comm/
│ │ │ └── CLAUDE.md
│ │ ├── Course-Builder/
│ │ │ └── CLAUDE.md
│ │ ├── Cursor-Tools/
│ │ │ └── CLAUDE.md
│ │ ├── DroidconKotlin/
│ │ │ └── CLAUDE.md
│ │ ├── EDSL/
│ │ │ └── CLAUDE.md
│ │ ├── Giselle/
│ │ │ └── CLAUDE.md
│ │ ├── Guitar/
│ │ │ └── CLAUDE.md
│ │ ├── JSBeeb/
│ │ │ └── CLAUDE.md
│ │ ├── Lamoom-Python/
│ │ │ └── CLAUDE.md
│ │ ├── LangGraphJS/
│ │ │ └── CLAUDE.md
│ │ ├── Network-Chronicles/
│ │ │ └── CLAUDE.md
│ │ ├── Note-Companion/
│ │ │ └── CLAUDE.md
│ │ ├── Pareto-Mac/
│ │ │ └── CLAUDE.md
│ │ ├── Perplexity-MCP/
│ │ │ └── CLAUDE.md
│ │ ├── SG-Cars-Trends-Backend/
│ │ │ └── CLAUDE.md
│ │ ├── SPy/
│ │ │ └── CLAUDE.md
│ │ ├── TPL/
│ │ │ └── CLAUDE.md
│ │ └── claude-code-mcp-enhanced/
│ │ └── CLAUDE.md
│ ├── official-documentation/
│ │ ├── Anthropic-Quickstarts/
│ │ │ └── CLAUDE.md
│ │ └── Claude-Code-GitHub-Actions/
│ │ ├── ci-failure-auto-fix.yml
│ │ ├── claude.yml
│ │ ├── issue-deduplication.yml
│ │ ├── issue-triage.yml
│ │ ├── manual-code-analysis.yml
│ │ ├── pr-review-comprehensive.yml
│ │ ├── pr-review-filtered-authors.yml
│ │ └── pr-review-filtered-paths.yml
│ ├── slash-commands/
│ │ ├── act/
│ │ │ └── act.md
│ │ ├── add-to-changelog/
│ │ │ └── add-to-changelog.md
│ │ ├── clean/
│ │ │ └── clean.md
│ │ ├── commit/
│ │ │ └── commit.md
│ │ ├── context-prime/
│ │ │ └── context-prime.md
│ │ ├── create-hook/
│ │ │ └── create-hook.md
│ │ ├── create-jtbd/
│ │ │ └── create-jtbd.md
│ │ ├── create-pr/
│ │ │ └── create-pr.md
│ │ ├── create-prd/
│ │ │ └── create-prd.md
│ │ ├── create-prp/
│ │ │ └── create-prp.md
│ │ ├── create-pull-request/
│ │ │ └── create-pull-request.md
│ │ ├── create-worktrees/
│ │ │ └── create-worktrees.md
│ │ ├── fix-github-issue/
│ │ │ └── fix-github-issue.md
│ │ ├── husky/
│ │ │ └── husky.md
│ │ ├── initref/
│ │ │ └── initref.md
│ │ ├── load-llms-txt/
│ │ │ └── load-llms-txt.md
│ │ ├── optimize/
│ │ │ └── optimize.md
│ │ ├── pr-review/
│ │ │ └── pr-review.md
│ │ ├── release/
│ │ │ └── release.md
│ │ ├── testing_plan_integration/
│ │ │ └── testing_plan_integration.md
│ │ ├── todo/
│ │ │ └── todo.md
│ │ ├── update-branch-name/
│ │ │ └── update-branch-name.md
│ │ └── update-docs/
│ │ └── update-docs.md
│ └── workflows-knowledge-guides/
│ ├── Blogging-Platform-Instructions/
│ │ └── view_commands.md
│ └── Design-Review-Workflow/
│ ├── README.md
│ ├── design-principles-example.md
│ ├── design-review-agent.md
│ ├── design-review-claude-md-snippet.md
│ └── design-review-slash-command.md
├── scripts/
│ ├── README.md
│ ├── __init__.py
│ ├── archive/
│ │ ├── README.md
│ │ └── __init__.py
│ ├── badges/
│ │ ├── BADGE_AUTOMATION_SETUP.md
│ │ ├── __init__.py
│ │ ├── badge_notification.py
│ │ └── badge_notification_core.py
│ ├── categories/
│ │ ├── __init__.py
│ │ ├── add_category.py
│ │ └── category_utils.py
│ ├── graphics/
│ │ ├── __init__.py
│ │ └── generate_logo_svgs.py
│ ├── ids/
│ │ ├── __init__.py
│ │ ├── generate_resource_id.py
│ │ └── resource_id.py
│ ├── maintenance/
│ │ ├── __init__.py
│ │ ├── check_repo_health.py
│ │ └── update_github_release_data.py
│ ├── py.typed
│ ├── readme/
│ │ ├── __init__.py
│ │ ├── generate_readme.py
│ │ ├── generators/
│ │ │ ├── __init__.py
│ │ │ ├── awesome.py
│ │ │ ├── base.py
│ │ │ ├── flat.py
│ │ │ ├── minimal.py
│ │ │ └── visual.py
│ │ ├── helpers/
│ │ │ ├── __init__.py
│ │ │ ├── generate_toc_assets.py
│ │ │ ├── readme_assets.py
│ │ │ ├── readme_config.py
│ │ │ ├── readme_paths.py
│ │ │ └── readme_utils.py
│ │ ├── markup/
│ │ │ ├── __init__.py
│ │ │ ├── awesome.py
│ │ │ ├── flat.py
│ │ │ ├── minimal.py
│ │ │ ├── shared.py
│ │ │ └── visual.py
│ │ └── svg_templates/
│ │ ├── __init__.py
│ │ ├── badges.py
│ │ ├── dividers.py
│ │ ├── headers.py
│ │ ├── py.typed
│ │ └── toc.py
│ ├── resources/
│ │ ├── __init__.py
│ │ ├── create_resource_pr.py
│ │ ├── detect_informal_submission.py
│ │ ├── download_resources.py
│ │ ├── parse_issue_form.py
│ │ ├── resource_utils.py
│ │ └── sort_resources.py
│ ├── testing/
│ │ ├── __init__.py
│ │ ├── test_regenerate_cycle.py
│ │ └── validate_toc_anchors.py
│ ├── ticker/
│ │ ├── __init__.py
│ │ ├── fetch_repo_ticker_data.py
│ │ └── generate_ticker_svg.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── git_utils.py
│ │ ├── github_utils.py
│ │ └── repo_root.py
│ └── validation/
│ ├── __init__.py
│ ├── validate_links.py
│ └── validate_single_resource.py
├── templates/
│ ├── README_AWESOME.template.md
│ ├── README_CLASSIC.template.md
│ ├── README_EXTRA.template.md
│ ├── announcements.yaml
│ ├── categories.yaml
│ ├── footer.template.md
│ └── resource-overrides.yaml
├── tests/
│ ├── conftest.py
│ ├── fixtures/
│ │ ├── expected_toc_anchors.txt
│ │ ├── github-html/
│ │ │ ├── awesome-root.html
│ │ │ ├── classic-non-root.html
│ │ │ ├── extra-non-root.html
│ │ │ └── flat-non-root.html
│ │ └── informal_issues/
│ │ ├── informal_recommendation_medium_confidence.json
│ │ ├── informal_structured_high_confidence.json
│ │ ├── proper_template_with_labels_a.json
│ │ └── proper_template_with_labels_b.json
│ ├── temp-verify-override-autolock.temp.py
│ ├── test_asset_path_resolution.py
│ ├── test_badge_notification_validation.py
│ ├── test_category_utils.py
│ ├── test_detect_informal_submission.py
│ ├── test_fetch_repo_ticker_data.py
│ ├── test_flat_list_generator.py
│ ├── test_generate_readme.py
│ ├── test_generate_ticker_svg.py
│ ├── test_git_utils.py
│ ├── test_github_utils.py
│ ├── test_readme_alternative_outputs.py
│ ├── test_readme_config_path.py
│ ├── test_readme_generators_minimal_visual.py
│ ├── test_resource_utils.py
│ ├── test_sort_resources.py
│ ├── test_style_selector_paths.py
│ ├── test_toc_anchor_validation.py
│ ├── test_validate_links.py
│ └── test_validate_single_resource.py
└── tools/
├── __init__.py
└── readme_tree/
├── README.md
├── __init__.py
├── config.yaml
└── update_readme_tree.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/recommend-resource.yml
================================================
name: 🚀 Recommend New Resource
description: Recommend a new resource to be featured in Awesome Claude Code
title: "[Resource]: WRITE THE NAME OF YOUR RESOURCE HERE"
labels: ["resource-submission", "pending-validation"]
body:
- type: markdown
attributes:
value: |
## Welcome!
Thank you for recommending a resource to Awesome Claude Code! This form will guide you through the recommendation process.
Please make sure that you have already reviewed the [CONTRIBUTING](https://github.com/hesreallyhim/awesome-claude-code/blob/main/docs/CONTRIBUTING.md) document as well as the [CODE_OF_CONDUCT](https://github.com/hesreallyhim/awesome-claude-code/blob/main/docs/CODE_OF_CONDUCT.md), and that you agree to abide by the terms. Be really, really sure.
**WARNING: A strict spam-deterrent system has been put in place. Failure to comply with the simple requirements stated in the [CONTRIBUTING](https://github.com/hesreallyhim/awesome-claude-code/blob/main/docs/CONTRIBUTING.md) document will result in intreasingly severe penalties.**
**Resource Guidelines:**
- Issues must be submitted by human users using the github.com UI. The system does not allow resource submissions via the `gh` CLI or other programmatic means. Doing so violates the Code of Conduct and submissions will be automatically closed.
- Ensure that you have actually visited this repo before and reviewed the entries on the list. Recommendations must be unique from existing resources, and should be of an equally high caliber.
- Avoid submitting resources that violate the Claude Code Usage Policy,or the licensing rights of other independent developers.
- Recommendations will be closely scrutinized for security and potential risk.
- Although most recommendations are submitted by the authors, you may submit any resource that you love.
- The system does not allow resource submissions via the `gh` CLI.
- Resources must be at least one week old.
**Tips and Tricks for a Speedy Review:**
- Please provide clear installation AND uninstallation instructions for any installable resources.
- If your resource requires me to execute a bash script, you **must** provide me with a clearly annotated/commented version in which everything is documented clearly. I _can_ read Bash, but it hurts my eyes after a while.
- Short examples or demos are tremendously helpful in the review process. If I can see it in action before I think about running it, you're way ahead of the curve.
- If your resource requires elevated access or "--dangerously-skip-permissions", please make sure the user is aware of this(!)
- If your resource involves making ANY network requests except to the Anthropic API, you **must** state that here.
- Offering an auto-update functionality for a library may be a very nice convenience for people. (Similarly, `npx @latest`). However, this is also a known threat vector and will be viewed with caution.
- If you are claiming that a resource improves Claude's capacity to perform some particular action, these claims must be backed by evidence. It's your job to provide the evidence, not mine.
- Try to submit _focused_ resources that differentiate your project from others, not general-purpose marketplaces.
- Avoid submitting complex systems that require long onboarding or extensive training in a particular methodology.
**Ask Claude for a Candid Review:**
When I review your recommendation, I will ask my assistant Claude Code to perform a review (this is to assist me - I do not base my judgment on this review alone.) You can find the type of prompt in `.claude/commands/evaluate-repository.md`. I recommend that you run this evaluation yourself ahead of time. Also, ask yourself: "Could Opus build this in one session?"
After submission, our automated system will validate whether your Issue is well-formed with respect to the requirements of the template, and post the results as a comment. (This is merely a formality and does not constitute a review.)
Once your recommendation has been validated, you've done your job - the project has been recommended. I do my best to review recommendations. That summarizes the extent of my obligation. If I raise any further questions about your project, it's usually because I'm interested in it, and want to understand it better. Don't make any changes solely on the basis of my feedback.
- type: input
id: display_name
attributes:
label: Display Name
description: The name of the resource as it will appear in the list
placeholder: "e.g., My Awesome Tool, /my-command, claude-helper"
validations:
required: true
- type: dropdown
id: category
attributes:
label: Category
description: Select the primary category for your resource (note that I'm currenlty lumping most things called "plugins" under "Agent Skills" until I figure out a better classification system).
options:
- Agent Skills
- Workflows & Knowledge Guides
- Tooling
- Status Lines
- Hooks
- Output Styles
- Slash-Commands
- CLAUDE.md Files
- Alternative Clients
- Official Documentation
validations:
required: true
- type: dropdown
id: subcategory
attributes:
label: Sub-Category
description: Select a sub-category if applicable (based on your category choice above)
options:
- General
- "Workflows & Knowledge Guides: Ralph Wiggum"
- "Tooling: IDE Integrations"
- "Tooling: Usage Monitors"
- "Tooling: Orchestrators"
- "Tooling: Config Managers"
- "Slash-Commands: Version Control & Git"
- "Slash-Commands: Code Analysis & Testing"
- "Slash-Commands: Context Loading & Priming"
- "Slash-Commands: Documentation & Changelogs"
- "Slash-Commands: CI / Deployment"
- "Slash-Commands: Project & Task Management"
- "Slash-Commands: Miscellaneous"
- "CLAUDE.md Files: Language-Specific"
- "CLAUDE.md Files: Domain-Specific"
- "CLAUDE.md Files: Project Scaffolding & MCP"
validations:
required: false
- type: input
id: primary_link
attributes:
label: Primary Link
description: The main URL for your resource (must start with https://). If you have a GitHub repo and a website, _use the GitHub repo_.
placeholder: "https://github.com/username/repository"
validations:
required: true
- type: input
id: author_name
attributes:
label: Author Name
description: "The author's name, alias, or GitHub username. (You may submit public/open-source resources that you do not own.)"
placeholder: "Jane Doe or janedoe"
validations:
required: true
- type: input
id: author_link
attributes:
label: Author Link
description: "Link to author's GitHub profile or personal website"
placeholder: "https://github.com/janedoe"
validations:
required: true
- type: dropdown
id: license
attributes:
label: License
description: Select the license for your resource (or choose 'Other' to specify something unlisted).
options:
- MIT
- Apache-2.0
- GPL-3.0
- BSD-3-Clause
- ISC
- MPL-2.0
- AGPL-3.0
- Unlicense
- CC0-1.0
- CC-BY-4.0
- CC-BY-SA-4.0
- "©"
- Other (specify below)
- No License / Not Specified
validations:
required: true
- type: input
id: license_other
attributes:
label: Other License
description: If you selected "Other" above, please specify the license
placeholder: "e.g., BSD-2-Clause, Proprietary"
validations:
required: false
- type: textarea
id: description
attributes:
label: Description
description: "A brief description of your resource (1-3 sentences maximum, no emojis) - follow the list's style - be descriptive, not promotional - do not address the reader"
placeholder: "Describe what your resource does and its key features..."
validations:
required: true
- type: markdown
attributes:
value: |
The following three fields are encouraged for all users. If you are recommending a plugin, skill, collection, framework, etc., then these are **mandatory**.
- type: textarea
id: validate_claims
attributes:
label: Validate Claims
description: "If you are submitting a complicated resource that gives Claude Code super-powers, suggest a low-friction way for me, or anyone, to prove it to themselves that what you're claiming is true. If you are submitting a plugin, skill, framework, or similar, this field is mandatory."
placeholder: "e.g., install this Skill and ask Claude how many times the letter 'r' appears in your codebase"
validations:
required: false
- type: textarea
id: validate_claim_part_2
attributes:
label: Specific Task(s)
description: "Tell me at least one specific task I should give to Claude Code to demonstrate the value of your resource."
placeholder: "e.g., install this Skill and give Claude a counting task."
validations:
required: false
- type: textarea
id: validate_claims_part_3
attributes:
label: Specific Prompt(s)
description: "Tell me what to say to Claude Code when I give it the task above. The more I have to figure things out for myself, the more likely it is that I will miss the unique value of your resource. So you are advised to be as specific as possible."
placeholder: "Ask Claude how many times the letter 'r' appears in your codebase"
validations:
required: false
- type: textarea
id: additional_comments
attributes:
label: Additional Comments
description: "Optional - Any additional information you'd like to share about your resource (not processed during validation)"
placeholder: "e.g., context about why you created this, special features, acknowledgments, etc."
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Recommendation Checklist
description: Please confirm the following
options:
- label: "I have checked that this resource hasn't already been submitted"
required: true
- label: It has been over one week since the first public commit to the repo I am recommending
required: true
- label: All provided links are working and publicly accessible
required: true
- label: I do NOT have any other open issues in this repository
required: true
- label: I am primarily composed of human-y stuff and not electrical circuits
required: true
- type: markdown
attributes:
value: |
## What happens next?
1. **Automated Validation**: Our bot will validate the well-formed-ness of this Issue and let you know if anything needs to be fixed
2. **Review**: If validation passes, you should go back to working on your library - your recommendation has been received. It will be reviewed at the discretion of the maintainer.
3. **Approval**: If approved, a PR will be automatically created with your resource
4. **Notification**: You'll be notified when your resource is added
Thank you for contributing to Awesome Claude Code. I have
================================================
FILE: .github/ISSUE_TEMPLATE/repository-enhancement.yml
================================================
name: 💡 Repository Enhancement
description: Suggest an improvement to the repository structure, categories, or processes
title: "[Enhancement]: "
labels: ["enhancement"]
assignees: []
body:
- type: markdown
attributes:
value: |
## Repository Enhancement Suggestion
Use this form to suggest improvements to Awesome Claude Code itself (not for submitting resources).
- type: dropdown
id: enhancement_type
attributes:
label: Enhancement Type
description: What kind of improvement are you suggesting?
options:
- New category or subcategory
- Repository structure
- Submission process
- Documentation
- Automation/workflows
- Other
validations:
required: true
- type: textarea
id: description
attributes:
label: Description
description: Describe your enhancement suggestion in detail
placeholder: "Explain what you'd like to see improved and why..."
validations:
required: true
- type: textarea
id: benefit
attributes:
label: Expected Benefit
description: How will this enhancement help the community?
placeholder: "This would help users by..."
validations:
required: true
- type: textarea
id: implementation
attributes:
label: Possible Implementation
description: If you have ideas on how to implement this, please share
placeholder: "One way to implement this could be..."
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Checklist
options:
- label: I've checked that this enhancement hasn't already been suggested
required: true
- label: This enhancement would improve the repository for the community
required: true
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
# Pull Request
If you want to submit a resource for recommendation for Awesome Claude Code, please use the [resource recommendation issue form](https://github.com/hesreallyhim/awesome-claude-code/issues/new?template=recommen-resource.yml) and don't open a PR.
It's fairly uncommon for anyone to open a PR to this repo, even the maintainer. However, if you've noticed a technical problem/bug or a documentation problem, then this may be appropriate. Otherwise, in general, only the bots get to make PRs.
## Type of Contribution
<!-- Select ONE by marking with an [x] -->
- [ ] **New Resource** - Adding a new resource to the list [ONLY THE BOT MAY DO THIS]
- [ ] **Update Resource** - Updating existing resource information (e.g., broken link, license info)
- [ ] **Repository Improvement** - Improving the repository itself (not adding resources) [Use [this issue template](https://github.com/hesreallyhim/awesome-claude-code/issues/new?template=repository-enhancement.yml) to suggest general improvements]
---
## For New Resources
### Resource Information
- **Display Name**: <!-- e.g., "Claude Task Manager" or "/commit" -->
- **Category**: <!-- Select from: Workflows & Knowledge Guides, Tooling, Hooks, Slash-Commands, CLAUDE.md Files, Official Documentation -->
- **Sub-Category** (if applicable): <!-- e.g., "Version Control & Git", "Code Analysis & Testing" -->
- **Primary Link**: <!-- The main URL for the resource -->
- **Author Name**: <!-- Creator/maintainer name -->
- **Author Link**: <!-- Link to author's profile -->
- **License** (if known): <!-- e.g., MIT, Apache-2.0, GPL-3.0 -->
### Description
<!-- 1-2 sentences describing what the resource does and why it's valuable to Claude Code users -->
### Automated Notification
<!-- Check if applicable -->
- [ ] This is a GitHub-hosted resource and will receive an automatic notification issue when merged
---
## For Resource Updates
### What Changed?
<!-- Describe what you're updating -->
- **Resource Name**:
- **Change Type**: <!-- e.g., Fix broken link, Update license, Update description -->
- **Details**:
---
## For Repository Improvements
### Description of Changes
<!-- Describe what you're improving and why -->
### Checklist for Repository Changes
- [ ] Changes follow existing code style
- [ ] Updated relevant documentation
- [ ] Tested changes locally
- [ ] Pre-commit hooks pass
---
## Additional Notes
<!-- Any additional context that would help reviewers -->
## Questions?
- See [CONTRIBUTING.md](../docs/CONTRIBUTING.md) for detailed contribution guidelines
================================================
FILE: .github/workflows/README.md
================================================
# GitHub Workflows
This directory contains GitHub Action workflows for repository maintenance, resource submission handling, and health monitoring.
---
## Workflow: Validate New Issue
**File:** `.github/workflows/validate-new-issue.yml`
### Purpose
Handles all new issues opened in the repository with two mutually exclusive jobs:
1. **validate-resource**: Validates properly-submitted resource recommendations (issues with `resource-submission` label)
2. **detect-informal**: Detects informal submissions that bypassed the issue template (issues without the label)
### Trigger
- `issues.opened` - New issue created
- `issues.reopened` - Issue reopened
- `issues.edited` - Issue body edited
### Job 1: Validate Resource Submission
Runs when an issue has the `resource-submission` label (applied automatically by the issue template).
**Behavior:**
- Parses the issue body using `scripts/resources/parse_issue_form.py`
- Validates all required fields (display name, category, URLs, etc.)
- Checks for duplicate resources in `THE_RESOURCES_TABLE.csv`
- Validates URL accessibility
- Posts validation results as a comment
- Updates labels: `validation-passed` or `validation-failed`
- Notifies maintainer when changes are made after `/request-changes`
### Job 2: Detect Informal Submission
Runs when a **new** issue does NOT have the `resource-submission` label.
**Purpose:** Catches users who try to recommend resources without using the official template.
**Detection Signals:**
| Signal Type | Examples | Weight |
|-------------|----------|--------|
| Template field labels | `Display Name:`, `Category:`, `Primary Link:` | Very strong (+0.7 for 3+) |
| Submission language | "recommend", "submit", "please add" | Strong (+0.3 each) |
| Resource mentions | "plugin", "skill", "hook", "slash command" | Medium (+0.15 each) |
| GitHub URLs | `github.com/user/repo` | Medium (+0.15) |
| License mentions | MIT, Apache, GPL | Medium (+0.15) |
| Bug/question language | "bug", "error", "how do I" | Negative (-0.2 each) |
**Two-Tier Response:**
| Confidence | Action |
|------------|--------|
| ≥ 0.6 (High) | Add `needs-template` label, post warning, **auto-close** |
| 0.4 - 0.6 (Medium) | Add `needs-template` label, post gentle warning, **leave open** |
| < 0.4 (Low) | No action |
### Local Usage
```bash
# Test informal submission detection
ISSUE_TITLE="Check out my plugin" ISSUE_BODY="I made this tool at github.com/user/repo" \
python -m scripts.resources.detect_informal_submission
```
### Related Scripts
- `scripts/resources/parse_issue_form.py` - Parses and validates issue form data
- `scripts/resources/detect_informal_submission.py` - Detects informal submissions
---
## Workflow: Handle Resource Submission Commands
**File:** `.github/workflows/handle-resource-submission-commands.yml`
### Purpose
Processes maintainer commands on resource submission issues.
### Commands
| Command | Description | Requirements |
|---------|-------------|--------------|
| `/approve` | Creates PR to add resource to CSV | Issue must have `validation-passed` label |
| `/reject [reason]` | Closes issue as rejected | Maintainer permission |
| `/request-changes [message]` | Requests changes from submitter | Maintainer permission |
### Trigger
- `issue_comment.created` on issues with `resource-submission` label
- Only processes comments from OWNER, MEMBER, or COLLABORATOR
---
## Workflow: Update GitHub Release Data
**File:** `.github/workflows/update-github-release-data.yml`
### Purpose
Updates `THE_RESOURCES_TABLE.csv` with:
- Latest commit date on the default branch (Last Modified)
- Latest GitHub Release date (Latest Release)
- Latest GitHub Release version (Release Version)
### Schedule
- Runs automatically every day at **3:00 AM UTC**
- Can be triggered manually via the GitHub Actions UI
### Local Usage
```bash
python -m scripts.maintenance.update_github_release_data
```
#### Options
```bash
python -m scripts.maintenance.update_github_release_data --help
```
- `--csv-file`: Path to CSV file (default: THE_RESOURCES_TABLE.csv)
- `--max`: Process at most N resources
- `--dry-run`: Print updates without writing changes
## Workflow: Check Repository Health
**File:** `.github/workflows/check-repo-health.yml`
### Purpose
Ensures that active GitHub repositories in the resource list are still maintained and responsive by checking:
- Number of open issues
- Date of last push or PR merge (last updated)
### Behavior
The workflow will **fail** if any repository:
- Has not been updated in over **6 months** AND
- Has more than **2 open issues**
Deleted or private repositories are logged as warnings but do not cause the workflow to fail.
### Schedule
- Runs automatically every **Monday at 9:00 AM UTC**
- Can be triggered manually via the GitHub Actions UI
### Local Usage
You can run the health check locally using:
```bash
make check-repo-health
```
Or directly with Python:
```bash
python3 -m scripts.maintenance.check_repo_health
```
#### Options
```bash
python3 -m scripts.maintenance.check_repo_health --help
```
- `--csv-file`: Path to CSV file (default: THE_RESOURCES_TABLE.csv)
- `--months`: Months threshold for outdated repos (default: 6)
- `--issues`: Open issues threshold (default: 2)
### Example Output
```
INFO: Reading repository list from THE_RESOURCES_TABLE.csv
INFO: Checking owner/repo (Resource Name)
INFO:
============================================================
INFO: Summary:
INFO: Total active GitHub repositories checked: 50
INFO: Deleted/unavailable repositories: 2
INFO: Problematic repositories: 0
INFO:
============================================================
INFO: ✅ HEALTH CHECK PASSED
INFO: All active repositories are healthy!
```
### Environment Variables
- `GITHUB_TOKEN`: GitHub personal access token or Actions token (recommended to avoid rate limiting)
The GitHub Actions workflow automatically uses the `GITHUB_TOKEN` secret provided by GitHub Actions.
================================================
FILE: .github/workflows/check-repo-health.yml
================================================
name: Check Repository Health
# This workflow checks the health of active GitHub repositories listed in THE_RESOURCES_TABLE.csv.
# It verifies that repositories are still active and maintained by checking:
# - Number of open issues
# - Date of last push or PR merge
#
# The workflow will fail if any repository:
# - Has not been updated in over 6 months AND
# - Has more than 2 open issues
#
# Deleted repositories are logged but do not cause the workflow to fail.
on:
schedule:
# Run weekly on Monday at 9:00 AM UTC
- cron: '0 9 * * 1'
workflow_dispatch: # Allow manual triggering
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PYTHONPATH: ${{ github.workspace }}
permissions:
contents: read
jobs:
check-repo-health:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -e ".[dev]"
- name: Run repository health check
run: |
python3 -m scripts.maintenance.check_repo_health
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
pull_request:
workflow_dispatch:
inputs:
docs_tree_check:
description: "Fail CI if README tree is out of date"
type: boolean
default: true
docs_tree_debug:
description: "Print diff/context on mismatch"
type: boolean
default: false
jobs:
ci:
runs-on: ubuntu-latest
env:
CI: true
# Defaults for push/PR
DOCS_TREE_CHECK: "1"
DOCS_TREE_DEBUG: "0"
PYTHONPATH: ${{ github.workspace }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- run: |
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"
- name: Run CI checks
run: make ci
env:
# Override defaults only for workflow_dispatch
DOCS_TREE_CHECK: ${{ github.event_name == 'workflow_dispatch' && (inputs.docs_tree_check && '1' || '0') || '1' }}
DOCS_TREE_DEBUG: ${{ github.event_name == 'workflow_dispatch' && (inputs.docs_tree_debug && '1' || '0') || '0' }}
================================================
FILE: .github/workflows/close-resource-pr.yml
================================================
name: Close Resource Submission PRs
on:
pull_request_target:
types: [opened]
jobs:
detect-and-close:
name: Detect Resource Submission PR
runs-on: ubuntu-latest
# Skip PRs from bots (GitHub Actions bot, Dependabot, etc.)
if: github.event.pull_request.user.type != 'Bot'
permissions:
pull-requests: write
steps:
- name: Check if PR is a resource submission
id: detect
uses: actions/github-script@v7
with:
script: |
const title = context.payload.pull_request.title || '';
const body = context.payload.pull_request.body || '';
const combined = `${title}\n${body}`.toLowerCase();
// ── High-signal title patterns ──────────────────────────
const highSignalTitlePatterns = [
// "Add [resource]: My Tool" or "Add [resource]: My Tool to Hooks"
/^add\s*\[resource\]\s*:/i,
// "[Resource]: My Tool"
/^\[resource\]\s*:/i,
// "Add <name> to <section>" (common PR title for list additions)
/^add\s+.+\s+to\s+(slash.?commands?|hooks?|claude\.?md|tooling|skills?|agent|mcp|plugins?|workflows?|status.?lines?)/i,
];
let titleHighSignal = false;
for (const pattern of highSignalTitlePatterns) {
if (pattern.test(title)) {
titleHighSignal = true;
console.log(`High-signal title match: ${pattern}`);
break;
}
}
// ── Body phrase patterns (medium signal) ────────────────
const bodyPhrases = [
/add(ing)?\s+(a\s+)?(new\s+)?resource/i,
/submit(ting)?\s+(a\s+)?resource/i,
/resource\s+(submission|recommendation)/i,
/please\s+add\s+(this|my)/i,
/adding\s+.+\s+to\s+the\s+(list|awesome\s+list)/i,
/new\s+entry\s+(for|in)\s+/i,
/recommend(ing)?\s+(this|a)\s+(tool|resource|project)/i,
];
let bodyMatchCount = 0;
for (const pattern of bodyPhrases) {
if (pattern.test(combined)) {
bodyMatchCount++;
console.log(`Body phrase match: ${pattern}`);
}
}
// ── CSV / README file changes (very high signal) ────────
// Check if the PR touches THE_RESOURCES_TABLE.csv or README.md
const files = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
per_page: 50,
});
let touchesResourceFiles = false;
for (const file of files.data) {
if (
file.filename === 'THE_RESOURCES_TABLE.csv' ||
file.filename === 'README.md' ||
file.filename.startsWith('README_ALTERNATIVES/')
) {
touchesResourceFiles = true;
console.log(`Touches resource file: ${file.filename}`);
break;
}
}
// ── Decision logic ──────────────────────────────────────
// High-signal title alone is enough
// Body phrases + resource file changes is enough
// 2+ body phrase matches is enough
const isResourceSubmission =
titleHighSignal ||
(bodyMatchCount >= 1 && touchesResourceFiles) ||
bodyMatchCount >= 2;
console.log(`Title high signal: ${titleHighSignal}`);
console.log(`Body match count: ${bodyMatchCount}`);
console.log(`Touches resource files: ${touchesResourceFiles}`);
console.log(`Is resource submission: ${isResourceSubmission}`);
core.setOutput('is_resource_submission', isResourceSubmission.toString());
- name: Post comment and close PR
if: steps.detect.outputs.is_resource_submission == 'true'
uses: actions/github-script@v7
with:
script: |
const pr_number = context.payload.pull_request.number;
const owner = context.repo.owner;
const repo = context.repo.repo;
const templateUrl = `https://github.com/${owner}/${repo}/issues/new?template=recommend-resource.yml`;
const contributingUrl = `https://github.com/${owner}/${repo}/blob/main/docs/CONTRIBUTING.md`;
const body = [
'## ⚠️ Resource submissions are not accepted via pull request',
'',
'Thank you for your interest in contributing to Awesome Claude Code!',
'',
'However, resource recommendations **must** be submitted through our issue template, not as a pull request. The entire resource pipeline — validation, review, and merging — is managed by automation. Even the maintainer does not use PRs to add entries to the list.',
'',
'**To submit your resource correctly:**',
'',
`1. 📖 Read the [CONTRIBUTING.md](${contributingUrl}) document`,
`2. 📝 [Submit your resource using the official template](${templateUrl})`,
'3. ✅ The bot will validate your submission automatically',
'4. 👀 A maintainer will review it once validation passes',
'',
'If this PR is **not** a resource submission (e.g., it\'s a bug fix or improvement), please comment below and we\'ll reopen it.',
'',
'---',
'*This PR has been automatically closed.*',
].join('\n');
await github.rest.issues.createComment({
owner,
repo,
issue_number: pr_number,
body,
});
await github.rest.pulls.update({
owner,
repo,
pull_number: pr_number,
state: 'closed',
});
await github.rest.issues.addLabels({
owner,
repo,
issue_number: pr_number,
labels: ['needs-template'],
});
================================================
FILE: .github/workflows/close-resource-prs.yml
================================================
name: Close Resource Submission PRs
on:
pull_request_target:
types: [opened]
jobs:
detect-and-close:
name: Classify and Close Resource PRs
runs-on: ubuntu-latest
if: github.event.pull_request.user.type != 'Bot'
permissions:
pull-requests: write
steps:
- name: Get changed files
id: files
uses: actions/github-script@v7
with:
script: |
const files = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
per_page: 50,
});
return files.data.map(f => f.filename).join('\n');
result-encoding: string
- name: Classify PR with Claude
id: classify
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_BODY: ${{ github.event.pull_request.body }}
PR_FILES: ${{ steps.files.outputs.result }}
run: |
# Use jq to safely construct JSON (handles all escaping)
PAYLOAD=$(jq -n \
--arg title "$PR_TITLE" \
--arg body "${PR_BODY:0:2000}" \
--arg files "$PR_FILES" \
'{
model: "claude-haiku-4-5-20251001",
max_tokens: 50,
system: "You classify GitHub pull requests for the awesome-claude-code repository (a curated awesome-list of tools, skills, hooks, and resources for the coding agent Claude Code).\n\nA \"resource submission\" is any PR that attempts to add, recommend, or promote a tool, project, library, skill, MCP server, hook, workflow, guide, or ANY resource whatsoever to the list. This includes any PR that edit THE_RESOURCES_TABLE.csv.\n\nA \"not resource submission\" is a PR that fixes bugs, improves CI/workflows, corrects typos, updates documentation about the repo itself (not adding a new external resource), refactors code, or makes other repository maintenance changes.\n\nRespond with ONLY a JSON object, no markdown fences: {\"classification\": \"resource_submission\" | \"not_resource_submission\", \"confidence\": \"high\" | \"low\"}",
messages: [
{
role: "user",
content: ("PR Title: " + $title + "\n\nPR Body:\n" + $body + "\n\nChanged files:\n" + $files)
}
]
}')
RESPONSE=$(curl -sf https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d "$PAYLOAD") || {
echo "API call failed"
echo "classification=error" >> "$GITHUB_OUTPUT"
echo "confidence=none" >> "$GITHUB_OUTPUT"
exit 0
}
# Extract Claude's text response, then parse the JSON within it
TEXT=$(echo "$RESPONSE" | jq -r '.content[0].text')
echo "Claude response: $TEXT"
CLASSIFICATION=$(echo "$TEXT" | jq -r '.classification // "error"')
CONFIDENCE=$(echo "$TEXT" | jq -r '.confidence // "low"')
echo "Classification: $CLASSIFICATION"
echo "Confidence: $CONFIDENCE"
echo "classification=$CLASSIFICATION" >> "$GITHUB_OUTPUT"
echo "confidence=$CONFIDENCE" >> "$GITHUB_OUTPUT"
- name: Post comment and close PR
if: steps.classify.outputs.classification == 'resource_submission'
uses: actions/github-script@v7
with:
script: |
const pr_number = context.payload.pull_request.number;
const owner = context.repo.owner;
const repo = context.repo.repo;
const templateUrl = `https://github.com/${owner}/${repo}/issues/new?template=recommend-resource.yml`;
const contributingUrl = `https://github.com/${owner}/${repo}/blob/main/docs/CONTRIBUTING.md`;
const body = [
'## ⚠️ Resource recommendations are not accepted via pull request',
'',
'Thank you for your interest in contributing to Awesome Claude Code!',
'',
'However, resource recommendations **must** be submitted through our issue template, not as a pull request. The entire resource pipeline — validation, review, and merging — is managed by automatioEven the maintainer does not use PRs to add entries to the list.',
'',
'**To submit your resource correctly:**',
'',
`1. 📖 Read the [CONTRIBUTING.md](${contributingUrl}) document`,
`2. 📝 [Submit your resource using the official template](${templateUrl})`,
'3. ✅ The bot will validate your submission automatically',
'4. 👀 A maintainer will review it once validation passes',
'',
'If this PR is **not** a resource submission (e.g., it\'s a bug fix or improvement), please comment below and we\'ll reopen it.',
'',
'---',
'*This PR was automatically closed.*',
].join('\n');
await github.rest.issues.createComment({
owner,
repo,
issue_number: pr_number,
body,
});
await github.rest.pulls.update({
owner,
repo,
pull_number: pr_number,
state: 'closed',
});
await github.rest.issues.addLabels({
owner,
repo,
issue_number: pr_number,
labels: ['needs-template'],
});
- name: Flag low-confidence non-resource PR for review
if: steps.classify.outputs.classification == 'not_resource_submission' && steps.classify.outputs.confidence == 'low'
uses: actions/github-script@v7
with:
script: |
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
labels: ['needs-review'],
});
================================================
FILE: .github/workflows/handle-resource-submission-commands.yml
================================================
name: Handle Resource Submission Commands
on:
issue_comment:
types: [created]
jobs:
process-commands:
# Only run when:
# 1. Comment is on an issue (not a PR)
# 2. Issue has resource-submission label
# 3. Commenter has write permissions (maintainer/owner)
# 4. Comment contains one of the commands: /approve, /reject, /request-changes
if: |
github.event.issue.pull_request == null &&
contains(github.event.issue.labels.*.name, 'resource-submission') &&
(github.event.comment.author_association == 'OWNER' || github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'COLLABORATOR') &&
(contains(github.event.comment.body, '/approve') || contains(github.event.comment.body, '/reject') || contains(github.event.comment.body, '/request-changes'))
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install PyYAML requests PyGithub python-dotenv
- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: React to approval comment
if: contains(github.event.comment.body, '/approve') && contains(github.event.issue.labels.*.name, 'validation-passed')
uses: actions/github-script@v7
with:
script: |
await github.rest.reactions.createForIssueComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: context.payload.comment.id,
content: 'rocket'
});
- name: Parse issue and create PR
id: create_pr
if: contains(github.event.comment.body, '/approve') && contains(github.event.issue.labels.*.name, 'validation-passed')
env:
ISSUE_BODY: ${{ github.event.issue.body }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
ISSUE_TITLE: ${{ github.event.issue.title }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PYTHONPATH: ${{ github.workspace }}
run: |
# TODO: Consider emitting issue parsing output via GITHUB_OUTPUT to avoid temp files.
# First parse the issue to get resource data
python -m scripts.resources.parse_issue_form > resource_data.json
# Create the PR with the resource
python -m scripts.resources.create_resource_pr \
--issue-number $ISSUE_NUMBER \
--resource-data resource_data.json
- name: Comment on issue with results
if: contains(github.event.comment.body, '/approve') && contains(github.event.issue.labels.*.name, 'validation-passed')
uses: actions/github-script@v7
env:
CREATE_PR_SUCCESS: ${{ steps.create_pr.outputs.success }}
PR_URL: ${{ steps.create_pr.outputs.pr_url }}
with:
script: |
const pr_url = process.env.PR_URL || null;
const success = (process.env.CREATE_PR_SUCCESS || '').toLowerCase() === 'true';
const issue_number = context.issue.number;
let comment_body = '## ✅ Resource Approved!\n\n';
if (success && pr_url && pr_url !== 'null') {
comment_body += `🎉 A pull request has been created with your resource: ${pr_url}\n\n`;
comment_body += 'The PR will be merged shortly, and you\'ll be notified when your resource is live.\n\n';
comment_body += 'Thank you for contributing to Awesome Claude Code!';
// Add approved label
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
labels: ['approved', 'pr-created']
});
// Close the issue
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
state: 'closed',
state_reason: 'completed'
});
} else {
comment_body += '❌ There was an error creating the pull request.\n\n';
comment_body += 'Please check the workflow logs for details.';
// Add error label
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
labels: ['error-creating-pr']
});
}
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
body: comment_body
});
- name: Handle rejection
if: contains(github.event.comment.body, '/reject')
uses: actions/github-script@v7
with:
script: |
const comment = context.payload.comment.body;
const issue_number = context.issue.number;
// Extract rejection reason
const reasonMatch = comment.match(/\/reject\s+(.*)/);
const reason = reasonMatch ? reasonMatch[1] : 'No reason provided';
// Add rejection comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
body: `## ❌ Submission Rejected\n\n**Reason:** ${reason}\n\n`
});
// Update labels and close
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
labels: ['rejected']
});
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
state: 'closed',
state_reason: 'not_planned'
});
- name: React to request changes command
if: contains(github.event.comment.body, '/request-changes')
uses: actions/github-script@v7
with:
script: |
await github.rest.reactions.createForIssueComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: context.payload.comment.id,
content: 'eyes'
});
- name: Handle request changes
if: contains(github.event.comment.body, '/request-changes')
uses: actions/github-script@v7
with:
script: |
const comment = context.payload.comment.body;
const issue_number = context.issue.number;
// Extract requested changes
const changesMatch = comment.match(/\/request-changes\s+(.*)/s);
const changes = changesMatch ? changesMatch[1] : 'Please review the submission requirements.';
// Add comment with maintainer mention
const maintainer = context.payload.comment.user.login;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
body: `## 🔄 Changes Requested by @${maintainer}\n\n${changes}\n\nPlease edit your issue to address these points. The validation will run again automatically after you make changes.`
});
// Update labels
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
labels: ['changes-requested']
});
- name: Cleanup temporary files
if: always()
run: |
rm -f pr_result.json resource_data.json
================================================
FILE: .github/workflows/notify-on-merge.yml
================================================
name: Send Badge Notification on Resource PR Merge
on:
pull_request:
types: [closed]
branches: [main]
jobs:
notify-if-resource-pr:
# Only run when:
# 1. PR was merged (not just closed)
# 2. PR was created by github-actions bot (automated resource PR)
# 3. PR does NOT have the 'do-not-disturb' label (allows skipping notifications)
if: |
github.event.pull_request.merged == true &&
github.event.pull_request.user.login == 'github-actions[bot]' &&
!contains(github.event.pull_request.labels.*.name, 'do-not-disturb')
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
# Checkout the merged commit
ref: ${{ github.event.pull_request.merge_commit_sha }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install PyGithub python-dotenv
- name: Extract resource information from PR
id: extract_resource
uses: actions/github-script@v7
env:
PR_BODY: ${{ github.event.pull_request.body }}
PR_TITLE: ${{ github.event.pull_request.title }}
with:
script: |
const pr_body = process.env.PR_BODY || '';
const pr_title = process.env.PR_TITLE || '';
// Look for GitHub URL in PR body
// PRs created by approve-resource-submission.yml typically have format:
// "Adds new resource: [Resource Name](URL)"
const urlMatch = pr_body.match(/\*\*Primary Link\*\*:\s*(https:\/\/github\.com\/[^\s\)]+)/i) ||
pr_body.match(/Primary Link:\s*(https:\/\/github\.com\/[^\s\)]+)/i) ||
pr_body.match(/\[.*?\]\((https:\/\/github\.com\/[^\)]+)\)/);
// Extract resource name from PR title or body
const nameMatch = pr_title.match(/Add[s]?\s+(?:new\s+)?resource:\s*(.+)/i) ||
pr_body.match(/\*\*Display Name\*\*:\s*(.+)/i) ||
pr_body.match(/Display Name:\s*(.+)/i);
if (urlMatch && urlMatch[1]) {
const github_url = urlMatch[1].trim();
const resource_name = nameMatch ? nameMatch[1].trim() : '';
console.log(`Found GitHub repository: ${github_url}`);
console.log(`Resource name: ${resource_name || 'Not specified'}`);
// Set outputs for next steps
core.setOutput('github_url', github_url);
core.setOutput('resource_name', resource_name);
core.setOutput('is_github_repo', 'true');
} else {
console.log('No GitHub repository URL found in PR - skipping notification');
core.setOutput('is_github_repo', 'false');
}
- name: Send badge notification
if: steps.extract_resource.outputs.is_github_repo == 'true'
env:
AWESOME_CC_PAT_PUBLIC_REPO: ${{ secrets.AWESOME_CC_PAT_PUBLIC_REPO }}
REPOSITORY_URL: ${{ steps.extract_resource.outputs.github_url }}
RESOURCE_NAME: ${{ steps.extract_resource.outputs.resource_name }}
DESCRIPTION: "" # Will use default description
PYTHONPATH: ${{ github.workspace }}
run: |
echo "Sending notification to: $REPOSITORY_URL"
python -m scripts.badges.badge_notification || {
echo "⚠️ Failed to send notification, but continuing workflow"
echo "This might happen if:"
echo "- The repository has issues disabled"
echo "- The repository is private"
echo "- We've already sent a notification"
exit 0
}
- name: Log notification result
if: always()
uses: actions/github-script@v7
with:
script: |
const is_github_repo = '${{ steps.extract_resource.outputs.is_github_repo }}';
const github_url = '${{ steps.extract_resource.outputs.github_url }}';
const resource_name = '${{ steps.extract_resource.outputs.resource_name }}';
if (is_github_repo === 'true') {
console.log('✅ Notification workflow completed for:');
console.log(` Repository: ${github_url}`);
console.log(` Resource: ${resource_name || 'Unknown'}`);
} else {
console.log('ℹ️ No notification sent - resource is not a GitHub repository');
}
================================================
FILE: .github/workflows/submission-enforcement-v2.yml
================================================
name: Submission Enforcement
# Unified workflow: cooldown enforcement for issues, Claude-powered PR
# classification, and validation dispatch for clean issue submissions.
#
# Triggers:
# issues opened/reopened → cooldown check → if clean → validate
# issues edited → skip cooldown → validate directly
# PR opened/reopened → classify with Claude → if resource submission → cooldown violation
#
# Cooldown state stored in a private ops repo as cooldown-state.json.
# Requires ACC_OPS secret (fine-grained PAT) with:
# - awesome-claude-code-ops: Contents read/write
# - awesome-claude-code: Issues + Pull requests read/write
# because we use a single token for BOTH repos in the enforcement step.
on:
issues:
types: [opened, reopened, edited]
pull_request_target:
types: [opened, reopened]
workflow_dispatch:
concurrency:
group: >-
cooldown-${{
github.event.pull_request.user.login ||
github.event.issue.user.login ||
'unknown'
}}
cancel-in-progress: false
env:
OPS_OWNER: hesreallyhim
OPS_REPO: awesome-claude-code-ops
OPS_PATH: cooldown-state.json
jobs:
enforce-cooldown:
runs-on: ubuntu-latest
if: github.event.action != 'edited'
outputs:
allowed: ${{ steps.enforce.outputs.allowed }}
repo_url: ${{ steps.enforce.outputs.repo_url }}
cooldown_level: ${{ steps.enforce.outputs.cooldown_level }}
permissions:
# These are for GITHUB_TOKEN only; our step uses ACC_OPS PAT explicitly.
issues: write
pull-requests: write
steps:
- name: identify-repo
id: identify-repo
uses: actions/github-script@v7
with:
script: |
const isPR = context.eventName === 'pull_request_target';
const author = isPR
? context.payload.pull_request.user.login
: context.payload.issue.user.login;
const body = isPR
? (context.payload.pull_request.body || '')
: (context.payload.issue.body || '');
function extractUrls(text) {
const pattern = /https?:\/\/github\.com\/([^\/\s]+)\/([^\/\s#?")\]]+)/gi;
const results = [];
for (const match of text.matchAll(pattern)) {
const owner = match[1];
const repo = match[2]
.replace(/\.git$/i, '')
.replace(/[.,;:!?]+$/, '');
if (!owner || !repo) continue;
results.push({
owner,
repo,
url: `https://github.com/${owner}/${repo}`,
});
}
return results;
}
function firstAuthorMatch(urls, authorLogin) {
const authorLower = (authorLogin || '').toLowerCase();
const match = urls.find(u => u.owner.toLowerCase() === authorLower);
return match ? match.url : '';
}
let repoUrl = '';
const urls = extractUrls(body);
if (!isPR) {
const linkLine = body.match(/^\s*\*\*Link:\*\*\s*(.+)\s*$/im);
if (linkLine) {
const templateUrls = extractUrls(linkLine[1]);
repoUrl = firstAuthorMatch(templateUrls, author);
}
}
if (!repoUrl) {
repoUrl = firstAuthorMatch(urls, author);
}
core.setOutput('repo_url', repoUrl);
console.log(repoUrl ? `Repo URL identified: ${repoUrl}` : 'No matching repo URL identified.');
- name: Get PR changed files
id: files
if: github.event_name == 'pull_request_target'
uses: actions/github-script@v7
with:
script: |
const files = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
per_page: 50,
});
return files.data.map(f => f.filename).join('\n');
result-encoding: string
- name: Classify PR with Claude
id: classify
if: github.event_name == 'pull_request_target'
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_BODY: ${{ github.event.pull_request.body }}
PR_FILES: ${{ steps.files.outputs.result }}
run: |
PAYLOAD=$(jq -n \
--arg title "$PR_TITLE" \
--arg body "${PR_BODY:0:2000}" \
--arg files "$PR_FILES" \
'{
model: "claude-haiku-4-5-20251001",
max_tokens: 50,
system: "You classify GitHub pull requests for the awesome-claude-code repository (a curated awesome-list of tools, skills, hooks, and resources for Claude Code by Anthropic).\n\nA \"resource submission\" is any PR that attempts to add, recommend, or promote a tool, project, library, skill, MCP server, hook, workflow, guide, or similar resource to the list. This includes PRs that edit README.md or a resources CSV to insert a new entry.\n\nA \"not resource submission\" is a PR that fixes bugs, improves CI/workflows, corrects typos, updates documentation about the repo itself (not adding a new external resource), refactors code, or makes other repository maintenance changes.\n\nRespond with ONLY a JSON object, no markdown fences: {\"classification\": \"resource_submission\" | \"not_resource_submission\", \"confidence\": \"high\" | \"low\"}",
messages: [
{
role: "user",
content: ("PR Title: " + $title + "\n\nPR Body:\n" + $body + "\n\nChanged files:\n" + $files)
},
{
role: "assistant",
content: "{"
}
]
}')
RESPONSE=$(curl -sf https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d "$PAYLOAD") || {
echo "API call failed"
echo "classification=error" >> "$GITHUB_OUTPUT"
echo "confidence=none" >> "$GITHUB_OUTPUT"
exit 0
}
RAW=$(echo "$RESPONSE" | jq -r '.content[0].text')
TEXT="{${RAW}"
TEXT=$(echo "$TEXT" | sed 's/^```json//;s/^```//;s/```$//' | tr -d '\n')
echo "Claude response: $TEXT"
CLASSIFICATION=$(echo "$TEXT" | jq -r '.classification // "error"')
CONFIDENCE=$(echo "$TEXT" | jq -r '.confidence // "low"')
echo "Classification: $CLASSIFICATION"
echo "Confidence: $CONFIDENCE"
echo "classification=$CLASSIFICATION" >> "$GITHUB_OUTPUT"
echo "confidence=$CONFIDENCE" >> "$GITHUB_OUTPUT"
- name: Enforce cooldown rules
id: enforce
uses: actions/github-script@v7
env:
OPS_OWNER: ${{ env.OPS_OWNER }}
OPS_REPO: ${{ env.OPS_REPO }}
OPS_PATH: ${{ env.OPS_PATH }}
ISSUE_BODY: ${{ github.event.issue.body || '' }}
REPO_URL: ${{ steps.identify-repo.outputs.repo_url || '' }}
PR_CLASSIFICATION: ${{ steps.classify.outputs.classification || '' }}
PR_CONFIDENCE: ${{ steps.classify.outputs.confidence || '' }}
with:
# Single-token approach: this step uses the PAT for BOTH repos.
github-token: ${{ secrets.ACC_OPS }}
script: |
const opsOwner = process.env.OPS_OWNER;
const opsRepo = process.env.OPS_REPO;
const opsPath = process.env.OPS_PATH;
const isPR = context.eventName === 'pull_request_target';
const repo = context.repo;
const now = new Date();
const repoUrl = process.env.REPO_URL || '';
const author = isPR
? context.payload.pull_request.user.login
: context.payload.issue.user.login;
const number = isPR
? context.payload.pull_request.number
: context.payload.issue.number;
core.setOutput('repo_url', '');
core.setOutput('cooldown_level', '');
// ---- PR: skip bots ----
if (isPR && context.payload.pull_request.user.type === 'Bot') {
console.log(`Skipping bot PR by ${author}`);
core.setOutput('allowed', 'false');
return;
}
// ---- PR: classification gate ----
if (isPR) {
const classification = process.env.PR_CLASSIFICATION;
const confidence = process.env.PR_CONFIDENCE;
if (classification === 'error') {
console.log('Classification failed — fail open.');
core.setOutput('allowed', 'false');
return;
}
if (classification !== 'resource_submission') {
if (confidence === 'low') {
await github.rest.issues.addLabels({
...repo,
issue_number: number,
labels: ['needs-review'],
});
}
console.log(
`PR #${number} classified as ${classification} (${confidence}) — no enforcement needed.`
);
core.setOutput('allowed', 'false');
return;
}
console.log(`PR #${number} classified as resource_submission — enforcing.`);
}
// ---- Issue: excused label bypass ----
if (!isPR) {
const labels = context.payload.issue.labels.map(l => l.name);
if (labels.includes('excused')) {
console.log(`Issue #${number} has excused label — skipping.`);
core.setOutput('allowed', 'true');
return;
}
}
// ---- Load cooldown state from ops repo ----
let state = {};
let fileSha = null;
try {
const { data } = await github.rest.repos.getContent({
owner: opsOwner,
repo: opsRepo,
path: opsPath
});
state = JSON.parse(Buffer.from(data.content, 'base64').toString());
fileSha = data.sha;
console.log(`Loaded state (sha: ${fileSha})`);
} catch (e) {
if (e.status === 404) {
console.log('No state file found. Starting fresh.');
} else {
console.log(`Error loading state: ${e.message}. Starting fresh.`);
}
}
const userState = state[author] || null;
let stateChanged = false;
function recordViolation(reason) {
const level = userState ? userState.cooldown_level : 0;
if (level >= 2) {
// 3rd+ violation: permanent ban
state[author] = {
active_until: '9999-01-01T00:00:00Z',
cooldown_level: level + 1,
banned: true,
last_violation: now.toISOString(),
last_reason: reason
};
} else {
// 1st violation: 7 days; 2nd violation: 14 days
const days = level === 0 ? 7 : 14;
const activeUntil = new Date(now.getTime() + days * 24 * 60 * 60 * 1000);
state[author] = {
active_until: activeUntil.toISOString(),
cooldown_level: level + 1,
last_violation: now.toISOString(),
last_reason: reason
};
}
stateChanged = true;
}
async function closeWithComment(comment) {
await github.rest.issues.createComment({
...repo,
issue_number: number,
body: comment
});
if (isPR) {
await github.rest.pulls.update({
...repo,
pull_number: number,
state: 'closed'
});
} else {
await github.rest.issues.update({
...repo,
issue_number: number,
state: 'closed',
state_reason: 'not_planned'
});
}
}
function formatRemaining(activeUntilISO) {
const remaining = new Date(activeUntilISO) - now;
const days = Math.ceil(remaining / (1000 * 60 * 60 * 24));
if (days <= 0) return 'less than a day';
if (days === 1) return '1 day';
return `${days} days`;
}
async function saveAndExit(
allowed,
selectedRepoUrl = '',
selectedCooldownLevel = ''
) {
core.setOutput('allowed', allowed);
core.setOutput('repo_url', selectedRepoUrl || '');
core.setOutput('cooldown_level', selectedCooldownLevel || '');
if (!stateChanged) return;
const content = Buffer.from(JSON.stringify(state, null, 2)).toString('base64');
const commitMsg =
`cooldown: ${author} — ` +
(state[author]?.last_reason || 'clean') +
` (#${number})`;
try {
const params = {
owner: opsOwner,
repo: opsRepo,
path: opsPath,
message: commitMsg,
content
};
if (fileSha) params.sha = fileSha;
await github.rest.repos.createOrUpdateFileContents(params);
console.log(`State saved: ${commitMsg}`);
} catch (e) {
if (e.status === 409) {
console.log(
`Conflict writing state (409). Violation for ${author} will be caught on next submission.`
);
} else {
console.log(`Error saving state: ${e.message}`);
}
}
}
// ==========================================================
// PR PATH: resource submission via PR is always a violation
// ==========================================================
if (isPR) {
if (userState && userState.banned === true) {
recordViolation('submitted-as-pr');
} else if (userState && new Date(userState.active_until) > now) {
recordViolation('submitted-as-pr-during-cooldown');
} else {
recordViolation('submitted-as-pr');
}
const updated = state[author];
const templateUrl =
`https://github.com/${repo.owner}/${repo.repo}` +
`/issues/new?template=recommend-resource.yml`;
const contributingUrl =
`https://github.com/${repo.owner}/${repo.repo}` +
`/blob/main/docs/CONTRIBUTING.md`;
let cooldownNote = '';
if (updated.banned) {
cooldownNote =
'\n\n⚠️ Due to repeated violations, this account has been ' +
'permanently restricted from submitting recommendations.';
} else {
cooldownNote =
`\n\nA cooldown of **${formatRemaining(updated.active_until)}** ` +
`has been applied to this account.`;
}
await closeWithComment(
`## ⚠️ Resource submissions are not accepted via pull request\n\n` +
`Resource recommendations **must** be submitted through the ` +
`issue template, not as a pull request. The entire resource ` +
`pipeline — validation, review, and merging — is managed by ` +
`automation.\n\n` +
`**To submit your resource correctly:**\n` +
`1. 📖 Read [CONTRIBUTING.md](${contributingUrl})\n` +
`2. 📝 [Submit using the official template](${templateUrl})\n\n` +
`If this PR is **not** a resource submission (e.g., a bug fix ` +
`or improvement), please comment below and we'll reopen it.` +
cooldownNote +
`\n\n---\n*This PR was automatically closed.*`
);
await github.rest.issues.addLabels({
...repo,
issue_number: number,
labels: ['needs-template'],
});
console.log(
`VIOLATION (PR): ${author} — closed #${number}, level → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
// ==========================================================
// ISSUE PATH: cooldown and violation checks
// ==========================================================
const issueBody = process.env.ISSUE_BODY || '';
const labels = context.payload.issue.labels.map(l => l.name);
// CHECK 1: Permanent ban
if (userState && userState.banned === true) {
await closeWithComment(
`This account has been permanently restricted from ` +
`submitting recommendations due to repeated violations. ` +
`If you believe this is in error, please open a discussion ` +
`or contact the maintainer.`
);
console.log(`BANNED: ${author} — rejected #${number}`);
await saveAndExit('false', repoUrl, String(userState.cooldown_level || ''));
return;
}
// CHECK 2: Active cooldown
if (userState) {
const activeUntil = new Date(userState.active_until);
if (activeUntil > now) {
const prevLevel = userState.cooldown_level;
recordViolation('submitted-during-cooldown');
const updated = state[author];
const waitTime = updated.banned
? 'This restriction is now permanent.'
: `Please wait at least **${formatRemaining(updated.active_until)}** before opening any more submissions.`;
await closeWithComment(
`A cooldown period is currently in effect for your account. ` +
`Submitting during an active cooldown extends the restriction.\n\n` +
`${waitTime}\n\n` +
`Please review the [CONTRIBUTING guidelines](https://github.com/hesreallyhim/awesome-claude-code/blob/main/docs/CONTRIBUTING.md) ` +
`and [pinned issues](https://github.com/${repo.owner}/${repo.repo}/issues) ` +
`before your next submission.`
);
console.log(
`COOLDOWN: ${author} — rejected #${number}, level ${prevLevel} → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
console.log(`${author}: cooldown expired. Checking for violations.`);
}
// CHECK 3: Missing "resource-submission" label (not via form)
if (!labels.includes('resource-submission')) {
recordViolation('missing-resource-submission-label');
const updated = state[author];
await closeWithComment(
`This submission was not made through the required web form. ` +
`As noted in [CONTRIBUTING.md](https://github.com/hesreallyhim/awesome-claude-code/blob/main/docs/CONTRIBUTING.md), ` +
`recommendations must be submitted using the ` +
`[web form](https://github.com/${repo.owner}/${repo.repo}/issues/new?template=recommend-resource.yml).\n\n` +
`A cooldown of **${formatRemaining(updated.active_until)}** has been applied. ` +
`Please use the web form for your next submission.`
);
console.log(
`VIOLATION (no label): ${author} — rejected #${number}, level → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
// CHECK 4: Repo less than 1 week old
const repoUrlPattern =
/https?:\/\/github\.com\/([^\/\s]+)\/([^\/\s#?"]+)/g;
const repoMatches = [...issueBody.matchAll(repoUrlPattern)];
if (repoMatches.length > 0) {
const [, repoOwner, rawRepoName] = repoMatches[0];
const repoName = rawRepoName.replace(/\.git$/, '');
try {
const repoData = await github.rest.repos.get({
owner: repoOwner,
repo: repoName
});
const created = new Date(repoData.data.created_at);
const ageDays = (now - created) / (1000 * 60 * 60 * 24);
if (ageDays < 7) {
recordViolation('repo-too-young');
const updated = state[author];
const readyDate = new Date(created);
readyDate.setDate(readyDate.getDate() + 7);
const readyStr = readyDate.toLocaleDateString('en-US', {
month: 'long', day: 'numeric', year: 'numeric'
});
await closeWithComment(
`Thanks for the recommendation! This repository is less than a week old. ` +
`We ask that projects have some time in the wild before being recommended — ` +
`you're welcome to re-submit after **${readyStr}**.\n\n` +
`A cooldown of **${formatRemaining(updated.active_until)}** has been applied.`
);
console.log(
`VIOLATION (repo age): ${author} — rejected #${number}, ` +
`${repoOwner}/${repoName} is ${ageDays.toFixed(1)}d old, level → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
} catch (e) {
console.log(`Skipping repo age check for ${repoOwner}/${repoName}: ${e.message}`);
}
} else {
console.log('No GitHub URL in issue body. Skipping repo age check.');
}
console.log(`CLEAN: ${author} — issue #${number} allowed through.`);
await saveAndExit('true');
dispatch-intake:
needs: enforce-cooldown
if: |
needs.enforce-cooldown.result == 'success' &&
needs.enforce-cooldown.outputs.repo_url != '' &&
needs.enforce-cooldown.outputs.cooldown_level == '1'
runs-on: ubuntu-latest
steps:
- name: Dispatch intake
env:
DISPATCH_URL: ${{ secrets.SC_DISPATCH_URL }}
DISPATCH_TOKEN: ${{ secrets.SC_DISPATCH_TOKEN }}
REPO_URL: ${{ needs.enforce-cooldown.outputs.repo_url }}
SOURCE_URL: ${{ format('https://github.com/{0}/actions/runs/{1}', github.repository, github.run_id) }}
run: |
set -euo pipefail
payload="$(jq -nc \
--arg event_type "event_registered" \
--arg repo_url "${REPO_URL}" \
--arg source_url "${SOURCE_URL}" \
'{event_type:$event_type, client_payload:{repo_url:$repo_url, source_url:$source_url}}')"
curl -fsS -X POST "${DISPATCH_URL}" \
-H "Authorization: Bearer ${DISPATCH_TOKEN}" \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
-d "${payload}" >/dev/null
validate:
needs: enforce-cooldown
if: |
always() &&
github.event_name == 'issues' &&
(
github.event.action == 'edited' ||
needs.enforce-cooldown.outputs.allowed == 'true'
)
uses: ./.github/workflows/validate-new-issue.yml
================================================
FILE: .github/workflows/submission-enforcement.yml
================================================
name: Submission Enforcement
# Unified workflow: cooldown enforcement for issues, Claude-powered PR
# classification, and validation dispatch for clean issue submissions.
#
# Triggers:
# issues opened/reopened → cooldown check → if clean → validate
# issues edited → skip cooldown → validate directly
# PR opened/reopened → classify with Claude → if resource submission → cooldown violation
#
# Cooldown state stored in a private ops repo as cooldown-state.json.
# Requires ACC_OPS secret (fine-grained PAT) with:
# - awesome-claude-code-ops: Contents read/write
# - awesome-claude-code: Issues + Pull requests read/write
# because we use a single token for BOTH repos in the enforcement step.
on:
issues:
types: [opened, reopened, edited]
pull_request_target:
types: [opened, reopened]
concurrency:
group: >-
cooldown-${{
github.event.pull_request.user.login ||
github.event.issue.user.login ||
'unknown'
}}
cancel-in-progress: false
env:
OPS_OWNER: hesreallyhim
OPS_REPO: awesome-claude-code-ops
OPS_PATH: cooldown-state.json
jobs:
enforce-cooldown:
runs-on: ubuntu-latest
if: github.event.action != 'edited'
outputs:
allowed: ${{ steps.enforce.outputs.allowed }}
repo_url: ${{ steps.enforce.outputs.repo_url }}
cooldown_level: ${{ steps.enforce.outputs.cooldown_level }}
permissions:
# These are for GITHUB_TOKEN only; our step uses ACC_OPS PAT explicitly.
issues: write
pull-requests: write
steps:
- name: identify-repo
id: identify-repo
uses: actions/github-script@v7
with:
script: |
const isPR = context.eventName === 'pull_request_target';
const author = isPR
? context.payload.pull_request.user.login
: context.payload.issue.user.login;
const body = isPR
? (context.payload.pull_request.body || '')
: (context.payload.issue.body || '');
function extractUrls(text) {
const pattern = /https?:\/\/github\.com\/([^\/\s]+)\/([^\/\s#?")\]]+)/gi;
const results = [];
for (const match of text.matchAll(pattern)) {
const owner = match[1];
const repo = match[2]
.replace(/\.git$/i, '')
.replace(/[.,;:!?]+$/, '');
if (!owner || !repo) continue;
results.push({
owner,
repo,
url: `https://github.com/${owner}/${repo}`,
});
}
return results;
}
function firstAuthorMatch(urls, authorLogin) {
const authorLower = (authorLogin || '').toLowerCase();
const match = urls.find(u => u.owner.toLowerCase() === authorLower);
return match ? match.url : '';
}
let repoUrl = '';
const urls = extractUrls(body);
if (!isPR) {
const linkLine = body.match(/^\s*\*\*Link:\*\*\s*(.+)\s*$/im);
if (linkLine) {
const templateUrls = extractUrls(linkLine[1]);
repoUrl = firstAuthorMatch(templateUrls, author);
}
}
if (!repoUrl) {
repoUrl = firstAuthorMatch(urls, author);
}
core.setOutput('repo_url', repoUrl);
console.log(repoUrl ? `Repo URL identified: ${repoUrl}` : 'No matching repo URL identified.');
- name: Get PR changed files
id: files
if: github.event_name == 'pull_request_target'
uses: actions/github-script@v7
with:
script: |
const files = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
per_page: 50,
});
return files.data.map(f => f.filename).join('\n');
result-encoding: string
- name: Classify PR with Claude
id: classify
if: github.event_name == 'pull_request_target'
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_BODY: ${{ github.event.pull_request.body }}
PR_FILES: ${{ steps.files.outputs.result }}
run: |
PAYLOAD=$(jq -n \
--arg title "$PR_TITLE" \
--arg body "${PR_BODY:0:2000}" \
--arg files "$PR_FILES" \
'{
model: "claude-haiku-4-5-20251001",
max_tokens: 50,
system: "You classify GitHub pull requests for the awesome-claude-code repository (a curated awesome-list of tools, skills, hooks, and resources for Claude Code by Anthropic).\n\nA \"resource submission\" is any PR that attempts to add, recommend, or promote a tool, project, library, skill, MCP server, hook, workflow, guide, or similar resource to the list. This includes PRs that edit README.md or a resources CSV to insert a new entry.\n\nA \"not resource submission\" is a PR that fixes bugs, improves CI/workflows, corrects typos, updates documentation about the repo itself (not adding a new external resource), refactors code, or makes other repository maintenance changes.\n\nRespond with ONLY a JSON object, no markdown fences: {\"classification\": \"resource_submission\" | \"not_resource_submission\", \"confidence\": \"high\" | \"low\"}",
messages: [
{
role: "user",
content: ("PR Title: " + $title + "\n\nPR Body:\n" + $body + "\n\nChanged files:\n" + $files)
},
{
role: "assistant",
content: "{"
}
]
}')
RESPONSE=$(curl -sf https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d "$PAYLOAD") || {
echo "API call failed"
echo "classification=error" >> "$GITHUB_OUTPUT"
echo "confidence=none" >> "$GITHUB_OUTPUT"
exit 0
}
RAW=$(echo "$RESPONSE" | jq -r '.content[0].text')
TEXT="{${RAW}"
TEXT=$(echo "$TEXT" | sed 's/^```json//;s/^```//;s/```$//' | tr -d '\n')
echo "Claude response: $TEXT"
CLASSIFICATION=$(echo "$TEXT" | jq -r '.classification // "error"')
CONFIDENCE=$(echo "$TEXT" | jq -r '.confidence // "low"')
echo "Classification: $CLASSIFICATION"
echo "Confidence: $CONFIDENCE"
echo "classification=$CLASSIFICATION" >> "$GITHUB_OUTPUT"
echo "confidence=$CONFIDENCE" >> "$GITHUB_OUTPUT"
- name: Enforce cooldown rules
id: enforce
uses: actions/github-script@v7
env:
OPS_OWNER: ${{ env.OPS_OWNER }}
OPS_REPO: ${{ env.OPS_REPO }}
OPS_PATH: ${{ env.OPS_PATH }}
ISSUE_BODY: ${{ github.event.issue.body || '' }}
REPO_URL: ${{ steps.identify-repo.outputs.repo_url || '' }}
PR_CLASSIFICATION: ${{ steps.classify.outputs.classification || '' }}
PR_CONFIDENCE: ${{ steps.classify.outputs.confidence || '' }}
with:
# Single-token approach: this step uses the PAT for BOTH repos.
github-token: ${{ secrets.ACC_OPS }}
script: |
const opsOwner = process.env.OPS_OWNER;
const opsRepo = process.env.OPS_REPO;
const opsPath = process.env.OPS_PATH;
const isPR = context.eventName === 'pull_request_target';
const repo = context.repo;
const now = new Date();
const repoUrl = process.env.REPO_URL || '';
const author = isPR
? context.payload.pull_request.user.login
: context.payload.issue.user.login;
const number = isPR
? context.payload.pull_request.number
: context.payload.issue.number;
core.setOutput('repo_url', '');
core.setOutput('cooldown_level', '');
// ---- PR: skip bots ----
if (isPR && context.payload.pull_request.user.type === 'Bot') {
console.log(`Skipping bot PR by ${author}`);
core.setOutput('allowed', 'false');
return;
}
// ---- PR: classification gate ----
if (isPR) {
const classification = process.env.PR_CLASSIFICATION;
const confidence = process.env.PR_CONFIDENCE;
if (classification === 'error') {
console.log('Classification failed — fail open.');
core.setOutput('allowed', 'false');
return;
}
if (classification !== 'resource_submission') {
if (confidence === 'low') {
await github.rest.issues.addLabels({
...repo,
issue_number: number,
labels: ['needs-review'],
});
}
console.log(
`PR #${number} classified as ${classification} (${confidence}) — no enforcement needed.`
);
core.setOutput('allowed', 'false');
return;
}
console.log(`PR #${number} classified as resource_submission — enforcing.`);
}
// ---- Issue: excused label bypass ----
if (!isPR) {
const labels = context.payload.issue.labels.map(l => l.name);
if (labels.includes('excused')) {
console.log(`Issue #${number} has excused label — skipping.`);
core.setOutput('allowed', 'true');
return;
}
}
// ---- Load cooldown state from ops repo ----
let state = {};
let fileSha = null;
try {
const { data } = await github.rest.repos.getContent({
owner: opsOwner,
repo: opsRepo,
path: opsPath
});
state = JSON.parse(Buffer.from(data.content, 'base64').toString());
fileSha = data.sha;
console.log(`Loaded state (sha: ${fileSha})`);
} catch (e) {
if (e.status === 404) {
console.log('No state file found. Starting fresh.');
} else {
console.log(`Error loading state: ${e.message}. Starting fresh.`);
}
}
const userState = state[author] || null;
let stateChanged = false;
function recordViolation(reason) {
const level = userState ? userState.cooldown_level : 0;
if (level >= 6) {
state[author] = {
active_until: '9999-01-01T00:00:00Z',
cooldown_level: 6,
banned: true,
last_violation: now.toISOString(),
last_reason: reason
};
} else {
const hours = 24 * Math.pow(2, level);
const activeUntil = new Date(now.getTime() + hours * 60 * 60 * 1000);
state[author] = {
active_until: activeUntil.toISOString(),
cooldown_level: level + 1,
last_violation: now.toISOString(),
last_reason: reason
};
}
stateChanged = true;
}
async function closeWithComment(comment) {
await github.rest.issues.createComment({
...repo,
issue_number: number,
body: comment
});
if (isPR) {
await github.rest.pulls.update({
...repo,
pull_number: number,
state: 'closed'
});
} else {
await github.rest.issues.update({
...repo,
issue_number: number,
state: 'closed',
state_reason: 'not_planned'
});
}
}
function formatRemaining(activeUntilISO) {
const remaining = new Date(activeUntilISO) - now;
const days = Math.ceil(remaining / (1000 * 60 * 60 * 24));
if (days <= 0) return 'less than a day';
if (days === 1) return '1 day';
return `${days} days`;
}
async function saveAndExit(
allowed,
selectedRepoUrl = '',
selectedCooldownLevel = ''
) {
core.setOutput('allowed', allowed);
core.setOutput('repo_url', selectedRepoUrl || '');
core.setOutput('cooldown_level', selectedCooldownLevel || '');
if (!stateChanged) return;
const content = Buffer.from(JSON.stringify(state, null, 2)).toString('base64');
const commitMsg =
`cooldown: ${author} — ` +
(state[author]?.last_reason || 'clean') +
` (#${number})`;
try {
const params = {
owner: opsOwner,
repo: opsRepo,
path: opsPath,
message: commitMsg,
content
};
if (fileSha) params.sha = fileSha;
await github.rest.repos.createOrUpdateFileContents(params);
console.log(`State saved: ${commitMsg}`);
} catch (e) {
if (e.status === 409) {
console.log(
`Conflict writing state (409). Violation for ${author} will be caught on next submission.`
);
} else {
console.log(`Error saving state: ${e.message}`);
}
}
}
// ==========================================================
// PR PATH: resource submission via PR is always a violation
// ==========================================================
if (isPR) {
if (userState && userState.banned === true) {
recordViolation('submitted-as-pr');
} else if (userState && new Date(userState.active_until) > now) {
recordViolation('submitted-as-pr-during-cooldown');
} else {
recordViolation('submitted-as-pr');
}
const updated = state[author];
const templateUrl =
`https://github.com/${repo.owner}/${repo.repo}` +
`/issues/new?template=recommend-resource.yml`;
const contributingUrl =
`https://github.com/${repo.owner}/${repo.repo}` +
`/blob/main/docs/CONTRIBUTING.md`;
let cooldownNote = '';
if (updated.banned) {
cooldownNote =
'\n\n⚠️ Due to repeated violations, this account has been ' +
'permanently restricted from submitting recommendations.';
} else {
cooldownNote =
`\n\nA cooldown of **${formatRemaining(updated.active_until)}** ` +
`has been applied to this account.`;
}
await closeWithComment(
`## ⚠️ Resource submissions are not accepted via pull request\n\n` +
`Resource recommendations **must** be submitted through the ` +
`issue template, not as a pull request. The entire resource ` +
`pipeline — validation, review, and merging — is managed by ` +
`automation.\n\n` +
`**To submit your resource correctly:**\n` +
`1. 📖 Read [CONTRIBUTING.md](${contributingUrl})\n` +
`2. 📝 [Submit using the official template](${templateUrl})\n\n` +
`If this PR is **not** a resource submission (e.g., a bug fix ` +
`or improvement), please comment below and we'll reopen it.` +
cooldownNote +
`\n\n---\n*This PR was automatically closed.*`
);
await github.rest.issues.addLabels({
...repo,
issue_number: number,
labels: ['needs-template'],
});
console.log(
`VIOLATION (PR): ${author} — closed #${number}, level → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
// ==========================================================
// ISSUE PATH: cooldown and violation checks
// ==========================================================
const issueBody = process.env.ISSUE_BODY || '';
const labels = context.payload.issue.labels.map(l => l.name);
// CHECK 1: Permanent ban
if (userState && userState.banned === true) {
await closeWithComment(
`This account has been permanently restricted from ` +
`submitting recommendations due to repeated violations. ` +
`If you believe this is in error, please open a discussion ` +
`or contact the maintainer.`
);
console.log(`BANNED: ${author} — rejected #${number}`);
await saveAndExit('false', repoUrl, String(userState.cooldown_level || ''));
return;
}
// CHECK 2: Active cooldown
if (userState) {
const activeUntil = new Date(userState.active_until);
if (activeUntil > now) {
const prevLevel = userState.cooldown_level;
recordViolation('submitted-during-cooldown');
const updated = state[author];
const waitTime = updated.banned
? 'This restriction is now permanent.'
: `Please wait at least **${formatRemaining(updated.active_until)}** before opening any more submissions.`;
await closeWithComment(
`A cooldown period is currently in effect for your account. ` +
`Submitting during an active cooldown extends the restriction.\n\n` +
`${waitTime}\n\n` +
`Please review the [CONTRIBUTING guidelines](https://github.com/hesreallyhim/awesome-claude-code/blob/main/docs/CONTRIBUTING.md) ` +
`and [pinned issues](https://github.com/${repo.owner}/${repo.repo}/issues) ` +
`before your next submission.`
);
console.log(
`COOLDOWN: ${author} — rejected #${number}, level ${prevLevel} → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
console.log(`${author}: cooldown expired. Checking for violations.`);
}
// CHECK 3: Missing "resource-submission" label (not via form)
if (!labels.includes('resource-submission')) {
recordViolation('missing-resource-submission-label');
const updated = state[author];
await closeWithComment(
`This submission was not made through the required web form. ` +
`As noted in [CONTRIBUTING.md](https://github.com/hesreallyhim/awesome-claude-code/blob/main/docs/CONTRIBUTING.md), ` +
`recommendations must be submitted using the ` +
`[web form](https://github.com/${repo.owner}/${repo.repo}/issues/new?template=recommend-resource.yml).\n\n` +
`A cooldown of **${formatRemaining(updated.active_until)}** has been applied. ` +
`Please use the web form for your next submission.`
);
console.log(
`VIOLATION (no label): ${author} — rejected #${number}, level → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
// CHECK 4: Repo less than 1 week old
const repoUrlPattern =
/https?:\/\/github\.com\/([^\/\s]+)\/([^\/\s#?"]+)/g;
const repoMatches = [...issueBody.matchAll(repoUrlPattern)];
if (repoMatches.length > 0) {
const [, repoOwner, rawRepoName] = repoMatches[0];
const repoName = rawRepoName.replace(/\.git$/, '');
try {
const repoData = await github.rest.repos.get({
owner: repoOwner,
repo: repoName
});
const created = new Date(repoData.data.created_at);
const ageDays = (now - created) / (1000 * 60 * 60 * 24);
if (ageDays < 7) {
recordViolation('repo-too-young');
const updated = state[author];
const readyDate = new Date(created);
readyDate.setDate(readyDate.getDate() + 7);
const readyStr = readyDate.toLocaleDateString('en-US', {
month: 'long', day: 'numeric', year: 'numeric'
});
await closeWithComment(
`Thanks for the recommendation! This repository is less than a week old. ` +
`We ask that projects have some time in the wild before being recommended — ` +
`you're welcome to re-submit after **${readyStr}**.\n\n` +
`A cooldown of **${formatRemaining(updated.active_until)}** has been applied.`
);
console.log(
`VIOLATION (repo age): ${author} — rejected #${number}, ` +
`${repoOwner}/${repoName} is ${ageDays.toFixed(1)}d old, level → ${updated.cooldown_level}`
);
await saveAndExit('false', repoUrl, String(updated.cooldown_level));
return;
}
} catch (e) {
console.log(`Skipping repo age check for ${repoOwner}/${repoName}: ${e.message}`);
}
} else {
console.log('No GitHub URL in issue body. Skipping repo age check.');
}
console.log(`CLEAN: ${author} — issue #${number} allowed through.`);
await saveAndExit('true');
dispatch-intake:
needs: enforce-cooldown
if: |
needs.enforce-cooldown.result == 'success' &&
needs.enforce-cooldown.outputs.repo_url != '' &&
needs.enforce-cooldown.outputs.cooldown_level == '1'
runs-on: ubuntu-latest
steps:
- name: Dispatch intake
env:
DISPATCH_URL: ${{ secrets.SC_DISPATCH_URL }}
DISPATCH_TOKEN: ${{ secrets.SC_DISPATCH_TOKEN }}
REPO_URL: ${{ needs.enforce-cooldown.outputs.repo_url }}
SOURCE_URL: ${{ format('https://github.com/{0}/actions/runs/{1}', github.repository, github.run_id) }}
run: |
set -euo pipefail
payload="$(jq -nc \
--arg event_type "event_registered" \
--arg repo_url "${REPO_URL}" \
--arg source_url "${SOURCE_URL}" \
'{event_type:$event_type, client_payload:{repo_url:$repo_url, source_url:$source_url}}')"
curl -fsS -X POST "${DISPATCH_URL}" \
-H "Authorization: Bearer ${DISPATCH_TOKEN}" \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
-d "${payload}" >/dev/null
validate:
needs: enforce-cooldown
if: |
always() &&
github.event_name == 'issues' &&
(
github.event.action == 'edited' ||
needs.enforce-cooldown.outputs.allowed == 'true'
)
uses: ./.github/workflows/validate-new-issue.yml
================================================
FILE: .github/workflows/update-github-release-data.yml
================================================
name: Update GitHub Release Data
on:
schedule:
# Run daily at 3:00 AM UTC
- cron: '0 3 * * *'
workflow_dispatch:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PYTHONPATH: ${{ github.workspace }}
permissions:
contents: write
jobs:
update-github-release-data:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"
- name: Update GitHub release data
run: |
python -m scripts.maintenance.update_github_release_data
- name: Commit and push if changed
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add THE_RESOURCES_TABLE.csv
git diff --quiet && git diff --staged --quiet || (git commit -m "chore: update GitHub release data [skip ci]" && git push)
================================================
FILE: .github/workflows/update-repo-ticker.yml
================================================
name: Update Repo Ticker Data
on:
schedule:
# Run every 6 hours
- cron: '0 */6 * * *'
workflow_dispatch: # Allow manual trigger for testing
permissions:
contents: write
env:
PYTHONPATH: ${{ github.workspace }}
jobs:
update-ticker:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests
- name: Backup previous day's data
run: |
if [ -f data/repo-ticker.csv ]; then
cp data/repo-ticker.csv data/repo-ticker-previous.csv
echo "✓ Backed up previous data"
else
echo "⚠ No previous data to backup (first run)"
fi
- name: Fetch GitHub repo data
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -m scripts.ticker.fetch_repo_ticker_data
- name: Generate ticker SVGs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -m scripts.ticker.generate_ticker_svg
- name: Commit and push if changed
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add data/repo-ticker.csv data/repo-ticker-previous.csv assets/repo-ticker.svg assets/repo-ticker-light.svg assets/repo-ticker-awesome.svg
git diff --quiet && git diff --staged --quiet || (git commit -m "chore: update repo ticker data and SVGs [skip ci]" && git push)
================================================
FILE: .github/workflows/validate-links.yml
================================================
name: Validate Links
on:
schedule:
# Run daily at 2:00 AM UTC
- cron: '0 2 * * *'
workflow_dispatch: # Allow manual triggering
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
permissions:
contents: read
issues: write
jobs:
validate-links:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Track Github API Usage
uses: hesreallyhim/github-api-usage-monitor@v1
with:
diagnostics: true
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: make install
- name: Run link validation
id: validate
env:
PYTHONPATH: ${{ github.workspace }}
run: |
make validate-github
has_broken_links=$(python -c "import json; data=json.load(open('validation_results.json')); print('true' if data['newly_broken'] else 'false')")
echo "has_broken_links=${has_broken_links}" >> "$GITHUB_OUTPUT"
- name: Upload validation results
if: always()
uses: actions/upload-artifact@v4
with:
name: validation-results
path: |
validation_results.json
THE_RESOURCES_TABLE.csv
- name: Check for existing issue
if: steps.validate.outputs.has_broken_links == 'true'
id: check_issue
uses: actions/github-script@v7
with:
script: |
const issues = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
labels: 'broken-links'
});
const today = new Date().toISOString().split('T')[0];
const existingIssue = issues.data.find(issue =>
issue.title.includes('Broken Links Report') &&
issue.title.includes(today)
);
core.setOutput('issue_number', existingIssue ? existingIssue.number : '');
- name: Create or update issue
if: steps.validate.outputs.has_broken_links == 'true'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const results = JSON.parse(fs.readFileSync('validation_results.json', 'utf8'));
const today = new Date().toISOString().split('T')[0];
let issueBody = `## 🔗 Broken Links Report\n\n`;
issueBody += `This automated scan found **${results.newly_broken_links.length}** new broken link(s) in the repository.\n\n`;
issueBody += `### Broken Links:\n\n`;
for (const link of results.newly_broken_links) {
issueBody += `- **${link.name}**\n`;
issueBody += ` - URL: ${link.url}\n`;
}
issueBody += `### Summary\n\n`;
issueBody += `- Broken links: ${results.newly_broken_links.length}\n`;
issueBody += `- Scan completed: ${results.timestamp}\n\n`;
issueBody += `---\n`;
issueBody += `*This issue was automatically created by the [link validation workflow](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/workflows/validate-links.yml).*`;
const existingIssueNumber = Number("${{ steps.check_issue.outputs.issue_number }}") || 0;
if (existingIssueNumber) {
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: existingIssueNumber,
body: issueBody
});
console.log(`Updated existing issue #${existingIssueNumber}`);
} else {
const issue = await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `🚨 Broken Links Report - ${today}`,
body: issueBody,
labels: ['broken-links', 'automated']
});
console.log(`Created new issue #${issue.data.number}`);
}
- name: Close old broken link issues
if: steps.validate.outputs.has_broken_links == 'false'
uses: actions/github-script@v7
with:
script: |
const issues = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
labels: 'broken-links'
});
for (const issue of issues.data) {
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed',
state_reason: 'completed'
});
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: '✅ All links are now working! Closing this issue.'
});
console.log(`Closed issue #${issue.number}`);
}
================================================
FILE: .github/workflows/validate-new-issue.yml
================================================
name: Validate New Issue
on:
workflow_call:
# Called by submission-enforcement.yml after cooldown clears,
# or directly on issue edits. The enforcement workflow handles
# missing-label and informal submission detection, so this
# workflow only validates properly-submitted resources.
jobs:
validate-resource:
name: Validate Resource Submission
# Only run on issues with the resource-submission label
if: contains(github.event.issue.labels.*.name, 'resource-submission')
runs-on: ubuntu-latest
permissions:
issues: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
sparse-checkout: |
scripts/
templates/
THE_RESOURCES_TABLE.csv
pyproject.toml
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install PyGithub PyYAML requests python-dotenv
- name: Parse and validate submission
id: validate
env:
ISSUE_BODY: ${{ github.event.issue.body }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PYTHONPATH: ${{ github.workspace }}
run: |
python -m scripts.resources.parse_issue_form --validate 2>&1 | tail -n 1 > validation_result.json
if grep -q '"valid": true' validation_result.json; then
echo "Validation passed!"
else
echo "Validation failed!"
fi
echo "=== Validation Result ==="
python -m json.tool validation_result.json || cat validation_result.json
- name: Remove old validation comments
uses: actions/github-script@v7
with:
script: |
const issue_number = context.issue.number;
const owner = context.repo.owner;
const repo = context.repo.repo;
const comments = await github.rest.issues.listComments({
owner,
repo,
issue_number,
});
for (const comment of comments.data) {
if (comment.user.type === 'Bot' && comment.body.includes('## 🤖 Validation Results')) {
await github.rest.issues.deleteComment({
owner,
repo,
comment_id: comment.id,
});
}
}
- name: Post validation results
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const validation_result = JSON.parse(fs.readFileSync('validation_result.json', 'utf8'));
let comment_body = '## 🤖 Validation Results\n\n';
if (validation_result.valid) {
comment_body += '✅ **All validation checks passed!**\n\n';
comment_body += 'Your submission is ready for review by a maintainer.\n\n';
comment_body += '### Validated Data:\n';
comment_body += '```json\n';
comment_body += JSON.stringify(validation_result.data, null, 2);
comment_body += '\n```\n';
} else {
comment_body += '❌ **Validation failed**\n\n';
comment_body += 'Please fix the following issues and edit your submission:\n\n';
for (const error of validation_result.errors) {
comment_body += `- ❗ ${error}\n`;
}
if (validation_result.warnings && validation_result.warnings.length > 0) {
comment_body += '\n### Warnings:\n';
for (const warning of validation_result.warnings) {
comment_body += `- ⚠️ ${warning}\n`;
}
}
comment_body += '\n**Note:** You can edit your issue to fix these problems, and validation will run again automatically.';
}
comment_body += '\n\n---\n';
comment_body += '<sub>This comment is automatically updated when you edit the issue.</sub>';
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: comment_body
});
- name: Update issue labels
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const issue_number = context.issue.number;
const owner = context.repo.owner;
const repo = context.repo.repo;
const validation_result = JSON.parse(fs.readFileSync('validation_result.json', 'utf8'));
const validation_passed = validation_result.valid;
const { data: issue } = await github.rest.issues.get({
owner,
repo,
issue_number,
});
let labels = issue.labels.map(label => label.name);
labels = labels.filter(label =>
label !== 'validation-passed' &&
label !== 'validation-failed' &&
label !== 'pending-validation'
);
if (validation_passed && labels.includes('changes-requested')) {
labels = labels.filter(label => label !== 'changes-requested');
}
if (validation_passed) {
labels.push('validation-passed');
} else {
labels.push('validation-failed');
}
await github.rest.issues.setLabels({
owner,
repo,
issue_number,
labels,
});
- name: Notify maintainer if changes were made
if: github.event.action == 'edited' && contains(github.event.issue.labels.*.name, 'changes-requested')
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const validation_result = JSON.parse(fs.readFileSync('validation_result.json', 'utf8'));
const issue_number = context.issue.number;
const current_validation_status = validation_result.valid;
const comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
per_page: 100
});
let maintainer = null;
let changesRequestedTime = null;
for (let i = comments.data.length - 1; i >= 0; i--) {
const comment = comments.data[i];
const match = comment.body.match(/## 🔄 Changes Requested by @(\w+)/);
if (match) {
maintainer = match[1];
changesRequestedTime = new Date(comment.created_at);
break;
}
}
if (!maintainer) return;
let lastNotificationTime = null;
let lastNotifiedStatus = null;
let hasNotifiedAfterRequest = false;
for (const comment of comments.data) {
if (comment.body.includes('## 📝 Issue Updated') && comment.user.type === 'Bot') {
const commentTime = new Date(comment.created_at);
if (commentTime > changesRequestedTime) {
hasNotifiedAfterRequest = true;
const metaMatch = comment.body.match(/<!-- notification-meta: status=(\w+) -->/);
if (metaMatch) {
lastNotifiedStatus = metaMatch[1] === 'true';
}
if (!lastNotificationTime || commentTime > lastNotificationTime) {
lastNotificationTime = commentTime;
}
}
}
}
let shouldNotify = false;
let notificationReason = '';
if (!hasNotifiedAfterRequest) {
shouldNotify = true;
notificationReason = 'first edit after changes requested';
} else if (lastNotifiedStatus !== null && lastNotifiedStatus !== current_validation_status) {
shouldNotify = true;
notificationReason = 'validation status changed';
}
if (shouldNotify) {
let notification_body = `## 📝 Issue Updated\n\n`;
notification_body += `@${maintainer} - The submitter has edited their issue in response to your requested changes.\n\n`;
if (current_validation_status) {
notification_body += `✅ **The updated submission now passes all validation checks!**\n\n`;
notification_body += `You may want to review the changes and consider approving the submission.`;
} else {
notification_body += `❌ **The submission still has validation errors.**\n\n`;
notification_body += `The submitter may need additional guidance to fix the remaining issues.`;
}
notification_body += `\n\n<!-- notification-meta: status=${current_validation_status} -->`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
body: notification_body
});
console.log(`Notification sent (reason: ${notificationReason})`);
} else {
console.log('Skipping notification - no significant changes detected');
}
- name: Cleanup
if: always()
run: |
rm -f validation_result.json
================================================
FILE: .gitignore
================================================
.myob/
.mypy_cache/
.ruff_cache/
__pycache__/
.pytest_cache/
.claude/
CLAUDE.md
!resources/**/CLAUDE.md
.DS_Store
venv/
.env
.pr_template_content.md
*.egg-info/
.coverage
.vscode/
marketplace/
coverage.xml
!.claude/
.claude/*
!.claude/commands/
.claude/commands/*
!.claude/commands/evaluate-repository.md
================================================
FILE: .pre-commit-config.yaml
================================================
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-added-large-files
- id: check-case-conflict
- id: check-merge-conflict
- id: check-yaml
- id: check-json
- id: detect-private-key
- id: end-of-file-fixer
- id: mixed-line-ending
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.12.2
hooks:
# Run the linter
- id: ruff
types_or: [python, pyi, jupyter]
args: [--fix]
# Run the formatter
- id: ruff-format
types_or: [python, pyi, jupyter]
- repo: local
hooks:
- id: make-test
name: run make test
entry: make test
language: system
types: [python]
pass_filenames: false
always_run: true
- id: check-readme-generated
name: check README.md is generated from CSV
entry: bash -c 'make generate && git diff --exit-code README.md'
language: system
files: 'resource-metadata\.csv|README\.md'
pass_filenames: false
description: Ensures README.md is generated from CSV data
================================================
FILE: .python-version
================================================
3.11
================================================
FILE: LICENSE
================================================
Awesome Claude Code © 2025 by hesreallyhim is licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International. To view a copy of this license, visit https://creativecommons.org/licenses/by-nc-nd/4.0/
================================================
FILE: Makefile
================================================
# Makefile for awesome-claude-code resource management
# Use venv python locally, system python in CI/CD
ifeq ($(CI),true)
PYTHON := python3
else
PYTHON := venv/bin/python3
endif
SCRIPTS_DIR := ./scripts
.PHONY: help validate validate-single validate-toc test coverage generate generate-toc-assets test-regenerate test-regenerate-no-cleanup test-regenerate-allow-diff test-regenerate-cycle docs-tree docs-tree-check download-resources add_resource add-category sort format format-check generate-resource-id mypy ci clean clean-all
help:
@echo "Available commands:"
@echo " make add-category - Add a new category to the repository"
@echo " make validate - Validate all links in the resource CSV"
@echo " make validate-single URL=<url> - Validate a single resource URL"
@echo " make validate-toc - Validate TOC anchors against GitHub HTML"
@echo " make test - Run validation tests on test CSV"
@echo " make coverage - Run pytest with coverage reports"
@echo " make mypy - Run mypy type checks"
@echo " make format - Check and fix code formatting with ruff"
@echo " make format-check - Check code formatting without fixing"
@echo " make ci - Run format-check, mypy, and tests"
@echo " make generate - Generate README.md from CSV data, and create SVG badges"
@echo " make generate-toc-assets - Regenerate subcategory TOC SVGs (after adding subcategories)"
@echo " make test-regenerate - Regenerate READMEs after deletion and fail if diff"
@echo " make generate-resource-id - Interactive resource ID generator"
@echo " make download-resources - Download active resources from GitHub"
@echo " make sort - Sort resources by category, sub-category, and name"
@echo " make clean - Remove caches and test artifacts"
@echo " make clean-all - Remove caches and test artifacts, plus venv/"
@echo " make test-regenerate-no-cleanup - Keep outputs on failure for inspection"
@echo " make test-regenerate-allow-diff - Allow diffs after regeneration"
@echo " make test-regenerate-cycle - Full root/style-order regeneration cycle test"
@echo " make docs-tree - Update README-GENERATION file tree"
@echo " make docs-tree-check - Fail if README-GENERATION tree is out of date"
@echo ""
@echo "Options:"
@echo " make add-category - Interactive mode to add a new category"
@echo " make add-category ARGS='--name \"My Category\" --prefix mycat --icon 🎯'"
@echo " make validate-github - Run validation in GitHub Action mode (JSON output)"
@echo " make validate MAX_LINKS=N - Limit validation to N links"
@echo " make download-resources CATEGORY='Category Name' - Download specific category"
@echo " make download-resources LICENSE='MIT' - Download resources with specific license"
@echo " make download-resources MAX_DOWNLOADS=N - Limit downloads to N resources"
@echo " make download-resources HOSTED_DIR='path' - Custom hosted directory path"
@echo ""
@echo "Environment Variables:"
@echo " GITHUB_TOKEN - Set to avoid GitHub API rate limiting (export GITHUB_TOKEN=...)"
# Validate all links in the CSV (v2 with override support)
validate:
@echo "Validating links in THE_RESOURCES_TABLE.csv (with override support)..."
@if [ -n "$(MAX_LINKS)" ]; then \
echo "Limiting validation to $(MAX_LINKS) links"; \
$(PYTHON) -m scripts.validation.validate_links --max-links $(MAX_LINKS); \
else \
$(PYTHON) -m scripts.validation.validate_links; \
fi
# Run validation in GitHub Action mode
validate-github:
$(PYTHON) -m scripts.validation.validate_links --github-action
# Validate a single resource URL
validate-single:
@if [ -z "$(URL)" ]; then \
echo "Error: Please provide a URL to validate"; \
echo "Usage: make validate-single URL=https://example.com/resource"; \
exit 1; \
fi
@$(PYTHON) -m scripts.validation.validate_single_resource "$(URL)" $(if $(SECONDARY),--secondary "$(SECONDARY)") $(if $(NAME),--name "$(NAME)")
# Validate TOC anchors against GitHub HTML (requires .claude/root-readme-html-article-body.html)
validate-toc:
@echo "Validating TOC anchors against GitHub HTML..."
@$(PYTHON) -m scripts.testing.validate_toc_anchors
# Run all tests using pytest
test:
@echo "Running all tests..."
@$(PYTHON) -m pytest tests/ -v
# Run tests with coverage reporting
coverage:
@echo "Running tests with coverage..."
@$(PYTHON) -m pytest tests/ --cov=scripts --cov-report=term-missing --cov-report=html --cov-report=xml
# Run mypy type checks
mypy:
@echo "Running mypy..."
@$(PYTHON) -m mypy scripts tests
# Format code with ruff (check and fix)
format:
@echo "Checking and fixing code formatting with ruff..."
@$(PYTHON) -m ruff check scripts/ tests/ --fix || true
@$(PYTHON) -m ruff format scripts/ tests/
@echo "✅ Code formatting complete!"
# Check code formatting without fixing
format-check:
@echo "Checking code formatting..."
@$(PYTHON) -m ruff check scripts/ tests/
@$(PYTHON) -m ruff format scripts/ tests/ --check
@if $(PYTHON) -m ruff check scripts/ tests/ --quiet && $(PYTHON) -m ruff format scripts/ tests/ --check --quiet; then \
echo "✅ Code formatting check passed!"; \
else \
echo "❌ Code formatting issues found. Run 'make format' to fix."; \
exit 1; \
fi
# Run CI checks locally
ci: format-check mypy test docs-tree-check
# Remove caches and test artifacts
clean:
@echo "Cleaning caches and test artifacts..."
@find . -type d -name "__pycache__" -prune -exec rm -rf {} +
@find . -type f -name "*.pyc" -delete
@rm -rf .pytest_cache .mypy_cache .ruff_cache .coverage coverage.xml htmlcov
@rm -rf .eggs *.egg-info build dist .tox .nox
@echo "✅ Clean complete."
# Remove caches, test artifacts, and virtual environment
clean-all: clean
@echo "Removing venv/..."
@rm -rf venv
@echo "✅ Clean-all complete."
# Sort resources by category, sub-category, and name
sort:
@echo "Sorting resources in THE_RESOURCES_TABLE.csv..."
$(PYTHON) -m scripts.resources.sort_resources
# Regenerate subcategory TOC SVGs from categories.yaml
generate-toc-assets:
@echo "Regenerating subcategory TOC SVGs..."
$(PYTHON) -m scripts.readme.helpers.generate_toc_assets
# Generate README.md from CSV data using template system
generate: sort
@echo "Generating README.md from CSV data using template system..."
$(PYTHON) -m scripts.readme.generate_readme
# Regenerate READMEs from a clean tree and ensure outputs do not change
test-regenerate:
@if [ "$${ALLOW_DIRTY:-0}" -ne 1 ] && [ -n "$$(git status --porcelain)" ]; then \
echo "Error: working tree must be clean for test-regenerate"; \
exit 1; \
fi
@echo "Note: If the local date changes during this run (near midnight), regenerated READMEs may differ."
@backup_dir=$$(mktemp -d 2>/dev/null || mktemp -d -t acc-readme-backup); \
keep_outputs="$${KEEP_README_OUTPUTS:-0}"; \
allow_diff="$${ALLOW_DIFF:-0}"; \
restore() { \
if [ -f "$$backup_dir/README.md" ]; then \
cp "$$backup_dir/README.md" README.md; \
else \
rm -f README.md; \
fi; \
if [ -d "$$backup_dir/README_ALTERNATIVES" ]; then \
rm -rf README_ALTERNATIVES; \
cp -R "$$backup_dir/README_ALTERNATIVES" README_ALTERNATIVES; \
else \
rm -rf README_ALTERNATIVES; \
fi; \
}; \
if [ -f README.md ]; then cp README.md "$$backup_dir/README.md"; fi; \
if [ -d README_ALTERNATIVES ]; then cp -R README_ALTERNATIVES "$$backup_dir/"; fi; \
echo "Removing README outputs..."; \
rm -f README.md; \
rm -rf README_ALTERNATIVES; \
if ! $(MAKE) generate; then \
echo "Error: README generation failed; restoring outputs"; \
if [ "$$keep_outputs" -eq 1 ]; then \
echo "Keeping outputs for inspection (backup at $$backup_dir)"; \
else \
echo "Tip: Run 'make test-regenerate-no-cleanup' to inspect the generated outputs without restoring."; \
restore; \
rm -rf "$$backup_dir"; \
fi; \
exit 1; \
fi; \
failure=""; \
if [ ! -f README.md ]; then \
failure="README.md not regenerated"; \
elif [ ! -d README_ALTERNATIVES ] || [ -z "$$(ls -A README_ALTERNATIVES 2>/dev/null)" ]; then \
failure="README_ALTERNATIVES is empty after regeneration"; \
elif [ -n "$$(git status --porcelain)" ]; then \
if [ "$$allow_diff" -eq 1 ]; then \
echo "Diff allowed; skipping clean-tree enforcement."; \
else \
failure="working tree is dirty after regeneration; make generate may be out of sync"; \
fi; \
fi; \
if [ -n "$$failure" ]; then \
echo "Error: $$failure"; \
if [ "$$keep_outputs" -eq 1 ]; then \
echo "Keeping outputs for inspection (backup at $$backup_dir)"; \
else \
echo "Tip: Run 'make test-regenerate-no-cleanup' to inspect the generated outputs without restoring."; \
restore; \
rm -rf "$$backup_dir"; \
fi; \
exit 1; \
fi; \
rm -rf "$$backup_dir"; \
echo "✅ Regeneration produced a clean working tree."
# Run test-regenerate but keep outputs on failure for inspection
test-regenerate-no-cleanup:
@KEEP_README_OUTPUTS=1 $(MAKE) test-regenerate
# Run test-regenerate but allow diffs and dirty tree
test-regenerate-allow-diff:
@ALLOW_DIRTY=1 ALLOW_DIFF=1 $(MAKE) test-regenerate
# Full regeneration cycle test (root style + selector order changes)
test-regenerate-cycle:
@$(PYTHON) -m scripts.testing.test_regenerate_cycle
# Update README-GENERATION tree block
docs-tree:
@$(PYTHON) -m tools.readme_tree.update_readme_tree
# Verify README-GENERATION tree block is up to date
# defaults
DOCS_TREE_CHECK ?= 1
DOCS_TREE_DEBUG ?= 0
DOCS_TREE_FLAGS :=
ifeq ($(DOCS_TREE_CHECK),1)
DOCS_TREE_FLAGS += --check
endif
ifeq ($(DOCS_TREE_DEBUG),1)
DOCS_TREE_FLAGS += --debug
endif
docs-tree-check:
@$(PYTHON) -m tools.readme_tree.update_readme_tree $(DOCS_TREE_FLAGS)
# Download resources from GitHub
download-resources:
@echo "Downloading resources from GitHub..."
@ARGS=""; \
if [ -n "$(CATEGORY)" ]; then ARGS="$$ARGS --category '$(CATEGORY)'"; fi; \
if [ -n "$(LICENSE)" ]; then ARGS="$$ARGS --license '$(LICENSE)'"; fi; \
if [ -n "$(MAX_DOWNLOADS)" ]; then ARGS="$$ARGS --max-downloads $(MAX_DOWNLOADS)"; fi; \
if [ -n "$(OUTPUT_DIR)" ]; then ARGS="$$ARGS --output-dir '$(OUTPUT_DIR)'"; fi; \
if [ -n "$(HOSTED_DIR)" ]; then ARGS="$$ARGS --hosted-dir '$(HOSTED_DIR)'"; fi; \
eval $(PYTHON) -m scripts.resources.download_resources $$ARGS
# Interactive resource ID generator
generate-resource-id:
@$(PYTHON) -m scripts.ids.generate_resource_id
# Install required Python packages
install:
@echo "Installing required Python packages..."
@$(PYTHON) -m pip install --upgrade pip
@$(PYTHON) -m pip install -e ".[dev]"
@echo "Installation complete!"
# Add a new category to the repository
add-category:
@echo "Starting category addition tool..."
@$(PYTHON) -m scripts.categories.add_category $(ARGS)
================================================
FILE: README.md
================================================
<!-- GENERATED FILE: do not edit directly -->
<h3 align="center">Pick Your Style:</h3>
<p align="center">
<a href="./"><img src="assets/badge-style-awesome.svg" alt="Awesome" height="28" style="border: 2px solid #cc3366; border-radius: 4px;"></a>
<a href="README_ALTERNATIVES/README_EXTRA.md"><img src="assets/badge-style-extra.svg" alt="Extra" height="28"></a>
<a href="README_ALTERNATIVES/README_CLASSIC.md"><img src="assets/badge-style-classic.svg" alt="Classic" height="28"></a>
<a href="README_ALTERNATIVES/README_FLAT_ALL_AZ.md"><img src="assets/badge-style-flat.svg" alt="Flat" height="28"></a>
</p>
<p align="center">
<picture>
<img src="assets/awesome-claude-code-social-clawd-leo.png" alt="Awesome Claude Code" width="600">
</picture>
</p>
# Awesome Claude Code
[](https://awesome.re)
> A selectively curated list of skills, agents, plugins, hooks, and other amazing tools for enhancing your [Claude Code](https://docs.anthropic.com/en/docs/claude-code) workflow.
<div align="center">
<img src="assets/repo-ticker-awesome.svg" alt="Featured Claude Code Projects" width="100%">
</div>
## Latest Additions
- [Claude Scientific Skills](https://github.com/K-Dense-AI/claude-scientific-skills) by [K-Dense](https://github.com/K-Dense-AI/) - "A set of ready-to-use Agent Skills for research, science, engineering, analysis, finance and writing." That's their description - modest, simple. That's how you can tell this is really one of the best skills repos on GitHub. If you've ever thought about getting a PhD... just read all of these documents instead. Also I think it IS an AI agent or something? Awesome.
- [parry](https://github.com/vaporif/parry) by [Dmytro Onypko](https://github.com/vaporif) - Prompt injection scanner for Claude Code hooks. Scans tool inputs and outputs for injection attacks, secrets, and data exfiltration attempts. [NOTE: Early development phase but worth a look.].
- [Dippy](https://github.com/ldayton/Dippy) by [Lily Dayton](https://github.com/ldayton) - Auto-approve safe bash commands using AST-based parsing, while prompting for destructive operations. Solves permission fatigue without disabling safety. Supports Claude Code, Gemini CLI, and Cursor.
- [sudocode](https://github.com/sudocode-ai/sudocode) by [ssh-randy](https://github.com/ssh-randy) - Lightweight agent orchestration dev tool that lives in your repo. Integrates with various specification frameworks. It's giving Jira.
- [claude-tmux](https://github.com/nielsgroen/claude-tmux) by [Niels Groeneveld](https://github.com/nielsgroen) - Manage Claude Code within tmux. A tmux popup of all your Claude Code instances, enabling quick switching, status monitoring, session lifecycle management, with git worktree and pull request support.
- [claude-esp](https://github.com/phiat/claude-esp) by [phiat](https://github.com/phiat) - Go-based TUI that streams Claude Code's hidden output (thinking, tool calls, subagents) to a separate terminal. Watch multiple sessions simultaneously, filter by content type, and track background tasks. Ideal for debugging or understanding what Claude is doing under the hood without interrupting your main session.
## Contents
- [Agent Skills 🤖](#agent-skills-)
- [General](#general)
- [Workflows & Knowledge Guides 🧠](#workflows--knowledge-guides-)
- [General](#general-1)
- [Ralph Wiggum](#ralph-wiggum)
- [Tooling 🧰](#tooling-)
- [General](#general-2)
- [IDE Integrations](#ide-integrations)
- [Usage Monitors](#usage-monitors)
- [Orchestrators](#orchestrators)
- [Config Managers](#config-managers)
- [Status Lines 📊](#status-lines-)
- [General](#general-3)
- [Hooks 🪝](#hooks-)
- [General](#general-4)
- [Slash-Commands 🔪](#slash-commands-)
- [General](#general-5)
- [Version Control & Git](#version-control--git)
- [Code Analysis & Testing](#code-analysis--testing)
- [Context Loading & Priming](#context-loading--priming)
- [Documentation & Changelogs](#documentation--changelogs)
- [CI / Deployment](#ci--deployment)
- [Project & Task Management](#project--task-management)
- [Miscellaneous](#miscellaneous)
- [CLAUDE.md Files 📂](#claudemd-files-)
- [Language-Specific](#language-specific)
- [Domain-Specific](#domain-specific)
- [Project Scaffolding & MCP](#project-scaffolding--mcp)
- [Alternative Clients 📱](#alternative-clients-)
- [General](#general-6)
- [Official Documentation 🏛️](#official-documentation-%EF%B8%8F)
- [General](#general-7)
## Agent Skills 🤖
> Agent skills are model-controlled configurations (files, scripts, resources, etc.) that enable Claude Code to perform specialized tasks requiring specific knowledge or capabilities.
### General
- [AgentSys](https://github.com/avifenesh/agentsys) by [avifenesh](https://github.com/avifenesh) - Workflow automation system for Claude with a group of useful plugins, agents, and skills. Automates task-to-production workflows, PR management, code cleanup, performance investigation, drift detection, and multi-agent code review. Includes [agnix](https://github.com/avifenesh/agnix) for linting agent configurations. Built on thousands of lines of code with thousands of tests. Uses deterministic detection (regex, AST) with LLM judgment for efficiency. Used on many production systems.
- [AI Agent, AI Spy](https://youtu.be/0ANECpNdt-4) by [Whittaker & Tiwari](https://signalfoundation.org/) - Members from the Signal Foundation with some really great tips and tricks on how to turn your operating system into an instrument of total surveillance, and why some companies are doing this really awesome thing. [warning: YouTube link].
- [Book Factory](https://github.com/robertguss/claude-skills) by [Robert Guss](https://github.com/robertguss) - A comprehensive pipeline of Skills that replicates traditional publishing infrastructure for nonfiction book creation using specialized Claude skills.
- [cc-devops-skills](https://github.com/akin-ozer/cc-devops-skills) by [akin-ozer](https://github.com/akin-ozer) - Immensely detailed set of skills for DevOps Engineers (or anyone who has to deploy code, really). Works with validations, generators, shell scripts and CLI tools to create high quality IaC code for about any platform you've ever struggled painfully to work with. Worth downloading even just as a source of documentation.
- [Claude Code Agents](https://github.com/undeadlist/claude-code-agents) by [Paul - UndeadList](https://github.com/undeadlist) - Comprehensive E2E development workflow with helpful Claude Code subagent prompts for solo devs. Run multiple auditors in parallel, automate fix cycles with micro-checkpoint protocols, and do browser-based QA. Includes strict protocols to prevent AI going rogue.
- [Claude Codex Settings](https://github.com/fcakyon/claude-codex-settings) by [fatih akyon](https://github.com/fcakyon) - A well-organized, well-written set of plugins covering core developer activities, such as working with common cloud platforms like GitHub, Azure, MongoDB, and popular services such as Tavily, Playwright, and more. Clear, not overly-opinionated, and compatible with a few other providers.
- [Claude Mountaineering Skills](https://github.com/dreamiurg/claude-mountaineering-skills) by [Dmytro Gaivoronsky](https://github.com/dreamiurg) - Claude Code skill that automates mountain route research for North American peaks. Aggregates data from 10+ mountaineering sources like Mountaineers.org, PeakBagger.com and SummitPost.com to generate detailed route beta reports with weather, avalanche conditions, and trip reports.
- [Claude Scientific Skills](https://github.com/K-Dense-AI/claude-scientific-skills) by [K-Dense](https://github.com/K-Dense-AI/) - "A set of ready-to-use Agent Skills for research, science, engineering, analysis, finance and writing." That's their description - modest, simple. That's how you can tell this is really one of the best skills repos on GitHub. If you've ever thought about getting a PhD... just read all of these documents instead. Also I think it IS an AI agent or something? Awesome.
- [Codex Skill](https://github.com/skills-directory/skill-codex) by [klaudworks](https://github.com/klaudworks) - Enables users to prompt codex from claude code. Unlike the raw codex mcp server, this skill infers parameters such as model, reasoning effort, sandboxing from your prompt or asks you to specify them. It also simplifies continuing prior codex sessions so that codex can continue with the prior context.
- [Compound Engineering Plugin](https://github.com/EveryInc/compound-engineering-plugin) by [EveryInc](https://github.com/EveryInc) - A very pragmatic set of well-designed agents, skills, and commands, built around a discipline of turning past mistakes and errors into lessons and opportunities for future growth and improvement. Good documentation.
- [Context Engineering Kit](https://github.com/NeoLabHQ/context-engineering-kit) by [Vlad Goncharov](https://github.com/LeoVS09) - Hand-crafted collection of advanced context engineering techniques and patterns with minimal token footprint focused on improving agent result quality.
- [Everything Claude Code](https://github.com/affaan-m/everything-claude-code) by [Affaan Mustafa](https://github.com/affaan-m/) - Top-notch, well-written resources covering "just about everything" from core engineering domains. What's nice about this "everything-" store is most of the resources have significant standalone value and unlike some all-encompassing frameworks, although you can opt in to the author's own specific workflow patterns if you choose, the individual resources offer exemplary patterns in (just about) every Claude Code feature you can find (apologies to the Output Styles devotees).
- [Fullstack Dev Skills](https://github.com/jeffallan/claude-skills) by [jeffallan](https://github.com/jeffallan) - A comprehensive Claude Code plugin with 65 specialized skills covering full-stack development across a wide range of specific frameworks. Features 9 project workflow commands for Jira/Confluence integration and, notably, an interesting approach to context engineering via a `/common-ground` command that surfaces Claude's hidden assumptions about your project. This is a smart thing to do.
- [read-only-postgres](https://github.com/jawwadfirdousi/agent-skills) by [jawwadfirdousi](https://github.com/jawwadfirdousi) - Read-only PostgreSQL query skill for Claude Code. Executes SELECT/SHOW/EXPLAIN/WITH queries across configured databases with strict validation, timeouts, and row limits. Supports multiple connections with descriptions for database selection.
- [Superpowers](https://github.com/obra/superpowers) by [Jesse Vincent](https://github.com/obra) - A strong bundle of core competencies for software engineering, with good coverage of a large portion of the SDLC - from planning, reviewing, testing, debugging... Well written, well organized, and adaptable. The author refers to them as "superpowers", but many of them are just consolidating engineering best practices - which sometimes does feel like a superpower when working with Claude Code.
- [Trail of Bits Security Skills](https://github.com/trailofbits/skills) by [Trail of Bits](https://github.com/trailofbits) - A very professional collection of over a dozen security-focused skills for code auditing and vulnerability detection. Includes skills for static analysis with CodeQL and Semgrep, variant analysis across codebases, fix verification, and differential code review.
- [TÂCHES Claude Code Resources](https://github.com/glittercowboy/taches-cc-resources) by [TÂCHES](https://github.com/glittercowboy) - A well-balanced, "down-to-Earth" set of sub agents, skills, and commands, that are well-organized, easy to read, and a healthy focus on "meta"-skills/agents, like "skill-auditor", hook creation, etc. - the kind of things you can adapt to your workflow, and not the other way around.
- [Web Assets Generator Skill](https://github.com/alonw0/web-asset-generator) by [Alon Wolenitz](https://github.com/alonw0) - Easily generate web assets from Claude Code including favicons, app icons (PWA), and social media meta images (Open Graph) for Facebook, Twitter, WhatsApp, and LinkedIn. Handles image resizing, text-to-image generation, emojis, and provides proper HTML meta tags.
<br>
## Workflows & Knowledge Guides 🧠
> A workflow is a tightly coupled set of Claude Code-native resources that facilitate specific projects
### General
- [AB Method](https://github.com/ayoubben18/ab-method) by [Ayoub Bensalah](https://github.com/ayoubben18) - A principled, spec-driven workflow that transforms large problems into focused, incremental missions using Claude Code's specialized sub agents. Includes slash-commands, sub agents, and specialized workflows designed for specific parts of the SDLC.
- [Agentic Workflow Patterns](https://github.com/ThibautMelen/agentic-workflow-patterns) by [ThibautMelen](https://github.com/ThibautMelen) - A comprehensive and well-documented collection of agentic patterns from Anthropic docs, with colorful Mermaid diagrams and code examples for each pattern. Covers Subagent Orchestration, Progressive Skills, Parallel Tool Calling, Master-Clone Architecture, Wizard Workflows, and more. Also compatible with other providers.
- [Blogging Platform Instructions](https://github.com/cloudartisan/cloudartisan.github.io/tree/main/.claude/commands) by [cloudartisan](https://github.com/cloudartisan) - Provides a well-structured set of commands for publishing and maintaining a blogging platform, including commands for creating posts, managing categories, and handling media files.
- [Claude Code Documentation Mirror](https://github.com/ericbuess/claude-code-docs) by [Eric Buess](https://github.com/ericbuess) - A mirror of the Anthropic © PBC documentation pages for Claude Code, updated every few hours. Can come in handy when trying to stay on top of the ever-expanding feature-set of Dr. Claw D. Code, Ph.D.
- [Claude Code Handbook](https://nikiforovall.blog/claude-code-rules/) by [nikiforovall](https://github.com/nikiforovall) - Collection of best practices, tips, and techniques for Claude Code development workflows, enhanced with distributable plugins.
- [Claude Code Infrastructure Showcase](https://github.com/diet103/claude-code-infrastructure-showcase) by [diet103](https://github.com/diet103) - A remarkably innovative approach to working with Skills, the centerpiece of which being a technique that leverages hooks to ensure that Claude intelligently selects and activates the appropriate Skill given the current context. Well-documented and adaptable to different projects and workflows.
- [Claude Code PM](https://github.com/automazeio/ccpm) by [Ran Aroussi](https://github.com/ranaroussi) - Really comprehensive and feature-packed project-management workflow for Claude Code. Numerous specialized agents, slash-commands, and strong documentation.
- [Claude Code Repos Index](https://github.com/danielrosehill/Claude-Code-Repos-Index) by [Daniel Rosehill](https://github.com/danielrosehill) - This is either the work of a prolific genius, or a very clever bot (or both), although it hardly matters because the quality is so good - an index of 75+ Claude Code repositories published by the author - and I'm not talking about slop. CMS, system design, deep research, IoT, agentic workflows, server management, personal health... If you spot the lie, let me know, otherwise please check these out.
- [Claude Code System Prompts](https://github.com/Piebald-AI/claude-code-system-prompts) by [Piebald AI](https://github.com/Piebald-AI) - All parts of Claude Code's system prompt, including builtin tool descriptions, sub agent prompts (Plan/Explore/Task), utility prompts (CLAUDE.md, compact, Bash cmd, security review, agent creation, etc.). Updated for each Claude Code version.
- [Claude Code Tips](https://github.com/ykdojo/claude-code-tips) by [ykdojo](https://github.com/ykdojo) - A nice variety of 35+ brief but information-dense Claude Code tips covering voice input, system prompt patching, container workflows for risky tasks, conversation cloning(!), multi-model orchestration with Gemini CLI, and plenty more. Nice demos, working scripts, a plugin, I'd say this probably has a little something for everyone.
- [Claude Code Ultimate Guide](https://github.com/FlorianBruniaux/claude-code-ultimate-guide) by [Florian BRUNIAUX](https://www.linkedin.com/in/florian-bruniaux-43408b83/) - A tremendous feat of documentation, this guide covers Claude Code from beginner to power user, with production-ready templates for Claude Code features, guides on agentic workflows, and a lot of great learning materials, including quizzes and a handy "cheatsheet". Whether it's the "ultimate" guide to Claude Code will be up to the reader, but a valuable resource nonetheless (as with all documentation sites, make sure it's up to date before you bet the farm).
- [Claude CodePro](https://github.com/maxritter/claude-codepro) by [Max Ritter](https://www.maxritter.net) - Professional development environment for Claude Code with spec-driven workflow, TDD enforcement, cross-session memory, semantic search, quality hooks, and modular rules integration. A bit "heavyweight" but feature-packed and has wide coverage.
- [claude-code-docs](https://github.com/costiash/claude-code-docs) by [Constantin Shafranski](https://github.com/costiash) - A mirror of the Anthropic© PBC documentation site for Claude/Code, but with bonus features like full-text search and query-time updates - a nice companion to `claude-code-docs` for up-to-the-minute, fully-indexed information so that Claude Code can read about itself.
- [ClaudoPro Directory](https://github.com/JSONbored/claudepro-directory) by [ghost](https://github.com/JSONbored) - Well-crafted, wide selection of Claude Code hooks, slash commands, subagent files, and more, covering a range of specialized tasks and workflows. Better resources than your average "Claude-template-for-everything" site.
- [Context Priming](https://github.com/disler/just-prompt/tree/main/.claude/commands) by [disler](https://github.com/disler) - Provides a systematic approach to priming Claude Code with comprehensive project context through specialized commands for different project scenarios and development contexts.
- [Design Review Workflow](https://github.com/OneRedOak/claude-code-workflows/tree/main/design-review) by [Patrick Ellis](https://github.com/OneRedOak) - A tailored workflow for enabling automated UI/UX design review, including specialized sub agents, slash commands, `CLAUDE.md` excerpts, and more. Covers a broad range of criteria from responsive design to accessibility.
- [Laravel TALL Stack AI Development Starter Kit](https://github.com/tott/laravel-tall-claude-ai-configs) by [tott](https://github.com/tott) - Transform your Laravel TALL (Tailwind, AlpineJS, Laravel, Livewire) stack development with comprehensive Claude Code configurations that provide intelligent assistance, systematic workflows, and domain expert consultation.
- [Learn Claude Code](https://github.com/shareAI-lab/learn-claude-code) by [shareAI-Lab](https://github.com/shareAI-lab/) - A really interesting analysis of how coding agents like Claude Code are designed. It attempts to break an agent down into its fundamental parts and reconstruct it with minimal code. Great learning resource. Final product is a rudimentary agent with skills, sub-agents, and a todo-list in roughly a few hundred lines of Python.
- [learn-faster-kit](https://github.com/cheukyin175/learn-faster-kit) by [Hugo Lau](https://github.com/cheukyin175) - A creative educational framework for Claude Code, inspired by the "FASTER" approach to self-teaching. Ships with a variety of agents, slash commands, and tools that enable Claude Code to help you progress at your own pace, employing well-established pedagogical techniques like active learning and spaced repetition.
- [n8n_agent](https://github.com/kingler/n8n_agent/tree/main/.claude/commands) by [kingler](https://github.com/kingler) - Amazing comprehensive set of comments for code analysis, QA, design, documentation, project structure, project management, optimization, and many more.
- [Project Bootstrapping and Task Management](https://github.com/steadycursor/steadystart/tree/main/.claude/commands) by [steadycursor](https://github.com/steadycursor) - Provides a structured set of commands for bootstrapping and managing a new project, including meta-commands for creating and editing custom slash-commands.
- [Project Management, Implementation, Planning, and Release](https://github.com/scopecraft/command/tree/main/.claude/commands) by [scopecraft](https://github.com/scopecraft) - Really comprehensive set of commands for all aspects of SDLC.
- [Project Workflow System](https://github.com/harperreed/dotfiles/tree/master/.claude/commands) by [harperreed](https://github.com/harperreed) - A set of commands that provide a comprehensive workflow system for managing projects, including task management, code review, and deployment processes.
- [RIPER Workflow](https://github.com/tony/claude-code-riper-5) by [Tony Narlock](https://tony.sh) - Structured development workflow enforcing separation between Research, Innovate, Plan, Execute, and Review phases. Features consolidated subagents for context-efficiency, branch-aware memory bank, and strict mode enforcement for guided development.
- [Shipping Real Code w/ Claude](https://diwank.space/field-notes-from-shipping-real-code-with-claude) by [Diwank](https://github.com/creatorrr) - A detailed blog post explaining the author's process for shipping a product with Claude Code, including CLAUDE.md files and other interesting resources.
- [Simone](https://github.com/Helmi/claude-simone) by [Helmi](https://github.com/Helmi) - A broader project management workflow for Claude Code that encompasses not just a set of commands, but a system of documents, guidelines, and processes to facilitate project planning and execution.
### Ralph Wiggum
- [awesome-ralph](https://github.com/snwfdhmp/awesome-ralph) by [Martin Joly](https://github.com/snwfdhmp) - A curated list of resources about Ralph, the AI coding technique that runs AI coding agents in automated loops until specifications are fulfilled.
- [Ralph for Claude Code](https://github.com/frankbria/ralph-claude-code) by [Frank Bria](https://github.com/frankbria) - An autonomous AI development framework that enables Claude Code to work iteratively on projects until completion. Features intelligent exit detection, rate limiting, circuit breaker patterns, and comprehensive safety guardrails to prevent infinite loops and API overuse. Built with Bash, integrated with tmux for live monitoring, and includes 75+ comprehensive tests.
- [Ralph Wiggum Marketer](https://github.com/muratcankoylan/ralph-wiggum-marketer) by [Muratcan Koylan](https://github.com/muratcankoylan) - A Claude Code plugin that provides an autonomous AI copywriter, integrating the Ralph loop with customized knowledge bases for market research agents. The agents do the research, Ralph writes the copy, you stay in bed. Whether or not you practice Ralph-Driven Development (RDD), I think these projects are interesting and creative explorations of general agentic patterns.
- [ralph-orchestrator](https://github.com/mikeyobrien/ralph-orchestrator) by [mikeyobrien](https://github.com/mikeyobrien) - Ralph Orchestrator implements the simple but effective "Ralph Wiggum" technique for autonomous task completion, continuously running an AI agent against a prompt file until the task is marked as complete or limits are reached. This implementation provides a robust, well-tested, and feature-complete orchestration system for AI-driven development. Also cited in the Anthropic Ralph plugin documentation.
- [ralph-wiggum-bdd](https://github.com/marcindulak/ralph-wiggum-bdd) by [marcindulak](https://github.com/marcindulak) - A standalone Bash script for Behavior-Driven Development with Ralph Wiggum Loop. In principle, while running unattended, the script can keep code and requirements in sync, but in practice it still requires interactive human supervision, so it supports both modes. The script is standalone and can be modified and committed into your project.
- [The Ralph Playbook](https://github.com/ClaytonFarr/ralph-playbook) by [Clayton Farr](https://github.com/ClaytonFarr) - A remarkably detailed and comprehensive guide to the Ralph Wiggum technique, featuring well-written theoretical commentary paired with practical guidelines and advice.
<br>
## Tooling 🧰
> Tooling denotes applications that are built on top of Claude Code and consist of more components than slash-commands and `CLAUDE.md` files
### General
- [cc-sessions](https://github.com/GWUDCAP/cc-sessions) by [toastdev](https://github.com/satoastshi) - An opinionated approach to productive development with Claude Code.
- [cc-tools](https://github.com/Veraticus/cc-tools) by [Josh Symonds](https://github.com/Veraticus) - High-performance Go implementation of Claude Code hooks and utilities. Provides smart linting, testing, and statusline generation with minimal overhead.
- [ccexp](https://github.com/nyatinte/ccexp) by [nyatinte](https://github.com/nyatinte) - Interactive CLI tool for discovering and managing Claude Code configuration files and slash commands with a beautiful terminal UI.
- [cchistory](https://github.com/eckardt/cchistory) by [eckardt](https://github.com/eckardt) - Like the shell history command but for your Claude Code sessions. Easily list all Bash or "Bash-mode" (`!`) commands Claude Code ran in a session for reference.
- [cclogviewer](https://github.com/Brads3290/cclogviewer) by [Brad S.](https://github.com/Brads3290) - A humble but handy utility for viewing Claude Code `.jsonl` conversation files in a pretty HTML UI.
- [Claude Code Templates](https://github.com/davila7/claude-code-templates) by [Daniel Avila](https://github.com/davila7) - Incredibly awesome collection of resources from every category in this list, presented with a neatly polished UI, great features like usage dashboard, analytics, and everything from slash commands to hooks to agents. An awesome companion for this awesome list.
- [Claude Composer](https://github.com/possibilities/claude-composer) by [Mike Bannister](https://github.com/possibilities) - A tool that adds small enhancements to Claude Code.
- [Claude Hub](https://github.com/claude-did-this/claude-hub) by [Claude Did This](https://github.com/claude-did-this) - A webhook service that connects Claude Code to GitHub repositories, enabling AI-powered code assistance directly through pull requests and issues. This integration allows Claude to analyze repositories, answer technical questions, and help developers understand and improve their codebase through simple @mentions.
- [Claude Session Restore](https://github.com/ZENG3LD/claude-session-restore) by [ZENG3LD](https://github.com/ZENG3LD) - Efficiently restore context from previous Claude Code sessions by analyzing session files and git history. Features multi-factor data collection across numerous Claude Code capacities with time-based filtering. Uses tail-based parsing for efficient handling of large session files up to 2GB. Includes both a CLI tool for manual analysis and a Claude Code skill for automatic session restoration.
- [claude-code-tools](https://github.com/pchalasani/claude-code-tools) by [Prasad Chalasani](https://github.com/pchalasani) - Well-crafted toolset for session continuity, featuring skills/commands to avoid compaction and recover context across sessions with cross-agent handoff between Claude Code and Codex CLI. Includes a fast Rust/Tantivy-powered full-text session search (TUI for humans, skill/CLI for agents), tmux-cli skill + command for interacting with scripts and CLI agents, and safety hooks to block dangerous commands.
- [claude-starter-kit](https://github.com/serpro69/claude-starter-kit) by [serpro69](https://github.com/serpro69) - This is a starter template repository designed to provide a complete development environment for Claude-Code with pre-configured MCP servers and tools for AI-powered development workflows. The repository is intentionally minimal, containing only configuration templates for three primary systems: Claude Code, Serena, and Task Master.
- [claudekit](https://github.com/carlrannaberg/claudekit) by [Carl Rannaberg](https://github.com/carlrannaberg) - Impressive CLI toolkit providing auto-save checkpointing, code quality hooks, specification generation and execution, and 20+ specialized subagents including oracle (gpt-5), code-reviewer (6-aspect deep analysis), ai-sdk-expert (Vercel AI SDK), typescript-expert and many more for Claude Code workflows.
- [Container Use](https://github.com/dagger/container-use) by [dagger](https://github.com/dagger) - Development environments for coding agents. Enable multiple agents to work safely and independently with your preferred stack.
- [ContextKit](https://github.com/FlineDev/ContextKit) by [Cihat Gündüz](https://github.com/Jeehut) - A systematic development framework that transforms Claude Code into a proactive development partner. Features 4-phase planning methodology, specialized quality agents, and structured workflows that help AI produce production-ready code on first try.
- [recall](https://github.com/zippoxer/recall) by [zippoxer](https://github.com/zippoxer) - Full-text search your Claude Code sessions. Run `recall` in terminal, type to search, Enter to resume. Alternative to `claude --resume`.
- [Rulesync](https://github.com/dyoshikawa/rulesync) by [dyoshikawa](https://github.com/dyoshikawa) - A Node.js CLI tool that automatically generates configs (rules, ignore files, MCP servers, commands, and subagents) for various AI coding agents. Rulesync can convert configs between Claude Code and other AI agents in both directions.
- [run-claude-docker](https://github.com/icanhasjonas/run-claude-docker) by [Jonas](https://github.com/icanhasjonas/) - A self-contained Docker runner that forwards your current workspace into a safe(r) isolated docker container, where you still have access to your Claude Code settings, authentication, ssh agent, pgp, optionally aws keys etc.
- [stt-mcp-server-linux](https://github.com/marcindulak/stt-mcp-server-linux) by [marcindulak](https://github.com/marcindulak) - A push-to-talk speech transcription setup for Linux using a Python MCP server. Runs locally in Docker with no external API calls. Your speech is recorded, transcribed into text, and then sent to Claude running in a Tmux session.
- [SuperClaude](https://github.com/SuperClaude-Org/SuperClaude_Framework) by [SuperClaude-Org](https://github.com/SuperClaude-Org) - A versatile configuration framework that enhances Claude Code with specialized commands, cognitive personas, and development methodologies, such as "Introspection" and "Orchestration".
- [tweakcc](https://github.com/Piebald-AI/tweakcc) by [Piebald-AI](https://github.com/Piebald-AI) - Command-line tool to customize your Claude Code styling.
- [Vibe-Log](https://github.com/vibe-log/vibe-log-cli) by [Vibe-Log](https://github.com/vibe-log) - Analyzes your Claude Code prompts locally (using CC), provides intelligent session analysis and actionable strategic guidance - works in the statusline and produces very pretty HTML reports as well. Easy to install and remove.
- [viwo-cli](https://github.com/OverseedAI/viwo) by [Hal Shin](https://github.com/hal-shin) - Run Claude Code in a Docker container with git worktrees as volume mounts to enable safer usage of `--dangerously-skip-permissions` for frictionless one-shotting prompts. Allows users to spin up multiple instances of Claude Code in the background easily with reduced permission fatigue.
- [VoiceMode MCP](https://github.com/mbailey/voicemode) by [Mike Bailey](https://github.com/mbailey) - VoiceMode MCP brings natural conversations to Claude Code. It supports any OpenAI API compatible voice services and installs free and open source voice services (Whisper.cpp and Kokoro-FastAPI).
### IDE Integrations
- [Claude Code Chat](https://marketplace.visualstudio.com/items?itemName=AndrePimenta.claude-code-chat) by [andrepimenta](https://github.com/andrepimenta) - An elegant and user-friendly Claude Code chat interface for VS Code.
- [claude-code-ide.el](https://github.com/manzaltu/claude-code-ide.el) by [manzaltu](https://github.com/manzaltu) - claude-code-ide.el integrates Claude Code with Emacs, like Anthropic’s VS Code/IntelliJ extensions. It shows ediff-based code suggestions, pulls LSP/flymake/flycheck diagnostics, and tracks buffer context. It adds an extensible MCP tool support for symbol refs/defs, project metadata, and tree-sitter AST queries.
- [claude-code.el](https://github.com/stevemolitor/claude-code.el) by [stevemolitor](https://github.com/stevemolitor) - An Emacs interface for Claude Code CLI.
- [claude-code.nvim](https://github.com/greggh/claude-code.nvim) by [greggh](https://github.com/greggh) - A seamless integration between Claude Code AI assistant and Neovim.
- [Claudix - Claude Code for VSCode](https://github.com/Haleclipse/Claudix) by [Haleclipse](https://github.com/Haleclipse) - A VSCode extension that brings Claude Code directly into your editor with interactive chat interface, session management, intelligent file operations, terminal execution, and real-time streaming responses. Built with Vue 3, TypeScript.
### Usage Monitors
- [CC Usage](https://github.com/ryoppippi/ccusage) by [ryoppippi](https://github.com/ryoppippi) - Handy CLI tool for managing and analyzing Claude Code usage, based on analyzing local Claude Code logs. Presents a nice dashboard regarding cost information, token consumption, etc.
- [ccflare](https://github.com/snipeship/ccflare) by [snipeship](https://github.com/snipeship) - Claude Code usage dashboard with a web-UI that would put Tableau to shame. Thoroughly comprehensive metrics, frictionless setup, detailed logging, really really nice UI.
- [ccflare -> **better-ccflare**](https://github.com/tombii/better-ccflare/) by [tombii](https://github.com/tombii) - A well-maintained and feature-enhanced fork of the glorious `ccflare` usage dashboard by @snipeship (which at the time of writing has not had an update in a few months). `better-ccflare` builds on this foundation with some performance enhancements, extended provider support, bug fixes, Docker deployment, and more.
- [Claude Code Usage Monitor](https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor) by [Maciek-roboblog](https://github.com/Maciek-roboblog) - A real-time terminal-based tool for monitoring Claude Code token usage. It shows live token consumption, burn rate, and predictions for token depletion. Features include visual progress bars, session-aware analytics, and support for multiple subscription plans.
- [Claudex](https://github.com/kunwar-shah/claudex) by [Kunwar Shah](https://github.com/kunwar-shah) - Claudex - A web-based browser for exploring your Claude Code conversation history across projects. Indexes your codebase for full-text search. Nice, easy-to-navigate UI. Simple dashboard interface for high-level analytics, and multiple export options as well. (And completely local w/ no telemetry!).
- [viberank](https://github.com/sculptdotfun/viberank) by [nikshepsvn](https://github.com/nikshepsvn) - A community-driven leaderboard tool that enables developers to visualize, track, and compete based on their Claude Code usage statistics. It features robust data analytics, GitHub OAuth, data validation, and user-friendly CLI/web submission methods.
### Orchestrators
- [Auto-Claude](https://github.com/AndyMik90/Auto-Claude) by [AndyMik90](https://github.com/AndyMik90) - Autonomous multi-agent coding framework for Claude Code (Claude Agent SDK) that integrates the full SDLC - "plans, builds, and validates software for you". Features a slick kanban-style UI and a well-designed but not over-engineered agent orchestration system.
- [Claude Code Flow](https://github.com/ruvnet/claude-code-flow) by [ruvnet](https://github.com/ruvnet) - This mode serves as a code-first orchestration layer, enabling Claude to write, edit, test, and optimize code autonomously across recursive agent cycles.
- [Claude Squad](https://github.com/smtg-ai/claude-squad) by [smtg-ai](https://github.com/smtg-ai) - Claude Squad is a terminal app that manages multiple Claude Code, Codex (and other local agents including Aider) in separate workspaces, allowing you to work on multiple tasks simultaneously.
- [Claude Swarm](https://github.com/parruda/claude-swarm) by [parruda](https://github.com/parruda) - Launch Claude Code session that is connected to a swarm of Claude Code Agents.
- [Claude Task Master](https://github.com/eyaltoledano/claude-task-master) by [eyaltoledano](https://github.com/eyaltoledano) - A task management system for AI-driven development with Claude, designed to work seamlessly with Cursor AI.
- [Claude Task Runner](https://github.com/grahama1970/claude-task-runner) by [grahama1970](https://github.com/grahama1970) - A specialized tool to manage context isolation and focused task execution with Claude Code, solving the critical challenge of context length limitations and task focus when working with Claude on complex, multi-step projects.
- [Happy Coder](https://github.com/slopus/happy) by [GrocerPublishAgent](https://peoplesgrocers.com/en/projects) - Spawn and control multiple Claude Codes in parallel from your phone or desktop. Happy Coder runs Claude Code on your hardware, sends push notifications when Claude needs more input or permission, and costs nothing.
- [sudocode](https://github.com/sudocode-ai/sudocode) by [ssh-randy](https://github.com/ssh-randy) - Lightweight agent orchestration dev tool that lives in your repo. Integrates with various specification frameworks. It's giving Jira.
- [The Agentic Startup](https://github.com/rsmdt/the-startup) by [Rudolf Schmidt](https://github.com/rsmdt) - Yet Another Claude Orchestrator - a collection of agents, commands, etc., for shipping production code - but I like this because it's comprehensive, well-written, and one of the few resources that actually uses Output Styles! +10 points!
- [TSK - AI Agent Task Manager and Sandbox](https://github.com/dtormoen/tsk) by [dtormoen](https://github.com/dtormoen) - A Rust CLI tool that lets you delegate development tasks to AI agents running in sandboxed Docker environments. Multiple agents work in parallel, returning git branches for human review.
### Config Managers
- [claude-rules-doctor](https://github.com/nulone/claude-rules-doctor) by [nulone](https://github.com/nulone) - CLI that detects dead `.claude/rules/` files by checking if `paths:` globs actually match files in your repo. Catches silent rule failures where renamed directories or typos in glob patterns cause rules to never apply. Features CI mode (exit 1 on dead rules), JSON output, and verbose mode showing matched files.
- [ClaudeCTX](https://github.com/foxj77/claudectx) by [John Fox](https://github.com/foxj77) - claudectx lets you switch your entire Claude Code configuration with a single command.
<br>
## Status Lines 📊
> Status lines - Configurations and customizations for Claude Code's status bar functionality
### General
- [CCometixLine - Claude Code Statusline](https://github.com/Haleclipse/CCometixLine) by [Haleclipse](https://github.com/Haleclipse) - A high-performance Claude Code statusline tool written in Rust with Git integration, usage tracking, interactive TUI configuration, and Claude Code enhancement utilities.
- [ccstatusline](https://github.com/sirmalloc/ccstatusline) by [sirmalloc](https://github.com/sirmalloc) - A highly customizable status line formatter for Claude Code CLI that displays model info, git branch, token usage, and other metrics in your terminal.
- [claude-code-statusline](https://github.com/rz1989s/claude-code-statusline) by [rz1989s](https://github.com/rz1989s) - Enhanced 4-line statusline for Claude Code with themes, cost tracking, and MCP server monitoring.
- [claude-powerline](https://github.com/Owloops/claude-powerline) by [Owloops](https://github.com/Owloops) - A vim-style powerline statusline for Claude Code with real-time usage tracking, git integration, custom themes, and more.
- [claudia-statusline](https://github.com/hagan/claudia-statusline) by [Hagan Franks](https://github.com/hagan) - High-performance Rust-based statusline for Claude Code with persistent stats tracking, progress bars, and optional cloud sync. Features SQLite-first persistence, git integration, context progress bars, burn rate calculation, XDG-compliant with theme support (dark/light, NO_COLOR).
<br>
## Hooks 🪝
> Hooks are a powerful API for Claude Code that allows users to activate commands and run scripts at different points in Claude's agentic lifecycle.
### General
- [Britfix](https://github.com/Talieisin/britfix) by [Talieisin](https://github.com/Talieisin) - Claude outputs American spellings by default, which can have an impact on: professional credibility, compliance, documentation, and more. Britfix converts to British English, with a Claude Code hook for automatic conversion as files are written. Context-aware: handles code files intelligently by only converting comments and docstrings, never identifiers or string literals.
- [CC Notify](https://github.com/dazuiba/CCNotify) by [dazuiba](https://github.com/dazuiba) - CCNotify provides desktop notifications for Claude Code, alerting you to input needs or task completion, with one-click jumps back to VS Code and task duration display.
- [cchooks](https://github.com/GowayLee/cchooks) by [GowayLee](https://github.com/GowayLee) - A lightweight Python SDK with a clean API and good documentation; simplifies the process of writing hooks and integrating them into your codebase, providing a nice abstraction over the JSON configuration files.
- [Claude Code Hook Comms (HCOM)](https://github.com/aannoo/claude-hook-comms) by [aannoo](https://github.com/aannoo) - Lightweight CLI tool for real-time communication between Claude Code sub agents using hooks. Enables multi-agent collaboration with @-mention targeting, live dashboard monitoring, and zero-dependency implementation. [NOTE: At the time of posting, this resource is a little unstable - I'm sharing it anyway, because I think it's incredibly promising and creative. I hope by the time you read this, it is production-ready.].
- [claude-code-hooks-sdk](https://github.com/beyondcode/claude-hooks-sdk) by [beyondcode](https://github.com/beyondcode) - A Laravel-inspired PHP SDK for building Claude Code hook responses with a clean, fluent API. This SDK makes it easy to create structured JSON responses for Claude Code hooks using an expressive, chainable interface.
- [claude-hooks](https://github.com/johnlindquist/claude-hooks) by [John Lindquist](https://github.com/johnlindquist) - A TypeScript-based system for configuring and customizing Claude Code hooks with a powerful and flexible interface.
- [Claudio](https://github.com/ctoth/claudio) by [Christopher Toth](https://github.com/ctoth) - A no-frills little library that adds delightful OS-native sounds to Claude Code via simple hooks. It really sparks joy.
- [Dippy](https://github.com/ldayton/Dippy) by [Lily Dayton](https://github.com/ldayton) - Auto-approve safe bash commands using AST-based parsing, while prompting for destructive operations. Solves permission fatigue without disabling safety. Supports Claude Code, Gemini CLI, and Cursor.
- [parry](https://github.com/vaporif/parry) by [Dmytro Onypko](https://github.com/vaporif) - Prompt injection scanner for Claude Code hooks. Scans tool inputs and outputs for injection attacks, secrets, and data exfiltration attempts. [NOTE: Early development phase but worth a look.].
- [TDD Guard](https://github.com/nizos/tdd-guard) by [Nizar Selander](https://github.com/nizos) - A hooks-driven system that monitors file operations in real-time and blocks changes that violate TDD principles.
- [TypeScript Quality Hooks](https://github.com/bartolli/claude-code-typescript-hooks) by [bartolli](https://github.com/bartolli) - Quality check hook for Node.js TypeScript projects with TypeScript compilation. ESLint auto-fixing, and Prettier formatting. Uses SHA256 config caching for < 5ms validation performance during real-time editing.
<br>
## Slash-Commands 🔪
> "Slash Commands are customized, carefully refined prompts that control Claude's behavior in order to perform a specific task"
### General
- [/create-hook](https://github.com/omril321/automated-notebooklm/blob/main/.claude/commands/create-hook.md) by [Omri Lavi](https://github.com/omril321) - Slash command for hook creation - intelligently prompts you through the creation process with smart suggestions based on your project setup (TS, Prettier, ESLint...).
- [/linux-desktop-slash-commands](https://github.com/danielrosehill/Claude-Code-Linux-Desktop-Slash-Commands) by [Daniel Rosehill](https://github.com/danielrosehill) - A library of slash commands intended specifically to facilitate common and advanced operations on Linux desktop environments (although many would also be useful on Linux servers). Command groups include hardware benchmarking, filesystem organisation, and security posture validation.
### Version Control & Git
- [/analyze-issue](https://github.com/jerseycheese/Narraitor/blob/feature/issue-227-ai-suggestions/.claude/commands/analyze-issue.md) by [jerseycheese](https://github.com/jerseycheese) - Fetches GitHub issue details to create comprehensive implementation specifications, analyzing requirements and planning structured approach with clear implementation steps.
- [/commit](https://github.com/evmts/tevm-monorepo/blob/main/.claude/commands/commit.md) by [evmts](https://github.com/evmts) - Creates git commits using conventional commit format with appropriate emojis, following project standards and creating descriptive messages that explain the purpose of changes.
- [/commit-fast](https://github.com/steadycursor/steadystart/blob/main/.claude/commands/2-commit-fast.md) by [steadycursor](https://github.com/steadycursor) - Automates git commit process by selecting the first suggested message, generating structured commits with consistent formatting while skipping manual confirmation and removing Claude co-Contributorship footer.
- [/create-pr](https://github.com/toyamarinyon/giselle/blob/main/.claude/commands/create-pr.md) by [toyamarinyon](https://github.com/toyamarinyon) - Streamlines pull request creation by handling the entire workflow: creating a new branch, committing changes, formatting modified files with Biome, and submitting the PR.
- [/create-pull-request](https://github.com/liam-hq/liam/blob/main/.claude/commands/create-pull-request.md) by [liam-hq](https://github.com/liam-hq) - Provides comprehensive PR creation guidance with GitHub CLI, enforcing title conventions, following template structure, and offering concrete command examples with best practices.
- [/create-worktrees](https://github.com/evmts/tevm-monorepo/blob/main/.claude/commands/create-worktrees.md) by [evmts](https://github.com/evmts) - Creates git worktrees for all open PRs or specific branches, handling branches with slashes, cleaning up stale worktrees, and supporting custom branch creation for development.
- [/fix-github-issue](https://github.com/jeremymailen/kotlinter-gradle/blob/master/.claude/commands/fix-github-issue.md) by [jeremymailen](https://github.com/jeremymailen) - Analyzes and fixes GitHub issues using a structured approach with GitHub CLI for issue details, implementing necessary code changes, running tests, and creating proper commit messages.
- [/fix-issue](https://github.com/metabase/metabase/blob/master/.claude/commands/fix-issue.md) by [metabase](https://github.com/metabase) - Addresses GitHub issues by taking issue number as parameter, analyzing context, implementing solution, and testing/validating the fix for proper integration.
- [/fix-pr](https://github.com/metabase/metabase/blob/master/.claude/commands/fix-pr.md) by [metabase](https://github.com/metabase) - Fetches and fixes unresolved PR comments by automatically retrieving feedback, addressing reviewer concerns, making targeted code improvements, and streamlining the review process.
- [/husky](https://github.com/evmts/tevm-monorepo/blob/main/.claude/commands/husky.md) by [evmts](https://github.com/evmts) - Sets up and manages Husky Git hooks by configuring pre-commit hooks, establishing commit message standards, integrating with linting tools, and ensuring code quality on commits.
- [/update-branch-name](https://github.com/giselles-ai/giselle/blob/main/.claude/commands/update-branch-name.md) by [giselles-ai](https://github.com/giselles-ai) - Updates branch names with proper prefixes and formats, enforcing naming conventions, supporting semantic prefixes, and managing remote branch updates.
### Code Analysis & Testing
- [/check](https://github.com/rygwdn/slack-tools/blob/main/.claude/commands/check.md) by [rygwdn](https://github.com/rygwdn) - Performs comprehensive code quality and security checks, featuring static analysis integration, security vulnerability scanning, code style enforcement, and detailed reporting.
- [/code_analysis](https://github.com/kingler/n8n_agent/blob/main/.claude/commands/code_analysis.md) by [kingler](https://github.com/kingler) - Provides a menu of advanced code analysis commands for deep inspection, including knowledge graph generation, optimization suggestions, and quality evaluation.
- [/optimize](https://github.com/to4iki/ai-project-rules/blob/main/.claude/commands/optimize.md) by [to4iki](https://github.com/to4iki) - Analyzes code performance to identify bottlenecks, proposing concrete optimizations with implementation guidance for improved application performance.
- [/repro-issue](https://github.com/rzykov/metabase/blob/master/.claude/commands/repro-issue.md) by [rzykov](https://github.com/rzykov) - Creates reproducible test cases for GitHub issues, ensuring tests fail reliably and documenting clear reproduction steps for developers.
- [/tdd](https://github.com/zscott/pane/blob/main/.claude/commands/tdd.md) by [zscott](https://github.com/zscott) - Guides development using Test-Driven Development principles, enforcing Red-Green-Refactor discipline, integrating with git workflow, and managing PR creation.
- [/tdd-implement](https://github.com/jerseycheese/Narraitor/blob/feature/issue-227-ai-suggestions/.claude/commands/tdd-implement.md) by [jerseycheese](https://github.com/jerseycheese) - Implements Test-Driven Development by analyzing feature requirements, creating tests first (red), implementing minimal passing code (green), and refactoring while maintaining tests.
### Context Loading & Priming
- [/context-prime](https://github.com/elizaOS/elizaos.github.io/blob/main/.claude/commands/context-prime.md) by [elizaOS](https://github.com/elizaOS) - Primes Claude with comprehensive project understanding by loading repository structure, setting development context, establishing project goals, and defining collaboration parameters.
- [/initref](https://github.com/okuvshynov/cubestat/blob/main/.claude/commands/initref.md) by [okuvshynov](https://github.com/okuvshynov) - Initializes reference documentation structure with standard doc templates, API reference setup, documentation conventions, and placeholder content generation.
- [/load-llms-txt](https://github.com/ethpandaops/xatu-data/blob/master/.claude/commands/load-llms-txt.md) by [ethpandaops](https://github.com/ethpandaops) - Loads LLM configuration files to context, importing specific terminology, model configurations, and establishing baseline terminology for AI discussions.
- [/load_coo_context](https://github.com/Mjvolk3/torchcell/blob/main/.claude/commands/load_coo_context.md) by [Mjvolk3](https://github.com/Mjvolk3) - References specific files for sparse matrix operations, explains transform usage, compares with previous approaches, and sets data formatting context for development.
- [/load_dango_pipeline](https://github.com/Mjvolk3/torchcell/blob/main/.claude/commands/load_dango_pipeline.md) by [Mjvolk3](https://github.com/Mjvolk3) - Sets context for model training by referencing pipeline files, establishing working context, and preparing for pipeline work with relevant documentation.
- [/prime](https://github.com/yzyydev/AI-Engineering-Structure/blob/main/.claude/commands/prime.md) by [yzyydev](https://github.com/yzyydev) - Sets up initial project context by viewing directory structure and reading key files, creating standardized context with directory visualization and key documentation focus.
- [/rsi](https://github.com/ddisisto/si/blob/main/.claude/commands/rsi.md) by [ddisisto](https://github.com/ddisisto) - Reads all commands and key project files to optimize AI-assisted development by streamlining the process, loading command context, and setting up for better development workflow.
### Documentation & Changelogs
- [/add-to-changelog](https://github.com/berrydev-ai/blockdoc-python/blob/main/.claude/commands/add-to-changelog.md) by [berrydev-ai](https://github.com/berrydev-ai) - Adds new entries to changelog files while maintaining format consistency, properly documenting changes, and following established project standards for version tracking.
- [/create-docs](https://github.com/jerseycheese/Narraitor/blob/feature/issue-227-ai-suggestions/.claude/commands/create-docs.md) by [jerseycheese](https://github.com/jerseycheese) - Analyzes code structure and purpose to create comprehensive documentation detailing inputs/outputs, behavior, user interaction flows, and edge cases with error handling.
- [/docs](https://github.com/slunsford/coffee-analytics/blob/main/.claude/commands/docs.md) by [slunsford](https://github.com/slunsford) - Generates comprehensive documentation that follows project structure, documenting APIs and usage patterns with consistent formatting for better user understanding.
- [/explain-issue-fix](https://github.com/hackdays-io/toban-contribution-viewer/blob/main/.claude/commands/explain-issue-fix.md) by [hackdays-io](https://github.com/hackdays-io) - Documents solution approaches for GitHub issues, explaining technical decisions, detailing challenges overcome, and providing implementation context for better understanding.
- [/update-docs](https://github.com/Consiliency/Flutter-Structurizr/blob/main/.claude/commands/update-docs.md) by [Consiliency](https://github.com/Consiliency) - Reviews current documentation status, updates implementation progress, reviews phase documents, and maintains documentation consistency across the project.
### CI / Deployment
- [/release](https://github.com/kelp/webdown/blob/main/.claude/commands/release.md) by [kelp](https://github.com/kelp) - Manages software releases by updating changelogs, reviewing README changes, evaluating version increments, and documenting release changes for better version tracking.
- [/run-ci](https://github.com/hackdays-io/toban-contribution-viewer/blob/main/.claude/commands/run-ci.md) by [hackdays-io](https://github.com/hackdays-io) - Activates virtual environments, runs CI-compatible check scripts, iteratively fixes errors, and ensures all tests pass before completion.
### Project & Task Management
- [/create-command](https://github.com/scopecraft/command/blob/main/.claude/commands/create-command.md) by [scopecraft](https://github.com/scopecraft) - Guides Claude through creating new custom commands with proper structure by analyzing requirements, templating commands by category, enforcing command standards, and creating supporting documentation.
- [/create-plan](https://github.com/hesreallyhim/inkverse-fork/blob/preserve-claude-resources/.claude/commands/create-plan.md) by [taddyorg](https://github.com/taddyorg) - Generates comprehensive product requirement documents outlining detailed specifications, requirements, and features following standardized document structure and format. *(Removed from origin)*
- [/create-prp](https://github.com/Wirasm/claudecode-utils/blob/main/.claude/commands/create-prp.md) by [Wirasm](https://github.com/Wirasm) - Creates product requirement plans by reading PRP methodology, following template structure, creating comprehensive requirements, and structuring product definitions for development.
- [/do-issue](https://github.com/jerseycheese/Narraitor/blob/feature/issue-227-ai-suggestions/.claude/commands/do-issue.md) by [jerseycheese](https://github.com/jerseycheese) - Implements GitHub issues with manual review points, following a structured approach with issue number parameter and offering alternative automated mode for efficiency.
- [/prd-generator](https://github.com/dredozubov/prd-generator) by [Denis Redozubov](https://github.com/dredozubov) - A Claude Code plugin that generates comprehensive Product Requirements Documents (PRDs) from conversation context. Invoke `/create-prd` after discussing requirements and it produces a complete PRD with all standard sections including Executive Summary, User Stories, MVP Scope, Architecture, Success Criteria, and Implementation Phases.
- [/project_hello_w_name](https://github.com/disler/just-prompt/blob/main/.claude/commands/project_hello_w_name.md) by [disler](https://github.com/disler) - Creates customizable greeting components with name input, demonstrating argument passing, component reusability, state management, and user input handling.
- [/todo](https://github.com/chrisleyva/todo-slash-command/blob/main/todo.md) by [chrisleyva](https://github.com/chrisleyva) - A convenient command to quickly manage project todo items without leaving the Claude Code interface, featuring due dates, sorting, task prioritization, and comprehensive todo list management.
### Miscellaneous
- [/fixing_go_in_graph](https://github.com/Mjvolk3/torchcell/blob/main/.claude/commands/fixing_go_in_graph.md) by [Mjvolk3](https://github.com/Mjvolk3) - Focuses on Gene Ontology annotation integration in graph databases, handling multiple data sources, addressing graph representation issues, and ensuring correct data incorporation.
- [/mermaid](https://github.com/GaloyMoney/lana-bank/blob/main/.claude/commands/mermaid.md) by [GaloyMoney](https://github.com/GaloyMoney) - Generates Mermaid diagrams from SQL schema files, creating entity relationship diagrams with table properties, validating diagram compilation, and ensuring complete entity coverage.
- [/review_dcell_model](https://github.com/Mjvolk3/torchcell/blob/main/.claude/commands/review_dcell_model.md) by [Mjvolk3](https://github.com/Mjvolk3) - Reviews old Dcell implementation files, comparing with newer Dango model, noting changes over time, and analyzing refactoring approaches for better code organization.
- [/use-stepper](https://github.com/zuplo/docs/blob/main/.claude/commands/use-stepper.md) by [zuplo](https://github.com/zuplo) - Reformats documentation to use React Stepper component, transforming heading formats, applying proper indentation, and maintaining markdown compatibility with admonition formatting.
<br>
## CLAUDE.md Files 📂
> `CLAUDE.md` files are files that contain important guidelines and context-specific information or instructions that help Claude Code to better understand your project and your coding standards
### Language-Specific
- [AI IntelliJ Plugin](https://github.com/didalgolab/ai-intellij-plugin/blob/main/CLAUDE.md) by [didalgolab](https://github.com/didalgolab) - Provides comprehensive Gradle commands for IntelliJ plugin development with platform-specific coding patterns, detailed package structure guidelines, and clear internationalization standards.
- [AWS MCP Server](https://github.com/alexei-led/aws-mcp-server/blob/main/CLAUDE.md) by [alexei-led](https://github.com/alexei-led) - Features multiple Python environment setup options with detailed code style guidelines, comprehensive error handling recommendations, and security considerations for AWS CLI interactions.
- [DroidconKotlin](https://github.com/touchlab/DroidconKotlin/blob/main/CLAUDE.md) by [touchlab](https://github.com/touchlab) - Delivers comprehensive Gradle commands for cross-platform Kotlin Multiplatform development with clear module structure and practical guidance for dependency injection.
- [EDSL](https://github.com/hesreallyhim/awesome-claude-code/blob/main/resources/claude.md-files/EDSL/CLAUDE.md) by [expectedparrot](https://github.com/expectedparrot) - Offers detailed build and test commands with strict code style enforcement, comprehensive testing requirements, and standardized development workflow using Black and mypy. *(Removed from origin)*
- [Giselle](https://github.com/giselles-ai/giselle/blob/main/CLAUDE.md) by [giselles-ai](https://github.com/giselles-ai) - Provides detailed build and test commands using pnpm and Vitest with strict code formatting requirements and comprehensive naming conventions for code consistency.
- [HASH](https://github.com/hashintel/hash/blob/main/CLAUDE.md) by [hashintel](https://github.com/hashintel) - Features comprehensive repository structure breakdown with strong emphasis on coding standards, detailed Rust documentation guidelines, and systematic PR review process.
- [Inkline](https://github.com/inkline/inkline/blob/main/CLAUDE.md) by [inkline](https://github.com/inkline) - Structures development workflow using pnpm with emphasis on TypeScript and Vue 3 Composition API, detailed component creation process, and comprehensive testing recommendations.
- [JSBeeb](https://github.com/mattgodbolt/jsbeeb/blob/main/CLAUDE.md) by [mattgodbolt](https://github.com/mattgodbolt) - Provides development guide for JavaScript BBC Micro emulator with build and testing instructions, architecture documentation, and debugging workflows.
- [Lamoom Python](https://github.com/LamoomAI/lamoom-python/blob/main/CLAUDE.md) by [LamoomAI](https://github.com/LamoomAI) - Serves as reference for production prompt engineering library with load balancing of AI Models, API documentation, and usage patterns with examples.
- [LangGraphJS](https://github.com/langchain-ai/langgraphjs/blob/main/CLAUDE.md) by [langchain-ai](https://github.com/langchain-ai) - Offers comprehensive build and test commands with detailed TypeScript style guidelines, layered library architecture, and monorepo structure using yarn workspaces.
- [Metabase](https://github.com/metabase/metabase/blob/master/CLAUDE.md) by [metabase](https://github.com/metabase) - Details workflow for REPL-driven development in Clojure/ClojureScript with emphasis on incremental development, testing, and step-by-step approach for feature implementation.
- [SG Cars Trends Backend](https://github.com/sgcarstrends/backend/blob/main/CLAUDE.md) by [sgcarstrends](https://github.com/sgcarstrends) - Provides comprehensive structure for TypeScript monorepo projects with detailed commands for development, testing, deployment, and AWS/Cloudflare integration.
- [SPy](https://github.com/spylang/spy/blob/main/CLAUDE.md) by [spylang](https://github.com/spylang) - Enforces strict coding conventions with comprehensive testing guidelines, multiple code compilation options, and backend-specific test decorators for targeted filtering.
- [TPL](https://github.com/KarpelesLab/tpl/blob/master/CLAUDE.md) by [KarpelesLab](https://github.com/KarpelesLab) - Details Go project conventions with comprehensive error handling recommendations, table-driven testing approach guidelines, and modernization suggestions for latest Go features.
### Domain-Specific
- [Course Builder](https://github.com/badass-courses/course-builder/blob/main/CLAUDE.md) by [badass-courses](https://github.com/badass-courses) - Enables real-time multiplayer capabilities for collaborative course creation with diverse tech stack integration and monorepo architecture using Turborepo.
- [Cursor Tools](https://github.com/eastlondoner/cursor-tools/blob/main/CLAUDE.md) by [eastlondoner](https://github.com/eastlondoner) - Creates a versatile AI command interface supporting multiple providers and models with flexible command options and browser automation through "Stagehand" feature.
- [Guitar](https://github.com/soramimi/Guitar/blob/master/CLAUDE.md) by [soramimi](https://github.com/soramimi) - Serves as development guide for Guitar Git GUI Client with build commands for various platforms, code style guidelines for contributing, and project structure explanation.
- [Network Chronicles](https://github.com/Fimeg/NetworkChronicles/blob/legacy-v1/CLAUDE.md) by [Fimeg](https://github.com/Fimeg) - Presents detailed implementation plan for AI-driven game characters with technical specifications for LLM integration, character guidelines, and service discovery mechanics.
- [Pareto Mac](https://github.com/ParetoSecurity/pareto-mac/blob/main/CLAUDE.md) by [ParetoSecurity](https://github.com/ParetoSecurity) - Serves as development guide for Mac security audit tool with build instructions, contribution guidelines, testing procedures, and workflow documentation.
- [pre-commit-hooks](https://github.com/aRustyDev/pre-commit-hooks) by [aRustyDev](https://github.com/aRustyDev) - This repository is about pre-commit-hooks in general, but the `CLAUDE.md` and related `.claude/` documentation is exemplary. Thorough but not verbose. Unlike a lot of `CLAUDE.md` files, it doesn't primarily consist in shouting at Claude in all-caps. Great learning resource. Also, hooks.
- [SteadyStart](https://github.com/steadycursor/steadystart/blob/main/CLAUDE.md) by [steadycursor](https://github.com/steadycursor) - Clear and direct instructives about style, permissions, Claude's "role", communications, and documentation of Claude Code sessions for other team members to stay abreast.
### Project Scaffolding & MCP
- [Basic Memory](https://github.com/basicmachines-co/basic-memory/blob/main/CLAUDE.md) by [basicmachines-co](https://github.com/basicmachines-co) - Presents an innovative AI-human collaboration framework with Model Context Protocol for bidirectional LLM-markdown communication and flexible knowledge structure for complex projects.
- [claude-code-mcp-enhanced](https://github.com/grahama1970/claude-code-mcp-enhanced/blob/main/CLAUDE.md) by [grahama1970](https://github.com/grahama1970) - Provides detailed and emphatic instructions for Claude to follow as a coding agent, with testing guidance, code examples, and compliance checks.
<br>
## Alternative Clients 📱
> Alternative Clients are alternative UIs and front-ends for interacting with Claude Code, either on mobile or on the desktop.
### General
- [Claudable](https://github.com/opactorai/Claudable) by [Ethan Park](https://www.linkedin.com/in/seongil-park/) - Claudable is an open-source web builder that leverages local CLI agents, such as Claude Code and Cursor Agent, to build and deploy products effortlessly.
- [claude-esp](https://github.com/phiat/claude-esp) by [phiat](https://github.com/phiat) - Go-based TUI that streams Claude Code's hidden output (thinking, tool calls, subagents) to a separate terminal. Watch multiple sessions simultaneously, filter by content type, and track background tasks. Ideal for debugging or understanding what Cla
gitextract_qi3ecgdm/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── recommend-resource.yml
│ │ └── repository-enhancement.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── README.md
│ ├── check-repo-health.yml
│ ├── ci.yml
│ ├── close-resource-pr.yml
│ ├── close-resource-prs.yml
│ ├── handle-resource-submission-commands.yml
│ ├── notify-on-merge.yml
│ ├── submission-enforcement-v2.yml
│ ├── submission-enforcement.yml
│ ├── update-github-release-data.yml
│ ├── update-repo-ticker.yml
│ ├── validate-links.yml
│ └── validate-new-issue.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .python-version
├── LICENSE
├── Makefile
├── README.md
├── README_ALTERNATIVES/
│ ├── README_AWESOME.md
│ ├── README_CLASSIC.md
│ ├── README_EXTRA.md
│ ├── README_FLAT_ALL_AZ.md
│ ├── README_FLAT_ALL_CREATED.md
│ ├── README_FLAT_ALL_RELEASES.md
│ ├── README_FLAT_ALL_UPDATED.md
│ ├── README_FLAT_CLAUDE-MD_AZ.md
│ ├── README_FLAT_CLAUDE-MD_CREATED.md
│ ├── README_FLAT_CLAUDE-MD_RELEASES.md
│ ├── README_FLAT_CLAUDE-MD_UPDATED.md
│ ├── README_FLAT_CLIENTS_AZ.md
│ ├── README_FLAT_CLIENTS_CREATED.md
│ ├── README_FLAT_CLIENTS_RELEASES.md
│ ├── README_FLAT_CLIENTS_UPDATED.md
│ ├── README_FLAT_COMMANDS_AZ.md
│ ├── README_FLAT_COMMANDS_CREATED.md
│ ├── README_FLAT_COMMANDS_RELEASES.md
│ ├── README_FLAT_COMMANDS_UPDATED.md
│ ├── README_FLAT_DOCS_AZ.md
│ ├── README_FLAT_DOCS_CREATED.md
│ ├── README_FLAT_DOCS_RELEASES.md
│ ├── README_FLAT_DOCS_UPDATED.md
│ ├── README_FLAT_HOOKS_AZ.md
│ ├── README_FLAT_HOOKS_CREATED.md
│ ├── README_FLAT_HOOKS_RELEASES.md
│ ├── README_FLAT_HOOKS_UPDATED.md
│ ├── README_FLAT_SKILLS_AZ.md
│ ├── README_FLAT_SKILLS_CREATED.md
│ ├── README_FLAT_SKILLS_RELEASES.md
│ ├── README_FLAT_SKILLS_UPDATED.md
│ ├── README_FLAT_STATUSLINE_AZ.md
│ ├── README_FLAT_STATUSLINE_CREATED.md
│ ├── README_FLAT_STATUSLINE_RELEASES.md
│ ├── README_FLAT_STATUSLINE_UPDATED.md
│ ├── README_FLAT_STYLES_AZ.md
│ ├── README_FLAT_STYLES_CREATED.md
│ ├── README_FLAT_STYLES_RELEASES.md
│ ├── README_FLAT_STYLES_UPDATED.md
│ ├── README_FLAT_TOOLING_AZ.md
│ ├── README_FLAT_TOOLING_CREATED.md
│ ├── README_FLAT_TOOLING_RELEASES.md
│ ├── README_FLAT_TOOLING_UPDATED.md
│ ├── README_FLAT_WORKFLOWS_AZ.md
│ ├── README_FLAT_WORKFLOWS_CREATED.md
│ ├── README_FLAT_WORKFLOWS_RELEASES.md
│ └── README_FLAT_WORKFLOWS_UPDATED.md
├── THE_RESOURCES_TABLE.csv
├── acc-config.yaml
├── data/
│ ├── repo-ticker-previous.csv
│ └── repo-ticker.csv
├── docs/
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── COOLDOWN.md
│ ├── HOW_IT_LOOKS.md
│ ├── HOW_IT_WORKS.md
│ ├── README-GENERATION.md
│ ├── REPO_TICKER.md
│ ├── SECURITY.md
│ ├── TESTING.md
│ └── development/
│ ├── cooldown-enforcement.md
│ ├── do-not-forget.md
│ ├── path-resolution-migration-plan.md
│ ├── path-resolution-strategy.final.md
│ ├── summary-rendering-cheatsheet.md
│ ├── tech-debt.md
│ ├── toc-anchor-generation.md
│ └── vintage-manual-animation-style-guide.md
├── pyproject.toml
├── resources/
│ ├── README.md
│ ├── claude.md-files/
│ │ ├── AI-IntelliJ-Plugin/
│ │ │ └── CLAUDE.md
│ │ ├── AVS-Vibe-Developer-Guide/
│ │ │ └── CLAUDE.md
│ │ ├── AWS-MCP-Server/
│ │ │ └── CLAUDE.md
│ │ ├── Basic-Memory/
│ │ │ └── CLAUDE.md
│ │ ├── Comm/
│ │ │ └── CLAUDE.md
│ │ ├── Course-Builder/
│ │ │ └── CLAUDE.md
│ │ ├── Cursor-Tools/
│ │ │ └── CLAUDE.md
│ │ ├── DroidconKotlin/
│ │ │ └── CLAUDE.md
│ │ ├── EDSL/
│ │ │ └── CLAUDE.md
│ │ ├── Giselle/
│ │ │ └── CLAUDE.md
│ │ ├── Guitar/
│ │ │ └── CLAUDE.md
│ │ ├── JSBeeb/
│ │ │ └── CLAUDE.md
│ │ ├── Lamoom-Python/
│ │ │ └── CLAUDE.md
│ │ ├── LangGraphJS/
│ │ │ └── CLAUDE.md
│ │ ├── Network-Chronicles/
│ │ │ └── CLAUDE.md
│ │ ├── Note-Companion/
│ │ │ └── CLAUDE.md
│ │ ├── Pareto-Mac/
│ │ │ └── CLAUDE.md
│ │ ├── Perplexity-MCP/
│ │ │ └── CLAUDE.md
│ │ ├── SG-Cars-Trends-Backend/
│ │ │ └── CLAUDE.md
│ │ ├── SPy/
│ │ │ └── CLAUDE.md
│ │ ├── TPL/
│ │ │ └── CLAUDE.md
│ │ └── claude-code-mcp-enhanced/
│ │ └── CLAUDE.md
│ ├── official-documentation/
│ │ ├── Anthropic-Quickstarts/
│ │ │ └── CLAUDE.md
│ │ └── Claude-Code-GitHub-Actions/
│ │ ├── ci-failure-auto-fix.yml
│ │ ├── claude.yml
│ │ ├── issue-deduplication.yml
│ │ ├── issue-triage.yml
│ │ ├── manual-code-analysis.yml
│ │ ├── pr-review-comprehensive.yml
│ │ ├── pr-review-filtered-authors.yml
│ │ └── pr-review-filtered-paths.yml
│ ├── slash-commands/
│ │ ├── act/
│ │ │ └── act.md
│ │ ├── add-to-changelog/
│ │ │ └── add-to-changelog.md
│ │ ├── clean/
│ │ │ └── clean.md
│ │ ├── commit/
│ │ │ └── commit.md
│ │ ├── context-prime/
│ │ │ └── context-prime.md
│ │ ├── create-hook/
│ │ │ └── create-hook.md
│ │ ├── create-jtbd/
│ │ │ └── create-jtbd.md
│ │ ├── create-pr/
│ │ │ └── create-pr.md
│ │ ├── create-prd/
│ │ │ └── create-prd.md
│ │ ├── create-prp/
│ │ │ └── create-prp.md
│ │ ├── create-pull-request/
│ │ │ └── create-pull-request.md
│ │ ├── create-worktrees/
│ │ │ └── create-worktrees.md
│ │ ├── fix-github-issue/
│ │ │ └── fix-github-issue.md
│ │ ├── husky/
│ │ │ └── husky.md
│ │ ├── initref/
│ │ │ └── initref.md
│ │ ├── load-llms-txt/
│ │ │ └── load-llms-txt.md
│ │ ├── optimize/
│ │ │ └── optimize.md
│ │ ├── pr-review/
│ │ │ └── pr-review.md
│ │ ├── release/
│ │ │ └── release.md
│ │ ├── testing_plan_integration/
│ │ │ └── testing_plan_integration.md
│ │ ├── todo/
│ │ │ └── todo.md
│ │ ├── update-branch-name/
│ │ │ └── update-branch-name.md
│ │ └── update-docs/
│ │ └── update-docs.md
│ └── workflows-knowledge-guides/
│ ├── Blogging-Platform-Instructions/
│ │ └── view_commands.md
│ └── Design-Review-Workflow/
│ ├── README.md
│ ├── design-principles-example.md
│ ├── design-review-agent.md
│ ├── design-review-claude-md-snippet.md
│ └── design-review-slash-command.md
├── scripts/
│ ├── README.md
│ ├── __init__.py
│ ├── archive/
│ │ ├── README.md
│ │ └── __init__.py
│ ├── badges/
│ │ ├── BADGE_AUTOMATION_SETUP.md
│ │ ├── __init__.py
│ │ ├── badge_notification.py
│ │ └── badge_notification_core.py
│ ├── categories/
│ │ ├── __init__.py
│ │ ├── add_category.py
│ │ └── category_utils.py
│ ├── graphics/
│ │ ├── __init__.py
│ │ └── generate_logo_svgs.py
│ ├── ids/
│ │ ├── __init__.py
│ │ ├── generate_resource_id.py
│ │ └── resource_id.py
│ ├── maintenance/
│ │ ├── __init__.py
│ │ ├── check_repo_health.py
│ │ └── update_github_release_data.py
│ ├── py.typed
│ ├── readme/
│ │ ├── __init__.py
│ │ ├── generate_readme.py
│ │ ├── generators/
│ │ │ ├── __init__.py
│ │ │ ├── awesome.py
│ │ │ ├── base.py
│ │ │ ├── flat.py
│ │ │ ├── minimal.py
│ │ │ └── visual.py
│ │ ├── helpers/
│ │ │ ├── __init__.py
│ │ │ ├── generate_toc_assets.py
│ │ │ ├── readme_assets.py
│ │ │ ├── readme_config.py
│ │ │ ├── readme_paths.py
│ │ │ └── readme_utils.py
│ │ ├── markup/
│ │ │ ├── __init__.py
│ │ │ ├── awesome.py
│ │ │ ├── flat.py
│ │ │ ├── minimal.py
│ │ │ ├── shared.py
│ │ │ └── visual.py
│ │ └── svg_templates/
│ │ ├── __init__.py
│ │ ├── badges.py
│ │ ├── dividers.py
│ │ ├── headers.py
│ │ ├── py.typed
│ │ └── toc.py
│ ├── resources/
│ │ ├── __init__.py
│ │ ├── create_resource_pr.py
│ │ ├── detect_informal_submission.py
│ │ ├── download_resources.py
│ │ ├── parse_issue_form.py
│ │ ├── resource_utils.py
│ │ └── sort_resources.py
│ ├── testing/
│ │ ├── __init__.py
│ │ ├── test_regenerate_cycle.py
│ │ └── validate_toc_anchors.py
│ ├── ticker/
│ │ ├── __init__.py
│ │ ├── fetch_repo_ticker_data.py
│ │ └── generate_ticker_svg.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── git_utils.py
│ │ ├── github_utils.py
│ │ └── repo_root.py
│ └── validation/
│ ├── __init__.py
│ ├── validate_links.py
│ └── validate_single_resource.py
├── templates/
│ ├── README_AWESOME.template.md
│ ├── README_CLASSIC.template.md
│ ├── README_EXTRA.template.md
│ ├── announcements.yaml
│ ├── categories.yaml
│ ├── footer.template.md
│ └── resource-overrides.yaml
├── tests/
│ ├── conftest.py
│ ├── fixtures/
│ │ ├── expected_toc_anchors.txt
│ │ ├── github-html/
│ │ │ ├── awesome-root.html
│ │ │ ├── classic-non-root.html
│ │ │ ├── extra-non-root.html
│ │ │ └── flat-non-root.html
│ │ └── informal_issues/
│ │ ├── informal_recommendation_medium_confidence.json
│ │ ├── informal_structured_high_confidence.json
│ │ ├── proper_template_with_labels_a.json
│ │ └── proper_template_with_labels_b.json
│ ├── temp-verify-override-autolock.temp.py
│ ├── test_asset_path_resolution.py
│ ├── test_badge_notification_validation.py
│ ├── test_category_utils.py
│ ├── test_detect_informal_submission.py
│ ├── test_fetch_repo_ticker_data.py
│ ├── test_flat_list_generator.py
│ ├── test_generate_readme.py
│ ├── test_generate_ticker_svg.py
│ ├── test_git_utils.py
│ ├── test_github_utils.py
│ ├── test_readme_alternative_outputs.py
│ ├── test_readme_config_path.py
│ ├── test_readme_generators_minimal_visual.py
│ ├── test_resource_utils.py
│ ├── test_sort_resources.py
│ ├── test_style_selector_paths.py
│ ├── test_toc_anchor_validation.py
│ ├── test_validate_links.py
│ └── test_validate_single_resource.py
└── tools/
├── __init__.py
└── readme_tree/
├── README.md
├── __init__.py
├── config.yaml
└── update_readme_tree.py
SYMBOL INDEX (695 symbols across 66 files)
FILE: scripts/badges/badge_notification.py
function main (line 31) | def main():
FILE: scripts/badges/badge_notification_core.py
class RateLimiter (line 30) | class RateLimiter:
method __init__ (line 33) | def __init__(self):
method check_rate_limit (line 39) | def check_rate_limit(self, github_client: Github) -> dict:
method wait_if_needed (line 61) | def wait_if_needed(self, github_client: Github):
method handle_rate_limit_error (line 83) | def handle_rate_limit_error(self, error: RateLimitExceededException):
class BadgeNotificationCore (line 91) | class BadgeNotificationCore:
method __init__ (line 99) | def __init__(self, github_token: str):
method validate_input_safety (line 108) | def validate_input_safety(text: str, field_name: str = "input") -> tup...
method validate_github_url (line 181) | def validate_github_url(url: str) -> bool:
method create_issue_body (line 224) | def create_issue_body(self, resource_name: str, description: str = "")...
method can_create_label (line 286) | def can_create_label(self, repo) -> bool:
method create_notification_issue (line 312) | def create_notification_issue(
class ManualNotificationTracker (line 407) | class ManualNotificationTracker:
method __init__ (line 410) | def __init__(self, tracking_file: str = ".manual_notifications.json"):
method _load_history (line 414) | def _load_history(self) -> list:
method _save_history (line 424) | def _save_history(self):
method record_notification (line 432) | def record_notification(self, repo_url: str, issue_url: str, resource_...
method get_notification_count (line 443) | def get_notification_count(self, repo_url: str, time_window_hours: int...
method has_recent_notification (line 459) | def has_recent_notification(self, repo_url: str, time_window_hours: in...
FILE: scripts/categories/add_category.py
class CategoryAdder (line 24) | class CategoryAdder:
method __init__ (line 27) | def __init__(self, repo_root: Path):
method get_max_order (line 33) | def get_max_order(self) -> int:
method add_category_to_yaml (line 40) | def add_category_to_yaml(
method update_issue_template (line 121) | def update_issue_template(self, name: str) -> bool:
method generate_readme (line 187) | def generate_readme(self) -> bool:
method create_commit (line 212) | def create_commit(self, name: str) -> bool:
function interactive_mode (line 269) | def interactive_mode(adder: CategoryAdder) -> None:
function main (line 370) | def main():
FILE: scripts/categories/category_utils.py
class CategoryManager (line 28) | class CategoryManager:
method __new__ (line 34) | def __new__(cls):
method __init__ (line 40) | def __init__(self):
method _load_categories (line 45) | def _load_categories(self) -> None:
method get_all_categories (line 52) | def get_all_categories(self) -> list[str]:
method get_category_prefixes (line 58) | def get_category_prefixes(self) -> dict[str, str]:
method get_category_by_name (line 64) | def get_category_by_name(self, name: str) -> dict[str, Any] | None:
method get_category_by_id (line 73) | def get_category_by_id(self, cat_id: str) -> dict[str, Any] | None:
method get_all_subcategories (line 82) | def get_all_subcategories(self) -> list[dict[str, str]]:
method get_subcategories_for_category (line 102) | def get_subcategories_for_category(self, category_name: str) -> list[s...
method validate_category_subcategory (line 110) | def validate_category_subcategory(self, category: str, subcategory: st...
method get_categories_for_readme (line 124) | def get_categories_for_readme(self) -> list[dict[str, Any]]:
method get_toc_config (line 131) | def get_toc_config(self) -> dict[str, Any]:
FILE: scripts/graphics/generate_logo_svgs.py
function generate_logo_svg (line 36) | def generate_logo_svg(theme: str = "light") -> str:
function main (line 63) | def main():
FILE: scripts/ids/generate_resource_id.py
function main (line 18) | def main():
FILE: scripts/ids/resource_id.py
function generate_resource_id (line 18) | def generate_resource_id(display_name: str, primary_link: str, category:...
FILE: scripts/maintenance/check_repo_health.py
function get_repo_info (line 48) | def get_repo_info(owner, repo):
function is_outdated (line 87) | def is_outdated(last_updated_str, months_threshold):
function check_repos_health (line 104) | def check_repos_health(
function main (line 200) | def main():
FILE: scripts/maintenance/update_github_release_data.py
function format_commit_date (line 45) | def format_commit_date(commit_date: str | None) -> str | None:
function parse_github_repo (line 55) | def parse_github_repo(url: str | None) -> tuple[str | None, str | None]:
function github_get (line 67) | def github_get(url: str, params: dict | None = None) -> requests.Response:
function fetch_last_commit_date (line 78) | def fetch_last_commit_date(owner: str, repo: str) -> tuple[str | None, s...
function fetch_latest_release (line 99) | def fetch_latest_release(owner: str, repo: str) -> tuple[str | None, str...
function update_release_data (line 112) | def update_release_data(csv_path: str, max_rows: int | None = None, dry_...
function main (line 202) | def main() -> None:
FILE: scripts/readme/generate_readme.py
function build_root_generator (line 39) | def build_root_generator(
function main (line 63) | def main():
FILE: scripts/readme/generators/awesome.py
class AwesomeReadmeGenerator (line 25) | class AwesomeReadmeGenerator(ReadmeGenerator):
method template_filename (line 29) | def template_filename(self) -> str:
method output_filename (line 33) | def output_filename(self) -> str:
method style_id (line 37) | def style_id(self) -> str:
method format_resource_entry (line 40) | def format_resource_entry(self, row: dict, include_separator: bool = T...
method generate_toc (line 44) | def generate_toc(self) -> str:
method generate_weekly_section (line 48) | def generate_weekly_section(self) -> str:
method generate_section_content (line 52) | def generate_section_content(self, category: dict, section_index: int)...
method generate_repo_ticker (line 57) | def generate_repo_ticker(self) -> str:
method generate_banner_image (line 61) | def generate_banner_image(self, output_path: Path) -> str:
FILE: scripts/readme/generators/base.py
function load_template (line 27) | def load_template(template_path: str) -> str:
function load_overrides (line 33) | def load_overrides(template_dir: str) -> dict:
function apply_overrides (line 44) | def apply_overrides(row: dict, overrides: dict) -> dict:
function create_backup (line 68) | def create_backup(file_path: str, keep_latest: int = 1) -> str | None:
class ReadmeGenerator (line 94) | class ReadmeGenerator(ABC):
method __init__ (line 97) | def __init__(self, csv_path: str, template_dir: str, assets_dir: str, ...
method template_filename (line 111) | def template_filename(self) -> str:
method output_filename (line 117) | def output_filename(self) -> str:
method style_id (line 123) | def style_id(self) -> str:
method is_root_style (line 128) | def is_root_style(self) -> bool:
method resolved_output_path (line 133) | def resolved_output_path(self) -> str:
method get_style_selector (line 139) | def get_style_selector(self, output_path: Path) -> str:
method format_resource_entry (line 144) | def format_resource_entry(self, row: dict, include_separator: bool = T...
method generate_toc (line 149) | def generate_toc(self) -> str:
method generate_weekly_section (line 154) | def generate_weekly_section(self) -> str:
method generate_section_content (line 159) | def generate_section_content(self, category: dict, section_index: int)...
method generate_repo_ticker (line 163) | def generate_repo_ticker(self) -> str:
method generate_banner_image (line 167) | def generate_banner_image(self, output_path: Path) -> str:
method load_csv_data (line 172) | def load_csv_data(self) -> list[dict]:
method load_categories (line 183) | def load_categories(self) -> list[dict]:
method load_overrides (line 189) | def load_overrides(self) -> dict:
method load_announcements (line 193) | def load_announcements(self) -> str:
method load_footer (line 197) | def load_footer(self) -> str:
method build_general_anchor_map (line 207) | def build_general_anchor_map(self) -> dict:
method create_backup (line 211) | def create_backup(self, output_path: str) -> str | None:
method generate (line 215) | def generate(self, output_path: str | None = None) -> tuple[int, str |...
method alternative_output_path (line 274) | def alternative_output_path(self) -> str:
FILE: scripts/readme/generators/flat.py
class ParameterizedFlatListGenerator (line 55) | class ParameterizedFlatListGenerator(ReadmeGenerator):
method __init__ (line 60) | def __init__(
method template_filename (line 76) | def template_filename(self) -> str:
method output_filename (line 80) | def output_filename(self) -> str:
method style_id (line 87) | def style_id(self) -> str:
method format_resource_entry (line 90) | def format_resource_entry(self, row: dict, include_separator: bool = T...
method generate_toc (line 95) | def generate_toc(self) -> str:
method generate_weekly_section (line 99) | def generate_weekly_section(self) -> str:
method generate_section_content (line 103) | def generate_section_content(self, category: dict, section_index: int)...
method get_filtered_resources (line 108) | def get_filtered_resources(self) -> list[dict]:
method sort_resources (line 115) | def sort_resources(self, resources: list[dict]) -> list[dict]:
method generate_sort_navigation (line 159) | def generate_sort_navigation(self) -> str:
method generate_category_navigation (line 167) | def generate_category_navigation(self) -> str:
method generate_navigation (line 175) | def generate_navigation(self) -> str:
method generate_resources_table (line 184) | def generate_resources_table(self) -> str:
method _get_default_template (line 190) | def _get_default_template(self) -> str:
method generate (line 194) | def generate(self, output_path: str | None = None) -> tuple[int, str |...
FILE: scripts/readme/generators/minimal.py
class MinimalReadmeGenerator (line 18) | class MinimalReadmeGenerator(ReadmeGenerator):
method template_filename (line 22) | def template_filename(self) -> str:
method output_filename (line 26) | def output_filename(self) -> str:
method style_id (line 30) | def style_id(self) -> str:
method format_resource_entry (line 33) | def format_resource_entry(self, row: dict, include_separator: bool = T...
method generate_toc (line 37) | def generate_toc(self) -> str:
method generate_weekly_section (line 41) | def generate_weekly_section(self) -> str:
method generate_section_content (line 45) | def generate_section_content(self, category: dict, section_index: int)...
FILE: scripts/readme/generators/visual.py
class VisualReadmeGenerator (line 21) | class VisualReadmeGenerator(ReadmeGenerator):
method template_filename (line 25) | def template_filename(self) -> str:
method output_filename (line 29) | def output_filename(self) -> str:
method style_id (line 33) | def style_id(self) -> str:
method format_resource_entry (line 36) | def format_resource_entry(self, row: dict, include_separator: bool = T...
method generate_toc (line 44) | def generate_toc(self) -> str:
method generate_weekly_section (line 52) | def generate_weekly_section(self) -> str:
method generate_section_content (line 56) | def generate_section_content(self, category: dict, section_index: int)...
method generate_repo_ticker (line 66) | def generate_repo_ticker(self) -> str:
FILE: scripts/readme/helpers/generate_toc_assets.py
function main (line 18) | def main() -> None:
FILE: scripts/readme/helpers/readme_assets.py
function create_h2_svg_file (line 37) | def create_h2_svg_file(text: str, filename: str, assets_dir: str, icon: ...
function create_h3_svg_file (line 48) | def create_h3_svg_file(text: str, filename: str, assets_dir: str) -> str:
function ensure_category_header_exists (line 61) | def ensure_category_header_exists(
function ensure_section_divider_exists (line 87) | def ensure_section_divider_exists(variant: int, assets_dir: str) -> tupl...
function ensure_desc_box_exists (line 101) | def ensure_desc_box_exists(position: str, assets_dir: str) -> str:
function ensure_toc_row_exists (line 114) | def ensure_toc_row_exists(
function ensure_toc_sub_exists (line 133) | def ensure_toc_sub_exists(
function get_category_svg_filename (line 152) | def get_category_svg_filename(category_id: str) -> str:
function get_subcategory_svg_filename (line 168) | def get_subcategory_svg_filename(subcat_id: str) -> str:
function get_category_header_svg (line 191) | def get_category_header_svg(category_id: str) -> tuple[str, str]:
function get_section_divider_svg (line 227) | def get_section_divider_svg() -> tuple[str, str]:
function normalize_toc_svgs (line 235) | def normalize_toc_svgs(assets_dir: str) -> None:
function regenerate_main_toc_svgs (line 259) | def regenerate_main_toc_svgs(categories: list[dict], assets_dir: str) ->...
function regenerate_sub_toc_svgs (line 277) | def regenerate_sub_toc_svgs(categories: list[dict], assets_dir: str) -> ...
function regenerate_toc_header (line 296) | def regenerate_toc_header(assets_dir: str) -> None:
function save_resource_badge_svg (line 304) | def save_resource_badge_svg(display_name: str, author_name: str, assets_...
function generate_entry_separator_svg (line 321) | def generate_entry_separator_svg() -> str:
function ensure_separator_svg_exists (line 326) | def ensure_separator_svg_exists(assets_dir: str) -> str:
function generate_flat_badges (line 332) | def generate_flat_badges(assets_dir: str, sort_types: dict, categories: ...
FILE: scripts/readme/helpers/readme_config.py
function load_config (line 13) | def load_config() -> dict:
function get_root_style (line 57) | def get_root_style() -> str:
function get_style_selector_target (line 63) | def get_style_selector_target(style_id: str) -> str:
FILE: scripts/readme/helpers/readme_paths.py
function asset_path_token (line 19) | def asset_path_token(filename: str) -> str:
function ensure_generated_header (line 25) | def ensure_generated_header(content: str) -> str:
function resolve_asset_tokens (line 32) | def resolve_asset_tokens(content: str, output_path: Path, repo_root: Pat...
function resolve_relative_link (line 57) | def resolve_relative_link(from_path: Path, to_path: Path, repo_root: Pat...
FILE: scripts/readme/helpers/readme_utils.py
function extract_github_owner_repo (line 9) | def extract_github_owner_repo(url: str) -> tuple[str, str] | None:
function format_stars (line 26) | def format_stars(num: int) -> str:
function format_delta (line 35) | def format_delta(delta: int) -> str:
function get_anchor_suffix_for_icon (line 44) | def get_anchor_suffix_for_icon(icon: str | None) -> str:
function generate_toc_anchor (line 63) | def generate_toc_anchor(
function generate_subcategory_anchor (line 87) | def generate_subcategory_anchor(
function sanitize_filename_from_anchor (line 120) | def sanitize_filename_from_anchor(anchor: str) -> str:
function build_general_anchor_map (line 128) | def build_general_anchor_map(categories: list[dict], csv_data: list[dict...
function parse_resource_date (line 161) | def parse_resource_date(date_string: str | None) -> datetime | None:
function format_category_dir_name (line 182) | def format_category_dir_name(name: str, category_id: str | None = None) ...
FILE: scripts/readme/markup/awesome.py
function format_resource_entry (line 15) | def format_resource_entry(row: dict, include_separator: bool = True) -> ...
function generate_toc (line 52) | def generate_toc(categories: list[dict], csv_data: list[dict]) -> str:
function generate_weekly_section (line 96) | def generate_weekly_section(csv_data: list[dict]) -> str:
function generate_section_content (line 126) | def generate_section_content(category: dict, csv_data: list[dict]) -> str:
function generate_repo_ticker (line 164) | def generate_repo_ticker() -> str:
FILE: scripts/readme/markup/flat.py
function generate_shields_badges (line 9) | def generate_shields_badges(owner: str, repo: str) -> str:
function generate_sort_navigation (line 30) | def generate_sort_navigation(
function generate_category_navigation (line 49) | def generate_category_navigation(
function generate_navigation (line 68) | def generate_navigation(
function generate_resources_table (line 90) | def generate_resources_table(sorted_resources: list[dict], sort_type: st...
function get_default_template (line 186) | def get_default_template() -> str:
FILE: scripts/readme/markup/minimal.py
function format_resource_entry (line 15) | def format_resource_entry(row: dict, include_separator: bool = True) -> ...
function generate_toc (line 61) | def generate_toc(categories: list[dict], csv_data: list[dict]) -> str:
function generate_weekly_section (line 116) | def generate_weekly_section(csv_data: list[dict]) -> str:
function generate_section_content (line 147) | def generate_section_content(category: dict, csv_data: list[dict]) -> str:
FILE: scripts/readme/markup/shared.py
function generate_style_selector (line 14) | def generate_style_selector(
function load_announcements (line 46) | def load_announcements(template_dir: str) -> str:
FILE: scripts/readme/markup/visual.py
function format_resource_entry (line 29) | def format_resource_entry(
function generate_weekly_section (line 84) | def generate_weekly_section(
function generate_toc_from_categories (line 139) | def generate_toc_from_categories(
function generate_section_content (line 249) | def generate_section_content(
function generate_repo_ticker (line 402) | def generate_repo_ticker() -> str:
FILE: scripts/readme/svg_templates/badges.py
function generate_resource_badge_svg (line 4) | def generate_resource_badge_svg(display_name, author_name=""):
function render_flat_sort_badge_svg (line 83) | def render_flat_sort_badge_svg(display: str, color: str) -> str:
function render_flat_category_badge_svg (line 92) | def render_flat_category_badge_svg(display: str, color: str, width: int)...
FILE: scripts/readme/svg_templates/dividers.py
function generate_section_divider_light_svg (line 4) | def generate_section_divider_light_svg(variant=1):
function generate_desc_box_light_svg (line 148) | def generate_desc_box_light_svg(position="top"):
function generate_entry_separator_svg (line 275) | def generate_entry_separator_svg():
FILE: scripts/readme/svg_templates/headers.py
function render_h2_svg (line 4) | def render_h2_svg(text: str, icon: str = "") -> str:
function render_h3_svg (line 122) | def render_h3_svg(text: str) -> str:
function generate_category_header_light_svg (line 169) | def generate_category_header_light_svg(title, section_number="01"):
FILE: scripts/readme/svg_templates/toc.py
function generate_toc_row_svg (line 6) | def generate_toc_row_svg(directory_name, description):
function generate_toc_row_light_svg (line 65) | def generate_toc_row_light_svg(directory_name, description):
function generate_toc_header_light_svg (line 122) | def generate_toc_header_light_svg():
function generate_toc_sub_svg (line 158) | def generate_toc_sub_svg(directory_name, description):
function generate_toc_sub_light_svg (line 205) | def generate_toc_sub_light_svg(directory_name, description):
function _normalize_svg_root (line 240) | def _normalize_svg_root(tag: str, target_width: int, target_height: int)...
FILE: scripts/resources/create_resource_pr.py
function run_command (line 32) | def run_command(cmd: list[str], check: bool = True) -> subprocess.Comple...
function create_unique_branch_name (line 37) | def create_unique_branch_name(base_name: str) -> str:
function get_badge_filename (line 43) | def get_badge_filename(display_name: str) -> str:
function validate_generated_outputs (line 53) | def validate_generated_outputs(status_stdout: str, repo_root: str) -> None:
function write_step_outputs (line 91) | def write_step_outputs(outputs: dict[str, str]) -> None:
function main (line 111) | def main():
FILE: scripts/resources/detect_informal_submission.py
class Action (line 27) | class Action(Enum):
class DetectionResult (line 34) | class DetectionResult:
function count_template_field_matches (line 89) | def count_template_field_matches(text: str) -> int:
function calculate_confidence (line 95) | def calculate_confidence(title: str, body: str) -> DetectionResult:
function sanitize_output (line 144) | def sanitize_output(value: str) -> str:
function set_github_output (line 156) | def set_github_output(name: str, value: str) -> None:
function main (line 171) | def main() -> None:
FILE: scripts/resources/download_resources.py
function sanitize_filename (line 97) | def sanitize_filename(name: str) -> str:
function download_github_file (line 107) | def download_github_file(
function load_overrides (line 239) | def load_overrides() -> dict[str, Any]:
function apply_overrides (line 251) | def apply_overrides(row: dict[str, str], overrides: dict[str, Any]) -> d...
function process_resources (line 284) | def process_resources(
function main (line 467) | def main() -> None:
FILE: scripts/resources/parse_issue_form.py
function parse_issue_body (line 22) | def parse_issue_body(issue_body: str) -> dict[str, str]:
function validate_parsed_data (line 116) | def validate_parsed_data(data: dict[str, str]) -> tuple[bool, list[str],...
function check_for_duplicates (line 201) | def check_for_duplicates(data: dict[str, str]) -> list[str]:
function main (line 231) | def main():
FILE: scripts/resources/resource_utils.py
function append_to_csv (line 18) | def append_to_csv(data: dict[str, str]) -> bool:
function generate_pr_content (line 75) | def generate_pr_content(data: dict[str, str]) -> str:
FILE: scripts/resources/sort_resources.py
function sort_resources (line 19) | def sort_resources(csv_path: Path) -> None:
function main (line 117) | def main():
FILE: scripts/testing/test_regenerate_cycle.py
function run (line 22) | def run(cmd: list[str]) -> None:
function git_status (line 26) | def git_status() -> str:
function read_config_text (line 37) | def read_config_text() -> str:
function write_config_text (line 41) | def write_config_text(text: str) -> None:
function set_root_style (line 45) | def set_root_style(text: str, root_style: str) -> str:
function get_style_order (line 51) | def get_style_order(text: str) -> list[str]:
function set_style_order (line 65) | def set_style_order(text: str, style_order: list[str]) -> str:
function read_readme (line 72) | def read_readme() -> str:
function selector_order_from_content (line 76) | def selector_order_from_content(content: str) -> list[str]:
function main (line 87) | def main() -> int:
FILE: scripts/testing/validate_toc_anchors.py
function extract_github_anchor_ids (line 66) | def extract_github_anchor_ids(html_content: str) -> set[str]:
function extract_toc_anchors_from_readme (line 76) | def extract_toc_anchors_from_readme(readme_content: str) -> set[str]:
function normalize_anchor (line 97) | def normalize_anchor(anchor: str) -> str:
function compare_anchors (line 102) | def compare_anchors(
function validate (line 125) | def validate(
function generate_expected_anchors (line 194) | def generate_expected_anchors(
function main (line 212) | def main() -> int:
FILE: scripts/ticker/fetch_repo_ticker_data.py
function load_previous_data (line 23) | def load_previous_data(csv_path: Path) -> dict[str, dict[str, int]]:
function fetch_repos (line 50) | def fetch_repos(token: str) -> list[dict[str, Any]]:
function calculate_deltas (line 106) | def calculate_deltas(
function save_to_csv (line 152) | def save_to_csv(repos: list[dict[str, Any]], output_path: Path) -> None:
function main (line 183) | def main() -> None:
FILE: scripts/ticker/generate_ticker_svg.py
function fetch_recent_star_delta (line 26) | def fetch_recent_star_delta(
function apply_recent_star_deltas (line 87) | def apply_recent_star_deltas(repos: list[dict[str, Any]]) -> None:
function format_number (line 100) | def format_number(num: int) -> str:
function format_delta (line 118) | def format_delta(delta: int) -> str:
function truncate_repo_name (line 136) | def truncate_repo_name(name: str, max_length: int = 20) -> str:
function get_delta_color (line 152) | def get_delta_color(delta: int, colors: dict[str, str]) -> str:
function load_repos (line 171) | def load_repos(csv_path: Path) -> list[dict[str, Any]]:
function generate_repo_group (line 199) | def generate_repo_group(
function generate_ticker_svg (line 271) | def generate_ticker_svg(repos: list[dict[str, Any]], theme: str = "dark"...
function generate_awesome_repo_group (line 480) | def generate_awesome_repo_group(repo: dict[str, Any], x_offset: int, fli...
function generate_awesome_ticker_svg (line 564) | def generate_awesome_ticker_svg(repos: list[dict[str, Any]]) -> str:
function main (line 678) | def main() -> None:
FILE: scripts/utils/git_utils.py
class GitUtils (line 9) | class GitUtils:
method __init__ (line 12) | def __init__(self, logger: logging.Logger | None = None):
method check_command_exists (line 22) | def check_command_exists(self, command: str) -> bool:
method run_command (line 40) | def run_command(self, cmd: list[str], error_msg: str = "") -> bool:
method is_git_installed (line 63) | def is_git_installed(self) -> bool:
method is_gh_installed (line 67) | def is_gh_installed(self) -> bool:
method is_gh_authenticated (line 71) | def is_gh_authenticated(self) -> bool:
method get_github_username (line 86) | def get_github_username(self) -> str | None:
method get_git_config (line 106) | def get_git_config(self, key: str) -> str | None:
method check_remote_exists (line 125) | def check_remote_exists(self, remote_name: str = "origin") -> bool:
method get_remote_url (line 140) | def get_remote_url(self, remote_name: str = "origin") -> str | None:
method get_remote_type (line 161) | def get_remote_type(self, remote_name: str = "origin") -> str | None:
method is_working_directory_clean (line 183) | def is_working_directory_clean(self) -> bool:
method get_uncommitted_files (line 198) | def get_uncommitted_files(self) -> str | None:
method stage_file (line 213) | def stage_file(self, filepath: Path, cwd: Path | None = None) -> bool:
method check_file_modified (line 239) | def check_file_modified(self, filepath: Path, cwd: Path | None = None)...
FILE: scripts/utils/github_utils.py
function _normalize_repo_name (line 17) | def _normalize_repo_name(repo: str) -> str:
function get_github_client (line 23) | def get_github_client(
function github_request_json (line 40) | def github_request_json(
function parse_github_url (line 70) | def parse_github_url(url: str) -> tuple[str, bool, str | None, str | None]:
function parse_github_resource_url (line 132) | def parse_github_resource_url(url: str) -> dict[str, str] | None:
FILE: scripts/utils/repo_root.py
function find_repo_root (line 8) | def find_repo_root(start: Path) -> Path:
FILE: scripts/validation/validate_links.py
function github_request_json_paced (line 67) | def github_request_json_paced(
function load_overrides (line 80) | def load_overrides():
function apply_overrides (line 93) | def apply_overrides(row, overrides):
function parse_last_modified_date (line 138) | def parse_last_modified_date(value: str | None) -> datetime | None:
function is_stale (line 163) | def is_stale(last_modified: datetime | None, stale_days: int = STALE_DAY...
function ensure_stale_column (line 175) | def ensure_stale_column(
function get_github_license (line 189) | def get_github_license(owner: str, repo: str) -> str:
function get_committer_date_from_response (line 205) | def get_committer_date_from_response(data: object) -> str | None:
function format_commit_date (line 238) | def format_commit_date(commit_date: str) -> str:
function _header_int (line 246) | def _header_int(headers: Mapping[str, object], key: str) -> int:
function get_github_last_modified (line 264) | def get_github_last_modified(owner: str, repo: str, path: str | None = N...
function get_github_commit_dates (line 285) | def get_github_commit_dates(owner: str, repo: str) -> tuple[str | None, ...
function get_github_commit_dates_from_url (line 336) | def get_github_commit_dates_from_url(url: str) -> tuple[str | None, str ...
function get_github_latest_release (line 352) | def get_github_latest_release(owner: str, repo: str) -> tuple[str | None...
function get_github_latest_tag (line 378) | def get_github_latest_tag(owner: str, repo: str) -> tuple[str | None, st...
function get_npm_latest_release (line 413) | def get_npm_latest_release(package_name: str = "") -> tuple[str | None, ...
function get_pypi_latest_release (line 445) | def get_pypi_latest_release(package_name: str = "") -> tuple[str | None,...
function get_crates_latest_release (line 477) | def get_crates_latest_release(crate_name: str) -> tuple[str | None, str ...
function get_homebrew_latest_release (line 506) | def get_homebrew_latest_release(formula_name: str) -> tuple[str | None, ...
function get_github_readme_version (line 536) | def get_github_readme_version(owner: str, repo: str) -> tuple[str | None...
function detect_package_info (line 578) | def detect_package_info(url: str, display_name: str = "") -> tuple[str |...
function get_latest_release_info (line 638) | def get_latest_release_info(
function validate_url (line 662) | def validate_url(
function validate_links (line 746) | def validate_links(csv_file, max_links=None, ignore_overrides=False, ver...
function main (line 968) | def main():
FILE: scripts/validation/validate_single_resource.py
function validate_single_resource (line 23) | def validate_single_resource(
function validate_resource_from_dict (line 101) | def validate_resource_from_dict(
function main (line 133) | def main():
FILE: tests/conftest.py
class DummyReset (line 12) | class DummyReset:
method timestamp (line 16) | def timestamp() -> int:
class DummyCore (line 20) | class DummyCore:
method __init__ (line 23) | def __init__(self) -> None:
class DummyRateLimit (line 29) | class DummyRateLimit:
method __init__ (line 32) | def __init__(self) -> None:
class DummyIssue (line 36) | class DummyIssue:
class DummyRepo (line 42) | class DummyRepo:
method __init__ (line 45) | def __init__(self, full_name: str) -> None:
method get_label (line 48) | def get_label(self, name: str):
method create_label (line 51) | def create_label(self, name: str, color: str, description: str):
method get_issues (line 54) | def get_issues(self, **kwargs):
method create_issue (line 57) | def create_issue(self, title: str, body: str, labels: list[str]):
class DummyUser (line 61) | class DummyUser:
class DummyGithub (line 67) | class DummyGithub:
method __init__ (line 70) | def __init__(self, *args, **kwargs) -> None:
method get_rate_limit (line 73) | def get_rate_limit(self):
method get_repo (line 76) | def get_repo(self, full_name: str):
method get_user (line 79) | def get_user(self):
function find_repo_root (line 83) | def find_repo_root(start: Path) -> Path:
function repo_root (line 93) | def repo_root() -> Path:
function github_stub (line 99) | def github_stub(monkeypatch: pytest.MonkeyPatch):
FILE: tests/temp-verify-override-autolock.temp.py
function test_auto_locking (line 18) | def test_auto_locking():
function test_skip_validation_precedence (line 54) | def test_skip_validation_precedence():
function test_legacy_locked_flags_ignored (line 72) | def test_legacy_locked_flags_ignored():
function test_notes_field_ignored (line 95) | def test_notes_field_ignored():
FILE: tests/test_asset_path_resolution.py
function test_resolve_asset_tokens_root (line 13) | def test_resolve_asset_tokens_root(tmp_path: Path) -> None:
function test_resolve_asset_tokens_alternative (line 19) | def test_resolve_asset_tokens_alternative(tmp_path: Path) -> None:
function test_resolve_asset_tokens_asset_scheme (line 27) | def test_resolve_asset_tokens_asset_scheme(tmp_path: Path) -> None:
function test_ensure_generated_header (line 33) | def test_ensure_generated_header() -> None:
FILE: tests/test_badge_notification_validation.py
function test_dangerous_input_rejection (line 18) | def test_dangerous_input_rejection() -> None:
function test_safe_input_acceptance (line 45) | def test_safe_input_acceptance() -> None:
function test_length_limit_enforcement (line 69) | def test_length_limit_enforcement() -> None:
function test_case_insensitive_detection (line 87) | def test_case_insensitive_detection() -> None:
function test_issue_creation_with_validation (line 106) | def test_issue_creation_with_validation() -> None:
function test_notification_creation_flow (line 139) | def test_notification_creation_flow() -> None:
function run_all_tests (line 159) | def run_all_tests() -> bool:
FILE: tests/test_category_utils.py
function create_test_categories (line 19) | def create_test_categories() -> dict[str, Any]:
function test_get_all_categories (line 65) | def test_get_all_categories() -> None:
function test_get_category_prefixes (line 80) | def test_get_category_prefixes() -> None:
function test_get_category_by_name (line 94) | def test_get_category_by_name() -> None:
function test_get_category_by_id (line 112) | def test_get_category_by_id() -> None:
function test_get_all_subcategories (line 129) | def test_get_all_subcategories() -> None:
function test_get_subcategories_for_category (line 158) | def test_get_subcategories_for_category() -> None:
function test_validate_category_subcategory (line 178) | def test_validate_category_subcategory() -> None:
function test_get_categories_for_readme (line 197) | def test_get_categories_for_readme() -> None:
function test_get_toc_config (line 213) | def test_get_toc_config() -> None:
function test_singleton_behavior (line 228) | def test_singleton_behavior() -> None:
function test_loading_from_file (line 238) | def test_loading_from_file() -> None:
function test_robustness_with_missing_fields (line 275) | def test_robustness_with_missing_fields() -> None:
FILE: tests/test_detect_informal_submission.py
class TestCountTemplateFieldMatches (line 13) | class TestCountTemplateFieldMatches:
method test_no_matches (line 16) | def test_no_matches(self) -> None:
method test_single_match (line 21) | def test_single_match(self) -> None:
method test_multiple_matches (line 26) | def test_multiple_matches(self) -> None:
method test_case_insensitive (line 36) | def test_case_insensitive(self) -> None:
class TestCalculateConfidence (line 42) | class TestCalculateConfidence:
method test_empty_input (line 45) | def test_empty_input(self) -> None:
method test_high_confidence_template_fields (line 51) | def test_high_confidence_template_fields(self) -> None:
method test_high_confidence_strong_signals (line 65) | def test_high_confidence_strong_signals(self) -> None:
method test_medium_confidence_partial_signals (line 74) | def test_medium_confidence_partial_signals(self) -> None:
method test_low_confidence_bug_report (line 84) | def test_low_confidence_bug_report(self) -> None:
method test_low_confidence_question (line 93) | def test_low_confidence_question(self) -> None:
method test_negative_signals_reduce_score (line 102) | def test_negative_signals_reduce_score(self) -> None:
method test_feature_request_no_action (line 112) | def test_feature_request_no_action(self) -> None:
method test_combined_signals (line 120) | def test_combined_signals(self) -> None:
method test_score_clamped_to_one (line 133) | def test_score_clamped_to_one(self) -> None:
method test_score_clamped_to_zero (line 150) | def test_score_clamped_to_zero(self) -> None:
class TestMatchedSignals (line 160) | class TestMatchedSignals:
method test_strong_signals_labeled (line 163) | def test_strong_signals_labeled(self) -> None:
method test_medium_signals_labeled (line 169) | def test_medium_signals_labeled(self) -> None:
method test_negative_signals_labeled (line 175) | def test_negative_signals_labeled(self) -> None:
method test_template_fields_labeled (line 181) | def test_template_fields_labeled(self) -> None:
class TestEdgeCases (line 188) | class TestEdgeCases:
method test_url_with_bug_language (line 191) | def test_url_with_bug_language(self) -> None:
method test_partial_template_fields (line 200) | def test_partial_template_fields(self) -> None:
method test_license_mention_alone (line 206) | def test_license_mention_alone(self) -> None:
method test_category_mention_in_question (line 211) | def test_category_mention_in_question(self) -> None:
class TestSanitizeOutput (line 220) | class TestSanitizeOutput:
method test_removes_newlines (line 223) | def test_removes_newlines(self) -> None:
method test_removes_carriage_returns (line 229) | def test_removes_carriage_returns(self) -> None:
method test_removes_null_bytes (line 235) | def test_removes_null_bytes(self) -> None:
method test_preserves_normal_text (line 241) | def test_preserves_normal_text(self) -> None:
method test_handles_empty_string (line 246) | def test_handles_empty_string(self) -> None:
method test_injection_attempt_via_newline (line 250) | def test_injection_attempt_via_newline(self) -> None:
FILE: tests/test_fetch_repo_ticker_data.py
class DummyResponse (line 18) | class DummyResponse:
method __init__ (line 21) | def __init__(self, payload: dict, status_code: int = 200) -> None:
method raise_for_status (line 25) | def raise_for_status(self) -> None:
method json (line 29) | def json(self) -> dict:
function test_load_previous_data_missing_file (line 33) | def test_load_previous_data_missing_file(tmp_path: Path) -> None:
function test_load_previous_data_reads_csv (line 37) | def test_load_previous_data_reads_csv(tmp_path: Path) -> None:
function test_calculate_deltas_with_previous (line 48) | def test_calculate_deltas_with_previous() -> None:
function test_calculate_deltas_new_repo_with_prior_snapshot (line 57) | def test_calculate_deltas_new_repo_with_prior_snapshot() -> None:
function test_calculate_deltas_no_previous_baseline (line 66) | def test_calculate_deltas_no_previous_baseline() -> None:
function test_save_to_csv_writes_output (line 74) | def test_save_to_csv_writes_output(tmp_path: Path) -> None:
function test_fetch_repos_maps_fields (line 97) | def test_fetch_repos_maps_fields(monkeypatch: pytest.MonkeyPatch) -> None:
function test_fetch_repos_request_error_exits (line 143) | def test_fetch_repos_request_error_exits(monkeypatch: pytest.MonkeyPatch...
function test_main_missing_token_exits (line 152) | def test_main_missing_token_exits(monkeypatch: pytest.MonkeyPatch) -> None:
FILE: tests/test_flat_list_generator.py
class FlatListEnv (line 25) | class FlatListEnv:
function write_csv (line 80) | def write_csv(path: Path, rows: list[dict[str, str]]) -> None:
function create_env (line 92) | def create_env(tmp_path: Path, rows: list[dict[str, str]]) -> FlatListEnv:
function make_generator (line 109) | def make_generator(env: FlatListEnv, category_slug: str = "all", sort_ty...
function flat_list_env (line 122) | def flat_list_env(tmp_path: Path) -> FlatListEnv:
class TestFlatCategories (line 127) | class TestFlatCategories:
method test_all_category_exists (line 130) | def test_all_category_exists(self) -> None:
method test_all_categories_have_required_fields (line 137) | def test_all_categories_have_required_fields(self) -> None:
method test_expected_categories_exist (line 146) | def test_expected_categories_exist(self) -> None:
method test_category_count (line 164) | def test_category_count(self) -> None:
class TestFlatSortTypes (line 169) | class TestFlatSortTypes:
method test_all_sort_types_exist (line 172) | def test_all_sort_types_exist(self) -> None:
method test_sort_types_have_required_fields (line 178) | def test_sort_types_have_required_fields(self) -> None:
method test_sort_type_count (line 188) | def test_sort_type_count(self) -> None:
class TestParameterizedFlatListGenerator (line 193) | class TestParameterizedFlatListGenerator:
method test_output_filename_format (line 196) | def test_output_filename_format(self, flat_list_env: FlatListEnv) -> N...
method test_output_filename_with_different_params (line 209) | def test_output_filename_with_different_params(
method test_get_filtered_resources_all (line 216) | def test_get_filtered_resources_all(self, flat_list_env: FlatListEnv) ...
method test_get_filtered_resources_specific_category (line 223) | def test_get_filtered_resources_specific_category(self, flat_list_env:...
method test_get_filtered_resources_hooks_category (line 231) | def test_get_filtered_resources_hooks_category(self, flat_list_env: Fl...
method test_sort_resources_alphabetical (line 239) | def test_sort_resources_alphabetical(self, flat_list_env: FlatListEnv)...
method test_sort_resources_by_updated (line 250) | def test_sort_resources_by_updated(self, flat_list_env: FlatListEnv) -...
method test_sort_resources_by_created (line 261) | def test_sort_resources_by_created(self, flat_list_env: FlatListEnv) -...
method test_generate_sort_navigation (line 272) | def test_generate_sort_navigation(self, flat_list_env: FlatListEnv) ->...
method test_generate_category_navigation (line 294) | def test_generate_category_navigation(self, flat_list_env: FlatListEnv...
method test_generate_resources_table_standard (line 315) | def test_generate_resources_table_standard(self, flat_list_env: FlatLi...
method test_generate_resources_table_empty_category (line 340) | def test_generate_resources_table_empty_category(self, flat_list_env: ...
method test_default_template_has_correct_paths (line 348) | def test_default_template_has_correct_paths(self, flat_list_env: FlatL...
method test_releases_disclaimer_in_template (line 356) | def test_releases_disclaimer_in_template(self, flat_list_env: FlatList...
class TestGenerateFlatBadges (line 365) | class TestGenerateFlatBadges:
method test_creates_sort_badges (line 368) | def test_creates_sort_badges(self, tmp_path: Path) -> None:
method test_creates_category_badges (line 376) | def test_creates_category_badges(self, tmp_path: Path) -> None:
method test_badge_is_valid_svg (line 384) | def test_badge_is_valid_svg(self, tmp_path: Path) -> None:
method test_sort_badge_contains_display_name (line 395) | def test_sort_badge_contains_display_name(self, tmp_path: Path) -> None:
method test_category_badge_contains_display_name (line 405) | def test_category_badge_contains_display_name(self, tmp_path: Path) ->...
class TestReleasesSort (line 416) | class TestReleasesSort:
method test_releases_filter_recent (line 419) | def test_releases_filter_recent(self, tmp_path: Path) -> None:
method test_releases_sort_order (line 464) | def test_releases_sort_order(self, tmp_path: Path) -> None:
method test_releases_table_format (line 524) | def test_releases_table_format(self, tmp_path: Path) -> None:
class TestCombinationGeneration (line 568) | class TestCombinationGeneration:
method test_all_combinations_instantiate (line 573) | def test_all_combinations_instantiate(
method test_total_combinations (line 581) | def test_total_combinations(self) -> None:
FILE: tests/test_generate_readme.py
function write_yaml (line 28) | def write_yaml(path: os.PathLike[str], data: Any) -> None:
class TestParseResourceDate (line 34) | class TestParseResourceDate:
method test_parse_date_only_format (line 37) | def test_parse_date_only_format(self) -> None:
method test_parse_date_with_timestamp_format (line 43) | def test_parse_date_with_timestamp_format(self) -> None:
method test_parse_with_whitespace (line 49) | def test_parse_with_whitespace(self) -> None:
method test_parse_empty_string (line 55) | def test_parse_empty_string(self) -> None:
method test_parse_none (line 59) | def test_parse_none(self) -> None:
method test_parse_invalid_format (line 74) | def test_parse_invalid_format(self, invalid_date: str) -> None:
method test_parse_various_timestamps (line 87) | def test_parse_various_timestamps(self, date_string: str, expected: da...
method test_date_comparison (line 91) | def test_date_comparison(self) -> None:
class TestGetAnchorSuffix (line 103) | class TestGetAnchorSuffix:
method test_no_icon (line 107) | def test_no_icon(self, icon: str | None) -> None:
method test_simple_emoji (line 112) | def test_simple_emoji(self, icon: str) -> None:
method test_emoji_with_variation_selector (line 116) | def test_emoji_with_variation_selector(self) -> None:
class TestGenerateTOC (line 122) | class TestGenerateTOC:
method test_empty_categories (line 125) | def test_empty_categories(self) -> None:
method test_simple_categories (line 135) | def test_simple_categories(self) -> None:
method test_categories_with_subcategories (line 152) | def test_categories_with_subcategories(self) -> None:
method test_special_characters_in_names (line 183) | def test_special_characters_in_names(self) -> None:
method test_mixed_categories (line 198) | def test_mixed_categories(self) -> None:
class TestLoadAnnouncements (line 244) | class TestLoadAnnouncements:
method test_empty_announcements (line 247) | def test_empty_announcements(self, tmp_path) -> None:
method test_simple_string_announcement (line 255) | def test_simple_string_announcement(self, tmp_path) -> None:
method test_collapsible_announcement_items (line 283) | def test_collapsible_announcement_items(self, tmp_path) -> None:
method test_multi_line_text_in_announcements (line 317) | def test_multi_line_text_in_announcements(self, tmp_path) -> None:
method test_mixed_announcement_types (line 347) | def test_mixed_announcement_types(self, tmp_path) -> None:
method test_multiple_date_groups (line 379) | def test_multiple_date_groups(self, tmp_path) -> None:
method test_markdown_in_announcements (line 410) | def test_markdown_in_announcements(self, tmp_path) -> None:
method test_nonexistent_directory (line 437) | def test_nonexistent_directory(self, tmp_path) -> None:
class TestGenerateSectionContent (line 446) | class TestGenerateSectionContent:
method test_simple_category_with_resources (line 449) | def test_simple_category_with_resources(self) -> None:
method test_category_with_description (line 479) | def test_category_with_description(self) -> None:
method test_category_with_subcategories (line 493) | def test_category_with_subcategories(self) -> None:
method test_category_with_main_and_sub_resources (line 549) | def test_category_with_main_and_sub_resources(self) -> None:
method test_category_without_icon (line 587) | def test_category_without_icon(self) -> None:
method test_empty_subcategory_not_rendered (line 596) | def test_empty_subcategory_not_rendered(self) -> None:
class TestBackToTopButtons (line 632) | class TestBackToTopButtons:
method test_weekly_section_has_back_to_top (line 635) | def test_weekly_section_has_back_to_top(self) -> None:
method test_category_without_subcategories_has_html_anchor (line 643) | def test_category_without_subcategories_has_html_anchor(self) -> None:
method test_category_without_icon_has_back_to_top (line 657) | def test_category_without_icon_has_back_to_top(self) -> None:
method test_category_with_subcategories_has_markdown_link (line 666) | def test_category_with_subcategories_has_markdown_link(self) -> None:
method test_subcategory_has_html_anchor (line 682) | def test_subcategory_has_html_anchor(self) -> None:
method test_multiple_subcategories_all_have_anchors (line 709) | def test_multiple_subcategories_all_have_anchors(self) -> None:
method test_back_to_top_preserves_existing_structure (line 749) | def test_back_to_top_preserves_existing_structure(self) -> None:
class TestFormatResourceEntryGitHubStats (line 790) | class TestFormatResourceEntryGitHubStats:
method test_github_resource_with_stats (line 793) | def test_github_resource_with_stats(self) -> None:
method test_non_github_resource_no_stats (line 814) | def test_non_github_resource_no_stats(self) -> None:
method test_github_blob_url_with_stats (line 831) | def test_github_blob_url_with_stats(self) -> None:
method test_github_tree_url_with_stats (line 848) | def test_github_tree_url_with_stats(self) -> None:
method test_empty_primary_link_no_stats (line 865) | def test_empty_primary_link_no_stats(self) -> None:
FILE: tests/test_generate_ticker_svg.py
function test_truncate_repo_name_short (line 13) | def test_truncate_repo_name_short():
function test_truncate_repo_name_exactly_20 (line 20) | def test_truncate_repo_name_exactly_20():
function test_truncate_repo_name_long (line 27) | def test_truncate_repo_name_long():
function test_truncate_repo_name_custom_length (line 35) | def test_truncate_repo_name_custom_length():
function test_truncate_repo_name_preserves_beginning (line 43) | def test_truncate_repo_name_preserves_beginning():
function test_truncate_repo_name_edge_cases (line 51) | def test_truncate_repo_name_edge_cases():
FILE: tests/test_git_utils.py
function test_check_command_exists_true (line 19) | def test_check_command_exists_true(monkeypatch: pytest.MonkeyPatch) -> N...
function test_check_command_exists_false_on_missing (line 27) | def test_check_command_exists_false_on_missing(monkeypatch: pytest.Monke...
function test_run_command_failure_logs_error (line 35) | def test_run_command_failure_logs_error(
function test_is_gh_authenticated (line 48) | def test_is_gh_authenticated(monkeypatch: pytest.MonkeyPatch) -> None:
function test_is_gh_authenticated_false_on_empty_stdout (line 56) | def test_is_gh_authenticated_false_on_empty_stdout(monkeypatch: pytest.M...
function test_get_github_username_success (line 64) | def test_get_github_username_success(monkeypatch: pytest.MonkeyPatch) ->...
function test_get_github_username_failure (line 72) | def test_get_github_username_failure(monkeypatch: pytest.MonkeyPatch) ->...
function test_get_git_config_returns_value (line 80) | def test_get_git_config_returns_value(monkeypatch: pytest.MonkeyPatch) -...
function test_get_remote_type_variants (line 88) | def test_get_remote_type_variants(monkeypatch: pytest.MonkeyPatch) -> None:
function test_is_working_directory_clean (line 100) | def test_is_working_directory_clean(monkeypatch: pytest.MonkeyPatch) -> ...
function test_is_working_directory_dirty (line 108) | def test_is_working_directory_dirty(monkeypatch: pytest.MonkeyPatch) -> ...
function test_get_uncommitted_files (line 116) | def test_get_uncommitted_files(monkeypatch: pytest.MonkeyPatch) -> None:
function test_stage_file_success (line 124) | def test_stage_file_success(monkeypatch: pytest.MonkeyPatch, tmp_path: P...
function test_stage_file_failure (line 132) | def test_stage_file_failure(monkeypatch: pytest.MonkeyPatch, tmp_path: P...
function test_check_file_modified (line 140) | def test_check_file_modified(monkeypatch: pytest.MonkeyPatch, tmp_path: ...
function test_check_file_modified_staged (line 152) | def test_check_file_modified_staged(monkeypatch: pytest.MonkeyPatch, tmp...
function test_check_file_modified_clean (line 164) | def test_check_file_modified_clean(monkeypatch: pytest.MonkeyPatch, tmp_...
FILE: tests/test_github_utils.py
function test_parse_github_url_blob_with_slash_branch (line 14) | def test_parse_github_url_blob_with_slash_branch() -> None:
function test_parse_github_url_tree_docs_path (line 26) | def test_parse_github_url_tree_docs_path() -> None:
function test_parse_github_url_repo_root (line 35) | def test_parse_github_url_repo_root() -> None:
function test_parse_github_url_non_github (line 44) | def test_parse_github_url_non_github() -> None:
function test_parse_github_resource_url_file_and_raw (line 53) | def test_parse_github_resource_url_file_and_raw() -> None:
function test_parse_github_resource_url_dir_repo_gist (line 75) | def test_parse_github_resource_url_dir_repo_gist() -> None:
function test_parse_github_resource_url_normalizes_repo_name (line 95) | def test_parse_github_resource_url_normalizes_repo_name() -> None:
function test_parse_github_resource_url_non_github (line 101) | def test_parse_github_resource_url_non_github() -> None:
FILE: tests/test_readme_alternative_outputs.py
class DummyReadmeGenerator (line 19) | class DummyReadmeGenerator(ReadmeGenerator):
method __init__ (line 22) | def __init__(
method template_filename (line 38) | def template_filename(self) -> str:
method output_filename (line 42) | def output_filename(self) -> str:
method style_id (line 46) | def style_id(self) -> str:
method load_csv_data (line 49) | def load_csv_data(self) -> list[dict]:
method load_categories (line 52) | def load_categories(self) -> list[dict]:
method load_overrides (line 55) | def load_overrides(self) -> dict:
method load_announcements (line 58) | def load_announcements(self) -> str:
method load_footer (line 61) | def load_footer(self) -> str:
method build_general_anchor_map (line 64) | def build_general_anchor_map(self) -> dict:
method format_resource_entry (line 67) | def format_resource_entry(self, row: dict, include_separator: bool = T...
method generate_toc (line 71) | def generate_toc(self) -> str:
method generate_weekly_section (line 74) | def generate_weekly_section(self) -> str:
method generate_section_content (line 77) | def generate_section_content(self, category: dict, section_index: int)...
function _write_template (line 82) | def _write_template(template_dir: Path, filename: str) -> None:
function _write_pyproject (line 90) | def _write_pyproject(repo_root: Path) -> None:
function _configure_styles (line 94) | def _configure_styles(monkeypatch: pytest.MonkeyPatch, root_style: str) ...
function test_root_classic_creates_alternative_copy (line 117) | def test_root_classic_creates_alternative_copy(tmp_path: Path, monkeypat...
function test_root_extra_creates_alternative_copy (line 152) | def test_root_extra_creates_alternative_copy(tmp_path: Path, monkeypatch...
function test_visual_weekly_section_uses_asset_prefix (line 187) | def test_visual_weekly_section_uses_asset_prefix(tmp_path: Path) -> None:
FILE: tests/test_readme_config_path.py
function _load_root_style (line 16) | def _load_root_style(repo_root: Path) -> str:
function test_load_config_uses_repo_root (line 23) | def test_load_config_uses_repo_root() -> None:
FILE: tests/test_readme_generators_minimal_visual.py
function test_minimal_generator_properties (line 19) | def test_minimal_generator_properties() -> None:
function test_minimal_generator_delegates (line 26) | def test_minimal_generator_delegates(monkeypatch: pytest.MonkeyPatch) ->...
function test_visual_generator_properties (line 67) | def test_visual_generator_properties() -> None:
function test_visual_generator_delegates (line 74) | def test_visual_generator_delegates(monkeypatch: pytest.MonkeyPatch) -> ...
FILE: tests/test_resource_utils.py
function temp_csv (line 26) | def temp_csv() -> Generator[Path, None, None]:
function sample_resource_data (line 61) | def sample_resource_data() -> dict[str, str]:
function set_csv_path (line 77) | def set_csv_path(monkeypatch: pytest.MonkeyPatch, path: Path | str) -> N...
function test_append_to_csv_adds_all_columns (line 82) | def test_append_to_csv_adds_all_columns(
function test_append_to_csv_default_values (line 122) | def test_append_to_csv_default_values(
function test_append_to_csv_with_removed_from_origin_true (line 149) | def test_append_to_csv_with_removed_from_origin_true(
function test_append_to_csv_date_fields (line 170) | def test_append_to_csv_date_fields(
function test_append_to_csv_handles_csv_error (line 207) | def test_append_to_csv_handles_csv_error(
function test_append_to_csv_preserves_existing_data (line 219) | def test_append_to_csv_preserves_existing_data(
FILE: tests/test_sort_resources.py
function temp_csv (line 28) | def temp_csv() -> Generator[Path, None, None]:
function sample_csv_data (line 37) | def sample_csv_data() -> list[dict[str, str]]:
function write_csv (line 93) | def write_csv(path: Path, data: list[dict[str, str]]) -> None:
function read_csv (line 105) | def read_csv(path: Path) -> list[dict[str, str]]:
function set_category_order (line 111) | def set_category_order(monkeypatch: pytest.MonkeyPatch, categories: list...
function set_category_order_error (line 119) | def set_category_order_error(
class TestSortResources (line 133) | class TestSortResources:
method test_sort_by_category_order (line 136) | def test_sort_by_category_order(
method test_sort_by_subcategory (line 162) | def test_sort_by_subcategory(
method test_sort_by_display_name (line 183) | def test_sort_by_display_name(self, temp_csv: Path, monkeypatch: pytes...
method test_empty_subcategory_sorts_last (line 227) | def test_empty_subcategory_sorts_last(
method test_unknown_category_sorts_last (line 264) | def test_unknown_category_sorts_last(
method test_subcategory_yaml_order_sort (line 301) | def test_subcategory_yaml_order_sort(
method test_case_insensitive_display_name_sort (line 381) | def test_case_insensitive_display_name_sort(
method test_empty_csv_file (line 428) | def test_empty_csv_file(self, temp_csv: Path, monkeypatch: pytest.Monk...
method test_missing_fields_handled_gracefully (line 440) | def test_missing_fields_handled_gracefully(
method test_category_manager_exception_handling (line 488) | def test_category_manager_exception_handling(
method test_preserve_all_csv_fields (line 509) | def test_preserve_all_csv_fields(self, temp_csv: Path, monkeypatch: py...
method test_category_summary_output (line 540) | def test_category_summary_output(
method test_multiple_sort_stability (line 569) | def test_multiple_sort_stability(
FILE: tests/test_style_selector_paths.py
function _resolve_selector (line 30) | def _resolve_selector(html: str, output_path: Path, repo_root: Path) -> ...
class TestResolveRelativeLink (line 34) | class TestResolveRelativeLink:
method test_root_self_link_is_dot_slash (line 37) | def test_root_self_link_is_dot_slash(self, tmp_path: Path) -> None:
method test_root_to_alternative_link (line 41) | def test_root_to_alternative_link(self, tmp_path: Path) -> None:
method test_alternative_to_root_link (line 49) | def test_alternative_to_root_link(self, tmp_path: Path) -> None:
method test_alternative_to_sibling_link (line 57) | def test_alternative_to_sibling_link(self, tmp_path: Path) -> None:
class TestGetRootStyle (line 66) | class TestGetRootStyle:
method test_root_style_from_config (line 69) | def test_root_style_from_config(self) -> None:
method test_root_style_can_be_changed (line 74) | def test_root_style_can_be_changed(self, monkeypatch) -> None:
method test_root_style_fallback (line 79) | def test_root_style_fallback(self, monkeypatch) -> None:
method test_root_style_missing_readme_section (line 84) | def test_root_style_missing_readme_section(self, monkeypatch) -> None:
class TestGetStyleSelectorTarget (line 90) | class TestGetStyleSelectorTarget:
method test_root_style_goes_to_root (line 93) | def test_root_style_goes_to_root(self) -> None:
method test_non_root_style_goes_to_alternatives (line 99) | def test_non_root_style_goes_to_alternatives(self) -> None:
method test_style_swap_extra_to_alternatives (line 110) | def test_style_swap_extra_to_alternatives(self, monkeypatch) -> None:
method test_style_originally_in_alternatives_becomes_root (line 124) | def test_style_originally_in_alternatives_becomes_root(self, monkeypat...
class TestGenerateStyleSelector (line 138) | class TestGenerateStyleSelector:
method test_root_readme_uses_assets_prefix (line 141) | def test_root_readme_uses_assets_prefix(self, tmp_path: Path) -> None:
method test_alternatives_readme_uses_parent_assets_prefix (line 148) | def test_alternatives_readme_uses_parent_assets_prefix(self, tmp_path:...
method test_root_readme_links_to_alternatives_with_full_path (line 162) | def test_root_readme_links_to_alternatives_with_full_path(self, tmp_pa...
method test_selector_uses_asset_tokens (line 167) | def test_selector_uses_asset_tokens(self, tmp_path: Path) -> None:
method test_alternatives_readme_links_to_root_with_parent (line 173) | def test_alternatives_readme_links_to_root_with_parent(self, tmp_path:...
method test_alternatives_readme_links_to_siblings_with_filename (line 182) | def test_alternatives_readme_links_to_siblings_with_filename(self, tmp...
method test_current_style_gets_highlight_border (line 191) | def test_current_style_gets_highlight_border(self, tmp_path: Path) -> ...
method test_selector_includes_all_styles_in_order (line 196) | def test_selector_includes_all_styles_in_order(self, tmp_path: Path) -...
class TestPathConsistency (line 205) | class TestPathConsistency:
method test_asset_prefix_consistency (line 208) | def test_asset_prefix_consistency(self, tmp_path: Path) -> None:
method test_cross_linking_symmetry (line 231) | def test_cross_linking_symmetry(self, tmp_path: Path) -> None:
class TestEdgeCases (line 247) | class TestEdgeCases:
method test_missing_style_config_handled (line 250) | def test_missing_style_config_handled(self, monkeypatch, tmp_path: Pat...
method test_unknown_style_id (line 258) | def test_unknown_style_id(self, tmp_path: Path) -> None:
class TestAssumptionsDocumented (line 264) | class TestAssumptionsDocumented:
method test_assumption_readme_at_root_uses_assets_directly (line 272) | def test_assumption_readme_at_root_uses_assets_directly(self, tmp_path...
method test_assumption_alternatives_one_level_deep (line 283) | def test_assumption_alternatives_one_level_deep(self, tmp_path: Path) ...
method test_assumption_root_style_is_root_readme (line 303) | def test_assumption_root_style_is_root_readme(self) -> None:
method test_assumption_only_one_readme_at_root (line 313) | def test_assumption_only_one_readme_at_root(self) -> None:
method test_assumption_flat_is_special_case (line 323) | def test_assumption_flat_is_special_case(self) -> None:
FILE: tests/test_toc_anchor_validation.py
function is_placeholder (line 53) | def is_placeholder(path: Path) -> bool:
class TestAnchorExtraction (line 61) | class TestAnchorExtraction:
method test_extract_github_anchors_finds_user_content_ids (line 64) | def test_extract_github_anchors_finds_user_content_ids(self) -> None:
method test_extract_toc_anchors_markdown_style (line 73) | def test_extract_toc_anchors_markdown_style(self) -> None:
method test_extract_toc_anchors_html_style (line 82) | def test_extract_toc_anchors_html_style(self) -> None:
method test_extract_toc_anchors_excludes_back_to_top (line 91) | def test_extract_toc_anchors_excludes_back_to_top(self) -> None:
method test_normalize_anchor_url_decodes (line 100) | def test_normalize_anchor_url_decodes(self) -> None:
class TestAnchorComparison (line 105) | class TestAnchorComparison:
method test_compare_anchors_perfect_match (line 108) | def test_compare_anchors_perfect_match(self) -> None:
method test_compare_anchors_with_url_encoded (line 116) | def test_compare_anchors_with_url_encoded(self) -> None:
method test_compare_anchors_missing_in_github (line 123) | def test_compare_anchors_missing_in_github(self) -> None:
method test_compare_anchors_extra_in_github (line 129) | def test_compare_anchors_extra_in_github(self) -> None:
function _validate_style (line 136) | def _validate_style(style_name: str) -> None:
class TestAwesomeStyle (line 154) | class TestAwesomeStyle:
method test_toc_anchors_match_github (line 161) | def test_toc_anchors_match_github(self) -> None:
method test_expected_anchor_count (line 169) | def test_expected_anchor_count(self) -> None:
class TestClassicStyle (line 179) | class TestClassicStyle:
method test_toc_anchors_match_github (line 186) | def test_toc_anchors_match_github(self) -> None:
class TestExtraStyle (line 191) | class TestExtraStyle:
method test_toc_anchors_match_github (line 198) | def test_toc_anchors_match_github(self) -> None:
class TestFlatStyle (line 203) | class TestFlatStyle:
method test_toc_anchors_match_github (line 210) | def test_toc_anchors_match_github(self) -> None:
class TestExpectedAnchorsFixture (line 219) | class TestExpectedAnchorsFixture:
method test_github_structure_unchanged (line 222) | def test_github_structure_unchanged(self) -> None:
FILE: tests/test_validate_links.py
class DummyResponse (line 18) | class DummyResponse:
method __init__ (line 21) | def __init__(self, status_code: int, headers: dict[str, str] | None = ...
function test_parse_last_modified_date_variants (line 26) | def test_parse_last_modified_date_variants() -> None:
function test_is_stale_threshold (line 42) | def test_is_stale_threshold() -> None:
function test_ensure_stale_column_adds_defaults (line 50) | def test_ensure_stale_column_adds_defaults() -> None:
function test_apply_overrides_sets_and_locks_fields (line 56) | def test_apply_overrides_sets_and_locks_fields() -> None:
function test_header_int_parsing (line 94) | def test_header_int_parsing() -> None:
function test_get_committer_date_from_response_prefers_commit_info (line 102) | def test_get_committer_date_from_response_prefers_commit_info() -> None:
function test_get_committer_date_from_response_falls_back_to_author (line 114) | def test_get_committer_date_from_response_falls_back_to_author() -> None:
function test_detect_package_info (line 130) | def test_detect_package_info(url: str, expected: tuple[str | None, str |...
function test_get_latest_release_info_for_github (line 134) | def test_get_latest_release_info_for_github(monkeypatch: pytest.MonkeyPa...
function test_validate_url_non_github_success (line 150) | def test_validate_url_non_github_success(monkeypatch: pytest.MonkeyPatch...
function test_validate_url_non_github_client_error (line 163) | def test_validate_url_non_github_client_error(monkeypatch: pytest.Monkey...
function test_validate_url_non_github_retries_on_server_error (line 174) | def test_validate_url_non_github_retries_on_server_error(
function test_validate_url_github_file_enriches_metadata (line 191) | def test_validate_url_github_file_enriches_metadata(monkeypatch: pytest....
function test_validate_url_github_rate_limit_retry (line 212) | def test_validate_url_github_rate_limit_retry(monkeypatch: pytest.Monkey...
FILE: tests/test_validate_single_resource.py
function test_validate_single_resource_missing_primary (line 16) | def test_validate_single_resource_missing_primary() -> None:
function test_validate_single_resource_primary_failure (line 23) | def test_validate_single_resource_primary_failure(monkeypatch: pytest.Mo...
function test_validate_single_resource_success_with_secondary (line 41) | def test_validate_single_resource_success_with_secondary(monkeypatch: py...
function test_validate_resource_from_dict_maps_fields (line 68) | def test_validate_resource_from_dict_maps_fields(monkeypatch: pytest.Mon...
FILE: tools/readme_tree/update_readme_tree.py
class Node (line 20) | class Node:
class IgnoreRule (line 29) | class IgnoreRule:
class GitIgnoreChecker (line 39) | class GitIgnoreChecker:
method __post_init__ (line 46) | def __post_init__(self) -> None:
method _git_available (line 51) | def _git_available(self) -> bool:
method _canon_rel (line 71) | def _canon_rel(rel_path: str) -> str:
method _check (line 81) | def _check(self, paths: list[str]) -> set[str]:
method is_ignored (line 106) | def is_ignored(self, rel_path: str, is_dir: bool) -> bool:
function find_repo_root (line 129) | def find_repo_root(start: Path) -> Path:
function normalize_key (line 164) | def normalize_key(path: str | Path | None) -> str:
function load_config (line 175) | def load_config(config_path: Path) -> dict:
function parse_ignore_rule (line 183) | def parse_ignore_rule(pattern: str | Path | None) -> IgnoreRule | None:
function parse_ignore_rules (line 210) | def parse_ignore_rules(patterns: list[str | Path]) -> list[IgnoreRule]:
function matches_ignore_rule (line 220) | def matches_ignore_rule(rule: IgnoreRule, rel_path: str, is_dir: bool) -...
function is_ignored (line 250) | def is_ignored(rel_path: str, is_dir: bool, rules: list[IgnoreRule]) -> ...
function is_pruned (line 259) | def is_pruned(rel_path: str, patterns: list[str]) -> bool:
function add_path (line 271) | def add_path(root: Node, parts: list[str], is_dir: bool) -> Node:
function walk_include (line 287) | def walk_include(
function build_tree (line 347) | def build_tree(config: dict, repo_root: Path) -> Node:
function sort_children (line 410) | def sort_children(node: Node, path: str, order_map: dict[str, list[str]]...
function render_tree (line 433) | def render_tree(root: Node, comments: dict[str, str], order_map: dict[st...
function update_document (line 462) | def update_document(
function main (line 506) | def main() -> int:
Condensed preview — 260 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,529K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/recommend-resource.yml",
"chars": 11655,
"preview": "name: 🚀 Recommend New Resource\ndescription: Recommend a new resource to be featured in Awesome Claude Code\ntitle: \"[Reso"
},
{
"path": ".github/ISSUE_TEMPLATE/repository-enhancement.yml",
"chars": 1847,
"preview": "name: 💡 Repository Enhancement\ndescription: Suggest an improvement to the repository structure, categories, or processes"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 2571,
"preview": "# Pull Request\n\nIf you want to submit a resource for recommendation for Awesome Claude Code, please use the [resource re"
},
{
"path": ".github/workflows/README.md",
"chars": 5989,
"preview": "# GitHub Workflows\n\nThis directory contains GitHub Action workflows for repository maintenance, resource submission hand"
},
{
"path": ".github/workflows/check-repo-health.yml",
"chars": 1198,
"preview": "name: Check Repository Health\n\n# This workflow checks the health of active GitHub repositories listed in THE_RESOURCES_T"
},
{
"path": ".github/workflows/ci.yml",
"chars": 1113,
"preview": "name: CI\n\non:\n push:\n pull_request:\n workflow_dispatch:\n inputs:\n docs_tree_check:\n description: \"Fail"
},
{
"path": ".github/workflows/close-resource-pr.yml",
"chars": 6243,
"preview": "name: Close Resource Submission PRs\n\non:\n pull_request_target:\n types: [opened]\n\njobs:\n detect-and-close:\n name:"
},
{
"path": ".github/workflows/close-resource-prs.yml",
"chars": 6258,
"preview": "name: Close Resource Submission PRs\n\non:\n pull_request_target:\n types: [opened]\n\njobs:\n detect-and-close:\n name:"
},
{
"path": ".github/workflows/handle-resource-submission-commands.yml",
"chars": 8644,
"preview": "name: Handle Resource Submission Commands\n\non:\n issue_comment:\n types: [created]\n\njobs:\n process-commands:\n # On"
},
{
"path": ".github/workflows/notify-on-merge.yml",
"chars": 4749,
"preview": "name: Send Badge Notification on Resource PR Merge\n\non:\n pull_request:\n types: [closed]\n branches: [main]\n\njobs:\n"
},
{
"path": ".github/workflows/submission-enforcement-v2.yml",
"chars": 24606,
"preview": "name: Submission Enforcement\n# Unified workflow: cooldown enforcement for issues, Claude-powered PR\n# classification, an"
},
{
"path": ".github/workflows/submission-enforcement.yml",
"chars": 24463,
"preview": "name: Submission Enforcement\n# Unified workflow: cooldown enforcement for issues, Claude-powered PR\n# classification, an"
},
{
"path": ".github/workflows/update-github-release-data.yml",
"chars": 1149,
"preview": "name: Update GitHub Release Data\n\non:\n schedule:\n # Run daily at 3:00 AM UTC\n - cron: '0 3 * * *'\n workflow_disp"
},
{
"path": ".github/workflows/update-repo-ticker.yml",
"chars": 1747,
"preview": "name: Update Repo Ticker Data\n\non:\n schedule:\n # Run every 6 hours\n - cron: '0 */6 * * *'\n workflow_dispatch: # "
},
{
"path": ".github/workflows/validate-links.yml",
"chars": 5025,
"preview": "name: Validate Links\n\non:\n schedule:\n # Run daily at 2:00 AM UTC\n - cron: '0 2 * * *'\n workflow_dispatch: # Allo"
},
{
"path": ".github/workflows/validate-new-issue.yml",
"chars": 9790,
"preview": "name: Validate New Issue\n\non:\n workflow_call:\n # Called by submission-enforcement.yml after cooldown clears,\n # or di"
},
{
"path": ".gitignore",
"chars": 314,
"preview": ".myob/\n\n.mypy_cache/\n.ruff_cache/\n__pycache__/\n.pytest_cache/\n\n.claude/\nCLAUDE.md\n!resources/**/CLAUDE.md\n.DS_Store\n\nven"
},
{
"path": ".pre-commit-config.yaml",
"chars": 1252,
"preview": "# See https://pre-commit.com for more information\n# See https://pre-commit.com/hooks.html for more hooks\nrepos:\n - repo"
},
{
"path": ".python-version",
"chars": 5,
"preview": "3.11\n"
},
{
"path": "LICENSE",
"chars": 227,
"preview": "Awesome Claude Code © 2025 by hesreallyhim is licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4"
},
{
"path": "Makefile",
"chars": 10779,
"preview": "# Makefile for awesome-claude-code resource management\n# Use venv python locally, system python in CI/CD\nifeq ($(CI),tru"
},
{
"path": "README.md",
"chars": 71057,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<h3 align=\"center\">Pick Your Style:</h3>\n<p align=\"center\">\n<a href=\"./\"><"
},
{
"path": "README_ALTERNATIVES/README_AWESOME.md",
"chars": 71016,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<h3 align=\"center\">Pick Your Style:</h3>\n<p align=\"center\">\n<a href=\"../\">"
},
{
"path": "README_ALTERNATIVES/README_CLASSIC.md",
"chars": 125915,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_EXTRA.md",
"chars": 174732,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_ALL_AZ.md",
"chars": 274829,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_ALL_CREATED.md",
"chars": 274870,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_ALL_RELEASES.md",
"chars": 71762,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_ALL_UPDATED.md",
"chars": 274880,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLAUDE-MD_AZ.md",
"chars": 35341,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLAUDE-MD_CREATED.md",
"chars": 35382,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLAUDE-MD_RELEASES.md",
"chars": 14581,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLAUDE-MD_UPDATED.md",
"chars": 35392,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLIENTS_AZ.md",
"chars": 9739,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLIENTS_CREATED.md",
"chars": 9780,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLIENTS_RELEASES.md",
"chars": 5974,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_CLIENTS_UPDATED.md",
"chars": 9790,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_COMMANDS_AZ.md",
"chars": 65795,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_COMMANDS_CREATED.md",
"chars": 65836,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_COMMANDS_RELEASES.md",
"chars": 10334,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_COMMANDS_UPDATED.md",
"chars": 65846,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_DOCS_AZ.md",
"chars": 6369,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_DOCS_CREATED.md",
"chars": 6410,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_DOCS_RELEASES.md",
"chars": 3182,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_DOCS_UPDATED.md",
"chars": 6420,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_HOOKS_AZ.md",
"chars": 19525,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_HOOKS_CREATED.md",
"chars": 19566,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_HOOKS_RELEASES.md",
"chars": 7672,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_HOOKS_UPDATED.md",
"chars": 19576,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_SKILLS_AZ.md",
"chars": 29986,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_SKILLS_CREATED.md",
"chars": 30027,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_SKILLS_RELEASES.md",
"chars": 14676,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_SKILLS_UPDATED.md",
"chars": 30037,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STATUSLINE_AZ.md",
"chars": 9975,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STATUSLINE_CREATED.md",
"chars": 10016,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STATUSLINE_RELEASES.md",
"chars": 7459,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STATUSLINE_UPDATED.md",
"chars": 10026,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STYLES_AZ.md",
"chars": 9109,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STYLES_CREATED.md",
"chars": 9150,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STYLES_RELEASES.md",
"chars": 3194,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_STYLES_UPDATED.md",
"chars": 9160,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_TOOLING_AZ.md",
"chars": 66313,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_TOOLING_CREATED.md",
"chars": 66354,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_TOOLING_RELEASES.md",
"chars": 23070,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_TOOLING_UPDATED.md",
"chars": 66364,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_WORKFLOWS_AZ.md",
"chars": 49883,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_WORKFLOWS_CREATED.md",
"chars": 49924,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_WORKFLOWS_RELEASES.md",
"chars": 11163,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "README_ALTERNATIVES/README_FLAT_WORKFLOWS_UPDATED.md",
"chars": 49934,
"preview": "<!-- GENERATED FILE: do not edit directly -->\n<!--lint disable remark-lint:awesome-badge-->\n\n<h3 align=\"center\">Pick You"
},
{
"path": "THE_RESOURCES_TABLE.csv",
"chars": 104955,
"preview": "ID,Display Name,Category,Sub-Category,Primary Link,Secondary Link,Author Name,Author Link,Active,Date Added,Last Modifie"
},
{
"path": "acc-config.yaml",
"chars": 1610,
"preview": "# Awesome Claude Code Configuration\n# This file controls various aspects of README generation and repository behavior.\n\n"
},
{
"path": "data/repo-ticker-previous.csv",
"chars": 10302,
"preview": "full_name,stars,watchers,forks,stars_delta,watchers_delta,forks_delta,url\r\nanthropics/claude-code,80099,80099,6616,70,70"
},
{
"path": "data/repo-ticker.csv",
"chars": 10340,
"preview": "full_name,stars,watchers,forks,stars_delta,watchers_delta,forks_delta,url\r\nanthropics/claude-code,80263,80263,6631,164,1"
},
{
"path": "docs/CODE_OF_CONDUCT.md",
"chars": 5797,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "docs/CONTRIBUTING.md",
"chars": 7535,
"preview": "# Contributing to Awesome Claude Code\n\nPlease take a moment to read through this docoument if you plan to submit somethi"
},
{
"path": "docs/COOLDOWN.md",
"chars": 4000,
"preview": "# Cooldown Protocol\n\nThe following protocol exists to ensure fairness for all visitors that wish to be featured on the l"
},
{
"path": "docs/HOW_IT_LOOKS.md",
"chars": 284,
"preview": "# How It Looks (WIP)\n\nAmazing, obviously. But there's more to it than pure visual stimulation - there's _numbers_ and..."
},
{
"path": "docs/HOW_IT_WORKS.md",
"chars": 13090,
"preview": "# How Awesome Claude Code Works\n\nThis document provides assorted technical details about the repository structure, autom"
},
{
"path": "docs/README-GENERATION.md",
"chars": 28307,
"preview": "# README Generation & Asset Management\n\nThis document explains how the README and its visual assets are generated and ma"
},
{
"path": "docs/REPO_TICKER.md",
"chars": 3579,
"preview": "# Awesome Claude Code - \"Repo Ticker\"\n\n## What is this thing?\n\nThe repo displays an animated SVG, in the style of a \"sto"
},
{
"path": "docs/SECURITY.md",
"chars": 1548,
"preview": "# Security Policy\n\nThis repository does not export any executible software, and\nit is, at the end of the day, just a Mar"
},
{
"path": "docs/TESTING.md",
"chars": 1619,
"preview": "# Testing & Coverage\n\nThis document covers how to run the test suite and generate coverage reports.\n\n## Setup\n\nInstall d"
},
{
"path": "docs/development/cooldown-enforcement.md",
"chars": 2434,
"preview": "# Cooldown Enforcement\n\nAutomated rate-limiting for resource submissions. Applies to both issues and pull requests.\n\n## "
},
{
"path": "docs/development/do-not-forget.md",
"chars": 810,
"preview": "# Don't Forget\n\nSome important but easy-to-forget assumptions and gotchas that can cause headaches:\n\n- `python -m` uses "
},
{
"path": "docs/development/path-resolution-migration-plan.md",
"chars": 2038,
"preview": "# Path Resolution Migration Plan\n\nThis plan describes the concrete work needed to migrate README generation to the\nfinal"
},
{
"path": "docs/development/path-resolution-strategy.final.md",
"chars": 3455,
"preview": "# Strategy: Generated, Location-Correct Relative Asset Paths\n\nThis repo treats all Markdown READMEs as generated artifac"
},
{
"path": "docs/development/summary-rendering-cheatsheet.md",
"chars": 1334,
"preview": "## GitHub README collapsible subcategory cheat sheet\n\nContext: GitHub’s Markdown renderer wraps loose content in `<p>` t"
},
{
"path": "docs/development/tech-debt.md",
"chars": 73,
"preview": "Really Him: Claude, this file is empty\n\nClaude: You're absolutely right.\n"
},
{
"path": "docs/development/toc-anchor-generation.md",
"chars": 5356,
"preview": "# TOC Anchor Generation\n\n## GitHub Anchor Generation Rules\n\nGitHub generates heading anchors by:\n1. Lowercasing the head"
},
{
"path": "docs/development/vintage-manual-animation-style-guide.md",
"chars": 13479,
"preview": "# Vintage Manual Animation Style Guide\n\nA comprehensive guide to the animation effects developed for the light mode \"vin"
},
{
"path": "pyproject.toml",
"chars": 2376,
"preview": "[build-system]\nrequires = [\"setuptools>=61.0\", \"wheel\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"aweso"
},
{
"path": "resources/README.md",
"chars": 321,
"preview": "# Resources\n\nHistorically, this was used to preserve copies of the resources included in the list, however the majority "
},
{
"path": "resources/claude.md-files/AI-IntelliJ-Plugin/CLAUDE.md",
"chars": 1593,
"preview": "# AI Integration Plugin Development Guide\n\n## Build Commands\n- `./gradlew build` - Build the entire project\n- `./gradlew"
},
{
"path": "resources/claude.md-files/AVS-Vibe-Developer-Guide/CLAUDE.md",
"chars": 1118,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "resources/claude.md-files/AWS-MCP-Server/CLAUDE.md",
"chars": 4882,
"preview": "# AWS MCP Server Development Guide\n\n## Build & Test Commands\n\n### Using uv (recommended)\n- Install dependencies: `uv pip"
},
{
"path": "resources/claude.md-files/Basic-Memory/CLAUDE.md",
"chars": 11164,
"preview": "# CLAUDE.md - Basic Memory Project Guide\n\n## Project Overview\n\nBasic Memory is a local-first knowledge management system"
},
{
"path": "resources/claude.md-files/Comm/CLAUDE.md",
"chars": 1312,
"preview": "# Comm Project Development Guide\n\n## Build & Test Commands\n\n- Run tests: `yarn workspace [lib|web|keyserver|native] test"
},
{
"path": "resources/claude.md-files/Course-Builder/CLAUDE.md",
"chars": 9503,
"preview": "# Course Builder Development Guide\n\n## Project Overview\n\nCourse Builder is a real-time multiplayer CMS (Content Manageme"
},
{
"path": "resources/claude.md-files/Cursor-Tools/CLAUDE.md",
"chars": 19421,
"preview": "This is the vibe-tools repo. Here we build a cli tool that AI agents can use to execute commands and work with other AI "
},
{
"path": "resources/claude.md-files/DroidconKotlin/CLAUDE.md",
"chars": 1588,
"preview": "# DroidconKotlin Development Guide\n\n## Build Commands\n- Build: `./gradlew build`\n- Clean build: `./gradlew clean build`\n"
},
{
"path": "resources/claude.md-files/EDSL/CLAUDE.md",
"chars": 1238,
"preview": "# EDSL Codebase Reference\n\n## Build & Test Commands\n- Install: `make install`\n- Run all tests: `make test`\n- Run single "
},
{
"path": "resources/claude.md-files/Giselle/CLAUDE.md",
"chars": 2592,
"preview": "# Development Philosophy\n\n## Core Principle: **Less is more**\nKeep every implementation as small and obvious as possible"
},
{
"path": "resources/claude.md-files/Guitar/CLAUDE.md",
"chars": 1087,
"preview": "# Guitar Development Guide\n\n## Build Commands\n- Setup dependencies: `sudo apt install build-essential ruby qmake6 libqt6"
},
{
"path": "resources/claude.md-files/JSBeeb/CLAUDE.md",
"chars": 5089,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "resources/claude.md-files/Lamoom-Python/CLAUDE.md",
"chars": 1211,
"preview": "# Lamoom Python Project Guide\n\n## Build/Test/Lint Commands\n- Install deps: `poetry install`\n- Run all tests: `poetry run"
},
{
"path": "resources/claude.md-files/LangGraphJS/CLAUDE.md",
"chars": 1871,
"preview": "# LangGraphJS Development Guide\n\n## Build & Test Commands\n- Build: `yarn build`\n- Lint: `yarn lint` (fix with `yarn lint"
},
{
"path": "resources/claude.md-files/Network-Chronicles/CLAUDE.md",
"chars": 6046,
"preview": "# Network Chronicles Development Notes\n\n## Common Commands\n- `chmod +x <script_name>` - Make a script executable\n- `./bi"
},
{
"path": "resources/claude.md-files/Note-Companion/CLAUDE.md",
"chars": 3499,
"preview": "# File Organizer 2000 - Developer Guide\n\n## Styling Guidelines\n\nTo avoid styling conflicts between Obsidian's styles and"
},
{
"path": "resources/claude.md-files/Pareto-Mac/CLAUDE.md",
"chars": 9360,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n# P"
},
{
"path": "resources/claude.md-files/Perplexity-MCP/CLAUDE.md",
"chars": 1849,
"preview": "# Perplexity MCP Server Guide\n\n## Quick Start\n1. **Install Dependencies**: `npm install`\n2. **Set API Key**: Add to `.en"
},
{
"path": "resources/claude.md-files/SG-Cars-Trends-Backend/CLAUDE.md",
"chars": 25632,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "resources/claude.md-files/SPy/CLAUDE.md",
"chars": 1550,
"preview": "# SPy Language - Dev Reference\n\n## General behavior of claude code\n- NEVER run tests automatically unless explicitly ask"
},
{
"path": "resources/claude.md-files/TPL/CLAUDE.md",
"chars": 1557,
"preview": "# TPL-GO Developer Guide\n\n## Build Commands\n- `make` - Format and build project\n- `make deps` - Get all dependencies\n- `"
},
{
"path": "resources/claude.md-files/claude-code-mcp-enhanced/CLAUDE.md",
"chars": 10621,
"preview": "# GLOBAL CODING STANDARDS\n\n> Reference guide for all project development. For detailed task planning, see [TASK_PLAN_GUI"
},
{
"path": "resources/official-documentation/Anthropic-Quickstarts/CLAUDE.md",
"chars": 2014,
"preview": "# Anthropic Quickstarts Development Guide\n\n## Computer-Use Demo\n\n### Setup & Development\n\n- **Setup environment**: `./se"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/ci-failure-auto-fix.yml",
"chars": 3368,
"preview": "name: Auto Fix CI Failures\n\non:\n workflow_run:\n workflows: [\"CI\"]\n types:\n - completed\n\npermissions:\n conte"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/claude.yml",
"chars": 1993,
"preview": "name: Claude Code\n\non:\n issue_comment:\n types: [created]\n pull_request_review_comment:\n types: [created]\n issue"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/issue-deduplication.yml",
"chars": 2461,
"preview": "name: Issue Deduplication\n\non:\n issues:\n types: [opened]\n\njobs:\n deduplicate:\n runs-on: ubuntu-latest\n timeou"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/issue-triage.yml",
"chars": 982,
"preview": "name: Claude Issue Triage\ndescription: Run Claude Code for issue triage in GitHub Actions\non:\n issues:\n types: [open"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/manual-code-analysis.yml",
"chars": 1505,
"preview": "name: Claude Commit Analysis\n\non:\n workflow_dispatch:\n inputs:\n analysis_type:\n description: \"Type of an"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/pr-review-comprehensive.yml",
"chars": 2583,
"preview": "name: PR Review with Progress Tracking\n\n# This example demonstrates how to use the track_progress feature to get\n# visua"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/pr-review-filtered-authors.yml",
"chars": 1596,
"preview": "name: Claude Review - Specific Authors\n\non:\n pull_request:\n types: [opened, synchronize]\n\njobs:\n review-by-author:\n"
},
{
"path": "resources/official-documentation/Claude-Code-GitHub-Actions/pr-review-filtered-paths.yml",
"chars": 1558,
"preview": "name: Claude Review - Path Specific\n\non:\n pull_request:\n types: [opened, synchronize]\n paths:\n # Only run wh"
},
{
"path": "resources/slash-commands/act/act.md",
"chars": 290,
"preview": "Follow RED-GREEN-REFACTOR cycle approch based on @~/.claude/CLAUDE.md:\n1. Open todo.md and select the first unchecked it"
},
{
"path": "resources/slash-commands/add-to-changelog/add-to-changelog.md",
"chars": 1571,
"preview": "# Update Changelog\n\nThis command adds a new entry to the project's CHANGELOG.md file.\n\n## Usage\n\n```\n/add-to-changelog <"
},
{
"path": "resources/slash-commands/clean/clean.md",
"chars": 68,
"preview": "Fix all black, isort, flake8 and mypy issues in the entire codebase\n"
},
{
"path": "resources/slash-commands/commit/commit.md",
"chars": 7277,
"preview": "# Claude Command: Commit\n\nThis command helps you create well-formatted commits with conventional commit messages and emo"
},
{
"path": "resources/slash-commands/context-prime/context-prime.md",
"chars": 138,
"preview": "Read README.md, THEN run `git ls-files | grep -v -f (sed 's|^|^|; s|$|/|' .cursorignore | psub)` to understand the conte"
},
{
"path": "resources/slash-commands/create-hook/create-hook.md",
"chars": 7523,
"preview": "# Create Hook Command\n\nAnalyze the project, suggest practical hooks, and create them with proper testing.\n\n## Your Task "
},
{
"path": "resources/slash-commands/create-jtbd/create-jtbd.md",
"chars": 1007,
"preview": "You are an experienced Product Manager. Your task is to create a Jobs to be Done (JTBD) document for a feature we are ad"
},
{
"path": "resources/slash-commands/create-pr/create-pr.md",
"chars": 795,
"preview": "# Create Pull Request Command\n\nCreate a new branch, commit changes, and submit a pull request.\n\n## Behavior\n- Creates a "
},
{
"path": "resources/slash-commands/create-prd/create-prd.md",
"chars": 994,
"preview": "You are an experienced Product Manager. Your task is to create a Product Requirements Document (PRD) for a feature we ar"
},
{
"path": "resources/slash-commands/create-prp/create-prp.md",
"chars": 2777,
"preview": "YOU MUST READ THESE FILES AND FOLLOW THE INSTRUCTIONS IN THEM.\nStart by reading the concept_library/cc_PRP_flow/README.m"
},
{
"path": "resources/slash-commands/create-pull-request/create-pull-request.md",
"chars": 3789,
"preview": "# How to Create a Pull Request Using GitHub CLI\n\nThis guide explains how to create pull requests using GitHub CLI in our"
},
{
"path": "resources/slash-commands/create-worktrees/create-worktrees.md",
"chars": 5190,
"preview": "# Git Worktree Commands\n\n## Create Worktrees for All Open PRs\n\nThis command fetches all open pull requests using GitHub "
},
{
"path": "resources/slash-commands/fix-github-issue/fix-github-issue.md",
"chars": 463,
"preview": "Please analyze and fix the GitHub issue: $ARGUMENTS.\n\nFollow these steps:\n\n1. Use `gh issue view` to get the issue detai"
},
{
"path": "resources/slash-commands/husky/husky.md",
"chars": 4749,
"preview": "## Summary\n\nThe goal of this command is to verify the repo is in a working state and fix issues if they exist.\n\n## Goals"
},
{
"path": "resources/slash-commands/initref/initref.md",
"chars": 454,
"preview": "Build a reference for the implementation details of this project. Use provided summarize tool to get summary of the file"
},
{
"path": "resources/slash-commands/load-llms-txt/load-llms-txt.md",
"chars": 195,
"preview": "# Load Xatu Data Context\nREAD the llms.txt file from https://raw.githubusercontent.com/ethpandaops/xatu-data/refs/heads/"
},
{
"path": "resources/slash-commands/optimize/optimize.md",
"chars": 38,
"preview": "このコードのパフォーマンスを分析し、具体的な最適化を3つ提案してください。\n"
},
{
"path": "resources/slash-commands/pr-review/pr-review.md",
"chars": 3794,
"preview": "# PR Review\n\n**PR Link/Number**: $ARGUMENTS\n\n> **Instructions**: Execute each task in the order given to conduct a thoro"
},
{
"path": "resources/slash-commands/release/release.md",
"chars": 210,
"preview": "Update CHANGELOG.md with changes since the last version increase. Check our README.md for any\nnecessary changes. Check t"
},
{
"path": "resources/slash-commands/testing_plan_integration/testing_plan_integration.md",
"chars": 434,
"preview": "I need you to create an integration testing plan for $ARGUMENTS\n\nThese are integration tests and I want them to be inlin"
},
{
"path": "resources/slash-commands/todo/todo.md",
"chars": 2955,
"preview": "---\nname: todo\ndescription: Manage project todos in todos.md file\n---\n\n# Project Todo Manager\n\nManage todos in a `todos."
},
{
"path": "resources/slash-commands/update-branch-name/update-branch-name.md",
"chars": 441,
"preview": "# Update Branch Name\n\nFollow these steps to update the current branch name:\n\n1. Check differences between current branch"
},
{
"path": "resources/slash-commands/update-docs/update-docs.md",
"chars": 3745,
"preview": "# Documentation Update Command: Update Implementation Documentation\n\n## Documentation Analysis\n\n1. Review current docume"
},
{
"path": "resources/workflows-knowledge-guides/Blogging-Platform-Instructions/view_commands.md",
"chars": 1252,
"preview": "Here are all the available project commands, organized by category:\n\n## Post Management\n\n- `/project:posts:new` - Create"
},
{
"path": "resources/workflows-knowledge-guides/Design-Review-Workflow/README.md",
"chars": 2751,
"preview": "# Design Review Workflow\n\nThis directory contains templates and examples for implementing an automated design review sys"
},
{
"path": "resources/workflows-knowledge-guides/Design-Review-Workflow/design-principles-example.md",
"chars": 9361,
"preview": "# S-Tier SaaS Dashboard Design Checklist (Inspired by Stripe, Airbnb, Linear)\n\n## I. Core Design Philosophy & Strategy\n\n"
},
{
"path": "resources/workflows-knowledge-guides/Design-Review-Workflow/design-review-agent.md",
"chars": 6019,
"preview": "---\nname: design-review\ndescription: Use this agent when you need to conduct a comprehensive design review on front-end "
},
{
"path": "resources/workflows-knowledge-guides/Design-Review-Workflow/design-review-claude-md-snippet.md",
"chars": 1311,
"preview": "## Visual Development\n\n### Design Principles\n- Comprehensive design checklist in `/context/design-principles.md`\n- Brand"
},
{
"path": "resources/workflows-knowledge-guides/Design-Review-Workflow/design-review-slash-command.md",
"chars": 2156,
"preview": "---\nallowed-tools: Grep, LS, Read, Edit, MultiEdit, Write, NotebookEdit, WebFetch, TodoWrite, WebSearch, BashOutput, Kil"
},
{
"path": "scripts/README.md",
"chars": 14893,
"preview": "# Scripts Directory\n\nThis directory contains all automation scripts for managing the Awesome Claude Code repository. The"
},
{
"path": "scripts/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/archive/README.md",
"chars": 171,
"preview": "# Archive\n\nTemporary holding area for deprecated scripts that are no longer wired into the\nactive toolchain, but are kep"
},
{
"path": "scripts/archive/__init__.py",
"chars": 35,
"preview": "\"\"\"Archived/deprecated scripts.\"\"\"\n"
},
{
"path": "scripts/badges/BADGE_AUTOMATION_SETUP.md",
"chars": 1599,
"preview": "# Badge Issue Notification Setup Guide\n\n## Overview\nThis system creates friendly notification issues on GitHub repositor"
},
{
"path": "scripts/badges/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/badges/badge_notification.py",
"chars": 3936,
"preview": "#!/usr/bin/env python3\n\"\"\"\nBadge Issue Notification (GitHub Actions only).\n\nCreates a single notification issue in a spe"
},
{
"path": "scripts/badges/badge_notification_core.py",
"chars": 16825,
"preview": "#!/usr/bin/env python3\n\"\"\"\nCore module for badge notification system\nShared functionality for both automated and manual "
},
{
"path": "scripts/categories/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/categories/add_category.py",
"chars": 14977,
"preview": "#!/usr/bin/env python3\n\"\"\"\nScript to automate adding a new category to awesome-claude-code.\nThis handles all the necessa"
},
{
"path": "scripts/categories/category_utils.py",
"chars": 4622,
"preview": "#!/usr/bin/env python3\n\"\"\"\nUnified category utilities for awesome-claude-code.\nProvides a single source of truth for all"
},
{
"path": "scripts/graphics/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/graphics/generate_logo_svgs.py",
"chars": 3203,
"preview": "#!/usr/bin/env python3\n\"\"\"\nGenerate responsive SVG logos for the Awesome Claude Code repository.\n\nThis script creates:\n-"
},
{
"path": "scripts/ids/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/ids/generate_resource_id.py",
"chars": 1393,
"preview": "#!/usr/bin/env python3\n\"\"\"\nSimple script to generate a resource ID for manual CSV additions.\n\"\"\"\n\nimport sys\nfrom pathli"
},
{
"path": "scripts/ids/resource_id.py",
"chars": 1069,
"preview": "#!/usr/bin/env python3\n\"\"\"\nShared resource ID generation functionality.\n\"\"\"\n\nimport hashlib\nimport sys\nfrom pathlib impo"
},
{
"path": "scripts/maintenance/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/maintenance/check_repo_health.py",
"chars": 8501,
"preview": "#!/usr/bin/env python3\n\"\"\"\nRepository health check script for the Awesome Claude Code repository.\n\nThis script checks ac"
},
{
"path": "scripts/maintenance/update_github_release_data.py",
"chars": 7849,
"preview": "#!/usr/bin/env python3\n\"\"\"\nUpdate Last Modified and GitHub release info for active GitHub repos in THE_RESOURCES_TABLE.c"
},
{
"path": "scripts/py.typed",
"chars": 0,
"preview": ""
},
{
"path": "scripts/readme/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/readme/generate_readme.py",
"chars": 4986,
"preview": "#!/usr/bin/env python3\n\"\"\"\nTemplate-based README generator for the Awesome Claude Code repository.\nReads resource metada"
},
{
"path": "scripts/readme/generators/__init__.py",
"chars": 40,
"preview": "\"\"\"README generator implementations.\"\"\"\n"
},
{
"path": "scripts/readme/generators/awesome.py",
"chars": 2780,
"preview": "\"\"\"Awesome README generator implementation.\"\"\"\n\nimport os\nfrom pathlib import Path\n\nfrom scripts.readme.generators.base "
},
{
"path": "scripts/readme/generators/base.py",
"chars": 10111,
"preview": "\"\"\"Shared base class and helpers for README generators.\"\"\"\n\nfrom __future__ import annotations\n\nimport contextlib\nimport"
},
{
"path": "scripts/readme/generators/flat.py",
"chars": 10270,
"preview": "\"\"\"Flat list README generator implementation.\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nfrom datetime import dat"
},
{
"path": "scripts/readme/generators/minimal.py",
"chars": 1740,
"preview": "\"\"\"Minimal README generator implementation.\"\"\"\n\nfrom scripts.readme.generators.base import ReadmeGenerator\nfrom scripts."
},
{
"path": "scripts/readme/generators/visual.py",
"chars": 2298,
"preview": "\"\"\"Visual README generator implementation.\"\"\"\n\nfrom scripts.readme.generators.base import ReadmeGenerator\nfrom scripts.r"
},
{
"path": "scripts/readme/helpers/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/readme/helpers/generate_toc_assets.py",
"chars": 815,
"preview": "\"\"\"Regenerate subcategory TOC SVGs from categories.yaml.\n\nRun after adding or modifying subcategories in templates/categ"
},
{
"path": "scripts/readme/helpers/readme_assets.py",
"chars": 13001,
"preview": "\"\"\"SVG asset generation and file helpers for README generation.\"\"\"\n\nfrom __future__ import annotations\n\nimport glob\nimpo"
},
{
"path": "scripts/readme/helpers/readme_config.py",
"chars": 2604,
"preview": "\"\"\"Configuration loader for README generation.\"\"\"\n\nimport os\nfrom pathlib import Path\n\nimport yaml # type: ignore[impor"
},
{
"path": "scripts/readme/helpers/readme_paths.py",
"chars": 2448,
"preview": "\"\"\"Path resolution helpers for README generation.\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nimport re\nfrom pathl"
},
{
"path": "scripts/readme/helpers/readme_utils.py",
"chars": 6174,
"preview": "\"\"\"Shared utility helpers for README generation.\"\"\"\n\nfrom __future__ import annotations\n\nimport re\nfrom datetime import "
},
{
"path": "scripts/readme/markup/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/readme/markup/awesome.py",
"chars": 5565,
"preview": "\"\"\"Awesome-list README markdown rendering helpers.\"\"\"\n\nfrom __future__ import annotations\n\nfrom datetime import datetime"
},
{
"path": "scripts/readme/markup/flat.py",
"chars": 7371,
"preview": "\"\"\"Flat list README markup rendering helpers.\"\"\"\n\nfrom __future__ import annotations\n\nfrom scripts.readme.helpers.readme"
},
{
"path": "scripts/readme/markup/minimal.py",
"chars": 6608,
"preview": "\"\"\"Minimal README markdown rendering helpers.\"\"\"\n\nfrom __future__ import annotations\n\nfrom datetime import datetime, tim"
},
{
"path": "scripts/readme/markup/shared.py",
"chars": 4140,
"preview": "\"\"\"Markdown/HTML rendering helpers shared across README styles.\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nfrom p"
},
{
"path": "scripts/readme/markup/visual.py",
"chars": 15494,
"preview": "\"\"\"Visual README markup rendering helpers.\"\"\"\n\nfrom __future__ import annotations\n\nfrom datetime import datetime, timede"
},
{
"path": "scripts/readme/svg_templates/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/readme/svg_templates/badges.py",
"chars": 4108,
"preview": "\"\"\"SVG renderers for badges.\"\"\"\n\n\ndef generate_resource_badge_svg(display_name, author_name=\"\"):\n \"\"\"Generate SVG con"
},
{
"path": "scripts/readme/svg_templates/dividers.py",
"chars": 12462,
"preview": "\"\"\"SVG renderers for section dividers and boxes.\"\"\"\n\n\ndef generate_section_divider_light_svg(variant=1):\n \"\"\"Generate"
},
{
"path": "scripts/readme/svg_templates/headers.py",
"chars": 9857,
"preview": "\"\"\"SVG renderers for section headers.\"\"\"\n\n\ndef render_h2_svg(text: str, icon: str = \"\") -> str:\n \"\"\"Create an animate"
},
{
"path": "scripts/readme/svg_templates/py.typed",
"chars": 0,
"preview": ""
},
{
"path": "scripts/readme/svg_templates/toc.py",
"chars": 9332,
"preview": "\"\"\"SVG renderers for table-of-contents elements.\"\"\"\n\nimport re\n\n\ndef generate_toc_row_svg(directory_name, description):\n"
},
{
"path": "scripts/resources/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scripts/resources/create_resource_pr.py",
"chars": 12031,
"preview": "#!/usr/bin/env python3\n\"\"\"\nCreate a pull request with a new resource addition.\nThis script is called by the GitHub Actio"
}
]
// ... and 60 more files (download for full content)
About this extraction
This page contains the full source code of the hesreallyhim/awesome-claude-code GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 260 files (4.2 MB), approximately 1.1M tokens, and a symbol index with 695 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.