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.
Files changed (90) hide show
  1. package/.claude/CLAUDE.md +60 -0
  2. package/.claude/agents/README.ko.md +210 -0
  3. package/.claude/agents/README.md +210 -0
  4. package/.claude/agents/builder.md +96 -0
  5. package/.claude/agents/dplanner.md +58 -0
  6. package/.claude/agents/planner.md +52 -0
  7. package/.claude/agents/reviewer.md +69 -0
  8. package/.claude/commands/README.ko.md +381 -0
  9. package/.claude/commands/README.md +381 -0
  10. package/.claude/commands/analyze-failures.md +49 -0
  11. package/.claude/commands/compact-phase.md +75 -0
  12. package/.claude/commands/do-opus.md +43 -0
  13. package/.claude/commands/do-sonnet.md +43 -0
  14. package/.claude/commands/do.md +56 -0
  15. package/.claude/commands/dplan.md +36 -0
  16. package/.claude/commands/learn.md +64 -0
  17. package/.claude/commands/llms-txt.md +50 -0
  18. package/.claude/commands/load-context.md +46 -0
  19. package/.claude/commands/plan.md +62 -0
  20. package/.claude/commands/review.md +55 -0
  21. package/.claude/commands/session-load.md +61 -0
  22. package/.claude/commands/session-save.md +79 -0
  23. package/.claude/commands/watch.md +58 -0
  24. package/.claude/contexts/README.ko.md +94 -0
  25. package/.claude/contexts/README.md +94 -0
  26. package/.claude/contexts/backend-context.md +23 -0
  27. package/.claude/contexts/frontend-context.md +24 -0
  28. package/.claude/rules/README.ko.md +98 -0
  29. package/.claude/rules/README.md +98 -0
  30. package/.claude/rules/code-style.md +21 -0
  31. package/.claude/rules/critical-actions.md +34 -0
  32. package/.claude/rules/security.md +13 -0
  33. package/.claude/sessions/2025-01-27-auth-jwt-refresh.md +32 -0
  34. package/.claude/sessions/README.ko.md +195 -0
  35. package/.claude/sessions/README.md +195 -0
  36. package/.claude/settings.json +167 -0
  37. package/.claude/settings.local.example.json +3 -0
  38. package/.claude/skills/README.ko.md +60 -0
  39. package/.claude/skills/README.md +60 -0
  40. package/.claude/skills/cli-wrappers/SKILL.md +38 -0
  41. package/.claude/skills/cli-wrappers/references/github-cli.md +18 -0
  42. package/.claude/skills/cli-wrappers/references/mgrep.md +18 -0
  43. package/.claude/skills/learned/README.ko.md +64 -0
  44. package/.claude/skills/learned/README.md +64 -0
  45. package/.claude.json +28 -0
  46. package/.claudeignore +17 -0
  47. package/LICENSE +21 -0
  48. package/README.ko.md +441 -0
  49. package/README.md +441 -0
  50. package/bin/cpmm.js +171 -0
  51. package/install.sh +154 -0
  52. package/package.json +59 -0
  53. package/scripts/README.ko.md +150 -0
  54. package/scripts/README.md +150 -0
  55. package/scripts/analyze-failures.sh +145 -0
  56. package/scripts/build.sh +34 -0
  57. package/scripts/claude_command_smoke.sh +116 -0
  58. package/scripts/commit.sh +7 -0
  59. package/scripts/create-branch.sh +14 -0
  60. package/scripts/hooks/README.ko.md +117 -0
  61. package/scripts/hooks/README.md +118 -0
  62. package/scripts/hooks/compact-suggest.sh +52 -0
  63. package/scripts/hooks/critical-action-check.sh +68 -0
  64. package/scripts/hooks/notification.sh +47 -0
  65. package/scripts/hooks/post-edit-format.sh +39 -0
  66. package/scripts/hooks/pre-compact.sh +55 -0
  67. package/scripts/hooks/readonly-check.sh +19 -0
  68. package/scripts/hooks/retry-check.sh +32 -0
  69. package/scripts/hooks/session-cleanup.sh +83 -0
  70. package/scripts/hooks/session-start.sh +70 -0
  71. package/scripts/hooks/stop-collect-context.sh +39 -0
  72. package/scripts/hooks/tool-failure-log.sh +46 -0
  73. package/scripts/lint.sh +34 -0
  74. package/scripts/runtime/README.ko.md +60 -0
  75. package/scripts/runtime/README.md +60 -0
  76. package/scripts/runtime/adapters/README.ko.md +68 -0
  77. package/scripts/runtime/adapters/README.md +68 -0
  78. package/scripts/runtime/adapters/_interface.sh +53 -0
  79. package/scripts/runtime/adapters/_template.sh +67 -0
  80. package/scripts/runtime/adapters/generic.sh +78 -0
  81. package/scripts/runtime/adapters/go.sh +51 -0
  82. package/scripts/runtime/adapters/jvm.sh +97 -0
  83. package/scripts/runtime/adapters/node.sh +104 -0
  84. package/scripts/runtime/adapters/python.sh +116 -0
  85. package/scripts/runtime/adapters/rust.sh +49 -0
  86. package/scripts/runtime/detect.sh +52 -0
  87. package/scripts/scrub-secrets.js +48 -0
  88. package/scripts/snapshot.sh +45 -0
  89. package/scripts/test.sh +34 -0
  90. 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
@@ -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