Clean up ralph-claude and test-ralph-workflow directories
This commit is contained in:
Submodule ralph-claude deleted from ecd8bed527
1
test-ralph-workflow/.gitignore
vendored
1
test-ralph-workflow/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
node_modules/
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# hello-ralph-test
|
|
||||||
|
|
||||||
Proiect minimal pentru testare workflow Ralph.
|
|
||||||
|
|
||||||
Un proiect Node.js simplu care validează capacitatea Ralph de a inițializa proiecte, scrie cod funcțional și rula teste.
|
|
||||||
4410
test-ralph-workflow/package-lock.json
generated
4410
test-ralph-workflow/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hello-ralph-test",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "Proiect minimal pentru testare workflow Ralph",
|
|
||||||
"main": "src/hello.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "jest"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"jest": "^30.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
main
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"projectName": "hello-ralph-test",
|
|
||||||
"branchName": "main",
|
|
||||||
"description": "Proiect minimal pentru testare workflow Ralph",
|
|
||||||
"userStories": [
|
|
||||||
{
|
|
||||||
"id": "US-001",
|
|
||||||
"title": "Setup proiect Node.js",
|
|
||||||
"description": "Ca developer, vreau un proiect Node.js minimal cu package.json pentru că validez că Ralph poate initializa proiecte",
|
|
||||||
"priority": 1,
|
|
||||||
"acceptanceCriteria": [
|
|
||||||
"package.json există cu name=\"hello-ralph-test\", version=\"1.0.0\"",
|
|
||||||
"README.md există cu descriere proiect",
|
|
||||||
".gitignore există cu node_modules/"
|
|
||||||
],
|
|
||||||
"passes": true,
|
|
||||||
"notes": "package.json, README.md, .gitignore create. Proiect inițializat."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "US-002",
|
|
||||||
"title": "Funcție hello simpla",
|
|
||||||
"description": "Ca user, vreau o funcție hello(name) care returnează salut pentru că validez că Ralph poate scrie cod funcțional",
|
|
||||||
"priority": 2,
|
|
||||||
"acceptanceCriteria": [
|
|
||||||
"src/hello.js există",
|
|
||||||
"Funcție hello(name) returnează \"Hello, {name}!\"",
|
|
||||||
"Exportată ca module.exports = { hello }",
|
|
||||||
"Funcția trimite toLowerCase pe name"
|
|
||||||
],
|
|
||||||
"passes": true,
|
|
||||||
"notes": "src/hello.js creat cu hello(name) care aplică toLowerCase pe name. Exportat ca module.exports = { hello }."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "US-003",
|
|
||||||
"title": "Test pentru hello",
|
|
||||||
"description": "Ca developer, vreau un test simplu pentru funcția hello pentru că validez quality checks Ralph",
|
|
||||||
"priority": 3,
|
|
||||||
"acceptanceCriteria": [
|
|
||||||
"package.json include \"test\" script și dev dependency jest",
|
|
||||||
"tests/hello.test.js există",
|
|
||||||
"Test verifică hello(\"World\") === \"Hello, world!\"",
|
|
||||||
"npm test passes"
|
|
||||||
],
|
|
||||||
"passes": true,
|
|
||||||
"notes": "Jest instalat ca devDependency, test script configurat în package.json. tests/hello.test.js verifică hello(\"World\") === \"Hello, world!\". npm test passes."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# Ralph Progress Log
|
|
||||||
Started: Sun Feb 8 14:01:10 UTC 2026
|
|
||||||
Project: hello-ralph-test
|
|
||||||
---
|
|
||||||
|
|
||||||
## Iterație: 2026-02-08T14:02:00Z
|
|
||||||
### Story implementat: US-001 - Setup proiect Node.js
|
|
||||||
### Status: Complete
|
|
||||||
|
|
||||||
### Learnings:
|
|
||||||
- Branch-ul PRD era `main`, dar repo-ul avea doar `master`. Am creat branch `main`.
|
|
||||||
- Proiect minimal: package.json, README.md, .gitignore.
|
|
||||||
|
|
||||||
### Next steps:
|
|
||||||
- US-002: Implementare funcție hello(name) în src/hello.js
|
|
||||||
---
|
|
||||||
|
|
||||||
## Iterație: 2026-02-08T14:10:00Z
|
|
||||||
### Story implementat: US-002 - Funcție hello simpla
|
|
||||||
### Status: Complete
|
|
||||||
|
|
||||||
### Learnings:
|
|
||||||
- Implementare minimală: o singură funcție cu toLowerCase pe name.
|
|
||||||
- Verificat manual că hello("World") === "Hello, world!" returnează true.
|
|
||||||
|
|
||||||
### Next steps:
|
|
||||||
- US-003: Adăugare test jest pentru funcția hello
|
|
||||||
---
|
|
||||||
|
|
||||||
## Iterație: 2026-02-08T14:20:00Z
|
|
||||||
### Story implementat: US-003 - Test pentru hello
|
|
||||||
### Status: Complete
|
|
||||||
|
|
||||||
### Learnings:
|
|
||||||
- Jest 30.x instalat ca devDependency, script "test" actualizat de la placeholder la "jest".
|
|
||||||
- Test minimal: un singur `test()` care verifică hello("World") === "Hello, world!".
|
|
||||||
- npm test trece cu succes.
|
|
||||||
|
|
||||||
### Next steps:
|
|
||||||
- Toate stories sunt complete. PRD finalizat.
|
|
||||||
---
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
# Ralph - Instrucțiuni pentru Iterație
|
|
||||||
|
|
||||||
Ești un agent autonom care implementează user stories dintr-un PRD. Aceasta este O SINGURĂ iterație - implementezi UN singur story și apoi te oprești.
|
|
||||||
|
|
||||||
## Workflow pentru această iterație
|
|
||||||
|
|
||||||
### 1. Citește contextul
|
|
||||||
- PRD-ul și progress.txt sunt furnizate în context
|
|
||||||
- Înțelege ce stories sunt deja complete (`passes: true`)
|
|
||||||
- Identifică următorul story de implementat (prioritate cea mai mică dintre cele incomplete)
|
|
||||||
|
|
||||||
### 2. Management branch
|
|
||||||
- Verifică dacă ești pe branch-ul corect (specificat în `branchName` din PRD)
|
|
||||||
- Dacă nu, creează și checkout branch-ul:
|
|
||||||
```bash
|
|
||||||
git checkout -b <branchName>
|
|
||||||
```
|
|
||||||
- Dacă branch-ul există deja, doar checkout:
|
|
||||||
```bash
|
|
||||||
git checkout <branchName>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Selectează story-ul
|
|
||||||
- Alege story-ul cu cea mai mică prioritate care are `passes: false`
|
|
||||||
- Citește atent acceptance criteria
|
|
||||||
|
|
||||||
### 4. Implementare
|
|
||||||
- Implementează DOAR acest story
|
|
||||||
- Urmează patterns existente în codebase
|
|
||||||
- Fii minimal și focusat - nu adăuga funcționalități extra
|
|
||||||
|
|
||||||
### 5. Quality Checks
|
|
||||||
Rulează TOATE verificările înainte de commit:
|
|
||||||
```bash
|
|
||||||
npm run typecheck # sau echivalentul proiectului
|
|
||||||
npm run lint # dacă există
|
|
||||||
npm run test # dacă există
|
|
||||||
```
|
|
||||||
|
|
||||||
**IMPORTANT**: Nu face commit dacă verificările eșuează. Repară mai întâi.
|
|
||||||
|
|
||||||
### 6. Documentare (dacă ai descoperit ceva util)
|
|
||||||
Dacă ai descoperit patterns sau gotchas, actualizează `AGENTS.md` în directorul relevant:
|
|
||||||
- API patterns
|
|
||||||
- Dependențe non-evidente
|
|
||||||
- Convenții de cod
|
|
||||||
- Cum să testezi anumite funcționalități
|
|
||||||
|
|
||||||
### 7. Commit
|
|
||||||
Format commit message:
|
|
||||||
```
|
|
||||||
feat: [Story ID] - [Story Title]
|
|
||||||
```
|
|
||||||
|
|
||||||
Exemplu:
|
|
||||||
```
|
|
||||||
feat: US-003 - Add user authentication endpoint
|
|
||||||
```
|
|
||||||
|
|
||||||
### 8. Marchează story-ul ca complet
|
|
||||||
**CRITIC**: Actualizează `scripts/ralph/prd.json`:
|
|
||||||
- Setează `passes: true` pentru story-ul implementat
|
|
||||||
- Adaugă note relevante în câmpul `notes`
|
|
||||||
|
|
||||||
Exemplu de actualizare:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "US-003",
|
|
||||||
"passes": true,
|
|
||||||
"notes": "Implementat cu JWT. Vezi src/auth/jwt.ts pentru middleware."
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 9. Actualizează progress.txt
|
|
||||||
Adaugă la sfârșitul fișierului `scripts/ralph/progress.txt`:
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
## Iterație: [timestamp]
|
|
||||||
### Story implementat: [ID] - [Title]
|
|
||||||
### Status: Complete
|
|
||||||
|
|
||||||
### Learnings:
|
|
||||||
- [Ce ai învățat]
|
|
||||||
- [Patterns descoperite]
|
|
||||||
- [Gotchas întâlnite]
|
|
||||||
|
|
||||||
### Next steps:
|
|
||||||
- [Ce rămâne de făcut]
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reguli importante
|
|
||||||
|
|
||||||
1. **UN SINGUR STORY PE ITERAȚIE** - Nu implementa mai mult de un story
|
|
||||||
2. **TOATE CHECKS TREBUIE SĂ TREACĂ** - Nu face commit cu erori
|
|
||||||
3. **ACTUALIZEAZĂ prd.json** - Altfel iterația următoare va repeta munca
|
|
||||||
4. **FII CONCIS** - Nu over-engineer, implementează minim necesar
|
|
||||||
5. **DOCUMENTEAZĂ** - Learnings în progress.txt, patterns în AGENTS.md
|
|
||||||
|
|
||||||
## Condiție de terminare
|
|
||||||
|
|
||||||
Dacă TOATE stories au `passes: true`, răspunde cu:
|
|
||||||
|
|
||||||
```
|
|
||||||
<promise>COMPLETE</promise>
|
|
||||||
```
|
|
||||||
|
|
||||||
Aceasta semnalează că Ralph a terminat toate task-urile.
|
|
||||||
|
|
||||||
## Dacă întâmpini probleme
|
|
||||||
|
|
||||||
- **Story prea mare**: Notează în progress.txt și sugerează descompunerea
|
|
||||||
- **Dependență lipsă**: Verifică dacă un story anterior nu a fost implementat corect
|
|
||||||
- **Test eșuează**: Repară și încearcă din nou, documentează fix-ul
|
|
||||||
- **Blocat complet**: Notează în progress.txt motivul și continuă cu următorul story dacă e posibil
|
|
||||||
|
|
||||||
---
|
|
||||||
ÎNCEPE IMPLEMENTAREA ACUM. Selectează story-ul cu prioritatea cea mai mică care nu este complet și implementează-l.
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Ralph pentru Claude Code - Loop autonom de agent AI
|
|
||||||
# Adaptat din Ralph original (snarktank/ralph) pentru Claude Code CLI
|
|
||||||
# Usage: ./ralph.sh [max_iterations] [project_dir]
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
MAX_ITERATIONS=${1:-10}
|
|
||||||
PROJECT_DIR=${2:-$(pwd)}
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
PRD_FILE="$SCRIPT_DIR/prd.json"
|
|
||||||
PROGRESS_FILE="$SCRIPT_DIR/progress.txt"
|
|
||||||
ARCHIVE_DIR="$SCRIPT_DIR/archive"
|
|
||||||
LAST_BRANCH_FILE="$SCRIPT_DIR/.last-branch"
|
|
||||||
PROMPT_FILE="$SCRIPT_DIR/prompt.md"
|
|
||||||
|
|
||||||
# Verifică că jq este instalat
|
|
||||||
if ! command -v jq &> /dev/null; then
|
|
||||||
echo "Eroare: jq nu este instalat. Rulează: apt install jq"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Verifică că claude este instalat
|
|
||||||
if ! command -v claude &> /dev/null; then
|
|
||||||
echo "Eroare: Claude Code CLI nu este instalat."
|
|
||||||
echo "Instalează cu: npm install -g @anthropic-ai/claude-code"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Verifică existența fișierelor necesare
|
|
||||||
if [ ! -f "$PRD_FILE" ]; then
|
|
||||||
echo "Eroare: prd.json nu există în $SCRIPT_DIR"
|
|
||||||
echo "Generează mai întâi un PRD folosind skill-ul /prd"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$PROMPT_FILE" ]; then
|
|
||||||
echo "Eroare: prompt.md nu există în $SCRIPT_DIR"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Arhivare rulare anterioară dacă branch-ul s-a schimbat
|
|
||||||
if [ -f "$PRD_FILE" ] && [ -f "$LAST_BRANCH_FILE" ]; then
|
|
||||||
CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "")
|
|
||||||
LAST_BRANCH=$(cat "$LAST_BRANCH_FILE" 2>/dev/null || echo "")
|
|
||||||
|
|
||||||
if [ -n "$CURRENT_BRANCH" ] && [ -n "$LAST_BRANCH" ] && [ "$CURRENT_BRANCH" != "$LAST_BRANCH" ]; then
|
|
||||||
DATE=$(date +%Y-%m-%d)
|
|
||||||
FOLDER_NAME=$(echo "$LAST_BRANCH" | sed 's|^ralph/||')
|
|
||||||
ARCHIVE_FOLDER="$ARCHIVE_DIR/$DATE-$FOLDER_NAME"
|
|
||||||
|
|
||||||
echo "📦 Arhivare rulare anterioară: $LAST_BRANCH"
|
|
||||||
mkdir -p "$ARCHIVE_FOLDER"
|
|
||||||
[ -f "$PRD_FILE" ] && cp "$PRD_FILE" "$ARCHIVE_FOLDER/"
|
|
||||||
[ -f "$PROGRESS_FILE" ] && cp "$PROGRESS_FILE" "$ARCHIVE_FOLDER/"
|
|
||||||
echo " Arhivat în: $ARCHIVE_FOLDER"
|
|
||||||
|
|
||||||
# Reset progress file
|
|
||||||
echo "# Ralph Progress Log" > "$PROGRESS_FILE"
|
|
||||||
echo "Started: $(date)" >> "$PROGRESS_FILE"
|
|
||||||
echo "Branch: $CURRENT_BRANCH" >> "$PROGRESS_FILE"
|
|
||||||
echo "---" >> "$PROGRESS_FILE"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Salvează branch-ul curent
|
|
||||||
if [ -f "$PRD_FILE" ]; then
|
|
||||||
CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "")
|
|
||||||
if [ -n "$CURRENT_BRANCH" ]; then
|
|
||||||
echo "$CURRENT_BRANCH" > "$LAST_BRANCH_FILE"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Inițializare progress file dacă nu există
|
|
||||||
if [ ! -f "$PROGRESS_FILE" ]; then
|
|
||||||
echo "# Ralph Progress Log" > "$PROGRESS_FILE"
|
|
||||||
echo "Started: $(date)" >> "$PROGRESS_FILE"
|
|
||||||
echo "---" >> "$PROGRESS_FILE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Funcție pentru a verifica dacă toate story-urile sunt complete
|
|
||||||
check_all_complete() {
|
|
||||||
local incomplete=$(jq '[.userStories[] | select(.passes != true)] | length' "$PRD_FILE" 2>/dev/null || echo "999")
|
|
||||||
[ "$incomplete" -eq 0 ]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Afișare status inițial
|
|
||||||
echo ""
|
|
||||||
echo "╔═══════════════════════════════════════════════════════════════╗"
|
|
||||||
echo "║ RALPH pentru Claude Code - Agent Autonom ║"
|
|
||||||
echo "╠═══════════════════════════════════════════════════════════════╣"
|
|
||||||
PROJECT_NAME=$(jq -r '.projectName // "Unknown"' "$PRD_FILE")
|
|
||||||
BRANCH_NAME=$(jq -r '.branchName // "N/A"' "$PRD_FILE")
|
|
||||||
TOTAL_STORIES=$(jq '.userStories | length' "$PRD_FILE")
|
|
||||||
COMPLETE_STORIES=$(jq '[.userStories[] | select(.passes == true)] | length' "$PRD_FILE")
|
|
||||||
echo "║ Proiect: $PROJECT_NAME"
|
|
||||||
echo "║ Branch: $BRANCH_NAME"
|
|
||||||
echo "║ Stories: $COMPLETE_STORIES / $TOTAL_STORIES complete"
|
|
||||||
echo "║ Max iterații: $MAX_ITERATIONS"
|
|
||||||
echo "╚═══════════════════════════════════════════════════════════════╝"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Verificare rapidă - poate toate sunt deja complete?
|
|
||||||
if check_all_complete; then
|
|
||||||
echo "✅ Toate story-urile sunt deja complete!"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Loop principal
|
|
||||||
for i in $(seq 1 $MAX_ITERATIONS); do
|
|
||||||
echo ""
|
|
||||||
echo "═══════════════════════════════════════════════════════════════"
|
|
||||||
echo " 🔄 Ralph Iterația $i din $MAX_ITERATIONS"
|
|
||||||
echo "═══════════════════════════════════════════════════════════════"
|
|
||||||
|
|
||||||
# Status curent
|
|
||||||
COMPLETE_NOW=$(jq '[.userStories[] | select(.passes == true)] | length' "$PRD_FILE")
|
|
||||||
NEXT_STORY=$(jq -r '[.userStories[] | select(.passes != true)] | sort_by(.priority) | .[0] | "\(.id): \(.title)"' "$PRD_FILE")
|
|
||||||
echo " 📊 Progress: $COMPLETE_NOW / $TOTAL_STORIES stories complete"
|
|
||||||
echo " 🎯 Next: $NEXT_STORY"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Pregătește prompt-ul cu context
|
|
||||||
FULL_PROMPT=$(cat <<EOF
|
|
||||||
# Context pentru această iterație Ralph
|
|
||||||
|
|
||||||
## PRD (prd.json):
|
|
||||||
$(cat "$PRD_FILE")
|
|
||||||
|
|
||||||
## Progress până acum (progress.txt):
|
|
||||||
$(cat "$PROGRESS_FILE")
|
|
||||||
|
|
||||||
## Instrucțiuni pentru această iterație:
|
|
||||||
$(cat "$PROMPT_FILE")
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
# Execută Claude Code în modul non-interactiv
|
|
||||||
# Folosim --dangerously-skip-permissions pentru a permite operațiuni fără confirmare
|
|
||||||
# OUTPUT=$(echo "$FULL_PROMPT" | claude -p --dangerously-skip-permissions 2>&1 | tee /dev/stderr) || true
|
|
||||||
|
|
||||||
# Alternativ, cu output în fișier pentru debugging
|
|
||||||
LOG_FILE="$SCRIPT_DIR/logs/iteration-$i-$(date +%Y%m%d-%H%M%S).log"
|
|
||||||
mkdir -p "$SCRIPT_DIR/logs"
|
|
||||||
|
|
||||||
echo "$FULL_PROMPT" | claude -p --dangerously-skip-permissions 2>&1 | tee "$LOG_FILE" || true
|
|
||||||
OUTPUT=$(cat "$LOG_FILE")
|
|
||||||
|
|
||||||
# Verifică dacă toate task-urile sunt complete
|
|
||||||
if echo "$OUTPUT" | grep -q "<promise>COMPLETE</promise>"; then
|
|
||||||
echo ""
|
|
||||||
echo "╔═══════════════════════════════════════════════════════════════╗"
|
|
||||||
echo "║ ✅ RALPH A TERMINAT TOATE TASK-URILE! ║"
|
|
||||||
echo "║ Completat la iterația $i din $MAX_ITERATIONS ║"
|
|
||||||
echo "╚═══════════════════════════════════════════════════════════════╝"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Verifică și prin prd.json
|
|
||||||
if check_all_complete; then
|
|
||||||
echo ""
|
|
||||||
echo "╔═══════════════════════════════════════════════════════════════╗"
|
|
||||||
echo "║ ✅ TOATE STORY-URILE DIN PRD SUNT COMPLETE! ║"
|
|
||||||
echo "╚═══════════════════════════════════════════════════════════════╝"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " ✓ Iterația $i completă. Continuăm..."
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "╔═══════════════════════════════════════════════════════════════╗"
|
|
||||||
echo "║ ⚠️ Ralph a atins limita de iterații ($MAX_ITERATIONS) ║"
|
|
||||||
echo "║ Verifică progress.txt pentru status. ║"
|
|
||||||
echo "╚═══════════════════════════════════════════════════════════════╝"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Afișează stories incomplete
|
|
||||||
echo "Stories incomplete:"
|
|
||||||
jq -r '.userStories[] | select(.passes != true) | " - \(.id): \(.title)"' "$PRD_FILE"
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
function hello(name) {
|
|
||||||
return `Hello, ${name.toLowerCase()}!`;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { hello };
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# PRD: Hello Ralph Workflow Test
|
|
||||||
|
|
||||||
## 1. Introducere
|
|
||||||
Proiect minimal pentru testare workflow Ralph: PRD → Stories → Implementare automată
|
|
||||||
|
|
||||||
## 2. Obiective
|
|
||||||
### Obiectiv Principal
|
|
||||||
- Validare completă workflow Ralph pe moltbot
|
|
||||||
|
|
||||||
### Metrici de Succes
|
|
||||||
- PRD generat corect
|
|
||||||
- Stories executate automat de Ralph (Sonnet)
|
|
||||||
- Code commits cu quality checks
|
|
||||||
|
|
||||||
## 3. User Stories
|
|
||||||
|
|
||||||
### US-001: Setup proiect Node.js
|
|
||||||
**Ca** developer
|
|
||||||
**Vreau** un proiect Node.js minimal cu package.json
|
|
||||||
**Pentru că** validez că Ralph poate initializa proiecte
|
|
||||||
|
|
||||||
**Acceptance Criteria:**
|
|
||||||
- package.json există cu name="hello-ralph-test", version="1.0.0"
|
|
||||||
- README.md există cu descriere proiect
|
|
||||||
- .gitignore există cu node_modules/
|
|
||||||
|
|
||||||
### US-002: Funcție hello simpla
|
|
||||||
**Ca** user
|
|
||||||
**Vreau** o funcție hello(name) care returnează salut
|
|
||||||
**Pentru că** validez că Ralph poate scrie cod funcțional
|
|
||||||
|
|
||||||
**Acceptance Criteria:**
|
|
||||||
- src/hello.js există
|
|
||||||
- Funcție hello(name) returnează "Hello, {name}!"
|
|
||||||
- Exportată ca module.exports = { hello }
|
|
||||||
- Funcția trimite toLowerCase pe name
|
|
||||||
|
|
||||||
### US-003: Test pentru hello
|
|
||||||
**Ca** developer
|
|
||||||
**Vreau** un test simplu pentru funcția hello
|
|
||||||
**Pentru că** validez quality checks Ralph
|
|
||||||
|
|
||||||
**Acceptance Criteria:**
|
|
||||||
- package.json include "test" script și dev dependency jest
|
|
||||||
- tests/hello.test.js există
|
|
||||||
- Test verifică hello("World") === "Hello, world!"
|
|
||||||
- npm test passes
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
const { hello } = require('../src/hello');
|
|
||||||
|
|
||||||
test('hello("World") returns "Hello, world!"', () => {
|
|
||||||
expect(hello('World')).toBe('Hello, world!');
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user