Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
5eed274
atmos skills
aknysh Feb 27, 2026
c7ff02c
Add Atmos agent skills for AI-powered development tools
aknysh Feb 27, 2026
6a3bfa1
atmos skills
aknysh Feb 27, 2026
316d07b
Add 7 new agent skills: helmfile, packer, ansible, auth, stores, sche…
aknysh Feb 27, 2026
38ff655
Move agent skills from .claude/skills/ to agent-skills/ for tool-agno…
aknysh Feb 27, 2026
5f1f4e3
Add website docs, blog post, and roadmap update for AI agent skills
aknysh Feb 27, 2026
3bc4cd4
atmos skills
aknysh Feb 27, 2026
07e1817
atmos skills
aknysh Feb 27, 2026
2ac09fb
atmos skills
aknysh Feb 28, 2026
81cc5bf
address comments
aknysh Feb 28, 2026
c084114
address comments
aknysh Feb 28, 2026
4b5555a
address comments
aknysh Feb 28, 2026
252c988
address comments
aknysh Feb 28, 2026
82eedeb
Add CI workflow to validate agent skills structure and size
aknysh Mar 1, 2026
1c19258
Restructure agent-skills for Claude Code plugin marketplace distribution
aknysh Mar 1, 2026
d20269c
Fix AI tool integration instructions and AGENTS.md path resolution
aknysh Mar 1, 2026
f215bd4
Fix CI: remove dead link and update redirecting URLs in PRD
aknysh Mar 1, 2026
8b52db5
Merge branch 'main' into aknysh/atmos-skills
aknysh Mar 1, 2026
bbddd13
Merge branch 'main' into aknysh/atmos-skills
aknysh Mar 2, 2026
0dd1f52
Move AI tool setup instructions to /projects/setup-editor/ai-assistants
aknysh Mar 2, 2026
72678ea
update docs
aknysh Mar 2, 2026
5a92a28
refactor skills
aknysh Mar 2, 2026
043a886
refactor skills
aknysh Mar 2, 2026
b30dab0
refactor skills
aknysh Mar 2, 2026
31c1f5c
refactor skills
aknysh Mar 2, 2026
daa29ca
refactor skills
aknysh Mar 2, 2026
f67d798
refactor skills
aknysh Mar 2, 2026
06083cf
Merge branch 'main' into aknysh/atmos-skills
aknysh Mar 3, 2026
010a2f6
Merge branch 'main' into aknysh/atmos-skills
aknysh Mar 3, 2026
ecb3164
Merge branch 'main' into aknysh/atmos-skills
aknysh Mar 3, 2026
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
29 changes: 29 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "cloudposse",
"owner": {
"name": "Cloud Posse",
"email": "opensource@cloudposse.com"
},
"metadata": {
"description": "Official Atmos plugins and skills for Claude Code",
"version": "1.0.0",
"pluginRoot": "./agent-skills"
},
"plugins": [
{
"name": "atmos",
"source": ".",
"description": "Atmos skills for AI coding assistants: Terraform/Helmfile/Packer/Ansible orchestration, stack configuration, components, vendoring, validation, YAML functions, Go templates, authentication, stores, workflows, and design patterns.",
"version": "1.0.0",
Comment thread
aknysh marked this conversation as resolved.
"author": {
"name": "Cloud Posse"
},
"homepage": "https://atmos.tools/integrations/ai/agent-skills",
"repository": "https://github.com/cloudposse/atmos",
"license": "Apache-2.0",
"keywords": ["atmos", "terraform", "infrastructure", "iac", "devops", "cloud"],
"category": "integration",
"strict": false
}
]
}
1 change: 1 addition & 0 deletions .claude/skills/atmos-ansible
1 change: 1 addition & 0 deletions .claude/skills/atmos-auth
1 change: 1 addition & 0 deletions .claude/skills/atmos-components
1 change: 1 addition & 0 deletions .claude/skills/atmos-config
1 change: 1 addition & 0 deletions .claude/skills/atmos-custom-commands
1 change: 1 addition & 0 deletions .claude/skills/atmos-design-patterns
1 change: 1 addition & 0 deletions .claude/skills/atmos-devcontainer
1 change: 1 addition & 0 deletions .claude/skills/atmos-gitops
1 change: 1 addition & 0 deletions .claude/skills/atmos-helmfile
1 change: 1 addition & 0 deletions .claude/skills/atmos-introspection
1 change: 1 addition & 0 deletions .claude/skills/atmos-packer
1 change: 1 addition & 0 deletions .claude/skills/atmos-schemas
1 change: 1 addition & 0 deletions .claude/skills/atmos-stacks
1 change: 1 addition & 0 deletions .claude/skills/atmos-stores
1 change: 1 addition & 0 deletions .claude/skills/atmos-templates
1 change: 1 addition & 0 deletions .claude/skills/atmos-terraform
1 change: 1 addition & 0 deletions .claude/skills/atmos-toolchain
1 change: 1 addition & 0 deletions .claude/skills/atmos-validation
1 change: 1 addition & 0 deletions .claude/skills/atmos-vendoring
1 change: 1 addition & 0 deletions .claude/skills/atmos-workflows
1 change: 1 addition & 0 deletions .claude/skills/atmos-yaml-functions
212 changes: 212 additions & 0 deletions .github/workflows/validate-agent-skills.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
name: Validate Agent Skills

on:
push:
branches: [main]
paths:
- "agent-skills/**"
- ".claude-plugin/**"
pull_request:
branches: [main]
paths:
- "agent-skills/**"
- ".claude-plugin/**"

jobs:
validate-skills:
name: Validate agent skills structure and size
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Validate AGENTS.md exists
run: |
if [ ! -f "agent-skills/AGENTS.md" ]; then
echo "::error::Missing agent-skills/AGENTS.md"
exit 1
fi
echo "AGENTS.md exists"

- name: Validate plugin directory structure
run: |
ERRORS=0
if [ ! -f "agent-skills/.claude-plugin/plugin.json" ]; then
echo "::error::Missing agent-skills/.claude-plugin/plugin.json"
ERRORS=$((ERRORS + 1))
fi
if [ ! -d "agent-skills/skills" ]; then
echo "::error::Missing agent-skills/skills/ directory"
ERRORS=$((ERRORS + 1))
fi
if [ $ERRORS -gt 0 ]; then
echo "Found $ERRORS plugin structure error(s)"
exit 1
fi
echo "Plugin directory has correct structure"

- name: Validate marketplace.json exists
run: |
if [ ! -f ".claude-plugin/marketplace.json" ]; then
echo "::error::Missing .claude-plugin/marketplace.json"
exit 1
fi
echo "marketplace.json exists"

- name: Validate SKILL.md frontmatter
run: |
ERRORS=0
while IFS= read -r -d '' f; do
FIRST_LINE=$(head -1 "$f")
if [ "$FIRST_LINE" != "---" ]; then
echo "::error file=$f::Missing frontmatter delimiter (first line must be ---)"
ERRORS=$((ERRORS + 1))
fi
if ! grep -q "^name:" "$f"; then
echo "::error file=$f::Missing required 'name:' field in frontmatter"
ERRORS=$((ERRORS + 1))
fi
if ! grep -q "^description:" "$f"; then
echo "::error file=$f::Missing required 'description:' field in frontmatter"
ERRORS=$((ERRORS + 1))
fi
done < <(find agent-skills -name "SKILL.md" -print0)
if [ $ERRORS -gt 0 ]; then
echo "Found $ERRORS SKILL.md validation error(s)"
exit 1
fi
echo "All SKILL.md files have valid frontmatter"

- name: Validate skill directories contain SKILL.md
run: |
ERRORS=0
while IFS= read -r -d '' dir; do
SKILL_NAME=$(basename "$dir")
if [[ "$SKILL_NAME" == atmos-* ]] && [ ! -f "$dir/SKILL.md" ]; then
echo "::error::Missing SKILL.md in $dir"
ERRORS=$((ERRORS + 1))
fi
done < <(find agent-skills/skills -mindepth 1 -maxdepth 1 -type d -print0)
if [ $ERRORS -gt 0 ]; then
echo "Found $ERRORS missing SKILL.md file(s)"
exit 1
fi
echo "All skill directories contain SKILL.md"

- name: Check SKILL.md line count (max 500 lines per spec)
run: |
# Agent Skills spec recommends SKILL.md under 500 lines
# https://agentskills.io/specification#progressive-disclosure
MAX_LINES=500
ERRORS=0
while IFS= read -r -d '' f; do
LINES=$(wc -l < "$f")
if [ "$LINES" -gt "$MAX_LINES" ]; then
echo "::error file=$f::$LINES lines exceeds ${MAX_LINES}-line limit. Move detailed content to references/"
ERRORS=$((ERRORS + 1))
elif [ "$LINES" -gt 450 ]; then
echo "::warning file=$f::$LINES lines, approaching ${MAX_LINES}-line limit"
fi
done < <(find agent-skills -name "SKILL.md" -print0)
if [ $ERRORS -gt 0 ]; then
echo "Found $ERRORS SKILL.md file(s) exceeding the ${MAX_LINES}-line limit"
exit 1
fi
echo "All SKILL.md files are within the ${MAX_LINES}-line limit"

- name: Check file sizes (max 20KB for SKILL.md, max 25KB for references)
run: |
# Agent Skills spec recommends < 5000 tokens for SKILL.md body (~20KB)
# Reference files are loaded on demand so get a slightly higher limit
SKILL_MAX=20480 # 20KB for SKILL.md
REF_MAX=25600 # 25KB for reference files
SKILL_WARN=18432 # 18KB warning threshold
REF_WARN=23552 # 23KB warning threshold
ERRORS=0

# Check SKILL.md files
while IFS= read -r -d '' f; do
SIZE=$(wc -c < "$f")
if [ "$SIZE" -gt "$SKILL_MAX" ]; then
echo "::error file=$f::${SIZE} bytes exceeds ${SKILL_MAX}-byte limit. Move detailed content to references/"
ERRORS=$((ERRORS + 1))
elif [ "$SIZE" -gt "$SKILL_WARN" ]; then
echo "::warning file=$f::${SIZE} bytes, approaching ${SKILL_MAX}-byte limit"
fi
done < <(find agent-skills -name "SKILL.md" -print0)

# Check reference files
while IFS= read -r -d '' f; do
SIZE=$(wc -c < "$f")
if [ "$SIZE" -gt "$REF_MAX" ]; then
echo "::error file=$f::${SIZE} bytes exceeds ${REF_MAX}-byte limit. Split into smaller reference files"
ERRORS=$((ERRORS + 1))
elif [ "$SIZE" -gt "$REF_WARN" ]; then
echo "::warning file=$f::${SIZE} bytes, approaching ${REF_MAX}-byte limit"
fi
done < <(find agent-skills/skills/*/references -name "*.md" -print0 2>/dev/null)

# Check AGENTS.md (same limit as reference files)
if [ -f "agent-skills/AGENTS.md" ]; then
SIZE=$(wc -c < "agent-skills/AGENTS.md")
if [ "$SIZE" -gt "$REF_MAX" ]; then
echo "::error file=agent-skills/AGENTS.md::${SIZE} bytes exceeds ${REF_MAX}-byte limit"
ERRORS=$((ERRORS + 1))
fi
fi

if [ $ERRORS -gt 0 ]; then
echo "Found $ERRORS file(s) exceeding size limits"
exit 1
fi
echo "All skill files are within size limits"

- name: Validate code fence language tags
run: |
ERRORS=0
while IFS= read -r -d '' f; do
# Find opening code fences without language tags
# Track open/close state to skip closing fences
UNLABELED=$(awk '
/^```$/ {
if (!in_block) { print NR": "$0 }
in_block = !in_block
next
}
/^```[a-zA-Z]/ { in_block = 1; next }
/^```[^a-zA-Z]/ { print NR": "$0; next }
/^``` / { print NR": "$0; next }
' "$f")
if [ -n "$UNLABELED" ]; then
echo "::error file=$f::Unlabeled code fences found (add language tags like yaml, bash, text, json)"
echo "$UNLABELED"
ERRORS=$((ERRORS + 1))
fi
done < <(find agent-skills -name "*.md" -print0)
if [ $ERRORS -gt 0 ]; then
echo "Found $ERRORS file(s) with unlabeled code fences"
exit 1
fi
echo "All code fences have language tags"

- name: Validate plugin.json files
run: |
ERRORS=0
while IFS= read -r -d '' f; do
if ! python3 -c "import json; json.load(open('$f'))" 2>/dev/null; then
echo "::error file=$f::Invalid JSON syntax"
ERRORS=$((ERRORS + 1))
fi
done < <(find agent-skills -name "plugin.json" -print0)
# Also validate marketplace.json
if [ -f ".claude-plugin/marketplace.json" ]; then
if ! python3 -c "import json; json.load(open('.claude-plugin/marketplace.json'))" 2>/dev/null; then
echo "::error file=.claude-plugin/marketplace.json::Invalid JSON syntax"
ERRORS=$((ERRORS + 1))
fi
fi
if [ $ERRORS -gt 0 ]; then
echo "Found $ERRORS invalid JSON file(s)"
exit 1
fi
echo "All JSON manifests are valid"
13 changes: 13 additions & 0 deletions agent-skills/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "atmos",
"version": "1.0.0",
"description": "Atmos skills for AI coding assistants: Terraform/Helmfile/Packer/Ansible orchestration, stack configuration, components, vendoring, validation, YAML functions, Go templates, authentication, stores, workflows, and design patterns.",
"author": {
"name": "Cloud Posse",
"url": "https://github.com/cloudposse"
},
"homepage": "https://atmos.tools/integrations/ai/agent-skills",
"repository": "https://github.com/cloudposse/atmos",
"license": "Apache-2.0",
"keywords": ["atmos", "terraform", "infrastructure", "iac", "devops", "cloud"]
}
Loading
Loading