@claude-code-mastery/starter-kit 1.0.0 → 1.2.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.
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Example query: Find a user by email
3
+ *
4
+ * Usage: npx tsx scripts/db-query.ts example-find-user <email>
5
+ *
6
+ * This is a TEST query — not production code.
7
+ */
8
+
9
+ import type { StrictDB } from 'strictdb';
10
+
11
+ export default {
12
+ name: 'example-find-user',
13
+ description: 'Look up a user by email address',
14
+
15
+ async run(db: StrictDB, args: string[]): Promise<void> {
16
+ const email = args[0];
17
+ if (!email) {
18
+ console.error(' Usage: example-find-user <email>');
19
+ process.exit(1);
20
+ }
21
+
22
+ const user = await db.queryOne('users', { email });
23
+
24
+ if (!user) {
25
+ console.log(` No user found with email: ${email}`);
26
+ return;
27
+ }
28
+
29
+ console.log(' Found user:');
30
+ console.log(JSON.stringify(user, null, 2));
31
+ },
32
+ };
@@ -0,0 +1,591 @@
1
+ #!/usr/bin/env bash
2
+ # scaffold-clean.sh — Fast batch scaffold for clean mode projects
3
+ # Replaces ~15 individual tool calls with a single script execution
4
+ #
5
+ # Usage: bash scripts/scaffold-clean.sh <project-path> <project-name> <starter-kit-root>
6
+ #
7
+ # Creates a complete clean-mode project with progress indicators.
8
+
9
+ set -euo pipefail
10
+
11
+ # ── Arguments ──────────────────────────────────────────────────────────────────
12
+ PROJECT_PATH="$1"
13
+ PROJECT_NAME="$2"
14
+ STARTER_KIT="$3"
15
+ REGISTRY="${HOME}/.claude/starter-kit-projects.json"
16
+
17
+ # ── Global install detection ───────────────────────────────────────────────────
18
+ # npm users: copyPackageFiles flattens .claude/* into ~/.claude/starter-kit/ directly,
19
+ # so commands are at $STARTER_KIT/commands/ (no extra .claude/ level).
20
+ # Clone users: content lives under $STARTER_KIT/.claude/.
21
+ if [ -f "${HOME}/.claude/starter-kit-source-path" ]; then
22
+ GLOBAL_INSTALLED=true
23
+ CLAUDE_DIR="$STARTER_KIT"
24
+ else
25
+ GLOBAL_INSTALLED=false
26
+ CLAUDE_DIR="$STARTER_KIT/.claude"
27
+ fi
28
+
29
+ # ── Validation ─────────────────────────────────────────────────────────────────
30
+ if [ -d "$PROJECT_PATH" ]; then
31
+ echo "ERROR: Directory already exists: $PROJECT_PATH"
32
+ echo "Remove it first or choose a different name."
33
+ exit 1
34
+ fi
35
+
36
+ if [ ! -d "$CLAUDE_DIR/commands" ]; then
37
+ echo "ERROR: Starter kit not found at: $STARTER_KIT"
38
+ exit 1
39
+ fi
40
+
41
+ # ── Progress Tracking ──────────────────────────────────────────────────────────
42
+ TOTAL_STEPS=8
43
+ CURRENT=0
44
+ START_NS=$(date +%s%N)
45
+
46
+ progress() {
47
+ CURRENT=$((CURRENT + 1))
48
+ local pct=$((CURRENT * 100 / TOTAL_STEPS))
49
+ local now_ns=$(date +%s%N)
50
+ local elapsed_ms=$(( (now_ns - START_NS) / 1000000 ))
51
+
52
+ # Progress bar (20 chars)
53
+ local filled=$((pct / 5))
54
+ local empty=$((20 - filled))
55
+ local bar=""
56
+ for ((i=0; i<filled; i++)); do bar+="\xe2\x96\x88"; done
57
+ for ((i=0; i<empty; i++)); do bar+="\xe2\x96\x91"; done
58
+
59
+ # Estimated time remaining
60
+ local eta=""
61
+ if [ "$CURRENT" -eq "$TOTAL_STEPS" ]; then
62
+ eta="Done!"
63
+ elif [ "$elapsed_ms" -gt 0 ] && [ "$CURRENT" -gt 0 ]; then
64
+ local ms_per_step=$((elapsed_ms / CURRENT))
65
+ local remaining_ms=$(( (TOTAL_STEPS - CURRENT) * ms_per_step ))
66
+ if [ "$remaining_ms" -ge 1000 ]; then
67
+ local remaining_s=$((remaining_ms / 1000))
68
+ local remaining_frac=$(( (remaining_ms % 1000) / 100 ))
69
+ eta="~${remaining_s}.${remaining_frac}s remaining"
70
+ else
71
+ eta="~${remaining_ms}ms remaining"
72
+ fi
73
+ else
74
+ eta="estimating..."
75
+ fi
76
+
77
+ printf "[%d/%d] %3d%% $(echo -e "$bar") %-40s %s\n" \
78
+ "$CURRENT" "$TOTAL_STEPS" "$pct" "$1" "$eta"
79
+ }
80
+
81
+ # ── Header ─────────────────────────────────────────────────────────────────────
82
+ echo ""
83
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
84
+ echo " NEW PROJECT: $PROJECT_NAME (clean mode)"
85
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
86
+ echo ""
87
+
88
+ # ── Step 1: Create directories ─────────────────────────────────────────────────
89
+ progress "Creating directory structure..."
90
+ if [ "$GLOBAL_INSTALLED" = "false" ]; then
91
+ mkdir -p "$PROJECT_PATH"/.claude/{commands,skills,agents,hooks}
92
+ fi
93
+ mkdir -p "$PROJECT_PATH"/project-docs
94
+ mkdir -p "$PROJECT_PATH"/tests
95
+
96
+ # ── Steps 2-4: Copy Claude infrastructure (clone users only) ──────────────────
97
+ # npm users already have commands/skills/hooks installed globally in ~/.claude/
98
+ if [ "$GLOBAL_INSTALLED" = "false" ]; then
99
+ progress "Copying 16 project commands..."
100
+ for cmd in architecture commit create-api create-e2e diagram help \
101
+ optimize-docker progress refactor review security-check \
102
+ setup show-user-guide test-plan what-is-my-ai-doing worktree; do
103
+ cp "$CLAUDE_DIR/commands/${cmd}.md" "$PROJECT_PATH/.claude/commands/"
104
+ done
105
+
106
+ progress "Copying skills, agents, hooks..."
107
+ cp -r "$CLAUDE_DIR/skills/code-review" "$PROJECT_PATH/.claude/skills/"
108
+ cp -r "$CLAUDE_DIR/skills/create-service" "$PROJECT_PATH/.claude/skills/"
109
+ cp "$CLAUDE_DIR/agents/code-reviewer.md" "$PROJECT_PATH/.claude/agents/"
110
+ cp "$CLAUDE_DIR/agents/test-writer.md" "$PROJECT_PATH/.claude/agents/"
111
+ cp "$CLAUDE_DIR/hooks/block-dangerous-bash.py" "$PROJECT_PATH/.claude/hooks/"
112
+ cp "$CLAUDE_DIR/hooks/lint-on-save.sh" "$PROJECT_PATH/.claude/hooks/"
113
+ cp "$CLAUDE_DIR/hooks/verify-no-secrets.sh" "$PROJECT_PATH/.claude/hooks/"
114
+
115
+ progress "Writing settings.json..."
116
+ cat > "$PROJECT_PATH/.claude/settings.json" << 'SETTINGS_EOF'
117
+ {
118
+ "hooks": {
119
+ "PreToolUse": [
120
+ {
121
+ "matcher": "Bash",
122
+ "hooks": [
123
+ {
124
+ "type": "command",
125
+ "command": "python3 .claude/hooks/block-dangerous-bash.py"
126
+ }
127
+ ]
128
+ }
129
+ ],
130
+ "PostToolUse": [
131
+ {
132
+ "matcher": "Write",
133
+ "hooks": [
134
+ {
135
+ "type": "command",
136
+ "command": "bash .claude/hooks/lint-on-save.sh"
137
+ }
138
+ ]
139
+ }
140
+ ],
141
+ "Stop": [
142
+ {
143
+ "hooks": [
144
+ {
145
+ "type": "command",
146
+ "command": "bash .claude/hooks/verify-no-secrets.sh"
147
+ }
148
+ ]
149
+ }
150
+ ]
151
+ }
152
+ }
153
+ SETTINGS_EOF
154
+ else
155
+ # Skip counts for npm users — 3 steps replaced by one message
156
+ progress "Skipping local .claude/ copy (commands/skills/hooks live globally)"
157
+ progress "Skipping local .claude/ copy (commands/skills/hooks live globally)"
158
+ progress "Skipping local .claude/ copy (commands/skills/hooks live globally)"
159
+ fi
160
+
161
+ # ── Step 4b: Create features.json (empty manifest for clean mode) ─────────────
162
+ cat > "$PROJECT_PATH/.claude/features.json" << 'FEATURES_EOF'
163
+ {
164
+ "schemaVersion": 1,
165
+ "installedBy": "claude-code-mastery-starter-kit",
166
+ "language": "none",
167
+ "features": {}
168
+ }
169
+ FEATURES_EOF
170
+
171
+ # ── Step 5: Create CLAUDE.md + CLAUDE.local.md ────────────────────────────────
172
+ progress "Creating CLAUDE.md files..."
173
+
174
+ cat > "$PROJECT_PATH/CLAUDE.md" << 'CLAUDEMD_EOF'
175
+ # CLAUDE.md — Project Instructions
176
+
177
+ ---
178
+
179
+ ## Critical Rules
180
+
181
+ ### 0. NEVER Publish Sensitive Data
182
+
183
+ - NEVER commit passwords, API keys, tokens, or secrets to git/npm/docker
184
+ - NEVER commit `.env` files — ALWAYS verify `.env` is in `.gitignore`
185
+ - Before ANY commit: verify no secrets are included
186
+ - NEVER output secrets in suggestions, logs, or responses
187
+
188
+ ### 1. NEVER Hardcode Credentials
189
+
190
+ - ALWAYS use environment variables for secrets
191
+ - NEVER put API keys, passwords, or tokens directly in code
192
+ - NEVER hardcode connection strings — use environment variables from .env
193
+
194
+ ### 2. ALWAYS Ask Before Deploying
195
+
196
+ - NEVER auto-deploy, even if the fix seems simple
197
+ - NEVER assume approval — wait for explicit "yes, deploy"
198
+ - ALWAYS ask before deploying to production
199
+
200
+ ---
201
+
202
+ ## When Something Seems Wrong
203
+
204
+ Before jumping to conclusions:
205
+
206
+ - Missing UI element? → Check feature gates BEFORE assuming bug
207
+ - Empty data? → Check if services are running BEFORE assuming broken
208
+ - 404 error? → Check service separation BEFORE adding endpoint
209
+ - Auth failing? → Check which auth system BEFORE debugging
210
+ - Test failing? → Read the error message fully BEFORE changing code
211
+
212
+ ---
213
+
214
+ ## Project Documentation
215
+
216
+ | Document | Purpose | When to Read |
217
+ |----------|---------|--------------|
218
+ | `project-docs/ARCHITECTURE.md` | System overview & data flow | Before architectural changes |
219
+ | `project-docs/INFRASTRUCTURE.md` | Deployment details | Before environment changes |
220
+ | `project-docs/DECISIONS.md` | Architectural decisions | Before proposing alternatives |
221
+
222
+ **ALWAYS read relevant docs before making cross-service changes.**
223
+
224
+ ---
225
+
226
+ ## Git Workflow — Branch FIRST, Work Second
227
+
228
+ **Auto-branch hook is ON by default.** A hook blocks commits to `main`. **ALWAYS check and branch BEFORE editing any files:**
229
+
230
+ ```bash
231
+ # MANDATORY first step — do this BEFORE writing or editing anything:
232
+ git branch --show-current
233
+ # If on main → create a feature branch IMMEDIATELY:
234
+ git checkout -b feat/<task-name>
235
+ # NOW start working.
236
+ ```
237
+
238
+ If you edit files on `main` and then try to commit, the hook will block you. Branch first — it takes 1 second and avoids wasted work.
239
+
240
+ ---
241
+
242
+ ## Workflow Preferences
243
+
244
+ - Quality over speed — if unsure, ask before executing
245
+ - One task, one chat — `/clear` between unrelated tasks
246
+ - When testing: queue observations, fix in batch (not one at a time)
247
+
248
+ ---
249
+
250
+ ## Naming — NEVER Rename Mid-Project
251
+
252
+ If you must rename packages, modules, or key variables:
253
+
254
+ 1. Create a checklist of ALL files and references first
255
+ 2. Use IDE semantic rename (not search-and-replace)
256
+ 3. Full project search for old name after renaming
257
+ 4. Check: .md files, .txt files, .env files, comments, strings, paths
258
+ 5. Start a FRESH Claude session after renaming
259
+ CLAUDEMD_EOF
260
+
261
+ cat > "$PROJECT_PATH/CLAUDE.local.md" << 'LOCALMD_EOF'
262
+ # CLAUDE.local.md — Personal Overrides
263
+
264
+ > **This file is gitignored.** It's for YOUR personal preferences — things that shouldn't be shared with the team.
265
+ >
266
+ > **When to use this vs CLAUDE.md:**
267
+ > - `CLAUDE.md` = team rules (checked into git, everyone follows them)
268
+ > - `CLAUDE.local.md` = personal preferences (gitignored, only affects you)
269
+
270
+ ---
271
+
272
+ ## My Identity
273
+
274
+ - GitHub: YourUsername
275
+ - SSH: `git@github.com:YourUsername/<repo>.git`
276
+
277
+ ## Communication Style
278
+
279
+ <!-- Uncomment the style that fits you: -->
280
+ <!-- - Respond concisely — I prefer terse explanations -->
281
+ <!-- - Be thorough — explain your reasoning in detail -->
282
+ <!-- - Show me the code first, explain after -->
283
+ <!-- - Always explain trade-offs before making a choice -->
284
+
285
+ ## Commit Preferences
286
+
287
+ - When creating commits, use conventional commit format (feat:, fix:, docs:, etc.)
288
+
289
+ ## Testing Preferences
290
+
291
+ <!-- Uncomment what matches your workflow: -->
292
+ <!-- - Run tests after every code change automatically -->
293
+ <!-- - Only run tests when I ask -->
294
+ <!-- - Always run E2E tests headed so I can watch -->
295
+ <!-- - Prefer unit tests over E2E for new features -->
296
+
297
+ ## Deployment Preferences
298
+
299
+ <!-- Uncomment what matches your workflow: -->
300
+ <!-- - Always ask before deploying (default CLAUDE.md behavior) -->
301
+ <!-- - Deploy to staging automatically, ask before production -->
302
+ <!-- - I handle deployments myself — just build and test -->
303
+
304
+ ## Code Style
305
+
306
+ <!-- Uncomment what matches your preferences: -->
307
+ <!-- - I prefer named exports over default exports -->
308
+ <!-- - Use arrow functions for React components -->
309
+ <!-- - Prefer early returns over nested if/else -->
310
+ <!-- - Use verbose variable names, never abbreviate -->
311
+
312
+ ## Local Environment
313
+
314
+ - Node version: 20.x
315
+ - Package manager: (your choice)
316
+ - OS: (your OS here)
317
+
318
+ ## Project-Specific Notes
319
+
320
+ <!-- Add anything specific to how YOU work on this project -->
321
+ LOCALMD_EOF
322
+
323
+ # ── Step 6: Create project templates ──────────────────────────────────────────
324
+ progress "Creating project templates..."
325
+
326
+ cat > "$PROJECT_PATH/project-docs/ARCHITECTURE.md" << 'ARCH_EOF'
327
+ # Architecture
328
+
329
+ > System overview and data flow for the project.
330
+
331
+ ## Overview
332
+
333
+ <!-- Describe the high-level architecture here -->
334
+
335
+ ## Components
336
+
337
+ <!-- List major components and their responsibilities -->
338
+
339
+ ## Data Flow
340
+
341
+ <!-- Describe how data moves through the system -->
342
+
343
+ ## Dependencies
344
+
345
+ <!-- List external services and dependencies -->
346
+ ARCH_EOF
347
+
348
+ cat > "$PROJECT_PATH/project-docs/INFRASTRUCTURE.md" << 'INFRA_EOF'
349
+ # Infrastructure
350
+
351
+ > Deployment and environment details.
352
+
353
+ ## Environments
354
+
355
+ <!-- List environments: development, staging, production -->
356
+
357
+ ## Deployment
358
+
359
+ <!-- Describe the deployment process -->
360
+
361
+ ## Environment Variables
362
+
363
+ <!-- List required environment variables and their purpose -->
364
+
365
+ ## Monitoring
366
+
367
+ <!-- Describe monitoring and alerting setup -->
368
+ INFRA_EOF
369
+
370
+ cat > "$PROJECT_PATH/project-docs/DECISIONS.md" << 'DEC_EOF'
371
+ # Architectural Decisions
372
+
373
+ > Record of key technical decisions and their rationale.
374
+
375
+ ## Template
376
+
377
+ ### Decision: [Title]
378
+ - **Date:** YYYY-MM-DD
379
+ - **Status:** Accepted / Superseded / Deprecated
380
+ - **Context:** What prompted the decision
381
+ - **Decision:** What was decided
382
+ - **Consequences:** What are the trade-offs
383
+ - **Alternatives considered:** What else was evaluated
384
+
385
+ ---
386
+
387
+ <!-- Add decisions below -->
388
+ DEC_EOF
389
+
390
+ cat > "$PROJECT_PATH/tests/CHECKLIST.md" << 'CHECK_EOF'
391
+ # Test Checklist
392
+
393
+ > Track what needs testing and what's been verified.
394
+
395
+ ## Test Coverage
396
+
397
+ | Area | Unit Tests | Integration Tests | E2E Tests | Status |
398
+ |------|-----------|-------------------|-----------|--------|
399
+ | <!-- feature --> | <!-- yes/no --> | <!-- yes/no --> | <!-- yes/no --> | <!-- pending/done --> |
400
+
401
+ ## Manual Test Cases
402
+
403
+ - [ ] <!-- Describe manual test case -->
404
+
405
+ ## Regression Tests
406
+
407
+ - [ ] <!-- Describe regression test case -->
408
+ CHECK_EOF
409
+
410
+ cat > "$PROJECT_PATH/tests/ISSUES_FOUND.md" << 'ISSUES_EOF'
411
+ # Issues Found During Testing
412
+
413
+ > Track bugs and issues discovered during testing sessions.
414
+
415
+ ## Template
416
+
417
+ ### Issue: [Title]
418
+ - **Found:** YYYY-MM-DD
419
+ - **Severity:** Critical / High / Medium / Low
420
+ - **Status:** Open / Fixed / Won't Fix
421
+ - **Description:** What happened
422
+ - **Steps to reproduce:** How to trigger the issue
423
+ - **Expected behavior:** What should happen
424
+ - **Actual behavior:** What actually happened
425
+ - **Fix:** How it was resolved (if fixed)
426
+
427
+ ---
428
+
429
+ <!-- Add issues below -->
430
+ ISSUES_EOF
431
+
432
+ # ── Step 7: Create config files ───────────────────────────────────────────────
433
+ progress "Creating config files (.env, .gitignore, README)..."
434
+
435
+ touch "$PROJECT_PATH/.env"
436
+
437
+ cat > "$PROJECT_PATH/.env.example" << 'ENVEX_EOF'
438
+ # Environment Variables
439
+ NODE_ENV=development
440
+ PORT=3000
441
+ ENVEX_EOF
442
+
443
+ cat > "$PROJECT_PATH/.gitignore" << 'GI_EOF'
444
+ # Environment
445
+ .env
446
+ .env.*
447
+ .env.local
448
+
449
+ # Dependencies
450
+ node_modules/
451
+ vendor/
452
+ .venv/
453
+ __pycache__/
454
+
455
+ # Build output
456
+ dist/
457
+ build/
458
+ bin/
459
+ out/
460
+
461
+ # Test artifacts
462
+ coverage/
463
+ test-results/
464
+ playwright-report/
465
+ .pytest_cache/
466
+ htmlcov/
467
+
468
+ # IDE
469
+ .idea/
470
+ .vscode/
471
+ *.swp
472
+ *.swo
473
+
474
+ # OS
475
+ .DS_Store
476
+ Thumbs.db
477
+
478
+ # Claude local overrides
479
+ CLAUDE.local.md
480
+
481
+ # Temporary AI research files
482
+ _ai_temp/
483
+ GI_EOF
484
+
485
+ cat > "$PROJECT_PATH/.dockerignore" << 'DI_EOF'
486
+ .env
487
+ .env.*
488
+ .git/
489
+ node_modules/
490
+ dist/
491
+ coverage/
492
+ test-results/
493
+ playwright-report/
494
+ .venv/
495
+ __pycache__/
496
+ *.md
497
+ !README.md
498
+ _ai_temp/
499
+ DI_EOF
500
+
501
+ cat > "$PROJECT_PATH/README.md" << README_EOF
502
+ # $PROJECT_NAME
503
+
504
+ > Scaffolded with [Claude Code Mastery Starter Kit](https://github.com/TheDecipherist/claude-code-mastery-project-starter-kit) (clean mode)
505
+
506
+ ## Getting Started
507
+
508
+ This project was created with **clean mode** — all Claude Code infrastructure is in place with zero coding opinions. You decide your own language, framework, and structure.
509
+
510
+ ## What's Included
511
+
512
+ - \`.claude/\` — 16 slash commands, 2 skills, 2 agents, 3 hooks
513
+ - \`project-docs/\` — Architecture, Infrastructure, and Decisions templates
514
+ - \`tests/\` — Test checklist and issue tracking templates
515
+ - \`CLAUDE.md\` — Security rules only (no coding opinions)
516
+ - \`.env\` / \`.env.example\` — Environment variable pattern
517
+
518
+ ## Available Commands
519
+
520
+ Run \`/help\` in Claude Code to see all 16 available commands.
521
+
522
+ ## Project Documentation
523
+
524
+ | Document | Purpose |
525
+ |----------|---------|
526
+ | \`project-docs/ARCHITECTURE.md\` | System overview & data flow |
527
+ | \`project-docs/INFRASTRUCTURE.md\` | Deployment details |
528
+ | \`project-docs/DECISIONS.md\` | Architectural decisions |
529
+ README_EOF
530
+
531
+ # ── Step 8: Git init + register project ───────────────────────────────────────
532
+ progress "Initializing git + registering project..."
533
+
534
+ git -C "$PROJECT_PATH" init -q
535
+ git -C "$PROJECT_PATH" add -A
536
+ git -C "$PROJECT_PATH" commit -q -m "Initial clean project scaffold"
537
+
538
+ # Register in project registry
539
+ python3 << PYEOF
540
+ import json, os
541
+ from datetime import datetime, timezone
542
+
543
+ registry = "$REGISTRY"
544
+ if os.path.exists(registry):
545
+ with open(registry) as f:
546
+ data = json.load(f)
547
+ else:
548
+ os.makedirs(os.path.dirname(registry), exist_ok=True)
549
+ data = {"projects": []}
550
+
551
+ data["projects"].append({
552
+ "name": "$PROJECT_NAME",
553
+ "path": os.path.realpath("$PROJECT_PATH"),
554
+ "profile": "clean",
555
+ "language": "none",
556
+ "framework": "none",
557
+ "database": "none",
558
+ "createdAt": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
559
+ })
560
+
561
+ with open(registry, "w") as f:
562
+ json.dump(data, f, indent=2)
563
+ f.write("\n")
564
+ PYEOF
565
+
566
+ # ── Summary ────────────────────────────────────────────────────────────────────
567
+ END_NS=$(date +%s%N)
568
+ TOTAL_MS=$(( (END_NS - START_NS) / 1000000 ))
569
+ FILE_COUNT=$(find "$PROJECT_PATH" -type f -not -path '*/.git/*' | wc -l)
570
+
571
+ # Format elapsed time
572
+ if [ "$TOTAL_MS" -ge 1000 ]; then
573
+ TOTAL_S=$((TOTAL_MS / 1000))
574
+ TOTAL_FRAC=$(( (TOTAL_MS % 1000) / 100 ))
575
+ TIME_STR="${TOTAL_S}.${TOTAL_FRAC}s"
576
+ else
577
+ TIME_STR="${TOTAL_MS}ms"
578
+ fi
579
+
580
+ echo ""
581
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
582
+ echo " Completed in ${TIME_STR}"
583
+ echo " Created at: $PROJECT_PATH"
584
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
585
+ echo ""
586
+ echo " ${FILE_COUNT} files | 16 commands | 2 skills | 2 agents | 3 hooks"
587
+ echo ""
588
+ echo " Next steps:"
589
+ echo " cd $PROJECT_PATH"
590
+ echo " claude # Start Claude Code — run /help to see commands"
591
+ echo ""