fpasoterm 1.6.0

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.

Potentially problematic release.


This version of fpasoterm might be problematic. Click here for more details.

Files changed (101) hide show
  1. package/CHANGELOG.md +230 -0
  2. package/CONTRIBUTING.md +67 -0
  3. package/INSTALL.ja.md +204 -0
  4. package/INSTALL.md +229 -0
  5. package/LICENSE +21 -0
  6. package/README.ja.md +389 -0
  7. package/README.md +607 -0
  8. package/bin/fpasoterm +2882 -0
  9. package/completions/_fpasoterm +81 -0
  10. package/completions/fpasoterm.bash +55 -0
  11. package/completions/fpasoterm.fish +64 -0
  12. package/completions/fpasoterm.ps1 +47 -0
  13. package/docs/capability-diagnostics.en.md +77 -0
  14. package/docs/capability-diagnostics.ja.md +63 -0
  15. package/docs/completion.en.md +141 -0
  16. package/docs/completion.ja.md +113 -0
  17. package/docs/config.en.md +554 -0
  18. package/docs/config.ja.md +544 -0
  19. package/docs/debugging.en.md +72 -0
  20. package/docs/debugging.ja.md +66 -0
  21. package/docs/diagnostics.en.md +69 -0
  22. package/docs/diagnostics.ja.md +64 -0
  23. package/docs/font-diagnostics.en.md +116 -0
  24. package/docs/font-diagnostics.ja.md +105 -0
  25. package/docs/fpasoterm-plugin.d.ts +51 -0
  26. package/docs/known-issues.en.md +23 -0
  27. package/docs/known-issues.ja.md +23 -0
  28. package/docs/plugins.en.md +266 -0
  29. package/docs/plugins.ja.md +176 -0
  30. package/docs/pr-review.en.md +177 -0
  31. package/docs/pr-review.ja.md +170 -0
  32. package/docs/release-checklist.en.md +72 -0
  33. package/docs/release-checklist.ja.md +71 -0
  34. package/docs/security.en.md +36 -0
  35. package/docs/security.ja.md +31 -0
  36. package/docs/spec.en.md +106 -0
  37. package/docs/spec.ja.md +99 -0
  38. package/docs/sshfs.en.md +28 -0
  39. package/docs/sshfs.ja.md +28 -0
  40. package/docs/sync.en.md +280 -0
  41. package/docs/sync.ja.md +280 -0
  42. package/examples/apply-default-appearance.bat +8 -0
  43. package/examples/apply-default-appearance.ps1 +7 -0
  44. package/examples/apply-default-appearance.sh +7 -0
  45. package/examples/apply-runtime-appearance.bat +8 -0
  46. package/examples/apply-runtime-appearance.ps1 +7 -0
  47. package/examples/apply-runtime-appearance.sh +7 -0
  48. package/examples/config/default-appearance.toml +36 -0
  49. package/examples/config/minimal.toml +30 -0
  50. package/examples/config/profiles.toml +20 -0
  51. package/examples/config/runtime-appearance.toml +24 -0
  52. package/examples/config/sync-folder.toml +17 -0
  53. package/examples/config/tui-compatibility.toml +7 -0
  54. package/examples/config/with-plugins.toml +33 -0
  55. package/examples/plugins/hello.ts +17 -0
  56. package/examples/plugins/status-banner.ts +14 -0
  57. package/examples/plugins/theme.ts +32 -0
  58. package/examples/plugins/welcome-banner.ts +16 -0
  59. package/extra/linux/icons/hicolor/128x128/apps/fpasoterm.png +0 -0
  60. package/extra/linux/icons/hicolor/16x16/apps/fpasoterm.png +0 -0
  61. package/extra/linux/icons/hicolor/192x192/apps/fpasoterm.png +0 -0
  62. package/extra/linux/icons/hicolor/256x256/apps/fpasoterm.png +0 -0
  63. package/extra/linux/icons/hicolor/32x32/apps/fpasoterm.png +0 -0
  64. package/extra/linux/icons/hicolor/48x48/apps/fpasoterm.png +0 -0
  65. package/extra/linux/icons/hicolor/512x512/apps/fpasoterm.png +0 -0
  66. package/extra/linux/icons/hicolor/64x64/apps/fpasoterm.png +0 -0
  67. package/extra/linux/io.github.oyoguhito.fpasoterm.desktop +10 -0
  68. package/extra/logo/fpasoterm.png +0 -0
  69. package/extra/macos/fpasoterm.icns +0 -0
  70. package/extra/windows/fpasoterm.cmd +40 -0
  71. package/extra/windows/fpasoterm.ico +0 -0
  72. package/package.json +81 -0
  73. package/scripts/build-artifacts.js +183 -0
  74. package/scripts/generate-icon.js +251 -0
  75. package/scripts/init-jj-empty-main +41 -0
  76. package/scripts/install-linux-desktop.js +238 -0
  77. package/scripts/run +16 -0
  78. package/scripts/security/scan-secrets.js +89 -0
  79. package/scripts/tests/smoke.js +2476 -0
  80. package/scripts/uninstall-desktop.js +20 -0
  81. package/scripts/uninstall-linux-desktop.js +96 -0
  82. package/scripts/uninstall-windows-path.js +94 -0
  83. package/src/config.js +855 -0
  84. package/src/renderer/confirm.html +71 -0
  85. package/src/renderer/index.html +223 -0
  86. package/src/renderer/renderer.js +4166 -0
  87. package/src/renderer/styles.css +969 -0
  88. package/src/renderer/vendor/addon-fit/addon-fit.js +2 -0
  89. package/src/renderer/vendor/addon-image/LICENSE +19 -0
  90. package/src/renderer/vendor/addon-image/addon-image.js +3 -0
  91. package/src/renderer/vendor/addon-web-links/LICENSE +19 -0
  92. package/src/renderer/vendor/addon-web-links/addon-web-links.js +2 -0
  93. package/src/renderer/vendor/xterm/xterm.css +292 -0
  94. package/src/renderer/vendor/xterm/xterm.js +2 -0
  95. package/src-tauri/Cargo.lock +5253 -0
  96. package/src-tauri/Cargo.toml +29 -0
  97. package/src-tauri/build.rs +140 -0
  98. package/src-tauri/capabilities/default.json +13 -0
  99. package/src-tauri/default-config.toml +128 -0
  100. package/src-tauri/src/main.rs +9347 -0
  101. package/src-tauri/tauri.conf.json +60 -0
package/README.md ADDED
@@ -0,0 +1,607 @@
1
+ # fpasoterm
2
+
3
+ ![fpasoterm logo](extra/logo/fpasoterm.png)
4
+
5
+ Cross-platform terminal app built with Tauri, xterm.js, and a Rust PTY bridge.
6
+
7
+ fpasoterm is intended to be used with terminal multiplexers such as screen / tmux / byobu / zellij / herdr. It focuses on a single terminal surface and does not manage split panes. Multiple application windows can be tiled from the titlebar.
8
+
9
+ This is a deliberate boundary: fpasoterm avoids reimplementing capabilities that belong to the user's shell, multiplexer, or TUI editor. This includes pane and session management, shell commands, job control, multiplexer configuration, and editor features supplied by Vim, Emacs, Fresh, Helix, and similar tools. Use those tools for their native workflows; fpasoterm provides the terminal surface, OS integration, and local customization hooks. New convenience behavior should normally be delivered as a plugin instead of expanding the core application. Compatibility with those multiplexers and TUI editors is a maintenance priority.
10
+
11
+ Kitty Graphics Protocol, SIXEL, and iTerm inline images are currently unsupported because image streams can freeze the Tauri/WebKitGTK renderer. `Ctrl+Shift+B` opens Broadcast Input, which selects local fpasoterm windows before sending one command. The same operation is available as `fpasoterm --broadcast "command"`; a trusted sync folder can optionally deliver the short-lived command to every already-running instance on another machine. See [Configuration](docs/config.en.md) and [Sync Folder](docs/sync.en.md).
12
+
13
+ Japanese documentation: [README.ja.md](README.ja.md). Installation instructions are available in [English](INSTALL.md) and [Japanese](INSTALL.ja.md).
14
+
15
+ - Tauri provides the application shell through the platform webview.
16
+ - xterm.js renders the terminal in the renderer process.
17
+ - Rust and portable-pty own the real shell/PTY in the backend process.
18
+
19
+ Japanese IME composition and keyboard layout switching are handled by the OS webview and xterm.js. fpasoterm does not intercept `かな` / `英数` key presses.
20
+
21
+ Set `FPASOTERM_DEBUG_KEYS=1` to print runtime key names to stderr and show the latest key/composition event in the window while testing Japanese keyboard keys.
22
+
23
+ Debug logs are also written to `~/.config/fpasoterm/User/logs/fpasoterm-debug.log`. The debug panel has a Copy button because xterm.js can capture normal terminal copy shortcuts.
24
+
25
+ For reproducible IME, rendering, clipboard, and window diagnostics, see the
26
+ [Debugging Guide](docs/debugging.en.md).
27
+
28
+ Use `Font / Glyph Test` in the window menu to inspect the active terminal font
29
+ settings and representative CJK, half-width kana, box drawing, symbol, and
30
+ Nerd Font glyphs. See [Font and Glyph Diagnostics](docs/font-diagnostics.en.md).
31
+ Use `Diagnostics > Capability Test` to inspect the terminal environment and
32
+ verify truecolor, OSC 52, OSC 8, OSC 9/99, OSC 7, OSC 133, bracketed-paste, and bell behavior. See
33
+ [Terminal Capability Diagnostics](docs/capability-diagnostics.en.md). The same
34
+ panel can persist an explicit UTF-8, Shift_JIS, or EUC-JP output decoder for a
35
+ new terminal session.
36
+
37
+ When the shell reports its local directory with OSC 7, use `Ctrl+Shift+o` or
38
+ **Window > New CWD** to open another fpasoterm window in that directory.
39
+
40
+ Terminal-output URLs and OSC 8 hyperlinks open an explicit confirmation dialog.
41
+ They can always be copied; opening a URL externally also requires
42
+ `[security] osc8Open = true`. Absolute paths remain copy-only links.
43
+
44
+ On Linux, Tauri uses WebKitGTK. If ChromeOS/Baguette shows black, white, or flickering surfaces while testing transparent windows, disable the DMA-BUF renderer for that launch:
45
+
46
+ ```sh
47
+ fpasoterm --disable-dmabuf
48
+ ```
49
+
50
+ ## Requirements
51
+
52
+ Detailed installation instructions are in [INSTALL.md](INSTALL.md).
53
+
54
+ For local ChromeOS Linux development:
55
+
56
+ ```sh
57
+ sudo apt install build-essential curl libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev
58
+ ```
59
+
60
+ Node.js and Rust are managed by mise in this workspace. You can also use system installations.
61
+
62
+ ## Run
63
+
64
+ ```sh
65
+ npm install
66
+ ./scripts/run
67
+ ```
68
+
69
+ For quick source-checking without rebuilding release bundles:
70
+
71
+ ```sh
72
+ ./bin/fpasoterm --dev
73
+ ```
74
+
75
+ Use this after editing renderer or Tauri source. It ignores any stale `src-tauri/target/release/fpasoterm` binary.
76
+ Add `--foreground --console-diagnostics` only when you need logs in the current console.
77
+
78
+ With mise:
79
+
80
+ ```sh
81
+ mise exec node -- npm install
82
+ mise exec node -- npm start
83
+ ```
84
+
85
+ To install a local command and launcher entry for this checkout:
86
+
87
+ ```sh
88
+ npm run install:desktop
89
+ fpasoterm
90
+ ```
91
+
92
+ The command is installed to `~/.local/bin/fpasoterm` by default. Set `XDG_BIN_HOME` to choose a different command directory.
93
+
94
+ To update the local command, launcher entry, and icons after pulling a newer checkout:
95
+
96
+ ```sh
97
+ npm run update:desktop
98
+ ```
99
+
100
+ To update an npm-installed fpasoterm package from the terminal:
101
+
102
+ ```sh
103
+ fpasoterm --self-update
104
+ ```
105
+
106
+ For a source checkout, update the checkout with your normal git or jj workflow,
107
+ then refresh desktop integration:
108
+
109
+ ```sh
110
+ fpasoterm --update-desktop
111
+ ```
112
+
113
+ To cleanly remove the local command, launcher entry, installed launcher icons, user config, runtime cache, and Tauri/WebKit app data:
114
+
115
+ ```sh
116
+ npm run uninstall:desktop
117
+ ```
118
+
119
+ On Windows, the same command removes fpasoterm-specific directories from the
120
+ current user's `Path` if they were added during local testing. It does not remove
121
+ shared npm directories from `Path`.
122
+
123
+ ## Command-line binary
124
+
125
+ Install from the npm registry:
126
+
127
+ ```sh
128
+ npm install -g fpasoterm
129
+ fpasoterm
130
+ ```
131
+
132
+ The npm package name and command are both `fpasoterm`.
133
+ Check the installed version without opening a window:
134
+
135
+ ```sh
136
+ fpasoterm --version
137
+ fpasoterm -v
138
+ fpasoterm --update-check
139
+ fpasoterm --doctor
140
+ ```
141
+
142
+ `--update-check` explicitly queries npm for the `latest` release and prints
143
+ whether an update is available. It is not run automatically at startup, from
144
+ `--help`, or by `--version`.
145
+
146
+ `--doctor` is a read-only maintenance report. From the Node launcher it checks
147
+ the selected config, npm latest version, and `npm audit --omit=dev`; it only
148
+ suggests `--self-update` and never updates automatically. A standalone bundled
149
+ binary reports config and update health, while npm audit is unavailable because
150
+ it has no npm package context.
151
+
152
+ In the GUI, open the hamburger menu, choose **Help**, then select **Check for
153
+ Updates**. The same panel shows the installed build, npm latest version, and
154
+ update status. This is also an explicit request; opening Help does not contact
155
+ the network.
156
+
157
+ On Windows, run the same check against the installed executable after replacing an older installer build. If the old UI is still visible but `fpasoterm --version` prints the older version, the previous executable is still the one being launched from `Path` or the Start menu.
158
+
159
+ During development, link the package to expose a `fpasoterm` command:
160
+
161
+ ```sh
162
+ npm link
163
+ fpasoterm
164
+ ```
165
+
166
+ Alternatively:
167
+
168
+ ```sh
169
+ npm install -g .
170
+ fpasoterm
171
+ ```
172
+
173
+ When the shell exits, for example by running `exit`, fpasoterm closes the application window.
174
+
175
+ ## Command-line Options
176
+
177
+ Normal launches using a cached runtime detach from the console and return the
178
+ shell prompt immediately:
179
+
180
+ ```sh
181
+ fpasoterm
182
+ ```
183
+
184
+ When a first source or npm-package launch needs a local Cargo build, the CLI
185
+ stays attached and prints phase 1/3 preparation, phase 2/3 compiler progress,
186
+ and phase 3/3 native window startup. Cargo errors are shown in that terminal;
187
+ the prompt returns after the window process is started. Timing and compiler
188
+ output are also appended to `~/.cache/fpasoterm/launcher.log` on Linux/macOS,
189
+ or `%LOCALAPPDATA%\\fpasoterm\\launcher.log` on Windows. Use
190
+ `--foreground --console-diagnostics` only when the caller must also wait for
191
+ the desktop process to exit.
192
+
193
+ Show available options:
194
+
195
+ ```sh
196
+ fpasoterm --help
197
+ ```
198
+
199
+ Shell completion is available for Bash, Zsh, Fish, and PowerShell. For example,
200
+ enable Bash completion in the current shell with:
201
+
202
+ ```bash
203
+ source <(fpasoterm --completion bash)
204
+ ```
205
+
206
+ See [Command Completion](docs/completion.en.md) for persistent installation and
207
+ Windows PowerShell instructions. Reinstall persistent completion after an app
208
+ update only when you want newly added CLI options to appear in Tab completion.
209
+
210
+ List running fpasoterm windows without opening another window:
211
+
212
+ ```sh
213
+ fpasoterm --list
214
+ fpasoterm -l
215
+ ```
216
+
217
+ Each line contains the process/session ID, displayed title, and startup time.
218
+
219
+ Close running windows by PID, exact displayed title, or the reserved `all` target:
220
+
221
+ ```sh
222
+ fpasoterm --close 12345
223
+ fpasoterm -q review-shell
224
+ fpasoterm --close all
225
+ ```
226
+
227
+ Useful one-shot overrides:
228
+
229
+ ```sh
230
+ fpasoterm --config ~/.config/fpasoterm/User/work.toml
231
+ fpasoterm --size 1200x760
232
+ fpasoterm --width 1200 --height 760
233
+ fpasoterm --shell pwsh.exe
234
+ fpasoterm --cwd .
235
+ fpasoterm --cwd ~/work/project --title project
236
+ fpasoterm --command "tmux attach -t work"
237
+ fpasoterm --title work --titlebar-color '#2e7d32'
238
+ fpasoterm --reset-config
239
+ fpasoterm --reset-window-state
240
+ ```
241
+
242
+ On Windows, fpasoterm uses PowerShell 7 (`pwsh.exe`) by default when it is
243
+ available. If it is not on `PATH`, fpasoterm also checks common install paths
244
+ such as `C:\Program Files\PowerShell\7\pwsh.exe`, then falls back to the OS
245
+ command shell. A full path can always be used with `--shell`.
246
+
247
+ Windows child shells also receive the fpasoterm executable directory at the
248
+ front of `Path`, so commands such as `fpasoterm --help` work inside a
249
+ fpasoterm terminal after installation.
250
+
251
+ macOS child shells receive the application executable directory at the front
252
+ of `PATH` as well. Running `fpasoterm` there opens a detached window and returns
253
+ the current prompt without waiting for that window to close.
254
+
255
+ By default, fpasoterm keeps its configured title even if the shell emits its own
256
+ title sequence. Use `OSC 777;title=...` for an intentional runtime rename.
257
+
258
+ Short options are available for common one-shot overrides:
259
+
260
+ ```sh
261
+ fpasoterm -t work -b '#2e7d32' -z 1200x760 -s pwsh.exe
262
+ fpasoterm -e "tmux attach -t work"
263
+ ```
264
+
265
+ The running window can also be renamed from inside the terminal with a POSIX shell:
266
+
267
+ ```sh
268
+ printf '\033]0;work\a\r\n'
269
+ printf '\033]777;titlebarColor=#2e7d32\a\r\n'
270
+ printf '\033]777;opacity=0.65\a\r\n'
271
+ printf '\033]777;title=work;titlebarColor=#2e7d32\a\r\n'
272
+ ```
273
+
274
+ Windows PowerShell and cmd.exe do not run those `printf` examples as-is. Use the
275
+ PowerShell form or the helper scripts below:
276
+
277
+ ```powershell
278
+ [Console]::Write("$([char]27)]777;title=work;titlebarColor=#2e7d32$([char]7)`r`n")
279
+ ```
280
+
281
+ The runtime config sample can be applied with:
282
+
283
+ ```sh
284
+ ./examples/apply-runtime-appearance.sh
285
+ ```
286
+
287
+ On Windows PowerShell or cmd.exe:
288
+
289
+ ```powershell
290
+ .\examples\apply-runtime-appearance.ps1
291
+ .\examples\apply-runtime-appearance.bat
292
+ ```
293
+
294
+ This sample changes the title to `RUNTIME SAMPLE ACTIVE`, switches the titlebar
295
+ to pink, and changes the terminal background and text colors.
296
+
297
+ To return the running window to the default appearance:
298
+
299
+ ```sh
300
+ ./examples/apply-default-appearance.sh
301
+ ```
302
+
303
+ On Windows PowerShell or cmd.exe:
304
+
305
+ ```powershell
306
+ .\examples\apply-default-appearance.ps1
307
+ .\examples\apply-default-appearance.bat
308
+ ```
309
+
310
+ Or, if you need to specify the path manually:
311
+
312
+ ```sh
313
+ config_path="$(pwd)/examples/config/runtime-appearance.toml"
314
+ printf '\033]777;config=%s\a\r\n' "$config_path"
315
+ ```
316
+
317
+ On Windows PowerShell:
318
+
319
+ ```powershell
320
+ $configPath = Resolve-Path .\examples\config\runtime-appearance.toml
321
+ [Console]::Write("$([char]27)]777;config=$configPath$([char]7)`r`n")
322
+ ```
323
+
324
+ Runtime config application keeps the current shell session running. It applies
325
+ live window and terminal appearance settings such as `window.title`,
326
+ `window.titlebarColor`, `window.width`, `window.height`, `terminal.fontSize`,
327
+ `terminal.lineHeight`, `terminal.fontFamily`, `terminal.backgroundOpacity`, and
328
+ `terminal.theme`.
329
+ Settings that require a new PTY, such as `terminal.shell`, take effect on the next launch.
330
+
331
+ Inspect the resolved settings and plugin load status without launching:
332
+
333
+ ```sh
334
+ fpasoterm --show-config
335
+ fpasoterm --config ~/.config/fpasoterm/User/work.toml --show-config
336
+ ```
337
+
338
+ Validate a configuration or prepare a Markdown report for an Issue without
339
+ opening a window:
340
+
341
+ ```sh
342
+ fpasoterm --config-check
343
+ fpasoterm --doctor
344
+ fpasoterm --diagnostics
345
+ fpasoterm --copy-diagnostics
346
+ fpasoterm --open-log-dir
347
+ ```
348
+
349
+ See [Configuration and Diagnostics](docs/diagnostics.en.md) for the exact
350
+ output, exit status, and clipboard requirements.
351
+
352
+ Use a named appearance or shell profile for one launch with
353
+ `fpasoterm --profile <name>`. See [Profiles](docs/config.en.md#profiles).
354
+
355
+ When a packaged `fpasoterm.exe` is launched directly on Windows, `--show-config`
356
+ prints the resolved runtime config as JSON. The Node launcher prints TOML and
357
+ plugin load details when it is available.
358
+
359
+ Enable or disable plugins in `config.toml`:
360
+
361
+ ```sh
362
+ fpasoterm --enable-plugin hello,theme
363
+ fpasoterm --disable-plugin hello,theme
364
+ ```
365
+
366
+ Plugin enable/disable commands are handled by the Node launcher. For direct
367
+ packaged binary launches, edit `config.toml` manually or use the npm-installed
368
+ `fpasoterm` command.
369
+
370
+ For debugging, keep the app attached to the current console:
371
+
372
+ ```sh
373
+ fpasoterm --foreground --console-diagnostics
374
+ ```
375
+
376
+ In a source checkout, force a fresh local debug-binary build when you want to confirm current behavior. This uses bundled static frontend assets and does not require a localhost development server. Omit `--foreground` when you want the shell prompt back after launch:
377
+
378
+ ```sh
379
+ ./bin/fpasoterm --dev
380
+ ```
381
+
382
+ For ChromeOS/Baguette WebKitGTK rendering diagnostics:
383
+
384
+ ```sh
385
+ fpasoterm --disable-dmabuf
386
+ ```
387
+
388
+ ## Configuration and Plugins
389
+
390
+ fpasoterm reads user configuration from:
391
+
392
+ ```text
393
+ ~/.config/fpasoterm/User/config.toml
394
+ ```
395
+
396
+ On launch, fpasoterm writes or refreshes the example file at:
397
+
398
+ ```text
399
+ ~/.config/fpasoterm/User/config.toml.example
400
+ ```
401
+
402
+ The example file is safe to regenerate because fpasoterm does not overwrite `config.toml`.
403
+
404
+ Example:
405
+
406
+ ```toml
407
+ [window]
408
+ rememberBounds = true
409
+ frame = false
410
+ [terminal]
411
+ fontSize = 15
412
+ lineHeight = 1
413
+ fontFamily = "Noto Sans Mono CJK JP, monospace"
414
+
415
+ [terminal.theme]
416
+ background = "rgba(16, 19, 23, 0.65)"
417
+ foreground = "#e8edf2"
418
+
419
+ [plugins]
420
+ enabled = ["plugins/example.ts"]
421
+ ```
422
+
423
+ Plugins must live under `~/.config/fpasoterm/User/plugins/`. JavaScript (`.js`) and TypeScript (`.ts`) plugins are supported. TypeScript plugins are transpiled into `~/.config/fpasoterm/User/cache/plugins/` at launch. They run in the renderer context, so enable only trusted local files that you have reviewed. See [Security](docs/security.en.md) for plugin and sync-folder trust boundaries.
424
+
425
+ Plugins can read `version`, run post-startup work through `onReady()`, and add
426
+ actions to the hamburger menu's `Plugins` submenu through `registerCommand()`.
427
+ Use `fpasoterm --plugin-list` to inspect discovered and enabled plugins in the
428
+ local `User/plugins` directory, or
429
+ `--plugin-enable` / `--plugin-disable` to update the enabled list. Use
430
+ `fpasoterm --plugin-info welcome-banner` for a plugin's source, enabled
431
+ state, description, and load status. Restart the affected window after an
432
+ enable or source change.
433
+
434
+ Remove a reviewed local plugin and its enabled entry with
435
+ `fpasoterm --plugin-uninstall <file>`. This is a local-only operation; it does
436
+ not contact the public port catalog.
437
+
438
+ To download one reviewed public plugin without cloning the ports repository or
439
+ installing Node.js, use `fpasoterm --plugin-install appearance/teal`. Add
440
+ `--enable` only after review to enable it. See [Plugins](docs/plugins.en.md)
441
+ for the fixed repository, validation, and overwrite rules.
442
+
443
+ For a reviewed local `fpasoterm-plugins` checkout, use
444
+ `fpasoterm --plugin-install appearance/teal --plugin-ports-dir ./fpasoterm-plugins --enable`.
445
+ For one trusted standalone source file, use
446
+ `fpasoterm --plugin-install-file ./my-plugin.ts --enable`. The ports project is
447
+ for catalog/INDEX search and plugin development or validation; fpasoterm performs
448
+ the end-user installation.
449
+
450
+ Use `fpasoterm --plugin-search [query]` to search official public port metadata
451
+ without installing a plugin or downloading plugin source. The output includes a
452
+ copyable `--plugin-install` command for every matching port. The command labels
453
+ its source as the remote official INDEX, while `--plugin-list` is local-only.
454
+
455
+ Minimal TypeScript plugin:
456
+
457
+ ```ts
458
+ /// <reference path="/path/to/fpasoterm/docs/fpasoterm-plugin.d.ts" />
459
+
460
+ const api = window.fpasotermPluginApi;
461
+ api.log('example plugin loaded');
462
+ api.terminal.options.cursorBlink = true;
463
+ ```
464
+
465
+ IME composition is displayed visually only. fpasoterm does not suppress, replay, replace, or directly commit text received from the WebView/xterm.js input path.
466
+
467
+ When `window.rememberBounds` is enabled, fpasoterm stores the last window size locally in `~/.config/fpasoterm/User/window-state.json`.
468
+
469
+ Window appearance and size are resolved in this order: default settings, explicit values in `config.toml`, saved `window-state.json` for size, then one-shot CLI overrides such as `--title`, `--titlebar-color`, and `--size`.
470
+
471
+ To return to the configured or default size manually, set `window.rememberBounds = false`, or run:
472
+
473
+ ```sh
474
+ fpasoterm --reset-window-state
475
+ ```
476
+
477
+ To restore every setting and window size to its platform default, run
478
+ `fpasoterm --reset-config` or `fpasoterm -R`. The existing file is renamed to
479
+ `config.toml.backup-<timestamp>` before a complete new `config.toml` is written.
480
+ The saved `window-state.json` is also removed so the default width of 1000 and
481
+ height of 680 take effect on the next launch.
482
+
483
+ The full default configuration is documented in [Configuration](docs/config.en.md). See [Plugins](docs/plugins.en.md) for the runtime/API contract and [`docs/fpasoterm-plugin.d.ts`](docs/fpasoterm-plugin.d.ts) for the supported API declaration. Sample configs are available in [examples/config](examples/config), and minimal local plugin examples are in [examples/plugins](examples/plugins). For reviewed, installable public plugins, use [fpasoterm-plugins](https://github.com/oyoguhito/fpasoterm-plugins), which owns the ports catalog, compatibility checks, updates, and contribution workflow.
484
+
485
+ For maintenance workflows across machines, fpasoterm can share diagnostics and
486
+ terminal output logs through a local sync folder such as Google Drive for
487
+ desktop. It does not use Google Drive API or OAuth. See [Sync Folder](docs/sync.en.md).
488
+ Run `fpasoterm --setup-sync` for an interactive first-time setup.
489
+ On Windows source checkouts, run `node .\bin\fpasoterm --setup-sync`.
490
+ Use `fpasoterm --sync-status` to inspect folder health and channels, or
491
+ `fpasoterm --sync-clean` to remove only expired sync command files.
492
+ Terminal output logs can be written from the hamburger menu with `Log Start (^S)` /
493
+ `Log Stop (^S)` or `Ctrl+Shift+S`, and inspected with `Log Show (^P)` or `Ctrl+Shift+P`.
494
+ `Log Show` displays the active log or the last log closed by `Log Stop`. Point
495
+ `logging.directory` at the same synced folder when you want those logs shared.
496
+ The log panel includes a search field and `Search` button for selecting and
497
+ scrolling to the next matching string in the displayed log. `N` moves to the
498
+ next match, `P` moves to the previous match, and `j` / `k` provide the same
499
+ navigation when the log text area has focus. Arrow keys remain available for
500
+ normal log scrolling.
501
+
502
+ Current platform limitations are tracked in [Known Issues](docs/known-issues.en.md) / [既知課題](docs/known-issues.ja.md).
503
+
504
+ ## Icon
505
+
506
+ The project icon is a PNG asset:
507
+
508
+ ```text
509
+ extra/logo/fpasoterm.png
510
+ ```
511
+
512
+ The desktop entry uses `Icon=io.github.oyoguhito.fpasoterm`; ChromeOS/Linux launchers resolve that name through the hicolor icon theme files under:
513
+
514
+ ```text
515
+ extra/linux/icons/hicolor/
516
+ ```
517
+
518
+ The installed entry uses `StartupWMClass=fpasoterm` and keeps the GTK
519
+ application id disabled so multiple fpasoterm windows can be started from the
520
+ CLI or launcher. ChromeOS/Linux launchers still resolve the shelf icon from
521
+ `Icon=io.github.oyoguhito.fpasoterm` for the ChromeOS shelf. The installer also writes a legacy
522
+ `fpasoterm` icon alias for environments that prefer short icon names.
523
+
524
+ For unpacked checkout installs, `npm run install:desktop` writes the installed
525
+ desktop entry with an absolute `Exec=` path to the local wrapper and no
526
+ `TryExec`. The wrapper records the Node.js executable used during installation
527
+ and also falls back to common `node` paths. This lets the ChromeOS launcher
528
+ start fpasoterm from the icon even when it does not inherit the user's shell
529
+ `PATH`.
530
+
531
+ The GTK application id is disabled so multiple fpasoterm processes can run.
532
+ When multiple fpasoterm windows are open, use `Tile (^T)` in the titlebar window
533
+ menu, or press `Ctrl+Shift+T`,
534
+ to arrange them into a grid on the current monitor. Windows and X11 support
535
+ native placement. Wayland compositors may reject application-controlled
536
+ positions; the terminal remains usable and the diagnostic panel reports the
537
+ placement error.
538
+ Use `Close All (^X)` in the same menu, or press `Ctrl+Shift+X`, to close every
539
+ running fpasoterm window.
540
+
541
+ When packaging a macOS `.app` bundle, use the generated icon at:
542
+
543
+ ```text
544
+ extra/macos/fpasoterm.icns
545
+ ```
546
+
547
+ On Windows, the app window uses the generated icon at:
548
+
549
+ ```text
550
+ extra/windows/fpasoterm.ico
551
+ ```
552
+
553
+ To replace the icon, update `extra/logo/fpasoterm.png`, regenerate the launcher sizes, and reinstall the desktop entry:
554
+
555
+ ```sh
556
+ npm run generate:icons
557
+ npm run update:desktop
558
+ ```
559
+
560
+ For Android-native packaging, use the same PNG as the source asset for the Android adaptive icon pipeline.
561
+
562
+ ## License
563
+
564
+ MIT. See [LICENSE](LICENSE).
565
+
566
+ ## Contributing
567
+
568
+ See [CONTRIBUTING.md](CONTRIBUTING.md) or [CONTRIBUTING.ja.md](CONTRIBUTING.ja.md).
569
+ Release history is tracked in [CHANGELOG.md](CHANGELOG.md).
570
+
571
+ ## Project Name
572
+
573
+ The jj bookmark `main` points at an empty initial commit. The app implementation lives in the child change named `Initial fpasoterm terminal app`.
574
+
575
+ ## jj Repository Initialization
576
+
577
+ ```sh
578
+ cd fpasoterm
579
+ ./scripts/init-jj-empty-main
580
+ ```
581
+
582
+ The script creates an empty `main` branch first, then records the initial project files on top of it.
583
+
584
+ ## Checks
585
+
586
+ ```sh
587
+ npm run check
588
+ npm run scan:secrets
589
+ desktop-file-validate extra/linux/io.github.oyoguhito.fpasoterm.desktop
590
+ npm run audit:prod
591
+ ```
592
+
593
+ GitHub Actions runs the same check set and Linux artifact build on pushes and
594
+ pull requests. Official cross-platform artifacts are built by the tag-based
595
+ Release workflow.
596
+
597
+ ## Documentation
598
+
599
+ - [Specification](docs/spec.en.md)
600
+ - [Configuration](docs/config.en.md)
601
+ - [Sync Folder](docs/sync.en.md)
602
+ - [Pull request review](docs/pr-review.en.md)
603
+ - [Debugging guide](docs/debugging.en.md)
604
+ - [Release checklist](docs/release-checklist.en.md)
605
+ ### SSHFS mounts
606
+
607
+ Use **Sync > SSHFS Mounts** to mount a remote directory under `User/mounts/<name>`. It uses your normal SSH keys, config, and agent by default; an optional password is used only for that mount and is never saved. See [SSHFS mounts](docs/sshfs.en.md).