{"id":47115443,"url":"https://github.com/pulseengine/temper","last_synced_at":"2026-03-12T18:58:26.010Z","repository":{"id":337671345,"uuid":"1154215655","full_name":"pulseengine/temper","owner":"pulseengine","description":"Temper — GitHub App that hardens repositories to organizational standards","archived":false,"fork":false,"pushed_at":"2026-03-01T14:12:11.000Z","size":403,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-01T15:57:09.816Z","etag":null,"topics":["github-app","pulseengine","repository-management","rust"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/pulseengine.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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-02-10T06:12:55.000Z","updated_at":"2026-03-01T14:02:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pulseengine/temper","commit_stats":null,"previous_names":["pulseengine/temper"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/pulseengine/temper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Ftemper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Ftemper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Ftemper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Ftemper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pulseengine","download_url":"https://codeload.github.com/pulseengine/temper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pulseengine%2Ftemper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30439122,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T14:34:45.044Z","status":"ssl_error","status_checked_at":"2026-03-12T14:09:33.793Z","response_time":114,"last_error":"SSL_read: 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":["github-app","pulseengine","repository-management","rust"],"created_at":"2026-03-12T18:58:25.230Z","updated_at":"2026-03-12T18:58:26.004Z","avatar_url":"https://github.com/pulseengine.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Temper\n\n\u003csup\u003eGitHub App that hardens repositories to organizational standards\u003c/sup\u003e\n\n\u0026nbsp;\n\n![Node.js](https://img.shields.io/badge/Node.js-339933?style=flat-square\u0026logo=node.js\u0026logoColor=white\u0026labelColor=1a1b27)\n![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=flat-square\u0026labelColor=1a1b27)\n\n\u0026nbsp;\n\n![Dashboard](docs/screenshots/dashboard.jpeg)\n\n\u003c/div\u003e\n\n\u0026nbsp;\n\nA Probot v14 GitHub App that automatically configures repositories to match\norganization standards. It enforces merge settings, branch protection rules,\nissue labels, PR/issue templates, CODEOWNERS, Dependabot configuration,\nsigned-commit merge strategies, and AI-powered PR reviews — across every\nrepository in your GitHub organization.\n\n\u003e [!NOTE]\n\u003e Part of the PulseEngine toolchain. Enforces PulseEngine organizational standards across all repositories.\n\n## Features\n\n- **Auto-configure new repositories** — applies full configuration on `repository.created` events\n- **Branch protection** — enforces required reviews, status checks, signed commits, and linear history\n- **Issue labels** — synchronizes a standard label set (create, update, delete) across all repos\n- **PR and issue templates** — pushes PR templates, issue templates, and CODEOWNERS into target repos\n- **Dependabot configuration** — applies `dependabot.yml` and fixes missing PR labels\n- **Signed-commit merge strategy** — temporarily enables merge commits to preserve GPG signatures, then auto-reverts\n- **AI-powered PR review** — sends diffs to a local OpenAI-compatible endpoint with smart file prioritization (source code first, lockfiles/generated files excluded) and stale review superseding on force-push\n- **Auto-merge for bots** — automatically enables auto-merge on Dependabot and configured bot PRs\n- **Organization-wide sync** — bulk-apply configuration to every repo in the org\n- **ChatOps commands** — 9 slash commands for on-demand configuration and diagnostics\n- **Fork-aware settings** — separate merge and branch-protection overrides for forked repositories\n- **PR-based changes** — optionally applies file changes via pull requests instead of direct commits\n- **Idempotent webhook processing** — deduplicates delivery IDs to prevent duplicate work\n- **Retry with backoff** — exponential backoff with jitter for transient GitHub API errors\n\n## Dashboard\n\nTemper includes a built-in operations dashboard for monitoring compliance and\nactivity across your organization. The dashboard provides:\n\n- Organization-wide compliance score with per-repo breakdown\n- Repository health cards — branch protection, signed commits, CI status, merge settings, labels\n- Active pull request tracker with check status, labels, and age\n- Signal feed for real-time webhook events and configuration drift\n\nAccess the dashboard at `/dashboard` when running with the standalone HTTP handler.\n\n## Quick Start\n\n1. **Register a GitHub App** at `https://github.com/settings/apps/new` with\n   repository (Contents, Issues, Pull Requests, Metadata) and organization\n   (Members, Metadata) permissions. Subscribe to `repository`, `issue_comment`,\n   and `pull_request` events.\n\n2. **Clone and bootstrap:**\n\n   ```bash\n   git clone https://github.com/pulseengine/temper.git\n   cd temper\n   npm install\n   npm run setup    # interactive wizard to configure org, username, email\n   ```\n\n   Or non-interactively:\n\n   ```bash\n   npm run setup -- --org myorg --user myuser --email me@example.com\n   ```\n\n3. **Configure environment variables:**\n\n   ```bash\n   cp .env.example .env\n   # Edit .env with your GitHub App credentials (APP_ID, PRIVATE_KEY, WEBHOOK_SECRET)\n   ```\n\n4. **Run:**\n\n   ```bash\n   npm start        # production\n   npm run dev      # development (auto-reload via nodemon)\n   ```\n\n   The server listens on port 3000 (configurable via `PORT`) and exposes\n   `POST /api/github/webhooks`, `GET /health`, and `GET /webhook`.\n\n## ChatOps Commands\n\nComment on any issue or pull request to trigger a command. The commenter must\nbe an organization member.\n\n| Command | Description |\n|---------|-------------|\n| `/configure-repo` | Apply full repository configuration (merge settings, branch protection, labels, templates, Dependabot) |\n| `/sync-all-repos` | Synchronize configuration across all repositories in the organization |\n| `/check-config` | Generate a configuration report for the current repository |\n| `/check-dependabot` | Check Dependabot configuration and PR label compliance |\n| `/fix-dependabot-labels` | Add missing labels to open Dependabot PRs |\n| `/analyze-org` | Generate a full organization analysis report (creates a new issue) |\n| `/check-merge-strategy` | Analyze a PR's merge strategy and signed-commit status |\n| `/allow-merge-commit` | Temporarily enable merge commits for signed-commit preservation (admin-only, auto-reverts after timeout) |\n| `/review-pr` | Trigger an AI-powered code review (requires `ai_review.enabled: true`; PR only) |\n\n## Configuration\n\nAll behavior is controlled by [`config.yml`](config.yml). Key sections:\n\n| Section | Purpose |\n|---------|---------|\n| `organization` | Target GitHub organization |\n| `settings.merge` | Default merge strategy (rebase-only by default) |\n| `forks.merge` | Overridden merge settings for forked repos |\n| `branch_protection` | Branch protection rules and fork overrides |\n| `issue_labels` | Standard labels to synchronize |\n| `pull_request_rules` | Required reviews, status checks |\n| `signed_commit_strategy` | Merge-commit override for signed commits |\n| `dependabot` | Dependabot v2 configuration to push to repos |\n| `change_strategy` | PR-based vs. direct-commit change application |\n| `templates` / `codeowners` | PR/issue templates and CODEOWNERS paths |\n| `ai_review` | AI review endpoint, model, prompt, and limits |\n| `auto_merge` | Auto-merge rules for Dependabot and bot PRs |\n\nSee the file itself for the full schema and defaults.\n\n## Development\n\nSee [DEVELOPMENT.md](DEVELOPMENT.md) for the full development guide.\n\n## Deployment\n\n- **Docker** — `npm run deploy:docker` builds and pushes a multi-stage Alpine image\n- **Heroku** — `npm run deploy:heroku` pushes to Heroku via git\n- **PM2** — `npm run deploy:server` starts or restarts the app under PM2\n- **Netcup** — `npm run deploy:netcup` installs production dependencies for shared hosting\n\n## License\n\n[MIT](LICENSE)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n\u003csub\u003ePart of \u003ca href=\"https://github.com/pulseengine\"\u003ePulseEngine\u003c/a\u003e \u0026mdash; formally verified WebAssembly toolchain for safety-critical systems\u003c/sub\u003e\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpulseengine%2Ftemper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpulseengine%2Ftemper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpulseengine%2Ftemper/lists"}