@agentsmd/preset-typescript 0.2.0 → 0.3.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
@@ -8,6 +8,7 @@ npx @agentsmd/cli init --preset typescript # TypeScript 규칙만
8
8
  ```
9
9
 
10
10
  - 규칙 문서: 필수 tsconfig 옵션, `any`·`as`·`!` 금지, 외부 값 경계 검증, 폴더·컴포넌트·접근성, Testing Library·MSW 테스트, 환경변수·보안
11
- - 스테이징된 파일만 보는 Prettier 커밋 검사, `.nvmrc` 기반 pnpm CI
11
+ - 린트·포맷·CI 명령 문서, `.nvmrc`
12
12
  - tsconfig·린트 설정 파일은 덮어쓰지 않고 문서로 안내합니다.
13
- - Git 작업 규칙은 [Git 프리셋](https://www.npmjs.com/package/@agentsmd/preset-git)을 함께 고르면 더해집니다. `AGENTS.md`는 고른 프리셋에 맞춰 만들어집니다.
13
+ - Git 훅·GitHub 설정은 설치하지 않습니다. CI 문서에는 특정 서비스와 무관하게 실행할 명령만 적습니다.
14
+ - Git 작업 규칙과 훅은 [Git 프리셋](https://www.npmjs.com/package/@agentsmd/preset-git)을 함께 고르면 더해집니다. `AGENTS.md`는 고른 프리셋에 맞춰 만들어집니다.
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * TypeScript·React 프론트엔드용 프리셋.
3
3
  *
4
- * 타입 규칙과 필수 컴파일러 옵션, 폴더·컴포넌트·접근성, 테스트, 환경변수·보안 문서와
5
- * Prettier 커밋 검사, pnpm CI를 담는다. Git 작업 규칙은 Git 프리셋을 함께 고르면 더해진다.
4
+ * 타입 규칙과 필수 컴파일러 옵션, 폴더·컴포넌트·접근성, 테스트, 환경변수·보안, 린트·CI 명령 문서를 담는다.
5
+ * Git 훅·GitHub 설정은 넣지 않는다. 필요하면 Git 프리셋을 함께 고른다.
6
6
  *
7
7
  * tsconfig나 린트 설정 파일은 설치하지 않는다. 빌드 도구마다 설정이 달라 덮어쓰면 프로젝트가 깨지므로,
8
8
  * 필수 옵션을 문서로 안내하고 사람이 적용한다.
@@ -11,7 +11,6 @@ export declare const typescriptPreset: {
11
11
  name: string;
12
12
  description: string;
13
13
  filesDir: string;
14
- hooksPath: string;
15
14
  docs: {
16
15
  path: string;
17
16
  when: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CA+BX,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;CA6BX,CAAC"}
package/dist/index.js CHANGED
@@ -2,18 +2,16 @@ import { fileURLToPath } from "node:url";
2
2
  /**
3
3
  * TypeScript·React 프론트엔드용 프리셋.
4
4
  *
5
- * 타입 규칙과 필수 컴파일러 옵션, 폴더·컴포넌트·접근성, 테스트, 환경변수·보안 문서와
6
- * Prettier 커밋 검사, pnpm CI를 담는다. Git 작업 규칙은 Git 프리셋을 함께 고르면 더해진다.
5
+ * 타입 규칙과 필수 컴파일러 옵션, 폴더·컴포넌트·접근성, 테스트, 환경변수·보안, 린트·CI 명령 문서를 담는다.
6
+ * Git 훅·GitHub 설정은 넣지 않는다. 필요하면 Git 프리셋을 함께 고른다.
7
7
  *
8
8
  * tsconfig나 린트 설정 파일은 설치하지 않는다. 빌드 도구마다 설정이 달라 덮어쓰면 프로젝트가 깨지므로,
9
9
  * 필수 옵션을 문서로 안내하고 사람이 적용한다.
10
10
  */
11
11
  export const typescriptPreset = {
12
12
  name: "typescript",
13
- description: "TypeScript·React 프론트엔드용 타입·구조·테스트·보안 규칙, Prettier 훅, pnpm CI",
13
+ description: "TypeScript·React 프론트엔드용 타입·구조·테스트·보안 규칙, 린트·CI 명령",
14
14
  filesDir: fileURLToPath(new URL("../files", import.meta.url)),
15
- // Prettier 검사(pre-commit.d/prettier)를 연결한다.
16
- hooksPath: ".githooks",
17
15
  docs: [
18
16
  {
19
17
  path: "docs/project-direction.md",
@@ -23,7 +21,7 @@ export const typescriptPreset = {
23
21
  { path: "docs/structure.md", when: "파일·컴포넌트를 만들 때. 폴더, 컴포넌트, 접근성" },
24
22
  { path: "docs/testing.md", when: "테스트를 쓸 때" },
25
23
  { path: "docs/env-and-security.md", when: "환경변수·외부 입력·의존성을 다룰 때" },
26
- { path: "docs/lint-and-ci.md", when: "스크립트·린트·훅·CI 설정" },
24
+ { path: "docs/lint-and-ci.md", when: "스크립트·린트·포맷·CI 설정" },
27
25
  ],
28
26
  rules: [
29
27
  "`any`, `as` 단언, `!` 로 타입 오류를 덮지 않는다.",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,8DAA8D;IAC3E,QAAQ,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,4CAA4C;IAC5C,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,2BAA2B;YACjC,IAAI,EAAE,kCAAkC;SACzC;QACD,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,+BAA+B,EAAE;QACrE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,8BAA8B,EAAE;QACnE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE;QAC7C,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAClE,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,iBAAiB,EAAE;KACzD;IACD,KAAK,EAAE;QACL,sCAAsC;QACtC,4CAA4C;QAC5C,iEAAiE;QACjE,qCAAqC;QACrC,uBAAuB;KACxB;IACD,MAAM,EAAE,6EAA6E;IACrF,SAAS,EAAE;QACT,gDAAgD;QAChD,kDAAkD;QAClD,4FAA4F;QAC5F,kCAAkC;KACnC;CACe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,mDAAmD;IAChE,QAAQ,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,2BAA2B;YACjC,IAAI,EAAE,kCAAkC;SACzC;QACD,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,+BAA+B,EAAE;QACrE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,8BAA8B,EAAE;QACnE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE;QAC7C,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAClE,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,kBAAkB,EAAE;KAC1D;IACD,KAAK,EAAE;QACL,sCAAsC;QACtC,4CAA4C;QAC5C,iEAAiE;QACjE,qCAAqC;QACrC,uBAAuB;KACxB;IACD,MAAM,EAAE,6EAA6E;IACrF,SAAS,EAAE;QACT,gDAAgD;QAChD,kDAAkD;QAClD,4FAA4F;QAC5F,kCAAkC;KACnC;CACe,CAAC"}
@@ -4,8 +4,8 @@
4
4
 
5
5
  - 빌드 도구가 브라우저 코드에 넣는 변수(Vite `VITE_*`, Next.js `NEXT_PUBLIC_*`)는 누구나 볼 수 있다. 비밀키, 토큰, 내부 주소를 넣지 않는다.
6
6
  - 공개해도 되는 키(지도 JavaScript 키 등)도 발급처에서 도메인 제한을 건다.
7
- - 모든 변수를 `.env.example` 에 이름, 설명, 빈 값으로 적는다. 실제 값은 `.env.local` 에 둔다. (git 제외)
8
- - 변수를 추가·삭제하면 `.env.example` 을 같은 커밋에서 고친다.
7
+ - 모든 변수를 `.env.example` 에 이름, 설명, 빈 값으로 적는다. 실제 값은 `.env.local` 에 두고 저장소에 올리지 않는다.
8
+ - 변수를 추가·삭제하면 `.env.example` 도 함께 고친다.
9
9
  - 환경변수는 한 모듈에서 읽고 검증해 내보낸다. 컴포넌트가 `import.meta.env` 를 직접 읽지 않는다.
10
10
 
11
11
  ```ts
@@ -19,7 +19,7 @@ export const config = { apiBaseUrl } as const
19
19
 
20
20
  ## 보안
21
21
 
22
- - `dangerouslySetInnerHTML` 을 쓰지 않는다. 꼭 필요하면 검증된 sanitize 라이브러리를 거치고 PR 에 이유를 적는다.
22
+ - `dangerouslySetInnerHTML` 을 쓰지 않는다. 꼭 필요하면 검증된 sanitize 라이브러리를 거치고 그 자리에 이유를 주석으로 적는다.
23
23
  - 사용자 입력으로 URL 을 만들 때 `encodeURIComponent` 로 감싼다.
24
24
  - 사용자 입력을 `href` 에 넣을 때 `http:`, `https:` 로 시작하는지 확인한다. (`javascript:` 차단)
25
25
  - 인증 토큰은 가능하면 `httpOnly` 쿠키로 받는다. `localStorage` 에 둬야 하면 이유를 [project-direction.md](project-direction.md) 의 결정 기록에 남긴다.
@@ -29,4 +29,4 @@ export const config = { apiBaseUrl } as const
29
29
 
30
30
  - 새 패키지는 추가하기 전에 사용자에게 묻는다. 브라우저 표준 API나 이미 있는 의존성으로 되는지 먼저 확인한다.
31
31
  - 실행 중에 필요 없는 패키지(테스트, 린트, 타입)는 `devDependencies` 에 둔다.
32
- - 잠금 파일(`pnpm-lock.yaml`)을 함께 커밋한다. CI 는 `--frozen-lockfile` 로 설치해 잠금 파일과 다르면 실패한다.
32
+ - 잠금 파일(`pnpm-lock.yaml`)을 저장소에 함께 둔다. CI 는 `--frozen-lockfile` 로 설치해 잠금 파일과 다르면 실패한다.
@@ -54,19 +54,14 @@ ESLint 를 쓰면 typescript-eslint, eslint-plugin-react-hooks, eslint-plugin-js
54
54
  - Prettier 에 맡긴다. 손으로 정렬하지 않는다. 설정은 저장소의 `.prettierrc` 를 따른다.
55
55
  - 고칠 때: `pnpm format` (`prettier --write .`)
56
56
 
57
- ## Git 훅
58
-
59
- `.githooks/pre-commit` 이 `.githooks/pre-commit.d/` 의 검사를 이름 순서로 실행한다.
60
- TypeScript 프리셋은 포맷 검사를 넣는다. Git 프리셋을 함께 설치했다면 커밋 형식·파일 수 검사도 같이 돈다.
61
-
62
- | 파일 | 검사 |
63
- | --- | --- |
64
- | `.githooks/pre-commit.d/prettier` | 스테이징된 파일만 `prettier --check`. `package.json` 과 설치된 Prettier 가 있을 때만 |
65
-
66
57
  ## CI
67
58
 
68
- [.github/workflows/ci.yml](../.github/workflows/ci.yml)
59
+ 어떤 CI 서비스를 쓰든 아래 순서로 실행한다. 작업을 마치기 전에 돌리는 검증 명령과 같다.
60
+
61
+ ```bash
62
+ pnpm install --frozen-lockfile
63
+ pnpm lint && pnpm format:check && pnpm typecheck && pnpm test && pnpm build
64
+ ```
69
65
 
70
66
  - Node 버전은 `.nvmrc`, pnpm 버전은 `package.json` 의 `packageManager` 를 따른다.
71
- - `install --frozen-lockfile` → `lint` → `format:check` → `typecheck` → `test` → `build`
72
67
  - npm·yarn 을 쓰면 설치 단계와 명령을 맞게 바꾼다.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agentsmd/preset-typescript",
3
- "version": "0.2.0",
4
- "description": "TypeScript·React 프론트엔드용 AI 작업 지침 프리셋 (타입·구조·테스트·보안 규칙, Prettier 훅, pnpm CI)",
3
+ "version": "0.3.0",
4
+ "description": "TypeScript·React 프론트엔드용 AI 작업 지침 프리셋 (타입·구조·테스트·보안 규칙, 린트·CI 명령)",
5
5
  "keywords": [
6
6
  "agents.md",
7
7
  "ai-agent",
@@ -36,7 +36,7 @@
36
36
  "access": "public"
37
37
  },
38
38
  "dependencies": {
39
- "@agentsmd/core": "0.2.0"
39
+ "@agentsmd/core": "0.3.0"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsc -p tsconfig.build.json",
@@ -1,30 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # 포맷 검사. 공통 pre-commit 훅이 실행한다.
4
- # 스테이징된 파일 중 Prettier 가 다루는 파일만 검사한다. (.prettierignore 를 따른다)
5
- # 규칙: docs/lint-and-ci.md
6
-
7
- set -euo pipefail
8
-
9
- prettier=node_modules/.bin/prettier
10
-
11
- # 패키지 설치 전이거나 Prettier 를 쓰지 않는 저장소면 검사하지 않는다.
12
- if [ ! -f package.json ] || [ ! -x "$prettier" ]; then
13
- exit 0
14
- fi
15
-
16
- # 지운 파일은 검사할 수 없으므로 추가·복사·수정·이동된 파일만 고른다. 파일 이름의 공백을 지키려고 NUL 로 나눈다.
17
- files=()
18
- while IFS= read -r -d '' file; do
19
- files+=("$file")
20
- done < <(git diff --cached --name-only --diff-filter=ACMR -z)
21
-
22
- if [ "${#files[@]}" -eq 0 ]; then
23
- exit 0
24
- fi
25
-
26
- if ! "$prettier" --check --ignore-unknown "${files[@]}" >/dev/null 2>&1; then
27
- echo "pre-commit: 포맷 위반. pnpm format 후 다시 스테이징하세요." >&2
28
- "$prettier" --list-different --ignore-unknown "${files[@]}" 2>/dev/null | sed 's/^/ - /' >&2 || true
29
- exit 1
30
- fi
@@ -1,33 +0,0 @@
1
- # 규칙: docs/lint-and-ci.md
2
- name: CI
3
-
4
- on:
5
- push:
6
- branches: [main]
7
- pull_request:
8
-
9
- permissions:
10
- contents: read
11
-
12
- jobs:
13
- check:
14
- runs-on: ubuntu-latest
15
- steps:
16
- - uses: actions/checkout@v7
17
-
18
- # pnpm 버전은 package.json 의 packageManager 를 따른다
19
- - uses: pnpm/action-setup@v6
20
-
21
- - uses: actions/setup-node@v7
22
- with:
23
- node-version-file: .nvmrc
24
- cache: pnpm
25
-
26
- # 잠금 파일과 다르면 실패한다
27
- - run: pnpm install --frozen-lockfile
28
- - run: pnpm lint
29
- - run: pnpm format:check
30
- # 빌드 도구는 타입 오류가 있어도 빌드하는 경우가 많아 따로 검사한다
31
- - run: pnpm typecheck
32
- - run: pnpm test
33
- - run: pnpm build