{"id":51601219,"url":"https://github.com/georgiosnikitas/commit-whisper","last_synced_at":"2026-07-11T22:30:23.174Z","repository":{"id":364139515,"uuid":"1261219836","full_name":"georgiosnikitas/commit-whisper","owner":"georgiosnikitas","description":"🕵️ I know what you did last commit","archived":false,"fork":false,"pushed_at":"2026-06-27T12:45:00.000Z","size":2634,"stargazers_count":4,"open_issues_count":9,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T14:20:05.896Z","etag":null,"topics":["ai","cli","code-analysis","code-metrics","command-line-tool","developer-tools","git","git-history","llm","metrics","nodejs","repository-health","terminal","typescript","version-control"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/georgiosnikitas.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":null,"dco":null,"cla":null}},"created_at":"2026-06-06T11:54:45.000Z","updated_at":"2026-06-23T21:56:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/georgiosnikitas/commit-whisper","commit_stats":null,"previous_names":["georgiosnikitas/commit-sage","georgiosnikitas/commit-whisper"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/georgiosnikitas/commit-whisper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgiosnikitas%2Fcommit-whisper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgiosnikitas%2Fcommit-whisper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgiosnikitas%2Fcommit-whisper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgiosnikitas%2Fcommit-whisper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/georgiosnikitas","download_url":"https://codeload.github.com/georgiosnikitas/commit-whisper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgiosnikitas%2Fcommit-whisper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35377012,"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-07-11T02:00:05.354Z","response_time":104,"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":["ai","cli","code-analysis","code-metrics","command-line-tool","developer-tools","git","git-history","llm","metrics","nodejs","repository-health","terminal","typescript","version-control"],"created_at":"2026-07-11T22:30:20.362Z","updated_at":"2026-07-11T22:30:23.158Z","avatar_url":"https://github.com/georgiosnikitas.png","language":"TypeScript","funding_links":["https://buymeacoffee.com/georgiosnikitas"],"categories":[],"sub_categories":[],"readme":"# commit-whisper\n\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=georgiosnikitas_commit-whisper\u0026metric=alert_status)](https://sonarcloud.io/summary/overall?id=georgiosnikitas_commit-whisper)\n[![CI](https://github.com/georgiosnikitas/commit-whisper/actions/workflows/ci.yml/badge.svg)](https://github.com/georgiosnikitas/commit-whisper/actions/workflows/ci.yml)\n[![Release](https://github.com/georgiosnikitas/commit-whisper/actions/workflows/release.yml/badge.svg?event=push)](https://github.com/georgiosnikitas/commit-whisper/actions/workflows/release.yml)\n[![npm](https://img.shields.io/npm/v/commit-whisper)](https://www.npmjs.com/package/commit-whisper)\n[![TypeScript](https://img.shields.io/badge/TypeScript-6.x-blue?logo=typescript)](https://www.typescriptlang.org/)\n[![License](https://img.shields.io/github/license/georgiosnikitas/commit-whisper)](LICENSE)\n[![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=flat\u0026logo=buy-me-a-coffee\u0026logoColor=black)](https://buymeacoffee.com/georgiosnikitas)\n\n\u003e 🕵️ **I know what you did last commit.**\n\nDeterministic git history analysis with a grounded, bring-your-own-key AI narrative — a\nterminal-native CLI.\n\ncommit-whisper analyzes a local or remote git repository, computes a catalog of deterministic\nmetrics (no AI), and — when a provider is configured — adds a grounded AI narrative and\ncoaching report. It renders to HTML, Markdown, terminal, and JSON from a single canonical\nReport JSON.\n\n\u003e Status: v1 — all seven epics delivered. See\n\u003e [docs/planning-artifacts/](docs/planning-artifacts/) for the PRD, architecture, epics, and\n\u003e UX design.\n\n## Requirements\n\n- Node.js 22 LTS or newer\n- npm (bundled with Node.js)\n- A system `git` on `PATH` (retrieval shells out to it)\n\n## 🚀 Installation\n\n### 🍺 Homebrew (macOS)\n\n```bash\nbrew trust georgiosnikitas/commit-whisper\nbrew tap georgiosnikitas/commit-whisper\nbrew install commit-whisper\n```\n\n\u003e The `brew trust` line is only required when your Homebrew enforces tap trust\n\u003e (`HOMEBREW_REQUIRE_TAP_TRUST`, available in Homebrew 6+). On a default setup you can skip\n\u003e it and run just the `brew tap` + `brew install` steps.\n\n### 📦 From npm\n\n```bash\nnpm install -g commit-whisper\n```\n\nOr run it once without installing:\n\n```bash\nnpx commit-whisper .\n```\n\n### 📦 From GitHub Packages\n\n```bash\nnpm install -g @georgiosnikitas/commit-whisper --registry=https://npm.pkg.github.com\n```\n\n\u003e **Note:** GitHub Packages requires authentication even for public packages. Add a\n\u003e [personal access token](https://github.com/settings/tokens) with `read:packages` scope\n\u003e to your `~/.npmrc`:\n\u003e\n\u003e ```\n\u003e //npm.pkg.github.com/:_authToken=YOUR_TOKEN\n\u003e ```\n\n### 💾 Prebuilt binaries (no Node.js required)\n\nSelf-contained executables for macOS, Linux, and Windows are attached to each\n[GitHub Release](https://github.com/georgiosnikitas/commit-whisper/releases).\n\nAfter installing via Homebrew, npm, GitHub Packages, or a prebuilt binary, run it from\nanywhere:\n\n```bash\ncommit-whisper .\n```\n\n### 🛠️ From source\n\n```bash\ngit clone https://github.com/georgiosnikitas/commit-whisper.git\ncd commit-whisper\nnpm install\nnpm run build\nnode dist/index.js .\n```\n\n## Getting started (development)\n\n```bash\nnpm install      # install pinned toolchain + runtime deps\nnpm run build    # bundle src/ → dist/ (tsup / esbuild)\nnpm test         # run the test suite (vitest)\n```\n\n## npm scripts\n\n| Script | Purpose |\n| --- | --- |\n| `npm run build` | Bundle `src/` to `dist/` via tsup (ESM, Node 22 target). |\n| `npm run bundle:sea` | Bundle `src/sea-entry.ts` to a single self-contained CJS file in `dist-sea/`. |\n| `npm run build:sea` | Build a Node SEA single-executable binary (see [the 7.4 spike findings](docs/implementation-artifacts/7-4-sea-packaging-spike-findings.md)). |\n| `npm test` | Run the test suite once (`vitest run`). |\n| `npm run test:watch` | Run vitest in watch mode. |\n| `npm run typecheck` | Type-check with `tsc --noEmit` (strict, nodenext). |\n| `npm run lint` | Lint with ESLint (enforces the architecture patterns). |\n\n## Project structure\n\n```\nsrc/\n├── index.ts     # entrypoint (bootstrap → cli)\n├── cli/         # CLI shell, menu, arg parsing, exit-code mapping\n├── config/      # two-phase resolver, RunConfig, the only reader of process.env\n├── retrieve/    # git clone shell-out, retrieval, temp-workspace lifecycle\n├── analyze/     # normalized model + deterministic metric functions (Groups A–F)\n├── narrate/     # AI client, reachability preflight, grounding check\n├── assemble/    # canonical Report JSON assembly + schema\n├── render/      # HTML / Markdown / Terminal / JSON renderers\n├── license/     # license validation and tier resolution\n└── shared/      # errors, ui (stderr), Secret\u003cstring\u003e, ports, types\n```\n\nOnly `cli/` and `config/` may touch `argv` / `env` / prompts; every stage from `retrieve/`\nonward receives a frozen `RunConfig` (the hexagonal boundary). These conventions are\nenforced by ESLint.\n\n## License\n\n[MIT](LICENSE) © Georgios Nikitas. The CLI and its source are MIT-licensed; paid\ntiers are enforced at runtime via an online license check (BYOK AI keys and git\ntokens stay on your machine).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgiosnikitas%2Fcommit-whisper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeorgiosnikitas%2Fcommit-whisper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgiosnikitas%2Fcommit-whisper/lists"}