@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.
- package/.claude/hooks/gh-setup.sh +49 -0
- package/.claude/settings.json +15 -0
- package/.claude/skills/release-notes/SKILL.md +331 -0
- package/.editorconfig +10 -0
- package/.github/FUNDING.yml +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +90 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +59 -0
- package/.github/copilot-instructions.md +45 -0
- package/.github/pull_request_template.md +32 -0
- package/.github/workflows/ci.yaml +25 -0
- package/.github/workflows/docs.yml +58 -0
- package/.github/workflows/relay_to_openclaw.yml +59 -0
- package/.github/workflows/release.yaml +45 -0
- package/.prettierignore +10 -0
- package/.prettierrc +13 -0
- package/.vscode/extensions.json +7 -0
- package/.vscode/settings.json +37 -0
- package/.zed/settings.json +42 -0
- package/AGENTS.md +330 -0
- package/ARCHITECTURE.md +390 -0
- package/CONTRIBUTING.md +216 -0
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.ja.md +121 -0
- package/README.md +125 -0
- package/docs/.vitepress/config.mts +124 -0
- package/docs/.vitepress/theme/custom.css +111 -0
- package/docs/.vitepress/theme/index.ts +4 -0
- package/docs/agent-setup/claude-code.md +84 -0
- package/docs/agent-setup/codex.md +76 -0
- package/docs/agent-setup/custom-agents.md +67 -0
- package/docs/agent-setup/gemini-cli.md +99 -0
- package/docs/agent-setup/index.md +34 -0
- package/docs/announcements/gemini-cli-deprecation.md +73 -0
- package/docs/getting-started/index.md +78 -0
- package/docs/getting-started/quick-start.md +38 -0
- package/docs/help/faq.md +181 -0
- package/docs/help/troubleshooting.md +221 -0
- package/docs/index.md +63 -0
- package/docs/public/apple-touch-icon.png +0 -0
- package/docs/public/demo.mp4 +0 -0
- package/docs/public/favicon-16x16.png +0 -0
- package/docs/public/favicon-32x32.png +0 -0
- package/docs/public/favicon.ico +0 -0
- package/docs/public/images/editing.webp +0 -0
- package/docs/public/images/export.webp +0 -0
- package/docs/public/images/floating-chat-button.webp +0 -0
- package/docs/public/images/floating-chat-instance-menu.webp +0 -0
- package/docs/public/images/floating-chat-view.webp +0 -0
- package/docs/public/images/mode-selection.webp +0 -0
- package/docs/public/images/model-selection.webp +0 -0
- package/docs/public/images/multi-session.webp +0 -0
- package/docs/public/images/remove-image.webp +0 -0
- package/docs/public/images/ribbon-icon.webp +0 -0
- package/docs/public/images/selection-context.gif +0 -0
- package/docs/public/images/sending-images.webp +0 -0
- package/docs/public/images/sending-messages.webp +0 -0
- package/docs/public/images/session-history-button.webp +0 -0
- package/docs/public/images/slash-commands-1.webp +0 -0
- package/docs/public/images/slash-commands-2.webp +0 -0
- package/docs/public/images/switch-agent.webp +0 -0
- package/docs/public/images/switch-default-agent.webp +0 -0
- package/docs/public/images/temporary-disable.gif +0 -0
- package/docs/reference/acp-support.md +110 -0
- package/docs/usage/chat-export.md +80 -0
- package/docs/usage/commands.md +51 -0
- package/docs/usage/context-files.md +57 -0
- package/docs/usage/editing.md +69 -0
- package/docs/usage/floating-chat.md +84 -0
- package/docs/usage/index.md +97 -0
- package/docs/usage/mcp-tools.md +33 -0
- package/docs/usage/mentions.md +70 -0
- package/docs/usage/mode-selection.md +28 -0
- package/docs/usage/model-selection.md +32 -0
- package/docs/usage/multi-session.md +68 -0
- package/docs/usage/sending-images.md +64 -0
- package/docs/usage/session-history.md +91 -0
- package/docs/usage/slash-commands.md +44 -0
- package/esbuild.config.mjs +49 -0
- package/eslint.config.mjs +25 -0
- package/main.js +228 -0
- package/manifest.json +11 -0
- package/package.json +52 -0
- package/src/acp/acp-client.ts +921 -0
- package/src/acp/acp-handler.ts +252 -0
- package/src/acp/permission-handler.ts +282 -0
- package/src/acp/terminal-handler.ts +264 -0
- package/src/acp/type-converter.ts +272 -0
- package/src/hooks/useAgent.ts +250 -0
- package/src/hooks/useAgentMessages.ts +470 -0
- package/src/hooks/useAgentSession.ts +544 -0
- package/src/hooks/useChatActions.ts +400 -0
- package/src/hooks/useHistoryModal.ts +219 -0
- package/src/hooks/useSessionHistory.ts +863 -0
- package/src/hooks/useSettings.ts +19 -0
- package/src/hooks/useSuggestions.ts +342 -0
- package/src/main.ts +9 -0
- package/src/plugin.ts +1126 -0
- package/src/services/chat-exporter.ts +552 -0
- package/src/services/message-sender.ts +755 -0
- package/src/services/message-state.ts +375 -0
- package/src/services/session-helpers.ts +211 -0
- package/src/services/session-state.ts +130 -0
- package/src/services/session-storage.ts +267 -0
- package/src/services/settings-normalizer.ts +255 -0
- package/src/services/settings-service.ts +285 -0
- package/src/services/update-checker.ts +128 -0
- package/src/services/vault-service.ts +558 -0
- package/src/services/view-registry.ts +345 -0
- package/src/types/agent.ts +92 -0
- package/src/types/chat.ts +351 -0
- package/src/types/errors.ts +136 -0
- package/src/types/obsidian-internals.d.ts +14 -0
- package/src/types/session.ts +731 -0
- package/src/ui/ChangeDirectoryModal.ts +137 -0
- package/src/ui/ChatContext.ts +25 -0
- package/src/ui/ChatHeader.tsx +295 -0
- package/src/ui/ChatPanel.tsx +1162 -0
- package/src/ui/ChatView.tsx +348 -0
- package/src/ui/ErrorBanner.tsx +104 -0
- package/src/ui/FloatingButton.tsx +351 -0
- package/src/ui/FloatingChatView.tsx +531 -0
- package/src/ui/InputArea.tsx +1107 -0
- package/src/ui/InputToolbar.tsx +371 -0
- package/src/ui/MessageBubble.tsx +442 -0
- package/src/ui/MessageList.tsx +265 -0
- package/src/ui/PermissionBanner.tsx +61 -0
- package/src/ui/SessionHistoryModal.tsx +821 -0
- package/src/ui/SettingsTab.ts +1337 -0
- package/src/ui/SuggestionPopup.tsx +138 -0
- package/src/ui/TerminalBlock.tsx +107 -0
- package/src/ui/ToolCallBlock.tsx +456 -0
- package/src/ui/shared/AttachmentStrip.tsx +57 -0
- package/src/ui/shared/IconButton.tsx +55 -0
- package/src/ui/shared/MarkdownRenderer.tsx +103 -0
- package/src/ui/view-host.ts +56 -0
- package/src/utils/error-utils.ts +274 -0
- package/src/utils/logger.ts +44 -0
- package/src/utils/mention-parser.ts +129 -0
- package/src/utils/paths.ts +246 -0
- package/src/utils/platform.ts +425 -0
- package/styles.css +2322 -0
- package/tsconfig.json +18 -0
- package/version-bump.mjs +18 -0
- 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,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,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
|