botnote 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -179,14 +179,14 @@ from the public repository without a full source checkout:
|
|
|
179
179
|
|
|
180
180
|
```bash
|
|
181
181
|
codex plugin marketplace add https://github.com/jianhua-wang/botnote.git \
|
|
182
|
-
--sparse
|
|
182
|
+
--sparse .agents/plugins \
|
|
183
183
|
--sparse plugins/botnote
|
|
184
184
|
|
|
185
185
|
codex plugin add botnote@botnote-plugins
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
-
The
|
|
189
|
-
|
|
188
|
+
The sparse checkout must include `.agents/plugins`, because Codex discovers the
|
|
189
|
+
marketplace manifest from `.agents/plugins/marketplace.json`.
|
|
190
190
|
|
|
191
191
|
For local plugin development, add this marketplace entry to
|
|
192
192
|
`.agents/plugins/marketplace.json` in the repo:
|
package/package.json
CHANGED
|
@@ -482,13 +482,13 @@ BOTNOTE_URL=http://127.0.0.1:4280 botnote today
|
|
|
482
482
|
|
|
483
483
|
# Config file (preferred for the daemon host):
|
|
484
484
|
# ~/.config/botnote/config.json
|
|
485
|
-
# { "baseUrl": "http://127.0.0.1:4280" }`})]})}function rU(){return O.jsxs(O.Fragment,{children:[O.jsx(Xl,{title:"Plugin",blurb:"
|
|
485
|
+
# { "baseUrl": "http://127.0.0.1:4280" }`})]})}function rU(){return O.jsxs(O.Fragment,{children:[O.jsx(Xl,{title:"Plugin",blurb:"Add botnote as the plugin-backed MCP + workflow layer for each agent client. Letheia / Plane MCP setup should stay retired."}),O.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-2",children:[O.jsx(kO,{icon:zS,title:"1. Optional CLI",body:"Install the npm binary when you want botnote login or terminal commands. Plugins can run without it via npx."}),O.jsx(kO,{icon:LB,title:"2. Client plugin",body:"Install the marketplace plugin in Claude Code, Codex, Cursor, or another agent client."}),O.jsx(kO,{icon:FT,title:"3. Reload client",body:"Claude Code reloads plugins in-session. Codex needs a new session after install or update."})]}),O.jsxs("div",{className:"border border-accent/20 bg-accentSoft/50 rounded-md px-4 py-3 text-xs text-accentText leading-relaxed",children:["Use ",O.jsx("code",{className:"text-ink",children:"https://botnote.net"})," with an API token from this settings page on remote devices. On the daemon host, use"," ",O.jsx("code",{className:"text-ink",children:"http://127.0.0.1:4280"})," and skip the token."]}),O.jsx(xo,{icon:zS,title:"Runtime",subtitle:"Optional helper for login, manual CLI commands, and offline fallback. Plugin MCP can run through npx without a global CLI."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install runtime",code:`# Optional helper CLI for login and manual commands.
|
|
486
486
|
# Plugins can run without a global CLI by using npx.
|
|
487
487
|
npm i -g botnote@latest
|
|
488
488
|
|
|
489
489
|
# Remote clients: save https://botnote.net + a bearer token.
|
|
490
490
|
# Daemon host: use http://127.0.0.1:4280 and skip the token.
|
|
491
|
-
botnote login`}),O.jsx(on,{title:"Update runtime",code:`#
|
|
491
|
+
botnote login`}),O.jsx(on,{title:"Update runtime",code:`# If you installed the optional helper CLI, keep it current.
|
|
492
492
|
npm i -g botnote@latest
|
|
493
493
|
botnote --version`})]}),O.jsx(xo,{icon:NB,title:"Claude Code",subtitle:"Recommended for day-to-day work. Enable marketplace auto-update after installation."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# In Claude Code
|
|
494
494
|
/plugin marketplace add jianhua-wang/botnote
|
|
@@ -504,17 +504,20 @@ botnote --version`})]}),O.jsx(xo,{icon:NB,title:"Claude Code",subtitle:"Recommen
|
|
|
504
504
|
/reload-plugins
|
|
505
505
|
|
|
506
506
|
# Manual update, if available in your Claude Code build:
|
|
507
|
-
claude plugin update botnote@botnote`})]}),O.jsx(xo,{icon:GT,title:"Codex",subtitle:"Use the Git marketplace flow; sparse checkout means no full botnote source checkout."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# No full source checkout required.
|
|
507
|
+
claude plugin update botnote@botnote`})]}),O.jsx(xo,{icon:GT,title:"Codex",subtitle:"Use the Git marketplace flow; sparse checkout means no full botnote source checkout. Restart Codex after install or update."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# No full source checkout required.
|
|
508
508
|
codex plugin marketplace add https://github.com/jianhua-wang/botnote.git \\
|
|
509
|
-
--sparse
|
|
509
|
+
--sparse .agents/plugins \\
|
|
510
510
|
--sparse plugins/botnote
|
|
511
511
|
|
|
512
|
-
codex plugin add botnote@botnote-plugins
|
|
512
|
+
codex plugin add botnote@botnote-plugins
|
|
513
|
+
|
|
514
|
+
# Restart Codex: exit this session, then run codex again.
|
|
515
|
+
# In the new session, check /mcp.`}),O.jsx(on,{title:"Update",code:`# Codex refreshes Git marketplaces, then installs from the fresh snapshot.
|
|
513
516
|
codex plugin marketplace upgrade botnote-plugins
|
|
514
517
|
codex plugin remove botnote@botnote-plugins
|
|
515
518
|
codex plugin add botnote@botnote-plugins
|
|
516
519
|
|
|
517
|
-
# Open a new Codex session after updating.`})]}),O.jsx(xo,{icon:qT,title:"Cursor",subtitle:"Uses the same plugin bundle
|
|
520
|
+
# Open a new Codex session after updating.`})]}),O.jsx(xo,{icon:qT,title:"Cursor",subtitle:"Uses the same plugin bundle. Keep the CLI installed only if you want terminal commands or offline fallback."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# Cursor plugin clients can use the repository marketplace.
|
|
518
521
|
# Marketplace metadata lives at .cursor-plugin/marketplace.json.
|
|
519
522
|
https://github.com/jianhua-wang/botnote
|
|
520
523
|
|
|
@@ -537,13 +540,13 @@ npm i -g botnote@latest`})]}),O.jsx(xo,{icon:yx,title:"Advanced",subtitle:"Only
|
|
|
537
540
|
"category": "Productivity"
|
|
538
541
|
}
|
|
539
542
|
]
|
|
540
|
-
}`}),O.jsx(xo,{icon:VT,title:"Slash commands",subtitle:"Available after
|
|
543
|
+
}`}),O.jsx(xo,{icon:VT,title:"Slash commands",subtitle:"Available after Claude Code reloads plugins or Codex starts a new session with the plugin installed."}),O.jsx(on,{title:"Commands",code:`/botnote:today # today + overdue
|
|
541
544
|
/botnote:show-todo # open work across projects
|
|
542
545
|
/botnote:add-task "..." # create a task
|
|
543
546
|
/botnote:start-work DEMO-12 # pick up a task with project context
|
|
544
547
|
/botnote:remember "..." # capture a note
|
|
545
548
|
/botnote:recall "..." # hybrid search
|
|
546
|
-
/botnote:done # mark current focus done`}),O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 text-xs text-muted leading-relaxed flex items-start gap-3",children:[O.jsx(_B,{size:13,className:"mt-0.5 shrink-0 text-accent"}),O.jsxs("div",{children:["Plugin distribution lives at"," ",O.jsx("a",{href:"https://github.com/jianhua-wang/botnote",target:"_blank",className:"text-accent hover:underline",rel:"noreferrer",children:"jianhua-wang/botnote"}),". ","Claude Code can auto-update third-party marketplaces when enabled; after an update, run"," ",O.jsx("code",{className:"text-ink",children:"/reload-plugins"}),". Codex
|
|
549
|
+
/botnote:done # mark current focus done`}),O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 text-xs text-muted leading-relaxed flex items-start gap-3",children:[O.jsx(_B,{size:13,className:"mt-0.5 shrink-0 text-accent"}),O.jsxs("div",{children:["Plugin distribution lives at"," ",O.jsx("a",{href:"https://github.com/jianhua-wang/botnote",target:"_blank",className:"text-accent hover:underline",rel:"noreferrer",children:"jianhua-wang/botnote"}),". ","Claude Code can auto-update third-party marketplaces when enabled; after an update, run"," ",O.jsx("code",{className:"text-ink",children:"/reload-plugins"}),". Codex has no reload command: refresh Git marketplace snapshots with"," ",O.jsx("code",{className:"text-ink",children:"codex plugin marketplace upgrade"}),", reinstall the plugin, then start a new Codex session."]})]})]})}function kO({icon:n,title:e,body:t}){return O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 min-h-[104px]",children:[O.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold text-ink",children:[O.jsx("span",{className:"w-6 h-6 rounded-md bg-accentSoft text-accent flex items-center justify-center shrink-0",children:O.jsx(n,{size:13})}),e]}),O.jsx("p",{className:"mt-2 text-xs text-muted leading-relaxed",children:t})]})}function xo({icon:n,title:e,subtitle:t}){return O.jsxs("div",{className:"pt-2 border-t border-lineSoft flex items-start gap-2",children:[O.jsx("span",{className:"mt-0.5 w-6 h-6 rounded-md bg-sidebar text-muted border border-line flex items-center justify-center shrink-0",children:O.jsx(n,{size:13})}),O.jsxs("div",{children:[O.jsx("h2",{className:"text-sm font-semibold text-ink",children:e}),O.jsx("p",{className:"text-xs text-muted leading-relaxed mt-0.5",children:t})]})]})}function iU(){const{data:n,isLoading:e}=Iq(),t=zq(),r=Zq(),[i,s]=N.useState(!0),[l,o]=N.useState("openai"),[u,h]=N.useState("text-embedding-3-small"),[f,p]=N.useState(""),[m,y]=N.useState(""),[k,b]=N.useState(!1),[w,S]=N.useState(null);N.useEffect(()=>{n&&(s(n.enabled),o(n.provider),h(n.model),p(n.baseUrl??""),y(""),b(!1))},[n]);async function C(T){T.preventDefault(),S(null);const Z=m.trim(),q={enabled:i,provider:l,model:u.trim(),baseUrl:l==="openai_compatible"&&f.trim()||null,...Z?{apiKey:Z}:k?{apiKey:null}:{}},ee=await t.mutateAsync(q);y(""),b(!1),S(ee.effectiveEnabled?"Embedding search is ready.":zP(ee.statusReason))}async function Q(){S(null);const T=Math.min((n==null?void 0:n.missingCount)??xO,xO),Z=await r.mutateAsync(T),q=n&&n.missingCount>xO;S(q?`Queued ${Z.enqueued} item(s), the maximum per request. Pending queue: ${Z.pendingCount}.`:`Queued all ${Z.enqueued} missing item(s). Pending queue: ${Z.pendingCount}.`)}const A=n&&n.totalCount>0?Math.round(n.embeddedCount/n.totalCount*100):0,I=!!(n!=null&&n.effectiveEnabled&&n.missingCount>0);return O.jsxs(O.Fragment,{children:[O.jsx(Xl,{title:"Embeddings",blurb:"Configure semantic search for botnote. The database vector column is fixed at 384 dimensions, so provider models must return 384-dimensional embeddings."}),O.jsx("div",{className:`border rounded-md px-4 py-3 text-xs leading-relaxed ${n!=null&&n.effectiveEnabled?"border-success/30 bg-success/10 text-ink":"border-warn/30 bg-warn/10 text-ink"}`,children:e?"Loading embedding settings...":n!=null&&n.effectiveEnabled?O.jsxs(O.Fragment,{children:["Semantic search is enabled via ",O.jsx("strong",{children:sU(n.provider)})," using"," ",O.jsx("code",{children:n.model}),". Search merges BM25 + cosine + time decay."]}):O.jsxs(O.Fragment,{children:["Semantic search is not active: ",zP((n==null?void 0:n.statusReason)??"not_loaded"),". Text search still works through BM25."]})}),O.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-2",children:[O.jsx(Tf,{label:"Status",value:n!=null&&n.effectiveEnabled?"On":"Off"}),O.jsx(Tf,{label:"Embedded",value:`${(n==null?void 0:n.embeddedCount)??0}/${(n==null?void 0:n.totalCount)??0}`}),O.jsx(Tf,{label:"Missing",value:`${(n==null?void 0:n.missingCount)??0}`}),O.jsx(Tf,{label:"Queue",value:`${(n==null?void 0:n.pendingCount)??0}`})]}),O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 space-y-2",children:[O.jsxs("div",{className:"flex items-center justify-between gap-3",children:[O.jsxs("div",{children:[O.jsx("div",{className:"text-xs font-semibold text-ink",children:"Vector coverage"}),O.jsxs("div",{className:"text-xxs text-muted",children:[A,"% of task/note records have embeddings."]})]}),O.jsxs("button",{type:"button",className:"btn",disabled:!I||r.isPending,onClick:Q,title:n!=null&&n.effectiveEnabled?"Queue embeddings for all existing records without body_vec":"Enable embeddings before backfilling",children:[O.jsx(FT,{size:11})," ",r.isPending?"Queueing...":"Backfill all missing"]})]}),O.jsx("div",{className:"h-2 rounded bg-sidebar overflow-hidden border border-lineSoft",children:O.jsx("div",{className:"h-full bg-accent",style:{width:`${A}%`}})})]}),O.jsxs("form",{onSubmit:C,className:"border border-line rounded-md bg-surface px-4 py-4 space-y-4",children:[O.jsxs("label",{className:"flex items-center gap-2 text-sm text-ink",children:[O.jsx("input",{type:"checkbox",checked:i,onChange:T=>s(T.target.checked)}),"Enable semantic search"]}),O.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:[O.jsxs("label",{className:"space-y-1",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Provider"}),O.jsxs("select",{className:"input",value:l,onChange:T=>o(T.target.value),children:[O.jsx("option",{value:"openai",children:"OpenAI"}),O.jsx("option",{value:"openai_compatible",children:"OpenAI-compatible"})]})]}),O.jsxs("label",{className:"space-y-1",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Model"}),O.jsx("input",{className:"input font-mono",list:"embedding-models",value:u,onChange:T=>h(T.target.value),placeholder:"text-embedding-3-small"}),O.jsxs("datalist",{id:"embedding-models",children:[O.jsx("option",{value:"text-embedding-3-small"}),O.jsx("option",{value:"text-embedding-3-large"})]})]})]}),l==="openai_compatible"&&O.jsxs("label",{className:"space-y-1 block",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Base URL"}),O.jsx("input",{className:"input font-mono",value:f,onChange:T=>p(T.target.value),placeholder:"https://api.example.com/v1"})]}),O.jsxs("label",{className:"space-y-1 block",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"API key"}),O.jsx("input",{className:"input font-mono",type:"password",value:m,onChange:T=>{y(T.target.value),T.target.value&&b(!1)},placeholder:n!=null&&n.apiKeyConfigured?`Configured (${n.apiKeySource??"unknown"}${n.apiKeyPreview?` · ${n.apiKeyPreview}`:""})`:"sk-..."}),O.jsxs("div",{className:"flex items-center justify-between gap-3 text-xxs text-muted",children:[O.jsx("span",{children:"Full keys are stored server-side and are not returned to the browser after save."}),(n==null?void 0:n.settingsApiKeyConfigured)&&O.jsxs("label",{className:"inline-flex items-center gap-1.5",children:[O.jsx("input",{type:"checkbox",checked:k,onChange:T=>{b(T.target.checked),T.target.checked&&y("")}}),"Clear stored key"]})]})]}),O.jsxs("div",{className:"border border-lineSoft rounded-md bg-sidebar/30 px-3 py-2 text-xs text-muted leading-relaxed",children:["OpenAI-compatible providers must accept the OpenAI embeddings API and return"," ",O.jsx("code",{className:"text-ink",children:"384"})," dimensions for the selected model. Existing vectors are not automatically regenerated when provider or model changes; use Backfill all missing to queue every record that does not have a vector yet."]}),w&&O.jsx("div",{className:"text-xs text-accentText bg-accentSoft/50 border border-accent/20 rounded-md px-3 py-2",children:w}),t.error&&O.jsx("div",{className:"text-xs text-danger",children:t.error instanceof Error?t.error.message:String(t.error)}),r.error&&O.jsx("div",{className:"text-xs text-danger",children:r.error instanceof Error?r.error.message:String(r.error)}),O.jsx("div",{className:"flex justify-end",children:O.jsxs("button",{type:"submit",className:"btn btn-primary",disabled:t.isPending||u.trim().length===0,children:[O.jsx(Nc,{size:11})," ",t.isPending?"Saving...":"Save embedding settings"]})})]})]})}function Tf({label:n,value:e}){return O.jsxs("div",{className:"border border-line rounded-md bg-surface px-3 py-2",children:[O.jsx("div",{className:"text-xxs uppercase tracking-wider text-muted",children:n}),O.jsx("div",{className:"text-lg font-semibold text-ink mt-0.5",children:e})]})}function sU(n){return n==="openai_compatible"?"OpenAI-compatible":"OpenAI"}function zP(n){switch(n){case"ready":return"ready";case"disabled":return"disabled";case"missing_api_key":return"missing API key";case"missing_base_url":return"missing base URL";case"injected":return"using injected test embedder";case"not_loaded":return"configuration not loaded yet"}}function lU(){const n=`{
|
|
547
550
|
"mcpServers": {
|
|
548
551
|
"botnote": {
|
|
549
552
|
"command": "botnote",
|
package/web/dist/index.html
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-tCGCP7mO.js"></script>
|
|
12
12
|
<link rel="stylesheet" crossorigin href="/assets/index-DBDF6wZm.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|