{"_id":"@bytesbrains/pi-contrib-gate","_rev":"6-3f1cad254b19d21046d72efac55d4d78","name":"@bytesbrains/pi-contrib-gate","dist-tags":{"latest":"1.9.1"},"versions":{"1.6.1":{"name":"@bytesbrains/pi-contrib-gate","version":"1.6.1","keywords":["pi-package","pi-extension","governance","git","conventional-commits","ci","devops"],"author":{"name":"nandal","email":"nandal@users.noreply.github.com"},"license":"MIT","_id":"@bytesbrains/pi-contrib-gate@1.6.1","maintainers":[{"name":"nandal","email":"sandeep@nandal.in"}],"homepage":"https://github.com/nandal/pi-ext/tree/main/contrib-gate","bugs":{"url":"https://github.com/nandal/pi-ext/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"87b195ae6d6c4509ce050ae82c4af1903131d44f","tarball":"https://registry.npmjs.org/@bytesbrains/pi-contrib-gate/-/pi-contrib-gate-1.6.1.tgz","fileCount":16,"integrity":"sha512-yDYf/LefejsoNtSwOLyL+ZN7fAGaQs190coR15QjEdkK5QQ4iEIYAi2wLeETJAzW/H3Gw+rXaqAJFHBotQsi2Q==","signatures":[{"sig":"MEYCIQCshloC1wruJwmrXTCbNlGwZVAYBBaP6e/XsZxd4fiXoQIhAKXUdB+GfoXIGspH9MdtMLNS3S4emFySX7lXda7Vhkgo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77518},"main":"./src/index.ts","engines":{"node":">=18"},"gitHead":"1fca2cfdcbdf155b60d39efd9495773b47cb49a1","scripts":{"test":"vitest run","test:watch":"vitest"},"_npmUser":{"name":"nandal","email":"sandeep@nandal.in"},"repository":{"url":"git+https://github.com/nandal/pi-ext.git","type":"git","directory":"contrib-gate"},"_npmVersion":"11.3.0","description":"Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation.","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.9"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-contrib-gate_1.6.1_1778871407637_0.2842238837643485","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@bytesbrains/pi-contrib-gate","version":"1.7.0","keywords":["pi-package","pi-extension","governance","git","conventional-commits","ci","devops"],"author":{"name":"nandal","email":"nandal@users.noreply.github.com"},"license":"MIT","_id":"@bytesbrains/pi-contrib-gate@1.7.0","maintainers":[{"name":"nandal","email":"sandeep@nandal.in"}],"homepage":"https://github.com/nandal/pi-ext/tree/main/contrib-gate","bugs":{"url":"https://github.com/nandal/pi-ext/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"683d34a852fe3312e64a931100783b3b09eb7a3a","tarball":"https://registry.npmjs.org/@bytesbrains/pi-contrib-gate/-/pi-contrib-gate-1.7.0.tgz","fileCount":16,"integrity":"sha512-KX51O03La1S7GZ8RE7se9I+SeGI8KeY9OKD6rSa9dMkEJ4aY3jrdb54wTA9uZIdfrSAiEOQGebx/637+7pizfw==","signatures":[{"sig":"MEYCIQCmBAUD/X7opwIAgCzHa1J5DpwCXMRbIPAmQ461zobcXQIhAMxOCj5/UhFuw9kTPUQlw0+WzQl1nLA4IbH8lOtBqtA2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78830},"main":"./src/index.ts","engines":{"node":">=18"},"gitHead":"1de5a142388d4c77d62f010d3329e5725da5c5db","scripts":{"test":"vitest run","test:watch":"vitest"},"_npmUser":{"name":"nandal","email":"sandeep@nandal.in"},"repository":{"url":"git+https://github.com/nandal/pi-ext.git","type":"git","directory":"contrib-gate"},"_npmVersion":"11.3.0","description":"Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation.","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.9"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-contrib-gate_1.7.0_1778887655246_0.7895897606634388","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@bytesbrains/pi-contrib-gate","version":"1.8.0","keywords":["pi-package","pi-extension","governance","git","conventional-commits","ci","devops"],"author":{"name":"nandal","email":"nandal@users.noreply.github.com"},"license":"MIT","_id":"@bytesbrains/pi-contrib-gate@1.8.0","maintainers":[{"name":"nandal","email":"sandeep@nandal.in"}],"homepage":"https://github.com/nandal/pi-ext/tree/main/contrib-gate","bugs":{"url":"https://github.com/nandal/pi-ext/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"e4fe1770049e2c698de882299b7301a9e579129a","tarball":"https://registry.npmjs.org/@bytesbrains/pi-contrib-gate/-/pi-contrib-gate-1.8.0.tgz","fileCount":16,"integrity":"sha512-LrLr904hpWInLhRiooKgVqb2X3Vr7a/NbE0/n8AGE8EA7JmqgoS3EguAGyYADQQhCb2mFeC2u3tu+kTplR4oDQ==","signatures":[{"sig":"MEYCIQDftspeLBjLOM66mYV0ZqRPScE5PSGoHjmMhGeT62jwNwIhAKcfetrhIIF8EEPv7W/9FSNlRnn/Nt+IGyYUHa9WQYk5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80842},"main":"./src/index.ts","engines":{"node":">=18"},"gitHead":"d78f5763bb5d426709ce30e9007cfa99e5e63401","scripts":{"test":"vitest run","test:watch":"vitest"},"_npmUser":{"name":"nandal","email":"sandeep@nandal.in"},"repository":{"url":"git+https://github.com/nandal/pi-ext.git","type":"git","directory":"contrib-gate"},"_npmVersion":"11.3.0","description":"Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation.","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.9"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-contrib-gate_1.8.0_1778892769010_0.7914542402469387","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"@bytesbrains/pi-contrib-gate","version":"1.8.1","keywords":["pi-package","pi-extension","governance","git","conventional-commits","ci","devops"],"author":{"name":"nandal","email":"nandal@users.noreply.github.com"},"license":"MIT","_id":"@bytesbrains/pi-contrib-gate@1.8.1","maintainers":[{"name":"nandal","email":"sandeep@nandal.in"}],"homepage":"https://github.com/nandal/pi-ext/tree/main/contrib-gate","bugs":{"url":"https://github.com/nandal/pi-ext/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"75f4037453ea15bf2ba9574d179a20b931b49dec","tarball":"https://registry.npmjs.org/@bytesbrains/pi-contrib-gate/-/pi-contrib-gate-1.8.1.tgz","fileCount":16,"integrity":"sha512-i6NQxPaFKb5wOFIMc1ZEUqby0MolLfX31EHKCvgHOHj/hx3DChkzXDaPUwoMftyjhDHQbgwCHq3ZW/CM14yhSA==","signatures":[{"sig":"MEUCIQC1BDY6pOdVnGVtSUn1lGYkhIOgxLGJAC2/ELPOS1qSwgIgIivPE3ZtdCsOEMnk6zBrfkPac8AT1ooaFJFw76Wzyrg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82012},"main":"./src/index.ts","engines":{"node":">=18"},"gitHead":"4ee04e52ce1101ca40c6831194e3cf48aa20e675","scripts":{"test":"vitest run","test:watch":"vitest"},"_npmUser":{"name":"nandal","email":"sandeep@nandal.in"},"repository":{"url":"git+https://github.com/nandal/pi-ext.git","type":"git","directory":"contrib-gate"},"_npmVersion":"11.3.0","description":"Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation.","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.9"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-contrib-gate_1.8.1_1778893174954_0.09532238596588005","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@bytesbrains/pi-contrib-gate","version":"1.9.0","keywords":["pi-package","pi-extension","governance","git","conventional-commits","ci","devops"],"author":{"name":"nandal","email":"nandal@users.noreply.github.com"},"license":"MIT","_id":"@bytesbrains/pi-contrib-gate@1.9.0","maintainers":[{"name":"nandal","email":"sandeep@nandal.in"}],"homepage":"https://github.com/nandal/pi-ext/tree/main/contrib-gate","bugs":{"url":"https://github.com/nandal/pi-ext/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"6dbd0101840bb0b610600f3f10f5653115f1752e","tarball":"https://registry.npmjs.org/@bytesbrains/pi-contrib-gate/-/pi-contrib-gate-1.9.0.tgz","fileCount":16,"integrity":"sha512-2R1FO+ZKSFltMwyI3uk/CT4XNI65MZbg7qCbZA2rwCsWi8o4NJ+Ujqv/j8tsrbFMPgOVI9iP3bCOeb+ADODplQ==","signatures":[{"sig":"MEYCIQDCRqO2gJt1LBhuQI7xBmafx/RYWr1BCWQ924dDJHc6kQIhAM6u0LM64EbJ1pa7/Pdn+72j+1vnrmyjrcwu3LGyLk5g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94118},"main":"./src/index.ts","engines":{"node":">=18"},"gitHead":"e4e2429e2adc1b2e9efcd229763481f5f1707c58","scripts":{"test":"vitest run","test:watch":"vitest"},"_npmUser":{"name":"nandal","email":"sandeep@nandal.in"},"repository":{"url":"git+https://github.com/nandal/pi-ext.git","type":"git","directory":"contrib-gate"},"_npmVersion":"11.3.0","description":"Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation.","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.9"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-contrib-gate_1.9.0_1779068934276_0.580842299360621","host":"s3://npm-registry-packages-npm-production"}},"1.9.1":{"name":"@bytesbrains/pi-contrib-gate","version":"1.9.1","description":"Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation.","keywords":["pi-package","pi-extension","governance","git","conventional-commits","ci","devops"],"author":{"name":"BytesBrains Pte Ltd","url":"https://bytesbrains.com"},"repository":{"type":"git","url":"git+https://github.com/bytesbrains/pi-contrib-gate.git"},"homepage":"https://github.com/bytesbrains/pi-contrib-gate#readme","bugs":{"url":"https://github.com/bytesbrains/pi-contrib-gate/issues"},"license":"MIT","main":"./src/index.ts","engines":{"node":">=18"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","typebox":"*"},"pi":{"extensions":["./src/index.ts"]},"scripts":{"test":"vitest run","test:watch":"vitest"},"devDependencies":{"vitest":"^2.1.9"},"_id":"@bytesbrains/pi-contrib-gate@1.9.1","gitHead":"259d0efd7cbce467c5abfe322c097af5539ded87","_nodeVersion":"24.2.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-MtVDffhvoyBxY7NBF5YKKCcl2/tb1dgVnw0oMtPsWBGE8vgz5fFe1rFWFv7uPf/iLyuJLfkfnqYt6Ryu7yEJ2A==","shasum":"7f58457bf14f5918821c6aaf9140aebf356f1358","tarball":"https://registry.npmjs.org/@bytesbrains/pi-contrib-gate/-/pi-contrib-gate-1.9.1.tgz","fileCount":16,"unpackedSize":94309,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDbydg2434WdTDwiwci849wYisR0SiOsuJIoBzyL2iA6AiEAm9IVbnia1DBCQ3Clcn4R3KuDcfhFap40ffrPlCuFWsg="}]},"_npmUser":{"name":"nandal","email":"sandeep@nandal.in"},"directories":{},"maintainers":[{"name":"nandal","email":"sandeep@nandal.in"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-contrib-gate_1.9.1_1783472805244_0.38503477167351363"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-15T18:56:47.503Z","modified":"2026-07-08T01:06:45.539Z","1.6.1":"2026-05-15T18:56:47.778Z","1.7.0":"2026-05-15T23:27:35.408Z","1.8.0":"2026-05-16T00:52:49.150Z","1.8.1":"2026-05-16T00:59:35.094Z","1.9.0":"2026-05-18T01:48:54.423Z","1.9.1":"2026-07-08T01:06:45.390Z"},"bugs":{"url":"https://github.com/bytesbrains/pi-contrib-gate/issues"},"author":{"name":"BytesBrains Pte Ltd","url":"https://bytesbrains.com"},"license":"MIT","homepage":"https://github.com/bytesbrains/pi-contrib-gate#readme","keywords":["pi-package","pi-extension","governance","git","conventional-commits","ci","devops"],"repository":{"type":"git","url":"git+https://github.com/bytesbrains/pi-contrib-gate.git"},"description":"Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation.","maintainers":[{"name":"nandal","email":"sandeep@nandal.in"}],"readme":"# Contrib Gate for Pi\n\n[![npm version](https://img.shields.io/npm/v/@bytesbrains/pi-contrib-gate)](https://www.npmjs.com/package/@bytesbrains/pi-contrib-gate)\n[![license](https://img.shields.io/npm/l/@bytesbrains/pi-contrib-gate)](./LICENSE)\n\n> Contribution gateway for AI agents — enforce branch naming, conventional commits, pre-commit quality gates, and PR automation. **Agents don't call `git push` — they call `contrib_submit()`.**\n\n> ⚡ **Every piece of work must be linked to a Gitea issue.** The gate blocks file modifications, commits, and PR creation until an issue is linked via `contrib_start_work(issue_id)`.\n\n## Install\n\n```bash\npi install npm:@bytesbrains/pi-contrib-gate\n```\n\n## Tools\n\n| Tool                              | What it does                                |\n| --------------------------------- | ------------------------------------------- |\n| `contrib_start_work(issue_id)`    | Create properly named branch, link to issue |\n| `contrib_propose(message, files)` | Validate, stage, quality-check, commit      |\n| `contrib_submit(title, body)`     | Push, create PR, return URL                 |\n| `contrib_status()`                | Show branch, commits, changes, PR status    |\n\n## Safety Intercepts\n\nThe gate **passively monitors** all `bash` tool calls and:\n\n- ⛔ Blocks `write`/`edit` operations when no Gitea issue is linked (reminds agent to call `contrib_start_work(issue_id)` first)\n- ⛔ Blocks `write`/`edit` on protected branches (`main`, `dev`, `production`)\n- ⛔ Blocks `contrib_propose()` and `contrib_submit()` when no issue is linked\n- ⚠️ Warns on `git push --force`\n- ⚠️ Warns on non-conventional commit messages\n- ⚠️ Soft-warns on feature branches without a recognized issue ID\n- All blocks can be overridden with user confirmation\n\n## Quality Gates\n\nEvery `contrib_propose()` runs:\n\n| Check                             | Default | Config                    |\n| --------------------------------- | ------- | ------------------------- |\n| Conventional commit format        | ✅      | `commits.convention`      |\n| Max files changed (20)            | ✅      | `quality.maxFilesChanged` |\n| Max lines added (500)             | ✅      | `quality.maxLinesAdded`   |\n| TypeScript check (`tsc --noEmit`) | ✅      | `quality.typeCheck`       |\n| Lint check (`npm run lint`)       | ✅      | `quality.lint`            |\n| Doctor audit (god file detection) | ✅      | `quality.doctorAudit`     |\n\n## Configuration\n\nCreate `.contribrc.yml` in your project root (created automatically on first use with defaults):\n\n```yaml\n# Remote configuration (optional — auto-detects by default)\nremote.name: \"\" # Explicit remote name (e.g., \"gitea\", \"origin\")\nremote.type: auto # \"gitea\" | \"github\" | \"auto\" — skip platform detection\nremote.url: \"\" # Override API base URL for custom/self-hosted Gitea\nremote.token: \"\" # Gitea PAT for API calls (required for SSH remotes)\n\nbranches.featPattern: feat/\nbranches.fixPattern: fix/\nbranches.chorePattern: chore/\ncommits.convention: conventional\ncommits.maxSubjectLength: 72\nquality.maxFilesChanged: 20\nquality.maxLinesAdded: 500\nquality.lint: true\nquality.typeCheck: true\nquality.doctorAudit: true\n```\n\n### Remote Configuration\n\nWhen a repository has both `gitea` and `origin` (GitHub) remotes, agents can get confused about which platform to use. The `remote` section resolves this ambiguity.\n\n| Key            | Default        | Description                                                                                                                                                                                 |\n| -------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `remote.name`  | `\"\"` (auto)    | Explicit remote name for push/pull. When unset, auto-detects from available remotes.                                                                                                        |\n| `remote.type`  | `\"auto\"`       | Platform type. `\"gitea\"` skips GitHub API queries, `\"github\"` skips Gitea API queries, `\"auto\"` detects from remote URL.                                                                    |\n| `remote.url`   | `\"\"` (default) | Base URL for Gitea API (e.g., `\"https://gitea.mycompany.com\"`). Only needed for custom/self-hosted instances.                                                                               |\n| `remote.token` | `\"\"`           | Gitea personal access token. **Required when using SSH remotes** (`git@gitea:...`) since SSH URLs don't contain credentials. HTTP remotes with embedded PATs take priority over this value. |\n\n**SSH Remote Setup Example:**\n\n```yaml\nremote.name: gitea\nremote.type: gitea\nremote.token: your-gitea-pat-here\n```\n\n> ⚠️ **Security:** The token is never included in logs, error messages, or debug output.\n> If `.contribrc.yml` is committed to your repo, add it to `.gitignore` or use an empty `remote.token` and rely on a URL-embedded PAT or environment-level credential store instead.\n\n## Example Workflow\n\n```\n→ contrib_start_work(issue_id=\"7\", type=\"feat\")\n✅ Work started on feat/issue-7\n\n→ [agent makes code changes...]\n\n→ contrib_propose(message=\"feat(backup): add Firebase volume backup script\", body=\"Implements daily pg_dump + tar + upload.\")\n✅ Changes committed (a1b2c3d)\n\n→ contrib_submit(title=\"feat: automated volume backups to Firebase Storage\")\n🎉 PR created: http://localhost:3001/factory/wrok.in/pulls/47\n```\n\n## License\n\nMIT © [nandal](https://github.com/nandal)\n\n---\n\nBuilt and maintained by [BytesBrains](https://bytesbrains.com) — AI automation & agents, engineered to production standards.\n*The model proposes, code guarantees.*\n","readmeFilename":"README.md"}