Skip to content

Commit ee25216

Browse files
authored
🤖 feat: add coder-docs Mux agent skill with offline docs snapshot (#21)
## Summary Adds a new Mux agent skill (`coder-docs`) that bundles a text-only offline snapshot of the `coder/coder` documentation, enabling future Mux instances to answer "how does Coder do X?" without pasting the entire docs corpus into context. ## Background When working in this repo, agents frequently need to reference Coder's documentation (API behavior, deployment options, template authoring, etc.). Without a local skill, they either hallucinate or require expensive web fetches. This skill provides progressive-disclosure access through a generated navigation tree and ~4.5MB of committed Markdown docs. ## Implementation ### New files - **`hack/gen-coder-docs-skill/main.go`** — Go CLI tool (stdlib only) that: - Syncs a text-only docs snapshot from upstream `coder/coder/docs/` (excluding images) - Parses `manifest.json` and renders a hierarchical docs tree - Injects generated content between markers in `SKILL.md` - Writes `SNAPSHOT.json` with provenance metadata - Defensive: fails fast on missing files, bad markers, unreferenced paths - **`hack/update-coder-docs-skill.sh`** — Shell script that clones/updates `coder/coder` into `tmpfork/` and runs the generator - **`.mux/skills/coder-docs/SKILL.md`** — Skill definition with generated navigation tree (415 routes) - **`.mux/skills/coder-docs/NOTICE.md`** — Licensing attribution - **`.mux/skills/coder-docs/LICENSE`** — AGPL-3.0 (upstream license) - **`.mux/skills/coder-docs/references/docs/`** — Committed snapshot (~4.5MB text-only) ### Modified files - **`Makefile`** — Added `update-coder-docs-skill` target - **`AGENTS.md`** — Added skill reference and update command ## Validation - `make build` ✅ - `make test` ✅ - `make verify-vendor` ✅ - `GOFLAGS=-mod=vendor go vet ./...` ✅ - `make update-coder-docs-skill` ✅ (end-to-end generation from upstream) - Verified: no images copied, all manifest routes resolve, markers populated ## Risks Low risk — this is additive infrastructure (new skill + generator). No existing code paths are modified. The snapshot is committed but can be refreshed at any time via `make update-coder-docs-skill`. --- <details> <summary>📋 Implementation Plan</summary> # Plan: Convert `coder/coder` docs into a Mux Agent Skill (`coder-docs`) ## Context / Why We want a **project-local agent skill** that gives Mux agents **progressive-disclosure access** to the `coder/coder` documentation: - Offline(ish) access via files committed under `.mux/skills/.../references/`. - A deterministic, auto-generated **docs index tree** (like Mux’s built-in `mux-docs` skill) so agents can quickly locate relevant pages. - A repeatable **update script** that refreshes the snapshot from upstream `coder/coder` into this repo. This enables future Mux instances working in this repo to answer “how does Coder do X?” without pasting the entire docs corpus into context. ## Evidence (what we verified) - Mux’s built-in docs skill is generated via markers + nav parsing: - `tmpfork/mux/scripts/gen_builtin_skills.ts` (injects `DOCS_TREE` between `<!-- BEGIN ... -->` markers; bundles docs). - `coder/coder` docs are file-based Markdown with a machine-readable navigation tree: - `tmpfork/coder/docs/manifest.json` (recursive `routes[]` with `title`, `description`, `path`, optional `children`). - Example doc format: `tmpfork/coder/docs/install/index.md` (Markdown with some inline HTML; no YAML frontmatter). - Size constraints: - `tmpfork/coder/docs` is ~89MB total, but `docs/images` is ~85MB. - Text-only docs (excluding `images/`) are ~4.5MB, which is feasible to commit into `.mux/skills/.../references/`. - Licensing note: - `tmpfork/coder/LICENSE` is AGPL-3.0. Vendoring docs requires intentional attribution/notice. ## Implementation details ### 1) Add a new skill directory: `.mux/skills/coder-docs/` Create a new skill named **`coder-docs`**: - `.mux/skills/coder-docs/SKILL.md` - `.mux/skills/coder-docs/references/docs/` (generated snapshot; committed) #### `SKILL.md` (template + generated sections) Keep the file mostly static, but with two generated blocks updated by the update script: - `SNAPSHOT` block: what upstream commit this snapshot came from. - `DOCS_TREE` block: a hierarchical index derived from `docs/manifest.json`. Template skeleton: ```md --- name: coder-docs description: Index + offline snapshot of coder/coder documentation (progressive disclosure). --- # Coder Docs This skill bundles a text-only snapshot of the documentation from `coder/coder`. ## How to use - Use the generated **Docs tree** below to locate a topic, then read the exact page: ```ts agent_skill_read_file({ name: "coder-docs", filePath: "references/docs/install/docker.md", }); ``` - To understand the full navigation source-of-truth, read the manifest: ```ts agent_skill_read_file({ name: "coder-docs", filePath: "references/docs/manifest.json", }); ``` - If you need to keyword-search locally (outside the skill tool), use ripgrep in the repo: ```bash rg -n "<keyword>" .mux/skills/coder-docs/references/docs ``` ## Snapshot <!-- BEGIN SNAPSHOT --> <!-- END SNAPSHOT --> ## Docs tree (auto-generated) <!-- BEGIN DOCS_TREE --> <!-- END DOCS_TREE --> ``` ### 2) Add an update script: `hack/update-coder-docs-skill.sh` Goal: one command that (a) updates `tmpfork/coder` and (b) regenerates the skill’s `references/docs/` snapshot + `SKILL.md` generated sections. **Why `hack/`?** This repo already uses `hack/update-*.sh` for generated artifacts. #### Script responsibilities 1. **Dependency checks** (fail fast): `git`, `go`. 2. **Clone/update** `coder/coder` into `./tmpfork/coder`: - If missing: shallow clone. - If present: `fetch` and `reset --hard` to a known ref (default: `origin/main`). 3. **Run the Go generator** (`hack/gen-coder-docs-skill/main.go`) which: - Refreshes the snapshot under `.mux/skills/coder-docs/references/docs/` (wipes destination first to avoid stale files; copies `manifest.json` + all `**/*.md`; **excludes** `docs/images/`). - Regenerates the `DOCS_TREE` block in `.mux/skills/coder-docs/SKILL.md`. - Writes snapshot metadata (upstream commit SHA + timestamp) to: - the `SNAPSHOT` block in `SKILL.md`, and - `references/docs/SNAPSHOT.json` (machine-readable). #### Proposed script shape (pseudo-code) ```bash #!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" CODER_DIR="$ROOT/tmpfork/coder" SKILL_DIR="$ROOT/.mux/skills/coder-docs" DEST_DOCS_DIR="$SKILL_DIR/references/docs" # 1) deps command -v git >/dev/null command -v go >/dev/null # 2) clone/update if [[ ! -d "$CODER_DIR/.git" ]]; then git clone --depth=1 https://github.com/coder/coder "$CODER_DIR" else git -C "$CODER_DIR" fetch origin main --depth=1 git -C "$CODER_DIR" reset --hard origin/main fi CODER_SHA="$(git -C "$CODER_DIR" rev-parse HEAD)" # 3) sync docs snapshot + generate + inject (Go tool does it all) cd "$ROOT" GOFLAGS=-mod=vendor go run ./hack/gen-coder-docs-skill/main.go \ --source-docs-root "$CODER_DIR/docs" \ --dest-docs-root "$DEST_DOCS_DIR" \ --skill-md "$SKILL_DIR/SKILL.md" \ --coder-sha "$CODER_SHA" \ --snapshot-out "$DEST_DOCS_DIR/SNAPSHOT.json" ``` ### 3) Add the generator helper: `hack/gen-coder-docs-skill/main.go` Implement the JSON parsing + marker injection logic in Go (stdlib only) so it matches this repo’s primary language and avoids a Python runtime dependency. #### Generator requirements (defensive by default) - **Fail fast** if `SKILL.md` markers are missing or malformed. - **Sync snapshot** from `--source-docs-root` → `--dest-docs-root`: - wipe destination first (prevents stale docs), - copy `manifest.json` + all `**/*.md`, - skip `images/` and any non-markdown assets. - **Fail fast** if a `manifest.json` route references a doc path that does not exist under `--dest-docs-root` (after sync). - Normalize newlines (`\r\n` → `\n`) for deterministic diffs. - Use only the Go standard library (no `go.mod` / `vendor/` changes). #### Core logic sketch ```go type Manifest struct { Routes []Route `json:"routes"` } type Route struct { Title string `json:"title"` Description string `json:"description"` Path string `json:"path"` Children []Route `json:"children"` } func injectBlock(content, marker, block string) (string, error) { begin := "<!-- BEGIN " + marker + " -->" end := "<!-- END " + marker + " -->" bi := strings.Index(content, begin) ei := strings.Index(content, end) if bi == -1 || ei == -1 || ei < bi { return "", fmt.Errorf("missing markers for %s", marker) } before := content[:bi+len(begin)] after := content[ei:] return before + "\n" + strings.TrimRight(block, "\n") + "\n" + after, nil } func normalizeManifestPath(p string) (string, error) { if !strings.HasPrefix(p, "./") { return "", fmt.Errorf("expected manifest path starting with './': %q", p) } return strings.TrimPrefix(p, "./"), nil } func renderRoutes(routes []Route, indent int, out *[]string, docsRoot string) error { prefix := strings.Repeat(" ", indent) for _, r := range routes { rel, err := normalizeManifestPath(r.Path) if err != nil { return err } if _, err := os.Stat(filepath.Join(docsRoot, rel)); err != nil { return fmt.Errorf("missing doc referenced by manifest: %s: %w", rel, err) } title := strings.TrimSpace(r.Title) if title == "" { return fmt.Errorf("manifest route missing title for path %q", r.Path) } if len(r.Children) > 0 { title = "**" + title + "**" } suffix := "" if desc := strings.TrimSpace(r.Description); desc != "" { suffix = " — " + desc } *out = append(*out, fmt.Sprintf( "%s- %s (`%s`) → `references/docs/%s`%s", prefix, title, rel, rel, suffix, )) if len(r.Children) > 0 { if err := renderRoutes(r.Children, indent+1, out, docsRoot); err != nil { return err } } } return nil } ``` Output: - `DOCS_TREE`: `strings.Join(lines, "\n")` after `renderRoutes(manifest.Routes, 0, &lines, docsRoot)`. - `SNAPSHOT`: short Markdown block like: - `Upstream: coder/coder@<sha>` - `Generated: <RFC3339 timestamp>` ### 4) Make it easy to run: add a Makefile target Add a convenience target: ```make .PHONY: update-coder-docs-skill update-coder-docs-skill: bash ./hack/update-coder-docs-skill.sh ``` ### 5) Make it discoverable (optional but recommended) - Update `README.md` (or `AGENTS.md`) with a short “Mux skills” note: - Skill name: `coder-docs` - Update command: `make update-coder-docs-skill` ### 6) Licensing / attribution Because `coder/coder` is AGPL-3.0: - Add `.mux/skills/coder-docs/NOTICE.md` describing: - what is vendored, - where it came from (repo URL + commit SHA), - and the applicable license. - Include a copy of the upstream AGPL license text within the skill directory (e.g. `.mux/skills/coder-docs/LICENSE`) so the vendored-docs subtree is self-describing. <details> <summary>Why call this out?</summary> Vendoring content across repositories can have license implications. This plan keeps the skill directory explicit about provenance and license so downstream consumers are not surprised. </details> ## Validation / Acceptance Criteria After implementation (Exec mode): 1. Run `make update-coder-docs-skill`. 2. Confirm files exist: - `.mux/skills/coder-docs/SKILL.md` contains populated `SNAPSHOT` + `DOCS_TREE` blocks. - `.mux/skills/coder-docs/references/docs/manifest.json` exists. - `.mux/skills/coder-docs/references/docs/install/docker.md` exists. 3. Confirm **no images** were copied: - `.mux/skills/coder-docs/references/docs/images/` should not exist. 4. Confirm integrity checks pass: - every `manifest.json` `path` exists under `references/docs/`. 5. (Mux smoke test) In a Mux session, verify: - `agent_skill_read({ name: "coder-docs" })` works. - `agent_skill_read_file({ name: "coder-docs", filePath: "references/docs/install/index.md" })` returns content. Success looks like: a committed `.mux/skills/coder-docs` directory with a small (~5MB) text snapshot + deterministic index, and a single update script that can refresh it from upstream. </details> --- _Generated with `mux` • Model: `anthropic:claude-opus-4-6` • Thinking: `xhigh` • Cost: `$1.41`_ <!-- mux-attribution: model=anthropic:claude-opus-4-6 thinking=xhigh costs=1.41 -->
1 parent 4cc1631 commit ee25216

424 files changed

Lines changed: 81067 additions & 1 deletion

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.mux/skills/coder-docs/LICENSE

Lines changed: 661 additions & 0 deletions
Large diffs are not rendered by default.

.mux/skills/coder-docs/NOTICE.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Notice
2+
3+
This directory contains a text-only snapshot of the documentation from
4+
[coder/coder](https://github.com/coder/coder).
5+
6+
- **Source repository**: https://github.com/coder/coder
7+
- **License**: GNU Affero General Public License v3.0 (AGPL-3.0)
8+
- **What is vendored**: Markdown documentation files and `manifest.json` only
9+
(images and other binary assets are excluded).
10+
- **Upstream commit**: See `references/docs/SNAPSHOT.json` for the exact commit SHA.
11+
12+
The vendored content is used solely to provide offline documentation access
13+
for AI development agents working in this repository.
14+
15+
See `LICENSE` in this directory for the full license text.

.mux/skills/coder-docs/SKILL.md

Lines changed: 462 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
# About
2+
3+
<!-- Warning for docs contributors: The first route in manifest.json must be titled "About" for the static landing page to work correctly. -->
4+
5+
Coder is a self-hosted, open source, cloud development environment that works
6+
with any cloud, IDE, OS, Git provider, and IDP.
7+
8+
![Screenshots of Coder workspaces and connections](./images/hero-image.png)_Screenshots of Coder workspaces and connections_
9+
10+
Coder is built on common development interfaces and infrastructure tools to
11+
make the process of provisioning and accessing remote workspaces approachable
12+
for organizations of various sizes and stages of cloud-native maturity.
13+
14+
## IDE support
15+
16+
![IDE icons](./images/ide-icons.svg)
17+
18+
You can use:
19+
20+
- Any Web IDE, such as
21+
22+
- [code-server](https://github.com/coder/code-server)
23+
- [JetBrains Projector](https://github.com/JetBrains/projector-server)
24+
- [Jupyter](https://jupyter.org/)
25+
- And others
26+
27+
- Your existing remote development environment:
28+
29+
- [JetBrains Gateway](https://www.jetbrains.com/remote-development/gateway/)
30+
- [VS Code Remote](https://code.visualstudio.com/docs/remote/ssh-tutorial)
31+
- [Emacs](./user-guides/workspace-access/emacs-tramp.md)
32+
33+
- A file sync such as [Mutagen](https://mutagen.io/)
34+
35+
## Why remote development
36+
37+
Remote development offers several benefits for users and administrators, including:
38+
39+
- **Increased speed**
40+
41+
- Server-grade cloud hardware speeds up operations in software development, from
42+
loading the IDE to compiling and building code, and running large workloads
43+
such as those for monolith or microservice applications.
44+
45+
- **Easier environment management**
46+
47+
- Built-in infrastructure tools such as Terraform, nix, Docker, Dev Containers, and others make it easier to onboard developers with consistent environments.
48+
49+
- **Increased security**
50+
51+
- Centralize source code and other data onto private servers or cloud services instead of local developers' machines.
52+
- Manage users and groups with [SSO](./admin/users/oidc-auth/index.md) and [Role-based access controlled (RBAC)](./admin/users/groups-roles.md#roles).
53+
54+
- **Improved compatibility**
55+
56+
- Remote workspaces can share infrastructure configurations with other
57+
development, staging, and production environments, reducing configuration
58+
drift.
59+
60+
- **Improved accessibility**
61+
- Connect to remote workspaces via browser-based IDEs or remote IDE
62+
extensions to enable developers regardless of the device they use, whether
63+
it's their main device, a lightweight laptop, Chromebook, or iPad.
64+
65+
Read more about why organizations and engineers are moving to remote
66+
development on [our blog](https://coder.com/blog), the
67+
[Slack engineering blog](https://slack.engineering/development-environments-at-slack),
68+
or from [OpenFaaS's Alex Ellis](https://blog.alexellis.io/the-internet-is-my-computer/).
69+
70+
## Why Coder
71+
72+
The key difference between Coder and other remote IDE platforms is the added
73+
layer of infrastructure control.
74+
This additional layer allows admins to:
75+
76+
- Simultaneously support ARM, Windows, Linux, and macOS workspaces.
77+
- Modify pod/container specs, such as adding disks, managing network policies, or
78+
setting/updating environment variables.
79+
- Use VM or dedicated workspaces, developing with Kernel features (no container
80+
knowledge required).
81+
- Enable persistent workspaces, which are like local machines, but faster and
82+
hosted by a cloud service.
83+
84+
## How much does it cost?
85+
86+
Coder is free and open source under
87+
[GNU Affero General Public License v3.0](https://github.com/coder/coder/blob/main/LICENSE).
88+
All developer productivity features are included in the Open Source version of
89+
Coder.
90+
A [Premium license is available](https://coder.com/pricing#compare-plans) for enhanced
91+
support options and custom deployments.
92+
93+
## How does Coder work
94+
95+
Coder workspaces are represented with Terraform, but you don't need to know
96+
Terraform to get started.
97+
We have a [database of production-ready templates](https://registry.coder.com/templates)
98+
for use with AWS EC2, Azure, Google Cloud, Kubernetes, and more.
99+
100+
![Providers and compute environments](./images/providers-compute.png)_Providers and compute environments_
101+
102+
Coder workspaces can be used for more than just compute.
103+
You can use Terraform to add storage buckets, secrets, sidecars,
104+
[and more](https://developer.hashicorp.com/terraform/tutorials).
105+
106+
Visit the [templates documentation](./admin/templates/index.md) to learn more.
107+
108+
## What Coder is not
109+
110+
- Coder is not an infrastructure as code (IaC) platform.
111+
112+
- Terraform is the first IaC _provisioner_ in Coder, allowing Coder admins to
113+
define Terraform resources as Coder workspaces.
114+
115+
- Coder is not a DevOps/CI platform.
116+
117+
- Coder workspaces can be configured to follow best practices for
118+
cloud-service-based workloads, but Coder is not responsible for how you
119+
define or deploy the software you write.
120+
121+
- Coder is not an online IDE.
122+
123+
- Coder supports common editors, such as VS Code, vim, and JetBrains,
124+
all over HTTPS or SSH.
125+
126+
- Coder is not a collaboration platform.
127+
128+
- You can use Git with your favorite Git platform and dedicated IDE
129+
extensions for pull requests, code reviews, and pair programming.
130+
131+
- Coder is not a SaaS/fully-managed offering.
132+
- Coder is a [self-hosted](<https://en.wikipedia.org/wiki/Self-hosting_(web_services)>)
133+
solution.
134+
You must host Coder in a private data center or on a cloud service, such as
135+
AWS, Azure, or GCP.
136+
137+
## Using Coder v1?
138+
139+
If you're a Coder v1 customer, view [the v1 documentation](https://coder.com/docs/v1)
140+
or [the v2 migration guide and FAQ](https://coder.com/docs/v1/guides/v2-faq).
141+
142+
## Up next
143+
144+
- [Template](./admin/templates/index.md)
145+
- [Installing Coder](./install/index.md)
146+
- [Quickstart](./tutorials/quickstart.md) to try Coder out for yourself.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"upstream_repo": "coder/coder",
3+
"upstream_sha": "342d2e4bedf60b7d73bf11310e290871986ca874",
4+
"generated_at": "2026-02-10T08:26:19Z"
5+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# AI Contribution Guidelines
2+
3+
This document defines rules for contributions where an AI system is the primary author of the code (i.e., most of the pull request was generated by AI).
4+
It applies to all Coder repositories and is a supplement to the [existing contributing guidelines](./CONTRIBUTING.md), not a replacement.
5+
6+
For minor AI-assisted edits, suggestions, or completions where the human contributor is clearly the primary author, these rules do not apply — standard contributing guidelines are sufficient.
7+
8+
## Disclosure
9+
10+
Contributors must **disclose AI involvement** in the pull request description whenever these guidelines apply.
11+
12+
## Human Ownership & Attribution
13+
14+
- All pull requests must be opened under **user accounts linked to a human**, and not an application ("bot account").
15+
- Contributors are personally accountable for the content of their PRs, regardless of how it was generated.
16+
17+
## Verification & Evidence
18+
19+
All AI-assisted contributions require **manual verification**.
20+
Contributions without verification evidence will be rejected.
21+
22+
- Test your changes yourself. Don’t assume AI is correct.
23+
- Provide screenshots showing that the change works as intended.
24+
- For visual/UI changes: include before/after screenshots.
25+
- For CLI or backend changes: include terminal or api output.
26+
27+
## Why These Rules Exist
28+
29+
Traditionally, maintainers assumed that producing a pull request required more effort than reviewing it.
30+
With AI-assisted tools, the balance has shifted: generating code is often faster than reviewing it.
31+
32+
Our guidelines exist to safeguard maintainers’ time, uphold contributor accountability, and preserve the overall quality of the project.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Contributor Covenant Code of Conduct
2+
3+
## Our Pledge
4+
5+
In the interest of fostering an open and welcoming environment, we as
6+
contributors and maintainers pledge to making participation in our project and
7+
our community a harassment-free experience for everyone, regardless of age, body
8+
size, disability, ethnicity, sex characteristics, gender identity and
9+
expression, level of experience, education, socio-economic status, nationality,
10+
personal appearance, race, religion, or sexual identity and orientation.
11+
12+
## Our Standards
13+
14+
Examples of behavior that contributes to creating a positive environment
15+
include:
16+
17+
- Using welcoming and inclusive language
18+
- Being respectful of differing viewpoints and experiences
19+
- Gracefully accepting constructive criticism
20+
- Focusing on what is best for the community
21+
- Showing empathy towards other community members
22+
23+
Examples of unacceptable behavior by participants include:
24+
25+
- The use of sexualized language or imagery and unwelcome sexual attention or
26+
advances
27+
- Trolling, insulting/derogatory comments, and personal or political attacks
28+
- Public or private harassment
29+
- Publishing others' private information, such as a physical or electronic
30+
address, without explicit permission
31+
- Other conduct which could reasonably be considered inappropriate in a
32+
professional setting
33+
34+
## Our Responsibilities
35+
36+
Project maintainers are responsible for clarifying the standards of acceptable
37+
behavior and are expected to take appropriate and fair corrective action in
38+
response to any instances of unacceptable behavior.
39+
40+
Project maintainers have the right and responsibility to remove, edit, or reject
41+
comments, commits, code, wiki edits, issues, and other contributions that are
42+
not aligned to this Code of Conduct, or to ban temporarily or permanently any
43+
contributor for other behaviors that they deem inappropriate, threatening,
44+
offensive, or harmful.
45+
46+
## Scope
47+
48+
This Code of Conduct applies both within project spaces and in public spaces
49+
when an individual is representing the project or its community. Examples of
50+
representing a project or community include using an official project e-mail
51+
address, posting via an official social media account, or acting as an appointed
52+
representative at an online or offline event. Representation of a project may be
53+
further defined and clarified by project maintainers.
54+
55+
## Enforcement
56+
57+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
58+
reported by contacting the project team at <opensource@coder.com>. All complaints
59+
will be reviewed and investigated and will result in a response that is deemed
60+
necessary and appropriate to the circumstances. The project team is obligated to
61+
maintain confidentiality with regard to the reporter of an incident. Further
62+
details of specific enforcement policies may be posted separately.
63+
64+
Project maintainers who do not follow or enforce the Code of Conduct in good
65+
faith may face temporary or permanent repercussions as determined by other
66+
members of the project's leadership.
67+
68+
## Attribution
69+
70+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
71+
version 1.4, available at
72+
<https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>
73+
74+
[homepage]: https://www.contributor-covenant.org
75+
76+
For answers to common questions about this code of conduct, see
77+
<https://www.contributor-covenant.org/faq>

0 commit comments

Comments
 (0)