@kood/claude-code 0.6.4 → 0.6.6
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/dist/index.js +271 -158
- package/package.json +1 -1
- package/templates/.claude/commands/git-all.md +36 -48
- package/templates/.claude/commands/git-session.md +25 -52
- package/templates/.claude/commands/lint-fix.md +24 -47
- package/templates/.claude/commands/pre-deploy.md +24 -101
- package/templates/.claude/commands/version-update.md +31 -29
- package/templates/.claude/scripts/deploy/build-run.sh +36 -0
- package/templates/.claude/scripts/deploy/deploy-check.sh +38 -0
- package/templates/.claude/scripts/git/git-all.sh +57 -0
- package/templates/.claude/scripts/git/git-clean-check.sh +31 -0
- package/templates/.claude/scripts/git/git-commit.sh +51 -0
- package/templates/.claude/scripts/git/git-info.sh +34 -0
- package/templates/.claude/scripts/git/git-push.sh +50 -0
- package/templates/.claude/scripts/lint/lint-check.sh +56 -0
- package/templates/.claude/scripts/lint/lint-file.sh +41 -0
- package/templates/.claude/scripts/pm/pm-detect.sh +25 -0
- package/templates/.claude/scripts/pm/pm-run.sh +41 -0
- package/templates/.claude/scripts/version/version-bump.sh +54 -0
- package/templates/.claude/scripts/version/version-find.sh +49 -0
- package/templates/.claude/skills/genius-thinking/SKILL.md +426 -0
- package/templates/.claude/skills/startup-validator/SKILL.md +432 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# git-info.sh - Git 상태 및 diff 요약 출력
|
|
3
|
+
# 에이전트가 분석할 정보를 빠르게 수집
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Git 저장소 확인
|
|
8
|
+
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
|
9
|
+
echo "Error: Not a git repository"
|
|
10
|
+
exit 1
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
echo "=== Git Status ==="
|
|
14
|
+
if [ -n "$(git status --porcelain)" ]; then
|
|
15
|
+
git status --short
|
|
16
|
+
else
|
|
17
|
+
echo "(clean)"
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
echo ""
|
|
21
|
+
echo "=== Changed Files ==="
|
|
22
|
+
git diff --stat
|
|
23
|
+
|
|
24
|
+
echo ""
|
|
25
|
+
echo "=== Staged Files ==="
|
|
26
|
+
git diff --cached --stat
|
|
27
|
+
|
|
28
|
+
echo ""
|
|
29
|
+
echo "=== Recent Commits (5) ==="
|
|
30
|
+
git log --oneline -5
|
|
31
|
+
|
|
32
|
+
echo ""
|
|
33
|
+
echo "=== Current Branch ==="
|
|
34
|
+
git branch --show-current
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# git-push.sh - 안전한 푸시 (상태 확인 후)
|
|
3
|
+
# Usage: ./git-push.sh [--force]
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Git 저장소 확인
|
|
8
|
+
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
|
9
|
+
echo "Error: Not a git repository"
|
|
10
|
+
exit 1
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
# 현재 브랜치
|
|
14
|
+
BRANCH=$(git branch --show-current)
|
|
15
|
+
|
|
16
|
+
if [ -z "$BRANCH" ]; then
|
|
17
|
+
echo "Error: Not on any branch (detached HEAD)"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# Force push 처리
|
|
22
|
+
USE_FORCE=false
|
|
23
|
+
if [ "${1:-}" = "--force" ]; then
|
|
24
|
+
# main/master 보호
|
|
25
|
+
if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
|
|
26
|
+
echo "ERROR: Cannot force push to $BRANCH"
|
|
27
|
+
echo "This operation is too dangerous on protected branches"
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
USE_FORCE=true
|
|
31
|
+
echo "Warning: Force push enabled (with lease) to $BRANCH"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
# upstream 확인 및 push
|
|
35
|
+
if ! git rev-parse --abbrev-ref "@{upstream}" >/dev/null 2>&1; then
|
|
36
|
+
echo "Setting upstream for branch: $BRANCH"
|
|
37
|
+
if [ "$USE_FORCE" = true ]; then
|
|
38
|
+
git push -u origin "$BRANCH" --force-with-lease
|
|
39
|
+
else
|
|
40
|
+
git push -u origin "$BRANCH"
|
|
41
|
+
fi
|
|
42
|
+
else
|
|
43
|
+
if [ "$USE_FORCE" = true ]; then
|
|
44
|
+
git push --force-with-lease
|
|
45
|
+
else
|
|
46
|
+
git push
|
|
47
|
+
fi
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
echo "Pushed to origin/$BRANCH"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# lint-check.sh - tsc + eslint 병렬 실행
|
|
3
|
+
# Usage: ./lint-check.sh
|
|
4
|
+
# 두 검사를 병렬로 실행하고 결과를 수집
|
|
5
|
+
|
|
6
|
+
set -uo pipefail
|
|
7
|
+
|
|
8
|
+
# 임시 파일
|
|
9
|
+
TSC_OUT=$(mktemp)
|
|
10
|
+
ESLINT_OUT=$(mktemp)
|
|
11
|
+
TSC_EXIT=0
|
|
12
|
+
ESLINT_EXIT=0
|
|
13
|
+
|
|
14
|
+
# Cleanup (ERR, INT, TERM도 처리)
|
|
15
|
+
trap "rm -f $TSC_OUT $ESLINT_OUT" EXIT ERR INT TERM
|
|
16
|
+
|
|
17
|
+
echo "=== Running TypeScript + ESLint in parallel ==="
|
|
18
|
+
|
|
19
|
+
# 병렬 실행
|
|
20
|
+
(npx tsc --noEmit > "$TSC_OUT" 2>&1) &
|
|
21
|
+
TSC_PID=$!
|
|
22
|
+
|
|
23
|
+
(npx eslint . > "$ESLINT_OUT" 2>&1) &
|
|
24
|
+
ESLINT_PID=$!
|
|
25
|
+
|
|
26
|
+
# 대기
|
|
27
|
+
wait $TSC_PID || TSC_EXIT=$?
|
|
28
|
+
wait $ESLINT_PID || ESLINT_EXIT=$?
|
|
29
|
+
|
|
30
|
+
# 결과 출력
|
|
31
|
+
echo ""
|
|
32
|
+
echo "=== TypeScript Results ==="
|
|
33
|
+
if [ $TSC_EXIT -eq 0 ]; then
|
|
34
|
+
echo "✓ No type errors"
|
|
35
|
+
else
|
|
36
|
+
cat "$TSC_OUT"
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
echo ""
|
|
40
|
+
echo "=== ESLint Results ==="
|
|
41
|
+
if [ $ESLINT_EXIT -eq 0 ]; then
|
|
42
|
+
echo "✓ No lint errors"
|
|
43
|
+
else
|
|
44
|
+
cat "$ESLINT_OUT"
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
echo ""
|
|
48
|
+
echo "=== Summary ==="
|
|
49
|
+
if [ $TSC_EXIT -eq 0 ] && [ $ESLINT_EXIT -eq 0 ]; then
|
|
50
|
+
echo "✓ All checks passed"
|
|
51
|
+
exit 0
|
|
52
|
+
else
|
|
53
|
+
[ $TSC_EXIT -ne 0 ] && echo "✗ TypeScript: FAILED"
|
|
54
|
+
[ $ESLINT_EXIT -ne 0 ] && echo "✗ ESLint: FAILED"
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# lint-file.sh - 특정 파일/디렉토리만 검사
|
|
3
|
+
# Usage: ./lint-file.sh <file|directory> [file2...]
|
|
4
|
+
# Example: ./lint-file.sh src/utils/api.ts
|
|
5
|
+
# ./lint-file.sh src/components/
|
|
6
|
+
|
|
7
|
+
set -uo pipefail
|
|
8
|
+
|
|
9
|
+
if [ $# -eq 0 ]; then
|
|
10
|
+
echo "Usage: $0 <file|directory> [file2...]"
|
|
11
|
+
echo "Example: $0 src/utils/api.ts"
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
TSC_EXIT=0
|
|
16
|
+
ESLINT_EXIT=0
|
|
17
|
+
|
|
18
|
+
echo "=== Checking: $@ ==="
|
|
19
|
+
|
|
20
|
+
# TypeScript 검사 (전체 프로젝트 - tsc는 개별 파일 검사 미지원)
|
|
21
|
+
echo ""
|
|
22
|
+
echo "=== TypeScript ==="
|
|
23
|
+
echo "(Note: tsc checks entire project)"
|
|
24
|
+
npx tsc --noEmit || TSC_EXIT=$?
|
|
25
|
+
|
|
26
|
+
# ESLint 검사
|
|
27
|
+
echo ""
|
|
28
|
+
echo "=== ESLint ==="
|
|
29
|
+
npx eslint "$@" || ESLINT_EXIT=$?
|
|
30
|
+
|
|
31
|
+
# 결과
|
|
32
|
+
echo ""
|
|
33
|
+
echo "=== Summary ==="
|
|
34
|
+
if [ $TSC_EXIT -eq 0 ] && [ $ESLINT_EXIT -eq 0 ]; then
|
|
35
|
+
echo "✓ All checks passed"
|
|
36
|
+
exit 0
|
|
37
|
+
else
|
|
38
|
+
[ $TSC_EXIT -ne 0 ] && echo "✗ TypeScript: FAILED"
|
|
39
|
+
[ $ESLINT_EXIT -ne 0 ] && echo "✗ ESLint: FAILED"
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# pm-detect.sh - Package manager 자동 감지
|
|
3
|
+
# Usage: ./pm-detect.sh
|
|
4
|
+
# Output: npm | yarn | pnpm | bun
|
|
5
|
+
# Exit 1 if no lock file found
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
# Lock 파일 기반 감지
|
|
10
|
+
if [ -f "bun.lockb" ]; then
|
|
11
|
+
echo "bun"
|
|
12
|
+
elif [ -f "pnpm-lock.yaml" ]; then
|
|
13
|
+
echo "pnpm"
|
|
14
|
+
elif [ -f "yarn.lock" ]; then
|
|
15
|
+
echo "yarn"
|
|
16
|
+
elif [ -f "package-lock.json" ]; then
|
|
17
|
+
echo "npm"
|
|
18
|
+
elif [ -f "package.json" ]; then
|
|
19
|
+
# Lock 파일 없으면 기본 npm
|
|
20
|
+
echo "Warning: No lock file found, defaulting to npm" >&2
|
|
21
|
+
echo "npm"
|
|
22
|
+
else
|
|
23
|
+
echo "Error: No package.json found" >&2
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# pm-run.sh - 감지된 package manager로 스크립트 실행
|
|
3
|
+
# Usage: ./pm-run.sh <script> [args...]
|
|
4
|
+
# Example: ./pm-run.sh build
|
|
5
|
+
# ./pm-run.sh test --watch
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
+
|
|
11
|
+
if [ $# -eq 0 ] || [ -z "${1:-}" ]; then
|
|
12
|
+
echo "Usage: $0 <script> [args...]"
|
|
13
|
+
echo "Example: $0 build"
|
|
14
|
+
exit 1
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
SCRIPT="$1"
|
|
18
|
+
shift
|
|
19
|
+
|
|
20
|
+
# Package manager 감지
|
|
21
|
+
PM=$("$SCRIPT_DIR/pm-detect.sh")
|
|
22
|
+
|
|
23
|
+
# 실행
|
|
24
|
+
case "$PM" in
|
|
25
|
+
bun)
|
|
26
|
+
bun run "$SCRIPT" "$@"
|
|
27
|
+
;;
|
|
28
|
+
pnpm)
|
|
29
|
+
pnpm run "$SCRIPT" "$@"
|
|
30
|
+
;;
|
|
31
|
+
yarn)
|
|
32
|
+
yarn "$SCRIPT" "$@"
|
|
33
|
+
;;
|
|
34
|
+
npm)
|
|
35
|
+
npm run "$SCRIPT" "$@"
|
|
36
|
+
;;
|
|
37
|
+
*)
|
|
38
|
+
echo "Error: Unknown package manager: $PM" >&2
|
|
39
|
+
exit 1
|
|
40
|
+
;;
|
|
41
|
+
esac
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# version-bump.sh - 버전 계산
|
|
3
|
+
# Usage: ./version-bump.sh <current_version> <bump_type>
|
|
4
|
+
# bump_type: +1 (patch), +minor, +major, or direct version (x.x.x)
|
|
5
|
+
# Example: ./version-bump.sh 1.2.3 +1 → 1.2.4
|
|
6
|
+
# ./version-bump.sh 1.2.3 +minor → 1.3.0
|
|
7
|
+
# ./version-bump.sh 1.2.3 +major → 2.0.0
|
|
8
|
+
# ./version-bump.sh 1.2.3 2.0.0 → 2.0.0
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
if [ $# -lt 2 ]; then
|
|
13
|
+
echo "Usage: $0 <current_version> <bump_type>"
|
|
14
|
+
echo "bump_type: +1, +minor, +major, or x.x.x"
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
CURRENT="$1"
|
|
19
|
+
BUMP="$2"
|
|
20
|
+
|
|
21
|
+
# 버전 형식 먼저 검증
|
|
22
|
+
if ! [[ "$CURRENT" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
23
|
+
echo "Error: Invalid version format: $CURRENT" >&2
|
|
24
|
+
echo "Expected: x.x.x (e.g., 1.2.3)" >&2
|
|
25
|
+
exit 1
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# 버전 파싱
|
|
29
|
+
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT"
|
|
30
|
+
|
|
31
|
+
# 새 버전 계산
|
|
32
|
+
case "$BUMP" in
|
|
33
|
+
+1|+patch)
|
|
34
|
+
NEW_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
|
|
35
|
+
;;
|
|
36
|
+
+minor)
|
|
37
|
+
NEW_VERSION="$MAJOR.$((MINOR + 1)).0"
|
|
38
|
+
;;
|
|
39
|
+
+major)
|
|
40
|
+
NEW_VERSION="$((MAJOR + 1)).0.0"
|
|
41
|
+
;;
|
|
42
|
+
*)
|
|
43
|
+
# 직접 버전 지정 검증
|
|
44
|
+
if [[ "$BUMP" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
45
|
+
NEW_VERSION="$BUMP"
|
|
46
|
+
else
|
|
47
|
+
echo "Error: Invalid bump type: $BUMP"
|
|
48
|
+
echo "Use: +1, +minor, +major, or x.x.x"
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
;;
|
|
52
|
+
esac
|
|
53
|
+
|
|
54
|
+
echo "$NEW_VERSION"
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# version-find.sh - 버전 파일 탐색
|
|
3
|
+
# Usage: ./version-find.sh
|
|
4
|
+
# package.json과 .version() 코드 파일을 병렬로 탐색
|
|
5
|
+
|
|
6
|
+
set -uo pipefail
|
|
7
|
+
|
|
8
|
+
echo "=== Searching version files ==="
|
|
9
|
+
|
|
10
|
+
# 임시 파일
|
|
11
|
+
PKG_OUT=$(mktemp)
|
|
12
|
+
CODE_OUT=$(mktemp)
|
|
13
|
+
|
|
14
|
+
trap "rm -f $PKG_OUT $CODE_OUT" EXIT ERR INT TERM
|
|
15
|
+
|
|
16
|
+
# 병렬 탐색 (fd 우선, 없으면 find)
|
|
17
|
+
if command -v fd &>/dev/null; then
|
|
18
|
+
fd -t f 'package.json' -E node_modules > "$PKG_OUT" 2>&1 &
|
|
19
|
+
else
|
|
20
|
+
find . -name 'package.json' -not -path '*/node_modules/*' > "$PKG_OUT" 2>&1 &
|
|
21
|
+
fi
|
|
22
|
+
PID1=$!
|
|
23
|
+
|
|
24
|
+
(rg "\.version\(['\"]" --type ts --type js -l 2>/dev/null || true) > "$CODE_OUT" &
|
|
25
|
+
PID2=$!
|
|
26
|
+
|
|
27
|
+
wait $PID1
|
|
28
|
+
wait $PID2
|
|
29
|
+
|
|
30
|
+
# 결과 출력
|
|
31
|
+
echo ""
|
|
32
|
+
echo "=== package.json files ==="
|
|
33
|
+
if [ -s "$PKG_OUT" ]; then
|
|
34
|
+
cat "$PKG_OUT"
|
|
35
|
+
else
|
|
36
|
+
echo "(none found)"
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
echo ""
|
|
40
|
+
echo "=== Code files with .version() ==="
|
|
41
|
+
if [ -s "$CODE_OUT" ]; then
|
|
42
|
+
cat "$CODE_OUT"
|
|
43
|
+
else
|
|
44
|
+
echo "(none found)"
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
echo ""
|
|
48
|
+
echo "=== All version files ==="
|
|
49
|
+
cat "$PKG_OUT" "$CODE_OUT" | sort -u
|