feat(epic-1): complete resume data foundation - types, data, and composable

Epic 1: Resume Data & Types - All Stories Complete

Story 1.1: Create Resume TypeScript Interfaces 
- Add Resume, ResumeBasics, WorkExperience, Education, Skill, Language, Certification interfaces
- File: app/types/resume.ts
- All interfaces exported with proper TypeScript types
- Date fields use YYYY-MM string format

Story 1.2: Create Sample Resume Data File 
- Add sample resume data with Ali Arghyani profile
- File: app/data/resume.en.ts
- Includes: basics, work (2), education (1), skills (2), languages (2)
- Data independent from portfolio data

Story 1.3: Create Resume Data Composable 
- Add useResumeData composable for reactive data access
- File: app/composables/useResumeData.ts
- Exports: resume ref, formatDate(), getFullName(), getPdfFilename()
- Proper JSDoc documentation

Files Added:
- app/types/resume.ts
- app/data/resume.en.ts
- app/composables/useResumeData.ts
- docs/sprint-artifacts/1-1-create-resume-typescript-interfaces.md
- docs/sprint-artifacts/1-1-create-resume-typescript-interfaces.context.xml
- docs/sprint-artifacts/1-2-create-sample-resume-data-file.md
- docs/sprint-artifacts/1-2-create-sample-resume-data-file.context.xml
- docs/sprint-artifacts/1-3-create-resume-data-composable.md
- docs/sprint-artifacts/1-3-create-resume-data-composable.context.xml

Files Modified:
- docs/sprint-artifacts/sprint-status.yaml (stories 1.1-1.3: backlog → done)

All stories reviewed and approved. Epic 1 complete - data foundation ready for Epic 2 (Resume Preview Page).
This commit is contained in:
mahdiarghyani
2025-11-30 15:06:20 +03:30
parent 1586bb7f80
commit a492b0ba05
9 changed files with 1014 additions and 53 deletions
@@ -0,0 +1,209 @@
# Story 1.2: Create Sample Resume Data File
Status: done
## Story
As a **developer**,
I want **a sample resume data file with realistic content**,
so that **I can test the preview and PDF generation with real data**.
## Acceptance Criteria
| AC ID | Criteria | Testable |
|-------|----------|----------|
| AC-1 | File exists at `app/data/resume.en.ts` | ✓ |
| AC-2 | Exports `resumeData` of type `Resume` | ✓ |
| AC-3 | Contains full name and job title in `basics` | ✓ |
| AC-4 | Contains contact info (email, phone, location) in `basics` | ✓ |
| AC-5 | Contains at least 2 social profiles with icons (LinkedIn, GitHub) | ✓ |
| AC-6 | Contains professional summary (2-3 sentences) | ✓ |
| AC-7 | Contains at least 2 work experiences with 3+ highlights each | ✓ |
| AC-8 | Contains at least 1 education entry | ✓ |
| AC-9 | Contains at least 2 skill categories with 4+ keywords each | ✓ |
| AC-10 | Contains at least 2 languages | ✓ |
| AC-11 | Data is independent from portfolio data | ✓ |
## Tasks / Subtasks
- [x] **Task 1: Create data file** (AC: 1)
- [x] Create `app/data/resume.en.ts` file
- [x] Add file header comment
- [x] **Task 2: Import Resume type** (AC: 2)
- [x] Import `Resume` type from `~/types/resume`
- [x] Export `resumeData` constant with type annotation
- [x] **Task 3: Define basics section** (AC: 3, 4, 5, 6)
- [x] Add `name: string` (Ali Arghyani)
- [x] Add `label: string` (Senior Frontend Developer)
- [x] Add `email: string`
- [x] Add `phone: string`
- [x] Add `location: { city, country }`
- [x] Add `profiles` array with LinkedIn and GitHub (with icons)
- [x] Add `summary` (2-3 sentences)
- [x] **Task 4: Define work experience** (AC: 7)
- [x] Add at least 2 work entries
- [x] Each entry has company, position, startDate, endDate?
- [x] Each entry has 3+ highlights
- [x] **Task 5: Define education** (AC: 8)
- [x] Add at least 1 education entry
- [x] Include institution, area, studyType, dates
- [x] **Task 6: Define skills** (AC: 9)
- [x] Add at least 2 skill categories
- [x] Each category has 4+ keywords
- [x] **Task 7: Define languages** (AC: 10)
- [x] Add at least 2 languages
- [x] Use fluency union type values
- [x] **Task 8: Verify TypeScript compilation** (AC: 1-11)
- [x] Run `pnpm typecheck` or build to verify no errors
- [x] Verify data imports correctly
## Dev Notes
### Architecture Alignment
- **Schema:** Must conform to `Resume` interface from Story 1.1
- **Location:** `app/data/` follows Nuxt 4 convention for data files
- **Naming:** `resume.en.ts` supports future i18n extension (resume.fa.ts)
- **Independence:** Data must be separate from existing `portfolio.en.ts`
### Key Constraints
- Date format: YYYY-MM string (e.g., "2022-01")
- Use "Present" concept via undefined `endDate` for current positions
- Iconify icon names for profiles: `i-mdi-linkedin`, `i-mdi-github`
- Fluency values: `'Native' | 'Fluent' | 'Intermediate' | 'Basic'`
### Sample Data Guidelines
- Use Ali Arghyani as sample name (per Architecture doc)
- Use placeholder contact info (not real PII)
- Work experience should be realistic but fictional
- Skills should reflect frontend developer profile
### Learnings from Previous Story
**From Story 1-1-create-resume-typescript-interfaces (Status: done)**
- **Types Created:** All resume interfaces available at `app/types/resume.ts`
- **Import Pattern:** Use `import type { Resume } from '~/types/resume'`
- **Interfaces Available:** `Resume`, `ResumeBasics`, `WorkExperience`, `Education`, `Skill`, `Language`, `Certification`
- **Date Format:** All date fields are `string` type for YYYY-MM format
- **Optional Fields:** `url`, `endDate`, `languages`, `certifications` are optional
[Source: docs/sprint-artifacts/1-1-create-resume-typescript-interfaces.md#Dev-Agent-Record]
### Project Structure Notes
- File path: `app/data/resume.en.ts`
- Similar pattern to existing `app/data/portfolio.en.ts`
- Auto-imported by Nuxt (no manual import needed)
### References
- [Source: docs/architecture.md#Data-Architecture] - Sample data structure
- [Source: docs/epics.md#Story-1.2] - Acceptance criteria
- [Source: docs/sprint-artifacts/tech-spec-epic-1.md#Data-Models-and-Contracts] - Schema details
- [Source: app/types/resume.ts] - TypeScript interfaces to use
## Dev Agent Record
### Context Reference
- `docs/sprint-artifacts/1-2-create-sample-resume-data-file.context.xml`
### Agent Model Used
Claude (Kiro Dev Agent - Amelia)
### Debug Log References
- Created `app/data/resume.en.ts` with sample resume data
- Imported `Resume` type from `~/types/resume`
- All sections populated: basics, work (2), education (1), skills (2), languages (2)
- getDiagnostics: No errors found
### Completion Notes List
- ✅ Created `app/data/resume.en.ts` with header comment
- ✅ Exported `resumeData` constant with `Resume` type annotation
- ✅ basics: Ali Arghyani, Senior Frontend Developer, contact info, 2 profiles with icons, summary
- ✅ work: 2 entries (NexaPortal current, Freelance past) with 4 highlights each
- ✅ education: 1 entry (Qom University of Technology, B.Sc. Telecommunications)
- ✅ skills: 2 categories (Frontend: 5 keywords, Tools & DevOps: 5 keywords)
- ✅ languages: 2 entries (Persian Native, English Fluent)
- ✅ Data is independent from portfolio data (no imports from portfolio files)
### File List
| Action | File |
|--------|------|
| Created | `app/data/resume.en.ts` |
## Change Log
| Date | Author | Change |
|------|--------|--------|
| 2025-11-30 | SM Agent (Bob) | Initial draft created |
| 2025-11-30 | Dev Agent (Amelia) | Implemented all tasks - created sample resume data file |
| 2025-11-30 | Senior Dev Review (AI) | Code review completed - APPROVED |
---
## Senior Developer Review (AI)
### Review Metadata
- **Reviewer:** mahdi
- **Date:** 2025-11-30
- **Outcome:** ✅ **APPROVE**
### Summary
All 11 acceptance criteria are fully implemented. All 8 tasks verified with evidence. Data conforms to Resume interface, is independent from portfolio data, and follows project patterns.
### Acceptance Criteria Coverage
| AC# | Description | Status | Evidence |
|-----|-------------|--------|----------|
| AC-1 | File exists at app/data/resume.en.ts | ✅ | File exists |
| AC-2 | Exports resumeData of type Resume | ✅ | `resume.en.ts:9` |
| AC-3 | Contains full name and job title | ✅ | `resume.en.ts:11-12` |
| AC-4 | Contains contact info | ✅ | `resume.en.ts:13-19` |
| AC-5 | Contains 2+ social profiles with icons | ✅ | `resume.en.ts:20-31` |
| AC-6 | Contains professional summary | ✅ | `resume.en.ts:32-33` |
| AC-7 | Contains 2+ work experiences with 3+ highlights | ✅ | `resume.en.ts:36-57` |
| AC-8 | Contains 1+ education entry | ✅ | `resume.en.ts:58-65` |
| AC-9 | Contains 2+ skill categories with 4+ keywords | ✅ | `resume.en.ts:66-73` |
| AC-10 | Contains 2+ languages | ✅ | `resume.en.ts:74-83` |
| AC-11 | Data independent from portfolio | ✅ | No portfolio imports |
**Summary: 11 of 11 ACs implemented**
### Task Completion Validation
| Task | Marked | Verified | Evidence |
|------|--------|----------|----------|
| Task 1-8 | [x] | ✅ | All verified with file evidence |
**Summary: 8 of 8 tasks verified, 0 false completions**
### Architectural Alignment
- ✅ Conforms to Resume interface from app/types/resume.ts
- ✅ File location follows Nuxt 4 convention (app/data/)
- ✅ Naming supports i18n extension (resume.en.ts)
- ✅ Independent from portfolio data
### Test Coverage
- TypeScript compiler validates data structure
- getDiagnostics: No errors
### Security Notes
- ✅ Uses placeholder contact info (not real PII)
### Action Items
- Note: No action items required - implementation is complete and correct