Skip to content

JeremyDev87/maximus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

88 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Maximus

License: MIT

ํ•œ๊ตญ์–ด | English | ไธญๆ–‡ | Espaรฑol | ๆ—ฅๆœฌ่ชž

ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์„ค์ •์— ์งˆ์„œ๋ฅผ.

Maximus๋Š” ํ”„๋กœ์ ํŠธ ๊ณณ๊ณณ์— ํฉ์–ด์ง„ ์„ค์ • ํŒŒ์ผ์„ ์ ๊ฒ€ํ•˜๊ณ , ์ถฉ๋Œ๊ณผ ์ค‘๋ณต์„ ์ •๋ฆฌํ•˜๋ฉฐ ์งˆ์„œ ์žˆ๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” CLI์ž…๋‹ˆ๋‹ค.

ํ˜„๋Œ€ ํ”„๋กœ์ ํŠธ๋Š” tsconfig, eslint, prettier, vite, jest, next.config, .env ๋“ฑ ์ˆ˜๋งŽ์€ ์„ค์ • ์œ„์— ์„œ ์žˆ์Šต๋‹ˆ๋‹ค. Maximus๋Š” ๋ฌด๋„ˆ์ง„ ์งˆ์„œ๋ฅผ ๋‹ค์‹œ ์„ธ์›๋‹ˆ๋‹ค.

Canonical Runtime

Maximus๋Š” ์ด์ œ Rust runtime์„ canonical implementation์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฃจํŠธ @jeremyfellaz/maximus npm package๋Š” thin launcher์ด๋ฉฐ, ์‹ค์ œ ์‹คํ–‰์€ ํ”Œ๋žซํผ๋ณ„ prebuilt Rust binary๋กœ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  • publish๋œ npm wrapper์™€ GitHub Action๋„ ๊ฐ™์€ Rust runtime ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • publish๋œ npm ์ง„์ž…์ ์€ npx @jeremyfellaz/maximus audit, npx @jeremyfellaz/maximus doctor, npx @jeremyfellaz/maximus fix์ด๋ฉฐ, ์„ค์น˜ ํ›„ ์‹คํ–‰๋˜๋Š” binary ์ด๋ฆ„์€ ๊ณ„์† maximus์ž…๋‹ˆ๋‹ค.
  • ์ €์žฅ์†Œ์˜ src/**/*.js๋Š” parity ๊ฒ€์ฆ๊ณผ reference ๋น„๊ต๋ฅผ ์œ„ํ•œ frozen reference๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. native Rust runtime์ด ์—†์„ ๋•Œ๋Š” ์ œํ•œ๋œ compatibility fallback์œผ๋กœ๋งŒ ๋‚จ์•„ ์žˆ์œผ๋ฉฐ, ์ƒˆ runtime ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฐฐํฌ ๋™์ž‘์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„ ํ‘œ๋ฉด์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. maximus.config.json ์ž๋™ ๋กœ๋”ฉ์ด๋‚˜ --only ๊ฐ™์€ Rust ์ „์šฉ ๊ธฐ๋Šฅ์—๋Š” canonical runtime์ธ Rust๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • historical rewrite planning notes๋Š” maintainer workflow ์•ˆ์— ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณต๊ฐœ contributor guidance๋Š” CONTRIBUTING.md, docs/roadmap.md, docs/runtime-transition.md, docs/architecture/checker-authoring.md ๊ฐ™์€ tracked repo ๋ฌธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ „ํ™˜ ๊ฒฝ๊ณ„์™€ contributor ๊ทœ์น™์€ runtime transition ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์„ค์ • ์ถฉ๋Œ ํƒ์ง€
  • ์ค‘๋ณต config ์†Œ์Šค ํƒ์ง€
  • ์˜ค๋ž˜๋œ TypeScript ์˜ต์…˜ ๊ฒฝ๊ณ 
  • ์ž˜๋ชป ์—ฐ๊ฒฐ๋œ path alias ๊ฒ€์‚ฌ
  • ESLint / Prettier ์ถฉ๋Œ ๋ถ„์„
  • ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ˆ„๋ฝ ๋ฐ mismatch ๊ฒ€์‚ฌ
  • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฆฌํฌํŠธ ์ƒ์„ฑ

๋ช…๋ น์–ด

npx @jeremyfellaz/maximus audit
npx @jeremyfellaz/maximus doctor
npx @jeremyfellaz/maximus fix

audit

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์„ค์ • ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•ต์‹ฌ ๋ฆฌ์Šคํฌ๋ฅผ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

doctor

audit๋ณด๋‹ค ๋” ์„ค๋ช…์ ์ธ ์ง„๋‹จ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„์™€ ๊ตฌ์กฐ ๊ฐœ์„  ์ œ์•ˆ๊นŒ์ง€ ํ•จ๊ป˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

fix

์•ˆ์ „ํ•˜๊ฒŒ ์ž๋™ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ MVP์—์„œ ์ง€์›ํ•˜๋Š” ์ž๋™ ์ˆ˜์ •:

  • .env ๊ธฐ๋ฐ˜ .env.example ์ƒ์„ฑ
  • .env.example์— ๋ˆ„๋ฝ๋œ ํ‚ค ์ถ”๊ฐ€

Audit Signal ์ •์ฑ…

Env contract

Maximus๋Š” .env.example ๊ฐ™์€ contract ํŒŒ์ผ์„ ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. env-example-secret ๊ฒฝ๊ณ ๋Š” ์ด์ œ key ์ด๋ฆ„๊ณผ value ํ˜•ํƒœ๋ฅผ ํ•จ๊ป˜ ๋ด…๋‹ˆ๋‹ค.

  • *_TOKEN, *_SECRET, *_PASSWORD, *_SERVICE_KEY, PRIVATE_KEY, *_API_KEY, *_ACCESS_KEY ๊ณ„์—ด key์— placeholder๊ฐ€ ์•„๋‹Œ ๊ฐ’์ด ๋“ค์–ด ์žˆ์œผ๋ฉด ๊ณ„์† ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  • sk_live_, sk_test_, ghp_, github_pat_, xoxb-, xoxp-, xoxa-, AWS AKIA..., Google AIza..., private key block์ฒ˜๋Ÿผ secret ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ value ํ˜•ํƒœ๋Š” key ์ด๋ฆ„๊ณผ ๊ด€๊ณ„์—†์ด ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  • NEXT_PUBLIC_*_CLIENT_ID, URL, repo ์ด๋ฆ„, label, date, percent, hour์ฒ˜๋Ÿผ public/config ์‹๋ณ„์ž ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•œ key๋Š” ๊ฐ’์ด ๊ธธ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋นˆ ๊ฐ’, change-me, example, placeholder, your-*, localhost, 127.0.0.1, true, false, 0, 1์€ placeholder๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ์—๋Š” ์—†์ง€๋งŒ CI๋‚˜ hosting์—์„œ ์ฃผ์ž…๋˜๋Š” env key๋Š” maximus.config.json ๋˜๋Š” .maximusrc.json์—์„œ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "env": {
    "ciInjectedKeys": ["GH_COLLECTOR_TOKEN"],
    "optionalLocalKeys": ["NEXT_PUBLIC_OKTA_DOMAIN"]
  }
}

๋‘ ๋ชฉ๋ก์€ env-missing-concrete์—์„œ ์ œ์™ธํ•  exact key ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. Glob๋‚˜ prefix matching ๊ณ„์•ฝ์€ ์—†์œผ๋ฏ€๋กœ VERCEL_* ๊ฐ™์€ ํŒจํ„ด ๋Œ€์‹  ์‹ค์ œ key ์ด๋ฆ„์„ ๋„ฃ์œผ์„ธ์š”. ์ž˜๋ชป๋œ config field๋Š” ์กฐ์šฉํžˆ ๋ฌด์‹œํ•˜์ง€ ์•Š๊ณ  parse error๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

TypeScript config

exclude: ["node_modules"]์ฒ˜๋Ÿผ TypeScript์˜ ๊ธฐ๋ณธ ์ œ์™ธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” no-op exclude๋Š” ๊ธฐ๋ณธ audit ์ถœ๋ ฅ์—์„œ ์ˆจ๊น๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด generated/**/*.ts, dist/**/*.d.ts์ฒ˜๋Ÿผ ํŒ€ ์˜๋„๊ฐ€ ๋‹ด๊ธด non-default exclude๊ฐ€ ์‹ค์ œ included file์„ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋ฉด ๊ธฐ์กด์ฒ˜๋Ÿผ Info finding์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. include pattern์ด ์•„๋ฌด ํŒŒ์ผ๋„ ๋งค์นญํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ warning๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ถœ๋ ฅ

Maximus audit
๋Œ€์ƒ: /workspace/my-app

์ƒํƒœ: ์กฐ์น˜ ํ•„์š”
๋ฐœ๊ฒฌ ํ•ญ๋ชฉ: ์˜ค๋ฅ˜ 1๊ฐœ, ๊ฒฝ๊ณ  2๊ฐœ, ์ •๋ณด 1๊ฐœ
์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ •: 1๊ฐœ

๋ฐœ๊ฒฌ ํ•ญ๋ชฉ
- [์˜ค๋ฅ˜] ๊ฒฝ๋กœ alias ๋Œ€์ƒ์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ
  ํŒŒ์ผ: packages/web/tsconfig.json
  ์ƒ์„ธ: @ui/*๋Š” src/missing/*๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ ํ•ด์„๋œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  ํžŒํŠธ: editor์™€ build ํ•ด์„์„ ๊นจ๊ธฐ ์ „์— ์˜ค๋ž˜๋œ alias๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์„ธ์š”.

- [๊ฒฝ๊ณ ] .env.example ๊ณ„์•ฝ ํŒŒ์ผ ๋ˆ„๋ฝ
  ํŒŒ์ผ: .env
  ์ƒ์„ธ: ์‹คํ–‰ env ํŒŒ์ผ์€ ์žˆ์ง€๋งŒ .env.example์ด ์—†์Šต๋‹ˆ๋‹ค.
  ํžŒํŠธ: `maximus fix`๋ฅผ ์‹คํ–‰ํ•ด ๋นˆ ๊ณ„์•ฝ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”.

GitHub Action

๋ฆด๋ฆฌ์ฆˆ ํƒœ๊ทธ ์ดํ›„์—๋Š” ๊ฐ™์€ npm wrapper ์ง„์ž…์ ์„ GitHub Action์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

- uses: JeremyDev87/maximus@<release-tag>
  with:
    command: audit
    path: .

๊ธฐ๋ณธ ์ž…๋ ฅ:

  • command: audit, doctor, fix
  • path: ๊ฒ€์‚ฌํ•  ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ, ๊ธฐ๋ณธ๊ฐ’ .
  • registry-url: pre-release smoke๋‚˜ ์‚ฌ์„ค registry ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ์“ฐ๋Š” optional npm registry override
  • release-tag: publish๋œ immutable ๋ฆด๋ฆฌ์ฆˆ ํƒœ๊ทธ๋ฅผ ๋„ฃ์œผ์„ธ์š”. ์˜ˆ: v1.0.0. ์•ˆ์ • major tag๊ฐ€ smoke๋ฅผ ํ†ต๊ณผํ•œ ๋’ค์—๋Š” v1๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ง€๋ณด์ˆ˜์ž๊ฐ€ ์‹ค์ œ alpha/stable ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์ค€๋น„ํ•˜๊ฑฐ๋‚˜ ๊ฐ™์€ ํƒœ๊ทธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์žฌ์‹คํ–‰ํ•  ๋•Œ๋Š” release operator runbook์„ ๊ธฐ์ค€์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Release Drafter๋Š” master์—์„œ draft notes๋งŒ ๊ฐฑ์‹ ํ•˜๋ฉฐ, ์‹ค์ œ publish์™€ major tag promotion์€ tag-driven release workflow์™€ action smoke ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๊ฐœ๋ฐœ

npm test
cargo test --workspace
node ./bin/maximus.js audit ./test/fixtures/clean-project

node ./bin/maximus.js๋Š” repository ์•ˆ์—์„œ ๋นŒ๋“œ๋œ Rust CLI(target/debug/maximus, target/release/maximus)๋ฅผ ์šฐ์„  ์‹คํ–‰ํ•˜๊ณ , ์—†์œผ๋ฉด ์„ค์น˜๋œ platform-specific Rust binary๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์•„์ง ์—†์œผ๋ฉด cargo build -p maximus-cli๋กœ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rust runtime์ด ์—†์„ ๋•Œ๋„ src/**/*.js fallback์œผ๋กœ ๊ธฐ๋ณธ audit / doctor / fix --dry-run ํ๋ฆ„์€ ์œ ์ง€๋˜์ง€๋งŒ, config file ์ž๋™ ๋กœ๋”ฉ๊ณผ --only, --skip, --fail-on ๊ฐ™์€ Rust ์ „์šฉ ๊ธฐ๋Šฅ์€ native Rust runtime์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด fallback ๊ฒฝ๋กœ๋Š” compatibility ๊ฒ€์ฆ๊ณผ reference ์œ ์ง€ ๋ชฉ์ ์ด๋ฉฐ, ์ƒˆ canonical runtime ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋ณธ ๊ฐœ๋ฐœ ํ‘œ๋ฉด์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋Ÿฐ ํŒ€์— ์ถ”์ฒœ

  • ๋ชจ๋…ธ๋ ˆํฌ / ๋ฉ€ํ‹ฐํŒจํ‚ค์ง€ ์šด์˜ ํŒ€
  • ์„ค์ • ํŒŒ์ผ์ด ๋งŽ์•„ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์šด ํŒ€
  • ์‹ ๊ทœ ์ž…์‚ฌ์ž๊ฐ€ ์„ธํŒ…์—์„œ ์ž์ฃผ ๋ง‰ํžˆ๋Š” ํŒ€

๊ธฐ์—ฌํ•˜๊ธฐ

์ƒˆ๋กœ์šด ์ ๊ฒ€๊ธฐ ์ถ”๊ฐ€, ์ž๋™ ์ˆ˜์ • ์•ˆ์ „์„ฑ ๊ฐœ์„ , false positive ๊ฐ์†Œ ๊ฐ™์€ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ canonical runtime๊ณผ ๋ฐฐํฌ ํ‘œ๋ฉด์€ ์ด์ œ Rust ๊ธฐ์ค€์ด๋ฉฐ, src/**/*.js๋Š” frozen reference๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์—ฌ ์‹œ์ž‘ ์ „์—๋Š” CONTRIBUTING.md์™€ runtime transition ๋ฌธ์„œ๋ฅผ ๋จผ์ € ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

์ฒด์ปค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด checker์˜ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•  ๋•Œ๋Š” checker authoring ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์„œ๋„ ํ•จ๊ป˜ ๋ณด์‹œ๋ฉด ํ˜„์žฌ Rust crate ๊ฒฝ๊ณ„๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ €์žฅ์†Œ ๊ธฐ์ค€์œผ๋กœ ์–ด๋””์„œ ์‹œ์ž‘ํ•˜๋ฉด ์ข‹์€์ง€ ๋น ๋ฅด๊ฒŒ ์žก๊ณ  ์‹ถ๋‹ค๋ฉด contributor roadmap, good first issues, checker ideas๋ฅผ ๊ฐ™์ด ๋ณด์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋“ค์€ ์ด๋ฏธ ๊ตฌํ˜„๋œ ํ‘œ๋ฉด๊ณผ ์•„์ง backlog์ธ ์ฃผ์ œ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์ฆˆ ์ ˆ์ฐจ, alpha/stable ์Šน๊ฒฉ ์ˆœ์„œ, tag rerun ๊ทœ์น™์€ release operator runbook์— ๋”ฐ๋กœ ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ

๋ณด์•ˆ ์ด์Šˆ๊ฐ€ ์˜์‹ฌ๋œ๋‹ค๋ฉด ๊ณต๊ฐœ ์ด์Šˆ๋ถ€ํ„ฐ ์—ด์ง€ ๋ง๊ณ  SECURITY.md์˜ ๋น„๊ณต๊ฐœ ์‹ ๊ณ  ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ผ ์ฃผ์„ธ์š”.

์Šคํฐ์„œ

Maximus๊ฐ€ ํŒ€์˜ ์„ค์ • ํ˜ผ๋ž€์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋ฉด GitHub Sponsors๋ฅผ ํ†ตํ•ด ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํ›„์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

Maximus๋Š” MIT License๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

About

CLI for auditing and fixing project config drift across tsconfig, ESLint, Prettier, env, aliases, and modern JS tooling.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

 

Packages

 
 
 

Contributors

Languages