@mseep/obsidian-agent-client 0.10.6

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.
Files changed (146) hide show
  1. package/.claude/hooks/gh-setup.sh +49 -0
  2. package/.claude/settings.json +15 -0
  3. package/.claude/skills/release-notes/SKILL.md +331 -0
  4. package/.editorconfig +10 -0
  5. package/.github/FUNDING.yml +2 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.yml +90 -0
  7. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.yml +59 -0
  9. package/.github/copilot-instructions.md +45 -0
  10. package/.github/pull_request_template.md +32 -0
  11. package/.github/workflows/ci.yaml +25 -0
  12. package/.github/workflows/docs.yml +58 -0
  13. package/.github/workflows/relay_to_openclaw.yml +59 -0
  14. package/.github/workflows/release.yaml +45 -0
  15. package/.prettierignore +10 -0
  16. package/.prettierrc +13 -0
  17. package/.vscode/extensions.json +7 -0
  18. package/.vscode/settings.json +37 -0
  19. package/.zed/settings.json +42 -0
  20. package/AGENTS.md +330 -0
  21. package/ARCHITECTURE.md +390 -0
  22. package/CONTRIBUTING.md +216 -0
  23. package/LICENSE +202 -0
  24. package/NOTICE +2 -0
  25. package/README.ja.md +121 -0
  26. package/README.md +125 -0
  27. package/docs/.vitepress/config.mts +124 -0
  28. package/docs/.vitepress/theme/custom.css +111 -0
  29. package/docs/.vitepress/theme/index.ts +4 -0
  30. package/docs/agent-setup/claude-code.md +84 -0
  31. package/docs/agent-setup/codex.md +76 -0
  32. package/docs/agent-setup/custom-agents.md +67 -0
  33. package/docs/agent-setup/gemini-cli.md +99 -0
  34. package/docs/agent-setup/index.md +34 -0
  35. package/docs/announcements/gemini-cli-deprecation.md +73 -0
  36. package/docs/getting-started/index.md +78 -0
  37. package/docs/getting-started/quick-start.md +38 -0
  38. package/docs/help/faq.md +181 -0
  39. package/docs/help/troubleshooting.md +221 -0
  40. package/docs/index.md +63 -0
  41. package/docs/public/apple-touch-icon.png +0 -0
  42. package/docs/public/demo.mp4 +0 -0
  43. package/docs/public/favicon-16x16.png +0 -0
  44. package/docs/public/favicon-32x32.png +0 -0
  45. package/docs/public/favicon.ico +0 -0
  46. package/docs/public/images/editing.webp +0 -0
  47. package/docs/public/images/export.webp +0 -0
  48. package/docs/public/images/floating-chat-button.webp +0 -0
  49. package/docs/public/images/floating-chat-instance-menu.webp +0 -0
  50. package/docs/public/images/floating-chat-view.webp +0 -0
  51. package/docs/public/images/mode-selection.webp +0 -0
  52. package/docs/public/images/model-selection.webp +0 -0
  53. package/docs/public/images/multi-session.webp +0 -0
  54. package/docs/public/images/remove-image.webp +0 -0
  55. package/docs/public/images/ribbon-icon.webp +0 -0
  56. package/docs/public/images/selection-context.gif +0 -0
  57. package/docs/public/images/sending-images.webp +0 -0
  58. package/docs/public/images/sending-messages.webp +0 -0
  59. package/docs/public/images/session-history-button.webp +0 -0
  60. package/docs/public/images/slash-commands-1.webp +0 -0
  61. package/docs/public/images/slash-commands-2.webp +0 -0
  62. package/docs/public/images/switch-agent.webp +0 -0
  63. package/docs/public/images/switch-default-agent.webp +0 -0
  64. package/docs/public/images/temporary-disable.gif +0 -0
  65. package/docs/reference/acp-support.md +110 -0
  66. package/docs/usage/chat-export.md +80 -0
  67. package/docs/usage/commands.md +51 -0
  68. package/docs/usage/context-files.md +57 -0
  69. package/docs/usage/editing.md +69 -0
  70. package/docs/usage/floating-chat.md +84 -0
  71. package/docs/usage/index.md +97 -0
  72. package/docs/usage/mcp-tools.md +33 -0
  73. package/docs/usage/mentions.md +70 -0
  74. package/docs/usage/mode-selection.md +28 -0
  75. package/docs/usage/model-selection.md +32 -0
  76. package/docs/usage/multi-session.md +68 -0
  77. package/docs/usage/sending-images.md +64 -0
  78. package/docs/usage/session-history.md +91 -0
  79. package/docs/usage/slash-commands.md +44 -0
  80. package/esbuild.config.mjs +49 -0
  81. package/eslint.config.mjs +25 -0
  82. package/main.js +228 -0
  83. package/manifest.json +11 -0
  84. package/package.json +52 -0
  85. package/src/acp/acp-client.ts +921 -0
  86. package/src/acp/acp-handler.ts +252 -0
  87. package/src/acp/permission-handler.ts +282 -0
  88. package/src/acp/terminal-handler.ts +264 -0
  89. package/src/acp/type-converter.ts +272 -0
  90. package/src/hooks/useAgent.ts +250 -0
  91. package/src/hooks/useAgentMessages.ts +470 -0
  92. package/src/hooks/useAgentSession.ts +544 -0
  93. package/src/hooks/useChatActions.ts +400 -0
  94. package/src/hooks/useHistoryModal.ts +219 -0
  95. package/src/hooks/useSessionHistory.ts +863 -0
  96. package/src/hooks/useSettings.ts +19 -0
  97. package/src/hooks/useSuggestions.ts +342 -0
  98. package/src/main.ts +9 -0
  99. package/src/plugin.ts +1126 -0
  100. package/src/services/chat-exporter.ts +552 -0
  101. package/src/services/message-sender.ts +755 -0
  102. package/src/services/message-state.ts +375 -0
  103. package/src/services/session-helpers.ts +211 -0
  104. package/src/services/session-state.ts +130 -0
  105. package/src/services/session-storage.ts +267 -0
  106. package/src/services/settings-normalizer.ts +255 -0
  107. package/src/services/settings-service.ts +285 -0
  108. package/src/services/update-checker.ts +128 -0
  109. package/src/services/vault-service.ts +558 -0
  110. package/src/services/view-registry.ts +345 -0
  111. package/src/types/agent.ts +92 -0
  112. package/src/types/chat.ts +351 -0
  113. package/src/types/errors.ts +136 -0
  114. package/src/types/obsidian-internals.d.ts +14 -0
  115. package/src/types/session.ts +731 -0
  116. package/src/ui/ChangeDirectoryModal.ts +137 -0
  117. package/src/ui/ChatContext.ts +25 -0
  118. package/src/ui/ChatHeader.tsx +295 -0
  119. package/src/ui/ChatPanel.tsx +1162 -0
  120. package/src/ui/ChatView.tsx +348 -0
  121. package/src/ui/ErrorBanner.tsx +104 -0
  122. package/src/ui/FloatingButton.tsx +351 -0
  123. package/src/ui/FloatingChatView.tsx +531 -0
  124. package/src/ui/InputArea.tsx +1107 -0
  125. package/src/ui/InputToolbar.tsx +371 -0
  126. package/src/ui/MessageBubble.tsx +442 -0
  127. package/src/ui/MessageList.tsx +265 -0
  128. package/src/ui/PermissionBanner.tsx +61 -0
  129. package/src/ui/SessionHistoryModal.tsx +821 -0
  130. package/src/ui/SettingsTab.ts +1337 -0
  131. package/src/ui/SuggestionPopup.tsx +138 -0
  132. package/src/ui/TerminalBlock.tsx +107 -0
  133. package/src/ui/ToolCallBlock.tsx +456 -0
  134. package/src/ui/shared/AttachmentStrip.tsx +57 -0
  135. package/src/ui/shared/IconButton.tsx +55 -0
  136. package/src/ui/shared/MarkdownRenderer.tsx +103 -0
  137. package/src/ui/view-host.ts +56 -0
  138. package/src/utils/error-utils.ts +274 -0
  139. package/src/utils/logger.ts +44 -0
  140. package/src/utils/mention-parser.ts +129 -0
  141. package/src/utils/paths.ts +246 -0
  142. package/src/utils/platform.ts +425 -0
  143. package/styles.css +2322 -0
  144. package/tsconfig.json +18 -0
  145. package/version-bump.mjs +18 -0
  146. package/versions.json +3 -0
@@ -0,0 +1,49 @@
1
+ #!/bin/bash
2
+
3
+ # GitHub CLI (gh) auto-installer for Claude Code Web
4
+ # This script runs on SessionStart and installs gh if not present
5
+
6
+ set -e
7
+
8
+ # Only run in Claude Code Web environment
9
+ if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then
10
+ exit 0
11
+ fi
12
+
13
+ # Skip if gh is already installed
14
+ if command -v gh &> /dev/null; then
15
+ exit 0
16
+ fi
17
+
18
+ echo "Installing GitHub CLI..."
19
+
20
+ # Create local bin directory
21
+ LOCAL_BIN="$HOME/.local/bin"
22
+ mkdir -p "$LOCAL_BIN"
23
+
24
+ # Download and install gh CLI
25
+ GH_VERSION="2.63.2"
26
+ GH_ARCHIVE="gh_${GH_VERSION}_linux_amd64.tar.gz"
27
+ GH_URL="https://github.com/cli/cli/releases/download/v${GH_VERSION}/${GH_ARCHIVE}"
28
+
29
+ cd /tmp
30
+ curl -sLO "$GH_URL"
31
+ tar -xzf "$GH_ARCHIVE"
32
+ mv "gh_${GH_VERSION}_linux_amd64/bin/gh" "$LOCAL_BIN/"
33
+ rm -rf "$GH_ARCHIVE" "gh_${GH_VERSION}_linux_amd64"
34
+
35
+ # Add to PATH for current and future sessions
36
+ export PATH="$LOCAL_BIN:$PATH"
37
+
38
+ # Persist PATH setting if CLAUDE_ENV_FILE is available
39
+ if [ -n "$CLAUDE_ENV_FILE" ]; then
40
+ echo "export PATH=\"$LOCAL_BIN:\$PATH\"" >> "$CLAUDE_ENV_FILE"
41
+ fi
42
+
43
+ # Verify installation
44
+ if gh --version &> /dev/null; then
45
+ echo "GitHub CLI installed successfully: $(gh --version | head -1)"
46
+ else
47
+ echo "Failed to install GitHub CLI" >&2
48
+ exit 1
49
+ fi
@@ -0,0 +1,15 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "./.claude/hooks/gh-setup.sh"
10
+ }
11
+ ]
12
+ }
13
+ ]
14
+ }
15
+ }
@@ -0,0 +1,331 @@
1
+ ---
2
+ name: release-notes
3
+ description: >-
4
+ Generate a GitHub release note draft for this Obsidian plugin repository.
5
+ Use when the user asks to write, draft, or prepare release notes for a new version.
6
+ Invoked with a version number argument (e.g. "0.11.0", "0.11.0-preview.1").
7
+ Analyzes git history and code diffs since the previous release to produce
8
+ user-facing release notes in the project's established format.
9
+ ---
10
+
11
+ # Release Notes Generator
12
+
13
+ Generate a release note draft for this repository by analyzing git changes since the previous release. The output is a Markdown code block ready to paste into a GitHub release — do NOT create the release itself.
14
+
15
+ The version number is provided as an argument (e.g. `/release-notes 0.11.0`). If no version is given, ask for one before proceeding.
16
+
17
+ ## Step 1: Determine the previous release
18
+
19
+ The "previous release" depends on the version type being drafted:
20
+
21
+ - **Stable version** (no `-preview`): Find the most recent stable tag, skipping all prereleases. This is because stable release notes cover everything since the last stable release — they aggregate all prerelease changes into one cohesive set of notes.
22
+ - **Prerelease** (`-preview.N`): Find the most recent tag of any kind (stable or prerelease). Prerelease notes only cover the incremental delta since the last tag.
23
+
24
+ Use `git tag --sort=-v:refname` to list tags and pick the right one. Confirm the previous tag to the user before continuing (e.g. "Previous release: v0.10.2 — generating notes for changes since then.").
25
+
26
+ ## Step 2: Gather information
27
+
28
+ Run these in parallel where possible:
29
+
30
+ 1. **Commit log**: `git log {prev_tag}..HEAD --oneline` — the list of changes
31
+ 2. **Diff stat**: `git diff --stat {prev_tag}..HEAD` — which files changed
32
+ 3. **Actual diffs**: Read the diffs of changed source files (`src/`, `styles.css`, `manifest.json`, etc.) to understand what each change actually does at the code level. This is critical — commit messages alone are not enough to write accurate user-facing descriptions.
33
+ 4. **Issue numbers**: Extract `#NNN` references from commit messages. Note: commit messages often contain PR numbers (from merge commits), not the original issue numbers. Use whatever `#NNN` is in the commit message as-is — the author will verify and correct these during review.
34
+ 5. **New contributors**: Compare authors before and after the previous tag:
35
+ ```
36
+ git log --format='%aN' {prev_tag} | sort -u # existing contributors
37
+ git log --format='%aN' {prev_tag}..HEAD | sort -u # contributors in this range
38
+ ```
39
+ Anyone in the second set but not the first is a new contributor. To find their GitHub username and PR number, use `git log --format='%aN <%aE>' {prev_tag}..HEAD` and cross-reference with `#NNN` in their commit messages. The GitHub username may differ from the git author name — check the commit on GitHub if needed.
40
+ 6. **Previous prerelease notes** (stable releases only): If drafting a stable release and there were prereleases in the range, read their release notes with `gh release view {tag}`. This helps identify bugs that were introduced and fixed within the prerelease cycle — those should be excluded from the stable release notes since they never affected stable users.
41
+
42
+ ## Step 3: Analyze and categorize
43
+
44
+ Before writing, think through what each change means from a user's perspective:
45
+
46
+ - **What can users do now that they couldn't before?** → New features (🌟 New)
47
+ - **What existing behavior got better?** → Improvements (🔧 Improvements)
48
+ - **What was broken and is now fixed?** → Bug fixes (🐛 Fixes)
49
+ - **Did anything get faster?** → Performance (⚡ Performance)
50
+ - **Does anything require user action on upgrade?** → Breaking changes (⚠ Breaking Changes)
51
+
52
+ For stable releases aggregating prereleases: exclude bugs that were both introduced and resolved during the prerelease cycle. Those never affected stable users and do not belong in the stable release notes.
53
+
54
+ ### Detecting breaking changes
55
+
56
+ Breaking changes are easy to miss in diffs. Actively look for these patterns:
57
+
58
+ - **Renamed settings keys** in default settings or settings types (e.g., `activeAgentId` → `defaultAgentId`)
59
+ - **Renamed command IDs** in plugin.ts `addCommand()` calls
60
+ - **Changed or removed public APIs** or exported interfaces
61
+ - **Changed default behavior** that users relied on (e.g., a button that now does something different)
62
+ - **Removed features or settings**
63
+
64
+ If any are found, they MUST appear in the `### ⚠ Breaking Changes:` section AND be mentioned in the Upgrade section. If the migration is automatic, say so — users still need to know something changed.
65
+
66
+ ## Step 4: Write the draft
67
+
68
+ Output the release note as a single Markdown code block. Follow this format exactly.
69
+
70
+ ### Title line
71
+
72
+ The title is plain text with bold formatting — NOT a Markdown heading. No `#` prefix.
73
+
74
+ ```
75
+ {emoji} **{Release Type} (v{version})**
76
+ ```
77
+
78
+ Choose the release type and emoji based on content:
79
+ - `🔬 **Preview Release**` — all prereleases
80
+ - `✨ **Feature Release**` — stable with new features
81
+ - `🔧 **Improvement & Bug Fix Release**` — stable with improvements and fixes but no major new features
82
+ - `🐛 **Bug Fix Release**` — stable with only bug fixes
83
+ - `🔧 **Improvement Release**` — stable with only improvements
84
+ - `⚡ **Performance Fix**` — stable with only performance changes
85
+ - `🔧 **Maintenance Release**` — stable with only dependency updates or internal changes
86
+
87
+ ### Prerelease warning (prereleases only)
88
+
89
+ For ALL preview releases — regardless of size — add this immediately after the title line (with a blank line before and after):
90
+
91
+ ```
92
+ ⚠ **This is a preview release** — Features are experimental and may change. Please report any issues!
93
+ ```
94
+
95
+ This is mandatory for every prerelease. Never omit it.
96
+
97
+ ### Summary paragraph
98
+
99
+ For stable 0.X.0 releases and substantial prereleases with multiple features, add a 1-2 sentence summary after the title (or after the prerelease warning). Patch releases and small prereleases with a single change can skip this.
100
+
101
+ The summary should focus on the single biggest highlight or theme — not enumerate every change. One sentence is ideal. If you can't pick a single theme, pick the top 2-3 and keep it under two sentences.
102
+
103
+ ### Sections
104
+
105
+ Include only sections that have content, in this order:
106
+
107
+ ```markdown
108
+ ### ⚡ Performance:
109
+
110
+ ### 🌟 New:
111
+
112
+ ### 🔧 Improvements:
113
+
114
+ ### 🐛 Fixes:
115
+
116
+ ### ⚠ Breaking Changes:
117
+
118
+ ### 🚀 Upgrade:
119
+
120
+ --------
121
+
122
+ ### 👋 New Contributors
123
+
124
+ --------
125
+
126
+ **Thank you for your continued support! Your feedback helps make this plugin better for everyone.** 🙏
127
+ ```
128
+
129
+ ### Item format
130
+
131
+ Each item follows this pattern:
132
+
133
+ ```
134
+ - **{emoji} {Short Title}**: {Description}. (#issue)
135
+ ```
136
+
137
+ Rules:
138
+ - The **emoji** indicates the category (🪟 window/floating, ⌨ keyboard/input, 📋 copy/clipboard, 🔗 links/paths, 🐧 Linux/WSL, 🍎 macOS, 📦 packages/SDK, 🔔 notifications, 📂 files/directories, 🔐 permissions, 📊 data/charts, 📜 scrolling, 🔍 search/focus, 🎨 styling/UI, 🖥 terminal, 📝 text/editing, 🔄 sync/restore, 🗑 deletion, 📏 sizing/layout, etc.)
139
+ - The **short title** is 2-5 words, bold, and scannable — readers should understand the topic from the title alone.
140
+ - The **description** explains what changed from the user's perspective. Do not describe implementation details — no function names, class names, React hooks, framework APIs, or internal architecture. If a change is purely internal (refactoring, performance optimization), describe its user-visible effect.
141
+ - **Issue numbers** go at the end in parentheses. Omit if no issue is referenced.
142
+ - **One item per logical change.** If a single commit or PR addresses one concern (e.g. "fix process cleanup"), that is one item — even if it touches multiple files or uses platform-specific strategies. Conversely, don't merge unrelated changes into one item.
143
+
144
+ ### Upgrade section
145
+
146
+ Always present. Keep it short and plain — no links, no blockquotes, no extra formatting.
147
+
148
+ - For patch/preview: `Simply update from v{prev} — no configuration needed.` or `Update from v{prev}. No configuration changes needed.`
149
+ - For stable 0.X.0: `Update from v{prev} — no extra configuration required.` with additional migration notes if there are breaking changes.
150
+ - If there are breaking changes, add a `⚠` warning with specific user action required.
151
+
152
+ ### New Contributors section
153
+
154
+ Only include if there are new contributors. Use this exact format:
155
+
156
+ ```
157
+ - @username made their first contribution in #PR
158
+ ```
159
+
160
+ Do not add bold formatting, descriptions, or extra text. Do not add a "Welcome" message.
161
+
162
+ For stable releases: re-list contributors who were first listed in a prerelease within this cycle. They are still "new" from the stable user's perspective.
163
+
164
+ ### Closing
165
+
166
+ Always end with this exact line:
167
+
168
+ ```
169
+ **Thank you for your continued support! Your feedback helps make this plugin better for everyone.** 🙏
170
+ ```
171
+
172
+ ## Writing principles
173
+
174
+ - **User perspective only**: Describe benefits and behavior, not code changes. Never mention internal identifiers like component names, hook names, framework APIs, algorithm details, or data structures. The reader is an Obsidian user, not a developer reading the source code.
175
+ - **Accuracy over speed**: Read the actual code diffs. A commit message saying "fix: resolve issue" tells you nothing — the diff tells you everything.
176
+ - **Be specific**: "Fixed agents failing to start on NixOS" is better than "Fixed shell compatibility issue." Include concrete details like error messages or specific scenarios.
177
+ - **One item per logical change**: A single commit fixing process cleanup across platforms is one item. A single commit fixing two unrelated bugs is two items. Match the logical boundary, not the commit boundary.
178
+ - **Consistent tense**: Use past tense for fixes ("Fixed..."), present tense or imperative for features ("See how much context you've used" / "Attach non-image files").
179
+ - **Performance items describe the user experience**: "Significantly improved responsiveness for long sessions" — not "Added virtual scrolling with @tanstack/react-virtual and RAF batching."
180
+
181
+ ## Examples
182
+
183
+ These are real release notes from this repository. Study the tone, format, and level of detail.
184
+
185
+ ### Example 1: Bug fix release (v0.10.2)
186
+
187
+ ```
188
+ 🐛 **Bug Fix Release (v0.10.2)**
189
+
190
+ ### 🐛 Fixes:
191
+
192
+ - **🪟 WSL Distribution Names with Dots**: Fixed "Invalid WSL distribution name" error when specifying versioned distribution names like `Ubuntu-22.04`. (#223)
193
+
194
+ ### 🚀 Upgrade:
195
+
196
+ Simply update from v0.10.1 — no configuration needed.
197
+
198
+ --------
199
+
200
+ **Thank you for your continued support! Your feedback helps make this plugin better for everyone.** 🙏
201
+ ```
202
+
203
+ Note: One fix, one item. Short title tells you the topic. Description includes the actual error message for specificity. No extra sections.
204
+
205
+ ### Example 2: Preview release (v0.10.0-preview.3)
206
+
207
+ ```
208
+ 🔬 **Preview Release (v0.10.0-preview.3)**
209
+
210
+ ⚠ **This is a preview release** — Features are experimental and may change. Please report any issues!
211
+
212
+ ### 🐛 Fixes:
213
+
214
+ - **🧹 Process Cleanup on Exit**: Fixed agent child processes (e.g., MCP server nodes) remaining after closing Obsidian, restarting agents, or switching sessions. The plugin now kills the entire process tree on disconnect using platform-specific strategies. Also added cleanup on plugin disable. (#205)
215
+
216
+ ### 🚀 Upgrade:
217
+
218
+ Update from v0.10.0-preview.2. No configuration changes needed.
219
+
220
+ --------
221
+
222
+ **Thank you for your continued support! Your feedback helps make this plugin better for everyone.** 🙏
223
+ ```
224
+
225
+ Note: The prerelease warning is always included. A multi-faceted fix (multiple platforms, multiple triggers) is still ONE item because it's one logical concern. "platform-specific strategies" is acceptable — it communicates the scope without naming specific APIs.
226
+
227
+ ### Example 3: Feature release with aggregated prereleases (v0.9.0, excerpt)
228
+
229
+ ```
230
+ ✨ **Feature Release (v0.9.0)**
231
+
232
+ This release adds context usage tracking, file attachment support, agent update notifications, dynamic session configuration, and a chat export command.
233
+
234
+ ### 🌟 New:
235
+
236
+ - **📊 Context Usage Indicator**: See how much of the agent's context window you've used, displayed next to the send button. Color changes at 70%/80%/90% thresholds to warn you before hitting limits. (#113)
237
+ - **📎 File Attachments**: Attach non-image files (text, code, PDFs, etc.) to your messages via paste or drag-and-drop. Files are sent as `resource_link` content and rendered in chat messages. (#77)
238
+
239
+ ### 🔧 Improvements:
240
+
241
+ - **📦 ACP SDK Update**: Updated @agentclientprotocol/sdk to v0.14.1.
242
+
243
+ ### 🐛 Fixes:
244
+
245
+ - **📜 Auto-Scroll Threshold**: Increased threshold from 20px to 35px for more reliable scroll tracking.
246
+ - **🔗 Settings Documentation Link**: Fixed clicking the documentation link in settings causing Obsidian popout windows to close due to missing `target="_blank"`. (#152)
247
+
248
+ ### 🚀 Upgrade:
249
+
250
+ Update from v0.8.3 — no extra configuration required. New features activate automatically when supported by your agent.
251
+
252
+ --------
253
+
254
+ **Thank you for your continued support! Your feedback helps make this plugin better for everyone.** 🙏
255
+ ```
256
+
257
+ Note: Summary paragraph lists the highlights. Features describe what users can now do. SDK update is a one-liner. Fixes describe the user-visible symptom, not the code fix.
258
+
259
+ ### Example 4: Improvement & bug fix release with new contributor (v0.9.4)
260
+
261
+ ```
262
+ 🔧 **Improvement & Bug Fix Release (v0.9.4)**
263
+
264
+ This release adds a copy button to messages, fixes markdown overflow issues, and improves floating chat behavior.
265
+
266
+ ### 🌟 New:
267
+
268
+ - **📋 Copy Message Button**: Hover over any message to reveal a copy-to-clipboard button. Works for both user and assistant messages. (#189)
269
+
270
+ ### 🔧 Improvements:
271
+
272
+ - **🪟 Smarter Floating Chat Commands**: Floating chat commands (open, minimize, close) now only appear in the command palette when the feature is enabled. Minimize and close additionally require a focused floating window. (#188)
273
+
274
+ ### 🐛 Fixes:
275
+
276
+ - **📜 Horizontal Scroll for Wide Content**: Fixed mermaid diagrams, tables, and SVGs being clipped instead of scrolling horizontally. (#190)
277
+ - **🪟 Floating Chat Toggle**: Fixed floating chat button not hiding when the feature is toggled off in settings. (#187)
278
+
279
+ ### 🚀 Upgrade:
280
+
281
+ Simply update from v0.9.3 — no configuration needed.
282
+
283
+ --------
284
+
285
+ ### 👋 New Contributors
286
+
287
+ - @aviatesk made their first contribution in #187
288
+
289
+ --------
290
+
291
+ **Thank you for your continued support! Your feedback helps make this plugin better for everyone.** 🙏
292
+ ```
293
+
294
+ Note: Even though it has a "New" section, the overall release type is "Improvement & Bug Fix Release" because the copy button is a small addition, not a major feature. New Contributors uses the exact `@username made their first contribution in #PR` format with no extra decoration.
295
+
296
+ ### Example 5: Feature release with breaking changes (v0.7.0, excerpt)
297
+
298
+ ```
299
+ ✨ **Feature Release (v0.7.0)**
300
+
301
+ This release introduces multi-agent session support, allowing you to run multiple independent agent conversations simultaneously in separate chat views.
302
+
303
+ ### 🌟 New:
304
+
305
+ - **🪟 Multi-Agent Sessions**: Run multiple agents simultaneously in separate chat views. Each view has its own independent agent process and session. (#59)
306
+ - **📢 Broadcast Commands**: Control multiple chat views at once:
307
+ - `Broadcast prompt`: Copy the active view's input to all other views
308
+ - `Broadcast send`: Send messages in all views simultaneously
309
+ - `Broadcast cancel`: Cancel operations in all views
310
+ - **🔀 Focus Navigation**: Quickly switch between chat views with `Focus next/previous chat view` commands
311
+ - **➕ Open New View Command**: Open additional chat views via command palette or Header Menu
312
+
313
+ ### 🔧 Improvements:
314
+
315
+ - **🍔 Header Menu**: New ellipsis menu in chat header for quick agent switching, opening new views, restarting agent, and accessing plugin settings.
316
+ - **🚨 Error Overlay**: Errors are now displayed as a dismissible overlay above the input area instead of replacing the entire chat.
317
+
318
+ ### ⚠ Breaking Changes:
319
+
320
+ - **Setting Renamed**: `activeAgentId` → `defaultAgentId` (automatically migrated)
321
+
322
+ ### 🚀 Upgrade:
323
+
324
+ Update from v0.6.1 — Settings are automatically migrated. Multi-session support works immediately with existing agent configurations.
325
+
326
+ --------
327
+
328
+ **Thank you for your continued support! Your feedback helps make this plugin better for everyone.** 🙏
329
+ ```
330
+
331
+ Note: The summary focuses on the single biggest highlight (multi-agent sessions), not a list of everything. Breaking changes get their own section even when migration is automatic — users need to know. The Upgrade section mentions the auto-migration. Sub-bullet lists (as in Broadcast Commands) are fine when they improve scannability. Each distinct capability (Focus Navigation, Open New View) gets its own item rather than being folded into Multi-Agent Sessions.
package/.editorconfig ADDED
@@ -0,0 +1,10 @@
1
+ # top-most EditorConfig file
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ end_of_line = lf
7
+ insert_final_newline = true
8
+ indent_style = tab
9
+ indent_size = 4
10
+ tab_width = 4
@@ -0,0 +1,2 @@
1
+ github: RAIT-09
2
+ buy_me_a_coffee: rait09
@@ -0,0 +1,90 @@
1
+ name: Bug Report
2
+ description: Report a bug or unexpected behavior
3
+ labels: ["bug"]
4
+
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for taking the time to report a bug!
10
+
11
+ - type: textarea
12
+ id: description
13
+ attributes:
14
+ label: Description
15
+ description: A clear description of the bug
16
+ placeholder: What happened?
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: steps
22
+ attributes:
23
+ label: Steps to reproduce
24
+ description: How can we reproduce this bug?
25
+ placeholder: |
26
+ 1. Open Obsidian
27
+ 2. Click on '...'
28
+ 3. See error
29
+ validations:
30
+ required: true
31
+
32
+ - type: textarea
33
+ id: expected
34
+ attributes:
35
+ label: Expected behavior
36
+ description: What did you expect to happen?
37
+ validations:
38
+ required: true
39
+
40
+ - type: textarea
41
+ id: actual
42
+ attributes:
43
+ label: Actual behavior
44
+ description: What actually happened?
45
+ validations:
46
+ required: true
47
+
48
+ - type: dropdown
49
+ id: os
50
+ attributes:
51
+ label: Operating System
52
+ options:
53
+ - macOS
54
+ - Windows
55
+ - Linux
56
+ validations:
57
+ required: true
58
+
59
+ - type: input
60
+ id: obsidian-version
61
+ attributes:
62
+ label: Obsidian version
63
+ placeholder: e.g., 1.5.0
64
+ validations:
65
+ required: true
66
+
67
+ - type: input
68
+ id: plugin-version
69
+ attributes:
70
+ label: Plugin version
71
+ placeholder: e.g., 0.5.1
72
+ validations:
73
+ required: true
74
+
75
+ - type: input
76
+ id: agent
77
+ attributes:
78
+ label: Agent
79
+ description: Which agent were you using?
80
+ placeholder: e.g., Claude Code, Codex, Gemini CLI, OpenCode
81
+ validations:
82
+ required: false
83
+
84
+ - type: textarea
85
+ id: logs
86
+ attributes:
87
+ label: Screenshots / Logs
88
+ description: Add any screenshots or console logs that might help
89
+ validations:
90
+ required: false
@@ -0,0 +1,11 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Ask a Question
4
+ url: https://github.com/rait-09/obsidian-agent-client/discussions/categories/q-a
5
+ about: Ask questions about usage or configuration in Discussions
6
+ - name: Share an Idea
7
+ url: https://github.com/rait-09/obsidian-agent-client/discussions/categories/ideas
8
+ about: Propose and discuss early-stage feature ideas in Discussions
9
+ - name: Documentation
10
+ url: https://rait-09.github.io/obsidian-agent-client/
11
+ about: Check the documentation before opening an issue
@@ -0,0 +1,59 @@
1
+ name: Feature Request
2
+ description: Suggest a new feature or enhancement
3
+ labels: ["enhancement"]
4
+
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for suggesting a feature!
10
+
11
+ **💡 Have an early-stage idea?** Use [Ideas in Discussions](https://github.com/rait-09/obsidian-agent-client/discussions/categories/ideas) instead. This template is for concrete, well-defined feature requests.
12
+
13
+ **Before submitting, please consider the project scope:**
14
+ - Features achievable via MCP or other standard protocols are out of scope (they should be provided as MCP servers)
15
+ - Agent-specific features are out of scope (they should be handled via agent config files)
16
+
17
+ See [CONTRIBUTING.md](../CONTRIBUTING.md) for more details.
18
+
19
+ - type: input
20
+ id: summary
21
+ attributes:
22
+ label: Summary
23
+ description: A brief summary of the feature (one line)
24
+ placeholder: e.g., Add keyboard shortcut to send message
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: motivation
30
+ attributes:
31
+ label: Motivation
32
+ description: Why do you need this feature? What problem does it solve?
33
+ placeholder: I often find myself...
34
+ validations:
35
+ required: true
36
+
37
+ - type: textarea
38
+ id: solution
39
+ attributes:
40
+ label: Proposed solution
41
+ description: How would you like this to work?
42
+ validations:
43
+ required: false
44
+
45
+ - type: textarea
46
+ id: alternatives
47
+ attributes:
48
+ label: Alternatives considered
49
+ description: Have you considered any alternative solutions or workarounds?
50
+ validations:
51
+ required: false
52
+
53
+ - type: textarea
54
+ id: context
55
+ attributes:
56
+ label: Additional context
57
+ description: Any other context, screenshots, or references
58
+ validations:
59
+ required: false
@@ -0,0 +1,45 @@
1
+ # GitHub Copilot Instructions (obsidian-agent-client)
2
+
3
+ ## Big picture
4
+ - Obsidian **desktop** plugin (React 19 + TypeScript) that chats with external coding agents via **Agent Client Protocol (ACP)**.
5
+ - Uses a **React Hooks Architecture**: hooks own state/logic, components render, adapters integrate external systems, domain is pure types.
6
+
7
+ ## Key directories / “where to change things”
8
+ - UI composition + adapter instantiation: `src/components/chat/ChatView.tsx` (creates adapters via `useMemo`, composes hooks).
9
+ - Session lifecycle + agent switching: `src/hooks/useAgentSession.ts`.
10
+ - Message state + streaming updates: `src/hooks/useChat.ts`.
11
+ - ACP process + JSON-RPC wiring: `src/adapters/acp/acp.adapter.ts`.
12
+ - Pure message prep/sending (mentions, auto-mention, WSL path conversion): `src/shared/message-service.ts`.
13
+ - Domain contracts only (no deps): `src/domain/models/*`, `src/domain/ports/*`.
14
+
15
+ ## Architectural rules (project-specific)
16
+ - Keep `src/domain/**` dependency-free: **no** `obsidian` imports, **no** `@agentclientprotocol/sdk` imports.
17
+ - Add new behavior as **hooks** under `src/hooks/` and compose them in `ChatView.tsx` (avoid introducing ViewModel/UseCase classes).
18
+ - Put non-React business logic in `src/shared/` as **pure functions** (see `message-service.ts`).
19
+ - Adapters implement ports and isolate protocol/platform churn (ACP changes should mostly stay in `src/adapters/acp/`).
20
+
21
+ ## SessionUpdate / tool-call update flow (critical)
22
+ - Use the unified pipeline: `AcpAdapter.onSessionUpdate(...)` → `useChat.handleSessionUpdate(...)`.
23
+ - Tool calls must be updated via `useChat.upsertToolCall(...)` using **functional** `setMessages((prev) => ...)` to avoid race conditions from streaming `tool_call_update` events.
24
+ - When merging tool-call content, preserve existing values when updates are `undefined` and treat diffs as replace-all (see `mergeToolCallContent` in `useChat.ts`).
25
+
26
+ ## Obsidian & platform constraints
27
+ - Desktop-only: `ChatView` throws when `!Platform.isDesktopApp`.
28
+ - Use Obsidian `Platform.isWin/isMacOS/isLinux` helpers (avoid `process.platform`).
29
+ - No `innerHTML/outerHTML`; use Obsidian element helpers (`createEl/createDiv/createSpan`).
30
+ - Don't detach leaves in `onunload`.
31
+ - Keep styling in `styles.css` (avoid JS style manipulation).
32
+
33
+ ## Developer workflows
34
+ - Dev watch build: `npm run dev` (esbuild watch; outputs `main.js`).
35
+ - Production build: `npm run build` (runs `tsc -noEmit -skipLibCheck` then esbuild production).
36
+ - Formatting: `npm run format` / `npm run format:check` (Prettier).
37
+ - Linting: `npm run lint` / `npm run lint:fix`.
38
+ - Docs site: `npm run docs:dev`, `npm run docs:build`, `npm run docs:preview`.
39
+
40
+ ## Naming conventions used throughout
41
+ - Ports: `*.port.ts`
42
+ - Adapters: `*.adapter.ts`
43
+ - Hooks: `use*.ts`
44
+ - Components: `PascalCase.tsx`
45
+ - Utilities/models: `kebab-case.ts`
@@ -0,0 +1,32 @@
1
+ ## Description
2
+
3
+ <!-- What did you change and why? -->
4
+
5
+ ## Related issue
6
+
7
+ <!-- e.g., Closes #123 -->
8
+
9
+ ## Type of change
10
+
11
+ - [ ] Bug fix
12
+ - [ ] New feature
13
+ - [ ] Documentation
14
+ - [ ] Refactor
15
+ - [ ] Other
16
+
17
+ ## Checklist
18
+
19
+ - [ ] `npm run lint` passes ("Use sentence case for UI text" errors are acceptable for brand names)
20
+ - [ ] `npm run build` passes
21
+ - [ ] Tested in Obsidian
22
+ - [ ] Existing functionality still works
23
+ - [ ] Documentation updated if needed
24
+
25
+ ## Testing environment
26
+
27
+ - Agent: <!-- e.g., Claude Code, Codex, Gemini CLI, OpenCode -->
28
+ - OS: <!-- e.g., macOS, Windows, Linux -->
29
+
30
+ ## Screenshots
31
+
32
+ <!-- If applicable, add screenshots to help explain your changes -->
@@ -0,0 +1,25 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+
6
+ jobs:
7
+ lint-and-build:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
11
+
12
+ - name: Use Node.js
13
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e #v6.4.0
14
+ with:
15
+ node-version: "22.x"
16
+ cache: "npm"
17
+
18
+ - name: Install dependencies
19
+ run: npm ci
20
+
21
+ - name: Lint
22
+ run: npx eslint src/
23
+
24
+ - name: Build
25
+ run: npm run build