@fresh-editor/fresh-editor 0.1.77 → 0.1.83

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
@@ -1,5 +1,33 @@
1
1
  # Release Notes
2
2
 
3
+ ## 0.1.83
4
+
5
+ ### Breaking Changes
6
+
7
+ * **QuickJS Plugin Runtime**: Replaced Deno with QuickJS for the plugin system. Each plugin now runs in its own isolated context.
8
+
9
+ ### Features
10
+
11
+ * **Cargo Workspace Architecture**: Refactored into modular crates (fresh-core, fresh-editor, fresh-languages, fresh-parser-js, fresh-plugin-runtime, fresh-plugin-api-macros).
12
+
13
+ ### Bug Fixes
14
+
15
+ * **Toggle Comment YAML**: Fixed toggle comment not working for YAML files by falling back to config-based language detection (#774).
16
+ * **Undo History Panic**: Fixed panic when undoing past a save point and making new edits caused out-of-bounds slice access (#776).
17
+ * **Sudo Save Prompt**: Fixed permission denied crash when saving files owned by another user; now shows sudo prompt correctly (#775).
18
+ * **Musl Plugin Support**: Plugins now work on musl target builds (x86_64/aarch64-unknown-linux-musl).
19
+ * **LSP Server Requests**: Fixed LSP server-to-client request handling not being dispatched to plugins.
20
+ * **Git Find File Selection**: Fixed race condition causing wrong file selection when pressing Enter quickly.
21
+ * **Plugin Cache**: Embedded plugins now cached in XDG cache dir instead of leaking temp directories.
22
+
23
+ ### Internal
24
+
25
+ * Improved compile times via LLVM optimization flag.
26
+ * Cross-platform path handling fixes for Windows.
27
+ * Test reliability improvements.
28
+
29
+ ---
30
+
3
31
  ## 0.1.77
4
32
 
5
33
  ### Documentation
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fresh-editor/fresh-editor",
3
- "version": "0.1.77",
3
+ "version": "0.1.83",
4
4
  "description": "A modern terminal-based text editor with plugin support",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1103,21 +1103,21 @@ globalThis.review_drill_down = async () => {
1103
1103
  const oldBufferId = await editor.createVirtualBuffer({
1104
1104
  name: `*OLD:${h.file}*`,
1105
1105
  mode: "normal",
1106
- read_only: true,
1106
+ readOnly: true,
1107
1107
  entries: oldEntries,
1108
- show_line_numbers: true,
1109
- editing_disabled: true,
1110
- hidden_from_tabs: true
1108
+ showLineNumbers: true,
1109
+ editingDisabled: true,
1110
+ hiddenFromTabs: true
1111
1111
  });
1112
1112
 
1113
1113
  const newBufferId = await editor.createVirtualBuffer({
1114
1114
  name: `*NEW:${h.file}*`,
1115
1115
  mode: "normal",
1116
- read_only: true,
1116
+ readOnly: true,
1117
1117
  entries: newEntries,
1118
- show_line_numbers: true,
1119
- editing_disabled: true,
1120
- hidden_from_tabs: true
1118
+ showLineNumbers: true,
1119
+ editingDisabled: true,
1120
+ hiddenFromTabs: true
1121
1121
  });
1122
1122
 
1123
1123
  // Convert hunks to composite buffer format (parse counts from git diff)
@@ -1493,7 +1493,7 @@ globalThis.start_review_diff = async () => {
1493
1493
  state.comments = []; // Reset comments for new session
1494
1494
 
1495
1495
  const bufferId = await VirtualBufferFactory.create({
1496
- name: "*Review Diff*", mode: "review-mode", read_only: true,
1496
+ name: "*Review Diff*", mode: "review-mode", readOnly: true,
1497
1497
  entries: (await renderReviewStream()).entries, showLineNumbers: false
1498
1498
  });
1499
1499
  state.reviewBufferId = bufferId;
@@ -1666,21 +1666,21 @@ globalThis.side_by_side_diff_current_file = async () => {
1666
1666
  const oldBufferId = await editor.createVirtualBuffer({
1667
1667
  name: `*OLD:${filePath}*`,
1668
1668
  mode: "normal",
1669
- read_only: true,
1669
+ readOnly: true,
1670
1670
  entries: oldEntries,
1671
- show_line_numbers: true,
1672
- editing_disabled: true,
1673
- hidden_from_tabs: true
1671
+ showLineNumbers: true,
1672
+ editingDisabled: true,
1673
+ hiddenFromTabs: true
1674
1674
  });
1675
1675
 
1676
1676
  const newBufferId = await editor.createVirtualBuffer({
1677
1677
  name: `*NEW:${filePath}*`,
1678
1678
  mode: "normal",
1679
- read_only: true,
1679
+ readOnly: true,
1680
1680
  entries: newEntries,
1681
- show_line_numbers: true,
1682
- editing_disabled: true,
1683
- hidden_from_tabs: true
1681
+ showLineNumbers: true,
1682
+ editingDisabled: true,
1683
+ hiddenFromTabs: true
1684
1684
  });
1685
1685
 
1686
1686
  // Convert hunks to composite buffer format
@@ -765,6 +765,6 @@ editor.on("mouse_click", "onCalculatorMouseClick");
765
765
  editor.on("mouse_move", "onCalculatorMouseMove");
766
766
 
767
767
  // Register main command
768
- editor.registerCommand("%cmd.calculator", "%cmd.calculator_desc", "calculator_open", "normal");
768
+ editor.registerCommand("%cmd.calculator", "%cmd.calculator_desc", "calculator_open", null);
769
769
 
770
770
  editor.setStatus(editor.t("status.loaded"));
@@ -817,7 +817,7 @@
817
817
  }
818
818
  },
819
819
  "PluginConfig": {
820
- "description": "Configuration for an individual plugin",
820
+ "description": "Configuration for a single plugin",
821
821
  "type": "object",
822
822
  "properties": {
823
823
  "enabled": {
@@ -481,12 +481,12 @@ globalThis.show_git_blame = async function(): Promise<void> {
481
481
  const bufferId = await editor.createVirtualBufferInExistingSplit({
482
482
  name: bufferName,
483
483
  mode: "git-blame",
484
- read_only: true,
484
+ readOnly: true,
485
485
  entries: entries,
486
- split_id: blameState.splitId!,
487
- show_line_numbers: true, // We DO want line numbers (headers won't have them due to source_offset: null)
488
- show_cursors: true,
489
- editing_disabled: true,
486
+ splitId: blameState.splitId!,
487
+ showLineNumbers: true, // We DO want line numbers (headers won't have them due to source_offset: null)
488
+ showCursors: true,
489
+ editingDisabled: true,
490
490
  });
491
491
 
492
492
  if (bufferId !== null) {
@@ -27,7 +27,11 @@ async function loadGitFiles(): Promise<string[]> {
27
27
  const result = await editor.spawnProcess("git", ["ls-files"]);
28
28
 
29
29
  if (result.exit_code === 0) {
30
- return result.stdout.split("\n").filter((line) => line.trim() !== "");
30
+ // Split by newline and trim each line to handle \r\n on Windows
31
+ return result.stdout
32
+ .split("\n")
33
+ .map((line) => line.trim())
34
+ .filter((line) => line !== "");
31
35
  }
32
36
 
33
37
  editor.debug(`Failed to load git files: ${result.stderr}`);
@@ -58,14 +62,14 @@ editor.registerCommand(
58
62
  "%cmd.find",
59
63
  "%cmd.find_desc",
60
64
  "start_git_find_file",
61
- "normal"
65
+ null
62
66
  );
63
67
 
64
68
  editor.registerCommand(
65
69
  "%cmd.reload",
66
70
  "%cmd.reload_desc",
67
71
  "git_reload_files",
68
- "normal"
72
+ null
69
73
  );
70
74
 
71
75
  editor.debug("Git Find File plugin loaded (using Finder abstraction)");
@@ -67,7 +67,7 @@ globalThis.start_git_grep = function (): void {
67
67
  };
68
68
 
69
69
  // Register command
70
- editor.registerCommand("%cmd.grep", "%cmd.grep_desc", "start_git_grep", "normal");
70
+ editor.registerCommand("%cmd.grep", "%cmd.grep_desc", "start_git_grep", null);
71
71
 
72
72
  // Log that plugin loaded successfully
73
73
  editor.debug("Git Grep plugin loaded (using Finder abstraction)");
@@ -766,12 +766,12 @@ globalThis.show_git_log = async function(): Promise<void> {
766
766
  const bufferId = await editor.createVirtualBufferInExistingSplit({
767
767
  name: "*Git Log*",
768
768
  mode: "git-log",
769
- read_only: true,
769
+ readOnly: true,
770
770
  entries: entries,
771
- split_id: gitLogState.splitId!,
772
- show_line_numbers: false,
773
- show_cursors: true,
774
- editing_disabled: true,
771
+ splitId: gitLogState.splitId!,
772
+ showLineNumbers: false,
773
+ showCursors: true,
774
+ editingDisabled: true,
775
775
  });
776
776
 
777
777
  if (bufferId !== null) {
@@ -900,12 +900,12 @@ globalThis.git_log_show_commit = async function(): Promise<void> {
900
900
  const bufferId = await editor.createVirtualBufferInExistingSplit({
901
901
  name: `*Commit: ${commit.shortHash}*`,
902
902
  mode: "git-commit-detail",
903
- read_only: true,
903
+ readOnly: true,
904
904
  entries: entries,
905
- split_id: gitLogState.splitId!,
906
- show_line_numbers: false, // Disable line numbers for cleaner diff view
907
- show_cursors: true,
908
- editing_disabled: true,
905
+ splitId: gitLogState.splitId!,
906
+ showLineNumbers: false, // Disable line numbers for cleaner diff view
907
+ showCursors: true,
908
+ editingDisabled: true,
909
909
  });
910
910
 
911
911
  if (bufferId !== null) {
@@ -1213,12 +1213,12 @@ globalThis.git_commit_detail_open_file = async function(): Promise<void> {
1213
1213
  const bufferId = await editor.createVirtualBufferInExistingSplit({
1214
1214
  name: `${file} @ ${commit.shortHash}`,
1215
1215
  mode: "git-file-view",
1216
- read_only: true,
1216
+ readOnly: true,
1217
1217
  entries: entries,
1218
- split_id: commitDetailState.splitId!,
1219
- show_line_numbers: true,
1220
- show_cursors: true,
1221
- editing_disabled: true,
1218
+ splitId: commitDetailState.splitId!,
1219
+ showLineNumbers: true,
1220
+ showCursors: true,
1221
+ editingDisabled: true,
1222
1222
  });
1223
1223
 
1224
1224
  if (bufferId !== null) {
@@ -465,7 +465,9 @@ export class Finder<T> {
465
465
  options.initialQuery
466
466
  );
467
467
  } else {
468
- this.editor.startPrompt(options.title, this.config.id);
468
+ this.editor.debug(`[Finder] calling startPrompt with title="${options.title}", id="${this.config.id}"`);
469
+ const result = this.editor.startPrompt(options.title, this.config.id);
470
+ this.editor.debug(`[Finder] startPrompt returned: ${result}`);
469
471
  }
470
472
  this.editor.setStatus("Type to search...");
471
473
  }
@@ -951,11 +953,11 @@ export class Finder<T> {
951
953
  }
952
954
 
953
955
  private closePreview(): void {
954
- if (this.previewState.bufferId !== null) {
956
+ if (this.previewState.bufferId || this.previewState.bufferId == 0) {
955
957
  this.editor.closeBuffer(this.previewState.bufferId);
956
958
  this.previewState.bufferId = null;
957
959
  }
958
- if (this.previewState.splitId !== null) {
960
+ if (this.previewState.splitId || this.previewState.splitId == 0) {
959
961
  this.editor.closeSplit(this.previewState.splitId);
960
962
  this.previewState.splitId = null;
961
963
  }