claude-pro-minmax 1.0.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/.claude/CLAUDE.md +60 -0
- package/.claude/agents/README.ko.md +210 -0
- package/.claude/agents/README.md +210 -0
- package/.claude/agents/builder.md +96 -0
- package/.claude/agents/dplanner.md +58 -0
- package/.claude/agents/planner.md +52 -0
- package/.claude/agents/reviewer.md +69 -0
- package/.claude/commands/README.ko.md +381 -0
- package/.claude/commands/README.md +381 -0
- package/.claude/commands/analyze-failures.md +49 -0
- package/.claude/commands/compact-phase.md +75 -0
- package/.claude/commands/do-opus.md +43 -0
- package/.claude/commands/do-sonnet.md +43 -0
- package/.claude/commands/do.md +56 -0
- package/.claude/commands/dplan.md +36 -0
- package/.claude/commands/learn.md +64 -0
- package/.claude/commands/llms-txt.md +50 -0
- package/.claude/commands/load-context.md +46 -0
- package/.claude/commands/plan.md +62 -0
- package/.claude/commands/review.md +55 -0
- package/.claude/commands/session-load.md +61 -0
- package/.claude/commands/session-save.md +79 -0
- package/.claude/commands/watch.md +58 -0
- package/.claude/contexts/README.ko.md +94 -0
- package/.claude/contexts/README.md +94 -0
- package/.claude/contexts/backend-context.md +23 -0
- package/.claude/contexts/frontend-context.md +24 -0
- package/.claude/rules/README.ko.md +98 -0
- package/.claude/rules/README.md +98 -0
- package/.claude/rules/code-style.md +21 -0
- package/.claude/rules/critical-actions.md +34 -0
- package/.claude/rules/security.md +13 -0
- package/.claude/sessions/2025-01-27-auth-jwt-refresh.md +32 -0
- package/.claude/sessions/README.ko.md +195 -0
- package/.claude/sessions/README.md +195 -0
- package/.claude/settings.json +167 -0
- package/.claude/settings.local.example.json +3 -0
- package/.claude/skills/README.ko.md +60 -0
- package/.claude/skills/README.md +60 -0
- package/.claude/skills/cli-wrappers/SKILL.md +38 -0
- package/.claude/skills/cli-wrappers/references/github-cli.md +18 -0
- package/.claude/skills/cli-wrappers/references/mgrep.md +18 -0
- package/.claude/skills/learned/README.ko.md +64 -0
- package/.claude/skills/learned/README.md +64 -0
- package/.claude.json +28 -0
- package/.claudeignore +17 -0
- package/LICENSE +21 -0
- package/README.ko.md +441 -0
- package/README.md +441 -0
- package/bin/cpmm.js +171 -0
- package/install.sh +154 -0
- package/package.json +59 -0
- package/scripts/README.ko.md +150 -0
- package/scripts/README.md +150 -0
- package/scripts/analyze-failures.sh +145 -0
- package/scripts/build.sh +34 -0
- package/scripts/claude_command_smoke.sh +116 -0
- package/scripts/commit.sh +7 -0
- package/scripts/create-branch.sh +14 -0
- package/scripts/hooks/README.ko.md +117 -0
- package/scripts/hooks/README.md +118 -0
- package/scripts/hooks/compact-suggest.sh +52 -0
- package/scripts/hooks/critical-action-check.sh +68 -0
- package/scripts/hooks/notification.sh +47 -0
- package/scripts/hooks/post-edit-format.sh +39 -0
- package/scripts/hooks/pre-compact.sh +55 -0
- package/scripts/hooks/readonly-check.sh +19 -0
- package/scripts/hooks/retry-check.sh +32 -0
- package/scripts/hooks/session-cleanup.sh +83 -0
- package/scripts/hooks/session-start.sh +70 -0
- package/scripts/hooks/stop-collect-context.sh +39 -0
- package/scripts/hooks/tool-failure-log.sh +46 -0
- package/scripts/lint.sh +34 -0
- package/scripts/runtime/README.ko.md +60 -0
- package/scripts/runtime/README.md +60 -0
- package/scripts/runtime/adapters/README.ko.md +68 -0
- package/scripts/runtime/adapters/README.md +68 -0
- package/scripts/runtime/adapters/_interface.sh +53 -0
- package/scripts/runtime/adapters/_template.sh +67 -0
- package/scripts/runtime/adapters/generic.sh +78 -0
- package/scripts/runtime/adapters/go.sh +51 -0
- package/scripts/runtime/adapters/jvm.sh +97 -0
- package/scripts/runtime/adapters/node.sh +104 -0
- package/scripts/runtime/adapters/python.sh +116 -0
- package/scripts/runtime/adapters/rust.sh +49 -0
- package/scripts/runtime/detect.sh +52 -0
- package/scripts/scrub-secrets.js +48 -0
- package/scripts/snapshot.sh +45 -0
- package/scripts/test.sh +34 -0
- package/scripts/verify.sh +35 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# generic.sh - Generic Adapter (Makefile fallback)
|
|
3
|
+
# Used when no specific runtime is detected
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
|
|
8
|
+
adapter_info() {
|
|
9
|
+
echo '{"runtime":"generic","tool":"make","languages":["unknown"]}'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
adapter_verify() {
|
|
13
|
+
cd "$PROJECT_DIR"
|
|
14
|
+
if [[ -f "Makefile" ]]; then
|
|
15
|
+
make check 2>/dev/null || make test 2>/dev/null || make verify 2>/dev/null || true
|
|
16
|
+
else
|
|
17
|
+
echo "โ ๏ธ No recognized build system found."
|
|
18
|
+
echo "Supported: Gradle, Maven, npm, pnpm, yarn, Cargo, Go, Poetry, pip"
|
|
19
|
+
echo "Please specify the build commands manually."
|
|
20
|
+
return 1
|
|
21
|
+
fi
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
adapter_build() {
|
|
25
|
+
cd "$PROJECT_DIR"
|
|
26
|
+
if [[ -f "Makefile" ]]; then
|
|
27
|
+
make build 2>/dev/null || make all 2>/dev/null || make
|
|
28
|
+
else
|
|
29
|
+
echo "No Makefile found. Cannot build."
|
|
30
|
+
return 1
|
|
31
|
+
fi
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
adapter_test() {
|
|
35
|
+
cd "$PROJECT_DIR"
|
|
36
|
+
if [[ -f "Makefile" ]]; then
|
|
37
|
+
make test
|
|
38
|
+
else
|
|
39
|
+
echo "No Makefile found. Cannot run tests."
|
|
40
|
+
return 1
|
|
41
|
+
fi
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
adapter_lint() {
|
|
45
|
+
cd "$PROJECT_DIR"
|
|
46
|
+
if [[ -f "Makefile" ]]; then
|
|
47
|
+
make lint 2>/dev/null || true
|
|
48
|
+
else
|
|
49
|
+
echo "No Makefile found. Cannot lint."
|
|
50
|
+
fi
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
adapter_format() {
|
|
54
|
+
cd "$PROJECT_DIR"
|
|
55
|
+
if [[ -f "Makefile" ]]; then
|
|
56
|
+
make format 2>/dev/null || make fmt 2>/dev/null || true
|
|
57
|
+
else
|
|
58
|
+
echo "No Makefile found. Cannot format."
|
|
59
|
+
fi
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
adapter_run() {
|
|
63
|
+
cd "$PROJECT_DIR"
|
|
64
|
+
if [[ -f "Makefile" ]]; then
|
|
65
|
+
make run 2>/dev/null || make start 2>/dev/null || make serve 2>/dev/null
|
|
66
|
+
else
|
|
67
|
+
echo "No Makefile found. Cannot run."
|
|
68
|
+
return 1
|
|
69
|
+
fi
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
adapter_clean() {
|
|
73
|
+
cd "$PROJECT_DIR"
|
|
74
|
+
if [[ -f "Makefile" ]]; then
|
|
75
|
+
make clean 2>/dev/null || true
|
|
76
|
+
fi
|
|
77
|
+
echo "Generic clean completed"
|
|
78
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# go.sh - Go Adapter
|
|
3
|
+
# Supports Go modules
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
|
|
8
|
+
adapter_info() {
|
|
9
|
+
echo '{"runtime":"go","tool":"go","languages":["go"]}'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
adapter_verify() {
|
|
13
|
+
cd "$PROJECT_DIR"
|
|
14
|
+
go build ./... && go test ./... && go vet ./...
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
adapter_build() {
|
|
18
|
+
cd "$PROJECT_DIR"
|
|
19
|
+
go build ./...
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
adapter_test() {
|
|
23
|
+
cd "$PROJECT_DIR"
|
|
24
|
+
go test ./...
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
adapter_lint() {
|
|
28
|
+
cd "$PROJECT_DIR"
|
|
29
|
+
# Try golangci-lint first, fallback to go vet
|
|
30
|
+
if command -v golangci-lint &>/dev/null; then
|
|
31
|
+
golangci-lint run
|
|
32
|
+
else
|
|
33
|
+
go vet ./...
|
|
34
|
+
fi
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
adapter_format() {
|
|
38
|
+
cd "$PROJECT_DIR"
|
|
39
|
+
gofmt -w .
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
adapter_run() {
|
|
43
|
+
cd "$PROJECT_DIR"
|
|
44
|
+
go run .
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
adapter_clean() {
|
|
48
|
+
cd "$PROJECT_DIR"
|
|
49
|
+
go clean
|
|
50
|
+
rm -rf bin/ 2>/dev/null || true
|
|
51
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# jvm.sh - JVM Adapter (Gradle/Maven)
|
|
3
|
+
# Supports Java, Kotlin, Spring Boot
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
|
|
8
|
+
_detect_tool() {
|
|
9
|
+
[[ -f "$PROJECT_DIR/gradlew" ]] && echo "gradle" && return
|
|
10
|
+
[[ -f "$PROJECT_DIR/mvnw" ]] && echo "maven" && return
|
|
11
|
+
[[ -f "$PROJECT_DIR/build.gradle.kts" ]] && echo "gradle" && return
|
|
12
|
+
[[ -f "$PROJECT_DIR/build.gradle" ]] && echo "gradle" && return
|
|
13
|
+
[[ -f "$PROJECT_DIR/pom.xml" ]] && echo "maven" && return
|
|
14
|
+
echo "gradle" # default
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
_gradle() {
|
|
18
|
+
if [[ -f "$PROJECT_DIR/gradlew" ]]; then
|
|
19
|
+
"$PROJECT_DIR/gradlew" "$@"
|
|
20
|
+
else
|
|
21
|
+
gradle "$@"
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
_maven() {
|
|
26
|
+
if [[ -f "$PROJECT_DIR/mvnw" ]]; then
|
|
27
|
+
"$PROJECT_DIR/mvnw" "$@"
|
|
28
|
+
else
|
|
29
|
+
mvn "$@"
|
|
30
|
+
fi
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
adapter_info() {
|
|
34
|
+
echo '{"runtime":"jvm","tools":["gradle","maven"],"languages":["java","kotlin"]}'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
adapter_verify() {
|
|
38
|
+
case $(_detect_tool) in
|
|
39
|
+
gradle) _gradle check --no-daemon ;;
|
|
40
|
+
maven) _maven verify -q ;;
|
|
41
|
+
esac
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
adapter_build() {
|
|
45
|
+
case $(_detect_tool) in
|
|
46
|
+
gradle) _gradle build --no-daemon -x test ;;
|
|
47
|
+
maven) _maven package -q -DskipTests ;;
|
|
48
|
+
esac
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
adapter_test() {
|
|
52
|
+
case $(_detect_tool) in
|
|
53
|
+
gradle) _gradle test --no-daemon ;;
|
|
54
|
+
maven) _maven test -q ;;
|
|
55
|
+
esac
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
adapter_lint() {
|
|
59
|
+
case $(_detect_tool) in
|
|
60
|
+
gradle)
|
|
61
|
+
# Try ktlint for Kotlin, then checkstyle for Java
|
|
62
|
+
_gradle ktlintCheck --no-daemon 2>/dev/null || \
|
|
63
|
+
_gradle checkstyleMain --no-daemon 2>/dev/null || \
|
|
64
|
+
true
|
|
65
|
+
;;
|
|
66
|
+
maven)
|
|
67
|
+
_maven checkstyle:check -q 2>/dev/null || true
|
|
68
|
+
;;
|
|
69
|
+
esac
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
adapter_format() {
|
|
73
|
+
case $(_detect_tool) in
|
|
74
|
+
gradle)
|
|
75
|
+
_gradle ktlintFormat --no-daemon 2>/dev/null || \
|
|
76
|
+
_gradle spotlessApply --no-daemon 2>/dev/null || \
|
|
77
|
+
true
|
|
78
|
+
;;
|
|
79
|
+
maven)
|
|
80
|
+
_maven spotless:apply -q 2>/dev/null || true
|
|
81
|
+
;;
|
|
82
|
+
esac
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
adapter_run() {
|
|
86
|
+
case $(_detect_tool) in
|
|
87
|
+
gradle) _gradle bootRun --no-daemon 2>/dev/null || _gradle run --no-daemon ;;
|
|
88
|
+
maven) _maven spring-boot:run -q 2>/dev/null || _maven exec:java -q ;;
|
|
89
|
+
esac
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
adapter_clean() {
|
|
93
|
+
case $(_detect_tool) in
|
|
94
|
+
gradle) _gradle clean --no-daemon ;;
|
|
95
|
+
maven) _maven clean -q ;;
|
|
96
|
+
esac
|
|
97
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# node.sh - Node Adapter (npm/pnpm/yarn/bun)
|
|
3
|
+
# Supports TypeScript, JavaScript, React, Next.js, Vite
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
|
|
8
|
+
_detect_pm() {
|
|
9
|
+
[[ -f "$PROJECT_DIR/pnpm-lock.yaml" ]] && echo "pnpm" && return
|
|
10
|
+
[[ -f "$PROJECT_DIR/yarn.lock" ]] && echo "yarn" && return
|
|
11
|
+
[[ -f "$PROJECT_DIR/bun.lockb" ]] && echo "bun" && return
|
|
12
|
+
echo "npm"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
_run() {
|
|
16
|
+
local pm=$(_detect_pm)
|
|
17
|
+
case $pm in
|
|
18
|
+
pnpm) pnpm "$@" ;;
|
|
19
|
+
yarn) yarn "$@" ;;
|
|
20
|
+
bun) bun "$@" ;;
|
|
21
|
+
*) npm "$@" ;;
|
|
22
|
+
esac
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
_has_script() {
|
|
26
|
+
local script="$1"
|
|
27
|
+
[[ -f "$PROJECT_DIR/package.json" ]] && \
|
|
28
|
+
grep -q "\"$script\":" "$PROJECT_DIR/package.json" 2>/dev/null
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
adapter_info() {
|
|
32
|
+
local pm=$(_detect_pm)
|
|
33
|
+
echo "{\"runtime\":\"node\",\"tool\":\"$pm\",\"languages\":[\"typescript\",\"javascript\"]}"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
adapter_verify() {
|
|
37
|
+
# Type check if TypeScript
|
|
38
|
+
if [[ -f "$PROJECT_DIR/tsconfig.json" ]]; then
|
|
39
|
+
npx tsc --noEmit 2>/dev/null || true
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Lint
|
|
43
|
+
if _has_script "lint"; then
|
|
44
|
+
_run run lint 2>/dev/null || true
|
|
45
|
+
elif [[ -f "$PROJECT_DIR/.eslintrc.js" ]] || [[ -f "$PROJECT_DIR/.eslintrc.json" ]] || [[ -f "$PROJECT_DIR/eslint.config.js" ]] || [[ -f "$PROJECT_DIR/eslint.config.mjs" ]]; then
|
|
46
|
+
npx eslint . 2>/dev/null || true
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Test
|
|
50
|
+
if _has_script "test"; then
|
|
51
|
+
_run test 2>/dev/null || true
|
|
52
|
+
fi
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
adapter_build() {
|
|
56
|
+
if _has_script "build"; then
|
|
57
|
+
_run run build
|
|
58
|
+
else
|
|
59
|
+
echo "No build script found in package.json"
|
|
60
|
+
fi
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
adapter_test() {
|
|
64
|
+
if _has_script "test"; then
|
|
65
|
+
_run test
|
|
66
|
+
elif [[ -f "$PROJECT_DIR/vitest.config.ts" ]] || [[ -f "$PROJECT_DIR/vitest.config.js" ]]; then
|
|
67
|
+
npx vitest run
|
|
68
|
+
elif [[ -f "$PROJECT_DIR/jest.config.js" ]] || [[ -f "$PROJECT_DIR/jest.config.ts" ]]; then
|
|
69
|
+
npx jest
|
|
70
|
+
else
|
|
71
|
+
echo "No test runner found"
|
|
72
|
+
fi
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
adapter_lint() {
|
|
76
|
+
if _has_script "lint"; then
|
|
77
|
+
_run run lint
|
|
78
|
+
else
|
|
79
|
+
npx eslint . 2>/dev/null || true
|
|
80
|
+
fi
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
adapter_format() {
|
|
84
|
+
if _has_script "format"; then
|
|
85
|
+
_run run format
|
|
86
|
+
else
|
|
87
|
+
npx prettier --write . 2>/dev/null || true
|
|
88
|
+
fi
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
adapter_run() {
|
|
92
|
+
if _has_script "dev"; then
|
|
93
|
+
_run run dev
|
|
94
|
+
elif _has_script "start"; then
|
|
95
|
+
_run start
|
|
96
|
+
else
|
|
97
|
+
echo "No dev or start script found"
|
|
98
|
+
fi
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
adapter_clean() {
|
|
102
|
+
rm -rf node_modules dist build .next out .nuxt .output .turbo 2>/dev/null || true
|
|
103
|
+
echo "Cleaned node_modules, dist, build, .next, out"
|
|
104
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# python.sh - Python Adapter
|
|
3
|
+
# Supports pip, poetry, uv
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
|
|
8
|
+
_detect_tool() {
|
|
9
|
+
[[ -f "$PROJECT_DIR/poetry.lock" ]] && echo "poetry" && return
|
|
10
|
+
[[ -f "$PROJECT_DIR/uv.lock" ]] && echo "uv" && return
|
|
11
|
+
[[ -f "$PROJECT_DIR/Pipfile.lock" ]] && echo "pipenv" && return
|
|
12
|
+
echo "pip"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
_run() {
|
|
16
|
+
local tool=$(_detect_tool)
|
|
17
|
+
case $tool in
|
|
18
|
+
poetry) poetry run "$@" ;;
|
|
19
|
+
uv) uv run "$@" ;;
|
|
20
|
+
pipenv) pipenv run "$@" ;;
|
|
21
|
+
*) python -m "$@" ;;
|
|
22
|
+
esac
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
adapter_info() {
|
|
26
|
+
local tool=$(_detect_tool)
|
|
27
|
+
echo "{\"runtime\":\"python\",\"tool\":\"$tool\",\"languages\":[\"python\"]}"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
adapter_verify() {
|
|
31
|
+
cd "$PROJECT_DIR"
|
|
32
|
+
local tool=$(_detect_tool)
|
|
33
|
+
|
|
34
|
+
# Type check with mypy
|
|
35
|
+
case $tool in
|
|
36
|
+
poetry) poetry run mypy . 2>/dev/null || true ;;
|
|
37
|
+
uv) uv run mypy . 2>/dev/null || true ;;
|
|
38
|
+
*) python -m mypy . 2>/dev/null || true ;;
|
|
39
|
+
esac
|
|
40
|
+
|
|
41
|
+
# Run tests
|
|
42
|
+
case $tool in
|
|
43
|
+
poetry) poetry run pytest ;;
|
|
44
|
+
uv) uv run pytest ;;
|
|
45
|
+
*) python -m pytest ;;
|
|
46
|
+
esac
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
adapter_build() {
|
|
50
|
+
cd "$PROJECT_DIR"
|
|
51
|
+
local tool=$(_detect_tool)
|
|
52
|
+
|
|
53
|
+
case $tool in
|
|
54
|
+
poetry) poetry build ;;
|
|
55
|
+
uv) uv build 2>/dev/null || python -m build ;;
|
|
56
|
+
*) python -m build ;;
|
|
57
|
+
esac
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
adapter_test() {
|
|
61
|
+
cd "$PROJECT_DIR"
|
|
62
|
+
local tool=$(_detect_tool)
|
|
63
|
+
|
|
64
|
+
case $tool in
|
|
65
|
+
poetry) poetry run pytest ;;
|
|
66
|
+
uv) uv run pytest ;;
|
|
67
|
+
*) python -m pytest ;;
|
|
68
|
+
esac
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
adapter_lint() {
|
|
72
|
+
cd "$PROJECT_DIR"
|
|
73
|
+
# Try ruff first (faster), then flake8
|
|
74
|
+
if command -v ruff &>/dev/null; then
|
|
75
|
+
ruff check .
|
|
76
|
+
elif command -v flake8 &>/dev/null; then
|
|
77
|
+
flake8 .
|
|
78
|
+
else
|
|
79
|
+
_run flake8 . 2>/dev/null || true
|
|
80
|
+
fi
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
adapter_format() {
|
|
84
|
+
cd "$PROJECT_DIR"
|
|
85
|
+
# Try ruff format first, then black
|
|
86
|
+
if command -v ruff &>/dev/null; then
|
|
87
|
+
ruff format .
|
|
88
|
+
elif command -v black &>/dev/null; then
|
|
89
|
+
black .
|
|
90
|
+
else
|
|
91
|
+
_run black . 2>/dev/null || true
|
|
92
|
+
fi
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
adapter_run() {
|
|
96
|
+
cd "$PROJECT_DIR"
|
|
97
|
+
local tool=$(_detect_tool)
|
|
98
|
+
|
|
99
|
+
if [[ -f "$PROJECT_DIR/manage.py" ]]; then
|
|
100
|
+
# Django
|
|
101
|
+
_run python manage.py runserver
|
|
102
|
+
elif [[ -f "$PROJECT_DIR/app.py" ]]; then
|
|
103
|
+
_run python app.py
|
|
104
|
+
elif [[ -f "$PROJECT_DIR/main.py" ]]; then
|
|
105
|
+
_run python main.py
|
|
106
|
+
else
|
|
107
|
+
echo "No entry point found (manage.py, app.py, main.py)"
|
|
108
|
+
fi
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
adapter_clean() {
|
|
112
|
+
cd "$PROJECT_DIR"
|
|
113
|
+
rm -rf __pycache__ .pytest_cache .mypy_cache .ruff_cache dist build *.egg-info .eggs 2>/dev/null || true
|
|
114
|
+
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
|
115
|
+
echo "Cleaned Python cache and build directories"
|
|
116
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# rust.sh - Rust Adapter
|
|
3
|
+
# Supports Cargo
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
|
|
8
|
+
adapter_info() {
|
|
9
|
+
echo '{"runtime":"rust","tool":"cargo","languages":["rust"]}'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
adapter_verify() {
|
|
13
|
+
cd "$PROJECT_DIR"
|
|
14
|
+
cargo check && cargo test && (cargo clippy 2>/dev/null || true)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
adapter_build() {
|
|
18
|
+
cd "$PROJECT_DIR"
|
|
19
|
+
cargo build
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
adapter_test() {
|
|
23
|
+
cd "$PROJECT_DIR"
|
|
24
|
+
cargo test
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
adapter_lint() {
|
|
28
|
+
cd "$PROJECT_DIR"
|
|
29
|
+
if command -v cargo-clippy &>/dev/null || cargo clippy --version &>/dev/null; then
|
|
30
|
+
cargo clippy
|
|
31
|
+
else
|
|
32
|
+
echo "clippy not installed, skipping lint"
|
|
33
|
+
fi
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
adapter_format() {
|
|
37
|
+
cd "$PROJECT_DIR"
|
|
38
|
+
cargo fmt
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
adapter_run() {
|
|
42
|
+
cd "$PROJECT_DIR"
|
|
43
|
+
cargo run
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
adapter_clean() {
|
|
47
|
+
cd "$PROJECT_DIR"
|
|
48
|
+
cargo clean
|
|
49
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# detect.sh - Runtime Detection with Monorepo Support
|
|
3
|
+
# OCP Runtime-Adaptive Architecture
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
TARGET_DIR="$PROJECT_DIR"
|
|
8
|
+
|
|
9
|
+
# Parse --path argument for Monorepo support
|
|
10
|
+
while [[ $# -gt 0 ]]; do
|
|
11
|
+
case $1 in
|
|
12
|
+
--path) TARGET_DIR="$PROJECT_DIR/$2"; shift 2 ;;
|
|
13
|
+
*) shift ;;
|
|
14
|
+
esac
|
|
15
|
+
done
|
|
16
|
+
|
|
17
|
+
# Detection priority order
|
|
18
|
+
detect_runtime() {
|
|
19
|
+
local dir="$1"
|
|
20
|
+
|
|
21
|
+
# JVM (Gradle > Maven)
|
|
22
|
+
[[ -f "$dir/build.gradle.kts" ]] && echo '{"runtime":"jvm","tool":"gradle-kts","adapter":"jvm.sh"}' && return
|
|
23
|
+
[[ -f "$dir/build.gradle" ]] && echo '{"runtime":"jvm","tool":"gradle","adapter":"jvm.sh"}' && return
|
|
24
|
+
[[ -f "$dir/pom.xml" ]] && echo '{"runtime":"jvm","tool":"maven","adapter":"jvm.sh"}' && return
|
|
25
|
+
|
|
26
|
+
# Node (detect package manager)
|
|
27
|
+
if [[ -f "$dir/package.json" ]]; then
|
|
28
|
+
[[ -f "$dir/pnpm-lock.yaml" ]] && echo '{"runtime":"node","tool":"pnpm","adapter":"node.sh"}' && return
|
|
29
|
+
[[ -f "$dir/yarn.lock" ]] && echo '{"runtime":"node","tool":"yarn","adapter":"node.sh"}' && return
|
|
30
|
+
[[ -f "$dir/bun.lockb" ]] && echo '{"runtime":"node","tool":"bun","adapter":"node.sh"}' && return
|
|
31
|
+
echo '{"runtime":"node","tool":"npm","adapter":"node.sh"}' && return
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
# Rust
|
|
35
|
+
[[ -f "$dir/Cargo.toml" ]] && echo '{"runtime":"rust","tool":"cargo","adapter":"rust.sh"}' && return
|
|
36
|
+
|
|
37
|
+
# Go
|
|
38
|
+
[[ -f "$dir/go.mod" ]] && echo '{"runtime":"go","tool":"go","adapter":"go.sh"}' && return
|
|
39
|
+
|
|
40
|
+
# Python (check lock files first for accurate tool detection)
|
|
41
|
+
if [[ -f "$dir/pyproject.toml" ]] || [[ -f "$dir/setup.py" ]] || [[ -f "$dir/requirements.txt" ]]; then
|
|
42
|
+
[[ -f "$dir/poetry.lock" ]] && echo '{"runtime":"python","tool":"poetry","adapter":"python.sh"}' && return
|
|
43
|
+
[[ -f "$dir/uv.lock" ]] && echo '{"runtime":"python","tool":"uv","adapter":"python.sh"}' && return
|
|
44
|
+
[[ -f "$dir/Pipfile.lock" ]] && echo '{"runtime":"python","tool":"pipenv","adapter":"python.sh"}' && return
|
|
45
|
+
echo '{"runtime":"python","tool":"pip","adapter":"python.sh"}' && return
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# Generic fallback
|
|
49
|
+
echo '{"runtime":"generic","tool":"make","adapter":"generic.sh"}'
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
detect_runtime "$TARGET_DIR"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Secret Scrubber
|
|
4
|
+
* Removes 15+ secret patterns from text
|
|
5
|
+
* Usage: cat file | node scrub-secrets.js > clean-file
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const readline = require('readline');
|
|
9
|
+
|
|
10
|
+
const PATTERNS = [
|
|
11
|
+
{ p: /sk-[a-zA-Z0-9\-]{20,}/g, r: '[REDACTED:OPENAI_KEY]' },
|
|
12
|
+
{ p: /sk-ant-[a-zA-Z0-9\-]{20,}/g, r: '[REDACTED:ANTHROPIC_KEY]' },
|
|
13
|
+
{ p: /pplx-[a-zA-Z0-9\-]{20,}/g, r: '[REDACTED:PERPLEXITY_KEY]' },
|
|
14
|
+
{ p: /sk_live_[a-zA-Z0-9]{20,}/g, r: '[REDACTED:STRIPE_LIVE]' },
|
|
15
|
+
{ p: /sk_test_[a-zA-Z0-9]{20,}/g, r: '[REDACTED:STRIPE_TEST]' },
|
|
16
|
+
{ p: /ghp_[a-zA-Z0-9]{36}/g, r: '[REDACTED:GITHUB_PAT]' },
|
|
17
|
+
{ p: /gho_[a-zA-Z0-9]{36}/g, r: '[REDACTED:GITHUB_OAUTH]' },
|
|
18
|
+
{ p: /AKIA[A-Z0-9]{16}/g, r: '[REDACTED:AWS_KEY]' },
|
|
19
|
+
{ p: /postgres(ql)?:\/\/[^:]+:[^@]+@[^\s]+/g, r: '[REDACTED:POSTGRES_URL]' },
|
|
20
|
+
{ p: /mysql:\/\/[^:]+:[^@]+@[^\s]+/g, r: '[REDACTED:MYSQL_URL]' },
|
|
21
|
+
{ p: /mongodb(\+srv)?:\/\/[^:]+:[^@]+@[^\s]+/g, r: '[REDACTED:MONGODB_URL]' },
|
|
22
|
+
{ p: /Bearer\s+[a-zA-Z0-9\-_.]{20,}/g, r: 'Bearer [REDACTED:TOKEN]' },
|
|
23
|
+
{ p: /eyJ[a-zA-Z0-9\-_]+\.eyJ[a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+/g, r: '[REDACTED:JWT]' },
|
|
24
|
+
{ p: /password["'\s:=]+["'][^"']{4,}["']/gi, r: 'password: "[REDACTED]"' },
|
|
25
|
+
{ p: /secret["'\s:=]+["'][^"']{8,}["']/gi, r: 'secret: "[REDACTED]"' },
|
|
26
|
+
{ p: /-----BEGIN[A-Z\s]+PRIVATE KEY-----[\s\S]*?-----END[A-Z\s]+PRIVATE KEY-----/g, r: '[REDACTED:PRIVATE_KEY]' },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
let count = 0;
|
|
30
|
+
|
|
31
|
+
function scrub(line) {
|
|
32
|
+
let result = line;
|
|
33
|
+
for (const { p, r } of PATTERNS) {
|
|
34
|
+
const m = result.match(p);
|
|
35
|
+
if (m) { count += m.length; result = result.replace(p, r); }
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function main() {
|
|
41
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false });
|
|
42
|
+
const lines = [];
|
|
43
|
+
for await (const line of rl) lines.push(scrub(line));
|
|
44
|
+
console.log(lines.join('\n'));
|
|
45
|
+
console.error(`\n--- Scrubbed: ${count} secrets ---`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# snapshot.sh - Atomic rollback helper for /do commands
|
|
3
|
+
# Deterministic git stash with label-based safety guard
|
|
4
|
+
# Usage: scripts/snapshot.sh push|pop|drop [label]
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
ACTION="${1:-}"
|
|
8
|
+
LABEL="${2:-cpmm-do}"
|
|
9
|
+
STASH_ID="${LABEL}-$(date +%s)"
|
|
10
|
+
|
|
11
|
+
case "$ACTION" in
|
|
12
|
+
push)
|
|
13
|
+
BEFORE=$(git stash list 2>/dev/null | wc -l | tr -d ' ')
|
|
14
|
+
git stash push -m "$STASH_ID" 2>/dev/null || true
|
|
15
|
+
AFTER=$(git stash list 2>/dev/null | wc -l | tr -d ' ')
|
|
16
|
+
if [ "$AFTER" -gt "$BEFORE" ]; then
|
|
17
|
+
echo "SNAPSHOT=true"
|
|
18
|
+
else
|
|
19
|
+
echo "SNAPSHOT=false"
|
|
20
|
+
fi
|
|
21
|
+
;;
|
|
22
|
+
pop)
|
|
23
|
+
# Check if top stash is ours (cpmm-labeled) before popping
|
|
24
|
+
TOP=$(git stash list -1 2>/dev/null || echo "")
|
|
25
|
+
if echo "$TOP" | grep -q "cpmm-"; then
|
|
26
|
+
git stash pop 2>/dev/null && echo "RESTORED" || echo "RESTORE_FAILED"
|
|
27
|
+
else
|
|
28
|
+
# No cpmm snapshot โ discard tracked changes only
|
|
29
|
+
git checkout . 2>/dev/null && echo "CHECKOUT_CLEAN" || echo "CLEAN_FAILED"
|
|
30
|
+
fi
|
|
31
|
+
;;
|
|
32
|
+
drop)
|
|
33
|
+
# Check if top stash is ours (cpmm-labeled) before dropping
|
|
34
|
+
TOP=$(git stash list -1 2>/dev/null || echo "")
|
|
35
|
+
if echo "$TOP" | grep -q "cpmm-"; then
|
|
36
|
+
git stash drop 2>/dev/null && echo "DROPPED" || echo "DROP_FAILED"
|
|
37
|
+
else
|
|
38
|
+
echo "NO_SNAPSHOT"
|
|
39
|
+
fi
|
|
40
|
+
;;
|
|
41
|
+
*)
|
|
42
|
+
echo "Usage: scripts/snapshot.sh push|pop|drop [label]" >&2
|
|
43
|
+
exit 1
|
|
44
|
+
;;
|
|
45
|
+
esac
|
package/scripts/test.sh
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# test.sh - Universal Test
|
|
3
|
+
# Delegates to runtime-specific adapter
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
RUNTIME_DIR="$SCRIPT_DIR/runtime"
|
|
9
|
+
|
|
10
|
+
# Detect runtime
|
|
11
|
+
RUNTIME=$("$RUNTIME_DIR/detect.sh" "$@")
|
|
12
|
+
|
|
13
|
+
# Parse JSON - prefer jq, fallback to bash
|
|
14
|
+
parse_json() {
|
|
15
|
+
local key="$1"
|
|
16
|
+
if command -v jq &>/dev/null; then
|
|
17
|
+
echo "$RUNTIME" | jq -r ".$key"
|
|
18
|
+
else
|
|
19
|
+
echo "$RUNTIME" | sed 's/.*"'"$key"'":"\([^"]*\)".*/\1/'
|
|
20
|
+
fi
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
ADAPTER=$(parse_json adapter)
|
|
24
|
+
RUNTIME_NAME=$(parse_json runtime)
|
|
25
|
+
TOOL_NAME=$(parse_json tool)
|
|
26
|
+
|
|
27
|
+
echo "๐ Detected: $RUNTIME_NAME ($TOOL_NAME)"
|
|
28
|
+
|
|
29
|
+
# Source adapter
|
|
30
|
+
source "$RUNTIME_DIR/adapters/$ADAPTER"
|
|
31
|
+
|
|
32
|
+
# Execute
|
|
33
|
+
echo "๐งช Running tests..."
|
|
34
|
+
adapter_test
|