meet(requirements): misc changes related to meeting Obsidian plugin community requirements

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 <h2>Perplexed Plugin Settings</h2> 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 <h3>/<h4> → 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) <noreply@anthropic.com>
This commit is contained in:
mpstaton 2026-05-02 20:34:40 -05:00
parent b3bc7e2f5c
commit 14962edde1
4 changed files with 230 additions and 13 deletions

View file

@ -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 <repository-url>
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)

View file

@ -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 `<h3>``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 <repository-url>` | `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\|<repository-url>\|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 `<h3>`/`<h4>` → `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)
```

View file

@ -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)';

View file

@ -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
}