diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e177983..cf5ad19 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -58,6 +58,9 @@ jobs:
tag_name: ${{ github.ref_name }}
generate_release_notes: true
fail_on_unmatched_files: true
+ # Per Obsidian release guide, releases are created as drafts so the
+ # author can review release notes before publishing.
+ draft: true
body: |
## Install
diff --git a/.prompt-hub/memory.md b/.prompt-hub/memory.md
index 6dc930a..97e4c02 100644
--- a/.prompt-hub/memory.md
+++ b/.prompt-hub/memory.md
@@ -50,3 +50,4 @@
| 2026-04-26 07:48:00 CEST | agent | Fixed three sidebar styling issues: solid-red Stop hover (was red-on-translucent-red, unreadable), neutralized native chrome on runtime select with `appearance:none` + custom Lucide chevron, switched Start accent from theme accent to green (`var(--color-green)`). Validated build/tests. | `main.ts`, `styles.css`, `npm run build`, `npm test`, `.prompt-hub/version.md`, `.prompt-hub/releases.md` | success | Commit and push to main. |
| 2026-04-26 07:50:00 CEST | agent | Added `@Active folder` sidebar button that inserts the parent folder of the active file (vault-relative path) into the running CLI; falls back to `@./ ` for vault-root files. Added vitest coverage (27 tests). | `runtime-utils.ts`, `tests/runtime-utils.test.ts`, `main.ts`, `README.md`, `npm run build`, `npm test`, `.prompt-hub/version.md`, `.prompt-hub/releases.md` | success | Commit and push to main. |
| 2026-04-26 07:51:00 CEST | agent | Added blue `claude-cli-btn-info` highlight modifier and applied it to `@Active file` / `@Active folder` so the editor-context buttons read as a paired group alongside green Start / red Stop. Validated build/tests. | `main.ts`, `styles.css`, `npm run build`, `npm test`, `.prompt-hub/version.md`, `.prompt-hub/releases.md` | success | Commit and push to main. |
+| 2026-04-26 08:24:00 CEST | agent | Audited plugin against the four official Obsidian guideline pages (build, submission requirements, plugin guidelines, release workflow) and applied compliance fixes: added LICENSE (MIT), removed `leaf.detach()` from `onunload`, replaced `
`/`` settings headings with `Setting().setHeading()` and dropped the top-level plugin-name heading + first-section heading, switched release workflow to draft mode, tightened manifest description. Validated build/tests. | `LICENSE`, `main.ts`, `manifest.json`, `.github/workflows/release.yml`, `npm run build`, `npm test`, `.prompt-hub/version.md`, `.prompt-hub/releases.md`, `.prompt-hub/memory.md` | success | Commit and push to main; user can tag when ready for submission. |
diff --git a/.prompt-hub/releases.md b/.prompt-hub/releases.md
index 69d4232..621e4ba 100644
--- a/.prompt-hub/releases.md
+++ b/.prompt-hub/releases.md
@@ -1,5 +1,13 @@
# Releases
+## 0.1.34 - 2026-04-26
+- Aligned the plugin with the Obsidian community plugin submission guidelines:
+ - Added a top-level `LICENSE` file (MIT) so the license is discoverable independently of `package.json`.
+ - Removed the `leaf.detach()` calls from `onunload` (Obsidian preserves leaf state across reloads/updates per the plugin guidelines).
+ - Reworked the settings tab to use `new Setting(...).setHeading()` instead of raw ``/`` elements; dropped the redundant top-level plugin-name heading and the heading on the first general-settings section per the UI text guidelines.
+ - Switched the release workflow to publish drafts (`draft: true`), matching the official Obsidian release guide so the author reviews release notes before going live.
+ - Tightened the `manifest.json` description to a more action-oriented, unambiguous statement: `Run AI coding CLIs like Claude Code or Codex from a right sidebar terminal panel.`
+
## 0.1.33 - 2026-04-26
- Added a blue highlight accent to `@Active file` and `@Active folder` buttons (resting border tint + icon color, solid blue fill with white text/icon on hover) so the file-context actions read as a paired group distinct from the green Start and red Stop.
diff --git a/.prompt-hub/version.md b/.prompt-hub/version.md
index 50140e3..9dd1793 100644
--- a/.prompt-hub/version.md
+++ b/.prompt-hub/version.md
@@ -1 +1 @@
-0.1.33
+0.1.34
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..887b4eb
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Benoit Lamouche
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/main.js b/main.js
index f21586c..53e0cd8 100644
--- a/main.js
+++ b/main.js
@@ -9853,7 +9853,6 @@ var ClaudeCliPlugin = class extends import_obsidian.Plugin {
this.addSettingTab(new ClaudeCliSettingTab(this.app, this));
}
async onunload() {
- this.app.workspace.getLeavesOfType(VIEW_TYPE_CLAUDE).forEach((leaf) => leaf.detach());
}
async activateView() {
const { workspace } = this.app;
@@ -9899,12 +9898,6 @@ var ClaudeCliSettingTab = class extends import_obsidian.PluginSettingTab {
display() {
const { containerEl } = this;
containerEl.empty();
- containerEl.createEl("h2", { text: "CLI AI Assistant" });
- containerEl.createEl("p", {
- text: "Configure runtime behavior, launch commands, and advanced execution options.",
- cls: "setting-item-description"
- });
- containerEl.createEl("h3", { text: "Runtime behavior" });
new import_obsidian.Setting(containerEl).setName("Default runtime").setDesc("Runtime selected by default when opening the panel (and used by auto-start).").addDropdown((dropdown) => {
const runtimes = this.plugin.settings.runtimes;
if (runtimes.length === 0) {
@@ -9940,7 +9933,7 @@ var ClaudeCliSettingTab = class extends import_obsidian.PluginSettingTab {
await this.plugin.saveSettings();
})
);
- containerEl.createEl("h3", { text: "Runtimes" });
+ new import_obsidian.Setting(containerEl).setName("Runtimes").setHeading();
containerEl.createEl("p", {
text: "Configure the CLIs that show up in the sidebar dropdown. Each entry needs a display name and a launch command. Add as many as you want.",
cls: "setting-item-description"
@@ -9995,7 +9988,7 @@ var ClaudeCliSettingTab = class extends import_obsidian.PluginSettingTab {
this.display();
})
);
- containerEl.createEl("h3", { text: "Advanced" });
+ new import_obsidian.Setting(containerEl).setName("Advanced").setHeading();
new import_obsidian.Setting(containerEl).setName("Node executable").setDesc("Optional override for PTY proxy Node runtime. Leave as 'auto' for automatic detection.").addText(
(text) => text.setPlaceholder("auto").setValue(this.plugin.settings.nodeExecutable).onChange(async (value) => {
this.plugin.settings.nodeExecutable = value.trim() || "auto";
diff --git a/main.ts b/main.ts
index c66b652..49bb4ed 100644
--- a/main.ts
+++ b/main.ts
@@ -511,7 +511,8 @@ export default class ClaudeCliPlugin extends Plugin {
}
async onunload(): Promise {
- this.app.workspace.getLeavesOfType(VIEW_TYPE_CLAUDE).forEach((leaf) => leaf.detach());
+ // Per Obsidian plugin guidelines, do not detach leaves on unload —
+ // Obsidian preserves leaf state across reloads/updates.
}
async activateView(): Promise {
@@ -574,14 +575,6 @@ class ClaudeCliSettingTab extends PluginSettingTab {
const { containerEl } = this;
containerEl.empty();
- containerEl.createEl("h2", { text: "CLI AI Assistant" });
- containerEl.createEl("p", {
- text: "Configure runtime behavior, launch commands, and advanced execution options.",
- cls: "setting-item-description"
- });
-
- containerEl.createEl("h3", { text: "Runtime behavior" });
-
new Setting(containerEl)
.setName("Default runtime")
.setDesc("Runtime selected by default when opening the panel (and used by auto-start).")
@@ -633,7 +626,7 @@ class ClaudeCliSettingTab extends PluginSettingTab {
})
);
- containerEl.createEl("h3", { text: "Runtimes" });
+ new Setting(containerEl).setName("Runtimes").setHeading();
containerEl.createEl("p", {
text: "Configure the CLIs that show up in the sidebar dropdown. Each entry needs a display name and a launch command. Add as many as you want.",
cls: "setting-item-description"
@@ -708,7 +701,7 @@ class ClaudeCliSettingTab extends PluginSettingTab {
})
);
- containerEl.createEl("h3", { text: "Advanced" });
+ new Setting(containerEl).setName("Advanced").setHeading();
new Setting(containerEl)
.setName("Node executable")
diff --git a/manifest.json b/manifest.json
index b7a9c36..39496e6 100644
--- a/manifest.json
+++ b/manifest.json
@@ -3,7 +3,7 @@
"name": "Any AI CLI",
"version": "0.1.33",
"minAppVersion": "1.5.0",
- "description": "Open AI CLI in a right sidebar view.",
+ "description": "Run AI coding CLIs like Claude Code or Codex from a right sidebar terminal panel.",
"author": "Benoit Lamouche",
"authorUrl": "https://lamouche.fr",
"isDesktopOnly": true