mirror of
https://github.com/mmahdium/portfolio.git
synced 2026-08-17 05:24:30 +03:30
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:
@@ -0,0 +1,152 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<story-context id="story-1-2-context" v="1.0">
|
||||
<metadata>
|
||||
<epicId>1</epicId>
|
||||
<storyId>2</storyId>
|
||||
<title>Create Sample Resume Data File</title>
|
||||
<status>ready-for-dev</status>
|
||||
<generatedAt>2025-11-30</generatedAt>
|
||||
<generator>BMAD Story Context Workflow</generator>
|
||||
<sourceStoryPath>docs/sprint-artifacts/1-2-create-sample-resume-data-file.md</sourceStoryPath>
|
||||
</metadata>
|
||||
|
||||
<story>
|
||||
<asA>developer</asA>
|
||||
<iWant>a sample resume data file with realistic content</iWant>
|
||||
<soThat>I can test the preview and PDF generation with real data</soThat>
|
||||
<tasks>
|
||||
<task id="1" ac="1">Create app/data/resume.en.ts file with header comment</task>
|
||||
<task id="2" ac="2">Import Resume type and export resumeData constant</task>
|
||||
<task id="3" ac="3,4,5,6">Define basics section (name, label, email, phone, location, profiles, summary)</task>
|
||||
<task id="4" ac="7">Define work experience (2+ entries, 3+ highlights each)</task>
|
||||
<task id="5" ac="8">Define education (1+ entry)</task>
|
||||
<task id="6" ac="9">Define skills (2+ categories, 4+ keywords each)</task>
|
||||
<task id="7" ac="10">Define languages (2+ entries)</task>
|
||||
<task id="8" ac="1-11">Verify TypeScript compilation</task>
|
||||
</tasks>
|
||||
</story>
|
||||
|
||||
<acceptanceCriteria>
|
||||
<criterion id="AC-1">File exists at app/data/resume.en.ts</criterion>
|
||||
<criterion id="AC-2">Exports resumeData of type Resume</criterion>
|
||||
<criterion id="AC-3">Contains full name and job title in basics</criterion>
|
||||
<criterion id="AC-4">Contains contact info (email, phone, location) in basics</criterion>
|
||||
<criterion id="AC-5">Contains at least 2 social profiles with icons (LinkedIn, GitHub)</criterion>
|
||||
<criterion id="AC-6">Contains professional summary (2-3 sentences)</criterion>
|
||||
<criterion id="AC-7">Contains at least 2 work experiences with 3+ highlights each</criterion>
|
||||
<criterion id="AC-8">Contains at least 1 education entry</criterion>
|
||||
<criterion id="AC-9">Contains at least 2 skill categories with 4+ keywords each</criterion>
|
||||
<criterion id="AC-10">Contains at least 2 languages</criterion>
|
||||
<criterion id="AC-11">Data is independent from portfolio data</criterion>
|
||||
</acceptanceCriteria>
|
||||
|
||||
<artifacts>
|
||||
<docs>
|
||||
<doc>
|
||||
<path>docs/architecture.md</path>
|
||||
<title>Resume Export Feature - Architecture Document</title>
|
||||
<section>Data Architecture - Sample Data Structure</section>
|
||||
<snippet>Defines sample resume data structure with Ali Arghyani as sample name. Includes basics, work, education, skills, languages sections.</snippet>
|
||||
</doc>
|
||||
<doc>
|
||||
<path>docs/epics.md</path>
|
||||
<title>Resume Export Feature - Epic Breakdown</title>
|
||||
<section>Story 1.2: Create Sample Resume Data File</section>
|
||||
<snippet>Acceptance criteria for sample data including realistic content requirements and independence from portfolio data.</snippet>
|
||||
</doc>
|
||||
<doc>
|
||||
<path>docs/sprint-artifacts/tech-spec-epic-1.md</path>
|
||||
<title>Epic Technical Specification: Resume Data and Types</title>
|
||||
<section>Data Models and Contracts</section>
|
||||
<snippet>Complete data structure examples with sample values for all resume sections.</snippet>
|
||||
</doc>
|
||||
<doc>
|
||||
<path>docs/prd.md</path>
|
||||
<title>nuxt-portfolio - Product Requirements Document</title>
|
||||
<section>Functional Requirements FR1-4</section>
|
||||
<snippet>FR1: System stores resume data in dedicated file. FR3: Resume data is independent from portfolio data.</snippet>
|
||||
</doc>
|
||||
</docs>
|
||||
<code>
|
||||
<file>
|
||||
<path>app/types/resume.ts</path>
|
||||
<kind>types</kind>
|
||||
<symbol>Resume, ResumeBasics, WorkExperience, Education, Skill, Language, Certification</symbol>
|
||||
<reason>MUST import Resume type from this file. Created in Story 1.1.</reason>
|
||||
</file>
|
||||
<file>
|
||||
<path>app/data/portfolio.ts</path>
|
||||
<kind>data</kind>
|
||||
<symbol>portfolio</symbol>
|
||||
<reason>Reference for data file pattern. Resume data should follow similar structure but be INDEPENDENT.</reason>
|
||||
</file>
|
||||
<file>
|
||||
<path>app/data/portfolio.en.ts</path>
|
||||
<kind>data</kind>
|
||||
<symbol>default export</symbol>
|
||||
<reason>Reference for locale-specific data file naming pattern (resume.en.ts).</reason>
|
||||
</file>
|
||||
</code>
|
||||
<dependencies>
|
||||
<node>
|
||||
<package>typescript</package>
|
||||
<version>^5.9.x</version>
|
||||
<purpose>Type checking for data file</purpose>
|
||||
</node>
|
||||
<node>
|
||||
<package>nuxt</package>
|
||||
<version>^4.1.3</version>
|
||||
<purpose>Auto-imports data from app/data/</purpose>
|
||||
</node>
|
||||
</dependencies>
|
||||
</artifacts>
|
||||
|
||||
<constraints>
|
||||
<constraint type="schema">Data must conform to Resume interface from app/types/resume.ts</constraint>
|
||||
<constraint type="format">Date fields must use YYYY-MM string format (e.g., "2022-01")</constraint>
|
||||
<constraint type="independence">Resume data must be independent from portfolio data (FR3)</constraint>
|
||||
<constraint type="extension">File naming supports future i18n (resume.en.ts, resume.fa.ts)</constraint>
|
||||
<constraint type="location">File must be at app/data/resume.en.ts</constraint>
|
||||
<constraint type="icons">Use Iconify icon names for profiles: i-mdi-linkedin, i-mdi-github</constraint>
|
||||
<constraint type="fluency">Language fluency must use union type: 'Native' | 'Fluent' | 'Intermediate' | 'Basic'</constraint>
|
||||
<constraint type="sample">Use Ali Arghyani as sample name per Architecture doc</constraint>
|
||||
</constraints>
|
||||
|
||||
<interfaces>
|
||||
<interface>
|
||||
<name>Resume</name>
|
||||
<kind>TypeScript interface</kind>
|
||||
<signature>
|
||||
interface Resume {
|
||||
basics: ResumeBasics
|
||||
work: WorkExperience[]
|
||||
education: Education[]
|
||||
skills: Skill[]
|
||||
languages?: Language[]
|
||||
certifications?: Certification[]
|
||||
}
|
||||
</signature>
|
||||
<path>app/types/resume.ts</path>
|
||||
</interface>
|
||||
<interface>
|
||||
<name>resumeData export</name>
|
||||
<kind>TypeScript const export</kind>
|
||||
<signature>export const resumeData: Resume = { ... }</signature>
|
||||
<path>app/data/resume.en.ts (to be created)</path>
|
||||
</interface>
|
||||
</interfaces>
|
||||
|
||||
<tests>
|
||||
<standards>TypeScript compiler validates data structure at build time. No runtime tests needed for static data. Use pnpm typecheck or pnpm build to verify compilation.</standards>
|
||||
<locations>
|
||||
<location>TypeScript compilation (pnpm typecheck)</location>
|
||||
<location>Build process (pnpm build)</location>
|
||||
</locations>
|
||||
<ideas>
|
||||
<idea ac="AC-1">Verify file exists after creation</idea>
|
||||
<idea ac="AC-2">TypeScript compiler validates type annotation</idea>
|
||||
<idea ac="AC-3-10">Manual review of data content completeness</idea>
|
||||
<idea ac="AC-11">Verify no imports from portfolio data files</idea>
|
||||
</ideas>
|
||||
</tests>
|
||||
</story-context>
|
||||
Reference in New Issue
Block a user