Files
Spanish/Conjuga/project.yml
T
Trey T 7da98d786c Vocab study — noun & adjective flashcards with CEFR level toggles
Add SRS-driven noun and adjective flashcards modeled on the existing verb
flashcard flow:

- SharedModels/Lexeme — catalog of non-verb vocab, frequency-ranked, with
  gender for nouns and optional example sentences. Seeded from a bundled
  vocab_lexemes.json built by Scripts/vocab/build_lexemes.py, which joins
  frequency.csv + es-en.data from a pinned doozan/spanish_data commit
  (CC-BY-SA: hermitdave/FrequencyWords + Wiktionary). 1,449 nouns and 600
  adjectives, each with Wiktionary-sourced gender and (where available)
  an example sentence with English translation.
- LexemeReviewCard + LexemeReviewStore — cloud-synced SM-2 SRS, keyed by
  partOfSpeech + lexemeId + drillMode so future drill modes can coexist.
- LexemeSessionQueue + LexemePool — parallel to VocabSessionQueue; fresh
  cards sort by frequency rank.
- LexemeStudyGroup — cloud-synced resumable session per
  (partOfSpeech, drillMode).
- NounFlashcardPracticeView + AdjectiveFlashcardPracticeView — same flow
  as VocabFlashcardPracticeView: English prompt → tap to reveal Spanish
  → Again/Hard/Good/Easy. Nouns reveal with their article (la taza, el
  problema) so gender is taught alongside meaning, not as a separate
  quiz. Example sentence shown when present.

CEFR-style level toggles:
- LexemeLevel enum (A1/A2/B1/B2/C1+) derived from frequencyRank with
  standard Spanish-frequency-dictionary cutoffs (250/500/1000/2000).
- UserProgress.selectedLexemeLevels — cloud-synced multi-select, defaults
  to A1+A2 on first launch.
- SettingsView gains a "Vocabulary Levels" section with five toggles; the
  existing "Levels" section is renamed "Verb Levels" for clarity.
- Due SRS cards always surface regardless of toggles. Disabling a level
  only stops new cards from that band entering the pool.

PracticeView gets "Nouns" and "Adjectives" rows under "Books".

DataLoader: new lexemeDataVersion gate that re-seeds the Lexeme table
from vocab_lexemes.json independent of book seeding. project.yml lists
the new JSON resource and the existing book_olly-vol2.json (which the
previous build was silently excluding because xcodegen rewrote the
project from project.yml).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 20:16:55 -05:00

120 lines
3.2 KiB
YAML

name: Conjuga
options:
bundleIdPrefix: com.conjuga
deploymentTarget:
iOS: "26.0"
xcodeVersion: "26.0"
schemePathPrefix: ""
generateEmptyDirectories: true
schemes:
Conjuga:
build:
targets:
Conjuga: all
ConjugaWidgetExtension: all
run:
config: Debug
executable: Conjuga
test:
config: Debug
profile:
config: Release
analyze:
config: Debug
archive:
config: Release
packages:
SharedModels:
path: SharedModels
YouTubeKit:
url: https://github.com/alexeichhorn/YouTubeKit.git
from: 0.3.0
settings:
base:
SWIFT_VERSION: "6.0"
CURRENT_PROJECT_VERSION: 1
MARKETING_VERSION: 1.0.0
targets:
Conjuga:
type: application
platform: iOS
sources:
- path: Conjuga
excludes:
- "*.json"
- path: Conjuga/conjuga_data.json
buildPhase: resources
- path: Conjuga/course_data.json
buildPhase: resources
- path: Conjuga/reflexive_verbs.json
buildPhase: resources
- path: Conjuga/youtube_videos.json
buildPhase: resources
- path: Conjuga/textbook_data.json
buildPhase: resources
- path: Conjuga/textbook_vocab.json
buildPhase: resources
- path: Conjuga/book_olly-vol2.json
buildPhase: resources
- path: Conjuga/vocab_lexemes.json
buildPhase: resources
info:
path: Conjuga/Info.plist
properties:
CFBundleDisplayName: Conjuga
LSApplicationCategoryType: public.app-category.education
UILaunchScreen: {}
UIBackgroundModes:
- fetch
- remote-notification
BGTaskSchedulerPermittedIdentifiers:
- com.conjuga.app.refresh
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
UISupportedInterfaceOrientations~ipad:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.conjuga.app
CODE_SIGN_ENTITLEMENTS: Conjuga/Conjuga.entitlements
SWIFT_STRICT_CONCURRENCY: complete
ENABLE_DEBUG_DYLIB: NO
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
TARGETED_DEVICE_FAMILY: "1,2"
DEVELOPMENT_TEAM: V3PF3M6B6U
CODE_SIGN_STYLE: Automatic
dependencies:
- target: ConjugaWidgetExtension
- package: SharedModels
- package: YouTubeKit
ConjugaWidgetExtension:
type: app-extension
platform: iOS
sources:
- path: ConjugaWidget
info:
path: ConjugaWidget/Info.plist
properties:
CFBundleDisplayName: Conjuga Widget
NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.conjuga.app.widget
CODE_SIGN_ENTITLEMENTS: ConjugaWidget/ConjugaWidget.entitlements
DEVELOPMENT_TEAM: V3PF3M6B6U
CODE_SIGN_STYLE: Automatic
SWIFT_STRICT_CONCURRENCY: complete
TARGETED_DEVICE_FAMILY: "1,2"
ENABLE_DEBUG_DYLIB: NO
dependencies:
- package: SharedModels