agentloopkit 0.1.0 → 0.24.0

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
@@ -2,10 +2,16 @@
2
2
 
3
3
  A drop-in engineering loop for coding agents.
4
4
 
5
- Your coding agent can already write code. AgentLoopKit helps it work like a disciplined engineer: scoped task contracts, explicit safety rules, verification evidence, review summaries, and clean handoffs.
5
+ Your coding agent can write code. AgentLoopKit gives it the repo habits reviewers need: scoped task contracts, safety rules, verification evidence, review summaries, and clean handoffs.
6
6
 
7
7
  Vibe coding produces code. Agentic engineering produces auditable work.
8
8
 
9
+ <p align="center">
10
+ <img src="https://raw.githubusercontent.com/abhiyoheswaran1/AgentLoopKit/main/docs/assets/readme/agentloopkit-showcase.png" alt="AgentLoopKit workflow showing task contracts, verification reports, and handoff artifacts" width="100%">
11
+ </p>
12
+
13
+ The screenshots and terminal demo in this README are generated from committed sources in `docs/assets/readme/` with Playwright and VHS.
14
+
9
15
  ## What It Is
10
16
 
11
17
  AgentLoopKit is a repo-level toolkit for developers using Codex, Claude Code, Cursor, OpenCode, Gemini CLI, GitHub Copilot CLI, and other coding agents.
@@ -40,17 +46,55 @@ npx agentloopkit init
40
46
  npx agentloopkit init --dry-run
41
47
  ```
42
48
 
49
+ Latest GitHub release: `v0.24.0`. npm still serves `0.1.1`: the next npm publish should catch up once to `0.24.0`; after that, releases return to normal sequential semver. Local `npm whoami` currently returns `E401`, so npm publish is blocked from this shell.
50
+
51
+ See [docs/release-status.md](docs/release-status.md) for the current GitHub/npm status and update rules.
52
+
53
+ Until npm catches up, run the current GitHub release tarball directly:
54
+
55
+ ```bash
56
+ npx --yes --package https://github.com/abhiyoheswaran1/AgentLoopKit/releases/download/v0.24.0/agentloopkit-0.24.0.tgz agentloop version
57
+ npx --yes --package https://github.com/abhiyoheswaran1/AgentLoopKit/releases/download/v0.24.0/agentloopkit-0.24.0.tgz agentloop init
58
+ ```
59
+
60
+ The npm version jump has one reason: GitHub releases already exist for the intermediate AgentLoopKit versions between the npm-published `0.1.1` package and the current `v0.24.0` source line. Publishing older numbers from current `main` would create npm packages that do not match their GitHub tags. Once npm authentication or trusted publishing works, the next npm publish should ship `0.24.0`; future releases should then continue with normal sequential semver.
61
+
43
62
  Run the CLI after install:
44
63
 
45
64
  ```bash
46
65
  npx agentloopkit doctor
47
66
  npx agentloopkit create-task --title "Add settings page" --type feature
67
+ npx agentloopkit task list
68
+ npx agentloopkit task show .agentloop/tasks/2026-06-09-add-settings-page.md
69
+ npx agentloopkit task set .agentloop/tasks/2026-06-09-add-settings-page.md
70
+ npx agentloopkit task status .agentloop/tasks/2026-06-09-add-settings-page.md in-progress
71
+ npx agentloopkit status
72
+ npx agentloopkit next
48
73
  npx agentloopkit verify
49
- npx agentloopkit summarize --write
74
+ npx agentloopkit handoff
75
+ npx agentloopkit check-gates
76
+ npx agentloopkit check-gates --strict
77
+ npx agentloopkit report
78
+ npx agentloopkit badge
79
+ npx agentloopkit ci-summary
80
+ npx agentloopkit release-notes
81
+ npx agentloopkit npm-status
82
+ npx agentloopkit policy list
83
+ npx agentloopkit policy show security
84
+ npx agentloopkit policy status
85
+ npx agentloopkit task archive .agentloop/tasks/2026-06-09-add-settings-page.md
50
86
  npx agentloopkit install-agent codex
51
87
  npx agentloopkit install-agent all
88
+ npx agentloopkit completion zsh
89
+ npx agentloopkit completion powershell
52
90
  ```
53
91
 
92
+ <p align="center">
93
+ <img src="https://raw.githubusercontent.com/abhiyoheswaran1/AgentLoopKit/main/docs/assets/readme/agentloopkit-cli.gif" alt="Terminal demo running AgentLoopKit init, task contracts, active task status, task-linked verify, handoff, reports, badges, release notes, gates, and task archive commands" width="100%">
94
+ </p>
95
+
96
+ The VHS demo runs the local built CLI so the command flow matches this repository even when npm is behind.
97
+
54
98
  Pinned team usage:
55
99
 
56
100
  ```bash
@@ -70,18 +114,39 @@ pnpm build
70
114
 
71
115
  ## CLI Commands
72
116
 
73
- | Command | Purpose |
74
- | ------------------------------- | ------------------------------------------------------- |
75
- | `agentloop init` | Generate the repo harness and config |
76
- | `agentloop init --dry-run` | Preview generated files without writing them |
77
- | `agentloop doctor` | Check setup health, commands, git state, and risk files |
78
- | `agentloop create-task` | Create a task contract in `.agentloop/tasks/` |
79
- | `agentloop verify` | Run configured checks and write a verification report |
80
- | `agentloop summarize` | Generate a deterministic PR or reviewer summary |
81
- | `agentloop install-agent codex` | Add agent-specific instructions |
82
- | `agentloop install-agent all` | Add all bundled agent instruction files |
83
- | `agentloop list-templates` | List bundled templates |
84
- | `agentloop version` | Print the CLI version |
117
+ | Command | Purpose |
118
+ | --------------------------------------- | ------------------------------------------------------------------------------ |
119
+ | `agentloop init` | Generate the repo harness and config |
120
+ | `agentloop init --dry-run` | Preview generated files without writing them |
121
+ | `agentloop doctor` | Check setup health, template version, commands, git state, and risk categories |
122
+ | `agentloop create-task` | Create a task contract in `.agentloop/tasks/` |
123
+ | `agentloop task list` | List task contracts and show the pinned active task |
124
+ | `agentloop task show <path>` | Print a task contract without changing active state |
125
+ | `agentloop task set <path>` | Pin the active task for status and handoffs |
126
+ | `agentloop task status <path> <status>` | Update a task contract status line |
127
+ | `agentloop task archive <path>` | Move a task contract into `.agentloop/tasks/archive/` |
128
+ | `agentloop task current` | Print the pinned active task |
129
+ | `agentloop task clear` | Clear the active task pointer |
130
+ | `agentloop status` | Show active task, latest report, dirty files, next step |
131
+ | `agentloop next` | Print only the next recommended loop action |
132
+ | `agentloop check-gates` | Check task, verification, handoff, harness, policy, and git evidence |
133
+ | `agentloop check-gates --strict` | Treat warning gates as failures for CI |
134
+ | `agentloop verify` | Run configured checks and write a verification report |
135
+ | `agentloop summarize` | Generate a deterministic PR or reviewer summary |
136
+ | `agentloop handoff` | Write a reviewer handoff summary |
137
+ | `agentloop report` | Write a local static HTML evidence report |
138
+ | `agentloop badge` | Write a local SVG evidence badge |
139
+ | `agentloop ci-summary` | Summarize CI context and local AgentLoop evidence |
140
+ | `agentloop release-notes` | Draft local release notes from changelog, git, task, and verification evidence |
141
+ | `agentloop npm-status` | Check npm registry catch-up status without publishing |
142
+ | `agentloop policy list` | List local safety policy files |
143
+ | `agentloop policy show <policy>` | Print a local safety policy without mutating files |
144
+ | `agentloop policy status` | Compare local policy files with bundled templates |
145
+ | `agentloop install-agent codex` | Add agent-specific instructions |
146
+ | `agentloop install-agent all` | Add all bundled agent instruction files |
147
+ | `agentloop list-templates` | List bundled templates |
148
+ | `agentloop completion <shell>` | Print bash, zsh, fish, or PowerShell completion scripts |
149
+ | `agentloop version` | Print the CLI version |
85
150
 
86
151
  The package exposes two binaries:
87
152
 
@@ -90,10 +155,32 @@ agentloop init
90
155
  agentloopkit init
91
156
  ```
92
157
 
158
+ ## Shell Completions
159
+
160
+ AgentLoopKit prints completion scripts to stdout. It does not edit `.zshrc`, `.bashrc`, fish config, PowerShell startup files, or other shell profile files.
161
+
162
+ Inspect a script before installing it:
163
+
164
+ ```bash
165
+ agentloop completion zsh
166
+ agentloop completion bash
167
+ agentloop completion fish
168
+ agentloop completion powershell
169
+ agentloop completion pwsh
170
+ ```
171
+
172
+ Example zsh setup:
173
+
174
+ ```bash
175
+ mkdir -p ~/.zsh/completions
176
+ agentloop completion zsh > ~/.zsh/completions/_agentloop
177
+ ```
178
+
93
179
  ## Generated Files
94
180
 
95
181
  ```text
96
182
  .agentloop/
183
+ manifest.json
97
184
  loops/
98
185
  gates/
99
186
  handoffs/
@@ -109,10 +196,12 @@ agentloop.config.json
109
196
 
110
197
  `init` appends to an existing `AGENTS.md` instead of overwriting it.
111
198
 
112
- The package ships `schema/agentloop.config.schema.json` for editors and config validation.
199
+ The package ships `schema/agentloop.config.schema.json` for editors and config validation. Generated configs use the GitHub raw schema URL for editor support; the CLI validates config locally and does not fetch that URL at runtime.
113
200
 
114
201
  See `docs/configuration.md` for config fields and schema notes.
115
202
 
203
+ Fresh `init` also writes `.agentloop/manifest.json` so `doctor` can report which template generation created the local harness. See `docs/template-migrations.md` for manual upgrade guidance.
204
+
116
205
  ## Agent Usage
117
206
 
118
207
  Install instructions for the agent you use:
@@ -133,9 +222,34 @@ AgentLoopKit only writes safe repo-local Markdown instructions when exact third-
133
222
  Create a contract before a coding session:
134
223
 
135
224
  ```bash
136
- agentloop create-task --type feature --title "Add settings page"
225
+ agentloop create-task --type feature --title "Add settings page" \
226
+ --problem-statement "Users cannot manage account preferences" \
227
+ --desired-outcome "Users can update settings from the app" \
228
+ --likely-file src/settings \
229
+ --forbidden-file migrations/ \
230
+ --acceptance "Settings can be saved" \
231
+ --verification "pnpm test" \
232
+ --rollback "Remove the settings route"
137
233
  ```
138
234
 
235
+ Pin the contract when more than one task exists:
236
+
237
+ ```bash
238
+ agentloop task list
239
+ agentloop task show .agentloop/tasks/2026-06-09-add-settings-page.md
240
+ agentloop task set .agentloop/tasks/2026-06-09-add-settings-page.md
241
+ agentloop task status .agentloop/tasks/2026-06-09-add-settings-page.md in-progress
242
+ agentloop task archive .agentloop/tasks/2026-06-09-add-settings-page.md
243
+ agentloop task current
244
+ agentloop task clear
245
+ ```
246
+
247
+ `task list --json` gives agents a deterministic list with `path`, `title`, `status`, `active`, and `modifiedAt`. Listing tasks does not create or update `.agentloop/state.json`.
248
+ `create-task --json` returns the created task path and Markdown content so agents do not need to parse the human success line.
249
+ `task show --json` returns the selected task metadata and Markdown content without changing active state.
250
+ `task status --json` updates only the `- Status:` line. Supported values are `proposed`, `in-progress`, `blocked`, `review`, and `done`. Status is not verification evidence; run `agentloop verify` before claiming completion.
251
+ `task archive --json` moves one named Markdown contract into `.agentloop/tasks/archive/`, refuses to overwrite an existing archive file, and clears the active task pointer when it archives the active task. Archive after verification and handoff, not as a substitute for either.
252
+
139
253
  Each contract records:
140
254
 
141
255
  - problem statement
@@ -157,20 +271,205 @@ Each contract records:
157
271
  .agentloop/reports/YYYY-MM-DD-HH-mm-verification-report.md
158
272
  ```
159
273
 
160
- It does not hide failures. If no commands are configured, it writes a report saying nothing was verified.
274
+ Pass `--task .agentloop/tasks/file.md` to include task title, type, status, and path in the report. AgentLoopKit reads Markdown task contracts for this flag. It reports `.env`-style paths as unavailable instead of reading them.
275
+
276
+ It does not hide failures. Failed reports include a short failure summary with each failed command, exit code, and final useful output lines before the full command output. If long logs are truncated, the report keeps the first and last output so the final error stays visible. If no commands are configured, it writes a report saying nothing was verified.
277
+
278
+ When `agentloop verify` runs in GitHub Actions, the report records the workflow, event, ref, commit, run URL, and run attempt. Local reports stay quiet. AgentLoopKit does not read `.env` files or print arbitrary environment variables.
279
+
280
+ In monorepos, `doctor` warns on common workspace markers and suggests package-specific verification commands. Add package checks to the task contract when root commands do not cover the touched package, for example `pnpm --filter web test` or `npm --workspace api test`. AgentLoopKit records and runs configured commands; it does not infer package graphs or run workspace commands automatically.
281
+
282
+ `doctor` also reports potential risk files by category, such as migrations, auth, deployment, lockfiles, and env files. It lists path examples only. It does not read `.env` contents or claim to scan secrets.
283
+ See `docs/doctor-risk-files.md` for category examples, limits, and reviewer actions.
284
+
285
+ ## Status
286
+
287
+ `agentloop status` gives agents and humans a quick local readout:
288
+
289
+ - active task contract, using `agentloop task set` when present
290
+ - newest task contract when no active task is pinned
291
+ - latest verification report
292
+ - working tree state
293
+ - configured and missing commands
294
+ - next suggested command
295
+
296
+ Use JSON output in scripts:
297
+
298
+ ```bash
299
+ agentloop status --json
300
+ ```
301
+
302
+ Use `agentloop next` when an agent or script only needs the next local command:
303
+
304
+ ```bash
305
+ agentloop next
306
+ agentloop next --json
307
+ ```
308
+
309
+ `next` uses the same decision rules as `status`. It does not run verification commands, create task state, call an LLM, make network requests, or read `.env` contents.
310
+ When an active in-progress task exists, an older verification report does not count as current evidence for that task.
311
+
312
+ See `docs/status.md` for output fields and next-action rules.
313
+
314
+ ## Gate Checks
315
+
316
+ `agentloop check-gates` checks review evidence without running tests or calling an LLM. It looks for:
317
+
318
+ - a task contract
319
+ - a generated verification report
320
+ - a generated handoff summary
321
+ - repo harness files
322
+ - core safety policies
323
+ - git working tree context
324
+
325
+ Use JSON output in scripts:
326
+
327
+ ```bash
328
+ agentloop check-gates --json
329
+ agentloop check-gates --strict
330
+ ```
331
+
332
+ Warnings keep exit code `0` by default. Use `--strict` in CI when warning gates should fail the command.
333
+
334
+ `doctor` checks setup health. `check-gates` checks whether the current work session has the evidence reviewers expect.
335
+
336
+ See `docs/check-gates.md` for gate statuses and exit-code behavior.
337
+
338
+ ## HTML Reports
339
+
340
+ `agentloop report` writes a local static HTML page from the current task contract, latest verification report, latest handoff, git status, diff stats, and deterministic review summary:
341
+
342
+ ```bash
343
+ agentloop report
344
+ agentloop report --json
345
+ agentloop report --out .agentloop/reports/review.html
346
+ ```
347
+
348
+ The command does not run tests, call an LLM, fetch assets, read `.env` contents, or send data anywhere. It writes one local file under `.agentloop/reports/` by default. Use it after `verify` and `handoff` when you want a browser-readable artifact for a PR or CI upload.
349
+
350
+ See `docs/html-reports.md` for inputs, output paths, and safety behavior.
351
+
352
+ ## Evidence Badges
353
+
354
+ `agentloop badge` writes a local SVG badge from existing evidence:
355
+
356
+ ```bash
357
+ agentloop badge
358
+ agentloop badge --source gates
359
+ agentloop badge --json
360
+ ```
361
+
362
+ The default badge reads the latest verification report and writes `.agentloop/reports/agentloop-verification.svg`. Gate badges read local gate status and write `.agentloop/reports/agentloop-gates.svg`. The command does not run tests, call a badge service, read `.env`, or upload anything.
363
+
364
+ See `docs/badges.md` for badge sources and CI usage.
365
+
366
+ ## CI Summaries
367
+
368
+ `agentloop ci-summary` reads allowlisted CI provenance fields and existing AgentLoop artifacts:
369
+
370
+ ```bash
371
+ agentloop ci-summary
372
+ agentloop ci-summary --json
373
+ agentloop ci-summary --write
374
+ ```
375
+
376
+ In GitHub Actions, GitLab CI, and Buildkite it reports provider, workflow or pipeline, event, ref, commit, and run URL when those allowlisted fields are present. Unsupported CI providers report generic CI when `CI=true` is present. The command does not call provider APIs, read secrets, upload files, run tests, or dump arbitrary environment variables.
377
+
378
+ Use `--write` when CI should upload a small Markdown summary alongside verification reports, HTML reports, badges, and handoffs. Verification consumers still read `*-verification-report.md`; CI summary artifacts do not replace verification evidence.
379
+
380
+ See `docs/ci-summary.md`.
381
+
382
+ ## Release Notes
383
+
384
+ `agentloop release-notes` drafts local release notes from the repository state:
385
+
386
+ ```bash
387
+ agentloop release-notes
388
+ agentloop release-notes --from v0.19.0 --to HEAD
389
+ agentloop release-notes --release-version 0.24.0
390
+ agentloop release-notes --json
391
+ agentloop release-notes --write
392
+ ```
393
+
394
+ The command reads local package metadata, changelog entries, git history, changed files, working tree status, the active task, the latest verification report, and the latest CI summary when those artifacts exist. It does not create tags, publish packages, call GitHub or npm APIs, read tokens, upload files, or rewrite changelogs.
395
+
396
+ Use it before creating a GitHub release so the release note draft includes the same evidence reviewers see in AgentLoop handoffs.
397
+
398
+ See `docs/release-notes.md`.
399
+
400
+ `agentloop npm-status` checks whether npm latest matches the local package version:
401
+
402
+ ```bash
403
+ agentloop npm-status
404
+ agentloop npm-status --json
405
+ agentloop npm-status --expect-current
406
+ agentloop npm-status --registry-json npm-view.json
407
+ ```
408
+
409
+ Use it after a publish attempt before saying npm has caught up. It runs `npm view` unless you pass captured registry JSON. It does not publish packages, create tags, read tokens, read `.env` files, upload files, or change package metadata.
410
+
411
+ See `docs/npm-status.md`.
412
+
413
+ <p align="center">
414
+ <img src="https://raw.githubusercontent.com/abhiyoheswaran1/AgentLoopKit/main/docs/assets/readme/agentloopkit-verification.png" alt="AgentLoopKit verification report screenshot showing task context, passing command results, and reviewer handoff sections" width="100%">
415
+ </p>
416
+
417
+ ## Policies
418
+
419
+ `agentloop policy` makes generated repo policy files visible from the CLI:
420
+
421
+ ```bash
422
+ agentloop policy list
423
+ agentloop policy show security
424
+ agentloop policy status
425
+ agentloop policy list --json
426
+ agentloop policy status --json
427
+ ```
428
+
429
+ The command reads Markdown files from `.agentloop/policies/`. `policy status` reports `current`, `modified`, `missing`, and `extra` files by comparing local Markdown with bundled templates. It does not enforce compliance, scan source code, fetch remote policy packs, or mutate policy files.
430
+
431
+ Local policy files are repo guidance. A `modified` policy can be intentional; review it like code instead of overwriting it to match the bundled template.
432
+
433
+ See `docs/policies.md`.
434
+
435
+ ## Security Reviews
436
+
437
+ Use `security-review` task contracts when a change touches auth, sessions, permissions, secrets, dependencies, deployment config, migrations, billing, or other sensitive areas.
438
+
439
+ AgentLoopKit helps reviewers see scope, checks run, checks skipped, risk notes, and rollback instructions. It does not scan code, certify compliance, or prove that code is secure.
440
+
441
+ See `docs/security-review.md` and `examples/security-review/` for a copyable review task, verification report, and PR summary.
442
+
443
+ ## Dependency Upgrades
444
+
445
+ Use `dependency-upgrade` task contracts when an agent changes packages or lockfiles. AgentLoopKit records upgrade scope, lockfile impact, verification, risks, and rollback notes. It does not choose package versions, scan advisories, or call package registries.
446
+
447
+ See `docs/dependency-upgrades.md` and `examples/dependency-upgrade/`.
448
+
449
+ ## CI Recipes
450
+
451
+ Use `agentloop check-gates --strict` as a review-evidence gate in pull request CI. Use `agentloop verify`, `agentloop handoff`, `agentloop report`, `agentloop badge`, `agentloop ci-summary --write`, and `agentloop release-notes --write` in CI when you want evidence artifacts uploaded for reviewers.
452
+
453
+ CI-generated verification reports include GitHub Actions provenance when available, so reviewers can trace an artifact back to the workflow run that created it.
454
+
455
+ See `docs/github-actions.md`, `examples/github-actions/`, `examples/gitlab-ci/`, and `examples/buildkite/` for copy-pasteable workflows. Until npm catches up, the examples pin the latest public GitHub release tarball. Current source moves to a new tarball when the next GitHub release is cut.
161
456
 
162
457
  ## PR Summaries
163
458
 
164
- `agentloop summarize` uses deterministic inputs:
459
+ `agentloop handoff` writes a reviewer-ready summary using deterministic inputs:
165
460
 
166
461
  - git status
167
462
  - git diff stats
168
- - latest task contract
463
+ - active task contract, or newest task when no active task is pinned
169
464
  - latest verification report
170
465
  - config settings
171
466
 
467
+ The summary groups changed files into review areas such as source, tests, docs, CI, config, AgentLoop artifacts, and risk-sensitive paths. It adds review-focus hints from file paths only.
468
+
172
469
  It does not call an LLM.
173
470
 
471
+ Use `agentloop summarize` to preview the same output without writing a handoff file. `agentloop summarize --write` remains available for scripts.
472
+
174
473
  ## Safety Principles
175
474
 
176
475
  AgentLoopKit is intentionally boring:
@@ -220,6 +519,11 @@ See `examples/` for sample generated harnesses:
220
519
  - `examples/python-service`
221
520
  - `examples/docs-only`
222
521
  - `examples/empty-repo`
522
+ - `examples/github-actions`
523
+ - `examples/security-review`
524
+ - `examples/dependency-upgrade`
525
+
526
+ See `docs/stack-recipes.md` for Next.js, React/Vite, Remix, SvelteKit, Node API, Django, FastAPI, Python, docs-only, empty-repo, and monorepo verification recipes.
223
527
 
224
528
  ## Roadmap
225
529
 
@@ -227,13 +531,19 @@ See `ROADMAP.md`.
227
531
 
228
532
  ## Publishing Status
229
533
 
230
- The repository includes a GitHub Actions publish workflow for npm trusted publishing. Configure the package on npm, publish a GitHub release, and the workflow will run checks before `npm publish --provenance`.
534
+ AgentLoopKit is published on npm as `agentloopkit`, but npm currently serves `0.1.1`. GitHub release `v0.24.0` carries task-linked verification reports, failed-verification summaries, the guarded `--task` path behavior, refreshed README visuals, PowerShell shell completions, and the read-only `npm-status` catch-up check. npm still needs account authentication or trusted-publishing repair before a catch-up release lands.
535
+
536
+ Do not publish stale older versions from current `main`. If `CHANGELOG.md` has real entries under `Unreleased`, the prepublish guard blocks npm publish until release metadata is prepared.
537
+
538
+ The npm version jump is intentional. The skipped npm numbers already exist as public GitHub release candidates while npm publishing was blocked, so the next npm publish should ship the current release line rather than backfilling old source snapshots.
539
+
540
+ The repository includes a GitHub Actions publish workflow for npm trusted publishing after the package is configured on npm. The workflow runs checks before `npm publish` and skips publish when the version already exists.
231
541
 
232
- See `docs/launch-checklist.md` before publishing.
542
+ See `docs/launch-checklist.md` before publishing. See `docs/npm-status.md`, `docs/release-checklist-example.md`, and `examples/release-checklist/` for registry checks and compact maintainer handoffs when GitHub is current but npm is still behind.
233
543
 
234
544
  ## Contributing
235
545
 
236
- See `CONTRIBUTING.md`.
546
+ See `CONTRIBUTING.md` for local setup and PR expectations. Maintainers can use `docs/contributor-playbook.md` for copyable good-first issue examples.
237
547
 
238
548
  ## License
239
549