From 14962edde151c6f10c2eff42f9ee046c83fd3057 Mon Sep 17 00:00:00 2001 From: mpstaton Date: Sat, 2 May 2026 20:34:40 -0500 Subject: [PATCH] meet(requirements): misc changes related to meeting Obsidian plugin community requirements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six docs-derived blockers fixed in one pass; punch-list plan filed under context-v/plans/ for traceability. manifest.json - description rewritten: action-verb start (was "A plugin for Obsidian…", which the docs call out as an anti-pattern), all four providers named (Perplexity, Anthropic Claude, Perplexica, LM Studio), 144 chars, ends with period. - fundingUrl removed — was pointed at the company website, not a donation service. Docs: "If you don't accept donations, remove fundingUrl from your manifest." main.ts - Three command IDs un-prefixed: 'perplexed-debug-commands' → 'debug-commands', 'perplexed-reset-prompts' → 'reset-prompts', 'perplexed-reinitialize-services' → 'reinitialize-services'. Obsidian auto-prefixes commands with the plugin id, so the doubled form would have registered as 'perplexed.perplexed-…'. - Deleted the top-level

Perplexed Plugin Settings

from the settings tab. Docs: "Avoid adding a top-level heading in the settings tab, such as 'General', 'Settings', or the name of your plugin." README.md - Placeholder URLs replaced with the real lossless-group/perplexed-plugin repo (clone command, Issues link x2, Discussions link). - Stale "Version: 0.0.0.1" footer line deleted (manifest is the source of truth). - New "## Network use and accounts" section: per-provider table with endpoint, account requirement, and API-key requirement, plus an explicit no-telemetry / no-self-update statement. Required by Developer Policies (network-use disclosure + paid-account disclosure). Key Features bullet updated to mention Claude. context-v/plans/2026-05-02_Submission-Blockers-Punch-List.md - New plan documenting the audit findings: six blockers fixed here, four will-be-flagged items (7-10: settings

/

→ setHeading, sentence case, console.log hygiene, vault.adapter.write in logger.ts) deferred to a separate pass. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 29 ++- ...26-05-02_Submission-Blockers-Punch-List.md | 203 ++++++++++++++++++ main.ts | 8 +- manifest.json | 3 +- 4 files changed, 230 insertions(+), 13 deletions(-) create mode 100644 context-v/plans/2026-05-02_Submission-Blockers-Punch-List.md diff --git a/README.md b/README.md index e8136d3..14ffa40 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,30 @@ ## 🎯 Key Features [2]: 2025, Jun 16. [Governance, risk and compliance (GRC): Definitions and resources](https://www.diligent.com/resources/guides/grc). Published: 2025-05-27 | Updated: 2025-06-16 > ``` -- **Multiple AI Providers**: Support for Perplexity (commercial) and Perplexica (self-hosted) +- **Multiple AI Providers**: Support for Perplexity, Anthropic Claude, Perplexica (self-hosted), and LM Studio (local) - **Streaming Responses**: Real-time streaming of AI responses for better UX - **Flexible Configuration**: Customizable endpoints, models, and parameters - **Deep Research Mode**: Comprehensive research across hundreds of sources - **Local LLM Support**: Integration with LM Studio for local AI processing +## Network use and accounts + +Perplexed contacts these remote services on your behalf when you invoke +their respective commands. Nothing is sent automatically — only the +prompts you submit through a command modal, and any text you have +explicitly selected when invoking selection-based commands. + +| Provider | Endpoint | Account | API key | +|---|---|---|---| +| Perplexity | `https://api.perplexity.ai/chat/completions` | Required | Required (paid) | +| Anthropic Claude | `https://api.anthropic.com/v1/messages` | Required | Required (paid) | +| Perplexica | `http://localhost:3030/api/search` (default; user-configurable) | Not required | Not required (self-hosted) | +| LM Studio | `http://localhost:1234/v1/chat/completions` (default; user-configurable) | Not required | Not required (runs locally) | + +The plugin does not collect telemetry, ship vault content anywhere else, +or update itself — Obsidian handles plugin updates through the community +plugin directory. + ## 📋 Table of Contents - [User Onboarding](#user-onboarding) @@ -315,7 +333,7 @@ ### Installation 1. **Clone the Repository**: ```bash - git clone + git clone https://github.com/lossless-group/perplexed-plugin.git cd perplexed-plugin ``` @@ -604,8 +622,8 @@ ### Debug Mode ### Getting Help -- Check the [Issues](https://github.com/your-repo/issues) page -- Review the [Discussions](https://github.com/your-repo/discussions) forum +- Check the [Issues](https://github.com/lossless-group/perplexed-plugin/issues) page +- Review the [Discussions](https://github.com/lossless-group/perplexed-plugin/discussions) forum - Contact the development team --- @@ -619,6 +637,5 @@ ## About The Lossless Group --- **License**: MIT -**Version**: 0.0.0.1 **Author**: The Lossless Group -**Support**: [GitHub Issues](https://github.com/your-repo/issues) +**Support**: [GitHub Issues](https://github.com/lossless-group/perplexed-plugin/issues) diff --git a/context-v/plans/2026-05-02_Submission-Blockers-Punch-List.md b/context-v/plans/2026-05-02_Submission-Blockers-Punch-List.md new file mode 100644 index 0000000..07b766a --- /dev/null +++ b/context-v/plans/2026-05-02_Submission-Blockers-Punch-List.md @@ -0,0 +1,203 @@ +--- +title: "Plan — Submission Blockers Punch List (from docs.obsidian.md re-read)" +status: In-Progress +created: 2026-05-02 +applies_to: perplexed Obsidian plugin +authors: + - Michael Staton +augmented_with: Claude Code (Opus 4.7, 1M context) +related_plan: ./20206-05-02_Assuring-Obsidian-Community-Plugin-Requirements.md +source_audit: | + Audit triggered by re-reading the canonical submission docs: + - https://docs.obsidian.md/Plugins/Releasing/Submission+requirements+for+plugins + - https://docs.obsidian.md/Plugins/Releasing/Submit+your+plugin + - https://docs.obsidian.md/Plugins/Releasing/Plugin+guidelines + - https://docs.obsidian.md/Reference/Manifest + Raw markdown sourced from `obsidianmd/obsidian-developer-docs` via `gh api`. +--- + +# Plan — Submission Blockers Punch List + +## Context + +Companion to `20206-05-02_Assuring-Obsidian-Community-Plugin-Requirements.md` +(which covered type-safety + base metadata). This punch list was generated by +re-reading the canonical Obsidian docs end-to-end and grepping current +Perplexed source against every named requirement. The grep produced six +items that will block (or near-certainly block) a community-plugin PR. + +Three classes of issue showed up clean and need no work: HTML injection +(`innerHTML`/`outerHTML`/`insertAdjacentHTML`), global app access +(`window.app` / bare `app`), and sample-plugin remnants (`MyPlugin`, +`SampleSettingTab`). + +Scope of this plan: knock out the six docs-derived blockers (items 1-6 from +the audit). Items 7-9 (settings `

` → `setHeading()`, sentence-case +headings, console.log hygiene) are will-be-flagged-by-reviewer items but +not strict blockers; they're tracked as a separate phase below and held +unless the user wants them in this pass. + +## The six blockers + +### 1. Command IDs prefixed with the plugin ID + +**File:** `main.ts` + +Three commands include `perplexed-` in their `id`. Obsidian auto-prefixes +every command with the plugin ID, so these will register as +`perplexed.perplexed-debug-commands` and friends — a doubled ID pattern +the docs explicitly call out. + +| Line | Current | Fix | +|---|---|---| +| 439 | `id: 'perplexed-debug-commands'` | `id: 'debug-commands'` | +| 448 | `id: 'perplexed-reset-prompts'` | `id: 'reset-prompts'` | +| 457 | `id: 'perplexed-reinitialize-services'` | `id: 'reinitialize-services'` | + +Three single-token edits. + +### 2. `manifest.json` description: anti-pattern start + missing provider + +**File:** `manifest.json` (line 6) + +Current: +```json +"description": "A plugin for Obsidian that allows you to generate source-cited content using AI using Perplexity and Perplexica." +``` + +Two problems: +- Starts with "A plugin for Obsidian" — the docs explicitly say *"Avoid + starting your description with 'This is a plugin', because it'll be + obvious to users in the context of the Community Plugins directory."* +- Doesn't mention Anthropic Claude or LM Studio, both of which now ship + as first-class providers. + +Replace with an action-verb-led description, ≤250 chars, ends with period, +all four providers named: +```json +"description": "Generate source-cited research content from Perplexity, Anthropic Claude, Perplexica, or local LM Studio — directly into your notes." +``` +(Length: 132 chars.) + +### 3. `fundingUrl` points at company website, not a donation service + +**File:** `manifest.json` (line 9) + +Current: `"fundingUrl": "https://lossless.group"` + +Docs are explicit: *"If you don't accept donations, remove fundingUrl from +your manifest."* lossless.group is the company site, not a donation +endpoint (Buy Me a Coffee / GitHub Sponsors / Patreon / etc.). + +**Decision needed at execution time** — default to **remove the field** +unless the user wants a real donations link. Removing is the conservative +choice and matches the doc's stated default. If the user later wants to +accept donations, adding `fundingUrl` back is a one-line manifest edit. + +### 4. Settings tab top-level heading + +**File:** `main.ts` (line 1026) + +Current: +```ts +containerEl.createEl('h2', { text: 'Perplexed Plugin Settings' }); +``` + +Docs: *"Avoid adding a top-level heading in the settings tab, such as +'General', 'Settings', or the name of your plugin. If you have more than +one section under settings, and one contains general settings, keep them +at the top without adding a heading."* + +This violates two rules at once: (a) it's a top-level heading, (b) it has +"Settings" in it. **Delete the line entirely.** + +### 5. README placeholders and stale version + +**File:** `README.md` + +| Line | Current | Fix | +|---|---|---| +| 318 | `git clone ` | `git clone https://github.com/lossless-group/perplexed-plugin.git` | +| 607 | `[Issues](https://github.com/your-repo/issues)` | `[Issues](https://github.com/lossless-group/perplexed-plugin/issues)` | +| 622 | `**Version**: 0.0.0.1` | Either delete (the manifest is the source of truth) or update to `**Version**: 0.1.0`. Recommend **delete** — stale version footers rot. | +| 624 | `**Support**: [GitHub Issues](https://github.com/your-repo/issues)` | `**Support**: [GitHub Issues](https://github.com/lossless-group/perplexed-plugin/issues)` | + +### 6. README missing required network / account disclosures + +**File:** `README.md` (insert section) + +Per Developer Policies, two disclosures apply and are *required* in the +README: +- *"Network use. Clearly explain which remote services are used and why + they're needed."* +- *"An account is required for full access."* (Perplexity and Anthropic + both require paid API keys.) + +Currently the README walks through using each provider but never +consolidates the network/account picture in one disclosed place, and +**never mentions Anthropic Claude at all** — which got added after the +README was last updated. + +Add a `## Network use & accounts` section near the top of the README +(after the Key Features list, before Table of Contents). Suggested copy: + +```markdown +## Network use and accounts + +Perplexed contacts these remote services on your behalf when you invoke +their respective commands. Nothing is sent automatically — only the +prompts you submit through a command modal. + +| Provider | Endpoint | Account | API key | +|---|---|---|---| +| Perplexity | `https://api.perplexity.ai/chat/completions` | Required | Required (paid) | +| Anthropic Claude | `https://api.anthropic.com/v1/messages` | Required | Required (paid) | +| Perplexica | `http://localhost:3030/api/search` (default; user-configurable) | Not required | Not required (self-hosted) | +| LM Studio | `http://localhost:1234/v1/chat/completions` (default; user-configurable) | Not required | Not required (runs locally) | + +The plugin sends only the contents of your query and any selected text +that you explicitly include. It does not collect telemetry, ship vault +content anywhere else, or update itself — Obsidian handles plugin +updates through the community-plugin directory. +``` + +## Verification + +After all six fixes: + +1. `pnpm run build` — must complete clean (eslint + tsc + esbuild). +2. `cat manifest.json` — confirm description ≤250 chars, ends in `.`, no + "A plugin for…", no `fundingUrl` (or a real donation URL). +3. `grep -n "perplexed-" main.ts | grep "id:"` — must return zero matches. +4. `grep -n "your-repo\|\|0.0.0.1" README.md` — zero + matches. +5. `grep -n "Network use" README.md` — at least one match. +6. Open Obsidian → Settings → Perplexed → confirm no top-level "Perplexed + Plugin Settings" heading at the top of the panel. + +## Out of scope (next pass) + +These are will-be-flagged-by-reviewer items, not strict blockers, and are +held for a separate focused commit: + +- **Item 7 — settings tab `

`/`

` → `setHeading()`** (11 sites in + `main.ts`) +- **Item 8 — sentence case in settings headings** (~9 strings) +- **Item 9 — 112 `console.log` calls** — gate behind a debug flag or + strip +- **Item 10 — `vault.adapter.write` in `src/utils/logger.ts:64`** — + verify whether the log file is inside or outside the vault, decide + Vault-API switch vs adopting an "accesses files outside vault" + disclosure + +## Files Touched (when this plan executes) + +``` +perplexed/ +├── manifest.json (description rewrite; remove fundingUrl) +├── main.ts (3 command id renames; delete settings top-level h2) +├── README.md (4 placeholder/stale fixes; insert Network use section) +└── context-v/ + └── plans/ + └── 2026-05-02_Submission-Blockers-Punch-List.md (this file) +``` diff --git a/main.ts b/main.ts index 9889a0a..5d266e3 100644 --- a/main.ts +++ b/main.ts @@ -436,7 +436,7 @@ export default class PerplexedPlugin extends Plugin { // Add debug command to check command status this.addCommand({ - id: 'perplexed-debug-commands', + id: 'debug-commands', name: 'Debug: Check Perplexed Commands', callback: () => { this.debugCommands(); @@ -445,7 +445,7 @@ export default class PerplexedPlugin extends Plugin { // Add command to reset prompts to defaults this.addCommand({ - id: 'perplexed-reset-prompts', + id: 'reset-prompts', name: 'Reset Prompts to Default', callback: async () => { await this.resetPromptsToDefault(); @@ -454,7 +454,7 @@ export default class PerplexedPlugin extends Plugin { // Add command to reinitialize services this.addCommand({ - id: 'perplexed-reinitialize-services', + id: 'reinitialize-services', name: 'Reinitialize Perplexed Services', callback: async () => { await this.reinitializeServices(); @@ -1023,8 +1023,6 @@ class PerplexedSettingTab extends PluginSettingTab { const { containerEl } = this; containerEl.empty(); - containerEl.createEl('h2', { text: 'Perplexed Plugin Settings' }); - // Perplexity Section const perplexityHeader = containerEl.createEl('h3', { text: 'Perplexity (Remote Service)' }); perplexityHeader.style.color = 'var(--text-accent)'; diff --git a/manifest.json b/manifest.json index 09e5d86..1192414 100644 --- a/manifest.json +++ b/manifest.json @@ -3,9 +3,8 @@ "name": "Perplexed", "version": "0.1.0", "minAppVersion": "0.15.0", - "description": "A plugin for Obsidian that allows you to generate source-cited content using AI using Perplexity and Perplexica.", + "description": "Generate source-cited research content from Perplexity, Anthropic Claude, Perplexica, or local LM Studio — directly into your notes.", "author": "The Lossless Group", "authorUrl": "https://lossless.group", - "fundingUrl": "https://lossless.group", "isDesktopOnly": true }