{"_id":"@alien-protocol/cannon","_rev":"27-4a938388fee4b1750fe5bbbba218f3e7","name":"@alien-protocol/cannon","dist-tags":{"latest":"2.6.0"},"versions":{"2.2.2":{"name":"@alien-protocol/cannon","version":"2.2.2","keywords":["github","issues","bulk","automation","csv","oauth","cli","alien-protocol"],"author":{"name":"Alien Protocol","email":"https://github.com/Alien-Protocol"},"license":"MIT","_id":"@alien-protocol/cannon@2.2.2","maintainers":[{"name":"ryzen_xp","email":"ryzen4540@gmail.com"}],"homepage":"https://github.com/Alien-Protocol/Cannon#readme","bugs":{"url":"https://github.com/Alien-Protocol/Cannon/issues"},"bin":{"cannon":"bin/cli.js"},"dist":{"shasum":"c0a0c224c8303fca2292239329cb7477c85b9037","tarball":"https://registry.npmjs.org/@alien-protocol/cannon/-/cannon-2.2.2.tgz","fileCount":18,"integrity":"sha512-ptZi9XLHJ9rCI03j/ldAb0fp1j7Qxm50KaELtFs7oDh/qbBcag6haBk89nUUL5DhJ0kB4qhzlCnVe+i6/v+aGw==","signatures":[{"sig":"MEUCIHDPTqn3TlrrYdXAGGmDVdaj18h019wKLkVEc44fThY4AiEA1puu0MMcX3CFNeo1CH6SkkpoGyfHrA1chX6rZczYbek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72445},"main":"./src/index.js","type":"module","engines":{"node":">=18.0.0"},"exports":{".":"./src/index.js"},"gitHead":"faaa6de84fe230523d654bd0fdba66b589527c67","scripts":{"start":"node bin/cli.js","format":"prettier --write .","format:check":"prettier --check ."},"_npmUser":{"name":"ryzen_xp","email":"ryzen4540@gmail.com"},"repository":{"url":"git+https://github.com/Alien-Protocol/Cannon.git","type":"git"},"_npmVersion":"11.12.0","description":"Bulk-create GitHub issues from CSV, PDF, DOCX, JSON or any database — with OAuth login — by Alien Protocol","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.11.5","ora":"^8.0.1","conf":"^13.0.0","chalk":"^5.3.0","dotenv":"^16.4.5","mysql2":"^3.9.7","sql.js":"^1.12.0","mammoth":"^1.7.2","commander":"^12.0.0","csv-parse":"^5.5.5","pdf-parse":"^1.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.1","semantic-release":"^25.0.3","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.1.0"},"_npmOperationalInternal":{"tmp":"tmp/cannon_2.2.2_1773988859356_0.16361510452316397","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@alien-protocol/cannon","version":"2.3.0","keywords":["github","issues","bulk","automation","csv","oauth","cli","alien-protocol"],"author":{"name":"Alien Protocol","email":"https://github.com/Alien-Protocol"},"license":"MIT","_id":"@alien-protocol/cannon@2.3.0","maintainers":[{"name":"ryzen_xp","email":"ryzen4540@gmail.com"}],"homepage":"https://github.com/Alien-Protocol/Cannon#readme","bugs":{"url":"https://github.com/Alien-Protocol/Cannon/issues"},"bin":{"cannon":"bin/cli.js"},"dist":{"shasum":"48b0c79e1303022524f1a090f89b63ef971c7f64","tarball":"https://registry.npmjs.org/@alien-protocol/cannon/-/cannon-2.3.0.tgz","fileCount":18,"integrity":"sha512-rTRRrQ/162VoIskjNl9BDmvnAUun8Hqx7GlAZDml3S5t998/lXG7vv2zW0KCQ2awA9yN/uHybI2tGEBHj1/ZiA==","signatures":[{"sig":"MEUCIGyrThQWNmmGtococDmHJ+jyIYq3WDY5JNu0H1PXEhylAiEA984Y6/G90A3lNicqJgB7Z3L5ozkf3CSth0/jv66heCg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81262},"main":"./src/index.js","type":"module","engines":{"node":">=18.0.0"},"exports":{".":"./src/index.js"},"gitHead":"7b6201b0ee6302e2335e0212fdd983864bb261b0","scripts":{"start":"node bin/cli.js","format":"prettier --write .","format:check":"prettier --check ."},"_npmUser":{"name":"ryzen_xp","email":"ryzen4540@gmail.com"},"repository":{"url":"git+https://github.com/Alien-Protocol/Cannon.git","type":"git"},"_npmVersion":"11.12.0","description":"Bulk-create GitHub issues from CSV, PDF, DOCX, JSON or any database — with OAuth login — by Alien Protocol","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.11.5","ora":"^8.0.1","conf":"^13.0.0","chalk":"^5.3.0","dotenv":"^16.4.5","mysql2":"^3.9.7","sql.js":"^1.12.0","mammoth":"^1.7.2","commander":"^12.0.0","csv-parse":"^5.5.5","pdf-parse":"^1.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.1","semantic-release":"^25.0.3","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.1.0"},"_npmOperationalInternal":{"tmp":"tmp/cannon_2.3.0_1774069890443_0.8139865287548669","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@alien-protocol/cannon","version":"2.4.0","keywords":["github","issues","bulk","automation","csv","oauth","cli","alien-protocol"],"author":{"name":"Alien Protocol","email":"https://github.com/Alien-Protocol"},"license":"MIT","_id":"@alien-protocol/cannon@2.4.0","maintainers":[{"name":"ryzen_xp","email":"ryzen4540@gmail.com"}],"homepage":"https://github.com/Alien-Protocol/Cannon#readme","bugs":{"url":"https://github.com/Alien-Protocol/Cannon/issues"},"bin":{"cannon":"bin/cli.js"},"dist":{"shasum":"76d7d10006c7e7c817453fbd79bffbffe3c2ac3f","tarball":"https://registry.npmjs.org/@alien-protocol/cannon/-/cannon-2.4.0.tgz","fileCount":18,"integrity":"sha512-c3MDTV9o1/zPTmmbLa0PT3l13nRzf+a+nrZqrke6AJvthf+5Vz3H+Z1lQX19P31SNwxyJM7TFqOMTkdnw+fiIQ==","signatures":[{"sig":"MEUCIQCORn1+Rvv5EziumwldOusLFWJ7sXh7g82UB9gTNWADAwIgVh/o/7mYq/jNYvTTs1H1BQBLCtunMxPhoxUfG/+bV3A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79888},"main":"./src/index.js","type":"module","engines":{"node":">=18.0.0"},"exports":{".":"./src/index.js"},"gitHead":"77710e6f391795713d5d0b0271bdca1ceb093e9a","scripts":{"start":"node bin/cli.js","format":"prettier --write .","format:check":"prettier --check ."},"_npmUser":{"name":"ryzen_xp","email":"ryzen4540@gmail.com"},"repository":{"url":"git+https://github.com/Alien-Protocol/Cannon.git","type":"git"},"_npmVersion":"11.12.0","description":"Bulk-create GitHub issues from CSV, PDF, DOCX, JSON or any database — with OAuth login — by Alien Protocol","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.11.5","ora":"^8.0.1","conf":"^13.0.0","chalk":"^5.3.0","dotenv":"^16.4.5","mysql2":"^3.9.7","sql.js":"^1.12.0","mammoth":"^1.7.2","commander":"^12.0.0","csv-parse":"^5.5.5","pdf-parse":"^1.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.1","semantic-release":"^25.0.3","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.1.0"},"_npmOperationalInternal":{"tmp":"tmp/cannon_2.4.0_1774100707297_0.7535039867349977","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@alien-protocol/cannon","version":"2.5.0","keywords":["github cli","github issues","github issue automation","bulk github issues","github issue importer","github issue creator","github issue generator","issue automation","issue migration tool","backlog importer","backlog sync github","csv to github issues","json to github issues","database to github issues","bulk issue creator","developer tools","dev productivity","node cli","cli tool","github automation"],"author":{"name":"Alien Protocol","email":"https://github.com/Alien-Protocol"},"license":"MIT","_id":"@alien-protocol/cannon@2.5.0","maintainers":[{"name":"ryzen_xp","email":"ryzen4540@gmail.com"}],"homepage":"https://github.com/Alien-Protocol/Cannon#readme","bugs":{"url":"https://github.com/Alien-Protocol/Cannon/issues"},"bin":{"cannon":"bin/cli.js"},"dist":{"shasum":"eaee99a072eea55ef086e467efaf49b7ba1e512a","tarball":"https://registry.npmjs.org/@alien-protocol/cannon/-/cannon-2.5.0.tgz","fileCount":18,"integrity":"sha512-6cBsAudpUUV7aHW3l3RIOHy5Yf9TekoWBLbfgXYkqj4SpOdXz/lrgzyuoEe9vUXWX+SIDEyH7R3pdvaM0uCvbQ==","signatures":[{"sig":"MEQCID4aYmXKGhsnx7TcLPl8rbF0uIivwLHyw2DW8Floz3HkAiBQbHSQRiQXXXaTNuwXUfG9oaf3U3JD2tHzs3a2yN6xGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69853},"main":"./src/index.js","type":"module","engines":{"node":">=18.0.0"},"exports":{".":"./src/index.js"},"gitHead":"4e7f8cf023c4843dc9d1f681d22c50355ae6704f","scripts":{"start":"node bin/cli.js","format":"prettier --write .","format:check":"prettier --check ."},"_npmUser":{"name":"ryzen_xp","email":"ryzen4540@gmail.com"},"repository":{"url":"git+https://github.com/Alien-Protocol/Cannon.git","type":"git"},"_npmVersion":"11.12.0","description":"Bulk-create GitHub issues from CSV, PDF, DOCX, JSON or any database — with OAuth login — by Alien Protocol","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.11.5","ora":"^8.0.1","conf":"^13.0.0","chalk":"^5.3.0","dotenv":"^16.4.5","mysql2":"^3.9.7","sql.js":"^1.12.0","mammoth":"^1.7.2","commander":"^12.0.0","csv-parse":"^5.5.5","pdf-parse":"^1.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.1","semantic-release":"^25.0.3","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.1.0"},"_npmOperationalInternal":{"tmp":"tmp/cannon_2.5.0_1774103255805_0.5300886270084093","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"@alien-protocol/cannon","version":"2.6.0","publishConfig":{"access":"public"},"description":"Bulk-create GitHub issues from CSV, PDF, DOCX, JSON or any database — with OAuth login — by Alien Protocol","type":"module","main":"./src/index.js","exports":{".":"./src/index.js"},"bin":{"cannon":"bin/cli.js"},"scripts":{"start":"node bin/cli.js","format":"prettier --write .","format:check":"prettier --check ."},"keywords":["github cli","github issues","github issue automation","bulk github issues","github issue importer","github issue creator","github issue generator","issue automation","issue migration tool","backlog importer","backlog sync github","csv to github issues","json to github issues","database to github issues","bulk issue creator","developer tools","dev productivity","node cli","cli tool","github automation"],"author":{"name":"Alien Protocol","email":"https://github.com/Alien-Protocol"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Alien-Protocol/Cannon.git"},"homepage":"https://github.com/Alien-Protocol/Cannon#readme","bugs":{"url":"https://github.com/Alien-Protocol/Cannon/issues"},"dependencies":{"chalk":"^5.3.0","commander":"^12.0.0","conf":"^13.0.0","csv-parse":"^5.5.5","dotenv":"^16.4.5","mammoth":"^1.7.2","mysql2":"^3.9.7","ora":"^8.0.1","pdf-parse":"^1.1.1","pg":"^8.11.5","sql.js":"^1.12.0"},"engines":{"node":">=18.0.0"},"devDependencies":{"@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/github":"^12.0.6","@semantic-release/npm":"^13.1.5","@semantic-release/release-notes-generator":"^14.1.0","prettier":"^3.8.1","semantic-release":"^25.0.3"},"gitHead":"ae31e053bba1f01525d1f547b11d6bb265721fb8","_id":"@alien-protocol/cannon@2.6.0","_nodeVersion":"24.14.0","_npmVersion":"11.12.0","dist":{"integrity":"sha512-3/10OTRqf9dIUJEC/BBCLdkaPfAJ/Xhb3bZvK2lFc1RqA4i6WOaApO2mCcID0LS1TaVneUmwRyUPu2u1vQHjIg==","shasum":"042f10b71c2153c4c17245199801f511eb5b21b6","tarball":"https://registry.npmjs.org/@alien-protocol/cannon/-/cannon-2.6.0.tgz","fileCount":18,"unpackedSize":70348,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFHl5fiTR5x3sgUO8RTQ59o24Vwjmn9gGCu/l8s2ol/IAiEAlx+Ik6DtBrUuLMHn0XUsst5jUOr1rqct1eB8CaJW608="}]},"_npmUser":{"name":"ryzen_xp","email":"ryzen4540@gmail.com"},"directories":{},"maintainers":[{"name":"ryzen_xp","email":"ryzen4540@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cannon_2.6.0_1774501715605_0.4760705031686101"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-20T06:40:59.196Z","modified":"2026-03-26T05:08:35.891Z","1.0.0":"2026-03-18T13:09:09.570Z","1.0.1":"2026-03-18T13:26:41.927Z","1.0.5":"2026-03-18T15:16:46.386Z","1.0.6":"2026-03-18T15:45:42.913Z","1.0.7":"2026-03-18T15:53:55.427Z","1.0.8":"2026-03-18T16:15:49.382Z","2.0.0":"2026-03-18T17:04:49.391Z","2.0.1":"2026-03-18T17:16:18.499Z","2.0.2":"2026-03-18T17:25:22.024Z","2.0.3":"2026-03-18T17:53:52.068Z","2.0.4":"2026-03-18T18:00:30.523Z","2.0.5":"2026-03-18T18:11:15.821Z","2.0.6":"2026-03-18T18:13:13.127Z","2.0.7":"2026-03-18T18:21:27.849Z","2.0.8":"2026-03-19T05:00:56.761Z","2.0.9":"2026-03-19T05:02:03.807Z","2.1.0":"2026-03-19T05:57:44.256Z","2.1.1":"2026-03-19T06:06:57.371Z","2.1.2":"2026-03-19T06:14:59.718Z","2.2.2":"2026-03-20T06:40:59.500Z","2.3.0":"2026-03-21T05:11:30.624Z","2.4.0":"2026-03-21T13:45:07.445Z","2.5.0":"2026-03-21T14:27:35.973Z","2.6.0":"2026-03-26T05:08:35.739Z"},"bugs":{"url":"https://github.com/Alien-Protocol/Cannon/issues"},"author":{"name":"Alien Protocol","email":"https://github.com/Alien-Protocol"},"license":"MIT","homepage":"https://github.com/Alien-Protocol/Cannon#readme","keywords":["github cli","github issues","github issue automation","bulk github issues","github issue importer","github issue creator","github issue generator","issue automation","issue migration tool","backlog importer","backlog sync github","csv to github issues","json to github issues","database to github issues","bulk issue creator","developer tools","dev productivity","node cli","cli tool","github automation"],"repository":{"type":"git","url":"git+https://github.com/Alien-Protocol/Cannon.git"},"description":"Bulk-create GitHub issues from CSV, PDF, DOCX, JSON or any database — with OAuth login — by Alien Protocol","maintainers":[{"name":"ryzen_xp","email":"ryzen4540@gmail.com"}],"readme":"# 🛸 @alien-protocol/cannon\n\n**Stop manually creating GitHub issues.**\nBulk-create, update, and sync issues from CSV, JSON, PDF, DOCX, or any database — in one command.\n\n[![npm](https://img.shields.io/npm/v/@alien-protocol/cannon)](https://www.npmjs.com/package/@alien-protocol/cannon)\n[![downloads](https://img.shields.io/npm/dm/@alien-protocol/cannon)](https://www.npmjs.com/package/@alien-protocol/cannon)\n[![license](https://img.shields.io/npm/l/@alien-protocol/cannon)](LICENSE)\n[![node](https://img.shields.io/node/v/@alien-protocol/cannon)](package.json)\n\n---\n\n## ⚡ Why Cannon?\n\n| | |\n|---|---|\n| ⏳ | Save hours of manual issue creation |\n| 🔁 | Sync any backlog → GitHub instantly |\n| 🛡️ | Built-in duplicate detection & safe delays |\n| ⚙️ | Works with CSV, Excel, databases, Word docs |\n| ♻️ | Resumable — stop and restart safely |\n\n---\n\n## 🚀 Quick Start\n\n```bash\nnpm install -g @alien-protocol/cannon\n```\n\n```bash\ncannon init            # 1. create cannon.config.json\ncannon auth login      # 2. OAuth login — no token needed\ncannon fire --preview  # 3. dry run — nothing created yet\ncannon fire            # 4. go live\n```\n\n---\n\n## 👀 See It In Action\n\n![cannon running](./assets/asset_01.png)\n![cannon summary](./assets/asset_02.png)\n\n---\n\n## 🎯 Use Cases\n\n| Scenario | How |\n|----------|-----|\n| Import 100+ issues from Excel | Save as CSV → `cannon fire -s csv -f ./issues.csv` |\n| Migrate backlog between repos | Export issues, update `repo` column, fire |\n| Auto-create from product docs | Convert Word table to DOCX → point cannon at it |\n| Sync a database → GitHub | Use `postgres` / `mysql` / `sqlite` source |\n| Bulk-update existing issues | Set `action` column to `update` |\n\n---\n\n## 📄 Your Data File\n\nAll sources use the same columns:\n\n| Column | Required | Description | Example |\n|--------|----------|-------------|---------|\n| `repo` | ✅ | Target repository | `owner/repo` |\n| `title` | ✅ | Issue title — also the lookup key for `update` | `Fix login bug` |\n| `action` | — | `create` (default) or `update` | `create` |\n| `body` | — | Description — markdown supported | `Steps to reproduce…` |\n| `labels` | — | Comma-separated label names | `bug,auth` |\n| `milestone` | — | Auto-created if it doesn't exist | `v1.0` |\n\n### How `action` works\n\n| Value | What cannon does | If title already exists |\n|-------|-----------------|------------------------|\n| `create` | Opens a new issue | Skipped — duplicate guard |\n| `update` | Finds issue by title, patches body / labels / milestone | Title is the stable key |\n| *(blank)* | Same as `create` | Same as `create` |\n\n### CSV example\n\n| action | repo | title | body | labels | milestone |\n|--------|------|-------|------|--------|-----------|\n| `create` | `owner/repo` | Fix login bug | Steps to reproduce… | `bug` | `v1.0` |\n| `update` | `owner/repo` | Fix login bug | Updated steps | `bug,high` | `v1.0` |\n| `create` | `owner/repo` | Add dark mode | User request | `enhancement` | `v1.1` |\n\n### Supported sources\n\n| Format | Config snippet |\n|--------|---------------|\n| CSV | `\"type\": \"csv\", \"file\": \"./issues.csv\"` |\n| JSON | `\"type\": \"json\", \"file\": \"./issues.json\"` |\n| PDF | `\"type\": \"pdf\", \"file\": \"./issues.pdf\"` |\n| DOCX / Word | `\"type\": \"docx\", \"file\": \"./issues.docx\"` |\n| SQLite | `\"type\": \"sqlite\", \"file\": \"./backlog.db\", \"query\": \"SELECT …\"` |\n| PostgreSQL | `\"type\": \"postgres\", \"connectionString\": \"${POSTGRES_URL}\", \"query\": \"SELECT …\"` |\n| MySQL | `\"type\": \"mysql\", \"connectionString\": \"${MYSQL_URL}\", \"query\": \"SELECT …\"` |\n\n---\n\n## ⚙️ Config File\n\n```json\n{\n  \"source\": { \"type\": \"csv\", \"file\": \"./issues.csv\" },\n  \"mode\":   { \"safeMode\": true, \"dryRun\": false, \"resumable\": true },\n  \"delay\":  { \"min\": 4, \"max\": 8 }\n}\n```\n\n| Key | Default | What it does |\n|-----|---------|-------------|\n| `source.type` | `csv` | One of: `csv` `json` `pdf` `docx` `sqlite` `postgres` `mysql` |\n| `mode.safeMode` | `true` | Random 4–8 min delays — prevents GitHub spam flags |\n| `mode.dryRun` | `false` | Preview only, nothing is created |\n| `mode.resumable` | `true` | Saves progress — safe to stop and restart |\n| `delay.min` / `max` | `4` / `8` | Minutes between issues (safeMode only) |\n\n---\n\n## 🖥️ Commands\n\n### Auth\n| Command | What it does |\n|---------|-------------|\n| `cannon auth login` | OAuth login — no token needed |\n| `cannon auth status` | Show who is logged in |\n| `cannon auth logout` | Remove saved credentials |\n\n### Setup\n| Command | What it does |\n|---------|-------------|\n| `cannon init` | Create `cannon.config.json` |\n| `cannon validate` | Check config + source file before firing |\n\n### Fire\n| Command | What it does |\n|---------|-------------|\n| `cannon fire` | Run using `cannon.config.json` |\n| `cannon fire --preview` | Dry run — nothing created, no delays |\n| `cannon fire --unsafe` | No delays (fast, risky) |\n| `cannon fire --delay 2` | Fixed 2-min delay between issues |\n| `cannon fire --fresh` | Ignore saved progress, start over |\n| `cannon fire -s csv -f ./my.csv` | Override source without editing config |\n\n---\n\n## 🔌 Programmatic Use\n\n```js\nimport { IssueCannon } from '@alien-protocol/cannon';\n\nconst { created, updated, failed } = await new IssueCannon({ safeMode: true })\n  .fire({ source: 'csv', file: './issues.csv' });\n\nconsole.log(`Created: ${created.length}  Updated: ${updated.length}  Failed: ${failed.length}`);\n```\n\n---\n\n## 🔐 Token Security\n\nTokens are **never stored in your project**. `cannon auth login` saves to `~/.cannon/credentials.json` (`chmod 600`).\n\n### Resolution order\n\n| Priority | Source |\n|----------|--------|\n| 1 | `new IssueCannon({ token: '...' })` — programmatic |\n| 2 | `GITHUB_TOKEN` env var or `.env` file |\n| 3 | `cannon auth login` → `~/.cannon/credentials.json` |\n| 4 | `cannon.config.json` `github.token` — not recommended |\n\n### `.gitignore`\n\n```\n.env\n.cannon_state.json\ncannon-log.json\n```\n\n> `cannon.config.json` is safe to commit — just leave `github.token` blank.\n\n---\n---\n🛸 **Alien Protocol** \n-   Built by [ryzen-xp](https://github.com/ryzen-xp) \n-   [npm](https://www.npmjs.com/package/@alien-protocol/cannon) \n-   [Report a bug](https://github.com/Alien-Protocol/Cannon/issues) \n-   MIT License","readmeFilename":"README.md"}