@the-bearded-bear/claude-craft 7.0.0 → 7.1.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.
@@ -221,6 +221,42 @@ Iteration 1 of 25 (Profile: medium_feature)
221
221
  Metrics exported: .ralph/sessions/.../metrics-export.json
222
222
  ```
223
223
 
224
+ ## Failure Modes & Recovery
225
+
226
+ ### DoD Validator Failures
227
+
228
+ When DoD validators fail repeatedly, Ralph applies escalating recovery:
229
+
230
+ | Consecutive Failures | Action |
231
+ |---------------------|--------|
232
+ | 1-2 | Retry with context — Ralph includes previous error output |
233
+ | 3 | Trigger circuit breaker check — evaluate if task is stuck |
234
+ | 4+ | Circuit breaker trips — session stops with `exit_reason: circuit_breaker` |
235
+
236
+ ### Timeout Handling
237
+
238
+ | Timeout Type | Default | Configuration |
239
+ |-------------|---------|---------------|
240
+ | Per-iteration | 5 min | `circuit_breaker.iteration_timeout` |
241
+ | Total session | 30 min | `circuit_breaker.session_timeout` |
242
+ | DoD command | 60 sec | `definition_of_done.timeout` |
243
+
244
+ When a timeout fires:
245
+ 1. Current iteration is cancelled
246
+ 2. Partial progress is preserved in session state
247
+ 3. Circuit breaker counter increments
248
+ 4. Resume with `--continue=<session-id>` to retry
249
+
250
+ ### Common Exit Reasons
251
+
252
+ | Exit Reason | Meaning | Recovery |
253
+ |-------------|---------|----------|
254
+ | `dod_complete` | All DoD criteria passed | Success — no action needed |
255
+ | `circuit_breaker` | Too many failures | Review task scope, simplify DoD |
256
+ | `max_iterations` | Iteration limit reached | Increase limit or break into subtasks |
257
+ | `timeout` | Session timeout expired | Resume or increase timeout |
258
+ | `user_abort` | User cancelled (Ctrl+C) | Resume with `--continue` |
259
+
224
260
  ## Best Practices
225
261
 
226
262
  1. **Use auto-detect**: Let Ralph configure DoD for your stack
@@ -228,6 +264,8 @@ Iteration 1 of 25 (Profile: medium_feature)
228
264
  3. **Use TDD**: Write tests first, let Ralph implement
229
265
  4. **Monitor dashboard**: Watch progress in real-time
230
266
  5. **Review metrics**: Analyze session metrics for optimization
267
+ 6. **Set realistic timeouts**: Match timeouts to task complexity
268
+ 7. **Use circuit breaker profiles**: Match profile to task type (quick_fix vs large_feature)
231
269
 
232
270
  ## Related
233
271
 
@@ -13,23 +13,23 @@ This project uses **Claude Craft** rules for AI-assisted development.
13
13
  ```
14
14
  {{PROJECT_ROOT}}/
15
15
  ├── .claude/
16
- │ ├── rules/ # Coding standards (auto-loaded)
17
- │ ├── agents/ # Specialized AI agents
18
- │ ├── commands/ # Slash commands
19
- │ └── skills/ # Extended capabilities
20
- └── src/ # Application source code
16
+ │ ├── references/ # Coding standards & architecture (auto-loaded)
17
+ │ ├── agents/ # Specialized AI agents
18
+ │ ├── commands/ # Slash commands (namespaced)
19
+ │ └── skills/ # Extended capabilities
20
+ └── src/ # Application source code
21
21
  ```
22
22
 
23
23
  ## Why (Purpose & Organization)
24
24
 
25
25
  ### Core Principles
26
- - **Analysis Before Action**: Always understand code before modifying (see `rules/01-workflow-analysis.md`)
27
- - **SOLID + KISS**: Clean, maintainable code (see `rules/04-solid-principles.md`)
28
- - **TDD/BDD**: Test-driven development (see `rules/07-testing.md`)
29
- - **Security First**: OWASP compliance (see `rules/11-security.md`)
26
+ - **Analysis Before Action**: Always understand code before modifying (see `references/01-workflow-analysis.md`)
27
+ - **SOLID + KISS**: Clean, maintainable code (see `references/04-solid-principles.md`)
28
+ - **TDD/BDD**: Test-driven development (see `references/07-testing.md`)
29
+ - **Security First**: OWASP compliance (see `references/11-security.md`)
30
30
 
31
31
  ### Architecture
32
- Refer to `.claude/rules/02-architecture*.md` for detailed patterns.
32
+ Refer to `.claude/references/02-architecture*.md` for detailed patterns.
33
33
 
34
34
  ## How (Commands & Workflows)
35
35
 
@@ -56,15 +56,15 @@ make build # Build project
56
56
 
57
57
  ## References
58
58
 
59
- | Topic | Rule File |
60
- |-------|-----------|
61
- | Workflow | `rules/01-workflow-analysis.md` |
62
- | Architecture | `rules/02-architecture*.md` |
63
- | Coding Standards | `rules/03-coding-standards.md` |
64
- | SOLID Principles | `rules/04-solid-principles.md` |
65
- | KISS/DRY/YAGNI | `rules/05-kiss-dry-yagni.md` |
66
- | Testing | `rules/07-testing.md` |
67
- | Security | `rules/11-security.md` |
59
+ | Topic | Reference File |
60
+ |-------|----------------|
61
+ | Workflow | `references/01-workflow-analysis.md` |
62
+ | Architecture | `references/02-architecture*.md` |
63
+ | Coding Standards | `references/03-coding-standards.md` |
64
+ | SOLID Principles | `references/04-solid-principles.md` |
65
+ | KISS/DRY/YAGNI | `references/05-kiss-dry-yagni.md` |
66
+ | Testing | `references/07-testing.md` |
67
+ | Security | `references/11-security.md` |
68
68
 
69
69
  <!-- PROJECT-SPECIFIC-START -->
70
70
  ## Project Specifics
@@ -244,175 +244,74 @@ check_common_installation() {
244
244
  }
245
245
 
246
246
  # ─────────────────────────────────────────────────────────────────────────────
247
- # Vérification Symfony
248
- # ─────────────────────────────────────────────────────────────────────────────
249
- check_symfony_installation() {
250
- local path="$1"
251
- local issues=0
252
-
253
- if [[ ! -d "$path/.claude" ]]; then
254
- log_error ".claude/: non trouvé"
255
- return 1
256
- fi
257
-
258
- # Rules (obligatoire - generic + Symfony-specific, min 18)
259
- # Generic: 7 files from Common/rules/ + Symfony: ~13 tech-specific
260
- check_dir_count "$path/.claude/rules" "rules" 18 || ((issues++)) || true
261
-
262
- # Commands/symfony (obligatoire, min 5)
263
- check_dir_count "$path/.claude/commands/symfony" "commands/symfony" 5 || ((issues++)) || true
264
-
265
- # Templates (obligatoire, min 5)
266
- check_dir_count "$path/.claude/templates" "templates" 5 || ((issues++)) || true
267
-
268
- # Checklists (obligatoire, min 3)
269
- check_dir_count "$path/.claude/checklists" "checklists" 3 || ((issues++)) || true
270
-
271
- # CLAUDE.md (obligatoire)
272
- check_file_exists "$path/.claude/CLAUDE.md" "CLAUDE.md" || ((issues++)) || true
273
-
274
- # Agents (obligatoire, min 1)
275
- check_dir_count "$path/.claude/agents" "agents" 1 || ((issues++)) || true
276
-
277
- # Optionnels
278
- check_dir_optional "$path/.claude/adr" "adr"
279
- check_dir_optional "$path/.claude/examples" "examples"
280
-
281
- return $issues
282
- }
283
-
284
- # ─────────────────────────────────────────────────────────────────────────────
285
- # Vérification Flutter
286
- # ─────────────────────────────────────────────────────────────────────────────
287
- check_flutter_installation() {
247
+ # Technology Registry (data-driven validation)
248
+ # Format: tech_name:cmd_namespace:min_rules:min_commands:min_templates:min_checklists
249
+ # ─────────────────────────────────────────────────────────────────────────────
250
+ TECH_REGISTRY=(
251
+ "symfony:symfony:18:5:5:3"
252
+ "flutter:flutter:14:5:3:2"
253
+ "react:react:12:5:2:2"
254
+ "reactnative:reactnative:15:5:2:2"
255
+ "python:python:10:5:2:2"
256
+ "angular:angular:10:5:2:2"
257
+ "csharp:csharp:10:5:2:2"
258
+ "laravel:laravel:10:5:2:2"
259
+ "vuejs:vuejs:10:5:2:2"
260
+ "php:php:10:5:2:2"
261
+ )
262
+
263
+ # ─────────────────────────────────────────────────────────────────────────────
264
+ # Generic tech installation checker (data-driven)
265
+ # ─────────────────────────────────────────────────────────────────────────────
266
+ check_tech_installation() {
288
267
  local path="$1"
268
+ local tech="$2"
289
269
  local issues=0
290
270
 
291
- if [[ ! -d "$path/.claude" ]]; then
292
- log_error ".claude/: non trouvé"
293
- return 1
294
- fi
295
-
296
- # Rules (obligatoire - generic + Flutter-specific, min 14)
297
- # Generic: 7 files from Common/rules/ + Flutter: 8 tech-specific
298
- check_dir_count "$path/.claude/rules" "rules" 14 || ((issues++)) || true
299
-
300
- # Commands/flutter (obligatoire, min 5)
301
- check_dir_count "$path/.claude/commands/flutter" "commands/flutter" 5 || ((issues++)) || true
302
-
303
- # Templates (obligatoire, min 3)
304
- check_dir_count "$path/.claude/templates" "templates" 3 || ((issues++)) || true
305
-
306
- # Checklists (obligatoire, min 2)
307
- check_dir_count "$path/.claude/checklists" "checklists" 2 || ((issues++)) || true
308
-
309
- # CLAUDE.md (obligatoire)
310
- check_file_exists "$path/.claude/CLAUDE.md" "CLAUDE.md" || ((issues++)) || true
311
-
312
- # Agents (obligatoire, min 1)
313
- check_dir_count "$path/.claude/agents" "agents" 1 || ((issues++)) || true
314
-
315
- return $issues
316
- }
317
-
318
- # ─────────────────────────────────────────────────────────────────────────────
319
- # Vérification React
320
- # ─────────────────────────────────────────────────────────────────────────────
321
- check_react_installation() {
322
- local path="$1"
323
- local issues=0
271
+ # Look up tech in registry
272
+ local entry=""
273
+ for reg in "${TECH_REGISTRY[@]}"; do
274
+ local reg_tech="${reg%%:*}"
275
+ if [[ "$reg_tech" == "$tech" ]]; then
276
+ entry="$reg"
277
+ break
278
+ fi
279
+ done
324
280
 
325
- if [[ ! -d "$path/.claude" ]]; then
326
- log_error ".claude/: non trouvé"
281
+ if [[ -z "$entry" ]]; then
282
+ log_warn "Technologie inconnue: $tech"
327
283
  return 1
328
284
  fi
329
285
 
330
- # Rules (obligatoire - generic + React-specific, min 12)
331
- # Generic: 7 files from Common/rules/ + React: 6 tech-specific
332
- check_dir_count "$path/.claude/rules" "rules" 12 || ((issues++)) || true
333
-
334
- # Commands/react (obligatoire, min 5)
335
- check_dir_count "$path/.claude/commands/react" "commands/react" 5 || ((issues++)) || true
336
-
337
- # Templates (obligatoire, min 2)
338
- check_dir_count "$path/.claude/templates" "templates" 2 || ((issues++)) || true
339
-
340
- # Checklists (obligatoire, min 2)
341
- check_dir_count "$path/.claude/checklists" "checklists" 2 || ((issues++)) || true
342
-
343
- # CLAUDE.md (obligatoire)
344
- check_file_exists "$path/.claude/CLAUDE.md" "CLAUDE.md" || ((issues++)) || true
345
-
346
- # Agents (obligatoire, min 1)
347
- check_dir_count "$path/.claude/agents" "agents" 1 || ((issues++)) || true
348
-
349
- return $issues
350
- }
351
-
352
- # ─────────────────────────────────────────────────────────────────────────────
353
- # Vérification React Native
354
- # ─────────────────────────────────────────────────────────────────────────────
355
- check_reactnative_installation() {
356
- local path="$1"
357
- local issues=0
286
+ # Parse registry entry
287
+ IFS=':' read -r _ cmd_ns min_rules min_cmds min_templates min_checklists <<< "$entry"
358
288
 
359
289
  if [[ ! -d "$path/.claude" ]]; then
360
290
  log_error ".claude/: non trouvé"
361
291
  return 1
362
292
  fi
363
293
 
364
- # Rules (obligatoire - generic + ReactNative-specific, min 15)
365
- # Generic: 7 files from Common/rules/ + ReactNative: 9 tech-specific
366
- check_dir_count "$path/.claude/rules" "rules" 15 || ((issues++)) || true
294
+ # Rules (generic + tech-specific)
295
+ check_dir_count "$path/.claude/rules" "rules" "$min_rules" || ((issues++)) || true
367
296
 
368
- # Commands/reactnative (obligatoire, min 5)
369
- check_dir_count "$path/.claude/commands/reactnative" "commands/reactnative" 5 || ((issues++)) || true
297
+ # Commands (tech namespace)
298
+ check_dir_count "$path/.claude/commands/${cmd_ns}" "commands/${cmd_ns}" "$min_cmds" || ((issues++)) || true
370
299
 
371
- # Templates (obligatoire, min 2)
372
- check_dir_count "$path/.claude/templates" "templates" 2 || ((issues++)) || true
300
+ # Templates
301
+ check_dir_count "$path/.claude/templates" "templates" "$min_templates" || ((issues++)) || true
373
302
 
374
- # Checklists (obligatoire, min 2)
375
- check_dir_count "$path/.claude/checklists" "checklists" 2 || ((issues++)) || true
303
+ # Checklists
304
+ check_dir_count "$path/.claude/checklists" "checklists" "$min_checklists" || ((issues++)) || true
376
305
 
377
- # CLAUDE.md (obligatoire)
306
+ # CLAUDE.md
378
307
  check_file_exists "$path/.claude/CLAUDE.md" "CLAUDE.md" || ((issues++)) || true
379
308
 
380
- # Agents (obligatoire, min 1)
309
+ # Agents
381
310
  check_dir_count "$path/.claude/agents" "agents" 1 || ((issues++)) || true
382
311
 
383
- return $issues
384
- }
385
-
386
- # ─────────────────────────────────────────────────────────────────────────────
387
- # Vérification Python
388
- # ─────────────────────────────────────────────────────────────────────────────
389
- check_python_installation() {
390
- local path="$1"
391
- local issues=0
392
-
393
- if [[ ! -d "$path/.claude" ]]; then
394
- log_error ".claude/: non trouvé"
395
- return 1
396
- fi
397
-
398
- # Rules (obligatoire - generic + Python-specific, min 10)
399
- # Generic: 7 files from Common/rules/ + Python: 4 tech-specific
400
- check_dir_count "$path/.claude/rules" "rules" 10 || ((issues++)) || true
401
-
402
- # Commands/python (obligatoire, min 5)
403
- check_dir_count "$path/.claude/commands/python" "commands/python" 5 || ((issues++)) || true
404
-
405
- # Templates (obligatoire, min 2)
406
- check_dir_count "$path/.claude/templates" "templates" 2 || ((issues++)) || true
407
-
408
- # Checklists (obligatoire, min 2)
409
- check_dir_count "$path/.claude/checklists" "checklists" 2 || ((issues++)) || true
410
-
411
- # CLAUDE.md (obligatoire)
412
- check_file_exists "$path/.claude/CLAUDE.md" "CLAUDE.md" || ((issues++)) || true
413
-
414
- # Agents (obligatoire, min 1)
415
- check_dir_count "$path/.claude/agents" "agents" 1 || ((issues++)) || true
312
+ # Optional directories
313
+ check_dir_optional "$path/.claude/adr" "adr"
314
+ check_dir_optional "$path/.claude/examples" "examples"
416
315
 
417
316
  return $issues
418
317
  }
@@ -428,32 +327,8 @@ check_module() {
428
327
 
429
328
  echo -e " ${BOLD}$label:${NC}"
430
329
 
431
- case "$tech" in
432
- symfony)
433
- check_symfony_installation "$path"
434
- issues=$?
435
- ;;
436
- flutter)
437
- check_flutter_installation "$path"
438
- issues=$?
439
- ;;
440
- react)
441
- check_react_installation "$path"
442
- issues=$?
443
- ;;
444
- reactnative)
445
- check_reactnative_installation "$path"
446
- issues=$?
447
- ;;
448
- python)
449
- check_python_installation "$path"
450
- issues=$?
451
- ;;
452
- *)
453
- log_warn "Technologie inconnue: $tech"
454
- issues=1
455
- ;;
456
- esac
330
+ check_tech_installation "$path" "$tech"
331
+ issues=$?
457
332
 
458
333
  return $issues
459
334
  }
@@ -0,0 +1,84 @@
1
+ #!/bin/bash
2
+ # ═══════════════════════════════════════════════════════════════════════════
3
+ # shell-ui.sh — Shared UI functions for Claude-Craft shell scripts
4
+ # ═══════════════════════════════════════════════════════════════════════════
5
+ #
6
+ # Provides consistent colors, logging, headers, and section formatting.
7
+ # Source this file from any install/check script:
8
+ #
9
+ # source "$(dirname "${BASH_SOURCE[0]}")/lib/shell-ui.sh"
10
+ #
11
+ # ═══════════════════════════════════════════════════════════════════════════
12
+
13
+ # ─────────────────────────────────────────────────────────────────────────────
14
+ # ANSI Colors
15
+ # ─────────────────────────────────────────────────────────────────────────────
16
+ RED='\033[0;31m'
17
+ GREEN='\033[0;32m'
18
+ YELLOW='\033[1;33m'
19
+ BLUE='\033[0;34m'
20
+ CYAN='\033[0;36m'
21
+ MAGENTA='\033[0;35m'
22
+ BOLD='\033[1m'
23
+ DIM='\033[2m'
24
+ NC='\033[0m'
25
+
26
+ # ─────────────────────────────────────────────────────────────────────────────
27
+ # Logging functions
28
+ # ─────────────────────────────────────────────────────────────────────────────
29
+ ui_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
30
+ ui_success() { echo -e "${GREEN}[OK]${NC} $1"; }
31
+ ui_warning() { echo -e "${YELLOW}[WARN]${NC} $1"; }
32
+ ui_error() { echo -e "${RED}[ERROR]${NC} $1"; }
33
+ ui_dry_run() { echo -e "${YELLOW}[DRY-RUN]${NC} $1"; }
34
+
35
+ # ─────────────────────────────────────────────────────────────────────────────
36
+ # Check-style logging (indented with icons)
37
+ # ─────────────────────────────────────────────────────────────────────────────
38
+ ui_check_ok() { echo -e " ${GREEN}✓${NC} $1"; }
39
+ ui_check_warn() { echo -e " ${YELLOW}⚠${NC} $1"; }
40
+ ui_check_fail() { echo -e " ${RED}✗${NC} $1"; }
41
+ ui_check_info() { echo -e " ${BLUE}ℹ${NC} $1"; }
42
+
43
+ # ─────────────────────────────────────────────────────────────────────────────
44
+ # Section headers
45
+ # ─────────────────────────────────────────────────────────────────────────────
46
+
47
+ # Print a boxed header with icon
48
+ # Usage: ui_header "Title text"
49
+ ui_header() {
50
+ echo ""
51
+ echo -e "${BOLD}╔════════════════════════════════════════════════════════════╗${NC}"
52
+ echo -e "${BOLD}║${NC} $1"
53
+ echo -e "${BOLD}╚════════════════════════════════════════════════════════════╝${NC}"
54
+ echo ""
55
+ }
56
+
57
+ # Print a colored boxed header
58
+ # Usage: ui_box "Title" "$CYAN"
59
+ ui_box() {
60
+ local title="$1"
61
+ local color="${2:-$CYAN}"
62
+ echo -e "${color}╔════════════════════════════════════════════════════════════╗${NC}"
63
+ echo -e "${color}║${NC} ${title}"
64
+ echo -e "${color}╚════════════════════════════════════════════════════════════╝${NC}"
65
+ }
66
+
67
+ # Print a separator line
68
+ # Usage: ui_separator
69
+ ui_separator() {
70
+ echo -e "${BOLD}══════════════════════════════════════════════════════════════${NC}"
71
+ }
72
+
73
+ # ─────────────────────────────────────────────────────────────────────────────
74
+ # Progress indicators
75
+ # ─────────────────────────────────────────────────────────────────────────────
76
+
77
+ # Print a step indicator
78
+ # Usage: ui_step 1 5 "Installing common rules..."
79
+ ui_step() {
80
+ local current="$1"
81
+ local total="$2"
82
+ local message="$3"
83
+ echo -e "${CYAN}[${current}/${total}]${NC} ${message}"
84
+ }
package/README.md CHANGED
@@ -24,7 +24,7 @@ A comprehensive framework for AI-assisted development with [Claude Code](https:/
24
24
  - **155 Slash Commands**: Automated workflows, code generation, **sprint management, quality gates, batch processing, acceptance testing**
25
25
  - **BMAD v6 Framework**: Complete project management with status-based routing, quality gates, and batch execution
26
26
  - **Ralph Wiggum**: Continuous loop execution with Definition of Done validation
27
- - **249 Skills**: Best practices in official Claude Code format (architecture, testing, security)
27
+ - **50 Skills**: Best practices in official Claude Code format (architecture, testing, security)
28
28
  - **33 Templates**: Code generation patterns + BMAD templates
29
29
  - **21 Checklists**: Quality gates for commits, features, releases
30
30
  - **Hooks System**: Pre/Post tool execution, quality gates, notifications, **BMAD context injection**
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Technology registry — Single Source of Truth for all supported stacks.
3
+ *
4
+ * This module centralizes technology metadata used across:
5
+ * - CLI constants (TECHNOLOGIES)
6
+ * - Install scripts (install-{tech}-rules.sh)
7
+ * - check-config.sh validation
8
+ * - Documentation references
9
+ *
10
+ * @module cli/lib/tech-registry
11
+ */
12
+
13
+ /**
14
+ * @typedef {Object} TechEntry
15
+ * @property {string} name - Internal identifier (lowercase, no hyphens)
16
+ * @property {string} displayName - Human-readable name
17
+ * @property {string} desc - Short description for CLI display
18
+ * @property {string} namespace - Command namespace (used in commands/{namespace}/)
19
+ * @property {string} i18nDir - Directory name under Dev/i18n/{lang}/
20
+ * @property {string} installScript - Install script filename
21
+ * @property {string} version - Current supported version
22
+ */
23
+
24
+ /** @type {Record<string, TechEntry>} */
25
+ const TECH_REGISTRY = {
26
+ symfony: {
27
+ name: 'symfony',
28
+ displayName: 'Symfony / PHP',
29
+ desc: 'PHP backend with Clean Architecture, DDD, API Platform',
30
+ namespace: 'symfony',
31
+ i18nDir: 'Symfony',
32
+ installScript: 'install-symfony-rules.sh',
33
+ version: '8.0 / PHP 8.5',
34
+ },
35
+ flutter: {
36
+ name: 'flutter',
37
+ displayName: 'Flutter / Dart',
38
+ desc: 'Mobile Dart with BLoC pattern, Material/Cupertino',
39
+ namespace: 'flutter',
40
+ i18nDir: 'Flutter',
41
+ installScript: 'install-flutter-rules.sh',
42
+ version: '3.38 / Dart 3.10',
43
+ },
44
+ react: {
45
+ name: 'react',
46
+ displayName: 'React',
47
+ desc: 'Frontend JS/TS with Hooks, State management, A11y',
48
+ namespace: 'react',
49
+ i18nDir: 'React',
50
+ installScript: 'install-react-rules.sh',
51
+ version: '19.x',
52
+ },
53
+ reactnative: {
54
+ name: 'reactnative',
55
+ displayName: 'React Native',
56
+ desc: 'Mobile JS/TS with Navigation, Native modules',
57
+ namespace: 'reactnative',
58
+ i18nDir: 'ReactNative',
59
+ installScript: 'install-reactnative-rules.sh',
60
+ version: '0.76+',
61
+ },
62
+ angular: {
63
+ name: 'angular',
64
+ displayName: 'Angular',
65
+ desc: 'Frontend TS with Signals, Standalone components, RxJS',
66
+ namespace: 'angular',
67
+ i18nDir: 'Angular',
68
+ installScript: 'install-angular-rules.sh',
69
+ version: '19.x',
70
+ },
71
+ csharp: {
72
+ name: 'csharp',
73
+ displayName: 'C# / .NET',
74
+ desc: 'Backend with Clean Architecture, CQRS, MediatR, EF Core',
75
+ namespace: 'csharp',
76
+ i18nDir: 'CSharp',
77
+ installScript: 'install-csharp-rules.sh',
78
+ version: '10 LTS / C# 14',
79
+ },
80
+ laravel: {
81
+ name: 'laravel',
82
+ displayName: 'Laravel',
83
+ desc: 'PHP backend with Actions, Pest PHP, Sanctum',
84
+ namespace: 'laravel',
85
+ i18nDir: 'Laravel',
86
+ installScript: 'install-laravel-rules.sh',
87
+ version: '12.x / PHP 8.5',
88
+ },
89
+ vuejs: {
90
+ name: 'vuejs',
91
+ displayName: 'Vue.js',
92
+ desc: 'Frontend JS/TS with Composition API, Pinia, Vitest',
93
+ namespace: 'vuejs',
94
+ i18nDir: 'VueJS',
95
+ installScript: 'install-vuejs-rules.sh',
96
+ version: '3.5+',
97
+ },
98
+ php: {
99
+ name: 'php',
100
+ displayName: 'PHP',
101
+ desc: 'Backend PHP 8.5 with PSR-12, PHPStan, Pest PHP',
102
+ namespace: 'php',
103
+ i18nDir: 'PHP',
104
+ installScript: 'install-php-rules.sh',
105
+ version: '8.5',
106
+ },
107
+ python: {
108
+ name: 'python',
109
+ displayName: 'Python',
110
+ desc: 'Backend with FastAPI, async/await, Type hints',
111
+ namespace: 'python',
112
+ i18nDir: 'Python',
113
+ installScript: 'install-python-rules.sh',
114
+ version: '3.13+',
115
+ },
116
+ docker: {
117
+ name: 'docker',
118
+ displayName: 'Docker',
119
+ desc: 'Dockerfile, Compose, CI/CD, Debugging',
120
+ namespace: 'docker',
121
+ i18nDir: 'Docker',
122
+ installScript: 'install-infra-rules.sh',
123
+ version: 'latest',
124
+ },
125
+ };
126
+
127
+ /** All tech keys (excluding docker which is infra) */
128
+ const INSTALLABLE_TECHS = Object.keys(TECH_REGISTRY).filter((k) => k !== 'docker');
129
+
130
+ /** Get display name for a tech key */
131
+ function getDisplayName(tech) {
132
+ return TECH_REGISTRY[tech]?.displayName ?? tech;
133
+ }
134
+
135
+ /** Get all tech keys */
136
+ function getAllTechKeys() {
137
+ return Object.keys(TECH_REGISTRY);
138
+ }
139
+
140
+ export { TECH_REGISTRY, INSTALLABLE_TECHS, getDisplayName, getAllTechKeys };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@the-bearded-bear/claude-craft",
3
- "version": "7.0.0",
3
+ "version": "7.1.0",
4
4
  "description": "A comprehensive framework for AI-assisted development with Claude Code. Install standardized rules, agents, and commands for your projects.",
5
5
  "type": "module",
6
6
  "main": "cli/index.js",