{"id":48371985,"url":"https://github.com/liqunchen0606/skillforge","last_synced_at":"2026-04-05T17:01:20.260Z","repository":{"id":348846606,"uuid":"1196327647","full_name":"LiqunChen0606/skillforge","owner":"LiqunChen0606","description":"SkillForge — Semantic document compiler \u0026 AI skill toolkit. 12+ output formats. 22% fewer tokens than Markdown with full semantic types. Skills in LML improve LLM compliance by 10pp.","archived":false,"fork":false,"pushed_at":"2026-04-03T03:15:59.000Z","size":1150,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-03T12:29:34.739Z","etag":null,"topics":["ai-native","claude","codex","document-compiler","llm","rust","semantic-format","skill-authoring","token-efficient"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LiqunChen0606.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-30T15:37:12.000Z","updated_at":"2026-04-03T03:16:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/LiqunChen0606/skillforge","commit_stats":null,"previous_names":["liqunchen0606/skillforge"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/LiqunChen0606/skillforge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiqunChen0606%2Fskillforge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiqunChen0606%2Fskillforge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiqunChen0606%2Fskillforge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiqunChen0606%2Fskillforge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LiqunChen0606","download_url":"https://codeload.github.com/LiqunChen0606/skillforge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiqunChen0606%2Fskillforge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31442924,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T15:22:31.103Z","status":"ssl_error","status_checked_at":"2026-04-05T15:22:00.205Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-native","claude","codex","document-compiler","llm","rust","semantic-format","skill-authoring","token-efficient"],"created_at":"2026-04-05T17:01:19.589Z","updated_at":"2026-04-05T17:01:20.237Z","avatar_url":"https://github.com/LiqunChen0606.png","language":"Rust","readme":"# SkillForge\n\n### The quality layer for SKILL.md — lint, sign, test your [Agent Skills](https://agentskills.io)\n\n\u003e **SkillForge** is `eslint` / `rubocop` for AI skill files. Catch missing sections, empty steps, malformed metadata, prompt-injection patterns, and broken references **before** you deploy the skill. Sign skills with Ed25519 so consumers can detect tampering. Test skill compliance in CI with a JUnit report.\n\n[![PyPI](https://img.shields.io/pypi/v/aif-skillforge?label=PyPI\u0026color=blue)](https://pypi.org/project/aif-skillforge/)\n![License](https://img.shields.io/badge/License-Apache--2.0%20%7C%20MIT-lightgrey)\n![Agent Skills](https://img.shields.io/badge/Compatible-agentskills.io-blueviolet)\n\n---\n\n## 60-second quick start\n\n```bash\npip install aif-skillforge\naif check SKILL.md       # lint + security scan\naif score SKILL.md       # letter grade (A+..F) with shareable badge\n```\n\nThat's it. Output:\n\n```\nSkillForge Quality Check: SKILL.md\n============================================================\n  [+] Parsed SKILL.md (1 skill block)\n  [+] Skill: code-review v1.0\n  [+] Lint: 7/7 checks passed\n  [+] Document lint: 10/10 checks passed\n------------------------------------------------------------\nPASS — SKILL.md is clean\n```\n\n## What it checks\n\n**7 structural lint checks** — the things a reviewer would reject:\n\n| Check | Catches |\n|---|---|\n| Frontmatter | Missing `name` or `description` |\n| RequiredSections | No `@step` or `@verify` block — skill is aspirational |\n| DescriptionLength | Description \u003e 1024 chars (won't fit in context routing) |\n| NameFormat | Invalid chars in skill name |\n| NoEmptyBlocks | Placeholder steps / verify blocks that were never filled in |\n| BlockTypes | Non-skill content mixed into the skill block |\n| VersionHash | Hash doesn't match content (tampered, or stale) |\n\n**6 security checks** (OWASP Agentic Skills Top 10 aligned):\n\n| Rule | Catches |\n|---|---|\n| prompt-injection | \"Ignore previous instructions\" patterns |\n| hidden-unicode | Zero-width characters, direction overrides |\n| dangerous-tool | `eval`, `exec`, `rm -rf`, unrestricted shell |\n| external-fetch | `curl url \\| bash` style remote execution |\n| privilege-escalation | `sudo`, admin requests, role manipulation |\n| data-exfiltration | Credential-harvesting patterns |\n\nRun `aif scan SKILL.md` for security-only output.\n\n## Grade your skill with a shareable badge\n\n```bash\naif score my-skill.md\n```\n\nOutput:\n\n```\nSkillForge Score: my-skill.md\n============================================================\n  Score:  100/100  (A+)\n  Lint:   0 errors, 0 warnings\n  Security: 0 critical, 0 high, 0 medium, 0 low\n------------------------------------------------------------\nGrade: A+\n```\n\nAdd a badge to your skill's README:\n\n```bash\n# Generate a Shields.io endpoint file, commit it to your repo\naif score my-skill.md --format shields -o badge.json\ngit add badge.json \u0026\u0026 git commit -m \"add skillforge badge\"\n```\n\nThen in your README:\n\n```markdown\n![SkillForge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/USER/REPO/main/badge.json)\n```\n\nThe badge auto-updates when you re-run `aif score` and re-commit the JSON. Grade mapping: A+ (97-100), A (93-96), A- (90-92), B+ (87-89), B (83-86), B- (80-82), C+ (77-79), C (73-76), C- (70-72), D (60-69), F (\u003c60). An A+ means all 10 lint checks pass and zero security findings; an F means a critical security finding or multiple lint errors.\n\nAlso available: `--format svg` for a standalone SVG badge, `--format json` for CI integration, and `--min-grade C` to fail the command if the grade drops below a threshold.\n\n## Install it once, run it everywhere\n\n### Pre-commit hook\n\nAdd to `.pre-commit-config.yaml`:\n\n```yaml\nrepos:\n  - repo: https://github.com/LiqunChen0606/skillforge\n    rev: v0.6.4\n    hooks:\n      - id: aif-check\n```\n\nNow every commit that touches `SKILL.md` or `*.aif` gets linted automatically.\n\n### GitHub Actions\n\n`.github/workflows/skill-lint.yml`:\n\n```yaml\non: [push, pull_request]\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: LiqunChen0606/skillforge@v0.6.4\n        with:\n          path: ./skills\n```\n\nPRs that break skill quality fail CI before merge.\n\n### Claude Code plugin\n\nAdd to your `~/.claude/settings.json`:\n\n```json\n{\n  \"extraKnownMarketplaces\": {\n    \"skillforge-marketplace\": {\n      \"source\": {\n        \"source\": \"url\",\n        \"url\": \"https://github.com/LiqunChen0606/skillforge.git\"\n      }\n    }\n  },\n  \"enabledPlugins\": {\n    \"skillforge@skillforge-marketplace\": true\n  }\n}\n```\n\nOr via slash commands (if your Claude Code version supports them):\n\n```\n/plugin marketplace add LiqunChen0606/skillforge\n/plugin install skillforge@skillforge-marketplace\n```\n\nThen from any Claude Code session:\n\n```\n/lint-skill my-skill.md\n/scan-skill my-skill.md\n/sign-skill my-skill.md\n/verify-skill my-skill.md\n```\n\n## Sign skills for tamper detection\n\nWhen you publish a skill, sign it. Consumers verify.\n\n```bash\naif skill keygen                                        # Generate Ed25519 keypair (one time)\naif skill sign my-skill.aif --key ~/.aif/private.key    # Sign\naif skill verify-signature my-skill.aif \\\n    --signature \u003csig\u003e --pubkey ~/.aif/public.key\n```\n\nAny byte change to the skill file invalidates the signature. Useful when skills come from untrusted marketplaces.\n\n## Test skill compliance in CI\n\n```bash\naif skill test my-skill.aif --format junit -o test-results.xml\n```\n\nEmits standard JUnit XML that GitHub Actions, Jenkins, CircleCI, etc. all display natively. Add `--baseline baseline.json` to catch regressions vs. a saved baseline.\n\n## Python API\n\n```python\nimport skillforge\n\n# Lint\nresults = skillforge.lint(open(\"my-skill.aif\").read())\n# Security scan\nfindings = skillforge.scan(open(\"my-skill.aif\").read())\n# Sign / verify\npriv, pub = skillforge.generate_keypair()\nsig = skillforge.sign_skill(open(\"my-skill.aif\").read(), priv)\n```\n\nFull walkthrough: [tutorial/skillforge_tutorial.ipynb](tutorial/skillforge_tutorial.ipynb).\n\n---\n\n## What SkillForge is NOT trying to be\n\n- **Not a skill runtime** — it lints and signs, it doesn't execute skills\n- **Not an LLM framework** — pairs with Claude Code, Cursor, any SKILL.md consumer\n- **Not a replacement for SKILL.md** — works directly on your existing Markdown files\n\n## Why this exists\n\nThe [Agent Skills standard](https://agentskills.io) is adopted by 30+ platforms, and skills are proliferating fast. Nobody has linting, signing, or CI for them. A broken skill doesn't throw errors — it just quietly makes your agent behave wrong. SkillForge fixes that.\n\n---\n\n## Research \u0026 advanced features\n\nSkillForge is built on **AIF** (AI-native Interchange Format), a typed semantic IR for documents. The quality tools above are the production-ready surface. The underlying format has additional capabilities documented separately:\n\n- **[AIF document format](docs/aif-format.md)** — typed blocks (`@claim`, `@evidence`, `@step`, `@red_flag`), HTML/PDF/Markdown import, LML output modes for LLM consumption\n- **[Skill execution benchmark](benchmarks/skill-execution/)** — measures whether typed formats improve LLM compliance (spoiler: +4pp overall on 126 runs, claude-opus-4-6)\n- **[Token comparison benchmark](benchmarks/document-tokens/)** — honest size comparison across raw HTML, cleaned text, Markdown, AIF LML (10 Wikipedia articles)\n- **[Roundtrip tutorial](tutorial/skillforge_roundtrips.ipynb)** — HTML/Markdown/PDF → AIF → format with fidelity checks on live Wikipedia data\n\nThese are research / power-user capabilities. The 60-second quick start above is the supported path.\n\n---\n\n## License\n\nDual-licensed under Apache 2.0 OR MIT.\n\n## Contributing\n\nIssues and PRs welcome. If you're using SkillForge in production, a star on GitHub helps. If something's broken, file an issue — single-author project, fast turnaround.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliqunchen0606%2Fskillforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliqunchen0606%2Fskillforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliqunchen0606%2Fskillforge/lists"}