@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
|
-
│ ├──
|
|
17
|
-
│ ├── agents/
|
|
18
|
-
│ ├── commands/
|
|
19
|
-
│ └── skills/
|
|
20
|
-
└── src/
|
|
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 `
|
|
27
|
-
- **SOLID + KISS**: Clean, maintainable code (see `
|
|
28
|
-
- **TDD/BDD**: Test-driven development (see `
|
|
29
|
-
- **Security First**: OWASP compliance (see `
|
|
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/
|
|
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 |
|
|
60
|
-
|
|
61
|
-
| Workflow | `
|
|
62
|
-
| Architecture | `
|
|
63
|
-
| Coding Standards | `
|
|
64
|
-
| SOLID Principles | `
|
|
65
|
-
| KISS/DRY/YAGNI | `
|
|
66
|
-
| Testing | `
|
|
67
|
-
| Security | `
|
|
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
|
-
#
|
|
248
|
-
#
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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 [[
|
|
326
|
-
|
|
281
|
+
if [[ -z "$entry" ]]; then
|
|
282
|
+
log_warn "Technologie inconnue: $tech"
|
|
327
283
|
return 1
|
|
328
284
|
fi
|
|
329
285
|
|
|
330
|
-
#
|
|
331
|
-
|
|
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 (
|
|
365
|
-
|
|
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
|
|
369
|
-
check_dir_count "$path/.claude/commands
|
|
297
|
+
# Commands (tech namespace)
|
|
298
|
+
check_dir_count "$path/.claude/commands/${cmd_ns}" "commands/${cmd_ns}" "$min_cmds" || ((issues++)) || true
|
|
370
299
|
|
|
371
|
-
# Templates
|
|
372
|
-
check_dir_count "$path/.claude/templates" "templates"
|
|
300
|
+
# Templates
|
|
301
|
+
check_dir_count "$path/.claude/templates" "templates" "$min_templates" || ((issues++)) || true
|
|
373
302
|
|
|
374
|
-
# Checklists
|
|
375
|
-
check_dir_count "$path/.claude/checklists" "checklists"
|
|
303
|
+
# Checklists
|
|
304
|
+
check_dir_count "$path/.claude/checklists" "checklists" "$min_checklists" || ((issues++)) || true
|
|
376
305
|
|
|
377
|
-
# CLAUDE.md
|
|
306
|
+
# CLAUDE.md
|
|
378
307
|
check_file_exists "$path/.claude/CLAUDE.md" "CLAUDE.md" || ((issues++)) || true
|
|
379
308
|
|
|
380
|
-
# Agents
|
|
309
|
+
# Agents
|
|
381
310
|
check_dir_count "$path/.claude/agents" "agents" 1 || ((issues++)) || true
|
|
382
311
|
|
|
383
|
-
|
|
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
|
-
|
|
432
|
-
|
|
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
|
-
- **
|
|
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.
|
|
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",
|