claude-code-starter 0.0.1
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/commands/analyze.md +49 -0
- package/.claude/commands/done.md +44 -0
- package/.claude/commands/status.md +36 -0
- package/.claude/commands/task.md +53 -0
- package/.claude/settings.json +33 -0
- package/.claude/skills/pattern-discovery.md +67 -0
- package/.claude/skills/systematic-debugging.md +119 -0
- package/.claude/skills/testing-methodology.md +112 -0
- package/.claude/state/task.md +13 -0
- package/CLAUDE.md +32 -0
- package/LICENSE +21 -0
- package/README.md +509 -0
- package/init +341 -0
- package/package.json +34 -0
package/init
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Claude Code Framework - Init Script
|
|
4
|
+
# Version: 1.0.0
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
set -e
|
|
8
|
+
|
|
9
|
+
VERSION="0.0.1"
|
|
10
|
+
|
|
11
|
+
# Colors
|
|
12
|
+
GREEN='\033[0;32m'
|
|
13
|
+
BLUE='\033[0;34m'
|
|
14
|
+
YELLOW='\033[1;33m'
|
|
15
|
+
CYAN='\033[0;36m'
|
|
16
|
+
RED='\033[0;31m'
|
|
17
|
+
NC='\033[0m'
|
|
18
|
+
|
|
19
|
+
# Default options
|
|
20
|
+
FORCE=false
|
|
21
|
+
|
|
22
|
+
# Get framework directory
|
|
23
|
+
FRAMEWORK_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
24
|
+
|
|
25
|
+
# Help message
|
|
26
|
+
show_help() {
|
|
27
|
+
cat << EOF
|
|
28
|
+
Claude Code Framework v${VERSION}
|
|
29
|
+
|
|
30
|
+
A lightweight framework for AI-assisted development with Claude Code.
|
|
31
|
+
|
|
32
|
+
USAGE:
|
|
33
|
+
npx claude-code-starter [OPTIONS]
|
|
34
|
+
claude-code-starter [OPTIONS]
|
|
35
|
+
|
|
36
|
+
OPTIONS:
|
|
37
|
+
-h, --help Show this help message
|
|
38
|
+
-v, --version Show version number
|
|
39
|
+
-f, --force Force overwrite of CLAUDE.md and settings.json
|
|
40
|
+
|
|
41
|
+
EXAMPLES:
|
|
42
|
+
# Initialize in current directory (no install required)
|
|
43
|
+
cd /path/to/your-project
|
|
44
|
+
npx claude-code-starter
|
|
45
|
+
|
|
46
|
+
# Force overwrite existing files
|
|
47
|
+
npx claude-code-starter --force
|
|
48
|
+
|
|
49
|
+
# If installed globally
|
|
50
|
+
claude-code-starter
|
|
51
|
+
|
|
52
|
+
WHAT IT DOES:
|
|
53
|
+
1. Creates .claude/ directory structure
|
|
54
|
+
2. Copies CLAUDE.md (instructions for Claude)
|
|
55
|
+
3. Sets up slash commands (/task, /status, /done, /analyze)
|
|
56
|
+
4. Installs skill files for patterns, debugging, testing
|
|
57
|
+
5. Creates initial task state
|
|
58
|
+
|
|
59
|
+
MORE INFO:
|
|
60
|
+
https://github.com/cassianomon/claude-code-starter
|
|
61
|
+
EOF
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Parse arguments
|
|
65
|
+
while [[ $# -gt 0 ]]; do
|
|
66
|
+
case $1 in
|
|
67
|
+
-h|--help)
|
|
68
|
+
show_help
|
|
69
|
+
exit 0
|
|
70
|
+
;;
|
|
71
|
+
-v|--version)
|
|
72
|
+
echo "claude-code-starter v${VERSION}"
|
|
73
|
+
exit 0
|
|
74
|
+
;;
|
|
75
|
+
-f|--force)
|
|
76
|
+
FORCE=true
|
|
77
|
+
shift
|
|
78
|
+
;;
|
|
79
|
+
*)
|
|
80
|
+
echo -e "${RED}Unknown option: $1${NC}"
|
|
81
|
+
echo "Use --help for usage information"
|
|
82
|
+
exit 1
|
|
83
|
+
;;
|
|
84
|
+
esac
|
|
85
|
+
done
|
|
86
|
+
|
|
87
|
+
# Get project directory (current working directory)
|
|
88
|
+
PROJECT_DIR="$(pwd)"
|
|
89
|
+
|
|
90
|
+
# Prevent running init inside the framework folder itself
|
|
91
|
+
if [ "$PROJECT_DIR" = "$FRAMEWORK_DIR" ]; then
|
|
92
|
+
echo -e "${YELLOW}Run this from your project directory, not the framework folder.${NC}"
|
|
93
|
+
echo ""
|
|
94
|
+
echo "Usage:"
|
|
95
|
+
echo " cd /path/to/your-project"
|
|
96
|
+
echo " npx claude-code-starter"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
# Validate framework files exist
|
|
101
|
+
validate_framework() {
|
|
102
|
+
local missing=()
|
|
103
|
+
|
|
104
|
+
[ ! -f "$FRAMEWORK_DIR/CLAUDE.md" ] && missing+=("CLAUDE.md")
|
|
105
|
+
[ ! -f "$FRAMEWORK_DIR/.claude/settings.json" ] && missing+=(".claude/settings.json")
|
|
106
|
+
[ ! -d "$FRAMEWORK_DIR/.claude/commands" ] && missing+=(".claude/commands/")
|
|
107
|
+
[ ! -d "$FRAMEWORK_DIR/.claude/skills" ] && missing+=(".claude/skills/")
|
|
108
|
+
|
|
109
|
+
if [ ${#missing[@]} -gt 0 ]; then
|
|
110
|
+
echo -e "${RED}Error: Framework files missing:${NC}"
|
|
111
|
+
for file in "${missing[@]}"; do
|
|
112
|
+
echo " - $file"
|
|
113
|
+
done
|
|
114
|
+
echo ""
|
|
115
|
+
echo "The framework installation appears to be incomplete."
|
|
116
|
+
echo "Try reinstalling: npm install -g claude-code-starter"
|
|
117
|
+
exit 1
|
|
118
|
+
fi
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
validate_framework
|
|
122
|
+
|
|
123
|
+
# Show banner
|
|
124
|
+
echo -e "${CYAN}╔═══════════════════════════════════════╗${NC}"
|
|
125
|
+
echo -e "${CYAN}║ Claude Code Framework v${VERSION} ║${NC}"
|
|
126
|
+
echo -e "${CYAN}╚═══════════════════════════════════════╝${NC}"
|
|
127
|
+
echo ""
|
|
128
|
+
|
|
129
|
+
# Create .claude directory structure
|
|
130
|
+
mkdir -p "$PROJECT_DIR/.claude/state"
|
|
131
|
+
mkdir -p "$PROJECT_DIR/.claude/commands"
|
|
132
|
+
mkdir -p "$PROJECT_DIR/.claude/skills"
|
|
133
|
+
|
|
134
|
+
# Copy framework files to project
|
|
135
|
+
echo -e "${BLUE}Setting up framework files...${NC}"
|
|
136
|
+
|
|
137
|
+
# Copy CLAUDE.md
|
|
138
|
+
if [ ! -f "$PROJECT_DIR/CLAUDE.md" ] || [ "$FORCE" = true ]; then
|
|
139
|
+
cp -- "$FRAMEWORK_DIR/CLAUDE.md" "$PROJECT_DIR/CLAUDE.md"
|
|
140
|
+
if [ "$FORCE" = true ] && [ -f "$PROJECT_DIR/CLAUDE.md" ]; then
|
|
141
|
+
echo " Updated CLAUDE.md (forced)"
|
|
142
|
+
else
|
|
143
|
+
echo " Created CLAUDE.md"
|
|
144
|
+
fi
|
|
145
|
+
else
|
|
146
|
+
echo " CLAUDE.md exists (use --force to overwrite)"
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
# Copy settings.json
|
|
150
|
+
if [ ! -f "$PROJECT_DIR/.claude/settings.json" ] || [ "$FORCE" = true ]; then
|
|
151
|
+
cp -- "$FRAMEWORK_DIR/.claude/settings.json" "$PROJECT_DIR/.claude/settings.json"
|
|
152
|
+
if [ "$FORCE" = true ] && [ -f "$PROJECT_DIR/.claude/settings.json" ]; then
|
|
153
|
+
echo " Updated .claude/settings.json (forced)"
|
|
154
|
+
else
|
|
155
|
+
echo " Created .claude/settings.json"
|
|
156
|
+
fi
|
|
157
|
+
else
|
|
158
|
+
echo " settings.json exists (use --force to overwrite)"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# Copy commands (always update - these are framework-managed)
|
|
162
|
+
cp -r -- "$FRAMEWORK_DIR/.claude/commands/"* "$PROJECT_DIR/.claude/commands/"
|
|
163
|
+
echo " Updated .claude/commands/"
|
|
164
|
+
|
|
165
|
+
# Copy skills (always update - these are framework-managed)
|
|
166
|
+
cp -r -- "$FRAMEWORK_DIR/.claude/skills/"* "$PROJECT_DIR/.claude/skills/"
|
|
167
|
+
echo " Updated .claude/skills/"
|
|
168
|
+
|
|
169
|
+
# Write version file
|
|
170
|
+
echo "$VERSION" > "$PROJECT_DIR/.claude/.version"
|
|
171
|
+
|
|
172
|
+
echo ""
|
|
173
|
+
|
|
174
|
+
# Detect project type (bash 3.x compatible - no mapfile)
|
|
175
|
+
detect_project() {
|
|
176
|
+
local has_code=false
|
|
177
|
+
local tech_stack=""
|
|
178
|
+
|
|
179
|
+
# Check for various project indicators
|
|
180
|
+
[ -f "$PROJECT_DIR/package.json" ] && tech_stack+="Node.js " && has_code=true
|
|
181
|
+
[ -f "$PROJECT_DIR/tsconfig.json" ] && tech_stack+="TypeScript " && has_code=true
|
|
182
|
+
[ -f "$PROJECT_DIR/requirements.txt" ] && tech_stack+="Python " && has_code=true
|
|
183
|
+
[ -f "$PROJECT_DIR/pyproject.toml" ] && tech_stack+="Python " && has_code=true
|
|
184
|
+
[ -f "$PROJECT_DIR/Cargo.toml" ] && tech_stack+="Rust " && has_code=true
|
|
185
|
+
[ -f "$PROJECT_DIR/go.mod" ] && tech_stack+="Go " && has_code=true
|
|
186
|
+
[ -f "$PROJECT_DIR/pom.xml" ] && tech_stack+="Java " && has_code=true
|
|
187
|
+
[ -f "$PROJECT_DIR/build.gradle" ] && tech_stack+="Java/Kotlin " && has_code=true
|
|
188
|
+
[ -f "$PROJECT_DIR/Gemfile" ] && tech_stack+="Ruby " && has_code=true
|
|
189
|
+
[ -d "$PROJECT_DIR/src" ] && has_code=true
|
|
190
|
+
[ -d "$PROJECT_DIR/lib" ] && has_code=true
|
|
191
|
+
[ -d "$PROJECT_DIR/app" ] && has_code=true
|
|
192
|
+
|
|
193
|
+
# Check for source files (optimized with -prune)
|
|
194
|
+
if [ "$has_code" = false ]; then
|
|
195
|
+
local file_count
|
|
196
|
+
file_count=$(find "$PROJECT_DIR" -maxdepth 3 \
|
|
197
|
+
\( -name "node_modules" -o -name ".git" -o -name "dist" -o -name "build" \) -prune -o \
|
|
198
|
+
\( -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.go" -o -name "*.rs" -o -name "*.java" -o -name "*.rb" \) -print 2>/dev/null | head -20 | wc -l | tr -d ' ')
|
|
199
|
+
[ "$file_count" -gt 0 ] && has_code=true
|
|
200
|
+
fi
|
|
201
|
+
|
|
202
|
+
# Return values via global variables (bash 3.x compatible)
|
|
203
|
+
PROJECT_TYPE="new"
|
|
204
|
+
TECH_STACK=""
|
|
205
|
+
if [ "$has_code" = true ]; then
|
|
206
|
+
PROJECT_TYPE="existing"
|
|
207
|
+
TECH_STACK="$tech_stack"
|
|
208
|
+
fi
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
# Run detection
|
|
212
|
+
detect_project
|
|
213
|
+
|
|
214
|
+
if [ "$PROJECT_TYPE" = "existing" ]; then
|
|
215
|
+
echo -e "${GREEN}Detected existing project${NC}"
|
|
216
|
+
[ -n "$TECH_STACK" ] && echo -e "Tech stack: ${CYAN}$TECH_STACK${NC}"
|
|
217
|
+
echo ""
|
|
218
|
+
|
|
219
|
+
# Run analysis
|
|
220
|
+
echo -e "${BLUE}Analyzing codebase...${NC}"
|
|
221
|
+
|
|
222
|
+
# Count files (optimized with -prune)
|
|
223
|
+
total_files=$(find "$PROJECT_DIR" \
|
|
224
|
+
\( -name "node_modules" -o -name ".git" -o -name "dist" -o -name "build" -o -name ".claude" \) -prune -o \
|
|
225
|
+
-type f \( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" -o -name "*.java" -o -name "*.rb" -o -name "*.php" \) -print 2>/dev/null | wc -l | tr -d ' ')
|
|
226
|
+
|
|
227
|
+
# Detect key directories
|
|
228
|
+
key_dirs=""
|
|
229
|
+
[ -d "$PROJECT_DIR/src" ] && key_dirs+="src/ "
|
|
230
|
+
[ -d "$PROJECT_DIR/lib" ] && key_dirs+="lib/ "
|
|
231
|
+
[ -d "$PROJECT_DIR/app" ] && key_dirs+="app/ "
|
|
232
|
+
[ -d "$PROJECT_DIR/api" ] && key_dirs+="api/ "
|
|
233
|
+
[ -d "$PROJECT_DIR/components" ] && key_dirs+="components/ "
|
|
234
|
+
[ -d "$PROJECT_DIR/pages" ] && key_dirs+="pages/ "
|
|
235
|
+
[ -d "$PROJECT_DIR/tests" ] && key_dirs+="tests/ "
|
|
236
|
+
[ -d "$PROJECT_DIR/test" ] && key_dirs+="test/ "
|
|
237
|
+
[ -d "$PROJECT_DIR/__tests__" ] && key_dirs+="__tests__/ "
|
|
238
|
+
|
|
239
|
+
# Detect frameworks
|
|
240
|
+
frameworks=""
|
|
241
|
+
if [ -f "$PROJECT_DIR/package.json" ]; then
|
|
242
|
+
grep -q '"react"' "$PROJECT_DIR/package.json" 2>/dev/null && frameworks+="React "
|
|
243
|
+
grep -q '"next"' "$PROJECT_DIR/package.json" 2>/dev/null && frameworks+="Next.js "
|
|
244
|
+
grep -q '"vue"' "$PROJECT_DIR/package.json" 2>/dev/null && frameworks+="Vue "
|
|
245
|
+
grep -q '"express"' "$PROJECT_DIR/package.json" 2>/dev/null && frameworks+="Express "
|
|
246
|
+
grep -q '"fastify"' "$PROJECT_DIR/package.json" 2>/dev/null && frameworks+="Fastify "
|
|
247
|
+
grep -q '"@nestjs"' "$PROJECT_DIR/package.json" 2>/dev/null && frameworks+="NestJS "
|
|
248
|
+
fi
|
|
249
|
+
if [ -f "$PROJECT_DIR/requirements.txt" ]; then
|
|
250
|
+
grep -qi 'django' "$PROJECT_DIR/requirements.txt" 2>/dev/null && frameworks+="Django "
|
|
251
|
+
grep -qi 'flask' "$PROJECT_DIR/requirements.txt" 2>/dev/null && frameworks+="Flask "
|
|
252
|
+
grep -qi 'fastapi' "$PROJECT_DIR/requirements.txt" 2>/dev/null && frameworks+="FastAPI "
|
|
253
|
+
fi
|
|
254
|
+
|
|
255
|
+
echo ""
|
|
256
|
+
echo " Files: $total_files source files"
|
|
257
|
+
[ -n "$key_dirs" ] && echo " Directories: $key_dirs"
|
|
258
|
+
[ -n "$frameworks" ] && echo " Frameworks: $frameworks"
|
|
259
|
+
echo ""
|
|
260
|
+
|
|
261
|
+
# Only create task file if it doesn't exist (preserve existing state)
|
|
262
|
+
if [ ! -f "$PROJECT_DIR/.claude/state/task.md" ]; then
|
|
263
|
+
cat > "$PROJECT_DIR/.claude/state/task.md" << 'EOF'
|
|
264
|
+
# Current Task
|
|
265
|
+
|
|
266
|
+
## Status: Ready
|
|
267
|
+
|
|
268
|
+
No active task. Start one with `/task <description>`.
|
|
269
|
+
|
|
270
|
+
## Project Summary
|
|
271
|
+
|
|
272
|
+
This is an existing codebase. Use `/analyze` to explore specific areas.
|
|
273
|
+
|
|
274
|
+
## Quick Commands
|
|
275
|
+
|
|
276
|
+
- `/task` - Start working on something
|
|
277
|
+
- `/status` - See current state
|
|
278
|
+
- `/analyze` - Deep dive into code
|
|
279
|
+
- `/done` - Mark task complete
|
|
280
|
+
EOF
|
|
281
|
+
echo " Created .claude/state/task.md"
|
|
282
|
+
else
|
|
283
|
+
echo " Task state preserved (.claude/state/task.md)"
|
|
284
|
+
fi
|
|
285
|
+
|
|
286
|
+
echo ""
|
|
287
|
+
echo -e "${GREEN}Ready!${NC} Run ${CYAN}claude${NC} to start."
|
|
288
|
+
|
|
289
|
+
else
|
|
290
|
+
echo -e "${YELLOW}New project detected${NC}"
|
|
291
|
+
echo ""
|
|
292
|
+
|
|
293
|
+
# Only ask for task if state doesn't exist
|
|
294
|
+
if [ ! -f "$PROJECT_DIR/.claude/state/task.md" ]; then
|
|
295
|
+
echo "What are you building?"
|
|
296
|
+
echo -n "> "
|
|
297
|
+
read -r initial_task
|
|
298
|
+
|
|
299
|
+
# Sanitize input - remove characters that could break heredoc
|
|
300
|
+
initial_task="${initial_task//\$/}"
|
|
301
|
+
initial_task="${initial_task//\`/}"
|
|
302
|
+
initial_task="${initial_task//\\/}"
|
|
303
|
+
|
|
304
|
+
if [ -z "$initial_task" ]; then
|
|
305
|
+
initial_task="Explore and set up project"
|
|
306
|
+
fi
|
|
307
|
+
|
|
308
|
+
# Create initial task file for new project
|
|
309
|
+
cat > "$PROJECT_DIR/.claude/state/task.md" << TASKEOF
|
|
310
|
+
# Current Task
|
|
311
|
+
|
|
312
|
+
## Status: In Progress
|
|
313
|
+
|
|
314
|
+
**Task:** $initial_task
|
|
315
|
+
|
|
316
|
+
## Context
|
|
317
|
+
|
|
318
|
+
New project - no existing code yet.
|
|
319
|
+
|
|
320
|
+
## Next Steps
|
|
321
|
+
|
|
322
|
+
1. Define project structure
|
|
323
|
+
2. Set up development environment
|
|
324
|
+
3. Start implementation
|
|
325
|
+
|
|
326
|
+
## Decisions
|
|
327
|
+
|
|
328
|
+
(None yet - starting fresh)
|
|
329
|
+
TASKEOF
|
|
330
|
+
|
|
331
|
+
echo ""
|
|
332
|
+
echo -e "${GREEN}Ready!${NC} Run ${CYAN}claude${NC} to start working on: $initial_task"
|
|
333
|
+
else
|
|
334
|
+
echo " Task state preserved (.claude/state/task.md)"
|
|
335
|
+
echo ""
|
|
336
|
+
echo -e "${GREEN}Ready!${NC} Run ${CYAN}claude${NC} to continue."
|
|
337
|
+
fi
|
|
338
|
+
fi
|
|
339
|
+
|
|
340
|
+
echo ""
|
|
341
|
+
echo -e "${BLUE}Tip:${NC} Add ${CYAN}.claude/${NC} to your global .gitignore"
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-code-starter",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A lightweight framework for AI-assisted development with Claude Code",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"claude",
|
|
7
|
+
"ai",
|
|
8
|
+
"development",
|
|
9
|
+
"framework",
|
|
10
|
+
"cli",
|
|
11
|
+
"anthropic",
|
|
12
|
+
"claude-code"
|
|
13
|
+
],
|
|
14
|
+
"author": "Cassiano Montanari",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/cassianomon/claude-code-starter.git"
|
|
19
|
+
},
|
|
20
|
+
"bin": {
|
|
21
|
+
"claude-code-starter": "./init"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"init",
|
|
25
|
+
"CLAUDE.md",
|
|
26
|
+
".claude/commands/",
|
|
27
|
+
".claude/skills/",
|
|
28
|
+
".claude/settings.json",
|
|
29
|
+
".claude/state/task.md"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=14.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|