Files
portfolio/docs/sprint-artifacts/tech-spec-epic-1.md
T
mahdiarghyani 1586bb7f80 chore: add BMAD agent workflows and configuration system
- Add comprehensive agent workflow definitions for 8 specialized roles (analyst, architect, developer, product manager, scrum master, technical writer, UX designer, QA engineer)
- Add 35+ workflow definitions covering analysis, planning, solutioning, and implementation phases
- Add BMAD configuration system with agent, task, tool, workflow, and file manifests
- Add BMM (Business Model Methodology) documentation including quick-start guides, architecture references, and workflow analysis
- Add test architecture knowledge base with 20+ testing patterns and best practices
- Add team configuration templates and party mode setup for collaborative development
- Establish foundation for enterprise agentic development framework with adaptive scaling capabilities
2025-11-30 14:36:05 +03:30

289 lines
8.9 KiB
Markdown

# Epic Technical Specification: Resume Data & Types
Date: 2025-11-30
Author: mahdi
Epic ID: 1
Status: Draft
---
## Overview
Epic 1 establishes the data foundation for the Resume Export feature. This epic creates TypeScript interfaces based on the JSON Resume schema (modified), implements a sample resume data file with realistic content, and provides a composable for reactive data access throughout the application.
This is a foundational epic with no UI components - it provides the typed data layer that Epic 2 (Preview Page) and Epic 3 (PDF Export) will consume.
## Objectives and Scope
### In Scope
- TypeScript interfaces for all resume sections (basics, work, education, skills, languages, certifications)
- Sample resume data file with Ali Arghyani's information
- Composable for data access with helper functions (date formatting, filename generation)
- Type exports for use in Vue components
### Out of Scope
- UI components (Epic 2)
- PDF generation (Epic 3)
- Persian language resume data (Growth feature)
- Database storage (file-based only)
- API endpoints for resume data
## System Architecture Alignment
### Components Referenced
| Component | Purpose | Architecture Section |
|-----------|---------|---------------------|
| `app/types/resume.ts` | TypeScript interfaces | Data Architecture |
| `app/data/resume.en.ts` | English resume data | Data Architecture |
| `app/composables/useResumeData.ts` | Data access layer | Implementation Patterns |
### Constraints
- Must follow JSON Resume schema (modified) as defined in Architecture doc
- Data must be independent from existing portfolio data
- Must support future language extension (file naming: `resume.{locale}.ts`)
- Must use existing project patterns (composables, TypeScript strict mode)
## Detailed Design
### Services and Modules
| Module | Responsibility | Inputs | Outputs |
|--------|---------------|--------|---------|
| `types/resume.ts` | Type definitions | None | TypeScript interfaces |
| `data/resume.en.ts` | Data storage | None | `Resume` object |
| `composables/useResumeData.ts` | Data access | None | Reactive refs + helpers |
### Data Models and Contracts
```typescript
// app/types/resume.ts
export interface ResumeBasics {
name: string
label: string // Job title
email: string
phone: string
url?: string
location: {
city: string
country: string
}
profiles: Array<{
network: string // LinkedIn, GitHub, etc.
url: string
icon?: string // Iconify icon name
}>
summary: string
}
export interface WorkExperience {
company: string
position: string
startDate: string // YYYY-MM format
endDate?: string // YYYY-MM or undefined for "Present"
highlights: string[] // Bullet points
}
export interface Education {
institution: string
area: string // Field of study
studyType: string // Degree type
startDate: string
endDate?: string
}
export interface Skill {
name: string // Category name
keywords: string[] // Individual skills
}
export interface Language {
language: string
fluency: 'Native' | 'Fluent' | 'Intermediate' | 'Basic'
}
export interface Certification {
name: string
issuer: string
date: string
}
export interface Resume {
basics: ResumeBasics
work: WorkExperience[]
education: Education[]
skills: Skill[]
languages?: Language[]
certifications?: Certification[]
}
```
### APIs and Interfaces
**Composable Interface:**
```typescript
// app/composables/useResumeData.ts
export function useResumeData() {
// Returns:
resume: ComputedRef<Resume> // Reactive resume data
formatDate(date: string): string // "2023-01" → "Jan 2023"
getFullName(): string // "Ali Arghyani"
getPdfFilename(): string // "Ali_Arghyani_Resume.pdf"
}
```
### Workflows and Sequencing
```
Story 1.1: Create Types
Story 1.2: Create Sample Data (imports types)
Story 1.3: Create Composable (imports data)
Epic 2: Preview Components (uses composable)
```
## Non-Functional Requirements
### Performance
| Metric | Target | Rationale |
|--------|--------|-----------|
| Type checking | < 1s | Part of build process |
| Data import | Instant | Static import, no async |
| Composable init | < 1ms | Simple computed refs |
### Security
- No PII in committed code (sample data uses placeholder info)
- Resume data is read-only (no mutations)
- No external API calls for data
### Reliability/Availability
- Static data - 100% availability
- No runtime dependencies
- TypeScript ensures compile-time safety
### Observability
- TypeScript errors surface at build time
- No runtime logging needed for data layer
## Dependencies and Integrations
### Existing Dependencies (No new packages required)
| Package | Version | Purpose |
|---------|---------|---------|
| typescript | ^5.9.x | Type definitions |
| vue | ^3.5.x | Composable reactivity |
| nuxt | ^4.1.x | Auto-imports |
### Integration Points
| Integration | Direction | Notes |
|-------------|-----------|-------|
| Epic 2 Components | Downstream | Components consume `useResumeData()` |
| Epic 3 PDF API | Downstream | API uses data for filename |
## Acceptance Criteria (Authoritative)
### Story 1.1: Create Resume TypeScript Interfaces
| AC ID | Criteria | Testable |
|-------|----------|----------|
| AC-1.1.1 | File exists at `app/types/resume.ts` | ✓ |
| AC-1.1.2 | `ResumeBasics` interface includes: name, label, email, phone, url?, location, profiles, summary | ✓ |
| AC-1.1.3 | `WorkExperience` interface includes: company, position, startDate, endDate?, highlights | ✓ |
| AC-1.1.4 | `Education` interface includes: institution, area, studyType, startDate, endDate? | ✓ |
| AC-1.1.5 | `Skill` interface includes: name, keywords[] | ✓ |
| AC-1.1.6 | `Language` interface includes: language, fluency (union type) | ✓ |
| AC-1.1.7 | `Certification` interface includes: name, issuer, date | ✓ |
| AC-1.1.8 | `Resume` interface combines all above with optional languages/certifications | ✓ |
| AC-1.1.9 | All date fields use YYYY-MM string format | ✓ |
| AC-1.1.10 | All interfaces are exported | ✓ |
### Story 1.2: Create Sample Resume Data File
| AC ID | Criteria | Testable |
|-------|----------|----------|
| AC-1.2.1 | File exists at `app/data/resume.en.ts` | ✓ |
| AC-1.2.2 | Exports `resumeData` of type `Resume` | ✓ |
| AC-1.2.3 | Contains full name and job title | ✓ |
| AC-1.2.4 | Contains contact info (email, phone, location) | ✓ |
| AC-1.2.5 | Contains at least 2 social profiles with icons | ✓ |
| AC-1.2.6 | Contains professional summary (2-3 sentences) | ✓ |
| AC-1.2.7 | Contains at least 2 work experiences with 3+ highlights each | ✓ |
| AC-1.2.8 | Contains at least 1 education entry | ✓ |
| AC-1.2.9 | Contains at least 2 skill categories with 4+ keywords each | ✓ |
| AC-1.2.10 | Contains at least 2 languages | ✓ |
| AC-1.2.11 | Data is independent from portfolio data | ✓ |
### Story 1.3: Create Resume Data Composable
| AC ID | Criteria | Testable |
|-------|----------|----------|
| AC-1.3.1 | File exists at `app/composables/useResumeData.ts` | ✓ |
| AC-1.3.2 | Exports `useResumeData()` function | ✓ |
| AC-1.3.3 | Returns `resume` as reactive reference | ✓ |
| AC-1.3.4 | Returns `formatDate()` that converts "2023-01" to "Jan 2023" | ✓ |
| AC-1.3.5 | Returns `getFullName()` that returns full name | ✓ |
| AC-1.3.6 | Returns `getPdfFilename()` that returns "FirstName_LastName_Resume.pdf" | ✓ |
## Traceability Mapping
| AC | FR | Spec Section | Component | Test Idea |
|----|-----|--------------|-----------|-----------|
| AC-1.1.1-10 | FR1, FR2 | Data Models | `types/resume.ts` | TypeScript compilation |
| AC-1.2.1-11 | FR1, FR2, FR3, FR4 | Data Models | `data/resume.en.ts` | Type check + content validation |
| AC-1.3.1-6 | FR1 | APIs/Interfaces | `composables/useResumeData.ts` | Unit test composable |
## Risks, Assumptions, Open Questions
### Risks
| Risk | Impact | Mitigation |
|------|--------|------------|
| Sample data doesn't match real user needs | Low | Easy to modify file |
| Type changes break downstream | Medium | Strict typing catches at compile |
### Assumptions
- Developer will replace sample data with real resume content
- English locale is sufficient for MVP
- JSON Resume schema modifications are acceptable
### Open Questions
- None - Epic 1 is well-defined
## Test Strategy Summary
### Test Levels
| Level | Scope | Approach |
|-------|-------|----------|
| Static | Types | TypeScript compiler |
| Unit | Composable | Vitest (if needed) |
| Integration | Data flow | Manual verification |
### Coverage
- All interfaces compile without errors
- Sample data passes type checking
- Composable functions return expected values
### Edge Cases
- Empty arrays (work, education, skills)
- Missing optional fields (url, endDate, certifications)
- Date formatting edge cases (invalid format)