tsoft-cli 3.7.2 → 3.7.4
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 +28 -0
- package/README.md +39 -39
- package/locales/en.json +6 -22
- package/locales/tr.json +10 -8
- package/package.json +2 -2
- package/src/commands/theme-dev.js +13 -16
- package/src/commands/theme-push.js +17 -5
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,34 @@ 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.4] - 2026-04-20
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- `tsoft theme push` no longer prints a malformed partner panel link on servers or themes where the organization scope cannot be resolved. Previously the CLI would render `https://partners.tsoft360.com/themes/<theme-folder>` — a URL that looks valid but does not exist in the partner panel. The CLI now accepts the backend-provided `partner_panel_url` only when it contains a proper `/organization/<id>/themes/<folder>` segment; otherwise it falls back to the themes index page (`https://partners.tsoft360.com/themes`) and adjusts the hint text accordingly.
|
|
12
|
+
- Restored Turkish diacritics in `push.connecting`, `push.no_changes`, `push.admin_approval`, `push.use_tip` (e.g. `baglaniliyor` → `bağlanılıyor`, `onayindan` → `onayından`).
|
|
13
|
+
- Leading indentation is no longer part of the `chalk.cyan.underline` span, so the partner panel URL no longer shows phantom underscores before `https` on terminals that render whitespace underlines.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- New locale key `push.partner_hint_theme` ("View this theme in the partner panel." / "Temanı partner panelinde görüntüle.") used when a theme-scoped URL is available, keeping the generic `push.partner_hint` for index-page fallbacks.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- JSON-mode output (`--json`) emits the same sanitized `partner_panel_url` as the human-readable output, so machine consumers never receive the malformed link either.
|
|
20
|
+
|
|
21
|
+
## [3.7.3] - 2026-04-20
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- `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.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- `tsoft theme dev` watcher startup collapsed into a single-line compact status bar (`👀 Watching · P preview · Ctrl+C exit`) replacing the three-line header.
|
|
28
|
+
- Preview URL fetch failures during `theme dev` are now silent — the `P` hint is simply omitted when unavailable, keeping the console clean.
|
|
29
|
+
- Browser open failures on `P` keypress now use an i18n-localized message via `dev.preview_open_failed` instead of a hardcoded Turkish string.
|
|
30
|
+
- README translated to English — the CLI's public-facing documentation is now consistent with the npm package audience.
|
|
31
|
+
- `package.json#description` updated to English to match the README.
|
|
32
|
+
|
|
33
|
+
### Removed
|
|
34
|
+
- Obsolete i18n keys `dev.watching`, `dev.env_running`, `dev.exit_tip` (replaced by `dev.status_*`).
|
|
35
|
+
|
|
8
36
|
## [3.7.2] - 2026-04-16
|
|
9
37
|
|
|
10
38
|
### Fixed
|
package/README.md
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
1
|
# tsoft-cli
|
|
2
2
|
|
|
3
|
-
[tsoft360](https://tsoft360.com)
|
|
3
|
+
Command-line tool for [tsoft360](https://tsoft360.com) theme development and management.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install -g tsoft-cli
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Requirements
|
|
12
12
|
|
|
13
13
|
- Node.js >= 18.0.0
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Quick Start
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
#
|
|
18
|
+
# Sign in
|
|
19
19
|
tsoft login
|
|
20
20
|
|
|
21
|
-
#
|
|
21
|
+
# List available themes
|
|
22
22
|
tsoft theme list
|
|
23
23
|
|
|
24
|
-
#
|
|
24
|
+
# Pull an existing theme
|
|
25
25
|
tsoft theme pull
|
|
26
26
|
|
|
27
|
-
#
|
|
27
|
+
# Start dev mode (hot-reload)
|
|
28
28
|
tsoft theme dev
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
##
|
|
31
|
+
## Commands
|
|
32
32
|
|
|
33
|
-
###
|
|
33
|
+
### Authentication
|
|
34
34
|
|
|
35
|
-
|
|
|
36
|
-
|
|
37
|
-
| `tsoft login` |
|
|
38
|
-
| `tsoft logout` |
|
|
39
|
-
| `tsoft whoami` |
|
|
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
|
-
###
|
|
41
|
+
### Theme Management
|
|
42
42
|
|
|
43
|
-
|
|
|
44
|
-
|
|
45
|
-
| `tsoft theme list` |
|
|
46
|
-
| `tsoft theme create` |
|
|
47
|
-
| `tsoft theme pull` |
|
|
48
|
-
| `tsoft theme use [name]` |
|
|
49
|
-
| `tsoft theme dev [name]` |
|
|
50
|
-
| `tsoft theme publish [name]` |
|
|
51
|
-
| `tsoft theme section list` |
|
|
52
|
-
| `tsoft theme section add` |
|
|
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
|
-
##
|
|
54
|
+
## Publishing a Theme
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
#
|
|
57
|
+
# Using the active theme
|
|
58
58
|
tsoft theme publish
|
|
59
59
|
|
|
60
|
-
#
|
|
60
|
+
# Using a specific theme
|
|
61
61
|
tsoft theme publish my-theme
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
|
|
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
|
-
##
|
|
66
|
+
## Security
|
|
67
67
|
|
|
68
|
-
- **OAuth2 PKCE**:
|
|
69
|
-
- **State
|
|
70
|
-
- **Secure
|
|
71
|
-
- **Auto
|
|
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
|
-
##
|
|
73
|
+
## Troubleshooting
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
#
|
|
76
|
+
# Check the current session
|
|
77
77
|
tsoft whoami
|
|
78
78
|
|
|
79
|
-
#
|
|
79
|
+
# Re-authenticate from scratch
|
|
80
80
|
tsoft logout
|
|
81
81
|
tsoft login
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
##
|
|
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>\".",
|
|
@@ -153,9 +143,9 @@
|
|
|
153
143
|
"push.draft_created": "New draft created",
|
|
154
144
|
"push.draft_updated": "Existing draft updated",
|
|
155
145
|
"push.partner_hint": "Visit the partner panel for the theme list.",
|
|
146
|
+
"push.partner_hint_theme": "View this theme in the partner panel.",
|
|
156
147
|
"push.changes_added": "+{{count}} new",
|
|
157
148
|
"push.changes_removed": "~{{count}} removed",
|
|
158
|
-
|
|
159
149
|
"dev.starting": "🚀 Starting development environment...",
|
|
160
150
|
"dev.active_site": "📍 Active Site:",
|
|
161
151
|
"dev.active_theme": "📍 Active Theme:",
|
|
@@ -185,9 +175,6 @@
|
|
|
185
175
|
"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
176
|
"dev.lock_warning_title": "🔒 Lock Warning",
|
|
187
177
|
"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
178
|
"dev.stopping": "⏸️ Shutting down development environment...",
|
|
192
179
|
"dev.watch_stopped": "✓ File watching stopped",
|
|
193
180
|
"dev.keepalive_stopped": "✓ Keep-alive stopped",
|
|
@@ -207,7 +194,6 @@
|
|
|
207
194
|
"dev.file_saved": "✓ {{path}} → Saved ({{duration}}ms)",
|
|
208
195
|
"dev.file_error": "{{path}} → Error: {{error}}",
|
|
209
196
|
"dev.keepalive_error": "⚠️ Keep-alive error (will retry)",
|
|
210
|
-
|
|
211
197
|
"init.no_themes": "No themes found.",
|
|
212
198
|
"init.select_prompt": "Which theme would you like to fork?",
|
|
213
199
|
"init.select_title": "Theme Selection",
|
|
@@ -227,7 +213,6 @@
|
|
|
227
213
|
"init.json_error.message": "--from parameter required (interactive selection not supported in JSON mode)",
|
|
228
214
|
"init.json_error.hint": "Usage: tsoft --json theme init --from <slug>",
|
|
229
215
|
"init.theme_not_found": "Theme not found: {{slug}}",
|
|
230
|
-
|
|
231
216
|
"section.list.no_active_theme": "No active theme found. Please run \"tsoft theme use <theme-name>\" first.",
|
|
232
217
|
"section.list.starting": "Listing sections...",
|
|
233
218
|
"section.list.active_theme": "Active Theme: {{theme}}",
|
|
@@ -239,7 +224,6 @@
|
|
|
239
224
|
"section.list.tags_label": "Tags:",
|
|
240
225
|
"section.list.file_label": "File:",
|
|
241
226
|
"section.list.no_sections": "⚠️ No sections found for this block",
|
|
242
|
-
|
|
243
227
|
"section.add.no_active_theme": "No active theme found. Please run \"tsoft theme use <theme-name>\" first.",
|
|
244
228
|
"section.add.starting": "🔧 Starting section add operation...",
|
|
245
229
|
"section.add.active_theme": "Active Theme: {{theme}}",
|
|
@@ -282,7 +266,6 @@
|
|
|
282
266
|
"section.add.download_error": "⚠️ Error while updating theme files:",
|
|
283
267
|
"section.add.manual_tip": "💡 Try downloading the theme manually:",
|
|
284
268
|
"section.add.manual_command": "tsoft theme pull",
|
|
285
|
-
|
|
286
269
|
"org.switch.json_error.message": "This command requires interactive mode.",
|
|
287
270
|
"org.switch.json_error.hint": "org switch is not supported in JSON mode.",
|
|
288
271
|
"org.switch.no_store": "No active store found. Please run \"tsoft login\" first.",
|
|
@@ -294,7 +277,6 @@
|
|
|
294
277
|
"org.switch.selecting": "Selecting {{name}}...",
|
|
295
278
|
"org.switch.success": "Active organization: {{name}}\nID: {{id}}\n\nYou can now develop themes under this organization.",
|
|
296
279
|
"org.switch.error": "Organization selection failed: {{error}}",
|
|
297
|
-
|
|
298
280
|
"help.tagline": "Theme development toolkit for tsoft360",
|
|
299
281
|
"help.footer": "Run tsoft <command> --help for details",
|
|
300
282
|
"help.group.development": "Development",
|
|
@@ -313,15 +295,17 @@
|
|
|
313
295
|
"help.cmd.logout": "Sign out and clear local credentials",
|
|
314
296
|
"help.cmd.whoami": "Show the logged-in user and store info",
|
|
315
297
|
"help.cmd.org_switch": "Switch the active organization",
|
|
316
|
-
|
|
317
298
|
"help.status.logged_in": "{{email}} ({{store}})",
|
|
318
299
|
"help.status.not_logged_in": "Not logged in — tsoft login",
|
|
319
300
|
"help.status.active_theme": "Theme: {{theme}}",
|
|
320
301
|
"help.status.no_theme": "No active theme — tsoft theme init",
|
|
321
|
-
|
|
322
302
|
"publish.deprecated": "Warning: Use \"theme push\" instead of \"theme publish\".",
|
|
323
303
|
"submit.deprecated": "Warning: Submit is now done from the partner panel.",
|
|
324
304
|
"submit.step1": "1. tsoft theme push",
|
|
325
305
|
"submit.step2": "2. Complete meta/screenshots in the partner panel",
|
|
326
|
-
"submit.step3": "3. Submit from the partner panel"
|
|
306
|
+
"submit.step3": "3. Submit from the partner panel",
|
|
307
|
+
"dev.status_watching": "Watching",
|
|
308
|
+
"dev.status_preview": "preview",
|
|
309
|
+
"dev.status_exit": "exit",
|
|
310
|
+
"dev.preview_open_failed": "Couldn't open browser: {{error}}"
|
|
327
311
|
}
|
package/locales/tr.json
CHANGED
|
@@ -132,17 +132,18 @@
|
|
|
132
132
|
"theme.use.folder": "Klasör: {{folder}}",
|
|
133
133
|
"push.no_active_theme": "Aktif tema bulunamadı.",
|
|
134
134
|
"push.usage": "Kullanim: tsoft theme push <theme-name>",
|
|
135
|
-
"push.use_tip": "veya \"tsoft theme use <theme-name>\" ile aktif tema
|
|
136
|
-
"push.connecting": "Sunucuya
|
|
135
|
+
"push.use_tip": "veya \"tsoft theme use <theme-name>\" ile aktif tema ayarlayın.",
|
|
136
|
+
"push.connecting": "Sunucuya bağlanılıyor...",
|
|
137
137
|
"push.checking_status": "Mevcut durum kontrol ediliyor...",
|
|
138
138
|
"push.pushing": "Tema push ediliyor...",
|
|
139
|
-
"push.no_changes": "
|
|
139
|
+
"push.no_changes": "Değişiklik yok — mevcut draft güncel.",
|
|
140
140
|
"push.success": "Push tamamlandı",
|
|
141
141
|
"push.first_push_note": "(ilk push)",
|
|
142
|
-
"push.admin_approval": "Admin
|
|
142
|
+
"push.admin_approval": "Admin onayından sonra 1.0.0 olarak yayınlanacak",
|
|
143
143
|
"push.draft_created": "Yeni draft oluşturuldu",
|
|
144
144
|
"push.draft_updated": "Mevcut draft güncellendi",
|
|
145
145
|
"push.partner_hint": "Tema listesi için partner paneli ziyaret edin.",
|
|
146
|
+
"push.partner_hint_theme": "Temanı partner panelinde görüntüle.",
|
|
146
147
|
"push.changes_added": "+{{count}} yeni",
|
|
147
148
|
"push.changes_removed": "~{{count}} kaldırıldı",
|
|
148
149
|
"dev.starting": "🚀 Geliştirme ortamı başlatılıyor...",
|
|
@@ -174,9 +175,6 @@
|
|
|
174
175
|
"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
176
|
"dev.lock_warning_title": "🔒 Kilit Uyarısı",
|
|
176
177
|
"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
178
|
"dev.stopping": "⏸️ Geliştirme ortamı kapatılıyor...",
|
|
181
179
|
"dev.watch_stopped": "✓ Dosya izleme durduruldu",
|
|
182
180
|
"dev.keepalive_stopped": "✓ Keep-alive durduruldu",
|
|
@@ -305,5 +303,9 @@
|
|
|
305
303
|
"submit.deprecated": "Uyarı: Submit işlemi artık partner panelden yapılıyor.",
|
|
306
304
|
"submit.step1": "1. tsoft theme push",
|
|
307
305
|
"submit.step2": "2. Partner panelde meta/screenshot tamamlayin",
|
|
308
|
-
"submit.step3": "3. Partner panelden submit edin"
|
|
306
|
+
"submit.step3": "3. Partner panelden submit edin",
|
|
307
|
+
"dev.status_watching": "İzleniyor",
|
|
308
|
+
"dev.status_preview": "önizleme",
|
|
309
|
+
"dev.status_exit": "çıkış",
|
|
310
|
+
"dev.preview_open_failed": "Tarayıcı açılamadı: {{error}}"
|
|
309
311
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tsoft-cli",
|
|
3
|
-
"version": "3.7.
|
|
4
|
-
"description": "tsoft360
|
|
3
|
+
"version": "3.7.4",
|
|
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
|
-
|
|
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
|
-
|
|
200
|
-
|
|
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
|
-
//
|
|
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('
|
|
220
|
+
console.log(chalk.red(' ' + t('dev.preview_open_failed', { error: e.message })));
|
|
224
221
|
}
|
|
225
222
|
}
|
|
226
223
|
});
|
|
227
|
-
} catch
|
|
224
|
+
} catch {
|
|
228
225
|
// raw mode bazi terminallerde calismaz — sessizce gec
|
|
229
226
|
}
|
|
230
227
|
}
|
|
@@ -15,6 +15,16 @@ const CHANGE_CATEGORIES = {
|
|
|
15
15
|
'Meta': ['meta_object_added', 'meta_object_removed', 'meta_field_added', 'meta_field_removed'],
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
+
const PARTNERS_BASE = 'https://partners.tsoft360.com';
|
|
19
|
+
const PARTNERS_THEMES_INDEX = `${PARTNERS_BASE}/themes`;
|
|
20
|
+
|
|
21
|
+
function resolvePanelLink(partnerUrl) {
|
|
22
|
+
if (typeof partnerUrl === 'string' && partnerUrl.includes('/organization/')) {
|
|
23
|
+
return { url: partnerUrl, hintKey: 'push.partner_hint_theme' };
|
|
24
|
+
}
|
|
25
|
+
return { url: PARTNERS_THEMES_INDEX, hintKey: 'push.partner_hint' };
|
|
26
|
+
}
|
|
27
|
+
|
|
18
28
|
/**
|
|
19
29
|
* Diff ozeti goster (gruplu)
|
|
20
30
|
* @param {Object} data - Push response data
|
|
@@ -61,10 +71,10 @@ function displayDiffSummary(data, previousVersion) {
|
|
|
61
71
|
}
|
|
62
72
|
}
|
|
63
73
|
|
|
64
|
-
// Partner panel yonlendirme
|
|
65
74
|
console.log('');
|
|
66
|
-
|
|
67
|
-
console.log(chalk.
|
|
75
|
+
const { url: panelUrl, hintKey } = resolvePanelLink(partnerUrl);
|
|
76
|
+
console.log(` ${chalk.cyan.underline(panelUrl)}`);
|
|
77
|
+
console.log(chalk.gray(' ' + t(hintKey)));
|
|
68
78
|
}
|
|
69
79
|
|
|
70
80
|
/**
|
|
@@ -114,6 +124,8 @@ export async function themePushCommand(themeName, options = {}) {
|
|
|
114
124
|
spinner.text = t('push.pushing');
|
|
115
125
|
const result = await apiClient.pushTheme(themeUuid);
|
|
116
126
|
|
|
127
|
+
const { url: resolvedPanelUrl } = resolvePanelLink(result.data?.partner_panel_url);
|
|
128
|
+
|
|
117
129
|
// 3. No-op kontrolu
|
|
118
130
|
if (result.data?.no_changes === true) {
|
|
119
131
|
// JSON mode
|
|
@@ -124,7 +136,7 @@ export async function themePushCommand(themeName, options = {}) {
|
|
|
124
136
|
command: 'theme push',
|
|
125
137
|
data: {
|
|
126
138
|
reason: 'no_changes',
|
|
127
|
-
partner_panel_url:
|
|
139
|
+
partner_panel_url: resolvedPanelUrl,
|
|
128
140
|
}
|
|
129
141
|
});
|
|
130
142
|
return;
|
|
@@ -147,7 +159,7 @@ export async function themePushCommand(themeName, options = {}) {
|
|
|
147
159
|
bump_type: result.data.bump_type,
|
|
148
160
|
action: result.data.action,
|
|
149
161
|
changes: result.data.changes || [],
|
|
150
|
-
partner_panel_url:
|
|
162
|
+
partner_panel_url: resolvedPanelUrl,
|
|
151
163
|
}
|
|
152
164
|
});
|
|
153
165
|
return;
|