@agentsmd/preset-git 0.0.0-stage → 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 이태경
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,8 @@
1
- # Temporary Holding Version
1
+ # @agentsmd/preset-git
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [`agentsmd`](https://www.npmjs.com/package/agentsmd)의 공통 Git 작업 규칙 프리셋입니다. 언어 프리셋(`java`, `typescript`)을 설치하면 함께 설치됩니다.
4
+
5
+ - 문서: Git 작업 규칙(이슈 → 브랜치 → PR → merge 커밋), 에이전트 작업 흐름, 리뷰 반영 기준, 문체
6
+ - 훅: `commit-msg`(형식·50자·마침표·AI 서명), `pre-commit`(커밋당 파일 수, 언어별 검사 실행)
7
+ - GitHub: PR 규칙 검사 워크플로, 이슈·PR 템플릿
8
+ - Claude Code 설정: 훅 우회와 force push 차단
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 언어와 무관한 Git 작업 규칙 프리셋.
3
+ *
4
+ * 이슈 → 브랜치 → PR → merge 커밋 흐름, 에이전트의 커밋 단위 작업 방식, 커밋 훅, PR 규칙 검사를 담는다.
5
+ * 문서 지도(AGENTS.md)는 언어 프리셋이 가지므로 단독으로 설치하지 않고 언어 프리셋이 요구한다.
6
+ */
7
+ export declare const gitPreset: {
8
+ name: string;
9
+ description: string;
10
+ filesDir: string;
11
+ hooksPath: string;
12
+ nextSteps: string[];
13
+ };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,eAAO,MAAM,SAAS;;;;;;CAUJ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import { fileURLToPath } from "node:url";
2
+ /**
3
+ * 언어와 무관한 Git 작업 규칙 프리셋.
4
+ *
5
+ * 이슈 → 브랜치 → PR → merge 커밋 흐름, 에이전트의 커밋 단위 작업 방식, 커밋 훅, PR 규칙 검사를 담는다.
6
+ * 문서 지도(AGENTS.md)는 언어 프리셋이 가지므로 단독으로 설치하지 않고 언어 프리셋이 요구한다.
7
+ */
8
+ export const gitPreset = {
9
+ name: "git",
10
+ description: "Git 작업 흐름 문서, 커밋 훅, Conventions 검사, 이슈·PR 템플릿",
11
+ filesDir: fileURLToPath(new URL("../files", import.meta.url)),
12
+ hooksPath: ".githooks",
13
+ nextSteps: [
14
+ "GitHub 저장소 설정에서 머지 방식을 'Create a merge commit'만 허용하세요.",
15
+ "main 브랜치 룰셋의 필수 체크에 Conventions를 추가하세요.",
16
+ "지침 도입 커밋만 파일 수 한도를 올려 한 번에 커밋하세요: HARNESS_MAX_FILES=99 git commit ...",
17
+ ],
18
+ };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,+CAA+C;IAC5D,QAAQ,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE;QACT,wDAAwD;QACxD,yCAAyC;QACzC,uEAAuE;KACxE;CACe,CAAC"}
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "attribution": {
4
+ "commit": "",
5
+ "pr": ""
6
+ },
7
+ "includeCoAuthoredBy": false,
8
+ "permissions": {
9
+ "deny": [
10
+ "Bash(git commit --no-verify:*)",
11
+ "Bash(git commit -n:*)",
12
+ "Bash(git push --force:*)",
13
+ "Bash(git push -f:*)",
14
+ "Bash(git push origin main:*)"
15
+ ]
16
+ }
17
+ }
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # 커밋 메시지 검사 훅.
4
+ # - 형식: <타입>: <요약> (scope 를 쓰지 않는다)
5
+ # - 제목 50자 이내, 마침표로 끝나지 않음
6
+ # - AI 서명 금지
7
+ #
8
+ # 타입 목록은 .github/workflows/conventions.yml 의 TYPES 와 같게 유지한다.
9
+ # 사용: .githooks/commit-msg <메시지 파일>
10
+ # 규칙: docs/git-conventions.md
11
+
12
+ set -euo pipefail
13
+
14
+ msg_file="$1"
15
+
16
+ # 한글 제목 길이를 바이트가 아니라 글자 수로 세기 위해 UTF-8 로케일을 쓴다.
17
+ # macOS 는 C.UTF-8, Ubuntu 는 C.utf8 로 표기가 달라서 실제 목록에서 찾는다.
18
+ utf8_locale="$(locale -a 2>/dev/null | grep -iE '^(c|en_us)\.utf-?8$' | head -n 1 || true)"
19
+ if [ -n "$utf8_locale" ]; then
20
+ export LC_ALL="$utf8_locale"
21
+ fi
22
+
23
+ # git 이 넣는 주석(#) 줄은 실제 메시지가 아니므로 제외한다.
24
+ message="$(grep -v '^#' "$msg_file" || true)"
25
+ subject="$(printf '%s\n' "$message" | head -n 1)"
26
+
27
+ fail() {
28
+ echo "commit-msg: $1" >&2
29
+ echo " 제목: $subject" >&2
30
+ echo " 규칙: docs/git-conventions.md" >&2
31
+ exit 1
32
+ }
33
+
34
+ # git 이 자동 생성하는 메시지는 형식 검사 대상이 아니다.
35
+ if [[ "$subject" =~ ^(Merge|Revert|fixup!|squash!|amend!) ]]; then
36
+ exit 0
37
+ fi
38
+
39
+ types='feat|fix|refactor|test|docs|chore|ci|build'
40
+ pattern="^(${types}): .+"
41
+
42
+ if ! [[ "$subject" =~ $pattern ]]; then
43
+ fail "형식이 '<타입>: <요약>' 이 아닙니다. 타입: ${types//|/, }"
44
+ fi
45
+
46
+ if [ "${#subject}" -gt 50 ]; then
47
+ fail "제목이 50자를 넘습니다. (${#subject}자)"
48
+ fi
49
+
50
+ if [[ "$subject" == *. ]]; then
51
+ fail "제목을 마침표로 끝내지 않습니다."
52
+ fi
53
+
54
+ # 사람이 쓴 커밋처럼 보이도록 AI 도구 서명을 막는다. (docs/writing-style.md)
55
+ if printf '%s\n' "$message" | grep -qiE 'co-authored-by:.*(claude|anthropic)|generated with.*claude|🤖'; then
56
+ fail "AI 서명이 포함돼 있습니다. 해당 줄을 지우세요."
57
+ fi
58
+
59
+ exit 0
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # 커밋 단위를 작게 유지하기 위한 pre-commit 훅.
4
+ # 1. 스테이징된 파일 수가 HARNESS_MAX_FILES(기본 5)를 넘으면 커밋을 막는다.
5
+ # 2. .githooks/pre-commit.d/ 에 언어 프리셋이 넣은 검사를 이름 순서로 실행한다.
6
+ #
7
+ # 나누면 빌드가 깨질 때만 한도를 올린다: HARNESS_MAX_FILES=6 git commit ...
8
+ # 규칙: docs/workflow.md
9
+
10
+ set -euo pipefail
11
+
12
+ max_files="${HARNESS_MAX_FILES:-5}"
13
+
14
+ # 병합 충돌 해결 커밋은 여러 파일이 섞일 수밖에 없으므로 검사하지 않는다.
15
+ if git rev-parse -q --verify MERGE_HEAD >/dev/null; then
16
+ exit 0
17
+ fi
18
+
19
+ if ! [[ "$max_files" =~ ^[0-9]+$ ]] || [ "$max_files" -lt 1 ]; then
20
+ echo "pre-commit: HARNESS_MAX_FILES 는 1 이상의 정수여야 합니다. (현재: $max_files)" >&2
21
+ exit 1
22
+ fi
23
+
24
+ # -M: 파일 이동(rename)은 삭제+추가 두 개가 아니라 하나로 센다.
25
+ staged="$(git diff --cached --name-only -M)"
26
+ count="$(printf '%s' "$staged" | grep -c . || true)"
27
+
28
+ if [ "$count" -gt "$max_files" ]; then
29
+ echo "pre-commit: 스테이징된 파일 ${count}개 (한도 ${max_files}개)" >&2
30
+ printf '%s\n' "$staged" | sed 's/^/ - /' >&2
31
+ echo "" >&2
32
+ echo " 책임별로 커밋을 나누세요: git restore --staged <file>" >&2
33
+ echo " 나누면 빌드가 깨진다면: HARNESS_MAX_FILES=${count} git commit ..." >&2
34
+ exit 1
35
+ fi
36
+
37
+ # 언어별 검사(포맷 등)는 언어 프리셋이 pre-commit.d 에 넣는다. 실행 권한이 있는 파일만 실행한다.
38
+ checks_dir="$(dirname "$0")/pre-commit.d"
39
+ if [ -d "$checks_dir" ]; then
40
+ for check in "$checks_dir"/*; do
41
+ if [ -f "$check" ] && [ -x "$check" ]; then
42
+ "$check"
43
+ fi
44
+ done
45
+ fi
46
+
47
+ exit 0
@@ -0,0 +1,43 @@
1
+ name: 버그
2
+ description: 기대와 다르게 동작하는 문제
3
+ title: 'fix: '
4
+ labels: [bug]
5
+ body:
6
+ - type: textarea
7
+ id: actual
8
+ attributes:
9
+ label: 현상
10
+ description: 무엇이 잘못 동작하나. 화면 캡처, 로그, 오류 메시지가 있으면 붙인다
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: steps
15
+ attributes:
16
+ label: 재현 방법
17
+ placeholder: |
18
+ 1.
19
+ 2.
20
+ validations:
21
+ required: true
22
+ - type: textarea
23
+ id: expected
24
+ attributes:
25
+ label: 기대 동작
26
+ validations:
27
+ required: true
28
+ - type: input
29
+ id: platform
30
+ attributes:
31
+ label: 기기·브라우저·OS
32
+ description: 화면이나 클라이언트 문제일 때 적는다
33
+ placeholder: 예) iPhone 15 Safari, macOS Chrome
34
+ - type: dropdown
35
+ id: env
36
+ attributes:
37
+ label: 환경
38
+ options:
39
+ - 로컬
40
+ - 개발 서버
41
+ - 운영
42
+ validations:
43
+ required: true
@@ -0,0 +1 @@
1
+ blank_issues_enabled: false
@@ -0,0 +1,28 @@
1
+ name: 기능
2
+ description: 기능 추가·변경, 리팩터링, 설정 등 버그가 아닌 작업
3
+ title: 'feat: '
4
+ labels: [enhancement]
5
+ body:
6
+ - type: textarea
7
+ id: background
8
+ attributes:
9
+ label: 배경
10
+ description: 왜 이 작업이 필요한가
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: tasks
15
+ attributes:
16
+ label: 할 일
17
+ description: 커밋 단위로 나눈 작업 목록
18
+ value: |
19
+ - [ ]
20
+ validations:
21
+ required: true
22
+ - type: textarea
23
+ id: done
24
+ attributes:
25
+ label: 완료 조건
26
+ description: 무엇이 되면 이 이슈를 닫을 수 있나 (동작, 테스트 등)
27
+ validations:
28
+ required: true
@@ -0,0 +1,29 @@
1
+ <!--
2
+ 작성 규칙: docs/git-conventions.md, docs/writing-style.md
3
+ - 짧게, 사실만. 빈 섹션은 지운다.
4
+ - 변경 파일 나열 금지.
5
+ -->
6
+
7
+ Closes #
8
+
9
+ ## 변경 내용
10
+
11
+ -
12
+
13
+ ## 확인 방법
14
+
15
+ <!-- 실행한 검증, 추가·수정한 테스트, 확인한 동작 -->
16
+
17
+ ## 확인할 부분
18
+
19
+ <!-- 리뷰어가 꼭 봐야 할 지점. 없으면 지운다 -->
20
+
21
+ ## 화면
22
+
23
+ <!-- 화면이 바뀌었다면 변경 전·후 캡처. 없으면 지운다 -->
24
+
25
+ ## 체크리스트
26
+
27
+ - [ ] PR 제목이 `<타입>: <한국어 요약>` 형식이다
28
+ - [ ] 커밋 하나에 하나의 책임만 담았다
29
+ - [ ] CI가 통과한다
@@ -0,0 +1,41 @@
1
+ name: Conventions
2
+
3
+ # docs/git-conventions.md의 브랜치 이름·PR 제목·이슈 연결 규칙을 검사한다
4
+ on:
5
+ pull_request:
6
+ types: [opened, edited, synchronize, reopened]
7
+
8
+ permissions: {}
9
+
10
+ jobs:
11
+ # main 룰셋의 필수 체크 이름이라 바꾸면 룰셋도 같이 고친다
12
+ conventions:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - name: 규칙 검사
16
+ # PR 제목과 본문은 사용자가 쓴 값이라 스크립트에 직접 넣지 않고 환경변수로 넘긴다
17
+ env:
18
+ BRANCH: ${{ github.head_ref }}
19
+ TITLE: ${{ github.event.pull_request.title }}
20
+ BODY: ${{ github.event.pull_request.body }}
21
+ # .githooks/commit-msg 의 types 와 같게 유지한다
22
+ TYPES: feat|fix|refactor|test|docs|chore|ci|build
23
+ run: |
24
+ failed=0
25
+
26
+ if [[ ! "$BRANCH" =~ ^($TYPES)/[0-9]+-[a-z0-9]+(-[a-z0-9]+)*$ ]]; then
27
+ echo "::error::브랜치 이름이 '<타입>/<이슈번호>-<짧은-설명>' 형식이 아닙니다: $BRANCH"
28
+ failed=1
29
+ fi
30
+
31
+ if [[ ! "$TITLE" =~ ^($TYPES):\ .+ ]]; then
32
+ echo "::error::PR 제목이 '<타입>: <요약>' 형식이 아닙니다: $TITLE"
33
+ failed=1
34
+ fi
35
+
36
+ if ! grep -qiE '(^|[^[:alnum:]])closes #[0-9]+' <<< "$BODY"; then
37
+ echo "::error::PR 본문에 'Closes #<이슈번호>'가 없습니다"
38
+ failed=1
39
+ fi
40
+
41
+ exit $failed
@@ -0,0 +1,42 @@
1
+ # 코드 리뷰 반영
2
+
3
+ 사람 리뷰와 AI 리뷰 도구의 코멘트 모두 같은 기준으로 판단한다. 리뷰를 그대로 따르지 않고, 근거를 대서 반영·보류·거절한다.
4
+
5
+ ## 확인
6
+
7
+ PR 생성 후 사용자가 리뷰 확인을 요청하면 조회한다.
8
+
9
+ ```bash
10
+ gh pr view <PR번호> --json reviews,comments
11
+ gh api repos/{owner}/{repo}/pulls/<PR번호>/comments
12
+ ```
13
+
14
+ - 리뷰가 없으면 "리뷰 없음" 한 줄 보고 후 넘어간다. 대기·재조회하지 않는다.
15
+ - 리뷰 도구가 남기는 변경 요약 코멘트는 판단 대상이 아니다.
16
+
17
+ ## 판단 기준
18
+
19
+ | 판단 | 기준 |
20
+ | --- | --- |
21
+ | 반영 | 버그, 보안, 예외 누락, 프로젝트 규칙 위반, 명확한 가독성 개선 |
22
+ | 보류 | 맞는 말이지만 PR 범위 밖. 별도 이슈로 분리 제안 |
23
+ | 거절 | 오탐, 취향 차이, 프로젝트 규칙과 충돌, 불필요한 추상화 |
24
+
25
+ - Nitpick 은 수정 비용이 작고 규칙에 맞을 때만 반영.
26
+ - 판단 근거는 `docs/` 규칙 또는 코드 사실로 댄다.
27
+
28
+ ## 보고 형식
29
+
30
+ ```
31
+ | # | 위치 | 지적 | 판단 | 근거 |
32
+ | 1 | OrderService.java:42 | null 체크 누락 | 반영 | 외부 입력값 |
33
+ | 2 | Order.java:10 | Builder 패턴 제안 | 거절 | 필드 3개, 생성자로 충분 |
34
+ ```
35
+
36
+ ## 반영
37
+
38
+ - 사용자 확인 후 진행한다.
39
+ - 코멘트 하나 = 커밋 하나. 커밋 루프는 [workflow.md](workflow.md) 와 같다.
40
+ - 리뷰 스레드 답글은 사용자 승인 후에만 단다. 짧게 쓴다.
41
+ - `반영했습니다. (abc1234)`
42
+ - `PR 범위 밖이라 #15 로 분리했습니다.`
@@ -0,0 +1,90 @@
1
+ # Git 작업 규칙
2
+
3
+ 모든 작업은 **이슈 → 브랜치 → 커밋 → PR → merge 커밋** 순서로 `main`에 붙인다.
4
+ `main`에 직접 커밋·push하지 않는다.
5
+
6
+ ## 1. 이슈
7
+
8
+ - 작업 전에 GitHub 이슈를 만든다. 기능·버그 템플릿 중 하나를 채운다. 빈 이슈는 만들 수 없다.
9
+ - 이슈 하나는 브랜치 하나, PR 하나로 끝낼 크기로 잡는다. 크면 이슈를 나눈다.
10
+
11
+ ## 2. 브랜치
12
+
13
+ 형식: `<타입>/<이슈번호>-<짧은-설명>` (영어 소문자, 단어는 `-`로 연결)
14
+
15
+ ```sh
16
+ git switch main
17
+ git pull
18
+ git switch -c feat/12-order-cancel
19
+ ```
20
+
21
+ | 타입 | 용도 |
22
+ | ---------- | --------------------------------- |
23
+ | `feat` | 기능 추가·변경 |
24
+ | `fix` | 버그 수정 |
25
+ | `refactor` | 동작 변화 없는 구조 개선 |
26
+ | `test` | 테스트만 추가·수정 |
27
+ | `docs` | 문서 |
28
+ | `chore` | 설정, 의존성 등 기타 |
29
+ | `ci` | CI 워크플로 |
30
+ | `build` | 빌드 설정 (Gradle, Dockerfile 등) |
31
+
32
+ ## 3. 커밋
33
+
34
+ 형식: `<타입>: <한국어 요약>`. 타입은 브랜치 타입과 같은 목록을 쓴다.
35
+
36
+ - 제목은 50자 이내, 마침표로 끝내지 않는다.
37
+ - 무엇을 왜 바꿨는지 드러나게 쓴다. "~ 추가", "~ 수정", "~ 제거"로 끝낸다.
38
+ - 커밋 하나는 책임 하나만 담는다. 크기는 [workflow.md](workflow.md).
39
+ - 본문은 제목만으로 이유가 안 보일 때만 1~3줄 쓴다. 어떻게 했는지는 diff가 보여 준다.
40
+ - AI 서명, 이모지, 과장 수식어를 쓰지 않는다. → [writing-style.md](writing-style.md)
41
+
42
+ ```
43
+ 좋음
44
+ feat: 주문 취소 사유 필드 추가
45
+ fix: 토큰 만료 시 무한 리다이렉트 수정
46
+
47
+ 결제 페이지에서 만료 토큰으로 재진입하면 /login 과 /pay 를 반복함.
48
+
49
+ 나쁨
50
+ feat: 주문 기능 개선 및 코드 품질 향상 ← 모호함
51
+ fix: 인증 로직의 안정성을 강화했습니다. ← 서술형, 마침표
52
+ feat(order): 주문 취소 사유 필드 추가 ← scope 를 쓰지 않는다
53
+ ```
54
+
55
+ ## 4. PR
56
+
57
+ ```sh
58
+ git push -u origin <브랜치>
59
+ gh pr create --base main --title "<커밋과 같은 형식>" --body-file <본문 파일>
60
+ ```
61
+
62
+ - 제목은 커밋 메시지와 같은 형식으로 쓴다.
63
+ - 본문은 PR 템플릿을 채운다. `Closes #<이슈번호>`를 넣어 머지 시 이슈가 자동으로 닫히게 한다.
64
+ - 변경 내용은 3줄 이내 불릿. 변경 파일을 나열하지 않는다. 빈 섹션은 지운다.
65
+ - 커밋 10개, 변경 300줄 이하를 권장한다. 넘으면 PR을 나눈다.
66
+ - CI와 규칙 검사(Conventions)가 통과해야 머지한다. 리뷰 반영 기준은 [code-review.md](code-review.md).
67
+
68
+ ## 5. 머지
69
+
70
+ - **Create a merge commit**으로 머지한다. squash·rebase 머지는 쓰지 않는다.
71
+ 브랜치의 커밋 이력을 그대로 남기고, 기능 단위로 되돌릴 때 `git revert -m 1 <merge 커밋>`을 쓰기 위해서다.
72
+ - 머지 후 브랜치는 삭제한다.
73
+ - `main`이 앞서 나가면 브랜치에 `main`을 merge해서 충돌을 미리 해결한다. push한 이력은 rebase하지 않는다.
74
+
75
+ ```sh
76
+ git switch feat/12-order-cancel
77
+ git merge main
78
+ ```
79
+
80
+ - `--force` push와 훅 우회(`--no-verify`)는 하지 않는다. 에이전트 설정(`.claude/settings.json`)에서도 막는다.
81
+
82
+ ## 자동 검사
83
+
84
+ | 위치 | 검사 |
85
+ | -------------------- | --------------------------------------------------------------------- |
86
+ | `.githooks/commit-msg` | 커밋 형식, 제목 50자, 마침표, AI 서명 |
87
+ | `.githooks/pre-commit` | 커밋당 파일 수, `.githooks/pre-commit.d/`의 언어별 검사 |
88
+ | CI `Conventions` | 브랜치 이름, PR 제목, `Closes #N`. `main` 룰셋의 필수 체크로 건다 |
89
+
90
+ 훅은 `agentsmd init`이 연결한다. 직접 연결하려면 `git config core.hooksPath .githooks`.
@@ -0,0 +1,51 @@
1
+ # 작업 흐름
2
+
3
+ ## 1. 시작
4
+
5
+ - 요구사항이 불명확하면 먼저 질문한다.
6
+ - 이슈와 브랜치를 만든다. → [git-conventions.md](git-conventions.md)
7
+ - 커밋 계획을 목록으로 제시하고 승인을 받는다.
8
+
9
+ ```
10
+ 1. Order.java, OrderTest.java — feat: 주문 취소 사유 필드 추가
11
+ 2. OrderService.java, OrderServiceTest.java — feat: 주문 취소 로직 추가
12
+ ```
13
+
14
+ ## 2. 커밋 루프
15
+
16
+ 1. 커밋 하나에 해당하는 변경을 한다.
17
+ 2. 검증한다. (포맷, 빌드, 테스트 — 프로젝트에 있는 것만)
18
+ 3. 커밋한다. → [git-conventions.md](git-conventions.md)
19
+ 4. 보고하고 **멈춘다.**
20
+
21
+ 보고 형식:
22
+
23
+ ```
24
+ 커밋: feat: 주문 취소 사유 필드 추가
25
+ 파일: src/main/java/.../Order.java, src/test/java/.../OrderTest.java
26
+ 다음: OrderService 에 취소 로직 추가 (2/2)
27
+ ```
28
+
29
+ - 사용자가 진행 또는 피드백을 주기 전까지 다음 커밋을 하지 않는다.
30
+ - 피드백 반영은 새 커밋으로 한다.
31
+ - `--amend` 는 사용자가 요청하고, push 전일 때만 쓴다.
32
+
33
+ ## 3. 커밋 크기
34
+
35
+ - 커밋 하나는 책임 하나. 파일은 5개 이하.
36
+ - 대상 코드와 그 테스트는 같은 커밋에 둘 수 있다.
37
+ - 5개를 넘기면 책임별로 커밋을 나눈다. 나누면 빌드가 깨질 때만 `HARNESS_MAX_FILES=<n> git commit ...` 로 실행하고, 보고에 이유를 한 줄 적는다.
38
+ - `pre-commit` 훅이 파일 수를 검사한다. (기본 한도 5)
39
+
40
+ ## 4. PR
41
+
42
+ - 계획한 커밋이 끝나면 push 후 PR 을 만든다. → [git-conventions.md](git-conventions.md)
43
+ - PR 링크를 보고하고 멈춘다.
44
+ - 리뷰 확인은 [code-review.md](code-review.md).
45
+
46
+ ## 금지
47
+
48
+ - 멈추지 않고 커밋 여러 개 연속 실행
49
+ - 요청 없는 리팩터링·정리 작업 끼워 넣기
50
+ - `--no-verify` 등 훅 우회
51
+ - main 직접 커밋·push
@@ -0,0 +1,42 @@
1
+ # 문체
2
+
3
+ ## md 문서
4
+
5
+ - 개조식. 한 줄에 규칙 하나.
6
+ - 배경, 사연, 도입부, 맺음말 쓰지 않는다. 규칙만 쓴다.
7
+ - 문장은 "~한다", "~하지 않는다" 로 끝낸다.
8
+ - 설명이 길어지면 표·예시 코드로 바꾼다.
9
+ - 문서 하나 150줄 이내. 넘으면 나눈다. (코드 예시 모음 문서는 제외)
10
+ - 같은 내용을 여러 문서에 반복하지 않는다. 링크한다.
11
+
12
+ ```
13
+ 좋음
14
+ - 커밋 1개 후 멈춘다.
15
+
16
+ 나쁨
17
+ - 효율적인 협업과 원활한 피드백 루프를 위해, 에이전트는 각 커밋이 완료될 때마다
18
+ 작업을 일시 중지하고 사용자의 의견을 기다리는 것이 바람직합니다.
19
+ ```
20
+
21
+ ## 커밋·PR·리뷰 답글
22
+
23
+ 사람이 쓴 것처럼 쓴다.
24
+
25
+ - 짧게. 사실만.
26
+ - 한 일만 쓴다. 기대 효과, 소감 쓰지 않는다.
27
+ - 불릿은 3개 이내.
28
+
29
+ 금지 표현:
30
+
31
+ | 종류 | 예 |
32
+ | --- | --- |
33
+ | 서사형 도입 | "이번 PR에서는 ~", "~을 통해 ~을 구현하였습니다" |
34
+ | 과장 수식어 | 강력한, 견고한, 원활한, 효율적인, 종합적인, 체계적인, 향상 |
35
+ | 정리 문구 | "요약하면", "결론적으로", "전반적으로" |
36
+ | 장식 | 이모지, 헤더마다 아이콘, 과도한 볼드 |
37
+ | AI 서명 | `Co-Authored-By: Claude`, `Generated with Claude Code`, 🤖 |
38
+
39
+ ## 코드 주석
40
+
41
+ - [code-style.md](code-style.md) 의 주석 규칙을 따른다.
42
+ - 주석도 짧게. 이유 한 줄이면 충분하다.
package/package.json CHANGED
@@ -1,6 +1,45 @@
1
1
  {
2
2
  "name": "@agentsmd/preset-git",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "언어와 무관한 Git 작업 규칙 프리셋 (작업 흐름 문서, 커밋 훅, Conventions 검사, 이슈·PR 템플릿)",
5
+ "keywords": [
6
+ "agents.md",
7
+ "ai-agent",
8
+ "git-hooks",
9
+ "conventional-workflow"
10
+ ],
11
+ "homepage": "https://github.com/xoruddl/agentsmd-kit#readme",
12
+ "bugs": "https://github.com/xoruddl/agentsmd-kit/issues",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/xoruddl/agentsmd-kit.git",
16
+ "directory": "packages/preset-git"
17
+ },
18
+ "license": "MIT",
19
+ "author": "이태경 (https://github.com/xoruddl)",
20
+ "type": "module",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "files"
30
+ ],
31
+ "engines": {
32
+ "node": ">=22"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "dependencies": {
38
+ "@agentsmd/core": "0.1.0"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.build.json",
42
+ "typecheck": "tsc -p tsconfig.json",
43
+ "test": "vitest run"
44
+ }
6
45
  }