Saya lagi kerja paralel di dua toko Shopify milik dua brand klien yang berbeda dalam satu terminal yang sama. Kebiasaan buruk, tapi lazim: satu jendela, ganti-ganti antar folder tema, push ke sana-sini. Untuk brand yang satu saya mau update sebuah sections/product.liquid, jadi saya jalankan yang saya kira perintah yang tepat, menarget tema lewat ID:
shopify theme push --theme=184148328826 --live --allow-liveBanner suksesnya hijau. Saya lanjut. Baru beberapa menit kemudian saya sadar sesuatu yang salah: sections/product.liquid yang barusan saya push tidak muncul di tema yang saya harapkan. Yang lebih bikin dingin, dia muncul di tema LIVE produksi brand yang satunya lagi, sebagai file yatim yang tidak ada hubungannya dengan tema di sana. Saya baru saja mengotori production toko yang salah.
Kenapa ini terjadi
Refleks pertama saya salah: saya kira aku salah ketik ID. Tapi ID-nya benar, dia memang ID tema di toko B. Masalahnya bukan di ID, tapi di toko mana yang sedang dituju CLI.
Shopify CLI menyimpan konteks store yang terautentikasi, dan konteks itu sticky antar perintah. Perintah sebelumnya di terminal itu membuat saya terautentikasi ke toko A. Saat saya jalankan push dengan --theme=184148328826, ID itu adalah tema yang cuma ada di toko B, bukan A. Yang saya kira akan terjadi: CLI resolve ID itu, sadar itu bukan tema toko A, lalu error. Yang benar-benar terjadi: CLI gagal me-resolve ID itu di toko A, lalu diam-diam fallback ke tema live toko A alih-alih menolak.
Jadi --theme yang saya kira sebagai penunjuk absolut ke tema tertentu, ternyata hanya diinterpretasi dalam konteks toko yang sedang aktif. Kalau ID tidak cocok dengan toko aktif, dia tidak berteriak. Dia menebak, dan tebakannya adalah tema live. Itulah kenapa file yatim itu mendarat di production brand yang salah.
Pemulihannya
Karena file itu benar-benar tidak ada di tema aslinya, saya tidak bisa sekadar "membatalkan" push. Saya push ulang sebuah file stub kosong ke path yang sama untuk menetralkan si yatim, supaya sections/product.liquid yang nyasar itu tidak lagi merender apa-apa dan tidak dipanggil template mana pun. Jelek, tapi berhasil menghentikan pendarahan. Setelah itu, baru saya bersih-bersih dengan benar.
Perbaikannya
Pelajaran intinya sederhana: jangan pernah percaya konteks store yang implisit di workspace multi-toko. Kirim --store secara eksplisit di setiap perintah remote, push, pull, dev, maupun console:
shopify theme push --store=example-store.myshopify.com --theme=184148328826 --live --allow-liveDengan --store yang eksplisit, CLI berhenti menebak. Kalau tema ID itu tidak ada di toko yang saya sebutkan, dia error alih-alih fallback ke live. Itu persis perilaku yang saya mau.
Kebiasaan kedua yang sekarang saya paksakan: sebelum push apa pun, saya konfirmasi dulu bahwa ID tema itu betul-betul resolve di toko yang saya maksud. Satu perintah cepat sudah cukup:
shopify theme list --store=example-store.myshopify.comKalau ID target muncul di daftar itu, saya aman. Kalau tidak, berarti saya sedang menunjuk toko yang salah dan lebih baik tahu sekarang, sebelum menyentuh production.
Dan yang terakhir, sesederhana apa pun kelihatannya: baca URL toko di banner sukses CLI sebelum percaya. Banner itu memberi tahu toko mana yang benar-benar menerima push. Saya dulu men-skip baris itu karena "sudah pasti benar". Ternyata tidak.
Pelajaran
--theme=<ID> bukan alamat absolut. Dia cuma bermakna dalam konteks toko yang sedang aktif, dan konteks itu sticky dari perintah sebelumnya. Kalau ID tidak cocok dengan toko aktif, Shopify CLI tidak error, dia diam-diam jatuh ke tema live toko aktif, yang bisa berarti production brand yang sama sekali lain. Di workspace multi-toko, perlakukan --store=<store>.myshopify.com sebagai wajib di setiap perintah remote, pre-check dengan shopify theme list --store=<yang-diharapkan> supaya ID target terbukti resolve, dan baca URL toko di banner sukses sebelum percaya. Sejak insiden itu, saya tidak pernah lagi menjalankan perintah remote Shopify tanpa --store yang eksplisit. Menebak toko yang salah itu murah untuk CLI, tapi mahal buat kliennya.
