template-git-repo 0.1.29 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  <!-- template-git-repo:badges:start -->
2
2
  <p align="center">
3
3
  <a href="https://starterdocs.vtempest.workers.dev/docs/packages/template-git-repo"><img src="https://img.shields.io/badge/Docs-blue?logo=ReadTheDocs&logoColor=white" alt="Documentation" /></a>
4
- <a href="https://stackblitz.com/github/OpenSourceAGI/dev-tools-starter-agent/tree/master/packages/template-git-repo"><img height="20px" src="https://developer.stackblitz.com/img/open_in_stackblitz.svg" alt="Open in StackBlitz" /></a>
5
4
  <br />
5
+ <a href="https://github.com/OpenSourceAGI/dev-tools-starter-agent/stargazers"><img src="https://img.shields.io/github/stars/OpenSourceAGI/dev-tools-starter-agent" alt="GitHub Stars" /></a>
6
6
  <a href="https://www.npmjs.com/package/template-git-repo"><img src="https://img.shields.io/npm/dm/template-git-repo.svg" alt="NPM Monthly Downloads" /></a>
7
7
  <a href="https://www.npmjs.com/package/template-git-repo"><img src="https://img.shields.io/npm/v/template-git-repo.svg" alt="npm version" /></a>
8
8
  <a href="https://www.npmjs.com/package/template-git-repo"><img src="https://img.shields.io/npm/dt/template-git-repo.svg" alt="NPM Total Downloads" /></a>
@@ -10,13 +10,13 @@
10
10
  <a href="https://packagephobia.com/result?p=template-git-repo"><img src="https://packagephobia.com/badge?p=template-git-repo" alt="Install size" /></a>
11
11
  <a href="https://app.codecov.io/gh/OpenSourceAGI/dev-tools-starter-agent/flags"><img src="https://img.shields.io/codecov/c/github/OpenSourceAGI/dev-tools-starter-agent?flag=template-git-repo&label=template-git-repo%20coverage&logo=codecov&logoColor=white" alt="Coverage" /></a>
12
12
  <br />
13
- <a href="https://github.com/OpenSourceAGI/dev-tools-starter-agent/stargazers"><img src="https://img.shields.io/github/stars/OpenSourceAGI/dev-tools-starter-agent" alt="GitHub Stars" /></a>
14
13
  <a href="https://github.com/OpenSourceAGI/dev-tools-starter-agent/issues"><img src="https://img.shields.io/github/issues/OpenSourceAGI/dev-tools-starter-agent?logo=github" alt="GitHub Issues" /></a>
15
14
  <a href="https://github.com/OpenSourceAGI/dev-tools-starter-agent/pulls"><img src="https://img.shields.io/github/issues-pr/OpenSourceAGI/dev-tools-starter-agent?logo=github&label=PRs" alt="Open Pull Requests" /></a>
16
15
  <a href="https://github.com/OpenSourceAGI/dev-tools-starter-agent/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/OpenSourceAGI/dev-tools-starter-agent?logo=github&label=PRs%20merged&color=8957e5" alt="Merged Pull Requests" /></a>
17
16
  <a href="https://github.com/OpenSourceAGI/dev-tools-starter-agent/discussions"><img src="https://img.shields.io/github/discussions/OpenSourceAGI/dev-tools-starter-agent" alt="GitHub Discussions" /></a>
18
17
  <a href="https://github.com/OpenSourceAGI/dev-tools-starter-agent/commits/master/"><img src="https://img.shields.io/github/last-commit/OpenSourceAGI/dev-tools-starter-agent.svg" alt="GitHub last commit" /></a>
19
18
  <br />
19
+ <a href="https://stackblitz.com/github/OpenSourceAGI/dev-tools-starter-agent/tree/master/packages/template-git-repo"><img height="20px" src="https://developer.stackblitz.com/img/open_in_stackblitz.svg" alt="Open in StackBlitz" /></a>
20
20
  <img src="https://img.shields.io/badge/Bun-14151A?logo=bun&logoColor=white" alt="Bun" /> <img src="https://img.shields.io/badge/Vitest-6E9F18?logo=vitest&logoColor=white" alt="Vitest" />
21
21
  </p>
22
22
  <!-- template-git-repo:badges:end -->
package/docs/BADGES.md CHANGED
@@ -17,6 +17,23 @@ The block lives between `<!-- template-git-repo:badges:start -->` and
17
17
  between the markers and nothing else, so it is safe to run again after you publish a
18
18
  package or finish setting up Codecov.
19
19
 
20
+ ## The four rows
21
+
22
+ The block renders one row per group, in this order. The split is by the question a
23
+ reader is asking, not by where the badge is hosted — stars sit with the download
24
+ counts because both answer "is anyone using this", and the sandbox buttons sit at
25
+ the bottom so they do not compete with the link to the live app.
26
+
27
+ | Row | Carries |
28
+ | --- | --- |
29
+ | Row 1 — what this is and where to try it | `doi`, `deepwiki`, `website`, `docs`, `api`, `youtube`, `uptime`, `deploy-cloudflare` |
30
+ | Row 2 — is it used, is it working, is it shipped | `stars`, `npm-downloads`, `npm-version`, `npm-total-downloads`, `npm-types`, `install-size`, `codecov`, `codecov-flag`, `workflow`, `test-report` |
31
+ | Row 3 — is it alive, who is behind it | `contributors`, `forks`, `issues`, `pull-requests`, `prs-merged`, `discussions`, `commit-activity`, `last-commit`, `discord` |
32
+ | Row 4 — run it yourself, and what it is built with | `stackblitz`, `codespaces`, `prs-welcome`, `license`, `stack` |
33
+
34
+ A row whose badges are all missing or excluded is dropped rather than rendered
35
+ empty, so a repo with nothing published still gets a tidy three-row block.
36
+
20
37
  ## Index
21
38
 
22
39
  | Badge | Needs | Flag |
@@ -27,16 +44,9 @@ package or finish setting up Codecov.
27
44
  | [Documentation](#docs) `docs` | docsUrl | `--docs <url>` |
28
45
  | [API reference](#api) `api` | apiUrl | `--api <url>` |
29
46
  | [YouTube demo](#youtube) `youtube` | youtubeUrl | `--youtube <url>` |
47
+ | [Uptime](#uptime) `uptime` | uptimeUrl | `--uptime <url>` |
30
48
  | [Deploy to Cloudflare Workers](#deploy-cloudflare) `deploy-cloudflare` | cloudflareDeploy | `--cloudflare-deploy` |
31
- | [Open in StackBlitz](#stackblitz) `stackblitz` | stackblitzUrl | `--stackblitz <url>` |
32
- | [Open in GitHub Codespaces](#codespaces) `codespaces` | — | on by default |
33
49
  | [GitHub stars](#stars) `stars` | — | on by default |
34
- | [GitHub forks](#forks) `forks` | — | on by default |
35
- | [Contributors](#contributors) `contributors` | — | on by default |
36
- | [Open issues](#issues) `issues` | — | on by default |
37
- | [Open pull requests](#pull-requests) `pull-requests` | — | on by default |
38
- | [Merged pull requests](#prs-merged) `prs-merged` | — | on by default |
39
- | [GitHub Discussions](#discussions) `discussions` | — | on by default |
40
50
  | [npm monthly downloads](#npm-downloads) `npm-downloads` | npmPackage | `--npm-package <name>` |
41
51
  | [npm version](#npm-version) `npm-version` | npmPackage | `--npm-package <name>` |
42
52
  | [npm total downloads](#npm-total-downloads) `npm-total-downloads` | npmPackage | `--npm-package <name>` |
@@ -46,15 +56,22 @@ package or finish setting up Codecov.
46
56
  | [Coverage for one package](#codecov-flag) `codecov-flag` | codecovFlag | `--codecov-flag <name>` |
47
57
  | [CI status](#workflow) `workflow` | workflowFile | `--workflow <file>` |
48
58
  | [Hosted test report](#test-report) `test-report` | testReportUrl | `--test-report <url>` |
49
- | [Uptime](#uptime) `uptime` | uptimeUrl | `--uptime <url>` |
59
+ | [Contributors](#contributors) `contributors` | — | on by default |
60
+ | [GitHub forks](#forks) `forks` | — | on by default |
61
+ | [Open issues](#issues) `issues` | — | on by default |
62
+ | [Open pull requests](#pull-requests) `pull-requests` | — | on by default |
63
+ | [Merged pull requests](#prs-merged) `prs-merged` | — | on by default |
64
+ | [GitHub Discussions](#discussions) `discussions` | — | on by default |
50
65
  | [Commit activity](#commit-activity) `commit-activity` | — | on by default |
51
66
  | [Last commit](#last-commit) `last-commit` | — | on by default |
52
67
  | [Discord](#discord) `discord` | discordId, discordInvite | `--discord-id <id>` `--discord-invite <url>` |
68
+ | [Open in StackBlitz](#stackblitz) `stackblitz` | stackblitzUrl | `--stackblitz <url>` |
69
+ | [Open in GitHub Codespaces](#codespaces) `codespaces` | — | on by default |
53
70
  | [PRs welcome](#prs-welcome) `prs-welcome` | — | on by default |
54
71
  | [License](#license) `license` | — | on by default |
55
72
  | [Tech stack chips](#stack) `stack` | stack | `--stack <A,B,C>` |
56
73
 
57
- ## Identity — what this project is
74
+ ## Row 1 — what this is and where to try it
58
75
 
59
76
  ### doi
60
77
 
@@ -104,6 +121,14 @@ A demo video does more for a README than three paragraphs. Any YouTube URL works
104
121
 
105
122
  Enable with: `--youtube <url>`
106
123
 
124
+ ### uptime
125
+
126
+ **Uptime**
127
+
128
+ Create a monitor at uptimerobot.com, then a public status page, and link the status page here. This is a static badge — it says "brightgreen" even while you are down. For a live one use the UptimeRobot shields endpoint with a read-only API key.
129
+
130
+ Enable with: `--uptime <url>`
131
+
107
132
  ### deploy-cloudflare
108
133
 
109
134
  **Deploy to Cloudflare Workers**
@@ -112,24 +137,16 @@ The repo must contain a wrangler.toml (or wrangler.jsonc) at the path the button
112
137
 
113
138
  Enable with: `--cloudflare-deploy`
114
139
 
115
- ### stackblitz
140
+ ## Row 2 — is it used, is it working, is it shipped
116
141
 
117
- **Open in StackBlitz**
118
-
119
- Nothing to configure — StackBlitz imports a public repo straight from a URL: `https://stackblitz.com/github/<owner>/<repo>/tree/<branch>/<path>`. Point it at a directory that boots on its own (a package with its own package.json, or an `examples/` folder), because StackBlitz installs from the manifest at that path and a bare monorepo root will not run. Node APIs need the WebContainer runtime, which means the directory must be ESM and its deps must be installable from npm.
120
-
121
- Enable with: `--stackblitz <url>`
122
-
123
- ### codespaces
142
+ ### stars
124
143
 
125
- **Open in GitHub Codespaces**
144
+ **GitHub stars**
126
145
 
127
- Nothing to configure — the link boots the repo in a default container. Add a `.devcontainer/devcontainer.json` if the default image is missing something your install needs, because the visitor sees the failure, not you. Codespaces bills the visitor's own free hours, so the button costs you nothing.
146
+ Nothing to configure. Public repos only — shields.io cannot read a private repo.
128
147
 
129
148
  Included by default — no configuration needed.
130
149
 
131
- ## Quality — is it working, is it tested, is it shipped
132
-
133
150
  ### npm-downloads
134
151
 
135
152
  **npm monthly downloads**
@@ -202,21 +219,13 @@ Backed by `.github/workflows/deploy-test-reports.yml`, which publishes the Vites
202
219
 
203
220
  Enable with: `--test-report <url>`
204
221
 
205
- ### uptime
206
-
207
- **Uptime**
222
+ ## Row 3 — is it alive, who is behind it
208
223
 
209
- Create a monitor at uptimerobot.com, then a public status page, and link the status page here. This is a static badge — it says "brightgreen" even while you are down. For a live one use the UptimeRobot shields endpoint with a read-only API key.
210
-
211
- Enable with: `--uptime <url>`
212
-
213
- ## Community — is it alive, can I join
214
-
215
- ### stars
224
+ ### contributors
216
225
 
217
- **GitHub stars**
226
+ **Contributors**
218
227
 
219
- Nothing to configure. Public repos only — shields.io cannot read a private repo.
228
+ Nothing to configure, but it counts commit authors GitHub could match to an account — commits made with an unregistered email are attributed to nobody and do not appear here. Use `contributors-anon` instead if your history has many of those.
220
229
 
221
230
  Included by default — no configuration needed.
222
231
 
@@ -228,14 +237,6 @@ Nothing to configure. Counts direct forks only, not forks of forks, so it underc
228
237
 
229
238
  Included by default — no configuration needed.
230
239
 
231
- ### contributors
232
-
233
- **Contributors**
234
-
235
- Nothing to configure, but it counts commit authors GitHub could match to an account — commits made with an unregistered email are attributed to nobody and do not appear here. Use `contributors-anon` instead if your history has many of those.
236
-
237
- Included by default — no configuration needed.
238
-
239
240
  ### issues
240
241
 
241
242
  **Open issues**
@@ -292,6 +293,24 @@ Two different values: the numeric server id drives the online-member count (Serv
292
293
 
293
294
  Enable with: `--discord-id <id>` `--discord-invite <url>`
294
295
 
296
+ ## Row 4 — run it yourself, and what it is built with
297
+
298
+ ### stackblitz
299
+
300
+ **Open in StackBlitz**
301
+
302
+ Nothing to configure — StackBlitz imports a public repo straight from a URL: `https://stackblitz.com/github/<owner>/<repo>/tree/<branch>/<path>`. Point it at a directory that boots on its own (a package with its own package.json, or an `examples/` folder), because StackBlitz installs from the manifest at that path and a bare monorepo root will not run. Node APIs need the WebContainer runtime, which means the directory must be ESM and its deps must be installable from npm.
303
+
304
+ Enable with: `--stackblitz <url>`
305
+
306
+ ### codespaces
307
+
308
+ **Open in GitHub Codespaces**
309
+
310
+ Nothing to configure — the link boots the repo in a default container. Add a `.devcontainer/devcontainer.json` if the default image is missing something your install needs, because the visitor sees the failure, not you. Codespaces bills the visitor's own free hours, so the button costs you nothing.
311
+
312
+ Included by default — no configuration needed.
313
+
295
314
  ### prs-welcome
296
315
 
297
316
  **PRs welcome**
@@ -308,8 +327,6 @@ Reads the license GitHub detected, which comes from a recognized LICENSE file at
308
327
 
309
328
  Included by default — no configuration needed.
310
329
 
311
- ## Stack — what it is built with
312
-
313
330
  ### stack
314
331
 
315
332
  **Tech stack chips**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "template-git-repo",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "description": "One command to set up a repo with GitHub Actions, README badges, Turborepo and Codecov — the CI setup from qwksearch-research-agent, as a template",
5
5
  "type": "module",
6
6
  "bin": {
package/src/badges.js CHANGED
@@ -11,14 +11,34 @@
11
11
  * setup what a human has to do outside this repo to make it real, which is
12
12
  * the part every badge README omits. `docs/BADGES.md` is generated
13
13
  * from these strings, so the docs cannot drift from the catalog.
14
- * group which line of the badge block it belongs on. Twenty badges in one
15
- * run is a wall; four rows of five reads.
14
+ * group which line of the badge block it belongs on. See `GROUPS` below
15
+ * for what each row carries and why the split falls where it does.
16
16
  *
17
17
  * Adding a badge means adding an entry here — nothing else in the package
18
18
  * needs to know about it.
19
19
  */
20
20
 
21
- /** Row order in the rendered block. */
21
+ /**
22
+ * Row order in the rendered block, and what each row is for.
23
+ *
24
+ * The split is by the question a reader is asking, not by where the badge is
25
+ * hosted — which is why stars sits with the download counts rather than with
26
+ * the PR queue, and why the sandbox buttons sit at the bottom next to the
27
+ * stack chips instead of competing with the link to the live app.
28
+ *
29
+ * identity what this is and where to try it — DOI, wiki, app, docs, API,
30
+ * demo video, uptime, the one-click deploy button.
31
+ * quality is it used and is it working — stars, npm downloads and version,
32
+ * install size, coverage, CI.
33
+ * community is it alive and who is behind it — contributors, forks, issues,
34
+ * the PR queue, commit activity, chat.
35
+ * stack run it yourself, and what it is built with — StackBlitz,
36
+ * Codespaces, PRs welcome, license, the tech chips.
37
+ *
38
+ * Row one earns the click, row two says whether the project is worth the
39
+ * click, and the rest is for whoever is still reading. Twenty badges in one
40
+ * run is a wall; four labelled rows reads.
41
+ */
22
42
  export const GROUPS = ['identity', 'quality', 'community', 'stack'];
23
43
 
24
44
  /** @typedef {Record<string, string | undefined>} BadgeContext */
@@ -108,6 +128,17 @@ export const BADGES = [
108
128
  setup: 'A demo video does more for a README than three paragraphs. Any YouTube URL works.',
109
129
  height: '20px',
110
130
  },
131
+ {
132
+ id: 'uptime',
133
+ title: 'Uptime',
134
+ group: 'identity',
135
+ needs: ['uptimeUrl'],
136
+ alt: 'Uptime Status',
137
+ href: (c) => c.uptimeUrl,
138
+ img: () => shieldsBadge('Uptime-Status', 'brightgreen', { logo: 'uptimerobot', logoColor: 'white' }),
139
+ setup:
140
+ 'Create a monitor at uptimerobot.com, then a public status page, and link the status page here. This is a static badge — it says "brightgreen" even while you are down. For a live one use the UptimeRobot shields endpoint with a read-only API key.',
141
+ },
111
142
  {
112
143
  id: 'deploy-cloudflare',
113
144
  title: 'Deploy to Cloudflare Workers',
@@ -120,107 +151,16 @@ export const BADGES = [
120
151
  'The repo must contain a wrangler.toml (or wrangler.jsonc) at the path the button clones. Cloudflare forks the repo into the visitor\'s account and runs the build, so anything the build needs must come from `[vars]` or be prompted for — a build that requires a secret fails for every visitor.',
121
152
  height: '24px',
122
153
  },
123
- {
124
- id: 'stackblitz',
125
- title: 'Open in StackBlitz',
126
- group: 'identity',
127
- needs: ['stackblitzUrl'],
128
- alt: 'Open in StackBlitz',
129
- href: (c) => c.stackblitzUrl,
130
- img: () => 'https://developer.stackblitz.com/img/open_in_stackblitz.svg',
131
- setup:
132
- 'Nothing to configure — StackBlitz imports a public repo straight from a URL: `https://stackblitz.com/github/<owner>/<repo>/tree/<branch>/<path>`. Point it at a directory that boots on its own (a package with its own package.json, or an `examples/` folder), because StackBlitz installs from the manifest at that path and a bare monorepo root will not run. Node APIs need the WebContainer runtime, which means the directory must be ESM and its deps must be installable from npm.',
133
- height: '20px',
134
- },
135
- {
136
- id: 'codespaces',
137
- title: 'Open in GitHub Codespaces',
138
- group: 'identity',
139
- needs: [],
140
- alt: 'Open in GitHub Codespaces',
141
- href: (c) => `https://codespaces.new/${c.repoSlug}`,
142
- img: () => 'https://github.com/codespaces/badge.svg',
143
- setup:
144
- 'Nothing to configure — the link boots the repo in a default container. Add a `.devcontainer/devcontainer.json` if the default image is missing something your install needs, because the visitor sees the failure, not you. Codespaces bills the visitor\'s own free hours, so the button costs you nothing.',
145
- height: '20px',
146
- },
147
154
  {
148
155
  id: 'stars',
149
156
  title: 'GitHub stars',
150
- group: 'community',
157
+ group: 'quality',
151
158
  needs: [],
152
159
  alt: 'GitHub Stars',
153
160
  href: (c) => `https://github.com/${c.repoSlug}/stargazers`,
154
161
  img: (c) => `https://img.shields.io/github/stars/${c.repoSlug}`,
155
162
  setup: 'Nothing to configure. Public repos only — shields.io cannot read a private repo.',
156
163
  },
157
- {
158
- id: 'forks',
159
- title: 'GitHub forks',
160
- group: 'community',
161
- needs: [],
162
- alt: 'GitHub Forks',
163
- href: (c) => `https://github.com/${c.repoSlug}/forks`,
164
- img: (c) => `https://img.shields.io/github/forks/${c.repoSlug}`,
165
- setup:
166
- 'Nothing to configure. Counts direct forks only, not forks of forks, so it undercounts a repo that has been forked along a chain. Public repos only.',
167
- },
168
- {
169
- id: 'contributors',
170
- title: 'Contributors',
171
- group: 'community',
172
- needs: [],
173
- alt: 'Contributors',
174
- href: (c) => `https://github.com/${c.repoSlug}/graphs/contributors`,
175
- img: (c) => `https://img.shields.io/github/contributors/${c.repoSlug}`,
176
- setup:
177
- 'Nothing to configure, but it counts commit authors GitHub could match to an account — commits made with an unregistered email are attributed to nobody and do not appear here. Use `contributors-anon` instead if your history has many of those.',
178
- },
179
- {
180
- id: 'issues',
181
- title: 'Open issues',
182
- group: 'community',
183
- needs: [],
184
- alt: 'GitHub Issues',
185
- href: (c) => `https://github.com/${c.repoSlug}/issues`,
186
- img: (c) => `https://img.shields.io/github/issues/${c.repoSlug}?logo=github`,
187
- setup:
188
- 'Nothing to configure beyond having Issues enabled (Settings → Features). Read it as a work-in-flight number, not a defect count: shields.io asks GitHub Search, which counts pull requests as issues unless the badge path excludes them — this one uses the `/issues/` path, which already does.',
189
- },
190
- {
191
- id: 'pull-requests',
192
- title: 'Open pull requests',
193
- group: 'community',
194
- needs: [],
195
- alt: 'Open Pull Requests',
196
- href: (c) => `https://github.com/${c.repoSlug}/pulls`,
197
- img: (c) => `https://img.shields.io/github/issues-pr/${c.repoSlug}?logo=github&label=PRs`,
198
- setup:
199
- 'Nothing to configure. Counts open PRs including drafts. Pair it with the merged count below — an open count alone reads the same whether the queue moves in a day or has been stuck for a year.',
200
- },
201
- {
202
- id: 'prs-merged',
203
- title: 'Merged pull requests',
204
- group: 'community',
205
- needs: [],
206
- alt: 'Merged Pull Requests',
207
- href: (c) => `https://github.com/${c.repoSlug}/pulls?q=is%3Apr+is%3Aclosed`,
208
- img: (c) =>
209
- `https://img.shields.io/github/issues-pr-closed/${c.repoSlug}?logo=github&label=PRs%20merged&color=8957e5`,
210
- setup:
211
- 'Nothing to configure. shields.io has no "merged" endpoint — `issues-pr-closed` counts every PR that is no longer open, so PRs closed without merging are in this number too. On a repo that closes a lot of stale PRs, label it "PRs closed" instead of overstating what landed.',
212
- },
213
- {
214
- id: 'discussions',
215
- title: 'GitHub Discussions',
216
- group: 'community',
217
- needs: [],
218
- alt: 'GitHub Discussions',
219
- href: (c) => `https://github.com/${c.repoSlug}/discussions`,
220
- img: (c) => `https://img.shields.io/github/discussions/${c.repoSlug}`,
221
- setup:
222
- 'Discussions has to be turned on (Settings → Features → Discussions) or the badge reads "repo not found" — which looks identical to a private repo. Turn it on before adding the badge, not after.',
223
- },
224
164
  {
225
165
  id: 'npm-downloads',
226
166
  title: 'npm monthly downloads',
@@ -324,15 +264,71 @@ export const BADGES = [
324
264
  'Backed by `.github/workflows/deploy-test-reports.yml`, which publishes the Vitest HTML reporter output to Cloudflare Workers on every push to the default branch. Needs CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID secrets.',
325
265
  },
326
266
  {
327
- id: 'uptime',
328
- title: 'Uptime',
329
- group: 'quality',
330
- needs: ['uptimeUrl'],
331
- alt: 'Uptime Status',
332
- href: (c) => c.uptimeUrl,
333
- img: () => shieldsBadge('Uptime-Status', 'brightgreen', { logo: 'uptimerobot', logoColor: 'white' }),
267
+ id: 'contributors',
268
+ title: 'Contributors',
269
+ group: 'community',
270
+ needs: [],
271
+ alt: 'Contributors',
272
+ href: (c) => `https://github.com/${c.repoSlug}/graphs/contributors`,
273
+ img: (c) => `https://img.shields.io/github/contributors/${c.repoSlug}`,
334
274
  setup:
335
- 'Create a monitor at uptimerobot.com, then a public status page, and link the status page here. This is a static badge — it says "brightgreen" even while you are down. For a live one use the UptimeRobot shields endpoint with a read-only API key.',
275
+ 'Nothing to configure, but it counts commit authors GitHub could match to an account — commits made with an unregistered email are attributed to nobody and do not appear here. Use `contributors-anon` instead if your history has many of those.',
276
+ },
277
+ {
278
+ id: 'forks',
279
+ title: 'GitHub forks',
280
+ group: 'community',
281
+ needs: [],
282
+ alt: 'GitHub Forks',
283
+ href: (c) => `https://github.com/${c.repoSlug}/forks`,
284
+ img: (c) => `https://img.shields.io/github/forks/${c.repoSlug}`,
285
+ setup:
286
+ 'Nothing to configure. Counts direct forks only, not forks of forks, so it undercounts a repo that has been forked along a chain. Public repos only.',
287
+ },
288
+ {
289
+ id: 'issues',
290
+ title: 'Open issues',
291
+ group: 'community',
292
+ needs: [],
293
+ alt: 'GitHub Issues',
294
+ href: (c) => `https://github.com/${c.repoSlug}/issues`,
295
+ img: (c) => `https://img.shields.io/github/issues/${c.repoSlug}?logo=github`,
296
+ setup:
297
+ 'Nothing to configure beyond having Issues enabled (Settings → Features). Read it as a work-in-flight number, not a defect count: shields.io asks GitHub Search, which counts pull requests as issues unless the badge path excludes them — this one uses the `/issues/` path, which already does.',
298
+ },
299
+ {
300
+ id: 'pull-requests',
301
+ title: 'Open pull requests',
302
+ group: 'community',
303
+ needs: [],
304
+ alt: 'Open Pull Requests',
305
+ href: (c) => `https://github.com/${c.repoSlug}/pulls`,
306
+ img: (c) => `https://img.shields.io/github/issues-pr/${c.repoSlug}?logo=github&label=PRs`,
307
+ setup:
308
+ 'Nothing to configure. Counts open PRs including drafts. Pair it with the merged count below — an open count alone reads the same whether the queue moves in a day or has been stuck for a year.',
309
+ },
310
+ {
311
+ id: 'prs-merged',
312
+ title: 'Merged pull requests',
313
+ group: 'community',
314
+ needs: [],
315
+ alt: 'Merged Pull Requests',
316
+ href: (c) => `https://github.com/${c.repoSlug}/pulls?q=is%3Apr+is%3Aclosed`,
317
+ img: (c) =>
318
+ `https://img.shields.io/github/issues-pr-closed/${c.repoSlug}?logo=github&label=PRs%20merged&color=8957e5`,
319
+ setup:
320
+ 'Nothing to configure. shields.io has no "merged" endpoint — `issues-pr-closed` counts every PR that is no longer open, so PRs closed without merging are in this number too. On a repo that closes a lot of stale PRs, label it "PRs closed" instead of overstating what landed.',
321
+ },
322
+ {
323
+ id: 'discussions',
324
+ title: 'GitHub Discussions',
325
+ group: 'community',
326
+ needs: [],
327
+ alt: 'GitHub Discussions',
328
+ href: (c) => `https://github.com/${c.repoSlug}/discussions`,
329
+ img: (c) => `https://img.shields.io/github/discussions/${c.repoSlug}`,
330
+ setup:
331
+ 'Discussions has to be turned on (Settings → Features → Discussions) or the badge reads "repo not found" — which looks identical to a private repo. Turn it on before adding the badge, not after.',
336
332
  },
337
333
  {
338
334
  id: 'commit-activity',
@@ -366,10 +362,34 @@ export const BADGES = [
366
362
  setup:
367
363
  'Two different values: the numeric server id drives the online-member count (Server Settings → Widget → Enable Server Widget, then copy the Server ID), and the invite link is where the badge points. Without the widget enabled the badge reads "invite" instead of a count.',
368
364
  },
365
+ {
366
+ id: 'stackblitz',
367
+ title: 'Open in StackBlitz',
368
+ group: 'stack',
369
+ needs: ['stackblitzUrl'],
370
+ alt: 'Open in StackBlitz',
371
+ href: (c) => c.stackblitzUrl,
372
+ img: () => 'https://developer.stackblitz.com/img/open_in_stackblitz.svg',
373
+ setup:
374
+ 'Nothing to configure — StackBlitz imports a public repo straight from a URL: `https://stackblitz.com/github/<owner>/<repo>/tree/<branch>/<path>`. Point it at a directory that boots on its own (a package with its own package.json, or an `examples/` folder), because StackBlitz installs from the manifest at that path and a bare monorepo root will not run. Node APIs need the WebContainer runtime, which means the directory must be ESM and its deps must be installable from npm.',
375
+ height: '20px',
376
+ },
377
+ {
378
+ id: 'codespaces',
379
+ title: 'Open in GitHub Codespaces',
380
+ group: 'stack',
381
+ needs: [],
382
+ alt: 'Open in GitHub Codespaces',
383
+ href: (c) => `https://codespaces.new/${c.repoSlug}`,
384
+ img: () => 'https://github.com/codespaces/badge.svg',
385
+ setup:
386
+ 'Nothing to configure — the link boots the repo in a default container. Add a `.devcontainer/devcontainer.json` if the default image is missing something your install needs, because the visitor sees the failure, not you. Codespaces bills the visitor\'s own free hours, so the button costs you nothing.',
387
+ height: '20px',
388
+ },
369
389
  {
370
390
  id: 'prs-welcome',
371
391
  title: 'PRs welcome',
372
- group: 'community',
392
+ group: 'stack',
373
393
  needs: [],
374
394
  alt: 'PRs Welcome',
375
395
  href: () =>
@@ -380,7 +400,7 @@ export const BADGES = [
380
400
  {
381
401
  id: 'license',
382
402
  title: 'License',
383
- group: 'community',
403
+ group: 'stack',
384
404
  needs: [],
385
405
  alt: 'License',
386
406
  href: (c) => `https://github.com/${c.repoSlug}/blob/${c.defaultBranch}/LICENSE.md`,