-
Search candidates. First read AppTheme.kt and list the existing Icon enum entries so you can exclude them. Then use mcp__icons8mcp__search_icons with platform=arcade and camping/nature/travel query terms (examples: campfire, compass, binoculars, lantern, map, axe, sleeping bag, evergreen, suitcase, log cabin, canoe, fishing, hammock, trail, camper, waterfall, flashlight). Note: some searches return zero (kayak, hammock, thermos) — try synonyms (dinghy, picnic). Fire multiple searches in parallel.
-
Fetch SVGs in parallel via mcp__icons8mcp__get_icon_svg for each chosen icon id.
-
Stage SVGs. Write each to /tmp/campfire-icons-svg/<PascalCaseName>.svg. The filename becomes the generated Kotlin property name (CampfireIcons.Theme.<PascalCaseName>) — avoid names that collide with existing Kotlin types (e.g. prefer PaperMap over Map).
-
Run Valkyrie. Output to a scratch dir first (Valkyrie creates a theme/ subfolder):
valkyrie svgxml2imagevector \
--input-path=/tmp/campfire-icons-svg \
--output-path=/tmp/campfire-icons-out \
--package-name=app.campfire.common.compose.icons \
--iconpack-name=CampfireIcons \
--nested-pack-name=Theme \
--output-format=lazy-property \
--indent-size=2 \
--trailing-comma=true
Key flags: --package-name is the root package (Valkyrie appends .theme from --nested-pack-name); do not pass the full ...icons.theme package or you'll get a doubled path. --trailing-comma=true is required — without it ktlint flags every multi-arg path(...) call.
-
Post-process — replace Valkyrie's default lazy mode to match project convention:
bash -c 'for f in /tmp/campfire-icons-out/theme/*.kt; do sed -i "" "s/LazyThreadSafetyMode.NONE/LazyThreadSafetyMode.PUBLICATION/g" "$f"; done'
-
Move into the source tree.
cp /tmp/campfire-icons-out/theme/*.kt \
/Users/r0adkll/StudioProjects/Campfire/common/compose/src/commonMain/kotlin/app/campfire/common/compose/icons/theme/
-
Wire into AppTheme.Icon. In ui/theming/api/src/commonMain/kotlin/app/campfire/ui/theming/api/AppTheme.kt:
- Add
import app.campfire.common.compose.icons.theme.<Name> (keep alphabetical ordering).
- Add
<Name>(icon = { CampfireIcons.Theme.<Name> }), to the Icon enum.
-
Verify. Run --format first (it auto-fixes the alphabetical import reordering that adding new imports can break), then compile:
./scripts/ktlint --format
./gradlew :common:compose:compileKotlinIosSimulatorArm64 :ui:theming:api:compileKotlinIosSimulatorArm64 --console=plain
Pre-existing warnings (ExperimentalMaterial3Api opt-in, dayOfMonth deprecation, SynchronizedObject under compileCommonMainKotlinMetadata) are unrelated — ignore.
-
Clean up /tmp/campfire-icons-svg and /tmp/campfire-icons-out.