mirror of
https://github.com/tiddly-gittly/TidGi-Desktop.git
synced 2025-12-05 18:20:39 -08:00
* Add watch-filesystem-adaptor plugin and worker IPC Introduces the watch-filesystem-adaptor TiddlyWiki plugin, enabling tag-based routing of tiddlers to sub-wikis by querying workspace info via worker thread IPC. Adds workerServiceCaller utility for worker-to-main service calls, updates workerAdapter and bindServiceAndProxy to support explicit service registration for workers, and documents the new IPC architecture. Updates wikiWorker and startNodeJSWiki to preload workspace ID and load the new plugin. Also updates the plugin build script to compile and copy the new plugin. * test: wiki operation steps * Add per-wiki labeled logging and console hijack Introduces labeled loggers for each wiki, writing logs to separate files. Adds a logFor method to NativeService for logging with labels, updates interfaces, and hijacks worker thread console methods to redirect logs to main process for wiki-specific logging. Refactors workspaceID usage to workspace object for improved context. * Update log handling for wiki worker and tests Enhanced logging tests to check all log files, including wiki logs. Adjusted logger to write wiki worker logs to the main log directory. Updated e2e app script comment for correct usage. * Enable worker thread access to main process services Introduces a proxy system allowing worker threads to call main process services with full type safety and observable support. Adds worker-side service proxy creation, auto-attaches proxies to global.service, and updates service registration to use IPC descriptors. Documentation is added for usage and architecture. * Update ErrorDuringStart.md * chore: upgrade ipc cat and allow clean vite cache * Refactor wiki worker initialization and service readiness Moved wiki worker implementation from wikiWorker.ts to wikiWorker/index.ts and deleted the old file. Added servicesReady.ts to manage worker service readiness and callbacks, and integrated notifyServicesReady into the worker lifecycle. Updated console hijack logic to wait for service readiness before hijacking. Improved worker management in Wiki service to support detaching workers and notifying readiness. * Refactor wiki logging to use centralized logger Removed per-wiki loggers and console hijacking in favor of a single labeled logger. All wiki logs, including errors, are now written to a unified log file. Updated worker and service code to route logs through the main logger and removed obsolete log file naming and management logic. * fix: ipc cat log error * Refactor wiki test paths and improve file save logic Updated test step to use wikiTestRootPath for directory replacements and added wikiTestRootPath to paths.ts for clarity. Improved error handling and directory logic in watch-filesystem-adaptor.ts, including saving tiddlers directly to sub-wiki folders, more informative logging, and ensuring cleanup after file writes is properly awaited. * rename * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * feat: basic watch-fs * feat: check file not exist * refactor: use exponential-backoff * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * Initial commit when init a new git. * fix: cleanup * Refactor test setup and cleanup to separate file Moved Before and After hooks from application.ts to a new cleanup.ts file for better organization and separation of concerns. Also removed unused imports and related code from application.ts. Minor type simplification in agent.ts for row parsing. * test: modify and rename * feat: enableFileSystemWatch * refactor: unused utils.ts * Update watch-filesystem-adaptor.ts * refactor: use node-sentinel-file-watcher * refactor: extract to two classes * The logFor method lacks JSDoc describing the level parameter's * Update startNodeJSWiki.ts * fix: napi build * Update electron-rebuild command in workflows Changed the electron-rebuild command in release and test GitHub Actions workflows to use a comma-separated list for native modules instead of multiple -w flags. This simplifies the rebuild step for better-sqlite3 and nsfw modules. * lint * not build nsfw, try use prebuild * Update package.json * Update workerAdapter.ts * remove subWikiPlugin.ts as we use new filesystem adaptor that supports tag based sub wiki * fix: build * fix: wrong type * lint * remove `act(...)` warnings * uninstall chokidar * refactor and test * lint * remove unused logic, as we already use ipc syncadaptor, not afriad of wiki status change * Update translation.json * test: increast timeout in CI * Update application.ts * fix: AI's wrong cleanup logic hidden by as unknown as * fix: AI's wrong as unknown as * Update agent.feature * Update wikiSearchPlugin.ts * fix: A dynamic import callback was not specified.
156 lines
9.2 KiB
Gherkin
156 lines
9.2 KiB
Gherkin
Feature: Filesystem Plugin
|
|
As a user
|
|
I want tiddlers with specific tags to be saved to sub-wikis automatically
|
|
So that I can organize content across wikis
|
|
|
|
Background:
|
|
Given I cleanup test wiki so it could create a new one on start
|
|
And I launch the TidGi application
|
|
And I wait for the page to load completely
|
|
Then I should see a "default wiki workspace" element with selector "div[data-testid^='workspace-']:has-text('wiki')"
|
|
When I click on a "default wiki workspace button" element with selector "div[data-testid^='workspace-']:has-text('wiki')"
|
|
Then the browser view should be loaded and visible
|
|
And I wait for SSE and watch-fs to be ready
|
|
|
|
@subwiki
|
|
Scenario: Tiddler with tag saves to sub-wiki folder
|
|
# Create sub-workspace linked to the default wiki
|
|
When I click on an "add workspace button" element with selector "#add-workspace-button"
|
|
And I switch to "addWorkspace" window
|
|
# Toggle to sub-workspace mode by clicking the switch
|
|
And I click on a "main/sub workspace switch" element with selector "[data-testid='main-sub-workspace-switch']"
|
|
# Select the first (default) wiki workspace from dropdown
|
|
And I select "wiki" from MUI Select with test id "main-wiki-select"
|
|
# Type folder name
|
|
And I type "SubWiki" in "sub wiki folder name input" element with selector "input[aria-describedby*='-helper-text'][value='wiki']"
|
|
And I type "TestTag" in "tag name input" element with selector "[data-testid='tagname-autocomplete-input']"
|
|
And I click on a "create sub workspace button" element with selector "button.MuiButton-colorSecondary"
|
|
And I switch to "main" window
|
|
Then I should see a "SubWiki workspace" element with selector "div[data-testid^='workspace-']:has-text('SubWiki')"
|
|
# Switch to default wiki and create tiddler with tag
|
|
When I click on a "default wiki workspace button" element with selector "div[data-testid^='workspace-']:has-text('wiki')"
|
|
And I click on "add tiddler button" element in browser view with selector "button[aria-label='添加条目']"
|
|
And I wait for 0.2 seconds
|
|
And I type "Test Tiddler Title" in "title input" element in browser view with selector "input.tc-titlebar.tc-edit-texteditor"
|
|
And I type "TestTag" in "tag input" element in browser view with selector "input.tc-edit-texteditor.tc-popup-handle"
|
|
And I press "Enter" in browser view
|
|
And I click on "confirm button" element in browser view with selector "button[aria-label='确定对此条目的更改']"
|
|
# Verify the tiddler file exists in sub-wiki folder (not in tiddlers subfolder)
|
|
Then file "Test Tiddler Title.tid" should exist in "{tmpDir}/SubWiki"
|
|
|
|
@file-watching
|
|
Scenario: External file creation syncs to wiki
|
|
# Create a test tiddler file directly on filesystem
|
|
When I create file "{tmpDir}/wiki/tiddlers/WatchTestTiddler.tid" with content:
|
|
"""
|
|
created: 20250226070000000
|
|
modified: 20250226070000000
|
|
title: WatchTestTiddler
|
|
|
|
Initial content from filesystem
|
|
"""
|
|
# Wait for watch-fs to detect and add the tiddler
|
|
Then I wait for tiddler "WatchTestTiddler" to be added by watch-fs
|
|
# Open sidebar "最近" tab to see the timeline
|
|
And I click on "sidebar tab" element in browser view with selector "div.tc-tab-buttons.tc-sidebar-tabs-main > button:has-text('最近')"
|
|
And I wait for 0.5 seconds
|
|
# Click on the tiddler link in timeline to open it
|
|
And I click on "timeline link" element in browser view with selector "div.tc-timeline a.tc-tiddlylink:has-text('WatchTestTiddler')"
|
|
# Verify the tiddler content is displayed
|
|
Then I should see "Initial content from filesystem" in the browser view content
|
|
|
|
@file-watching
|
|
Scenario: External file modification and deletion sync to wiki
|
|
# Create initial file
|
|
When I create file "{tmpDir}/wiki/tiddlers/TestTiddler.tid" with content:
|
|
"""
|
|
created: 20250226070000000
|
|
modified: 20250226070000000
|
|
title: TestTiddler
|
|
|
|
Original content
|
|
"""
|
|
Then I wait for tiddler "TestTiddler" to be added by watch-fs
|
|
# Open the tiddler to view it
|
|
And I click on "sidebar tab" element in browser view with selector "div.tc-tab-buttons.tc-sidebar-tabs-main > button:has-text('最近')"
|
|
And I wait for 0.5 seconds
|
|
And I click on "timeline link" element in browser view with selector "div.tc-timeline a.tc-tiddlylink:has-text('TestTiddler')"
|
|
Then I should see "Original content" in the browser view content
|
|
# Modify the file externally
|
|
When I modify file "{tmpDir}/wiki/tiddlers/TestTiddler.tid" to contain "Modified content from external editor"
|
|
Then I wait for tiddler "TestTiddler" to be updated by watch-fs
|
|
# Verify the wiki shows updated content (should auto-refresh)
|
|
Then I should see "Modified content from external editor" in the browser view content
|
|
# Now delete the file externally
|
|
When I delete file "{tmpDir}/wiki/tiddlers/TestTiddler.tid"
|
|
Then I wait for tiddler "TestTiddler" to be deleted by watch-fs
|
|
# Re-open timeline to see updated list
|
|
And I click on "sidebar tab" element in browser view with selector "div.tc-tab-buttons.tc-sidebar-tabs-main > button:has-text('最近')"
|
|
# The timeline should not have a clickable link to TestTiddler anymore
|
|
Then I should not see a "TestTiddler timeline link" element in browser view with selector "div.tc-timeline a.tc-tiddlylink:has-text('TestTiddler')"
|
|
|
|
@file-watching
|
|
Scenario: External file rename syncs to wiki
|
|
# Create initial file
|
|
When I create file "{tmpDir}/wiki/tiddlers/OldName.tid" with content:
|
|
"""
|
|
created: 20250226070000000
|
|
modified: 20250226070000000
|
|
title: OldName
|
|
|
|
Content before rename
|
|
"""
|
|
Then I wait for tiddler "OldName" to be added by watch-fs
|
|
# Open sidebar to see the timeline
|
|
And I click on "sidebar tab" element in browser view with selector "div.tc-tab-buttons.tc-sidebar-tabs-main > button:has-text('最近')"
|
|
And I wait for 0.5 seconds
|
|
And I click on "timeline link" element in browser view with selector "div.tc-timeline a.tc-tiddlylink:has-text('OldName')"
|
|
Then I should see "Content before rename" in the browser view content
|
|
# Rename the file externally
|
|
When I rename file "{tmpDir}/wiki/tiddlers/OldName.tid" to "{tmpDir}/wiki/tiddlers/NewName.tid"
|
|
# Update the title field in the renamed file to match the new filename
|
|
And I modify file "{tmpDir}/wiki/tiddlers/NewName.tid" to contain:
|
|
"""
|
|
created: 20250226070000000
|
|
modified: 20250226070000000
|
|
title: NewName
|
|
|
|
Content before rename
|
|
"""
|
|
# Wait for the new tiddler to be detected and synced
|
|
Then I wait for tiddler "NewName" to be updated by watch-fs
|
|
# Navigate to timeline to verify changes
|
|
And I click on "sidebar tab" element in browser view with selector "div.tc-tab-buttons.tc-sidebar-tabs-main > button:has-text('最近')"
|
|
And I wait for 0.5 seconds
|
|
# Verify new name appears
|
|
And I click on "timeline link" element in browser view with selector "div.tc-timeline a.tc-tiddlylink:has-text('NewName')"
|
|
Then I should see "Content before rename" in the browser view content
|
|
|
|
@file-watching
|
|
Scenario: External field modification syncs to wiki
|
|
# Modify an existing tiddler file by adding a tags field to TiddlyWikiIconBlue.png
|
|
When I modify file "{tmpDir}/wiki/tiddlers/TiddlyWikiIconBlue.png.tid" to add field "tags: TestTag"
|
|
Then I wait for tiddler "TiddlyWikiIconBlue.png" to be updated by watch-fs
|
|
# Open the tiddler to verify the tag was added
|
|
And I click on "sidebar tab" element in browser view with selector "div.tc-tab-buttons.tc-sidebar-tabs-main > button:has-text('最近')"
|
|
And I wait for 1 seconds
|
|
And I click on "timeline link" element in browser view with selector "div.tc-timeline a.tc-tiddlylink:has-text('TiddlyWikiIconBlue.png')"
|
|
And I wait for 1 seconds
|
|
# Verify the tag appears in the tiddler using data attribute
|
|
Then I should see a "TestTag tag" element in browser view with selector "[data-tiddler-title='TiddlyWikiIconBlue.png'] [data-tag-title='TestTag']"
|
|
# Now modify Index.tid by adding a tags field
|
|
When I modify file "{tmpDir}/wiki/tiddlers/Index.tid" to add field "tags: AnotherTag"
|
|
Then I wait for tiddler "Index" to be updated by watch-fs
|
|
And I wait for 1 seconds
|
|
# Index is displayed by default, verify the AnotherTag appears in Index tiddler
|
|
Then I should see a "AnotherTag tag" element in browser view with selector "[data-tiddler-title='Index'] [data-tag-title='AnotherTag']"
|
|
# Modify favicon.ico.meta file by adding a tags field
|
|
When I modify file "{tmpDir}/wiki/tiddlers/favicon.ico.meta" to add field "tags: IconTag"
|
|
Then I wait for tiddler "favicon.ico" to be updated by watch-fs
|
|
# Navigate to favicon.ico tiddler
|
|
And I click on "sidebar tab" element in browser view with selector "div.tc-tab-buttons.tc-sidebar-tabs-main > button:has-text('最近')"
|
|
And I wait for 0.5 seconds
|
|
And I click on "timeline link" element in browser view with selector "div.tc-timeline a.tc-tiddlylink[href='#favicon.ico']"
|
|
And I wait for 1 seconds
|
|
# Verify the IconTag appears in favicon.ico tiddler
|
|
Then I should see a "IconTag tag" element in browser view with selector "[data-tiddler-title='favicon.ico'] [data-tag-title='IconTag']"
|