mirror of
https://github.com/tiddly-gittly/TidGi-Desktop.git
synced 2026-01-21 12:02:57 -08:00
* fix: not removed
* Optimize tidgi.config.json writes for workspace updates
Update logic to write tidgi.config.json only for the modified workspace instead of all wiki workspaces on each update. This reduces redundant file operations and improves performance during workspace updates.
* Refactor workspace saving and UI update logic
Introduced a private saveWorkspacesToSettings method to centralize logic for saving workspaces and removing syncable fields from wiki workspaces. The set and setWorkspaces methods now support skipping UI updates for batch operations, improving performance. Fixed minor issues in legacy migration and error messages.
* Add 'Ask AI' context menu and wiki embed split view
Introduces an 'Ask AI' option to the wiki context menu, enabling users to send selected text to an agent chat in a split view with the wiki embedded. Implements new tab type WIKI_EMBED, updates tab and channel types, adds localization, manages BrowserView bounds for embedding, and ensures persistence and IPC wiring for the new workflow.
* Update wiki
* electron chrome mcp mode sometimes wont show browser view
Clarified troubleshooting steps in docs/MCP.md regarding browser view issues and updated the instructions. Reordered the 'start:dev:mcp' script in package.json for better organization.
* Add agent selection to 'Talk with AI' context menu
Replaces the 'Ask AI' context menu with 'Talk with AI' and adds a submenu for selecting different agent definitions. Updates translations for all supported languages, modifies the askAIWithSelection channel to support agentDefId, and refactors tab creation logic to support split view with agent selection. Improves robustness in view management by handling case-insensitive workspace IDs and custom bounds logic.
* Add e2e test and refactor 'Talk with AI' split view logic
Introduces a new Cucumber feature for 'Talk with AI' from wiki selection, adds a step definition to trigger the workflow via IPC, and refactors split view tab creation to reuse existing tabs when possible. Updates the agent browser service to support finding or creating the appropriate split view tab, and adjusts menu and view services for improved robustness and code clarity. Also adds test IDs to relevant components for more reliable UI testing.
* Update defaultWiki.feature
* Add config error handling and i18n for agent errors
Introduces a new feature test for configuration error handling, adds step definition to remove AI settings for testing, and updates error message rendering to support new error types. Internationalized error messages and button labels for configuration issues are added in both English and Chinese locales. The error message renderer now uses a data-testid for easier testing and recognizes additional error types as fixable in settings.
* Refactor feature files to use two-column selector tables
Updated all feature files to use a standardized two-column format for selector tables, with explicit 'element description' and 'selector' columns. Step definitions in ui.ts were refactored to support this format, improving readability and maintainability of test steps and error handling.
* Delete tiddlywiki
* test: allow parallel
* test: implement scenario isolation for E2E tests
- Isolate each test scenario in test-artifacts/{scenarioSlug}/ directory
- Use dynamic ports for mock OpenAI server to avoid port conflicts
- Log VIEW_LOADED event via did-finish-load in main process (more reliable)
- Search all .log files when waiting for log markers
- Increase timeout for log marker steps to 15 seconds
- Fix ts-node cache issues by clearing cache before tests
- Move application launch to individual scenarios (required for mock server setup)
All 45 E2E test scenarios now pass consistently.
* refactor: optimize agent.feature by moving common steps to Background
- Add MockOpenAIServer.addRules() method to append responses dynamically
- Add 'I have started the mock OpenAI server without rules' step for Background
- Add 'I add mock OpenAI responses:' step to inject responses per scenario
- Move application launch and navigation to Background (shared by all scenarios)
- Keep scenario-specific mock responses in individual scenarios
This improves test maintainability by reducing duplication while keeping
scenario-specific configuration flexible.
* lint
* Refactor scenario path helpers into shared module
Moved scenario-specific path helper functions from individual step definition files to a centralized 'features/supports/paths.ts' module. Updated imports in step definitions to use the shared helpers, improving code reuse and maintainability. Also enhanced test for ContextService to skip optional runtime keys.
* Refactor slug generation to use shared slugify helper
Introduced a new src/helpers/slugify.ts utility for consistent slug generation across the codebase. Updated appPaths.ts to use the shared slugify function, improving maintainability and ensuring identical behavior for test scenario slugs. Added documentation and clarified slugification rules in relevant files. Minor comments and clarifications were added to E2E and mock server code.
* Enforce strict timeout rules in E2E test steps
Added and clarified critical warnings for AI agents regarding timeout modifications in application, cleanup, and wiki step definitions. All timeouts are now strictly limited to 5s local and 10s CI, with explicit comments and environment-based values. Updated documentation and code comments to reinforce that timeouts indicate real bugs and should not be increased.
* Update features/stepDefinitions/application.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Refactor E2E helpers, improve test reliability and cleanup
Centralizes data table parsing for UI step definitions, refactors mock OpenAI server setup, and improves workspace settings path handling for tests. Adjusts timeouts for window and app closing to better reflect real-world performance. Fixes type usage in workspace ID lookups and adds error handling for resize observer and cleanup in WikiEmbedTabContent. Enhances agent browser tab logic and view service cleanup to prevent memory leaks and catch workspace ID casing issues.
* Update agent.ts
* fix: resolve all E2E test timeout issues
* fix: improve CI test reliability with better timing and cleanup
- Use exponential-backoff library for agent creation retry logic
- Extend agent cancel delay to 1000ms for CI environments
- Fix git log refresh marker timing with queueMicrotask
- Improve cleanup timeout handling with force close strategy
All E2E tests passing locally including previously failing CI tests.
* Improve Git log E2E signal and add debug logging
Renames the test artifact in the CI workflow for clarity. Moves the E2E test timing log in useGitLogData to after entries are rendered, using a more reliable signal. Adds a debug log to notifyGitStateChange for better traceability.
* test-artifacts-ci
* Optimize test artifact handling and Git log logging
Update CI workflow to clean up large cache folders in test artifacts and only upload logs, settings, and screenshots to reduce artifact size. Refactor useGitLogData to log immediately after state updates for improved E2E test reliability, removing unnecessary setTimeout.
* Update useGitLogData.ts
* Improve Git log E2E test logging and .gitignore
Added 'test-artifacts-ci.zip' to .gitignore. Moved the '[test-id-git-log-refreshed]' log to immediately after data load for more reliable E2E test detection, and removed redundant logging from the render effect in useGitLogData.ts.
* Update useGitLogData.ts
* Update useGitLogData.ts
* Fix git log refresh marker not appearing in CI
- Move git-log-refreshed marker before RAF to ensure it's recorded
- RAF callbacks may not execute reliably in headless CI environments
- Add debug logging to track loadGitLog execution
- Add try-catch around log call to catch any errors
- Keep git-log-data-rendered in useEffect for UI tracking
* Update useGitLogData.ts
* Update useGitLogData.ts
* Add comprehensive logging to diagnose git-log-refreshed issue
- Log before RAF and inside RAF to pinpoint exact failure location
- Add try-catch to capture any errors
- Two log markers: before-raf and in-raf
- This will definitively show where the logging fails in CI
* Fix race condition: prevent concurrent loadGitLog calls
Root cause: commit triggers 2 refreshes (gitStateChange$ + handleCommitSuccess)
- First loadGitLog (refreshTrigger=1) succeeds
- Second loadGitLog (refreshTrigger=2) starts but never completes
- Add loadGitLogInProgress guard to prevent concurrent execution
- Log when loadGitLog is skipped due to in-progress call
This ensures git-log-refreshed is always logged after commit.
* Remove redundant triggerRefresh calls causing race condition
- handleCommitSuccess/Revert/Undo no longer call triggerRefresh
- gitStateChange\$ observable already triggers refresh for these operations
- Redundant calls caused 2 concurrent loadGitLog, causing CI test failures
- Local tests passed because both completed; CI failed because 2nd never completed
This ensures only 1 loadGitLog runs per git operation.
* Remove unused triggerRefresh parameter from useCommitSelection
- triggerRefresh no longer used in handlers
- Remove from interface and call site
- Clean up lint errors
* Remove triggerRefresh completely - no longer needed
- Observable subscription handles all git state changes
- Remove function definition and exports
- Fix all lint errors
Root cause resolved: commit triggered double refresh causing race condition.
Now only single refresh via observable.
* Remove fixed time waits from gitLog.feature and fix race condition
- Remove all fixed time wait steps from gitLog.feature (14 instances)
- Remove redundant triggerRefresh calls in handleCommitSuccess/Revert/Undo
- Add loadGitLogInProgress guard to prevent concurrent loadGitLog
- Root cause: commit triggered 2 refreshes causing race condition
- Only gitStateChange\$ observable now triggers refresh
- All 4 gitLog tests pass locally
* Fix clear timing: clear log BEFORE commit, not after
Root cause: test cleared git-log-refreshed AFTER commit completed
- But commit already triggered refresh and logged git-log-refreshed
- Clear deleted it, then test waited for new log that would never come
- Solution: clear BEFORE clicking commit button
- This way commit's git-log-refreshed is the first one after clear
Test now passes locally.
* Update cleanup.ts
* Initial commit when init a new git.
* Refactor feature steps for multi-element and log marker tables
Updated multiple feature files and step definitions to support table-driven steps for clicking and asserting multiple elements, and for waiting for multiple log markers in sequence. This reduces redundant waits, improves test reliability, and streamlines Gherkin syntax for multi-element actions and assertions. Also removed unnecessary manual wait steps where content or element checks now handle waiting automatically.
* Minor code cleanup and formatting improvements
Reordered imports in browserView.ts, fixed whitespace in cleanup.ts and useGitLogData.ts, and improved line formatting in GitLog/index.tsx for better readability and consistency.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: tidgi <tiddlygit@gmail.com>
190 lines
13 KiB
Gherkin
190 lines
13 KiB
Gherkin
Feature: Git Log Window
|
|
As a user
|
|
I want to view git commit history in a dedicated window
|
|
So that I can track changes to my wiki
|
|
|
|
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')"
|
|
# Enable file system watch for testing (default is false in production)
|
|
When I update workspace "wiki" settings:
|
|
| property | value |
|
|
| enableFileSystemWatch | true |
|
|
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
|
|
And I wait for "git initialization" log marker "[test-id-git-init-complete]"
|
|
|
|
@git
|
|
Scenario: View git commit in Git Log window
|
|
# Create a new tiddler file to trigger a git commit
|
|
When I create file "{tmpDir}/wiki/tiddlers/GitLogTestTiddler.tid" with content:
|
|
"""
|
|
created: 20250226070000000
|
|
modified: 20250226070000000
|
|
title: GitLogTestTiddler
|
|
tags: TestTag
|
|
|
|
This is a test tiddler for git log feature.
|
|
"""
|
|
Then I wait for tiddler "GitLogTestTiddler" to be added by watch-fs
|
|
# Use menu to commit the file - this will use default message (no AI configured)
|
|
When I click menu "知识库 > 立即本地Git备份"
|
|
# wait for git operation to complete
|
|
Then I wait for "git commit completed" log marker "[test-id-git-commit-complete]"
|
|
# Open Git Log through menu
|
|
When I click menu "知识库 > 查看历史备份"
|
|
And I switch to "gitHistory" window
|
|
And I wait for the page to load completely
|
|
# Wait for git log to query history and render UI
|
|
Then I wait for "git log UI refreshed" log marker "[test-id-git-log-refreshed]"
|
|
# Verify the git log window shows commits
|
|
Then I should see "git log list and commit with default message" elements with selectors:
|
|
| element description | selector |
|
|
| git log list | [data-testid='git-log-list'] |
|
|
| commit with default message | p.MuiTypography-body2:has-text('使用太记桌面版备份') |
|
|
# Click on the commit row containing GitLogTestTiddler file
|
|
When I click on a "commit row with GitLogTestTiddler" element with selector "[data-testid^='commit-row-']:has-text('GitLogTestTiddler')"
|
|
# Verify the filename appears in the details panel (may include path like tiddlers/GitLogTestTiddler.tid)
|
|
Then I should see a "GitLogTestTiddler.tid file in details" element with selector "li:has-text('GitLogTestTiddler')"
|
|
|
|
@git
|
|
Scenario: Git Log window shows uncommitted changes and commit now button works
|
|
# Modify the existing Index.tid file to create uncommitted changes
|
|
And I modify file "{tmpDir}/wiki/tiddlers/Index.tid" to contain "Modified Index content - testing realtime update!"
|
|
Then I wait for tiddler "Index" to be updated by watch-fs
|
|
# Open Git Log window
|
|
When I click menu "知识库 > 查看历史备份"
|
|
And I should see "Modified Index content" in the browser view content
|
|
And I switch to "gitHistory" window
|
|
And I wait for the page to load completely
|
|
# Verify uncommitted changes is auto-selected by checking if the file list is visible
|
|
Then I should see "uncommitted changes row and Index.tid file in uncommitted list" elements with selectors:
|
|
| element description | selector |
|
|
| uncommitted changes row | [data-testid='uncommitted-changes-row']|
|
|
| Index.tid file in uncommitted list | li:has-text('Index.tid') |
|
|
# Switch to Actions tab to access commit button
|
|
When I click on a "actions tab" element with selector "button[role='tab']:has-text('操作')"
|
|
# Verify the commit now button is visible
|
|
Then I should see a "commit now button" element with selector "button[data-testid='commit-now-button']"
|
|
# Clear old git-log-refreshed markers BEFORE clicking commit button
|
|
When I clear log lines containing "[test-id-git-log-refreshed]"
|
|
# Click the commit now button
|
|
When I click on a "commit now button" element with selector "button[data-testid='commit-now-button']"
|
|
# Wait for git commit to complete and UI to refresh
|
|
Then I wait for log markers:
|
|
| description | marker |
|
|
| git commit completed | [test-id-git-commit-complete] |
|
|
| git log refreshed after commit | [test-id-git-log-refreshed] |
|
|
# Verify that uncommitted changes row is gone (commit was successful)
|
|
Then I should not see a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
|
# Verify the correct commit is selected and we're on the latest commit (should show amend button)
|
|
Then I should see "selected commit row and commit message and amend button and revert button" elements with selectors:
|
|
| element description | selector |
|
|
| selected commit row | [data-testid^='commit-row-'][data-selected='true']:has-text('使用太记桌面版备份') |
|
|
| commit message | p.MuiTypography-body2:has-text('使用太记桌面版备份') |
|
|
| amend button | button:has-text('修改') |
|
|
| revert button | button:has-text('回滚') |
|
|
# Clear the git-log-refreshed marker BEFORE clicking revert button
|
|
When I clear log lines containing "[test-id-git-log-refreshed]"
|
|
# Click revert button
|
|
When I click on a "revert button" element with selector "button:has-text('回滚')"
|
|
# Wait for git revert operation to complete and UI to refresh
|
|
Then I wait for log markers:
|
|
| description | marker |
|
|
| git revert completed | [test-id-git-revert-complete] |
|
|
| git log refreshed after revert | [test-id-git-log-refreshed] |
|
|
# Verify new revert commit is selected and revert button is visible
|
|
Then I should see "selected revert commit row and revert button for the new revert commit" elements with selectors:
|
|
| element description | selector |
|
|
| selected revert commit row | [data-testid^='commit-row-'][data-selected='true']:has-text('回退提交') |
|
|
| revert button for the new revert commit| button:has-text('回滚') |
|
|
# Switch back to main window to verify the revert
|
|
When I switch to "main" window
|
|
# Wait for tiddler to be updated by watch-fs after git revert
|
|
Then I wait for tiddler "Index" to be updated by watch-fs
|
|
# The modified content should be reverted, and make sure file won't be deleted
|
|
Then I should not see a "missing tiddler indicator" element in browser view with selector "[data-tiddler-title='Index']:has-text('佚失')"
|
|
Then I should not see a "modified content in Index tiddler" element in browser view with selector "[data-tiddler-title='Index']:has-text('Modified Index content')"
|
|
|
|
@git
|
|
Scenario: Discard uncommitted changes for a single file
|
|
# Modify the existing Index.tid file to create uncommitted changes
|
|
And I modify file "{tmpDir}/wiki/tiddlers/Index.tid" to contain "Discard test content - should be reverted!"
|
|
Then I wait for tiddler "Index" to be updated by watch-fs
|
|
# Open Git Log window
|
|
When I click menu "知识库 > 查看历史备份"
|
|
And I should see "Discard test content" in the browser view content
|
|
And I switch to "gitHistory" window
|
|
And I wait for the page to load completely
|
|
Then I should see a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
|
# Click on the uncommitted changes row
|
|
When I click on a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
|
# Verify we can see the modified Index.tid file
|
|
Then I should see a "Index.tid file in uncommitted list" element with selector "li:has-text('Index.tid')"
|
|
# Click on the Index.tid file to select it
|
|
When I click on a "Index.tid file in list" element with selector "li:has-text('Index.tid')"
|
|
# Verify the file diff panel has loaded by checking for the file name header
|
|
Then I should see a "file name header in diff panel" element with selector "h6:has-text('Index.tid')"
|
|
# Click the Actions tab in the file diff panel (the one that has the file name above it)
|
|
# We need to find the Actions tab that is a sibling of the h6 containing "Index.tid"
|
|
When I click on a "actions tab in file diff panel" element with selector "h6:has-text('Index.tid') ~ div button[role='tab']:has-text('操作')"
|
|
# Verify the discard changes button exists (only shows for uncommitted changes)
|
|
Then I should see a "discard changes button" element with selector "button:has-text('放弃修改')"
|
|
When I click on a "discard changes button" element with selector "button:has-text('放弃修改')"
|
|
# Verify the file is no longer in the uncommitted list (should go back to showing no selection)
|
|
Then I should not see a "Index.tid file still selected" element with selector "li:has-text('Index.tid')[class*='selected']"
|
|
# Switch back to main window to verify the discard
|
|
When I switch to "main" window
|
|
# The modified content should be discarded
|
|
Then I should not see a "modified content in Index tiddler" element in browser view with selector "[data-tiddler-title='Index']:has-text('Discard test content')"
|
|
|
|
@git
|
|
Scenario: Git Log window auto-refreshes when files change (only when window is open)
|
|
# Open Git Log window FIRST
|
|
When I click menu "知识库 > 查看历史备份"
|
|
And I switch to "gitHistory" window
|
|
And I wait for the page to load completely
|
|
# Should see initial commits
|
|
Then I should see a "commit history list" element with selector "[data-testid='git-log-list']"
|
|
# Now modify a file WHILE window is open - this should trigger auto-refresh
|
|
When I switch to "main" window
|
|
And I modify file "{tmpDir}/wiki/tiddlers/Index.tid" to contain "Modified with window open"
|
|
Then I wait for tiddler "Index" to be updated by watch-fs
|
|
# Wait for git log to auto-refresh after detecting file changes
|
|
And I wait for "git log auto-refreshed after file change" log marker "[test-id-git-log-refreshed]"
|
|
# Switch back to git log window
|
|
When I switch to "gitHistory" window
|
|
# Should see uncommitted changes row appear or update
|
|
Then I should see a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
|
# Click on uncommitted changes to verify the modified file is there
|
|
When I click on a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
|
# Should see Index.tid in the uncommitted list
|
|
Then I should see a "Index.tid in uncommitted list" element with selector "li:has-text('Index.tid')"
|
|
# Now create a NEW file while window is still open
|
|
When I switch to "main" window
|
|
And I create file "{tmpDir}/wiki/tiddlers/AutoRefreshTest.tid" with content:
|
|
"""
|
|
created: 20250227070000000
|
|
modified: 20250227070000000
|
|
title: AutoRefreshTest
|
|
tags: TestTag
|
|
|
|
This file is created to test auto-refresh when git log window is open.
|
|
"""
|
|
Then I wait for tiddler "AutoRefreshTest" to be added by watch-fs
|
|
# Wait for git log to auto-refresh after detecting new file
|
|
And I wait for "git log auto-refreshed after new file" log marker "[test-id-git-log-refreshed]"
|
|
# Switch back to git log window
|
|
When I switch to "gitHistory" window
|
|
# The uncommitted changes row should still be visible
|
|
Then I should see a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
|
# Click on uncommitted changes again to see both files
|
|
When I click on a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
|
# Both Index.tid and AutoRefreshTest.tid should be in the uncommitted list
|
|
Then I should see "Index.tid and AutoRefreshTest.tid in uncommitted list" elements with selectors:
|
|
| element description | selector |
|
|
| Index.tid in uncommitted list | li:has-text('Index.tid') |
|
|
| AutoRefreshTest.tid in uncommitted list | li:has-text('AutoRefreshTest.tid') |
|