Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"name": "knapper",
"description": "Drive a live Obsidian desktop app over MCP: develop and test Obsidian plugins, automate the vault and UI, and read console output. Use for anything involving Obsidian, its vaults, notes, or plugins.",
"description": "MCP server for stateless Obsidian plugin development with one managed session, browser automation, and debugging.",
"interface": {
"displayName": "Knapper"
},
"plugins": [
{
"name": "knapper",
"description": "Drive a live Obsidian desktop app over MCP: develop and test Obsidian plugins, automate the vault and UI, and read console output. Use for anything involving Obsidian, its vaults, notes, or plugins.",
"description": "MCP server for stateless Obsidian plugin development with one managed session, browser automation, and debugging.",
"source": {
"source": "local",
"path": "./"
Expand Down
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://code.claude.com/schemas/marketplace.json",
"name": "knapper",
"description": "MCP server for Obsidian plugin development: integrated browser, debugging, and session-based vaults for agents.",
"description": "MCP server for stateless Obsidian plugin development with one managed session, browser automation, and debugging.",
"owner": {
"name": "bearfire-dev",
"url": "https://github.com/bearfire-dev"
Expand All @@ -10,7 +10,7 @@
{
"name": "knapper",
"source": "./",
"description": "MCP server for Obsidian plugin development: integrated browser, debugging, and session-based vaults for agents."
"description": "MCP server for stateless Obsidian plugin development with one managed session, browser automation, and debugging."
}
]
}
19 changes: 16 additions & 3 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,26 @@
{
"name": "knapper",
"version": "0.6.0-beta.9",
"description": "MCP server for Obsidian plugin development: integrated browser, debugging, and session-based vaults for agents.",
"version": "0.7.0-beta.1",
"description": "MCP server for stateless Obsidian plugin development with one managed session, browser automation, and debugging.",
"author": {
"name": "slate-rehm",
"url": "https://github.com/slate-rehm"
},
"homepage": "https://github.com/bearfire-dev/knapper#readme",
"repository": "https://github.com/bearfire-dev/knapper",
"license": "MIT",
"keywords": ["obsidian", "mcp", "plugin-development", "playwright", "cdp", "automation"]
"keywords": ["obsidian", "mcp", "plugin-development", "playwright", "cdp", "automation"],
"interface": {
"displayName": "Knapper",
"shortDescription": "Develop and test Obsidian plugins in one managed session.",
"longDescription": "Drive one live Obsidian desktop session through MCP. Build and reload plugins, automate settings and other UI, and inspect console errors.",
"developerName": "Bearfire",
"category": "Developer Tools",
"capabilities": ["Obsidian automation", "Plugin development", "UI testing"],
"defaultPrompt": [
"Open an isolated Obsidian session and test this plugin.",
"Reload this Obsidian plugin and check for new errors.",
"Exercise this plugin's settings through the live UI."
]
}
}
19 changes: 16 additions & 3 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,26 @@
{
"name": "knapper",
"version": "0.6.0-beta.9",
"description": "MCP server for Obsidian plugin development: integrated browser, debugging, and session-based vaults for agents.",
"version": "0.7.0-beta.1",
"description": "MCP server for stateless Obsidian plugin development with one managed session, browser automation, and debugging.",
"author": {
"name": "slate-rehm",
"url": "https://github.com/slate-rehm"
},
"homepage": "https://github.com/bearfire-dev/knapper#readme",
"repository": "https://github.com/bearfire-dev/knapper",
"license": "MIT",
"keywords": ["obsidian", "mcp", "plugin-development", "playwright", "cdp", "automation"]
"keywords": ["obsidian", "mcp", "plugin-development", "playwright", "cdp", "automation"],
"interface": {
"displayName": "Knapper",
"shortDescription": "Develop and test Obsidian plugins in one managed session.",
"longDescription": "Drive one live Obsidian desktop session through MCP. Build and reload plugins, automate settings and other UI, and inspect console errors.",
"developerName": "Bearfire",
"category": "Developer Tools",
"capabilities": ["Obsidian automation", "Plugin development", "UI testing"],
"defaultPrompt": [
"Open an isolated Obsidian session and test this plugin.",
"Reload this Obsidian plugin and check for new errors.",
"Exercise this plugin's settings through the live UI."
]
}
}
19 changes: 16 additions & 3 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,26 @@
{
"name": "knapper",
"version": "0.6.0-beta.9",
"description": "MCP server for Obsidian plugin development: integrated browser, debugging, and session-based vaults for agents.",
"version": "0.7.0-beta.1",
"description": "MCP server for stateless Obsidian plugin development with one managed session, browser automation, and debugging.",
"author": {
"name": "slate-rehm",
"url": "https://github.com/slate-rehm"
},
"homepage": "https://github.com/bearfire-dev/knapper#readme",
"repository": "https://github.com/bearfire-dev/knapper",
"license": "MIT",
"keywords": ["obsidian", "mcp", "plugin-development", "playwright", "cdp", "automation"]
"keywords": ["obsidian", "mcp", "plugin-development", "playwright", "cdp", "automation"],
"interface": {
"displayName": "Knapper",
"shortDescription": "Develop and test Obsidian plugins in one managed session.",
"longDescription": "Drive one live Obsidian desktop session through MCP. Build and reload plugins, automate settings and other UI, and inspect console errors.",
"developerName": "Bearfire",
"category": "Developer Tools",
"capabilities": ["Obsidian automation", "Plugin development", "UI testing"],
"defaultPrompt": [
"Open an isolated Obsidian session and test this plugin.",
"Reload this Obsidian plugin and check for new errors.",
"Exercise this plugin's settings through the live UI."
]
}
}
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ name: Release
# This project is not published to any registry. The release artifact is the npm
# tarball attached to the GitHub Release, which users install by URL:
#
# npm i -g https://github.com/bearfire-dev/knapper/releases/download/v0.6.0-beta.7/knapper-0.6.0-beta.7.tgz
# npm i -g https://github.com/bearfire-dev/knapper/releases/download/v0.7.0-beta.1/knapper-0.7.0-beta.1.tgz
#
# The version bump itself is an ordinary change: bump it in a PR into dev, then
# promote dev -> master. This workflow only tags and releases what is already on
Expand Down
24 changes: 12 additions & 12 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ src/
telemetry/ console/error/network ring buffer, plugin attribution
devcycle/ composites (dev_cycle, exercise, reset_state)
session/ internal isolated-instance descriptors, launch, and cleanup
agent/, workspace/ durable public handles and leases
usage/ cross-process single-user activity guard
scripts/ acceptance, e2e, ci-smoke, version sync

skills/ plugin skills (obsidian-debugging, -instance-setup,
Expand Down Expand Up @@ -84,9 +84,9 @@ npm run bg-input # 6 live checks: background input without desktop focus theft
npm run workspaces # isolated instances, reconnect, scoped restart, quarantine
```

Each live suite provisions its own workspace and tears it down. Run `npm run
workspaces` for anything that changes `src/session/`, `launch.ts`, workspace
leases, or process-scoping predicates.
Each live suite provisions one private session and tears it down. Run `npm run
workspaces` for changes to `src/session/`, `launch.ts`, the activity guard, or
process-scoping predicates.

`npm run check && npm run typecheck && npm test && npm run acceptance` is the
minimum before proposing a change. Run `npm run e2e` for anything touching the
Expand Down Expand Up @@ -162,10 +162,10 @@ must stay distinguishable; collapsing them into "cannot connect" is a regression
`classifyCliOutput` / `classifyEvalOutput` in `connection/cli/exec.ts` own that
translation. Any new CLI surface goes through them.

**Every tool needs annotations.** `readOnlyHint` gates concurrency: the registry
takes an exclusive lock for anything not marked read-only, so a mislabeled mutating
tool will interleave real input against shared UI. Add `destructiveHint` for
anything that deletes or overwrites. Every schema field needs `.describe()`.
**Every tool needs annotations.** The registry serializes all calls against one
active target. `readOnlyHint` still tells MCP clients what a tool changes. Add
`destructiveHint` for anything that deletes or overwrites. Every schema field needs
`.describe()`.

**Adding a tool** means: register it in the right `src/tools/*.ts` module with a
toolset and capability, describe every field, add it to the E2E suite, and check
Expand Down Expand Up @@ -197,10 +197,10 @@ second copy. Bump both together.
- Delegate independent workstreams to parallel subagents with **strict file
ownership**, since they share one working tree. Overlapping edits corrupt each
other. Follow implementation with an audit subagent that runs `npm run check`.
- Open an agent handle, then create an isolated workspace for live work. Pass its
`workspaceHandle` to every operational tool.
- One MCP server owns the default profile at a time. On `DEFAULT_PROFILE_BUSY`,
create an isolated workspace and retry with its handle.
- Open one isolated session with `obsidian_session_open`. Operational tools use the
active target and do not accept caller-owned handles.
- On `KNAPPER_BUSY`, inspect `obsidian_status` and retry after the reported activity
window or after the current owner releases the session.
- `npm run bg-input` stays serialized regardless: it depends on Obsidian not being the
foreground window, which is one global property of the desktop, and it fails open.
- Use mermaid flowcharts to explain architecture in plans.
Expand Down
Loading