{"id":51248761,"url":"https://github.com/oribarilan/97","last_synced_at":"2026-06-29T06:02:23.638Z","repository":{"id":355649087,"uuid":"1228635904","full_name":"oribarilan/97","owner":"oribarilan","description":"Agent skills distilled from the hard-won lessons of world-renowned programmers, in the spirit of \"97 Things Every Programmer Should Know\"","archived":false,"fork":false,"pushed_at":"2026-05-15T18:26:23.000Z","size":923,"stargazers_count":18,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-15T20:54:45.652Z","etag":null,"topics":["agent-skills","ai-agents","best-practices","claude-code","claude-code-plugin","claude-code-skills","coding-agents","copilot-cli","copilot-cli-plugin","opencode","opencode-plugin","programming-principles"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oribarilan.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-04T08:09:59.000Z","updated_at":"2026-05-15T18:26:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oribarilan/97","commit_stats":null,"previous_names":["oribarilan/97"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/oribarilan/97","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oribarilan%2F97","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oribarilan%2F97/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oribarilan%2F97/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oribarilan%2F97/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oribarilan","download_url":"https://codeload.github.com/oribarilan/97/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oribarilan%2F97/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34915002,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["agent-skills","ai-agents","best-practices","claude-code","claude-code-plugin","claude-code-skills","coding-agents","copilot-cli","copilot-cli-plugin","opencode","opencode-plugin","programming-principles"],"created_at":"2026-06-29T06:02:20.427Z","updated_at":"2026-06-29T06:02:23.625Z","avatar_url":"https://github.com/oribarilan.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e97\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003cstrong\u003eYour agent, on the shoulders of giants.\u003c/strong\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/oribarilan/97/actions/workflows/test.yml\"\u003e\u003cimg src=\"https://github.com/oribarilan/97/actions/workflows/test.yml/badge.svg?branch=main\" alt=\"CI\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cem\u003eEarly beta. Works on Claude Code, GitHub Copilot CLI, and OpenCode.\u003c/em\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#install\"\u003eInstall\u003c/a\u003e ·\n  \u003ca href=\"#whats-inside\"\u003eWhat's inside\u003c/a\u003e ·\n  \u003ca href=\"#does-it-work\"\u003eDoes it work?\u003c/a\u003e ·\n  \u003ca href=\"#faq\"\u003eFAQ\u003c/a\u003e ·\n  \u003ca href=\"#credits\"\u003eCredits\u003c/a\u003e ·\n  \u003ca href=\"#development\"\u003eDevelopment\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## What this is\n\nSkills your coding agent uses at the moment of decision: when it's about\nto refactor, write a test, design an API, or commit. They draw on\nFowler on refactoring, 12-factor on configuration and deploys,\nOusterhout and Liskov on API design, Nygard on resilience patterns,\nand others.\n\nThe project is named after *97 Things Every Programmer Should Know*\n(O'Reilly, ed. Kevlin Henney) and follows the same idea: one principle\nat a time, applied when it matters. Every principle is attributed to\nits original author. Principles are language-agnostic and durable.\n\n## Install\n\n*Works on Linux, macOS, and Windows. Node 18+.*\n\nThree supported harnesses. Pick the one you use.\n\n### Claude Code\n\n```\n/plugin marketplace add oribarilan/97\n/plugin install 97@97-marketplace\n```\n\nUpdates ship via the marketplace; run `/plugin update 97` when a new version is available.\n\n### GitHub Copilot CLI\n\n```sh\ncopilot plugin marketplace add oribarilan/97\ncopilot plugin install 97@97-marketplace\n```\n\nUpdates ship via the marketplace; run `copilot plugin update 97` when a new version is available.\n\n### OpenCode\n\nAdd to your OpenCode config file.\n\n```jsonc\n{\n  \"plugin\": [\n    \"97@git+https://github.com/oribarilan/97.git\"\n  ]\n}\n```\n\nRestart OpenCode. The plugin pulls the latest commit on each restart.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAdvanced: pinned install\u003c/strong\u003e\u003c/summary\u003e\n\nFor reproducible behavior across sessions, pin to a specific tag (`#vX.Y.Z`):\n\n```jsonc\n{\n  \"plugin\": [\n    \"97@git+https://github.com/oribarilan/97.git#v0.5.0\"\n  ]\n}\n```\n\n\u003c/details\u003e\n\n## What's inside\n\n| Skill | When it applies |\n|---|---|\n| `using-97` | Always — entry skill that loads the trigger map |\n| `before-you-refactor` | Considering, evaluating, or performing a refactor, restructure, cross-file rename, or cleanup |\n| `clean-code` | Writing or reviewing functions, classes, naming, or ≥3 lines of non-trivial logic (includes Single Responsibility Principle (SRP), DRY, KISS, YAGNI) |\n| `domain-modeling` | Introducing, reviewing, or renaming a top-level type/table/domain concept, or deciding where state lives |\n| `api-design` | Designing or reviewing a public API, function signature, module boundary, exported type, or any contract other code depends on (includes LSP, SRP at the boundary) |\n| `testing-discipline` | Writing or reviewing tests, designing test data, naming a test, choosing what to assert, or writing test helpers/mocks/fixtures |\n| `correctness-traps` | Writing or reviewing error handling, floating-point math, concurrent code, remote calls, singletons, hot-path data structures, or high-volume log statements |\n| `security-and-trust-boundaries` | Writing or reviewing code that parses user input, builds SQL/shell commands, handles secrets/credentials, changes auth checks, deserializes untrusted data, or constructs paths/URLs from input |\n| `observability` | Writing or reviewing request handlers, RPCs, or background jobs for production; adding tracing, metrics, or structured-log calls; or making diagnosability decisions |\n| `build-deploy-and-tooling` | Writing, reviewing, or changing build scripts, CI config, deploy pipelines, repo setup, or evaluating a new tool/dependency |\n| `self-review` | About to commit, finish a task, open a PR, summarize work, or when asked for a review or hand-off of your own work |\n| `working-with-users-and-team` | Gathering or interpreting requirements, estimating effort, or communicating with stakeholders about what to build |\n\n12 skills total: one entry skill plus 11 themed skills. Every principle\nis cited and attributed in the skill's `principles.md`.\n\n### Giants\n\nEvery principle the agent applies is attributed to its original author.\nEach skill ships a `principles.md` next to its `SKILL.md` with, per\nprinciple: the author, a link to the source (CC-BY-3.0 essay, book\nchapter, RFC, or specification as appropriate), our paraphrase, and\nhow the agent applies it.\n\nThe sources currently cited:\n\n- *97 Things Every Programmer Should Know* — Kevlin Henney (ed.) and contributors. Namesake; principles across most skills.\n- Martin Fowler — *Refactoring*. Code smells (Long Method, Primitive Obsession, and others).\n- Scott Wlaschin — *Domain Modeling Made Functional*. Make invalid states unrepresentable.\n- Michael Nygard — *Release It!* Stability patterns (circuit breaker, timeout, bulkhead, and others).\n- Adam Wiggins — *The Twelve-Factor App*. Config in the environment, build/release/run separation, and other deploy hygiene.\n- Jez Humble \u0026 David Farley — *Continuous Delivery*. Pipeline as code.\n- Steve Freeman \u0026 Nat Pryce — *Growing Object-Oriented Software, Guided by Tests*. Listen to test pain.\n- Gerard Meszaros — *xUnit Test Patterns*. Test smells (mystery guest, fragile test, and others).\n- John Ousterhout — *A Philosophy of Software Design*. Deep modules; define errors out of existence.\n- Barbara Liskov — the Liskov Substitution Principle.\n- Alexis King — [*Parse, Don't Validate*](https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/).\n- Google SRE — *Site Reliability Engineering*. The four golden signals.\n- OpenTelemetry / W3C — Trace Context, structured-log conventions.\n- Charity Majors, Liz Fong-Jones, George Miranda — *Observability Engineering*. Cardinality discipline.\n\nYou can ask the agent at any time: *\"Who wrote the principle you just\napplied, and why does it say what it says?\"* The agent will open the\nrelevant `principles.md` and tell you who wrote it, link the source,\nand explain the reasoning. 97 doubles as a reading list — the\nprinciples point back to the books and essays they came from.\n\nThe `security-and-trust-boundaries` and `observability` skills are\nmostly written for this project, drawing on sources outside *97 Things*;\nsee `CONTENT-LICENSE.md`.\n\n## Does it work?\n\nStandard coding benchmarks (e.g., SWE-bench) test\nwhether an agent produces *working* code: pass the tests, fix the bug,\nreturn the right answer. An agent can score 100% on SWE-bench with\nf-string SQL and a god-function. Those benchmarks don't measure what 97\ntargets: whether the agent writes code a senior engineer would approve.\n\nWe built a craft-quality eval instead. 11 scenarios (one per skill),\neach with a latent craft issue the skill should catch. Each scenario\nruns 15 times on two arms: with 97 and without. An independent judge\n(claude-opus-4.7) compares both diffs blindly on correctness, code\nquality, and skill-specific criteria.\n\nWith 97, agents write code that is **equal or better 77–95%** of the\ntime, and **strictly better in 62–77%** of cases, across 11 dimensions\nincluding security, observability, testing, and API design.\n\n| | Wins | Never worse |\n|---|---|---|\n| **claude-opus-4.6** | **77%** | **95%** |\n| **gpt-5.5** | **62%** | **77%** |\n\nPer-skill results — win rate with ties in parentheses:\n\n| Skill | gpt-5.5 | opus-4.6 |\n|---|---|---|\n| observability | 93% (7%) | 100% |\n| security | 87% | 27% (67%) |\n| api-design | 70% (3%) | 93% |\n| clean-code | 70% (10%) | 70% (17%) |\n| build-deploy | 67% (23%) | 100% |\n| domain-modeling | 67% (27%) | 80% (3%) |\n| working-with-users | 63% (7%) | 100% |\n| before-you-refactor | 60% (3%) | 93% (7%) |\n| self-review | 50% (3%) | 20% (80%) |\n| testing-discipline | 50% (3%) | 90% |\n| correctness-traps | 3% (77%) | 77% (20%) |\n\nThese scenarios started as an internal eval to avoid regressions and\ntrack progress across 97 versions. They're custom-built to surface\neach skill's value, not pulled from an established benchmark, but the\nresults felt worth sharing. If you know of a benchmark that would be a\ngood fit, please [open an issue](https://github.com/oribarilan/97/issues)\nand I'll run it.\n\n## FAQ\n\n### How does 97 compare to popular plugins like `superpowers` or `BMAD`?\n\nThey sit at different layers, so you can run them side by side:\n\n| Layer | Project | What it changes |\n|---|---|---|\n| **Methodology** | [`BMAD-METHOD`](https://github.com/bmad-code-org/BMAD-METHOD) | Which *role* the agent plays and which *phase* of the SDLC it's in (PM, Architect, Dev, SM…) |\n| **Process** | [`superpowers`](https://github.com/obra/superpowers) | *How* the agent works — when to plan, how to debug, when work is verified |\n| **Craft** | **`97`** | *What* makes the code good once the agent is writing — naming, API shape, error handling, testing, security |\n\nTake writing a test:\n\n- `BMAD` picks *who* on the agent team writes it (the Dev persona).\n- `superpowers/test-driven-development` decides *whether* a test gets written.\n- `97/testing-discipline` decides *what makes that test any good*.\n\n97's entry skill draws an explicit line at the superpowers boundary: process\nskills run first. `superpowers/verification-before-completion` asks *did it work*;\n`97/self-review` asks *is it well-considered*.\n\n### Where do SOLID, DRY, KISS, YAGNI live in 97?\n\nPartially, and on purpose. SRP is named twice — in `clean-code` for one-reason-to-change at unit scope, and in `api-design` for the same check at module boundaries; `before-you-refactor` carries the SRP trigger to consider a split. LSP is in `api-design`. DRY is in `clean-code`. KISS and YAGNI surface as Red Flags in `clean-code` against speculative knobs and unused hooks.\n\nOCP, ISP, and DIP are not promoted by name. The substance closest to ISP and DIP lives in `api-design` as narrow interfaces, abstractions at boundaries, and Ousterhout's deep modules. OCP is intentionally left aside — speculative extension points conflict with YAGNI. The Giants list above is built from authors and works, not from the SOLID acronym.\n\n## Credits\n\n- *97 Things Every Programmer Should Know: Collective Wisdom from the Experts*\n  — O'Reilly, ed. Kevlin Henney\n  ([book](https://www.oreilly.com/library/view/97-things-every/9780596809515/),\n  [CC-BY-3.0 source mirror](https://github.com/97-things/97-things-every-programmer-should-know))\n- Birat Rai's\n  [97-day Medium walkthrough](https://biratkirat.medium.com/97-journey-every-programmer-should-accomplish-a0c53dbbfd47)\n  of every essay (used as a reading aid)\n- [`superpowers`](https://github.com/obra/superpowers) by Jesse Vincent for the multi-harness distribution pattern\n\n## Licensing\n\n- Plugin code: MIT — see [`LICENSE`](./LICENSE).\n- Skill content: original commentary on principles drawn from the source\n  authors named above, with per-principle attribution. Unofficial work,\n  not affiliated with O'Reilly, Kevlin Henney, or any contributor. See\n  [`CONTENT-LICENSE.md`](./CONTENT-LICENSE.md) for the full policy and\n  takedown commitment.\n\n## Development\n\nWe use [`just`](https://github.com/casey/just) as the local task runner.\nRun `just` with no args to list recipes:\n\n```sh\njust            # list available recipes\njust check      # everything CI runs: lint + format-check + smoke\njust lint       # structural lint of skills/\njust format     # prettier --write on JS/JSON/YAML\n```\n\nCI uses `npm test` directly (which is the same as `just check`), so\ncontributors who prefer npm don't need to install `just`:\n\n```sh\nnpm test          # same as `just check`\nnpm run lint      # same as `just lint`\nnpm run smoke     # same as `just test`\n```\n\nOne devDependency: `prettier`. Zero runtime deps.\n\nFor the full contributor guide — repo layout, changelog discipline, release\nprocess, CI/CD, and the multi-harness adapter pattern — see\n[`CONTRIBUTE.md`](./CONTRIBUTE.md). For agent-specific conventions, see\n[`AGENTS.md`](./AGENTS.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foribarilan%2F97","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foribarilan%2F97","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foribarilan%2F97/lists"}