Skip to content

Commit 02346cc

Browse files
Merge pull request #9 from coder/chore/refresh-and-automation
chore: refresh content and add lint + link-check workflows
2 parents c413784 + ec03394 commit 02346cc

15 files changed

Lines changed: 1114 additions & 79 deletions

.github/.linkspector.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Linkspector config for awesome-coder.
2+
# Mirrors the structure of coder/coder/.github/.linkspector.yml so the
3+
# behavior stays consistent across the two repositories.
4+
dirs:
5+
- .
6+
excludedDirs:
7+
# Build output and dependencies have no value to lint.
8+
- node_modules
9+
- .git
10+
ignorePatterns:
11+
- pattern: "localhost"
12+
- pattern: "127.0.0.1"
13+
- pattern: "0.0.0.0"
14+
- pattern: "example.com"
15+
- pattern: "mailto:"
16+
# Hosts known to block GitHub runner IPs even from a headless browser.
17+
# Add new patterns here when a real URL is verified working in a normal
18+
# browser but the runner consistently fails to reach it.
19+
- pattern: "linkedin.com"
20+
aliveStatusCodes:
21+
- 200
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
name: "Suggest a resource"
2+
description: "Suggest a resource to add to the list."
3+
title: "suggestion: "
4+
labels: ["suggestion"]
5+
body:
6+
- type: checkboxes
7+
id: existing_issues
8+
attributes:
9+
label: "Is there an existing issue for this?"
10+
description: "Please search to see if the resource has already been suggested or listed."
11+
options:
12+
- label: "I have searched the existing issues and the README"
13+
required: true
14+
15+
- type: input
16+
id: name
17+
attributes:
18+
label: "Name"
19+
description: "Name of the resource."
20+
validations:
21+
required: true
22+
23+
- type: input
24+
id: url
25+
attributes:
26+
label: "URL"
27+
validations:
28+
required: true
29+
30+
- type: dropdown
31+
id: section
32+
attributes:
33+
label: "Suggested section"
34+
options:
35+
- Official Resources
36+
- Tutorials and Blog Posts
37+
- IDEs
38+
- Automation
39+
- Templates
40+
- Talks and Videos
41+
- Other (explain below)
42+
validations:
43+
required: true
44+
45+
- type: textarea
46+
id: description
47+
attributes:
48+
label: "One-line description"
49+
description: "Format as it would appear in the README, e.g. `[Name](url) - One-line description.`"
50+
validations:
51+
required: true
52+
53+
- type: checkboxes
54+
id: checks
55+
attributes:
56+
label: "Checks"
57+
options:
58+
- label: "I have read the [contribution guidelines](https://github.com/coder/awesome-coder/blob/main/CONTRIBUTING.md)."
59+
required: true
60+
- label: "The resource is actively maintained."
61+
required: false

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
contact_links:
2+
- name: Coder Documentation
3+
url: https://coder.com/docs
4+
about: Official Coder documentation.
5+
- name: Coder Registry
6+
url: https://registry.coder.com
7+
about: Official and community templates and modules.
8+
- name: Coder Discord
9+
url: https://cdr.co/discord-Y6fMxGdNRg
10+
about: Get in touch with the Coder developers and community for support.
11+
- name: Questions or discussion
12+
url: https://github.com/coder/coder/discussions/new/choose
13+
about: For general questions or discussion, use the coder/coder discussions board.

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
## Description
2+
3+
<!-- Briefly describe what this PR does and why. -->
4+
5+
## Type of change
6+
7+
- [ ] New resource added to the list
8+
- [ ] Resource removed (no longer maintained, broken, etc.)
9+
- [ ] Resource updated (URL change, description change, etc.)
10+
- [ ] Documentation or content refresh
11+
- [ ] CI, tooling, or repository maintenance
12+
- [ ] Other
13+
14+
## Resource information
15+
16+
<!-- Delete this section if your PR does not add or update a list entry. -->
17+
18+
**Section:**
19+
**Entry:** `[Name](url) - One-line description.`
20+
21+
## Checklist
22+
23+
- [ ] I have read the [contribution guidelines](https://github.com/coder/awesome-coder/blob/main/CONTRIBUTING.md).
24+
- [ ] My entry follows the `[Name](url) - One-line description.` format.
25+
- [ ] The resource is actively maintained or otherwise worth listing.
26+
- [ ] `bun fmt:ci` passes locally (or I'm relying on CI to confirm).
27+
28+
## Related issues
29+
30+
<!-- Link related issues or write "None". -->

.github/dependabot.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "github-actions"
4+
directory: "/"
5+
schedule:
6+
interval: "weekly"
7+
groups:
8+
github-actions:
9+
patterns:
10+
- "*"
11+
12+
- package-ecosystem: "npm"
13+
directory: "/"
14+
schedule:
15+
interval: "weekly"
16+
groups:
17+
npm:
18+
patterns:
19+
- "*"

.github/typos.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[default.extend-words]
2+
# Coder community handles / usernames that look like typos.
3+
denbeigh = "denbeigh"
4+
matifali = "matifali"
5+
sharkymark = "sharkymark"
6+
ntimo = "ntimo"
7+
bpmct = "bpmct"
8+
tmsmr = "tmsmr"
9+
sulo = "sulo"
10+
elliotgraebert = "elliotgraebert"
11+
12+
# Domain-specific terms.
13+
Kubevirt = "KubeVirt"
14+
NixOS = "NixOS"
15+
HashiCorp = "HashiCorp"
16+
17+
[files]
18+
extend-exclude = [
19+
"LICENSE",
20+
"bun.lock",
21+
"node_modules",
22+
]

.github/workflows/ci.yaml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
schedule:
8+
# Mondays at 14:00 UTC, so broken links surface even between contributions.
9+
- cron: "0 14 * * 1"
10+
workflow_dispatch:
11+
12+
# Cancel in-progress runs for pull requests when developers push new changes.
13+
concurrency:
14+
group: ${{ github.workflow }}-${{ github.ref }}
15+
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
16+
17+
permissions:
18+
contents: read
19+
20+
jobs:
21+
format:
22+
name: Check formatting
23+
runs-on: ubuntu-latest
24+
steps:
25+
- name: Check out code
26+
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
27+
with:
28+
persist-credentials: false
29+
30+
- name: Install Bun
31+
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
32+
with:
33+
bun-version: latest
34+
35+
- name: Install dependencies
36+
run: bun install --frozen-lockfile
37+
38+
- name: Validate formatting
39+
run: bun fmt:ci
40+
41+
lint-awesome:
42+
name: Lint awesome list
43+
runs-on: ubuntu-latest
44+
steps:
45+
- name: Check out code
46+
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
47+
with:
48+
persist-credentials: false
49+
50+
- name: Install Bun
51+
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
52+
with:
53+
bun-version: latest
54+
55+
- name: Run awesome-lint
56+
run: bun x awesome-lint
57+
58+
lint-typos:
59+
name: Check for typos
60+
runs-on: ubuntu-latest
61+
steps:
62+
- name: Check out code
63+
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
64+
with:
65+
persist-credentials: false
66+
67+
- name: Run typos
68+
uses: crate-ci/typos@37bb98842b0d8c4ffebdb75301a13db0267cef89 # v1.47.2
69+
with:
70+
config: .github/typos.toml

.github/workflows/link-check.yaml

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
name: Link check
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
paths:
8+
- "**/*.md"
9+
- ".github/.linkspector.yml"
10+
- ".github/workflows/link-check.yaml"
11+
schedule:
12+
# Mondays at 14:00 UTC.
13+
- cron: "0 14 * * 1"
14+
workflow_dispatch:
15+
16+
permissions:
17+
contents: read
18+
19+
concurrency:
20+
group: ${{ github.workflow }}-${{ github.ref }}
21+
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
22+
23+
jobs:
24+
check-links:
25+
# Later versions of Ubuntu have disabled unprivileged user namespaces,
26+
# which the linkspector action requires.
27+
runs-on: ubuntu-22.04
28+
permissions:
29+
contents: read
30+
pull-requests: write
31+
env:
32+
CHROME_BUILD_ID: "145.0.7632.77"
33+
steps:
34+
- name: Harden Runner
35+
uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0
36+
with:
37+
egress-policy: audit
38+
39+
- name: Checkout
40+
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
41+
with:
42+
persist-credentials: false
43+
44+
- name: Set up Node.js
45+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
46+
with:
47+
node-version: "22"
48+
49+
- name: Cache Puppeteer Chrome
50+
id: chrome-cache
51+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
52+
with:
53+
path: ~/.cache/puppeteer
54+
key: puppeteer-${{ runner.os }}-${{ runner.arch }}-chrome-${{ env.CHROME_BUILD_ID }}
55+
56+
- name: Install Linkspector Chrome
57+
id: install-chrome
58+
run: |
59+
set -euo pipefail
60+
# @puppeteer/browsers is idempotent: when the cache hit restored the
61+
# binary it just prints the existing path; on a cache miss it
62+
# downloads Chrome into ~/.cache/puppeteer for actions/cache to save
63+
# at the end of the job.
64+
chrome_path="$(npx -y @puppeteer/browsers install "chrome@${CHROME_BUILD_ID}" --path "${HOME}/.cache/puppeteer" --format '{{path}}')"
65+
echo "path=${chrome_path}" >> "$GITHUB_OUTPUT"
66+
67+
# action-linkspector has a pnpm install step that fails without an
68+
# existing pnpm store. See:
69+
# https://github.com/UmbrellaDocs/action-linkspector/issues/54
70+
- name: Enable corepack and create pnpm store
71+
run: |
72+
corepack enable pnpm
73+
mkdir -p "$(pnpm store path --silent)"
74+
75+
# action-linkspector pipes linkspector through reviewdog, which only
76+
# surfaces failures and stays silent on success. List discovered URLs
77+
# and run linkspector standalone first so the workflow log shows every
78+
# URL that was checked, then let action-linkspector run for the PR
79+
# review comment integration.
80+
- name: List URLs found in Markdown files
81+
run: |
82+
set -euo pipefail
83+
echo "URLs discovered in Markdown files (subject to linkspector ignorePatterns):"
84+
echo
85+
grep -rhoE 'https?://[^[:space:])"`<>]+' \
86+
--include='*.md' \
87+
--exclude-dir=node_modules \
88+
--exclude-dir=.git \
89+
. | sort -u
90+
91+
- name: Run linkspector
92+
env:
93+
PUPPETEER_EXECUTABLE_PATH: ${{ steps.install-chrome.outputs.path }}
94+
run: npx -y @umbrelladocs/linkspector check --showstat --check-archived -c .github/.linkspector.yml
95+
96+
- name: Check Markdown links
97+
if: always()
98+
uses: umbrelladocs/action-linkspector@036f295d12b67b0c4b445bc83db0538afb78db69 # v1.5.2
99+
env:
100+
# Use the Chrome build prepared from the pinned Puppeteer instead
101+
# of letting linkspector download a mutable browser at runtime.
102+
# See: https://github.com/UmbrellaDocs/action-linkspector/issues/62
103+
PUPPETEER_EXECUTABLE_PATH: ${{ steps.install-chrome.outputs.path }}
104+
with:
105+
reporter: ${{ github.event_name == 'pull_request' && 'github-pr-review' || 'github-check' }}
106+
config_file: .github/.linkspector.yml
107+
fail_on_error: "true"
108+
filter_mode: "file"
109+
show_stats: "true"

.github/workflows/zizmor.yaml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: GitHub Actions Security Analysis (zizmor)
2+
3+
on:
4+
pull_request:
5+
branches: ["**"]
6+
paths:
7+
- ".github/workflows/**"
8+
push:
9+
branches: ["main"]
10+
paths:
11+
- ".github/workflows/**"
12+
workflow_dispatch:
13+
14+
permissions: {}
15+
16+
jobs:
17+
zizmor:
18+
runs-on: ubuntu-latest
19+
permissions:
20+
contents: read
21+
actions: read
22+
steps:
23+
- name: Checkout repository
24+
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
25+
with:
26+
persist-credentials: false
27+
28+
- name: Run zizmor (blocking, HIGH only)
29+
uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6
30+
with:
31+
advanced-security: false
32+
annotations: true
33+
min-severity: high
34+
inputs: |
35+
.github/workflows

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules/

0 commit comments

Comments
 (0)