- Replace direct crypto.getRandomValues with getCryptoRandomValues
- Fixes Node.js test environment compatibility
- Maintains production behavior in Electron
- Create getCryptoRandomValues() utility
- Support both window.crypto (browser/Electron) and crypto.webcrypto (Node.js)
- Add comprehensive test coverage for adapter functionality
- Added Buy Me a Coffee and GitHub Sponsor funding links to manifest.json
- Fixed description formatting with proper punctuation
- Updated manifest schema to include fundingUrl section
Replace plural pronouns (we, our, us) with singular/project voice
throughout documentation files to represent a singular developer
perspective.
Changes:
- CONTRIBUTING.md: Replace "We are" with "This project is",
"We use" with "This project uses", "our" with "the"
- README.md: Replace "our" with "the", add OS to bug report checklist
- docs/VERSION_HISTORY.md: Replace "we reset" with passive voice
"the version was reset"
- Created CONTRIBUTING.md with detailed guidelines for plugin development and contributions
- Added sections covering development setup, workflow, code standards, and testing practices
- Included step-by-step instructions for setting up local development environment
- Documented release process and version management procedures
- Added guidelines for pull requests, commit messages, and code organization
- Included security considerations and platform
- Added GitHub Sponsors configuration file to enable sponsorship button
- Updated README to include GitHub Sponsors link alongside existing donation options
- Configured sponsorship to direct to Xe138's GitHub profile
Implements automated release workflow per design document.
- Triggers on semantic version tags (e.g., 1.2.3)
- Validates version consistency across package.json, manifest.json, and git tag
- Runs test suite (blocks release if tests fail)
- Builds plugin using production build process
- Verifies build artifacts exist (main.js, manifest.json, styles.css)
- Creates draft GitHub release with required files
Workflow uses single-job architecture for simplicity and runs on Node.js 18 with npm caching for performance.
Code inspection testing completed:
- Build successful with no TypeScript errors
- All 579 automated tests pass with no regressions
- Tab state property correctly initialized to 'windsurf'
- Authentication section renamed to 'Authentication & Configuration'
- Config generator produces correct Windsurf format (serverUrl)
- Config generator produces correct Claude Code format (type: http, url)
- Tab buttons implement proper visual states (bold, border-bottom)
- Tab switching logic correctly updates activeConfigTab and re-renders
- Copy button functionality implemented for config JSON
- Dynamic content area shows file path, config JSON, and usage notes
Manual testing in Obsidian not performed (no test vault available)
All implementation requirements verified through code inspection
- Updated author name from "Bill Ballou" to "William Ballou" in manifest.json
- Added missing author name "William Ballou" in package.json
- Ensures consistent attribution across project metadata files
- Removed all .windsurf/rules/ markdown files containing outdated plugin development guidelines
- Files included agent guidelines, code examples, coding conventions, commands/settings docs, environment setup, file organization, manifest rules, project overview, references, security/privacy, troubleshooting, and UX guidelines
- Content will be replaced with updated documentation in a new location
Note: This appears to be a cleanup commit removing
- Replace ISC license with MIT License
- Update copyright to 2025 William Ballou
- Add comprehensive installation instructions
- Add troubleshooting section with common issues
- Add contributing guidelines and issue reporting info
- Add security notice about vault access
- Add support/funding information
License change aligns with package.json and Obsidian ecosystem standards.
- Replace raw HTML inputs with Obsidian Setting components
- Add DOM element references for targeted updates
- Eliminate destructive re-render on filter changes
- Update only list container and count on filter apply
- Fix tool filter input not accepting text
- Fix status dropdown not showing selection
Co-Authored-By: Claude <noreply@anthropic.com>
- Add targeted DOM update method for notification section
- Store reference to details element during initial render
- Replace full page re-render with targeted subsection update
- Preserve open/closed state during updates
Co-Authored-By: Claude <noreply@anthropic.com>
- Update notification format to multi-line with explicit label
- First line: 'MCP Tool Called: tool_name'
- Second line: parameters (if enabled)
- Add comprehensive tests for notification formatting
Co-Authored-By: Claude <noreply@anthropic.com>
Detailed plan with bite-sized tasks for:
- Notification message format improvements
- Settings section collapse fix
- Modal filter control repairs
Co-Authored-By: Claude <noreply@anthropic.com>
Documents fixes for three UX issues:
- Unclear notification message format
- Settings section collapsing on toggle
- Broken filter controls in history modal
Co-Authored-By: Claude <noreply@anthropic.com>
Wraps the UI Notifications section in a details/summary element for progressive disclosure. Updates all setting references from containerEl to notifDetails to properly nest settings within the collapsible section. Simplifies setting descriptions to be more concise.
- Wrap Authentication in details/summary for progressive disclosure
- Update containerEl references to authDetails within the section
- Simplify API Key description from "Use this key in the Authorization header as Bearer token" to "Use as Bearer token in Authorization header"
Comprehensive design for streamlining the settings UI using progressive
disclosure to reduce visual clutter while preserving all functionality.
Key changes:
- Move Server Status to top for better visibility
- Collapse Authentication and UI Notifications sections by default
- Remove encryption-related messaging
- Remove network security disclosure
- Simplify all descriptive text
- Use native HTML details/summary elements for collapsibility
- Removed 3 deprecated implementation plan documents from docs/plans directory:
- 2025-01-20-tools-coverage-implementation.md
- 2025-01-20-utils-coverage-completion.md
- 2025-01-20-utils-coverage-implementation.md
- These plans are no longer needed since the coverage work has been completed and merged
This marks version 1.0.0 as the first public release of the plugin.
Previous versions (1.0.0-3.0.0) were private development iterations.
Changes:
- Reset manifest.json version to 1.0.0
- Reset package.json version to 1.0.0
- Clear versions.json to single entry (1.0.0 -> 0.15.0)
- Rewrite CHANGELOG.md for public release
- Remove private development history
- Document all features as part of 1.0.0
- Add future roadmap section
Git history is preserved to demonstrate:
- Development quality and security practices
- Comprehensive test coverage efforts
- Thoughtful evolution of features
This plugin implements MCP (Model Context Protocol) to expose
Obsidian vault operations via HTTP for AI assistants and other clients.
Root cause: electron.safeStorage was undefined (not null) when the
property doesn't exist, causing "Cannot read properties of undefined"
error when accessing isEncryptionAvailable.
Fix: Normalize undefined to null with `|| null` operator when importing
safeStorage, ensuring consistent null checks throughout the code.
Changes:
- Set safeStorage to null if electron.safeStorage is undefined
- Remove all diagnostic try-catch blocks from settings UI
- Remove console.log debugging statements
- Restore clean code that now works correctly
This resolves the settings UI crash that prevented the API key
management section from displaying.
Moved isEncryptionAvailable() to top of file and refactored to prevent
"Cannot read properties of undefined" errors when safeStorage exists
but doesn't have the isEncryptionAvailable method.
Changes:
- Move isEncryptionAvailable() before other functions so it can be used
- Add typeof check for isEncryptionAvailable method existence
- Use isEncryptionAvailable() helper in encryptApiKey() instead of
directly calling safeStorage.isEncryptionAvailable()
- Ensures consistent safe checking across all encryption operations
This fixes the settings UI crash that prevented API key management
section from rendering.
The isEncryptionAvailable() function was throwing "Cannot read properties
of undefined" when safeStorage exists but doesn't have the
isEncryptionAvailable method (can occur on some Electron versions).
This was causing the entire settings UI to fail rendering after the
Authentication heading, hiding all API key management controls.
Fix: Add typeof check before calling safeStorage.isEncryptionAvailable()
to ensure the method exists before attempting to call it.
Add try-catch blocks and console logging to identify where settings UI
stops rendering. This will help diagnose why API key and config sections
are not appearing after authentication was made mandatory.
Diagnostic additions:
- Wrap auth description section in try-catch
- Wrap API key section in try-catch
- Log encryption availability status
- Log API key length
- Log successful section rendering
- Display user-friendly error messages if rendering fails
- Added safe electron import with fallback for non-electron environments
- Enhanced error handling when safeStorage is unavailable
- Updated encryption checks to handle cases where safeStorage is null
- Added warning message when API keys must be stored in plaintext
- Modified isEncryptionAvailable to check for both safeStorage existence and capability