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.
Files changed (79) hide show
  1. package/README.md +277 -0
  2. package/dist/bin.d.ts +2 -0
  3. package/dist/bin.js +320 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.js +61 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/db/client.d.ts +10 -0
  9. package/dist/db/client.js +16 -0
  10. package/dist/db/client.js.map +1 -0
  11. package/dist/db/migrate.d.ts +1 -0
  12. package/dist/db/migrate.js +57 -0
  13. package/dist/db/migrate.js.map +1 -0
  14. package/dist/db/migrations/0001_init.sql +89 -0
  15. package/dist/db/migrations/0002_tasks_due_at.sql +16 -0
  16. package/dist/db/migrations/0003_task_priority_and_sequence.sql +45 -0
  17. package/dist/db/migrations/0004_pinned.sql +8 -0
  18. package/dist/db/migrations/0005_nullable_title_and_parent.sql +5 -0
  19. package/dist/db/migrations/0006_project_color_icon.sql +3 -0
  20. package/dist/db/migrations/0007_tokens.sql +14 -0
  21. package/dist/db/migrations/0008_simplify_kinds_drop_actors.sql +21 -0
  22. package/dist/db/migrations/0009_sessions.sql +14 -0
  23. package/dist/db/migrations/0010_completed_at.sql +17 -0
  24. package/dist/db/migrations/0011_completed_at_backfill_fix.sql +14 -0
  25. package/dist/db/migrations/0012_completed_at_backfill_due.sql +16 -0
  26. package/dist/db/migrations/0013_due_at_noon_utc.sql +13 -0
  27. package/dist/db/schema.d.ts +811 -0
  28. package/dist/db/schema.js +112 -0
  29. package/dist/db/schema.js.map +1 -0
  30. package/dist/mcp/http-client.d.ts +154 -0
  31. package/dist/mcp/http-client.js +113 -0
  32. package/dist/mcp/http-client.js.map +1 -0
  33. package/dist/mcp/server.d.ts +7 -0
  34. package/dist/mcp/server.js +492 -0
  35. package/dist/mcp/server.js.map +1 -0
  36. package/dist/rest/routes.d.ts +3 -0
  37. package/dist/rest/routes.js +320 -0
  38. package/dist/rest/routes.js.map +1 -0
  39. package/dist/rest/server.d.ts +12 -0
  40. package/dist/rest/server.js +282 -0
  41. package/dist/rest/server.js.map +1 -0
  42. package/dist/service/embedding.d.ts +25 -0
  43. package/dist/service/embedding.js +112 -0
  44. package/dist/service/embedding.js.map +1 -0
  45. package/dist/service/entities.d.ts +22 -0
  46. package/dist/service/entities.js +174 -0
  47. package/dist/service/entities.js.map +1 -0
  48. package/dist/service/index.d.ts +8 -0
  49. package/dist/service/index.js +8 -0
  50. package/dist/service/index.js.map +1 -0
  51. package/dist/service/opening_brief.d.ts +14 -0
  52. package/dist/service/opening_brief.js +104 -0
  53. package/dist/service/opening_brief.js.map +1 -0
  54. package/dist/service/projects.d.ts +8 -0
  55. package/dist/service/projects.js +36 -0
  56. package/dist/service/projects.js.map +1 -0
  57. package/dist/service/search.d.ts +15 -0
  58. package/dist/service/search.js +101 -0
  59. package/dist/service/search.js.map +1 -0
  60. package/dist/service/sessions.d.ts +25 -0
  61. package/dist/service/sessions.js +89 -0
  62. package/dist/service/sessions.js.map +1 -0
  63. package/dist/service/tasks.d.ts +23 -0
  64. package/dist/service/tasks.js +130 -0
  65. package/dist/service/tasks.js.map +1 -0
  66. package/dist/service/tokens.d.ts +18 -0
  67. package/dist/service/tokens.js +41 -0
  68. package/dist/service/tokens.js.map +1 -0
  69. package/dist/service/types.d.ts +294 -0
  70. package/dist/service/types.js +132 -0
  71. package/dist/service/types.js.map +1 -0
  72. package/dist/version.d.ts +1 -0
  73. package/dist/version.js +13 -0
  74. package/dist/version.js.map +1 -0
  75. package/package.json +73 -0
  76. package/web/dist/assets/index-Bddg7h_x.css +1 -0
  77. package/web/dist/assets/index-DYW6stVx.js +542 -0
  78. package/web/dist/favicon.svg +13 -0
  79. 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
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,8EAA8E;AAC9E,8EAA8E;AAC9E,uEAAuE;AACvE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAO/C,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAA2B,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,gBAAgB;YACnE,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAkB;IACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,OAAkC,EAAE;IAEpC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,GAAG,CAAC,KAAK,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;QAC/C,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,CACX,sFAAsF,CACvF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,SAAc,CAAC;IAC9C,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;AACjC,CAAC;AAED,SAAS,KAAK;IACZ,OAAO,WAAW,OAAO;;;;;;;;;;;;;;;;;;;;wDAoB6B,gBAAgB;;UAE9D,UAAU,EAAE;CACrB,CAAC;AACF,CAAC;AAOD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAkC,EAAE,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAClB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,0BAA0B;AAE1B,KAAK,UAAU,QAAQ;IACrB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,gBAAgB,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC;IACnG,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,MAAM,CAAC,CAAC,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AA6BD,SAAS,YAAY,CAAC,CAAyC;IAC7D,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AACvF,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAY,KAAK,EAAE,cAAc,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAY,KAAK,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAmB,MAAM,EAAE,iBAAiB,EAAE;QACtE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;QACxB,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE;QACpB,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IACH,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACpD,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,KAAe,EAAE,EAAwB;IAC5E,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxD,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAU;IAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAY,KAAK,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAI,IAAI,CAAC,KAAK,CAAC,MAA6B,IAAI,IAAI,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAW,MAAM,EAAE,YAAY,EAAE;QACzD,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxD,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAgB;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QACxC,IAAI,GAAG;YAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAY,KAAK,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAU;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,OAA6B,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG;QAC1B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAa,YAAY,CAAC,CAAC,WAAW,EAAE;QACjE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,QAA+B,IAAI,MAAM,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAS,MAAM,EAAE,WAAW,EAAE;QACxD,SAAS,EAAE,SAAS,IAAI,IAAI;QAC5B,KAAK;QACL,SAAS,EAAE,OAAO;QAClB,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAU;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,OAA6B,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAS,MAAM,EAAE,WAAW,EAAE;QACxD,SAAS,EAAE,SAAS,IAAI,IAAI;QAC5B,IAAI;QACJ,SAAS,EAAE,OAAO;QAClB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;KAChC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAWD,KAAK,UAAU,SAAS,CAAC,IAAU;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAiB,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,uBAAuB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC7F,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAC/E,CAAC;QACF,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,iFAAiF;IACjF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpF,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,MAAM;IACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpF,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI,CAAC;QACV,KAAK,QAAQ;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9B,OAAO;QACT,KAAK,SAAS,CAAC;QACf,KAAK,IAAI,CAAC;QACV,KAAK,WAAW;YACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO;QACT,KAAK,OAAO;YACV,OAAO,QAAQ,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,SAAS,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,SAAS,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,QAAQ,EAAE,CAAC;QACpB,KAAK,KAAK;YACR,OAAO,MAAM,EAAE,CAAC;QAClB,KAAK,UAAU;YACb,OAAO,WAAW,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,QAAQ,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB;YACE,OAAO,CAAC,KAAK,CAAC,uBAAuB,UAAU,IAAI,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};