botnote 0.1.1
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 +277 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +320 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +61 -0
- package/dist/cli.js.map +1 -0
- package/dist/db/client.d.ts +10 -0
- package/dist/db/client.js +16 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrate.d.ts +1 -0
- package/dist/db/migrate.js +57 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/0001_init.sql +89 -0
- package/dist/db/migrations/0002_tasks_due_at.sql +16 -0
- package/dist/db/migrations/0003_task_priority_and_sequence.sql +45 -0
- package/dist/db/migrations/0004_pinned.sql +8 -0
- package/dist/db/migrations/0005_nullable_title_and_parent.sql +5 -0
- package/dist/db/migrations/0006_project_color_icon.sql +3 -0
- package/dist/db/migrations/0007_tokens.sql +14 -0
- package/dist/db/migrations/0008_simplify_kinds_drop_actors.sql +21 -0
- package/dist/db/migrations/0009_sessions.sql +14 -0
- package/dist/db/migrations/0010_completed_at.sql +17 -0
- package/dist/db/migrations/0011_completed_at_backfill_fix.sql +14 -0
- package/dist/db/migrations/0012_completed_at_backfill_due.sql +16 -0
- package/dist/db/migrations/0013_due_at_noon_utc.sql +13 -0
- package/dist/db/schema.d.ts +811 -0
- package/dist/db/schema.js +112 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/mcp/http-client.d.ts +154 -0
- package/dist/mcp/http-client.js +113 -0
- package/dist/mcp/http-client.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +492 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/rest/routes.d.ts +3 -0
- package/dist/rest/routes.js +320 -0
- package/dist/rest/routes.js.map +1 -0
- package/dist/rest/server.d.ts +12 -0
- package/dist/rest/server.js +282 -0
- package/dist/rest/server.js.map +1 -0
- package/dist/service/embedding.d.ts +25 -0
- package/dist/service/embedding.js +112 -0
- package/dist/service/embedding.js.map +1 -0
- package/dist/service/entities.d.ts +22 -0
- package/dist/service/entities.js +174 -0
- package/dist/service/entities.js.map +1 -0
- package/dist/service/index.d.ts +8 -0
- package/dist/service/index.js +8 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/opening_brief.d.ts +14 -0
- package/dist/service/opening_brief.js +104 -0
- package/dist/service/opening_brief.js.map +1 -0
- package/dist/service/projects.d.ts +8 -0
- package/dist/service/projects.js +36 -0
- package/dist/service/projects.js.map +1 -0
- package/dist/service/search.d.ts +15 -0
- package/dist/service/search.js +101 -0
- package/dist/service/search.js.map +1 -0
- package/dist/service/sessions.d.ts +25 -0
- package/dist/service/sessions.js +89 -0
- package/dist/service/sessions.js.map +1 -0
- package/dist/service/tasks.d.ts +23 -0
- package/dist/service/tasks.js +130 -0
- package/dist/service/tasks.js.map +1 -0
- package/dist/service/tokens.d.ts +18 -0
- package/dist/service/tokens.js +41 -0
- package/dist/service/tokens.js.map +1 -0
- package/dist/service/types.d.ts +294 -0
- package/dist/service/types.js +132 -0
- package/dist/service/types.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/package.json +73 -0
- package/web/dist/assets/index-Bddg7h_x.css +1 -0
- package/web/dist/assets/index-DYW6stVx.js +542 -0
- package/web/dist/favicon.svg +13 -0
- package/web/dist/index.html +17 -0
package/README.md
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# botnote
|
|
2
|
+
|
|
3
|
+
Notion for bots. A single binary that stores projects, tasks, notes, decisions, and memory — and exposes them to AI agents via MCP and REST.
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
|
|
7
|
+
Agents work best with one stable, queryable, write-friendly source of truth — not a stack of Notion + Jira + Slack + scratch files. botnote is that source of truth, scoped to one user, deployable in 60 seconds.
|
|
8
|
+
|
|
9
|
+
Three things only:
|
|
10
|
+
|
|
11
|
+
1. **Project management** — projects, tasks, decisions, comments.
|
|
12
|
+
2. **Note-taking** — free-form Markdown notes, tagged, searchable.
|
|
13
|
+
3. **Memory for agents** — hybrid retrieval (BM25 + vector + time decay), opening brief auto-bundles AGENTS.md + recent context.
|
|
14
|
+
|
|
15
|
+
## Design
|
|
16
|
+
|
|
17
|
+
- Storage: Postgres 16 + pgvector + tsvector. Single dedicated docker container.
|
|
18
|
+
- Single multi-kind entity table — `task / note / decision / doc / comment / log / memory` discriminated by `kind` column.
|
|
19
|
+
- Search: hybrid retrieval — tsvector BM25 + pgvector cosine + time decay, merged via Reciprocal Rank Fusion (k=60).
|
|
20
|
+
- Embeddings: OpenAI `text-embedding-3-small` at 384 dimensions, written asynchronously. Falls back to BM25-only if no API key.
|
|
21
|
+
- API: MCP server (stdio) + REST API (Fastify on `:4280`) over a shared service layer.
|
|
22
|
+
- Every write requires `actor` (human / agent / system); `idempotency_key` is supported on every write.
|
|
23
|
+
- All MCP tools carry `2025-03-26` annotations: `readOnlyHint`, `idempotentHint`, `destructiveHint`, `openWorldHint`.
|
|
24
|
+
|
|
25
|
+
## Quick start
|
|
26
|
+
|
|
27
|
+
Requires: Node 20+, pnpm, Docker.
|
|
28
|
+
|
|
29
|
+
### CLI install
|
|
30
|
+
|
|
31
|
+
On client machines, install the portable CLI from npm:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm i -g botnote
|
|
35
|
+
botnote login
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`botnote login` stores the daemon URL and bearer token in
|
|
39
|
+
`~/.config/botnote/config.json`. Use `https://botnote.net` plus a token from
|
|
40
|
+
Settings -> API tokens on remote machines; use `http://127.0.0.1:4280` without
|
|
41
|
+
a token on the daemon host.
|
|
42
|
+
|
|
43
|
+
The Claude Code and Codex plugins call `botnote mcp`, so installing the npm
|
|
44
|
+
package is enough for plugin runtime on machines that do not have a botnote
|
|
45
|
+
source checkout.
|
|
46
|
+
|
|
47
|
+
### Local daemon development
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 1. Spin up postgres (port 55434, pgvector extension)
|
|
51
|
+
docker compose up -d
|
|
52
|
+
|
|
53
|
+
# 2. Install deps
|
|
54
|
+
pnpm install
|
|
55
|
+
|
|
56
|
+
# 3. Apply schema
|
|
57
|
+
DATABASE_URL=postgres://botnote:botnote@127.0.0.1:55434/botnote pnpm db:migrate
|
|
58
|
+
|
|
59
|
+
# 4. Boot REST + Swagger UI
|
|
60
|
+
DATABASE_URL=postgres://botnote:botnote@127.0.0.1:55434/botnote pnpm dev
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Then:
|
|
64
|
+
|
|
65
|
+
- REST API: <http://localhost:4280>
|
|
66
|
+
- Swagger UI: <http://localhost:4280/docs>
|
|
67
|
+
- OpenAPI JSON: <http://localhost:4280/docs/json>
|
|
68
|
+
|
|
69
|
+
Embeddings are optional. Set `OPENAI_API_KEY` to enable hybrid (BM25 + cosine) search; without it, search is BM25-only.
|
|
70
|
+
|
|
71
|
+
## REST endpoints
|
|
72
|
+
|
|
73
|
+
| method | path | summary |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `POST` | `/v1/projects` | Create project |
|
|
76
|
+
| `GET` | `/v1/projects` | List projects |
|
|
77
|
+
| `GET` | `/v1/projects/:id` | Fetch project |
|
|
78
|
+
| `GET` | `/v1/projects/by-key/:key` | Fetch by key |
|
|
79
|
+
| `GET` | `/v1/projects/:id/agents-md` | Read AGENTS.md |
|
|
80
|
+
| `PUT` | `/v1/projects/:id/agents-md` | Write AGENTS.md |
|
|
81
|
+
| `POST` | `/v1/projects/:id/opening-brief` | Opening brief |
|
|
82
|
+
| `POST` | `/v1/entities` | Write entity |
|
|
83
|
+
| `GET` | `/v1/entities/:id` | Fetch entity |
|
|
84
|
+
| `PATCH` | `/v1/entities/:id` | Update entity |
|
|
85
|
+
| `POST` | `/v1/entities/:id/links` | Link entity to another |
|
|
86
|
+
| `POST` | `/v1/recent` | Recent activity |
|
|
87
|
+
| `POST` | `/v1/search` | Hybrid search |
|
|
88
|
+
| `POST` | `/v1/actors` | Get/create actor |
|
|
89
|
+
| `GET` | `/health` | Health check |
|
|
90
|
+
|
|
91
|
+
Schemas: see `/docs` (Swagger UI) or `/docs/json` (OpenAPI 3).
|
|
92
|
+
|
|
93
|
+
### Example: create a project + write a task + search
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
A=http://localhost:4280
|
|
97
|
+
|
|
98
|
+
PID=$(curl -s -X POST $A/v1/projects \
|
|
99
|
+
-H 'content-type: application/json' \
|
|
100
|
+
-d '{"key":"DEMO","name":"Demo","agentsMd":"ALWAYS run tests"}' \
|
|
101
|
+
| jq -r .id)
|
|
102
|
+
|
|
103
|
+
curl -s -X POST $A/v1/entities \
|
|
104
|
+
-H 'content-type: application/json' \
|
|
105
|
+
-d "{\"kind\":\"task\",\"projectId\":\"$PID\",\"title\":\"Ship botnote v1\",\"actorKind\":\"human\"}"
|
|
106
|
+
|
|
107
|
+
curl -s -X POST $A/v1/search \
|
|
108
|
+
-H 'content-type: application/json' \
|
|
109
|
+
-d "{\"query\":\"ship\",\"projectId\":\"$PID\"}"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Plugin
|
|
113
|
+
|
|
114
|
+
The plugin bundles the MCP server, workflow skills/commands, and a curator
|
|
115
|
+
subagent. All workflows route through MCP — no extra direct Letheia or Plane
|
|
116
|
+
MCP installs are required.
|
|
117
|
+
|
|
118
|
+
### Claude Code
|
|
119
|
+
|
|
120
|
+
```text
|
|
121
|
+
# In Claude Code
|
|
122
|
+
/plugin marketplace add jianhuawang/botnote
|
|
123
|
+
/plugin install botnote@botnote
|
|
124
|
+
|
|
125
|
+
# Claude Code will prompt for:
|
|
126
|
+
# botnote_url -> default http://127.0.0.1:4280 on daemon host
|
|
127
|
+
# or https://botnote.net on remote machines
|
|
128
|
+
# botnote_token -> bearer from Settings -> API tokens; skip on loopback
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Slash commands:
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
/botnote:today # today + overdue
|
|
135
|
+
/botnote:remember "..." # capture a note via MCP
|
|
136
|
+
/botnote:recall "..." # hybrid search
|
|
137
|
+
/botnote:start-work BOT # pickup workflow on a project
|
|
138
|
+
/botnote:done # mark current focus done
|
|
139
|
+
/botnote:add-task "..." # capture a task without starting it
|
|
140
|
+
/botnote:show-todo # workspace task/context summary
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Plugin distribution lives at
|
|
144
|
+
[jianhuawang/botnote](https://github.com/jianhuawang/botnote). The MCP server
|
|
145
|
+
inside the plugin uses the URL + token from the install prompt and calls the
|
|
146
|
+
`botnote` CLI from PATH. Install the npm package first on non-dev machines.
|
|
147
|
+
|
|
148
|
+
### Codex
|
|
149
|
+
|
|
150
|
+
Add the plugin through `/settings -> plugin` in Codex, or add this marketplace
|
|
151
|
+
from Git without a full source checkout:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
codex plugin marketplace add git@github.com:Jianhua-Wang/botnote.git \
|
|
155
|
+
--sparse .agents/plugins \
|
|
156
|
+
--sparse plugins/botnote
|
|
157
|
+
|
|
158
|
+
codex plugin add botnote@botnote-plugins
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
For local plugin development, add this marketplace entry to
|
|
162
|
+
`.agents/plugins/marketplace.json` in the repo:
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"name": "botnote-plugins",
|
|
167
|
+
"interface": { "displayName": "botnote Plugins" },
|
|
168
|
+
"plugins": [
|
|
169
|
+
{
|
|
170
|
+
"name": "botnote",
|
|
171
|
+
"source": { "source": "local", "path": "./plugins/botnote" },
|
|
172
|
+
"policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" },
|
|
173
|
+
"category": "Productivity"
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Then install/enable from the Codex plugin UI, or use:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
codex plugin marketplace add .
|
|
183
|
+
codex plugin add botnote@botnote-plugins
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
For synced Codex settings, include this in `~/.codex/config.toml` or the
|
|
187
|
+
rendered config template:
|
|
188
|
+
|
|
189
|
+
```toml
|
|
190
|
+
[plugins."botnote@botnote-plugins"]
|
|
191
|
+
enabled = true
|
|
192
|
+
|
|
193
|
+
[marketplaces.botnote-plugins]
|
|
194
|
+
source_type = "local"
|
|
195
|
+
source = "/absolute/path/to/botnote"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
The Codex plugin starts `./scripts/run-mcp.sh`. It defaults to
|
|
199
|
+
`BOTNOTE_URL=http://127.0.0.1:4280`, calls `botnote mcp` from PATH, and falls
|
|
200
|
+
back to `npx -y botnote mcp`. Set `BOTNOTE_URL` and `BOTNOTE_TOKEN` only when
|
|
201
|
+
using a remote daemon.
|
|
202
|
+
|
|
203
|
+
## MCP tools
|
|
204
|
+
|
|
205
|
+
botnote exposes the following tools + resources over stdio.
|
|
206
|
+
|
|
207
|
+
### Tools
|
|
208
|
+
|
|
209
|
+
| tool | annotations | what it does |
|
|
210
|
+
|---|---|---|
|
|
211
|
+
| `opening_brief` | `readOnly` | Project context bundle (AGENTS.md + open tasks + decisions + recent) |
|
|
212
|
+
| `search` | `readOnly` | Hybrid retrieval over entities |
|
|
213
|
+
| `get` | `readOnly` | Fetch one entity by id |
|
|
214
|
+
| `write` | `idempotent` | Create entity (task/note/decision/...) |
|
|
215
|
+
| `update` | `destructive` | Mutate entity fields |
|
|
216
|
+
| `link` | `idempotent` | Create typed edge between entities |
|
|
217
|
+
| `recent` | `readOnly` | Recent activity, filterable |
|
|
218
|
+
| `agents_md` | `readOnly` | Read project AGENTS.md |
|
|
219
|
+
| `create_project` | — | Create a project |
|
|
220
|
+
| `set_agents_md` | `destructive idempotent` | Overwrite project AGENTS.md |
|
|
221
|
+
| `ensure_actor` | `idempotent` | Get/create actor identity |
|
|
222
|
+
|
|
223
|
+
### Resource
|
|
224
|
+
|
|
225
|
+
- `botnote://workspace` — workspace overview: project index + most recent activity (text/markdown).
|
|
226
|
+
|
|
227
|
+
### Direct MCP fallback
|
|
228
|
+
|
|
229
|
+
Plugin install is preferred. For a raw MCP client, build/install the CLI and
|
|
230
|
+
run:
|
|
231
|
+
|
|
232
|
+
```json
|
|
233
|
+
{
|
|
234
|
+
"mcpServers": {
|
|
235
|
+
"botnote": {
|
|
236
|
+
"command": "botnote",
|
|
237
|
+
"args": ["mcp"],
|
|
238
|
+
"env": {
|
|
239
|
+
"BOTNOTE_URL": "http://127.0.0.1:4280"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Per-project AGENTS.md
|
|
247
|
+
|
|
248
|
+
The whole point of botnote's `agents_md` field is to push project-level conventions into agents' working context without per-session prompt engineering.
|
|
249
|
+
|
|
250
|
+
Recommended structure (< 200 lines, imperative tone):
|
|
251
|
+
|
|
252
|
+
```markdown
|
|
253
|
+
## Critical
|
|
254
|
+
- NEVER commit .env or credentials.
|
|
255
|
+
- ALWAYS run `pnpm typecheck` before commit.
|
|
256
|
+
|
|
257
|
+
## Stack
|
|
258
|
+
- Node 20 + TypeScript ESM, pnpm.
|
|
259
|
+
- Postgres + drizzle ORM.
|
|
260
|
+
|
|
261
|
+
## Layout
|
|
262
|
+
- src/db/, src/service/, src/rest/, src/mcp/
|
|
263
|
+
|
|
264
|
+
## Rules
|
|
265
|
+
- Idempotent writes via `idempotency_key`.
|
|
266
|
+
- No console.log outside cli.ts.
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Each MCP tool call inside a project should be preceded by `opening_brief({ projectId })` so the agent has AGENTS.md + recent context loaded.
|
|
270
|
+
|
|
271
|
+
## Status
|
|
272
|
+
|
|
273
|
+
v0 / M1 — complete. See `AGENTS.md` for codebase conventions and the `BOT` project in botnote for ongoing work.
|
|
274
|
+
|
|
275
|
+
## License
|
|
276
|
+
|
|
277
|
+
Private.
|
package/dist/bin.d.ts
ADDED
package/dist/bin.js
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import readline from "node:readline/promises";
|
|
6
|
+
import { VERSION } from "./version.js";
|
|
7
|
+
// Public botnote.net is the right default for fresh remote installs (the most
|
|
8
|
+
// common npm-install case). On the daemon host itself, `botnote login` writes
|
|
9
|
+
// a config that pins http://127.0.0.1:4280 so loopback stays loopback.
|
|
10
|
+
const DEFAULT_BASE_URL = "https://botnote.net";
|
|
11
|
+
function configDir() {
|
|
12
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
13
|
+
const xdg = process.env.XDG_CONFIG_HOME;
|
|
14
|
+
return xdg ? path.join(xdg, "botnote") : path.join(home, ".config", "botnote");
|
|
15
|
+
}
|
|
16
|
+
function configPath() {
|
|
17
|
+
return path.join(configDir(), "config.json");
|
|
18
|
+
}
|
|
19
|
+
function readConfig() {
|
|
20
|
+
const p = configPath();
|
|
21
|
+
if (!existsSync(p)) {
|
|
22
|
+
return { baseUrl: process.env.BOTNOTE_URL ?? DEFAULT_BASE_URL };
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const raw = JSON.parse(readFileSync(p, "utf8"));
|
|
26
|
+
return {
|
|
27
|
+
baseUrl: raw.baseUrl ?? process.env.BOTNOTE_URL ?? DEFAULT_BASE_URL,
|
|
28
|
+
token: raw.token
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return { baseUrl: process.env.BOTNOTE_URL ?? DEFAULT_BASE_URL };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function writeConfig(cfg) {
|
|
36
|
+
const dir = configDir();
|
|
37
|
+
mkdirSync(dir, { recursive: true });
|
|
38
|
+
writeFileSync(configPath(), JSON.stringify(cfg, null, 2), { mode: 0o600 });
|
|
39
|
+
}
|
|
40
|
+
async function callApi(method, path, body, opts = {}) {
|
|
41
|
+
const cfg = readConfig();
|
|
42
|
+
const headers = { "content-type": "application/json" };
|
|
43
|
+
if (cfg.token)
|
|
44
|
+
headers.authorization = `Bearer ${cfg.token}`;
|
|
45
|
+
const res = await fetch(`${cfg.baseUrl}${path}`, {
|
|
46
|
+
method,
|
|
47
|
+
headers,
|
|
48
|
+
body: body ? JSON.stringify(body) : undefined
|
|
49
|
+
});
|
|
50
|
+
if (res.status === 401 && !opts.allowNoAuth) {
|
|
51
|
+
console.error("401 unauthorized — run `botnote login` and paste a token from Settings → API tokens.");
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
if (!res.ok) {
|
|
55
|
+
const text = await res.text();
|
|
56
|
+
throw new Error(`${method} ${path} -> ${res.status}: ${text}`);
|
|
57
|
+
}
|
|
58
|
+
if (res.status === 204)
|
|
59
|
+
return undefined;
|
|
60
|
+
return (await res.json());
|
|
61
|
+
}
|
|
62
|
+
function usage() {
|
|
63
|
+
return `botnote ${VERSION}
|
|
64
|
+
|
|
65
|
+
Usage:
|
|
66
|
+
botnote login Save a token to ~/.config/botnote/config.json
|
|
67
|
+
botnote logout Wipe the saved token
|
|
68
|
+
botnote whoami Show config status
|
|
69
|
+
|
|
70
|
+
botnote serve Run the REST + web daemon (same as: node dist/cli.js)
|
|
71
|
+
botnote mcp Run the MCP stdio server (for plugin/agent integration)
|
|
72
|
+
|
|
73
|
+
botnote projects List projects
|
|
74
|
+
botnote today Show today + overdue tasks
|
|
75
|
+
botnote tasks [--status open] List tasks
|
|
76
|
+
botnote task "<title>" [--project KEY] [--due YYYY-MM-DD] [--priority P]
|
|
77
|
+
Create a task
|
|
78
|
+
botnote note "<body>" [--project KEY] [--pin]
|
|
79
|
+
Create a note (no title)
|
|
80
|
+
botnote search "<query>" [--limit 10] Hybrid search
|
|
81
|
+
|
|
82
|
+
Env:
|
|
83
|
+
BOTNOTE_URL override the server base URL (default ${DEFAULT_BASE_URL})
|
|
84
|
+
|
|
85
|
+
Config: ${configPath()}
|
|
86
|
+
`;
|
|
87
|
+
}
|
|
88
|
+
function parseArgs(argv) {
|
|
89
|
+
const positional = [];
|
|
90
|
+
const flags = {};
|
|
91
|
+
for (let i = 0; i < argv.length; i++) {
|
|
92
|
+
const a = argv[i];
|
|
93
|
+
if (a.startsWith("--")) {
|
|
94
|
+
const key = a.slice(2);
|
|
95
|
+
const next = argv[i + 1];
|
|
96
|
+
if (next && !next.startsWith("--")) {
|
|
97
|
+
flags[key] = next;
|
|
98
|
+
i++;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
flags[key] = true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
positional.push(a);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { positional, flags };
|
|
109
|
+
}
|
|
110
|
+
// ----- subcommands -----
|
|
111
|
+
async function cmdLogin() {
|
|
112
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
113
|
+
const baseUrl = (await rl.question(`Base URL [${DEFAULT_BASE_URL}]: `)).trim() || DEFAULT_BASE_URL;
|
|
114
|
+
const token = (await rl.question("Token (bn_...): ")).trim();
|
|
115
|
+
rl.close();
|
|
116
|
+
if (!token.startsWith("bn_")) {
|
|
117
|
+
console.error("token should start with 'bn_'. Aborting.");
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
writeConfig({ baseUrl, token });
|
|
121
|
+
console.log(`saved to ${configPath()}`);
|
|
122
|
+
}
|
|
123
|
+
function cmdLogout() {
|
|
124
|
+
const p = configPath();
|
|
125
|
+
if (existsSync(p)) {
|
|
126
|
+
rmSync(p);
|
|
127
|
+
console.log(`removed ${p}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log("no config to remove");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function cmdWhoami() {
|
|
134
|
+
const cfg = readConfig();
|
|
135
|
+
console.log(`baseUrl: ${cfg.baseUrl}`);
|
|
136
|
+
console.log(`token: ${cfg.token ? `${cfg.token.slice(0, 11)}…` : "(none)"}`);
|
|
137
|
+
console.log(`config: ${configPath()}`);
|
|
138
|
+
}
|
|
139
|
+
function displayTitle(e) {
|
|
140
|
+
if (e.title && e.title.trim())
|
|
141
|
+
return e.title;
|
|
142
|
+
const first = e.body.split("\n").find((l) => l.trim())?.trim() ?? "";
|
|
143
|
+
return first ? (first.length > 60 ? `${first.slice(0, 60)}…` : first) : "(untitled)";
|
|
144
|
+
}
|
|
145
|
+
async function cmdProjects() {
|
|
146
|
+
const projects = await callApi("GET", "/v1/projects");
|
|
147
|
+
for (const p of projects) {
|
|
148
|
+
console.log(`${p.key.padEnd(10)} ${p.name}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function cmdToday() {
|
|
152
|
+
const projects = await callApi("GET", "/v1/projects");
|
|
153
|
+
const projectByKey = new Map(projects.map((p) => [p.id, p]));
|
|
154
|
+
const today = new Date();
|
|
155
|
+
const from = new Date(today);
|
|
156
|
+
from.setHours(0, 0, 0, 0);
|
|
157
|
+
const to = new Date(today);
|
|
158
|
+
to.setHours(23, 59, 59, 999);
|
|
159
|
+
const data = await callApi("POST", "/v1/tasks/range", {
|
|
160
|
+
from: from.toISOString(),
|
|
161
|
+
to: to.toISOString(),
|
|
162
|
+
includeBacklog: false,
|
|
163
|
+
includeDone: false
|
|
164
|
+
});
|
|
165
|
+
printSection("Overdue", data.overdue, projectByKey);
|
|
166
|
+
printSection("Today", data.scheduled, projectByKey);
|
|
167
|
+
}
|
|
168
|
+
function printSection(title, tasks, pm) {
|
|
169
|
+
console.log(`\n## ${title} (${tasks.length})`);
|
|
170
|
+
if (tasks.length === 0) {
|
|
171
|
+
console.log(" —");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
for (const t of tasks) {
|
|
175
|
+
const p = t.projectId ? pm.get(t.projectId) : undefined;
|
|
176
|
+
const id = p && t.sequenceId ? `${p.key}-${t.sequenceId}` : t.id.slice(0, 8);
|
|
177
|
+
const due = t.dueAt ? `(due ${t.dueAt.slice(0, 10)}) ` : "";
|
|
178
|
+
const prio = t.priority !== "none" ? `[${t.priority}] ` : "";
|
|
179
|
+
console.log(` [${t.status}] ${id.padEnd(10)} ${prio}${due}${displayTitle(t)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function cmdTasks(args) {
|
|
183
|
+
const projects = await callApi("GET", "/v1/projects");
|
|
184
|
+
const pm = new Map(projects.map((p) => [p.id, p]));
|
|
185
|
+
const status = args.flags.status ?? null;
|
|
186
|
+
const rows = await callApi("POST", "/v1/recent", {
|
|
187
|
+
kinds: ["task"],
|
|
188
|
+
limit: 100
|
|
189
|
+
});
|
|
190
|
+
const filtered = status ? rows.filter((r) => r.status === status) : rows;
|
|
191
|
+
for (const t of filtered) {
|
|
192
|
+
const p = t.projectId ? pm.get(t.projectId) : undefined;
|
|
193
|
+
const id = p && t.sequenceId ? `${p.key}-${t.sequenceId}` : t.id.slice(0, 8);
|
|
194
|
+
const due = t.dueAt ? ` (due ${t.dueAt.slice(0, 10)})` : "";
|
|
195
|
+
console.log(`[${t.status.padEnd(11)}] ${id.padEnd(10)} ${displayTitle(t)}${due}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async function resolveProjectId(keyOrId) {
|
|
199
|
+
if (!keyOrId) {
|
|
200
|
+
const env = process.env.BOTNOTE_PROJECT;
|
|
201
|
+
if (env)
|
|
202
|
+
return resolveProjectId(env);
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
if (/^[0-9a-f-]{36}$/i.test(keyOrId))
|
|
206
|
+
return keyOrId;
|
|
207
|
+
const projects = await callApi("GET", "/v1/projects");
|
|
208
|
+
const hit = projects.find((p) => p.key.toUpperCase() === keyOrId.toUpperCase());
|
|
209
|
+
if (!hit)
|
|
210
|
+
throw new Error(`project not found: ${keyOrId}`);
|
|
211
|
+
return hit.id;
|
|
212
|
+
}
|
|
213
|
+
async function cmdTask(args) {
|
|
214
|
+
const title = args.positional.join(" ").trim();
|
|
215
|
+
if (!title) {
|
|
216
|
+
console.error('usage: botnote task "<title>" [--project KEY] [--due YYYY-MM-DD] [--priority P]');
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
const projectId = await resolveProjectId(args.flags.project);
|
|
220
|
+
const dueAt = args.flags.due
|
|
221
|
+
? new Date(`${args.flags.due}T12:00:00Z`).toISOString()
|
|
222
|
+
: null;
|
|
223
|
+
const priority = args.flags.priority ?? "none";
|
|
224
|
+
const entity = await callApi("POST", "/v1/tasks", {
|
|
225
|
+
projectId: projectId ?? null,
|
|
226
|
+
title,
|
|
227
|
+
actorKind: "human",
|
|
228
|
+
dueAt,
|
|
229
|
+
priority
|
|
230
|
+
});
|
|
231
|
+
console.log(`✓ wrote task ${entity.id}`);
|
|
232
|
+
}
|
|
233
|
+
async function cmdNote(args) {
|
|
234
|
+
const body = args.positional.join(" ").trim();
|
|
235
|
+
if (!body) {
|
|
236
|
+
console.error('usage: botnote note "<body>" [--project KEY] [--pin]');
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
const projectId = await resolveProjectId(args.flags.project);
|
|
240
|
+
const entity = await callApi("POST", "/v1/notes", {
|
|
241
|
+
projectId: projectId ?? null,
|
|
242
|
+
body,
|
|
243
|
+
actorKind: "human",
|
|
244
|
+
pinned: Boolean(args.flags.pin)
|
|
245
|
+
});
|
|
246
|
+
console.log(`✓ wrote note ${entity.id}`);
|
|
247
|
+
}
|
|
248
|
+
async function cmdSearch(args) {
|
|
249
|
+
const query = args.positional.join(" ").trim();
|
|
250
|
+
if (!query) {
|
|
251
|
+
console.error('usage: botnote search "<query>" [--limit N]');
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
const limit = Number(args.flags.limit ?? 10);
|
|
255
|
+
const data = await callApi("POST", "/v1/search", { query, limit });
|
|
256
|
+
console.log(`${data.hits.length} hit(s) · embedding=${data.embeddingUsed ? "on" : "off"}\n`);
|
|
257
|
+
for (const h of data.hits) {
|
|
258
|
+
console.log(`[${h.score.toFixed(3)}] ${h.entity.kind.padEnd(7)} ${displayTitle(h.entity)}`);
|
|
259
|
+
if (h.entity.body) {
|
|
260
|
+
console.log(` ${h.entity.body.slice(0, 100).replace(/\n/g, " ")}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function cmdServe() {
|
|
265
|
+
// Re-exec into the existing daemon entry. dist/cli.js is sibling of dist/bin.js.
|
|
266
|
+
const cli = path.resolve(path.dirname(new URL(import.meta.url).pathname), "cli.js");
|
|
267
|
+
execFileSync(process.execPath, [cli], { stdio: "inherit" });
|
|
268
|
+
}
|
|
269
|
+
function cmdMcp() {
|
|
270
|
+
const cli = path.resolve(path.dirname(new URL(import.meta.url).pathname), "cli.js");
|
|
271
|
+
execFileSync(process.execPath, [cli, "mcp"], { stdio: "inherit" });
|
|
272
|
+
}
|
|
273
|
+
async function main() {
|
|
274
|
+
const [, , subcommand, ...rest] = process.argv;
|
|
275
|
+
const args = parseArgs(rest);
|
|
276
|
+
switch (subcommand) {
|
|
277
|
+
case undefined:
|
|
278
|
+
case "help":
|
|
279
|
+
case "-h":
|
|
280
|
+
case "--help":
|
|
281
|
+
process.stdout.write(usage());
|
|
282
|
+
return;
|
|
283
|
+
case "version":
|
|
284
|
+
case "-v":
|
|
285
|
+
case "--version":
|
|
286
|
+
console.log(VERSION);
|
|
287
|
+
return;
|
|
288
|
+
case "login":
|
|
289
|
+
return cmdLogin();
|
|
290
|
+
case "logout":
|
|
291
|
+
return cmdLogout();
|
|
292
|
+
case "whoami":
|
|
293
|
+
return cmdWhoami();
|
|
294
|
+
case "serve":
|
|
295
|
+
return cmdServe();
|
|
296
|
+
case "mcp":
|
|
297
|
+
return cmdMcp();
|
|
298
|
+
case "projects":
|
|
299
|
+
return cmdProjects();
|
|
300
|
+
case "today":
|
|
301
|
+
return cmdToday();
|
|
302
|
+
case "tasks":
|
|
303
|
+
return cmdTasks(args);
|
|
304
|
+
case "task":
|
|
305
|
+
return cmdTask(args);
|
|
306
|
+
case "note":
|
|
307
|
+
return cmdNote(args);
|
|
308
|
+
case "search":
|
|
309
|
+
return cmdSearch(args);
|
|
310
|
+
default:
|
|
311
|
+
console.error(`unknown subcommand: ${subcommand}\n`);
|
|
312
|
+
process.stdout.write(usage());
|
|
313
|
+
process.exit(2);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
main().catch((err) => {
|
|
317
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
318
|
+
process.exit(1);
|
|
319
|
+
});
|
|
320
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|