Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28,031 changes: 14,016 additions & 14,015 deletions .claude-plugin/marketplace.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
{
"name": "starling",
"name": "graycode-skills",
"version": "0.0.1",
"description": "Community skill packages for hawk \u2014 the AI coding agent. Security, code review, DevOps, and more.",
"description": "Community skill packages for graycode \u2014 the AI coding agent. Security, code review, DevOps, and more.",
"author": {
"name": "GrayCode AI",
"url": "https://github.com/GrayCodeAI"
},
"repository": "https://github.com/GrayCodeAI/starling",
"repository": "https://github.com/GrayCodeAI/graycode-skills",
"license": "MIT",
"keywords": [
"hawk",
"graycode",
"skills",
"code-review",
"security",
Expand Down
6 changes: 3 additions & 3 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "starling",
"name": "graycode-skills",
"version": "0.0.1",
"description": "Community skill packages for hawk \u2014 security, code review, DevOps, and more.",
"description": "Community skill packages for graycode \u2014 security, code review, DevOps, and more.",
"author": "GrayCode AI",
"repository": "https://github.com/GrayCodeAI/starling",
"repository": "https://github.com/GrayCodeAI/graycode-skills",
"license": "MIT"
}
6 changes: 3 additions & 3 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "starling",
"name": "graycode-skills",
"version": "0.0.1",
"description": "Community skill packages for hawk \u2014 security, code review, DevOps, and more.",
"description": "Community skill packages for graycode \u2014 security, code review, DevOps, and more.",
"author": "GrayCode AI",
"repository": "https://github.com/GrayCodeAI/starling",
"repository": "https://github.com/GrayCodeAI/graycode-skills",
"license": "MIT"
}
6 changes: 3 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# starling environment variables — copy to .env and fill in
# starling is a skill registry with no network service.
# graycode-skills environment variables — copy to .env and fill in
# graycode-skills is a skill registry with no network service.

# Optional: override the default skills installation directory
HAWK_SKILLS_DIR=~/.hawk/skills
GRAYCODE_SKILLS_DIR=~/.graycode/skills
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# CODEOWNERS for starling
# CODEOWNERS for graycode-skills
#
# GitHub CODEOWNERS uses last-match-wins: more specific rules must come AFTER
# more general ones to actually take effect. /categories/ and /registry.json
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:
with:
context: .
file: Dockerfile.sandbox
tags: starling-sandbox:ci
tags: graycode-skills-sandbox:ci
push: false
load: true
cache-from: type=gha,scope=sandbox
Expand All @@ -93,7 +93,7 @@ jobs:
BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
run: |
changed="$(git diff --name-only "$BASE_REF" HEAD)"
python3 tools/sandbox_run_changed_scripts.py --image starling-sandbox:ci $changed
python3 tools/sandbox_run_changed_scripts.py --image graycode-skills-sandbox:ci $changed

# -------------------------------------------------------------------------
# Duplication detection — jscpd (scan categories with reasonable thresholds).
Expand Down
29 changes: 28 additions & 1 deletion .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ permissions:

env:
REGISTRY: ghcr.io
IMAGE_NAME: graycodeai/starling
IMAGE_NAME: graycodeai/graycode-skills
SANDBOX_IMAGE_NAME: graycodeai/graycode-skills-sandbox

jobs:
build-and-push:
Expand Down Expand Up @@ -57,3 +58,29 @@ jobs:
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

build-and-push-sandbox:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0

- name: Log in to GHCR
if: github.event_name != 'pull_request'
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push sandbox image
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
with:
context: .
file: Dockerfile.sandbox
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ env.REGISTRY }}/${{ env.SANDBOX_IMAGE_NAME }}:latest
cache-from: type=gha,scope=sandbox
cache-to: type=gha,mode=max,scope=sandbox
6 changes: 3 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
- Automated validation tooling for frontmatter, references, scripts, and content
- Registry generation from SKILL.md frontmatter
- CI/CD workflows for PR checks
- 12,171+ community skill packages across 31 categories
- 14,016+ community skill packages across 27 categories

## [0.1.0] - 2026-05-26

### Changed
- Initial release with validation infrastructure

[Unreleased]: https://github.com/GrayCodeAI/starling/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/GrayCodeAI/starling/releases/tag/v0.1.0
[Unreleased]: https://github.com/GrayCodeAI/graycode-skills/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/GrayCodeAI/graycode-skills/releases/tag/v0.1.0
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Contributing to hawk Community Skills
# Contributing to graycode Community Skills

Thank you for your interest in contributing! Every skill helps make Graycode smarter for everyone. This repository contains 12,167 community-contributed skill packages organized into 27 domain categories.
Thank you for your interest in contributing! Every skill helps make Graycode smarter for everyone. This repository contains 14,016 community-contributed skill packages organized into 27 domain categories.

## Ways to Contribute

Expand Down Expand Up @@ -79,7 +79,7 @@ author: your-github-username

# Skill Title

Instructions that hawk follows when this skill is active...
Instructions that graycode follows when this skill is active...
```

For the complete frontmatter schema, see [`manifest-schema.toml`](manifest-schema.toml).
Expand Down Expand Up @@ -172,7 +172,7 @@ Add your skill to `registry.json`:

### Registry Entry

`registry.json` is auto-generated from all `SKILL.md` frontmatter files. When you add a skill, run `python tools/update_registry.py` to regenerate it. The registry is consumed by the hawk client for skill discovery and installation.
`registry.json` is auto-generated from all `SKILL.md` frontmatter files. When you add a skill, run `python tools/update_registry.py` to regenerate it. The registry is consumed by the graycode client for skill discovery and installation.

The `category` field in `registry.json` is derived from the `domain` field in frontmatter. Valid values are: `coding`, `cybersecurity`, `data-science`, `devops`, `documentation`, `research`, `testing`, or `other`.

Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates
rm -rf /var/lib/apt/lists/* && \
adduser --disabled-password --gecos "" --uid 1000 skills

COPY --from=builder /build /opt/starling
COPY --from=builder /build /opt/graycode-skills

USER skills
WORKDIR /opt/starling
WORKDIR /opt/graycode-skills
ENTRYPOINT ["tini", "--"]
CMD ["python", "tools/validate_skill.py", "."]
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.PHONY: boundary-guard lint format registry-check validate test help

boundary-guard: ## Fail if the skills repo references support engines or Hawk private packages
boundary-guard: ## Fail if the skills repo references support engines or Graycode private packages
bash ./scripts/check-consumer-boundaries.sh

lint: ## Run Ruff over all repository Python code
Expand Down
2 changes: 1 addition & 1 deletion NOTICE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
starling
graycode-skills
Copyright (c) 2026 GrayCode AI

This product is licensed under the MIT License (see LICENSE).
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Graycode Community Skills

Community skill packages for [Graycode](https://github.com/GrayCodeAI/graycode-cli) — the AI coding agent. This repository contains 12,167 modular instruction packages that teach Graycode specialized workflows across 27 categories.
Community skill packages for [Graycode](https://github.com/GrayCodeAI/graycode-cli) — the AI coding agent. This repository contains 14,016 modular instruction packages that teach Graycode specialized workflows across 27 categories.

## What are Skills?

Expand Down Expand Up @@ -77,7 +77,7 @@ warning categories start at zero, and the checked-in budget must never increase.

`tools/skill_graph.py` creates the generated, uncommitted `skill-graph.json`
projection. It uses the ecosystem graph vocabulary without importing another
Hawk repository: the registry is the source of truth, while the projection adds
Graycode repository: the registry is the source of truth, while the projection adds
stable category hierarchy and cross-cutting tag relationships. Use `--limit N`
for a bounded sample and `--generated-at` for reproducible builds.

Expand Down
2 changes: 1 addition & 1 deletion categories/database/cursor-drizzle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ category: engineering
auto_invoke: false
compatibility: "node>=20 typescript>=5"
allowed_tools: "bash file_search"
agents: [hawk, claude-code, cursor]
agents: [graycode, claude-code, cursor]
invoke: "cursor:drizzle"
chain_after: [cursor-rules]
chain_enhances: [mdc-drizzle]
Expand Down
6 changes: 3 additions & 3 deletions deploy/docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
name: starling
name: graycode-skills

services:
starling:
graycode-skills:
build:
context: ../../
dockerfile: Dockerfile
image: ghcr.io/graycodeai/starling:dev
image: ghcr.io/graycodeai/graycode-skills:dev
env_file:
- path: ../../.env.example
required: false
8 changes: 4 additions & 4 deletions manifest-schema.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# starling manifest schema
# graycode-skills manifest schema
#
# Every skill in this registry MUST include a SKILL.md file with YAML
# frontmatter that conforms to this schema. The schema is expressed in TOML
Expand Down Expand Up @@ -132,14 +132,14 @@ description = "Name of the skill that replaces this one. Only meaningful when de
# ── Agent Skills Spec (agentskills.io) ────────────────────────────────────────
# The following fields implement the agentskills.io specification for
# cross-agent skill interoperability. They are optional but strongly
# recommended for skills that should work across hawk, Claude Code,
# recommended for skills that should work across graycode, Claude Code,
# Codex, and other agent runtimes.

[fields.category]
type = "string"
required = false
enum = ["engineering", "ops", "testing", "security", "devtools", "workflow"]
description = "Agent Skills spec category. Maps to hawk's SmartSkill.Category field."
description = "Agent Skills spec category. Maps to graycode's SmartSkill.Category field."

[fields.auto_invoke]
type = "boolean"
Expand All @@ -162,7 +162,7 @@ description = "Space-separated list of pre-approved tool names. Maps to SmartSki
type = "array"
items.type = "string"
required = false
description = "Cross-agent compatibility list (e.g. ['hawk', 'claude-code', 'codex']). Maps to SmartSkill.Agents."
description = "Cross-agent compatibility list (e.g. ['graycode', 'claude-code', 'codex']). Maps to SmartSkill.Agents."

[fields.invoke]
type = "string"
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "starling"
name = "graycode-skills"
version = "0.0.1"
description = "Community skill packages for Graycode"
requires-python = ">=3.13"
Expand Down
2 changes: 1 addition & 1 deletion scripts/validate-skill-manifest.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
}

AGENT_ENUM = {
"hawk",
"graycode",
"claude-code",
"codex",
"cursor",
Expand Down
12 changes: 6 additions & 6 deletions setup
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail

# Universal installer for starling
# Universal installer for graycode-skills
# Detects agent host and symlinks skills into the correct location.

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
Expand All @@ -11,7 +11,7 @@ RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'

usage() {
echo "Usage: ./setup [OPTIONS]"
echo " --host <agent> Target: hawk, claude, cursor, codex (auto-detected)"
echo " --host <agent> Target: graycode, claude, cursor, codex (auto-detected)"
echo " --scope <scope> user (default) or project"
echo " --categories <list> Comma-separated categories (default: all)"
echo " --help Show this help"
Expand All @@ -30,20 +30,20 @@ while [[ $# -gt 0 ]]; do
done

if [[ ! -d "$SCRIPT_DIR/categories" ]]; then
echo -e "${RED}Error: Run from starling repo root${NC}"; exit 1
echo -e "${RED}Error: Run from graycode-skills repo root${NC}"; exit 1
fi

detect_host() {
[[ -d "$HOME/.hawk" ]] && echo "hawk" && return
[[ -d "$HOME/.graycode" ]] && echo "graycode" && return
[[ -d "$HOME/.claude" ]] && echo "claude" && return
[[ -d "$HOME/.cursor" ]] && echo "cursor" && return
echo "hawk"
echo "graycode"
}

[[ -z "$HOST" ]] && HOST=$(detect_host) && echo -e "${YELLOW}Auto-detected host: ${HOST}${NC}"

case "$HOST" in
hawk) TARGET="${SCOPE:+.hawk/skills}"; [[ "$SCOPE" == "user" ]] && TARGET="$HOME/.hawk/skills" ;;
graycode) TARGET="${SCOPE:+.graycode/skills}"; [[ "$SCOPE" == "user" ]] && TARGET="$HOME/.graycode/skills" ;;
claude) TARGET="${SCOPE:+.claude/skills}"; [[ "$SCOPE" == "user" ]] && TARGET="$HOME/.claude/skills" ;;
cursor) TARGET="${SCOPE:+.cursor/plugins}"; [[ "$SCOPE" == "user" ]] && TARGET="$HOME/.cursor/plugins" ;;
codex) TARGET="${SCOPE:+.codex/plugins}"; [[ "$SCOPE" == "user" ]] && TARGET="$HOME/.codex/plugins" ;;
Expand Down
14 changes: 7 additions & 7 deletions tests/test_sync_marketplace.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def marketplace_env(tmp_path: Path):
marketplace = plugin_dir / "marketplace.json"
marketplace.write_text(
json.dumps(
{"plugins": [{"name": "starling", "skills": []}]},
{"plugins": [{"name": "graycode-skills", "skills": []}]},
indent=2,
)
+ "\n",
Expand Down Expand Up @@ -110,7 +110,7 @@ def test_syncs_single_skill(self, marketplace_env: tuple):
---
name: code-review
description: Reviews code
invoke: /hawk:code-review
invoke: /graycode:code-review
---

Body.
Expand All @@ -129,21 +129,21 @@ def test_syncs_single_skill(self, marketplace_env: tuple):
assert len(skills) == 1
assert skills[0]["name"] == "code-review"
assert skills[0]["path"] == "categories/python/code-review"
assert skills[0]["invoke"] == "/hawk:code-review"
assert skills[0]["invoke"] == "/graycode:code-review"

def test_syncs_multiple_skills_across_categories(self, marketplace_env: tuple):
repo, marketplace = marketplace_env
_create_skill(
repo,
"python",
"skill-a",
"---\nname: skill-a\ndescription: A\ninvoke: /hawk:a\n---\n\nBody.\n",
"---\nname: skill-a\ndescription: A\ninvoke: /graycode:a\n---\n\nBody.\n",
)
_create_skill(
repo,
"devops",
"skill-b",
"---\nname: skill-b\ndescription: B\ninvoke: /hawk:b\n---\n\nBody.\n",
"---\nname: skill-b\ndescription: B\ninvoke: /graycode:b\n---\n\nBody.\n",
)

with (
Expand Down Expand Up @@ -180,7 +180,7 @@ def test_sorted_output(self, marketplace_env: tuple):
assert paths[0] == "categories/a-cat/zzz-skill"
assert paths[1] == "categories/z-cat/aaa-skill"

def test_missing_invoke_defaults_to_hawk_prefix(self, marketplace_env: tuple):
def test_missing_invoke_defaults_to_graycode_prefix(self, marketplace_env: tuple):
repo, marketplace = marketplace_env
_create_skill(
repo,
Expand All @@ -198,7 +198,7 @@ def test_missing_invoke_defaults_to_hawk_prefix(self, marketplace_env: tuple):

data = json.loads(marketplace.read_text())
skills = data["plugins"][0]["skills"]
assert skills[0]["invoke"] == "/hawk:my-tool"
assert skills[0]["invoke"] == "/graycode:my-tool"

def test_name_from_frontmatter_over_directory(self, marketplace_env: tuple):
"""If frontmatter has a name, use it instead of the directory name."""
Expand Down
2 changes: 1 addition & 1 deletion tools/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""starling tooling package.
"""graycode-skills tooling package.

Contains validation, registry, and migration utilities for the community
skills repository.
Expand Down
2 changes: 1 addition & 1 deletion tools/content_validation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Content/body validation for starling SKILL.md files.
"""Content/body validation for graycode-skills SKILL.md files.

Checks that the markdown body after frontmatter contains required sections
and follows expected formatting conventions.
Expand Down
Loading