Initial Obsidian plugin release repository
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
# LLM-Wiki Obsidian Community Publishing Staging
|
||||
|
||||
This directory is a staging export for an Obsidian community-plugin repository root.
|
||||
|
||||
Required next steps:
|
||||
|
||||
1. push this directory into a dedicated repository
|
||||
2. tag a release matching `0.0.1`
|
||||
3. attach release assets:
|
||||
- `main.js`
|
||||
- `manifest.json`
|
||||
- `styles.css`
|
||||
4. keep `versions.json` at repository root
|
||||
5. submit the repository to `obsidianmd/obsidian-releases`
|
||||
|
||||
Runtime note:
|
||||
|
||||
This plugin still requires a separate external LLM-Wiki runtime root. The published Obsidian plugin bundle does not embed the full runtime.
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 LLM-Wiki contributors
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,100 @@
|
||||
# LLM-Wiki Obsidian Plugin
|
||||
|
||||
Desktop-only Obsidian community plugin for Phase 2 of LLM-Wiki.
|
||||
|
||||
## What it does
|
||||
|
||||
- right-sidebar chat panel for discussing the active wiki page with Claude Code
|
||||
- Save Insight action that persists assistant output through `scripts/lw2-save-insight`
|
||||
- Fast Research tab that runs an isolated read-only Claude research turn and can promote useful output through Save Insight
|
||||
- Deep Research workbench that uses Claude sessions to iteratively refine a draft before registering it with `scripts/lw2-deep-research`
|
||||
- source trust badges in edit/preview modes with mutation routed through `scripts/lw2-source-trust`
|
||||
- batch source-trust updates for all page sources from the current note
|
||||
- command-palette entries for `Run LLM-Wiki compile preflight` and `Run LLM-Wiki lint deterministic pass`
|
||||
- confidence-tag styling for inline markers such as `*EXTRACTED 0.95*`
|
||||
|
||||
## Current compile/lint scope
|
||||
|
||||
The Obsidian plugin currently exposes:
|
||||
|
||||
- `Run LLM-Wiki compile preflight`
|
||||
- `Run LLM-Wiki lint deterministic pass`
|
||||
|
||||
These are deterministic script entrypoints, not the full prompt-owned Claude compile workflow. That means:
|
||||
|
||||
- compile currently runs the conservative `scripts/lw2-compile` preflight and reports the manifest state
|
||||
- lint currently runs `scripts/lw2-lint`
|
||||
- the full semantic wiki-compilation workflow is still centered on the Claude Code `lw2:compile` skill
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
cd apps/obsidian-lw2
|
||||
npm install
|
||||
npm test
|
||||
npm run build
|
||||
npm run release:bundle
|
||||
npm run release:community-staging -- --license /path/to/LICENSE
|
||||
```
|
||||
|
||||
Repo-level regression:
|
||||
|
||||
```bash
|
||||
cd /home/charles/workspaces/notes/my-llm-wiki
|
||||
npm run test:obsidian
|
||||
```
|
||||
|
||||
Release bundle output:
|
||||
|
||||
- directory: `apps/obsidian-lw2/release/lw2-obsidian-<version>/`
|
||||
- zip: `apps/obsidian-lw2/release/lw2-obsidian-<version>.zip` when `zip` is available
|
||||
|
||||
The release bundle contains:
|
||||
|
||||
- `main.js`
|
||||
- `manifest.json`
|
||||
- `styles.css`
|
||||
- `versions.json`
|
||||
- `README.md`
|
||||
- `INSTALL.md`
|
||||
|
||||
Community-repo staging:
|
||||
|
||||
- command: `npm run release:community-staging -- --license /path/to/LICENSE`
|
||||
- output: `apps/obsidian-lw2/release/community-repo/`
|
||||
|
||||
This exports a directory shaped like an Obsidian community-plugin repository root. It intentionally fails unless you provide a real `LICENSE` file path.
|
||||
|
||||
## Local loading in Obsidian
|
||||
|
||||
1. Build the package: `npm run build`
|
||||
2. Copy or symlink `apps/obsidian-lw2/` into your vault at `.obsidian/plugins/lw2-obsidian/`
|
||||
3. Enable **LLM-Wiki Obsidian** in Community Plugins
|
||||
4. Open plugin settings and set:
|
||||
- runtime root: absolute path to the LLM-Wiki runtime repo
|
||||
- Claude command: usually `claude`
|
||||
- Claude plugin dir: `plugins/lw2`
|
||||
- the opened Obsidian vault remains the content root; it does not need to contain `scripts/` or `plugins/lw2/`
|
||||
5. Run the manual checklist in [`../../tests/live/obsidian-plugin-checklist.md`](../../tests/live/obsidian-plugin-checklist.md)
|
||||
|
||||
## Third-Party Manual Install
|
||||
|
||||
1. Build the release bundle with `npm run release:bundle`
|
||||
2. Copy `main.js`, `manifest.json`, and `styles.css` from `release/lw2-obsidian-<version>/` into:
|
||||
- `.obsidian/plugins/lw2-obsidian/`
|
||||
3. Enable **LLM-Wiki Obsidian**
|
||||
4. Point `runtime root` at an external LLM-Wiki runtime checkout
|
||||
|
||||
This plugin does not embed the full LLM-Wiki runtime. Third-party installs still need a separate runtime root.
|
||||
|
||||
## Official Community Plugin Path
|
||||
|
||||
The recommended publication model is:
|
||||
|
||||
1. build the plugin here
|
||||
2. export `release/community-repo/`
|
||||
3. push that directory into a dedicated release repository
|
||||
4. publish GitHub releases from that repository
|
||||
5. submit that repository to Obsidian's community plugin index
|
||||
|
||||
This monorepo is the development source of truth, not the ideal official marketplace repository root.
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "lw2-obsidian",
|
||||
"name": "LLM-Wiki Obsidian",
|
||||
"version": "0.0.1",
|
||||
"minAppVersion": "1.7.2",
|
||||
"description": "Desktop-only Obsidian shell for the LLM-Wiki Claude workflow.",
|
||||
"author": "LLM-Wiki",
|
||||
"isDesktopOnly": true
|
||||
}
|
||||
+219
@@ -0,0 +1,219 @@
|
||||
.lw2-obsidian-status {
|
||||
color: var(--text-muted);
|
||||
font-size: var(--font-ui-smaller);
|
||||
}
|
||||
|
||||
.lw2-obsidian-settings-note {
|
||||
color: var(--text-muted);
|
||||
margin-top: 0.75rem;
|
||||
}
|
||||
|
||||
.lw2-chat-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
height: 100%;
|
||||
padding: 0.75rem;
|
||||
}
|
||||
|
||||
.lw2-chat-header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.35rem;
|
||||
}
|
||||
|
||||
.lw2-chat-header-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.lw2-chat-header h2 {
|
||||
margin: 0;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.lw2-chat-close-button {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.lw2-chat-context,
|
||||
.lw2-modal-context,
|
||||
.lw2-chat-message-context {
|
||||
color: var(--text-muted);
|
||||
font-size: var(--font-ui-smaller);
|
||||
}
|
||||
|
||||
.lw2-chat-transcript {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
|
||||
.lw2-chat-empty {
|
||||
color: var(--text-muted);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.lw2-chat-message {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.35rem;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 8px;
|
||||
padding: 0.65rem;
|
||||
}
|
||||
|
||||
.lw2-chat-message-user {
|
||||
background: color-mix(in srgb, var(--interactive-accent) 10%, var(--background-primary));
|
||||
}
|
||||
|
||||
.lw2-chat-message-assistant {
|
||||
background: var(--background-secondary);
|
||||
}
|
||||
|
||||
.lw2-chat-message-role {
|
||||
color: var(--text-muted);
|
||||
font-size: var(--font-ui-smaller);
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.lw2-chat-message-body {
|
||||
margin: 0;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-word;
|
||||
font: inherit;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
|
||||
.lw2-chat-message-actions,
|
||||
.lw2-chat-actions,
|
||||
.lw2-modal-actions {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.lw2-chat-composer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.lw2-chat-input,
|
||||
.lw2-modal-textarea textarea,
|
||||
.lw2-modal-textarea {
|
||||
width: 100%;
|
||||
min-height: 8rem;
|
||||
resize: vertical;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.lw2-research-controls {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.lw2-research-input {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.lw2-deep-research-scroll {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
overflow-y: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.lw2-deep-research-transcript {
|
||||
flex: 0 0 auto;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.lw2-deep-research-footer {
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
padding-top: 0.75rem;
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
background: var(--background-primary);
|
||||
}
|
||||
|
||||
.lw2-source-badge-row {
|
||||
display: inline-flex;
|
||||
gap: 0.4rem;
|
||||
flex-wrap: wrap;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
vertical-align: top;
|
||||
margin: 0 0 0.75rem;
|
||||
}
|
||||
|
||||
.lw2-source-badge {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 999px;
|
||||
padding: 0.15rem 0.55rem;
|
||||
font-size: var(--font-ui-smaller);
|
||||
background: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.lw2-source-badge-active {
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
.lw2-source-badge-flagged {
|
||||
color: var(--color-orange);
|
||||
border-color: color-mix(in srgb, var(--color-orange) 55%, var(--background-modifier-border));
|
||||
}
|
||||
|
||||
.lw2-source-badge-obsolete {
|
||||
color: var(--color-red);
|
||||
border-color: color-mix(in srgb, var(--color-red) 55%, var(--background-modifier-border));
|
||||
}
|
||||
|
||||
.lw2-source-badge-excluded {
|
||||
color: var(--text-faint);
|
||||
border-color: var(--background-modifier-border-hover);
|
||||
}
|
||||
|
||||
.lw2-source-badge-batch {
|
||||
color: var(--text-muted);
|
||||
background: var(--background-secondary);
|
||||
}
|
||||
|
||||
.lw2-confidence-pill {
|
||||
display: inline-block;
|
||||
border-radius: 999px;
|
||||
padding: 0 0.45rem;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.lw2-confidence-extracted {
|
||||
color: var(--color-green);
|
||||
}
|
||||
|
||||
.lw2-confidence-inferred {
|
||||
color: var(--color-blue);
|
||||
}
|
||||
|
||||
.lw2-confidence-ambiguous {
|
||||
color: var(--color-orange);
|
||||
}
|
||||
|
||||
.lw2-confidence-high {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.lw2-confidence-low {
|
||||
opacity: 0.82;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"0.0.1": "1.7.2"
|
||||
}
|
||||
Reference in New Issue
Block a user