tsoft-cli 3.7.2 → 3.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,21 @@ All notable changes to T-Soft CLI will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.7.3] - 2026-04-20
9
+
10
+ ### Added
11
+ - `tsoft theme push` now renders the partner panel URL returned by the push response as a clickable underlined link (`chalk.cyan.underline`), pointing to the organization-scoped theme page instead of the generic landing page.
12
+
13
+ ### Changed
14
+ - `tsoft theme dev` watcher startup collapsed into a single-line compact status bar (`👀 Watching · P preview · Ctrl+C exit`) replacing the three-line header.
15
+ - Preview URL fetch failures during `theme dev` are now silent — the `P` hint is simply omitted when unavailable, keeping the console clean.
16
+ - Browser open failures on `P` keypress now use an i18n-localized message via `dev.preview_open_failed` instead of a hardcoded Turkish string.
17
+ - README translated to English — the CLI's public-facing documentation is now consistent with the npm package audience.
18
+ - `package.json#description` updated to English to match the README.
19
+
20
+ ### Removed
21
+ - Obsolete i18n keys `dev.watching`, `dev.env_running`, `dev.exit_tip` (replaced by `dev.status_*`).
22
+
8
23
  ## [3.7.2] - 2026-04-16
9
24
 
10
25
  ### Fixed
package/README.md CHANGED
@@ -1,86 +1,86 @@
1
1
  # tsoft-cli
2
2
 
3
- [tsoft360](https://tsoft360.com) tema geliştirme ve yönetim için komut satırı aracı.
3
+ Command-line tool for [tsoft360](https://tsoft360.com) theme development and management.
4
4
 
5
- ## Kurulum
5
+ ## Installation
6
6
 
7
7
  ```bash
8
8
  npm install -g tsoft-cli
9
9
  ```
10
10
 
11
- ## Gereksinimler
11
+ ## Requirements
12
12
 
13
13
  - Node.js >= 18.0.0
14
14
 
15
- ## Hızlı Başlangıç
15
+ ## Quick Start
16
16
 
17
17
  ```bash
18
- # Giriş yap
18
+ # Sign in
19
19
  tsoft login
20
20
 
21
- # Temaları listele
21
+ # List available themes
22
22
  tsoft theme list
23
23
 
24
- # Tema indir
24
+ # Pull an existing theme
25
25
  tsoft theme pull
26
26
 
27
- # Geliştirme modunu başlat (hot-reload)
27
+ # Start dev mode (hot-reload)
28
28
  tsoft theme dev
29
29
  ```
30
30
 
31
- ## Komutlar
31
+ ## Commands
32
32
 
33
- ### Yetkilendirme
33
+ ### Authentication
34
34
 
35
- | Komut | Açıklama |
36
- |----------------|----------------------------------------|
37
- | `tsoft login` | OAuth2 ile giriş yap |
38
- | `tsoft logout` | Çıkış yap ve token'ları temizle |
39
- | `tsoft whoami` | Kullanıcı ve mağaza bilgilerini göster |
35
+ | Command | Description |
36
+ |----------------|-----------------------------------------|
37
+ | `tsoft login` | Sign in via OAuth2 |
38
+ | `tsoft logout` | Sign out and clear stored tokens |
39
+ | `tsoft whoami` | Show the signed-in user and active shop |
40
40
 
41
- ### Tema Yönetimi
41
+ ### Theme Management
42
42
 
43
- | Komut | Açıklama |
44
- |------------------------------|-----------------------------------------|
45
- | `tsoft theme list` | Tüm temaları listele |
46
- | `tsoft theme create` | Yeni tema oluştur (interaktif) |
47
- | `tsoft theme pull` | Var olan temayı indir |
48
- | `tsoft theme use [name]` | Aktif tema seç |
49
- | `tsoft theme dev [name]` | Geliştirme modunu başlat (hot-reload) |
50
- | `tsoft theme publish [name]` | Temayı TSoftApps market'e yayınla |
51
- | `tsoft theme section list` | Block ve section'ları listele |
52
- | `tsoft theme section add` | Section ekle (interaktif) |
43
+ | Command | Description |
44
+ | ---------------------------- | ----------------------------------------- |
45
+ | `tsoft theme list` | List all themes |
46
+ | `tsoft theme create` | Create a new theme (interactive) |
47
+ | `tsoft theme pull` | Pull an existing theme |
48
+ | `tsoft theme use [name]` | Set the active theme |
49
+ | `tsoft theme dev [name]` | Start dev mode (hot-reload) |
50
+ | `tsoft theme publish [name]` | Publish the theme to the TSoftApps market |
51
+ | `tsoft theme section list` | List blocks and sections |
52
+ | `tsoft theme section add` | Add a section (interactive) |
53
53
 
54
- ## Tema Yayınlama
54
+ ## Publishing a Theme
55
55
 
56
56
  ```bash
57
- # Aktif tema ile
57
+ # Using the active theme
58
58
  tsoft theme publish
59
59
 
60
- # Belirli bir tema ile
60
+ # Using a specific theme
61
61
  tsoft theme publish my-theme
62
62
  ```
63
63
 
64
- İlk yayında versiyon numarası girilir. Sonraki güncellemelerde semantic versioning ile güncelleme tipi seçilir (patch / minor / major).
64
+ On the first publish you enter the initial version number. Subsequent updates prompt for a semantic-versioning bump type (patch / minor / major).
65
65
 
66
- ## Güvenlik
66
+ ## Security
67
67
 
68
- - **OAuth2 PKCE**: Public client olarak güvenli yetkilendirme
69
- - **State Parameter**: CSRF koruması
70
- - **Secure Storage**: Token'lar sadece kullanıcı tarafından okunabilir (chmod 600)
71
- - **Auto Refresh**: Token süresi dolduğunda otomatik yenileme
68
+ - **OAuth2 PKCE**: Secure authorization as a public client
69
+ - **State parameter**: CSRF protection
70
+ - **Secure storage**: Tokens are readable only by the owner (`chmod 600`)
71
+ - **Auto-refresh**: Access tokens are refreshed automatically when they expire
72
72
 
73
- ## Sorun Giderme
73
+ ## Troubleshooting
74
74
 
75
75
  ```bash
76
- # Durumu kontrol et
76
+ # Check the current session
77
77
  tsoft whoami
78
78
 
79
- # Yeniden giriş yap
79
+ # Re-authenticate from scratch
80
80
  tsoft logout
81
81
  tsoft login
82
82
  ```
83
83
 
84
- ## Lisans
84
+ ## License
85
85
 
86
86
  [MIT](LICENSE)
package/locales/en.json CHANGED
@@ -12,7 +12,6 @@
12
12
  "ui.label.yes": "Yes",
13
13
  "ui.label.no": "No",
14
14
  "ui.label.disabled": "(Disabled)",
15
-
16
15
  "error.push.pending_review.message": "Cannot push: theme is pending review.",
17
16
  "error.push.pending_review.hint": "Withdraw first: tsoft theme withdraw",
18
17
  "error.push.auth.message": "Authorization error.",
@@ -23,7 +22,6 @@
23
22
  "error.push.backend_reject.hint": "For details: tsoft theme push --verbose",
24
23
  "error.push.unexpected.message": "An unexpected error occurred.",
25
24
  "error.push.unexpected.hint": "For details: tsoft theme push --verbose",
26
-
27
25
  "error.http.401.message": "Authorization error.",
28
26
  "error.http.401.hint": "Login again: tsoft login --org",
29
27
  "error.http.403.message": "You do not have permission for this operation.",
@@ -36,13 +34,11 @@
36
34
  "error.http.423.hint": "Theme may be locked by another operation.",
37
35
  "error.http.5xx.message": "Server error occurred.",
38
36
  "error.http.5xx.hint": "For details: tsoft {{command}} --verbose",
39
-
40
37
  "error.push.verbose_hint": "For details: tsoft theme push --verbose",
41
38
  "error.fallback.message": "An unexpected error occurred.",
42
39
  "error.fallback.hint": "For details: tsoft theme push --verbose",
43
40
  "error.auth_required.message": "Authorization error.",
44
41
  "error.auth_required.hint": "Login again: tsoft login --org",
45
-
46
42
  "login.starting": "🔐 Initializing tsoft360 authorization...",
47
43
  "login.browser_opening": "🌐 Opening browser...",
48
44
  "login.waiting": "⏳ Waiting for authorization...",
@@ -57,7 +53,6 @@
57
53
  "login.json_error.hint": "For CI/CD, authenticate with tsoft login first to store the token, then use it.",
58
54
  "login.error_log": "Check log files for details.",
59
55
  "login.security_error": "State parameter mismatch! This may indicate a security issue.",
60
-
61
56
  "logout.starting": "🚪 Logging out...",
62
57
  "logout.not_logged_in": "⚠️ You are not logged in.",
63
58
  "logout.revoking": "🔄 Revoking token...",
@@ -66,7 +61,6 @@
66
61
  "logout.credentials_cleared": "✓ Local credentials cleared",
67
62
  "logout.success": "👋 Successfully logged out!",
68
63
  "logout.relogin_tip": "To log in again, use the \"tsoft login\" command.",
69
-
70
64
  "whoami.not_logged_in": "⚠️ You are not logged in.",
71
65
  "whoami.not_logged_in_tip": "Use \"tsoft login\" to log in.",
72
66
  "whoami.not_logged_in.json.message": "Not logged in.",
@@ -84,7 +78,6 @@
84
78
  "whoami.token_expired": "✗ Expired",
85
79
  "whoami.refresh_valid": "✓ Valid ({{days}} days remaining)",
86
80
  "whoami.relogin_tip": "Tip: Use tsoft login --org to log in again",
87
-
88
81
  "theme.listing": "📋 Listing themes...",
89
82
  "theme.no_themes": "⚠️ No themes found yet.",
90
83
  "theme.count": "Total {{count}} themes found:",
@@ -123,14 +116,12 @@
123
116
  "theme.force_updating": "⏳ Updating default theme and creating new theme...",
124
117
  "theme.force_update_success_1": "✓ Default theme successfully updated",
125
118
  "theme.force_update_success_2": "✓ New theme created",
126
-
127
119
  "theme.pull.starting": "📥 Starting theme download...",
128
120
  "theme.pull.no_themes": "No themes available to download.",
129
121
  "theme.pull.select_title": "Download Theme",
130
122
  "theme.pull.select_prompt": "Which theme would you like to download?",
131
123
  "theme.pull.downloading": "📦 Downloading \"{{name}}\"...",
132
124
  "theme.pull.success": "🎉 Theme successfully downloaded!",
133
-
134
125
  "theme.use.starting": "🎯 Setting active theme...",
135
126
  "theme.use.no_themes": "No themes found.",
136
127
  "theme.use.not_found": "❌ Theme not found: {{name}}",
@@ -139,7 +130,6 @@
139
130
  "theme.use.select_title": "🎯 Theme Selection",
140
131
  "theme.use.set": "✓ Active theme set: {{name}}",
141
132
  "theme.use.folder": "Folder: {{folder}}",
142
-
143
133
  "push.no_active_theme": "No active theme found.",
144
134
  "push.usage": "Usage: tsoft theme push <theme-name>",
145
135
  "push.use_tip": "Or set an active theme with \"tsoft theme use <theme-name>\".",
@@ -155,7 +145,6 @@
155
145
  "push.partner_hint": "Visit the partner panel for the theme list.",
156
146
  "push.changes_added": "+{{count}} new",
157
147
  "push.changes_removed": "~{{count}} removed",
158
-
159
148
  "dev.starting": "🚀 Starting development environment...",
160
149
  "dev.active_site": "📍 Active Site:",
161
150
  "dev.active_theme": "📍 Active Theme:",
@@ -185,9 +174,6 @@
185
174
  "dev.lock_by_other": "Theme is locked by another developer!\n\nDeveloper: {{dev}}\nLast access: {{last_access}}\n\nAre you sure you want to take the lock?",
186
175
  "dev.lock_warning_title": "🔒 Lock Warning",
187
176
  "dev.lock_override": "🔐 Acquiring lock (override)...",
188
- "dev.watching": "👀 Watching for file changes...",
189
- "dev.env_running": "💡 Development environment is running",
190
- "dev.exit_tip": "Press Ctrl+C to exit safely",
191
177
  "dev.stopping": "⏸️ Shutting down development environment...",
192
178
  "dev.watch_stopped": "✓ File watching stopped",
193
179
  "dev.keepalive_stopped": "✓ Keep-alive stopped",
@@ -207,7 +193,6 @@
207
193
  "dev.file_saved": "✓ {{path}} → Saved ({{duration}}ms)",
208
194
  "dev.file_error": "{{path}} → Error: {{error}}",
209
195
  "dev.keepalive_error": "⚠️ Keep-alive error (will retry)",
210
-
211
196
  "init.no_themes": "No themes found.",
212
197
  "init.select_prompt": "Which theme would you like to fork?",
213
198
  "init.select_title": "Theme Selection",
@@ -227,7 +212,6 @@
227
212
  "init.json_error.message": "--from parameter required (interactive selection not supported in JSON mode)",
228
213
  "init.json_error.hint": "Usage: tsoft --json theme init --from <slug>",
229
214
  "init.theme_not_found": "Theme not found: {{slug}}",
230
-
231
215
  "section.list.no_active_theme": "No active theme found. Please run \"tsoft theme use <theme-name>\" first.",
232
216
  "section.list.starting": "Listing sections...",
233
217
  "section.list.active_theme": "Active Theme: {{theme}}",
@@ -239,7 +223,6 @@
239
223
  "section.list.tags_label": "Tags:",
240
224
  "section.list.file_label": "File:",
241
225
  "section.list.no_sections": "⚠️ No sections found for this block",
242
-
243
226
  "section.add.no_active_theme": "No active theme found. Please run \"tsoft theme use <theme-name>\" first.",
244
227
  "section.add.starting": "🔧 Starting section add operation...",
245
228
  "section.add.active_theme": "Active Theme: {{theme}}",
@@ -282,7 +265,6 @@
282
265
  "section.add.download_error": "⚠️ Error while updating theme files:",
283
266
  "section.add.manual_tip": "💡 Try downloading the theme manually:",
284
267
  "section.add.manual_command": "tsoft theme pull",
285
-
286
268
  "org.switch.json_error.message": "This command requires interactive mode.",
287
269
  "org.switch.json_error.hint": "org switch is not supported in JSON mode.",
288
270
  "org.switch.no_store": "No active store found. Please run \"tsoft login\" first.",
@@ -294,7 +276,6 @@
294
276
  "org.switch.selecting": "Selecting {{name}}...",
295
277
  "org.switch.success": "Active organization: {{name}}\nID: {{id}}\n\nYou can now develop themes under this organization.",
296
278
  "org.switch.error": "Organization selection failed: {{error}}",
297
-
298
279
  "help.tagline": "Theme development toolkit for tsoft360",
299
280
  "help.footer": "Run tsoft <command> --help for details",
300
281
  "help.group.development": "Development",
@@ -313,15 +294,17 @@
313
294
  "help.cmd.logout": "Sign out and clear local credentials",
314
295
  "help.cmd.whoami": "Show the logged-in user and store info",
315
296
  "help.cmd.org_switch": "Switch the active organization",
316
-
317
297
  "help.status.logged_in": "{{email}} ({{store}})",
318
298
  "help.status.not_logged_in": "Not logged in — tsoft login",
319
299
  "help.status.active_theme": "Theme: {{theme}}",
320
300
  "help.status.no_theme": "No active theme — tsoft theme init",
321
-
322
301
  "publish.deprecated": "Warning: Use \"theme push\" instead of \"theme publish\".",
323
302
  "submit.deprecated": "Warning: Submit is now done from the partner panel.",
324
303
  "submit.step1": "1. tsoft theme push",
325
304
  "submit.step2": "2. Complete meta/screenshots in the partner panel",
326
- "submit.step3": "3. Submit from the partner panel"
305
+ "submit.step3": "3. Submit from the partner panel",
306
+ "dev.status_watching": "Watching",
307
+ "dev.status_preview": "preview",
308
+ "dev.status_exit": "exit",
309
+ "dev.preview_open_failed": "Couldn't open browser: {{error}}"
327
310
  }
package/locales/tr.json CHANGED
@@ -174,9 +174,6 @@
174
174
  "dev.lock_by_other": "Tema başka bir developer tarafından kilitli!\n\nDeveloper: {{dev}}\nSon erişim: {{last_access}}\n\nKilidi almak istediğinizden emin misiniz?",
175
175
  "dev.lock_warning_title": "🔒 Kilit Uyarısı",
176
176
  "dev.lock_override": "🔐 Kilit alınıyor (override)...",
177
- "dev.watching": "👀 Dosya değişiklikleri izleniyor...",
178
- "dev.env_running": "💡 Geliştirme ortamı çalışıyor",
179
- "dev.exit_tip": "Ctrl+C ile güvenli çıkış yapabilirsiniz",
180
177
  "dev.stopping": "⏸️ Geliştirme ortamı kapatılıyor...",
181
178
  "dev.watch_stopped": "✓ Dosya izleme durduruldu",
182
179
  "dev.keepalive_stopped": "✓ Keep-alive durduruldu",
@@ -305,5 +302,9 @@
305
302
  "submit.deprecated": "Uyarı: Submit işlemi artık partner panelden yapılıyor.",
306
303
  "submit.step1": "1. tsoft theme push",
307
304
  "submit.step2": "2. Partner panelde meta/screenshot tamamlayin",
308
- "submit.step3": "3. Partner panelden submit edin"
305
+ "submit.step3": "3. Partner panelden submit edin",
306
+ "dev.status_watching": "İzleniyor",
307
+ "dev.status_preview": "önizleme",
308
+ "dev.status_exit": "çıkış",
309
+ "dev.preview_open_failed": "Tarayıcı açılamadı: {{error}}"
309
310
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tsoft-cli",
3
- "version": "3.7.2",
4
- "description": "tsoft360 tema geliştirme ve yönetim aracı",
3
+ "version": "3.7.3",
4
+ "description": "Command-line tool for tsoft360 theme development and management",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
7
7
  "bin": {
@@ -186,26 +186,24 @@ async function handleFileDelete(themeUuid, themePath, filePath) {
186
186
  }
187
187
 
188
188
  async function startFileWatcher(themeUuid, themePath) {
189
- console.log(chalk.cyan(t('dev.watching') + '\n'));
190
- console.log(chalk.gray(t('dev.env_running')));
191
- console.log(chalk.gray(' ' + t('dev.exit_tip') + '\n'));
192
-
193
- // Preview URL — backend HMAC token uretip dev temayi onizleme link'i veriyor
189
+ // Preview URL — sessizce cek, baglanamazsa status line'da P ipucunu gosterme
194
190
  let previewUrl = null;
195
191
  try {
196
192
  const apiClient = await createApiClient();
197
193
  const previewRes = await apiClient.get(`/theme/${themeUuid}/preview-url`);
198
194
  previewUrl = previewRes?.data?.preview_url || null;
199
- if (previewUrl) {
200
- const expIso = previewRes?.data?.expires_at;
201
- console.log(chalk.bgGreen.black(' [P] Preview ') + ' ' + chalk.white(previewUrl));
202
- console.log(chalk.gray(' ' + chalk.dim('basın: ') + chalk.bold('P') + chalk.dim(' tarayıcıda aç')) + (expIso ? chalk.gray(` ${chalk.dim('exp:')} ${expIso}`) : '') + '\n');
203
- }
204
- } catch (err) {
205
- console.log(chalk.gray(' (preview link alinamadi: ' + (err?.message || 'unknown') + ')\n'));
195
+ } catch {
196
+ // sessiz preview opsiyonel
206
197
  }
207
198
 
208
- // Klavye dinleyici'P' tarayıcıda preview URL'ini acar, Ctrl+C cikis
199
+ // Tek satirlik compact status watching + P preview (varsa) + Ctrl+C exit
200
+ const sep = chalk.dim(' · ');
201
+ const parts = [chalk.cyan('👀 ' + t('dev.status_watching'))];
202
+ if (previewUrl) parts.push(chalk.bold.green('P') + chalk.gray(' ' + t('dev.status_preview')));
203
+ parts.push(chalk.gray('Ctrl+C ' + t('dev.status_exit')));
204
+ console.log('\n' + parts.join(sep) + '\n');
205
+
206
+ // Klavye dinleyici — 'P' tarayıcida preview URL'ini sessizce acar, Ctrl+C cikis
209
207
  if (previewUrl && process.stdin.isTTY) {
210
208
  try {
211
209
  process.stdin.setRawMode(true);
@@ -216,15 +214,14 @@ async function startFileWatcher(themeUuid, themePath) {
216
214
  process.exit(0);
217
215
  }
218
216
  if (key === 'p' || key === 'P') {
219
- console.log(chalk.cyan(' tarayıcıda açılıyor: ') + chalk.white(previewUrl));
220
217
  try {
221
218
  await open(previewUrl);
222
219
  } catch (e) {
223
- console.log(chalk.red(' tarayıcı acilamadi: ' + e.message));
220
+ console.log(chalk.red(' ' + t('dev.preview_open_failed', { error: e.message })));
224
221
  }
225
222
  }
226
223
  });
227
- } catch (e) {
224
+ } catch {
228
225
  // raw mode bazi terminallerde calismaz — sessizce gec
229
226
  }
230
227
  }
@@ -63,7 +63,8 @@ function displayDiffSummary(data, previousVersion) {
63
63
 
64
64
  // Partner panel yonlendirme
65
65
  console.log('');
66
- console.log(chalk.cyan(' https://partners.tsoft360.com'));
66
+ const panelUrl = partnerUrl || 'https://partners.tsoft360.com';
67
+ console.log(chalk.cyan.underline(` ${panelUrl}`));
67
68
  console.log(chalk.gray(' ' + t('push.partner_hint')));
68
69
  }
69
70