Document instrument selector requirement
This commit is contained in:
@@ -0,0 +1,68 @@
|
|||||||
|
# Agent Guide
|
||||||
|
|
||||||
|
This file is the permanent operating guide for any coding agent working on this
|
||||||
|
project.
|
||||||
|
|
||||||
|
## Project Scope
|
||||||
|
|
||||||
|
- This project is a native macOS application.
|
||||||
|
- The minimum deployment target is macOS 14.0.
|
||||||
|
- Use Swift and SwiftUI according to the architecture documented for this
|
||||||
|
project.
|
||||||
|
- Do not invent undocumented features or requirements.
|
||||||
|
- Any substantial change to the architecture or product scope must be documented
|
||||||
|
before implementation.
|
||||||
|
|
||||||
|
## Required Reading
|
||||||
|
|
||||||
|
Before making significant changes, read:
|
||||||
|
|
||||||
|
- `docs/PRODUCT.md`
|
||||||
|
- `docs/ARCHITECTURE.md`
|
||||||
|
- `docs/DATA_MODEL.md`
|
||||||
|
- `docs/TASKS.md`
|
||||||
|
- `docs/OPEN_QUESTIONS.md`
|
||||||
|
|
||||||
|
Use these documents as the project references:
|
||||||
|
|
||||||
|
- `docs/PRODUCT.md` is the source of truth for product requirements.
|
||||||
|
- `docs/ARCHITECTURE.md` is the reference for architecture decisions.
|
||||||
|
- `docs/DATA_MODEL.md` is the reference for data models.
|
||||||
|
- `docs/TASKS.md` is the reference for implementation phases and tasks.
|
||||||
|
- `docs/OPEN_QUESTIONS.md` contains decisions that are not resolved yet.
|
||||||
|
|
||||||
|
## Decision Rules
|
||||||
|
|
||||||
|
- If documents conflict, do not guess. State the conflict before making a
|
||||||
|
decision.
|
||||||
|
- Do not decide anything listed in `docs/OPEN_QUESTIONS.md` on your own.
|
||||||
|
- Do not automatically move to a new phase in `docs/TASKS.md` unless explicitly
|
||||||
|
asked.
|
||||||
|
- Update `docs/TASKS.md` when tasks are completed.
|
||||||
|
- Preserve version history and the Song Project concept as documented.
|
||||||
|
|
||||||
|
## Code Standards
|
||||||
|
|
||||||
|
- Write organized code that is maintainable and extensible.
|
||||||
|
- Keep clear separation between UI, Models, Services, Persistence, and
|
||||||
|
Integrations.
|
||||||
|
- Keep OpenAI, instrument catalog/selector, and Suno integrations separated from
|
||||||
|
UI logic as much as possible.
|
||||||
|
- In the current scope, Suno handoff fills the fields only and does not press
|
||||||
|
Generate.
|
||||||
|
- Do not modify files outside the task scope without a clear reason.
|
||||||
|
- Do not perform a broad refactor while implementing a small task unless it is
|
||||||
|
explicitly required.
|
||||||
|
|
||||||
|
## Secrets And Configuration
|
||||||
|
|
||||||
|
- Do not place API keys, tokens, or secrets in source code or Git.
|
||||||
|
- Read secrets only from secure environment or configuration mechanisms.
|
||||||
|
- Do not log secrets.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
- Run a build after code changes.
|
||||||
|
- Run relevant tests when they are available.
|
||||||
|
- Do not consider a task complete if the project fails to build because of new
|
||||||
|
changes.
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
# Architecture --- Initial Direction
|
||||||
|
|
||||||
|
## Principle
|
||||||
|
|
||||||
|
Keep UI, domain data, AI orchestration, external integrations and
|
||||||
|
persistence separated. Do not hard-code provider behavior into SwiftUI
|
||||||
|
views.
|
||||||
|
|
||||||
|
## Suggested Layers
|
||||||
|
|
||||||
|
``` text
|
||||||
|
macOS App
|
||||||
|
├── Presentation (SwiftUI)
|
||||||
|
├── Domain
|
||||||
|
│ ├── SongProject
|
||||||
|
│ ├── SongVersion
|
||||||
|
│ ├── Lyrics
|
||||||
|
│ ├── SongStructure
|
||||||
|
│ ├── Genre/Style
|
||||||
|
│ ├── Instrument
|
||||||
|
│ ├── Vocal
|
||||||
|
│ ├── Arrangement
|
||||||
|
│ └── MusicalParameters
|
||||||
|
├── Application Services
|
||||||
|
│ ├── AI Director
|
||||||
|
│ ├── Prompt Compiler
|
||||||
|
│ ├── Instrument Catalog
|
||||||
|
│ ├── Arabic Pronunciation Processor
|
||||||
|
│ ├── Project Versioning
|
||||||
|
│ └── Validation
|
||||||
|
├── Integrations
|
||||||
|
│ ├── OpenAI
|
||||||
|
│ └── Suno Field-Fill Integration
|
||||||
|
└── Persistence
|
||||||
|
└── Local project/version storage
|
||||||
|
```
|
||||||
|
|
||||||
|
## AI Director
|
||||||
|
|
||||||
|
OpenAI receives the user's intent plus private application rules and
|
||||||
|
structured project state. AI output should be requested as structured
|
||||||
|
data wherever possible, not treated as an unstructured chat transcript.
|
||||||
|
|
||||||
|
## Prompt Compiler
|
||||||
|
|
||||||
|
A deterministic layer converts the approved SongProject into the final
|
||||||
|
Suno-facing lyrics/style content. User choices override AI suggestions.
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
- Never commit API keys to source control.
|
||||||
|
- Keep secrets outside source code.
|
||||||
|
- Design provider clients behind protocols/interfaces so credentials
|
||||||
|
and providers can be changed later.
|
||||||
|
- Do not log secrets or full authorization headers.
|
||||||
|
|
||||||
|
## Suno Boundary
|
||||||
|
|
||||||
|
The initial requirement is browser/site handoff that fills fields but
|
||||||
|
does not press Generate. Treat this integration as replaceable because
|
||||||
|
website UI/behavior can change.
|
||||||
|
|
||||||
|
## Instrument Selector Boundary
|
||||||
|
|
||||||
|
Instrument catalog data is structured names and metadata, not SwiftUI
|
||||||
|
view code. The Presentation layer may search, filter and toggle
|
||||||
|
selections, but catalog loading, search normalization and selected
|
||||||
|
instrument state should live in Domain/Application Services and the
|
||||||
|
SongProject model.
|
||||||
|
|
||||||
|
Catalog entries should include stable ids, display names,
|
||||||
|
family/category, optional region/origin and optional aliases/search
|
||||||
|
terms. The catalog should support worldwide coverage across Western,
|
||||||
|
Middle Eastern, African, South Asian, East Asian, Southeast Asian, Latin
|
||||||
|
American, traditional, folk, orchestral, electronic and modern
|
||||||
|
instruments.
|
||||||
|
|
||||||
|
Selected instruments are part of the SongProject and must be available
|
||||||
|
to the AI Director and Prompt Compiler so they can influence
|
||||||
|
arrangement, roles, entry/exit timing, relevant structure decisions and
|
||||||
|
the Suno Style Prompt.
|
||||||
|
|
||||||
|
The current architecture does not include instrument images, audio
|
||||||
|
previews, sound samples, playback, Freesound, an Instrument API or
|
||||||
|
external API calls for instrument data.
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
# Song Project --- Draft Data Model
|
||||||
|
|
||||||
|
This schema is intentionally provider-neutral and should evolve before
|
||||||
|
implementation is locked.
|
||||||
|
|
||||||
|
``` text
|
||||||
|
SongProject
|
||||||
|
- id
|
||||||
|
- title
|
||||||
|
- idea
|
||||||
|
- duration
|
||||||
|
- conversationMode: auto | discuss
|
||||||
|
- languages[]
|
||||||
|
- dialects[]
|
||||||
|
- arabicPronunciationSettings
|
||||||
|
- genres[]
|
||||||
|
- moods[]
|
||||||
|
- emotionalArc[]
|
||||||
|
- bpm
|
||||||
|
- key
|
||||||
|
- scale
|
||||||
|
- maqam
|
||||||
|
- sections[]
|
||||||
|
- instruments[]
|
||||||
|
- vocalists[]
|
||||||
|
- lyrics
|
||||||
|
- productionDirections[]
|
||||||
|
- sunoOutput
|
||||||
|
- versions[]
|
||||||
|
- createdAt
|
||||||
|
- updatedAt
|
||||||
|
|
||||||
|
InstrumentCatalogItem
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- familyCategory
|
||||||
|
- regionOrigin (optional)
|
||||||
|
- aliases[]
|
||||||
|
- searchTerms[]
|
||||||
|
|
||||||
|
SongSection
|
||||||
|
- id
|
||||||
|
- type (intro, verse, preChorus, chorus, bridge, outro, custom)
|
||||||
|
- title
|
||||||
|
- startTime
|
||||||
|
- endTime
|
||||||
|
- lyrics
|
||||||
|
- emotion
|
||||||
|
- energy
|
||||||
|
- vocalDirection
|
||||||
|
- productionDirection
|
||||||
|
|
||||||
|
InstrumentTrack
|
||||||
|
- instrumentId
|
||||||
|
- selected
|
||||||
|
- variant
|
||||||
|
- playingStyle
|
||||||
|
- role
|
||||||
|
- autoArrangementEnabled
|
||||||
|
- placements[]
|
||||||
|
|
||||||
|
InstrumentPlacement
|
||||||
|
- sectionId (optional)
|
||||||
|
- startTime (optional)
|
||||||
|
- endTime (optional)
|
||||||
|
- direction
|
||||||
|
|
||||||
|
Vocalist
|
||||||
|
- id
|
||||||
|
- label
|
||||||
|
- voiceType
|
||||||
|
- genderSelection
|
||||||
|
- performanceStyle
|
||||||
|
- assignedSections[]
|
||||||
|
|
||||||
|
SunoOutput
|
||||||
|
- lyricsText
|
||||||
|
- stylePrompt
|
||||||
|
- additionalFields
|
||||||
|
- generatedAt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Override Rule
|
||||||
|
|
||||||
|
Explicit user values are authoritative. AI may fill missing values or
|
||||||
|
propose changes, but must not silently replace locked/manual user
|
||||||
|
choices.
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Open Questions
|
||||||
|
|
||||||
|
These items must be resolved before their dependent implementation is
|
||||||
|
finalized.
|
||||||
|
|
||||||
|
- Resolved: minimum macOS deployment target is macOS 14.0.
|
||||||
|
- Exact Swift/SwiftUI architecture conventions for the repository.
|
||||||
|
- OpenAI model(s) and API endpoint strategy.
|
||||||
|
- Exact private AI rules/system prompt.
|
||||||
|
- Complete genre/style taxonomy and whether it is curated locally or
|
||||||
|
AI-assisted.
|
||||||
|
- Complete worldwide instrument catalog taxonomy, family/category
|
||||||
|
groups, region/origin coverage, aliases/search terms and maintenance
|
||||||
|
strategy.
|
||||||
|
- Exact list of supported languages/dialects for MVP.
|
||||||
|
- Arabic diacritization policy: full tashkeel vs
|
||||||
|
pronunciation-targeted tashkeel.
|
||||||
|
- Exact Suno fields to populate and supported handoff mechanism.
|
||||||
|
- Whether Suno integration is permitted/reliable under the intended
|
||||||
|
account/workflow and current terms.
|
||||||
|
- Project storage technology and whether cloud sync is required later.
|
||||||
|
- Whether users supply their own OpenAI/API credentials or the product
|
||||||
|
owner supplies service credentials.
|
||||||
|
- Authentication/subscription/usage-limit requirements, if any.
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
# Product Definition --- AI Music Studio for macOS
|
||||||
|
|
||||||
|
## Vision
|
||||||
|
|
||||||
|
A native macOS application that helps users design a complete song
|
||||||
|
concept through a natural chat interface, using OpenAI as the planning
|
||||||
|
and writing engine, then prepares the final lyrics and style
|
||||||
|
instructions for Suno.
|
||||||
|
|
||||||
|
## Core Flow
|
||||||
|
|
||||||
|
1. User starts a new song project in a natural chat.
|
||||||
|
2. User describes the song idea and optionally selects duration,
|
||||||
|
genres/styles, instruments, vocals, language/dialect, structure and
|
||||||
|
musical parameters.
|
||||||
|
3. OpenAI applies product rules and completes missing creative details.
|
||||||
|
An optional discussion mode lets the AI ask the user before making
|
||||||
|
decisions.
|
||||||
|
4. User reviews and manually edits every generated component.
|
||||||
|
5. Project versions are saved.
|
||||||
|
6. User presses **Send to Suno**.
|
||||||
|
7. The app opens Suno and fills the appropriate fields. It does not
|
||||||
|
trigger Generate.
|
||||||
|
|
||||||
|
## Song Controls
|
||||||
|
|
||||||
|
- Multiple genres/styles can be blended.
|
||||||
|
- Instruments can be selected from a large worldwide instrument
|
||||||
|
catalog.
|
||||||
|
- Instruments can be searched by name, browsed by family/category and
|
||||||
|
browsed by region/origin where useful.
|
||||||
|
- Multiple instruments can be selected and deselected using
|
||||||
|
checkboxes.
|
||||||
|
- Selected instruments belong to the current Song Project.
|
||||||
|
- Each instrument can have a role and entry/exit timing.
|
||||||
|
- Instrument timing supports both timestamps and song sections.
|
||||||
|
- Arrangement supports Manual and Auto modes.
|
||||||
|
- Song structure supports Manual and Auto modes.
|
||||||
|
- BPM, key/scale and maqam support Manual and Auto modes.
|
||||||
|
- Multiple vocalists/voices can exist in one song.
|
||||||
|
- User controls vocal gender/type, rap/singing mode, delivery and
|
||||||
|
section-specific performance.
|
||||||
|
- Multiple languages and dialects can be used in one song.
|
||||||
|
- Arabic receives dedicated diacritics/harakat/tanween handling for
|
||||||
|
pronunciation.
|
||||||
|
- Energy and emotional progression can change throughout the song.
|
||||||
|
- Effects, transitions, build-ups, drops, bass intensity and vocal
|
||||||
|
processing can be manually specified or AI-assisted.
|
||||||
|
|
||||||
|
## Lyrics
|
||||||
|
|
||||||
|
The user can either: - provide only an idea and have AI write the
|
||||||
|
lyrics; or - provide existing lyrics and ask AI to correct, improve,
|
||||||
|
restructure or complete them.
|
||||||
|
|
||||||
|
## Instrument Selector
|
||||||
|
|
||||||
|
The application provides a names-and-metadata Instrument Selector. The
|
||||||
|
catalog should cover as many musical instruments as reasonably possible,
|
||||||
|
including Western, Middle Eastern, African, South Asian, East Asian,
|
||||||
|
Southeast Asian, Latin American, traditional, folk, orchestral,
|
||||||
|
electronic and modern instruments.
|
||||||
|
|
||||||
|
Instrument catalog data must not be hardcoded directly inside SwiftUI
|
||||||
|
views. Each catalog entry should support structured metadata:
|
||||||
|
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- family/category
|
||||||
|
- optional region/origin
|
||||||
|
- optional aliases/search terms
|
||||||
|
|
||||||
|
Selected instruments must be available as part of the Song Project and
|
||||||
|
later available to the OpenAI/song-generation layer so they can
|
||||||
|
influence arrangement, instrument roles, entry/exit timing, song
|
||||||
|
structure where relevant and the Suno Style Prompt.
|
||||||
|
|
||||||
|
Instrument images, audio previews, sound samples, audio playback,
|
||||||
|
Freesound, an Instrument API and external API calls for instrument data
|
||||||
|
are not part of the current product requirement.
|
||||||
|
|
||||||
|
## Project Management
|
||||||
|
|
||||||
|
Every song is stored as a project. Important changes can create versions
|
||||||
|
so previous states remain recoverable.
|
||||||
|
|
||||||
|
## AI Rules
|
||||||
|
|
||||||
|
The product owner has private system rules that govern OpenAI behavior.
|
||||||
|
Normal users cannot view or modify these rules in the initial version.
|
||||||
|
|
||||||
|
## Initial Boundary
|
||||||
|
|
||||||
|
Suno remains responsible for music generation and playback. The macOS
|
||||||
|
app prepares the project and fills Suno fields only. Generated songs do
|
||||||
|
not need to return to the app in the initial version.
|
||||||
+135
@@ -0,0 +1,135 @@
|
|||||||
|
# Agent Task Plan --- AI Music Studio macOS
|
||||||
|
|
||||||
|
## Operating Rule
|
||||||
|
|
||||||
|
Work incrementally. Do not invent product requirements. When a
|
||||||
|
requirement is missing and blocks implementation, record it in
|
||||||
|
`OPEN_QUESTIONS.md` instead of silently deciding it.
|
||||||
|
|
||||||
|
## Phase 0 --- Repository Foundation
|
||||||
|
|
||||||
|
- [x] Inspect existing repository and document current state.
|
||||||
|
- [x] Create/confirm native macOS project structure.
|
||||||
|
- [x] Establish clear Presentation / Domain / Services / Integrations
|
||||||
|
/ Persistence boundaries.
|
||||||
|
- [x] Add configuration strategy for development secrets without
|
||||||
|
committing keys.
|
||||||
|
- [x] Add basic unit-test target.
|
||||||
|
- [x] Ensure project builds cleanly.
|
||||||
|
|
||||||
|
## Phase 1 --- Domain Model
|
||||||
|
|
||||||
|
- [ ] Implement `SongProject` and supporting models from
|
||||||
|
`DATA_MODEL.md`.
|
||||||
|
- [ ] Model genres/styles as multi-select.
|
||||||
|
- [ ] Model song sections with order and optional timestamps.
|
||||||
|
- [ ] Model instruments, variants, roles and placements.
|
||||||
|
- [ ] Model multiple vocalists and section assignments.
|
||||||
|
- [ ] Model language/dialect and Arabic pronunciation settings.
|
||||||
|
- [ ] Model BPM, key, scale and maqam with Manual/Auto state.
|
||||||
|
- [ ] Model emotional arc and production directions.
|
||||||
|
- [ ] Add serialization tests.
|
||||||
|
|
||||||
|
## Phase 2 --- Project Persistence & Versions
|
||||||
|
|
||||||
|
- [ ] Create new/open/save song projects locally.
|
||||||
|
- [ ] Implement project list.
|
||||||
|
- [ ] Implement immutable or snapshot-based version history.
|
||||||
|
- [ ] Restore a previous version without destroying later versions.
|
||||||
|
- [ ] Add autosave strategy that does not create excessive versions.
|
||||||
|
|
||||||
|
## Phase 3 --- Core macOS UI
|
||||||
|
|
||||||
|
- [ ] Build project browser.
|
||||||
|
- [ ] Build natural chat workspace as the primary entry point.
|
||||||
|
- [ ] Build editable project inspector for duration, genres,
|
||||||
|
instruments, vocals and language.
|
||||||
|
- [ ] Build song structure editor.
|
||||||
|
- [ ] Build arrangement editor supporting section-based and
|
||||||
|
timestamp-based placement.
|
||||||
|
- [ ] Add Manual/Auto toggles for supported controls.
|
||||||
|
- [ ] Build final review screen where every generated field can be
|
||||||
|
edited.
|
||||||
|
|
||||||
|
## Phase 4 --- OpenAI Integration
|
||||||
|
|
||||||
|
- [ ] Create provider-independent `AIService` interface.
|
||||||
|
- [ ] Implement OpenAI client.
|
||||||
|
- [ ] Define private application-rule injection mechanism.
|
||||||
|
- [ ] Define structured AI response schema for SongProject updates.
|
||||||
|
- [ ] Implement idea → complete project generation.
|
||||||
|
- [ ] Implement existing lyrics → correction/improvement flow.
|
||||||
|
- [ ] Implement Auto mode for structure, arrangement, BPM/key/maqam
|
||||||
|
and production decisions.
|
||||||
|
- [ ] Implement optional Discuss mode.
|
||||||
|
- [ ] Enforce user-lock/manual-value precedence over AI output.
|
||||||
|
- [ ] Add error, retry, cancellation and rate-limit handling.
|
||||||
|
|
||||||
|
## Phase 5 --- Arabic Lyrics Processing
|
||||||
|
|
||||||
|
- [ ] Add Arabic-specific settings UI.
|
||||||
|
- [ ] Support diacritics/harakat/tanween processing.
|
||||||
|
- [ ] Preserve intentional spelling/dialect choices where possible.
|
||||||
|
- [ ] Allow user to compare/edit processed Arabic before Suno handoff.
|
||||||
|
- [ ] Add Arabic test fixtures covering multiple dialects.
|
||||||
|
|
||||||
|
## Phase 6 --- Instrument Selector & Catalog
|
||||||
|
|
||||||
|
- [ ] Create structured catalog models for instrument id, name,
|
||||||
|
family/category, optional region/origin and aliases/search terms.
|
||||||
|
- [ ] Provide large worldwide catalog data covering Western, Middle
|
||||||
|
Eastern, African, South Asian, East Asian, Southeast Asian, Latin
|
||||||
|
American, traditional, folk, orchestral, electronic and modern
|
||||||
|
instruments.
|
||||||
|
- [ ] Keep catalog data out of SwiftUI views.
|
||||||
|
- [ ] Build searchable instrument browser.
|
||||||
|
- [ ] Add browsing/filtering by family/category.
|
||||||
|
- [ ] Add browsing/filtering by region/origin where useful.
|
||||||
|
- [ ] Add checkbox-based multi-select and deselect behavior.
|
||||||
|
- [ ] Persist selected instruments on the current Song Project.
|
||||||
|
- [ ] Make selected instruments available to OpenAI/song-generation
|
||||||
|
logic for arrangement, roles, entry/exit timing, relevant structure
|
||||||
|
decisions and Suno Style Prompt generation.
|
||||||
|
- [ ] Preserve existing Manual/Auto arrangement behavior.
|
||||||
|
- [ ] Add tests for catalog search, category/region filtering,
|
||||||
|
selection persistence and SongProject serialization.
|
||||||
|
|
||||||
|
## Phase 7 --- Prompt Compiler
|
||||||
|
|
||||||
|
- [ ] Create deterministic compiler from approved SongProject → Suno
|
||||||
|
output.
|
||||||
|
- [ ] Generate lyrics text with section/performance directives where
|
||||||
|
appropriate.
|
||||||
|
- [ ] Generate style prompt from genre blend, instrumentation, vocals,
|
||||||
|
tempo, harmony, emotion and production instructions.
|
||||||
|
- [ ] Validate output before handoff.
|
||||||
|
- [ ] Keep compiler independent from UI and OpenAI client.
|
||||||
|
|
||||||
|
## Phase 8 --- Suno Handoff
|
||||||
|
|
||||||
|
- [ ] Implement explicit `Send to Suno` action.
|
||||||
|
- [ ] Open the appropriate Suno creation surface.
|
||||||
|
- [ ] Fill supported fields with approved project output.
|
||||||
|
- [ ] Never trigger Generate automatically.
|
||||||
|
- [ ] Detect/report when fields cannot be filled rather than silently
|
||||||
|
failing.
|
||||||
|
- [ ] Keep integration isolated because Suno UI can change.
|
||||||
|
|
||||||
|
## Phase 9 --- Quality
|
||||||
|
|
||||||
|
- [ ] Add validation for contradictory/invalid project settings.
|
||||||
|
- [ ] Add loading, offline and provider-error states.
|
||||||
|
- [ ] Add accessibility labels and keyboard navigation.
|
||||||
|
- [ ] Test project/version recovery.
|
||||||
|
- [ ] Test AI output against locked user choices.
|
||||||
|
- [ ] Test selected instruments influence compiled song-generation
|
||||||
|
context.
|
||||||
|
- [ ] Test Suno handoff without generation.
|
||||||
|
|
||||||
|
## Definition of MVP Done
|
||||||
|
|
||||||
|
A user can create a macOS song project through chat, manually or
|
||||||
|
automatically configure the agreed song parameters, generate/edit lyrics
|
||||||
|
and song planning through OpenAI, select instruments, review
|
||||||
|
the complete project, save versions, and send the approved lyrics/style
|
||||||
|
data to Suno where the app fills fields without initiating generation.
|
||||||
Reference in New Issue
Block a user