@spader/spall-cli 1.0.0
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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/scripts/postinstall.js +38 -0
- package/dist/scripts/postinstall.js.map +10 -0
- package/dist/shared/display.d.ts +47 -0
- package/dist/shared/display.d.ts.map +1 -0
- package/dist/shared/help.d.ts +5 -0
- package/dist/shared/help.d.ts.map +1 -0
- package/dist/shared/index.d.ts +14 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/layout.d.ts +16 -0
- package/dist/shared/layout.d.ts.map +1 -0
- package/dist/shared/list.d.ts +25 -0
- package/dist/shared/list.d.ts.map +1 -0
- package/dist/shared/progress.d.ts +4 -0
- package/dist/shared/progress.d.ts.map +1 -0
- package/dist/shared/search.d.ts +27 -0
- package/dist/shared/search.d.ts.map +1 -0
- package/dist/shared/status.d.ts +26 -0
- package/dist/shared/status.d.ts.map +1 -0
- package/dist/shared/theme.d.ts +20 -0
- package/dist/shared/theme.d.ts.map +1 -0
- package/dist/shared/tree.d.ts +37 -0
- package/dist/shared/tree.d.ts.map +1 -0
- package/dist/shared/vsearch.d.ts +28 -0
- package/dist/shared/vsearch.d.ts.map +1 -0
- package/dist/shared/workspace.d.ts +28 -0
- package/dist/shared/workspace.d.ts.map +1 -0
- package/dist/shared/yargs.d.ts +34 -0
- package/dist/shared/yargs.d.ts.map +1 -0
- package/dist/spall/commands/add.d.ts +20 -0
- package/dist/spall/commands/add.d.ts.map +1 -0
- package/dist/spall/commands/commit.d.ts +3 -0
- package/dist/spall/commands/commit.d.ts.map +1 -0
- package/dist/spall/commands/corpus/create.d.ts +3 -0
- package/dist/spall/commands/corpus/create.d.ts.map +1 -0
- package/dist/spall/commands/corpus/delete.d.ts +3 -0
- package/dist/spall/commands/corpus/delete.d.ts.map +1 -0
- package/dist/spall/commands/corpus/index.d.ts +3 -0
- package/dist/spall/commands/corpus/index.d.ts.map +1 -0
- package/dist/spall/commands/get.d.ts +3 -0
- package/dist/spall/commands/get.d.ts.map +1 -0
- package/dist/spall/commands/hook.d.ts +3 -0
- package/dist/spall/commands/hook.d.ts.map +1 -0
- package/dist/spall/commands/index.d.ts +15 -0
- package/dist/spall/commands/index.d.ts.map +1 -0
- package/dist/spall/commands/integrate/index.d.ts +8 -0
- package/dist/spall/commands/integrate/index.d.ts.map +1 -0
- package/dist/spall/commands/integrate/opencode.d.ts +3 -0
- package/dist/spall/commands/integrate/opencode.d.ts.map +1 -0
- package/dist/spall/commands/integrate/shell.d.ts +6 -0
- package/dist/spall/commands/integrate/shell.d.ts.map +1 -0
- package/dist/spall/commands/list.d.ts +3 -0
- package/dist/spall/commands/list.d.ts.map +1 -0
- package/dist/spall/commands/review/comments.d.ts +3 -0
- package/dist/spall/commands/review/comments.d.ts.map +1 -0
- package/dist/spall/commands/review/create.d.ts +3 -0
- package/dist/spall/commands/review/create.d.ts.map +1 -0
- package/dist/spall/commands/review/index.d.ts +3 -0
- package/dist/spall/commands/review/index.d.ts.map +1 -0
- package/dist/spall/commands/review/latest.d.ts +3 -0
- package/dist/spall/commands/review/latest.d.ts.map +1 -0
- package/dist/spall/commands/review/list.d.ts +3 -0
- package/dist/spall/commands/review/list.d.ts.map +1 -0
- package/dist/spall/commands/review/patches.d.ts +3 -0
- package/dist/spall/commands/review/patches.d.ts.map +1 -0
- package/dist/spall/commands/search.d.ts +3 -0
- package/dist/spall/commands/search.d.ts.map +1 -0
- package/dist/spall/commands/serve.d.ts +3 -0
- package/dist/spall/commands/serve.d.ts.map +1 -0
- package/dist/spall/commands/status.d.ts +3 -0
- package/dist/spall/commands/status.d.ts.map +1 -0
- package/dist/spall/commands/sync.d.ts +3 -0
- package/dist/spall/commands/sync.d.ts.map +1 -0
- package/dist/spall/commands/tui.d.ts +3 -0
- package/dist/spall/commands/tui.d.ts.map +1 -0
- package/dist/spall/commands/vsearch.d.ts +3 -0
- package/dist/spall/commands/vsearch.d.ts.map +1 -0
- package/dist/spall/commands/workspace/add.d.ts +3 -0
- package/dist/spall/commands/workspace/add.d.ts.map +1 -0
- package/dist/spall/commands/workspace/edit.d.ts +3 -0
- package/dist/spall/commands/workspace/edit.d.ts.map +1 -0
- package/dist/spall/commands/workspace/index.d.ts +3 -0
- package/dist/spall/commands/workspace/index.d.ts.map +1 -0
- package/dist/spall/commands/workspace/init.d.ts +3 -0
- package/dist/spall/commands/workspace/init.d.ts.map +1 -0
- package/dist/spall/commands/workspace/remove.d.ts +3 -0
- package/dist/spall/commands/workspace/remove.d.ts.map +1 -0
- package/dist/spall/e2e.preload.d.ts +2 -0
- package/dist/spall/e2e.preload.d.ts.map +1 -0
- package/dist/spall/index.d.ts +3 -0
- package/dist/spall/index.d.ts.map +1 -0
- package/dist/spallm/commands/add.d.ts +3 -0
- package/dist/spallm/commands/add.d.ts.map +1 -0
- package/dist/spallm/commands/fetch.d.ts +3 -0
- package/dist/spallm/commands/fetch.d.ts.map +1 -0
- package/dist/spallm/commands/get.d.ts +3 -0
- package/dist/spallm/commands/get.d.ts.map +1 -0
- package/dist/spallm/commands/list.d.ts +3 -0
- package/dist/spallm/commands/list.d.ts.map +1 -0
- package/dist/spallm/commands/prime.d.ts +3 -0
- package/dist/spallm/commands/prime.d.ts.map +1 -0
- package/dist/spallm/commands/query.d.ts +3 -0
- package/dist/spallm/commands/query.d.ts.map +1 -0
- package/dist/spallm/commands/review.d.ts +3 -0
- package/dist/spallm/commands/review.d.ts.map +1 -0
- package/dist/spallm/commands/search.d.ts +3 -0
- package/dist/spallm/commands/search.d.ts.map +1 -0
- package/dist/spallm/commands/status.d.ts +3 -0
- package/dist/spallm/commands/status.d.ts.map +1 -0
- package/dist/spallm/commands/vsearch.d.ts +3 -0
- package/dist/spallm/commands/vsearch.d.ts.map +1 -0
- package/dist/spallm/index.d.ts +3 -0
- package/dist/spallm/index.d.ts.map +1 -0
- package/dist/src/index.js +1648 -0
- package/dist/src/index.js.map +32 -0
- package/dist/src/shared/index.js +1164 -0
- package/dist/src/shared/index.js.map +21 -0
- package/dist/src/spall/index.js +1648 -0
- package/dist/src/spall/index.js.map +32 -0
- package/dist/src/spallm/index.js +294 -0
- package/dist/src/spallm/index.js.map +17 -0
- package/package.json +72 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/spall/index.ts", "../src/spall/commands/corpus/create.ts", "../src/spall/commands/corpus/delete.ts", "../src/spall/commands/corpus/index.ts", "../src/spall/commands/workspace/init.ts", "../src/spall/commands/workspace/add.ts", "../src/spall/commands/workspace/remove.ts", "../src/spall/commands/workspace/edit.ts", "../src/spall/commands/workspace/index.ts", "../src/spall/commands/add.ts", "../src/spall/commands/commit.ts", "../src/spall/commands/hook.ts", "../src/spall/commands/integrate/index.ts", "../src/spall/commands/integrate/shell.ts", "../src/spall/commands/integrate/opencode.ts", "../src/spall/commands/serve.ts", "../src/spall/commands/get.ts", "../src/spall/commands/list.ts", "../src/spall/commands/search.ts", "../src/spall/commands/sync.ts", "../src/spall/commands/tui.ts", "../src/spall/commands/vsearch.ts", "../src/spall/commands/status.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"#!/usr/bin/env bun\nimport { build, setActiveCli, type CliDef } from \"@spader/spall-cli/shared\";\nimport {\n corpus,\n workspace,\n add,\n commit,\n hook,\n integrate,\n serve,\n get,\n list,\n search,\n sync,\n status,\n tui,\n vsearch,\n} from \"./commands\";\n\nconst cliDef: CliDef = {\n name: \"spall\",\n description: \"Fast, local, searchable memory for LLMs and humans\",\n commands: {\n workspace,\n add,\n get,\n list,\n status,\n search,\n vsearch,\n sync,\n commit,\n integrate,\n corpus,\n serve,\n tui,\n hook,\n },\n};\n\nsetActiveCli(cliDef);\n\nbuild(cliDef).parse();\n",
|
|
6
|
+
"import pc from \"picocolors\";\nimport consola from \"consola\";\nimport { Client } from \"@spader/spall-sdk/client\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const create: CommandDef = {\n description: \"Create a new corpus\",\n positionals: {\n name: {\n type: \"string\",\n description: \"Corpus name\",\n required: true,\n },\n },\n handler: async (argv) => {\n const client = await Client.connect();\n\n const result = await client.corpus\n .create({\n name: argv.name,\n })\n .then(Client.unwrap);\n\n consola.success(`Corpus ${pc.cyanBright(result.name)} (id: ${result.id})`);\n },\n};\n",
|
|
7
|
+
"import pc from \"picocolors\";\nimport consola from \"consola\";\nimport { Client } from \"@spader/spall-sdk\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const remove: CommandDef = {\n description: \"Delete a corpus by ID\",\n positionals: {\n id: {\n type: \"number\",\n description: \"Corpus ID\",\n },\n },\n handler: async (argv) => {\n if (argv.id === undefined || isNaN(Number(argv.id))) {\n consola.error(\"Missing required argument: id\");\n process.exit(1);\n }\n\n const client = await Client.connect();\n\n const result = await client.corpus.delete({ id: String(argv.id) });\n\n if (result.error) {\n consola.error(result.error.message);\n process.exit(1);\n }\n\n consola.success(`Deleted corpus ${pc.cyanBright(argv.id)}`);\n },\n};\n",
|
|
8
|
+
"import type { CommandDef } from \"@spader/spall-cli/shared\";\nimport { create } from \"./create\";\nimport { remove } from \"./delete\";\n\nexport const corpus: CommandDef = {\n description: \"Manage corpora\",\n commands: { create, delete: remove },\n};\n",
|
|
9
|
+
"import { existsSync } from \"fs\";\nimport { basename } from \"path\";\n\nimport * as prompts from \"@clack/prompts\";\nimport consola from \"consola\";\n\nimport { WorkspaceConfig, type WorkspaceConfigSchema } from \"@spader/spall-core\";\nimport { Client } from \"@spader/spall-sdk/client\";\n\nimport { type CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const init: CommandDef = {\n description: \"Initialize a workspace in this directory\",\n options: {\n path: {\n alias: \"p\",\n type: \"string\",\n description: \"Directory to initialize (defaults to git root or cwd)\",\n },\n force: {\n alias: \"f\",\n type: \"boolean\",\n description: \"Overwrite existing .spall/spall.json\",\n default: false,\n },\n },\n handler: async (argv) => {\n const cwd = process.cwd();\n const root = (argv.path as string | undefined) ?? cwd;\n const configPath = WorkspaceConfig.path(root);\n\n prompts.intro(\"Workspace init\");\n\n if (existsSync(configPath) && !argv.force) {\n const overwrite = await prompts.confirm({\n message: \"Workspace config already exists. Overwrite?\",\n initialValue: false,\n });\n if (prompts.isCancel(overwrite) || !overwrite) {\n prompts.outro(\"Done\");\n return;\n }\n }\n\n const defaultName = basename(root) || \"default\";\n const workspaceName = await prompts.text({\n message: \"Workspace name\",\n initialValue: defaultName,\n validate: (s) => (s && s.trim().length > 0 ? undefined : \"Required\"),\n });\n if (prompts.isCancel(workspaceName)) {\n prompts.outro(\"Done\");\n return;\n }\n\n const createCorpus = await prompts.confirm({\n message: \"Create a corpus for this repo?\",\n initialValue: true,\n });\n if (prompts.isCancel(createCorpus)) {\n prompts.outro(\"Done\");\n return;\n }\n\n let corpusName: string | null = null;\n if (createCorpus) {\n const name = await prompts.text({\n message: \"Corpus name\",\n initialValue: defaultName,\n validate: (s) => (s && s.trim().length > 0 ? undefined : \"Required\"),\n });\n if (prompts.isCancel(name)) {\n prompts.outro(\"Done\");\n return;\n }\n corpusName = String(name).trim();\n }\n\n const spinner = prompts.spinner();\n spinner.start(\"Creating workspace\");\n\n try {\n const client = await Client.connect();\n\n const ws = await client.workspace\n .create({ name: String(workspaceName).trim() })\n .then(Client.unwrap);\n\n if (corpusName) {\n spinner.message(\"Creating corpus\");\n await client.corpus.create({ name: corpusName }).then(Client.unwrap);\n }\n\n spinner.message(\"Loading corpora\");\n const corpora = await client.corpus.list().then(Client.unwrap);\n const options = (corpora as any[])\n .map((c) => {\n const name = c.name as string;\n const noteCount =\n typeof c.noteCount === \"number\" ? c.noteCount : null;\n return {\n label: name,\n value: name,\n hint: noteCount == null ? undefined : `${noteCount} notes`,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n\n const defaults = new Set<string>([\"default\"]);\n if (corpusName) defaults.add(corpusName);\n\n spinner.stop(\"Workspace created\");\n\n const picked = await prompts.autocompleteMultiselect<string>({\n message: \"Select corpora to include in read scope (type to filter)\",\n options,\n placeholder: \"Type to filter...\",\n maxItems: 12,\n initialValues: Array.from(defaults),\n required: true,\n });\n\n if (prompts.isCancel(picked)) {\n prompts.outro(\"Done\");\n return;\n }\n\n if (\n !(Array.isArray(picked) && picked.every((x) => typeof x === \"string\"))\n ) {\n throw new Error(\"Unexpected autocompleteMultiselect result\");\n }\n const read = picked;\n\n const write = await prompts.select<string>({\n message: \"Select default corpus for writes\",\n options: read.map((name) => ({ label: name, value: name })),\n initialValue:\n (corpusName && read.includes(corpusName) ? corpusName : undefined) ??\n (read.includes(\"default\") ? \"default\" : read[0]),\n });\n\n if (prompts.isCancel(write)) {\n prompts.outro(\"Done\");\n return;\n }\n\n const next: WorkspaceConfigSchema = {\n workspace: { name: ws.name, id: ws.id },\n scope: { read, write: String(write) },\n };\n\n WorkspaceConfig.write(root, next);\n prompts.outro(`Wrote ${configPath}`);\n } catch (e: any) {\n spinner.stop(\"Failed\");\n consola.error(e?.message ?? String(e));\n prompts.outro(\"Done\");\n process.exit(1);\n }\n },\n};\n",
|
|
10
|
+
"import * as prompts from \"@clack/prompts\";\nimport consola from \"consola\";\n\nimport { WorkspaceConfig } from \"@spader/spall-core\";\nimport { Client } from \"@spader/spall-sdk/client\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const add: CommandDef = {\n description: \"Add a corpus to the workspace read scope\",\n positionals: {\n corpus: {\n type: \"string\",\n description: \"Corpus name\",\n required: true,\n },\n },\n handler: async (argv) => {\n const located = WorkspaceConfig.locate(process.cwd());\n if (!located) {\n consola.error(\"No workspace config found. Run `spall workspace init`.\");\n process.exit(1);\n }\n\n const name = String(argv.corpus ?? \"\").trim();\n if (!name) {\n consola.error(\"Missing required argument: corpus\");\n process.exit(1);\n }\n\n const client = await Client.connect();\n\n // Ensure corpus exists (get-or-create).\n await client.corpus.create({ name }).then(Client.unwrap);\n const cfg = WorkspaceConfig.load(located.root);\n const read = cfg.scope.read.includes(name)\n ? cfg.scope.read\n : [...cfg.scope.read, name];\n WorkspaceConfig.patch(located.root, { scope: { read } });\n\n consola.success(`Included corpus: ${name}`);\n },\n};\n",
|
|
11
|
+
"import consola from \"consola\";\n\nimport { WorkspaceConfig } from \"@spader/spall-core\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const remove: CommandDef = {\n description: \"Remove a corpus from the workspace read scope\",\n positionals: {\n corpus: {\n type: \"string\",\n description: \"Corpus name\",\n required: true,\n },\n },\n handler: async (argv) => {\n const located = WorkspaceConfig.locate(process.cwd());\n if (!located) {\n consola.error(\"No workspace config found. Run `spall workspace init`.\");\n process.exit(1);\n }\n\n const name = String(argv.corpus ?? \"\").trim();\n if (!name) {\n consola.error(\"Missing required argument: corpus\");\n process.exit(1);\n }\n\n const cfg = WorkspaceConfig.load(located.root);\n const read = cfg.scope.read.filter((c) => c !== name);\n const write =\n cfg.scope.write === name ? (read[0] ?? \"default\") : cfg.scope.write;\n WorkspaceConfig.patch(located.root, { scope: { read, write } });\n consola.success(`Removed corpus: ${name}`);\n },\n};\n",
|
|
12
|
+
"import * as prompts from \"@clack/prompts\";\nimport consola from \"consola\";\n\nimport { WorkspaceConfig } from \"@spader/spall-core\";\nimport { Client } from \"@spader/spall-sdk/client\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const edit: CommandDef = {\n description: \"Interactively edit the workspace\",\n handler: async () => {\n const located = WorkspaceConfig.locate(process.cwd());\n if (!located) {\n consola.error(\"No workspace config found. Run `spall workspace init`.\");\n process.exit(1);\n }\n\n const cfg = WorkspaceConfig.load(located.root);\n const client = await Client.connect();\n const corpora = (await client.corpus.list().then(Client.unwrap)) as any[];\n\n const options = corpora\n .map((c) => {\n const name = c.name as string;\n const noteCount = typeof c.noteCount === \"number\" ? c.noteCount : null;\n return {\n label: name,\n value: name,\n hint: noteCount == null ? undefined : `${noteCount} notes`,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n\n prompts.intro(\"Workspace scope\");\n\n const picked = await prompts.autocompleteMultiselect<string>({\n message: \"Select corpora to include in read scope (type to filter)\",\n options,\n placeholder: \"Type to filter...\",\n maxItems: 12,\n initialValues: cfg.scope.read.filter((c) =>\n options.some((o) => o.value === c),\n ),\n required: true,\n });\n\n if (prompts.isCancel(picked)) {\n prompts.outro(\"Done\");\n return;\n }\n\n if (\n !(Array.isArray(picked) && picked.every((x) => typeof x === \"string\"))\n ) {\n throw new Error(\"Unexpected autocompleteMultiselect result\");\n }\n const read = picked;\n\n const write = await prompts.select<string>({\n message: \"Select default corpus for writes\",\n options: read.map((name) => ({ label: name, value: name })),\n initialValue: read.includes(cfg.scope.write) ? cfg.scope.write : read[0],\n });\n\n if (prompts.isCancel(write)) {\n prompts.outro(\"Done\");\n return;\n }\n\n WorkspaceConfig.patch(located.root, {\n scope: { read, write: String(write) },\n });\n prompts.outro(\"Updated workspace scope\");\n },\n};\n",
|
|
13
|
+
"import type { CommandDef } from \"@spader/spall-cli/shared\";\nimport { init } from \"./init\";\nimport { add } from \"./add\";\nimport { remove } from \"./remove\";\nimport { edit } from \"./edit\";\nimport { defaultTheme as theme } from \"@spader/spall-cli/shared\";\n\nexport const workspace: CommandDef = {\n summary: \"Manage the current workspace\",\n description:\n `A workspace allows you to define which corpora are included in ${theme.guide(\"searches\")}, per directory. Separately, it provides a context for spall to automatically learn note weights based on access patterns.\n\nIt's very useful to ingest documentation with spall, but you don't want TypeScript documentation polluting ${theme.guide(\"search\")} results for a C project. Workspaces solve this by allowing you to restrict which corpora are included in ${theme.guide(\"searches\")} within a directory.`,\n commands: { init, add, remove, edit },\n};\n",
|
|
14
|
+
"import * as prompts from \"@clack/prompts\";\nimport consola from \"consola\";\nimport { Client } from \"@spader/spall-sdk/client\";\nimport { WorkspaceConfig } from \"@spader/spall-core\";\nimport {\n type CommandDef,\n defaultTheme as theme,\n createModelProgressHandler,\n formatStreamError,\n} from \"@spader/spall-cli/shared\";\n\nfunction splitPath(input: string): { dir: string; name: string } {\n const normalized = input.replace(/\\\\/g, \"/\").replace(/^\\/+|\\/+$/g, \"\");\n if (normalized.length === 0) return { dir: \"\", name: \"\" };\n\n const i = normalized.lastIndexOf(\"/\");\n if (i < 0) return { dir: \"\", name: normalized };\n\n return {\n dir: normalized.slice(0, i),\n name: normalized.slice(i + 1),\n };\n}\n\nfunction joinPath(dir: string, name: string): string {\n const d = dir.replace(/\\\\/g, \"/\").replace(/^\\/+|\\/+$/g, \"\");\n const n = name.replace(/\\\\/g, \"/\").replace(/^\\/+|\\/+$/g, \"\");\n return d.length > 0 ? `${d}/${n}` : n;\n}\n\nfunction collectDirectories(paths: string[]): string[] {\n const dirs = new Set<string>();\n dirs.add(\"\");\n\n for (const path of paths) {\n const parts = path.split(\"/\");\n if (parts.length <= 1) continue;\n\n let prefix = \"\";\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n prefix = prefix ? `${prefix}/${part}` : part;\n dirs.add(prefix);\n }\n }\n\n return Array.from(dirs).sort((a, b) => a.localeCompare(b));\n}\n\nconst NEW_DIRECTORY = \"__new_directory__\";\n\nfunction keepServerAlive(client: any, signal: AbortSignal): void {\n (async () => {\n try {\n const { stream } = await client.events({ signal });\n for await (const _event of stream) {\n // keep-alive only\n }\n } catch {\n // ignore\n }\n })();\n}\n\ntype SubmitInput = {\n client: Awaited<ReturnType<typeof Client.connect>>;\n corpusName: string;\n path: string;\n content: string;\n update?: boolean;\n};\n\nexport async function submitNote(input: SubmitInput): Promise<{\n action: \"added\" | \"updated\";\n info: { path: string; id: number; corpus: number };\n}> {\n const corpus = await input.client.corpus\n .get({ name: input.corpusName })\n .catch(() => {\n consola.error(\n `Failed to find corpus: ${theme.primary(String(input.corpusName))}`,\n );\n process.exit(1);\n })\n .then(Client.unwrap);\n\n const handleProgress = createModelProgressHandler();\n\n const handleStreamError = (event: any) => {\n if (event?.tag !== \"error\") return false;\n const formatted = formatStreamError(event.error, input.path);\n const raw = (() => {\n try {\n return JSON.stringify(event.error);\n } catch {\n return String(event.error);\n }\n })();\n consola.error(formatted);\n consola.error(`Raw SSE error payload: ${raw}`);\n process.exit(1);\n };\n\n if (input.update) {\n const existing = await input.client.note\n .get({ id: corpus.id.toString(), path: input.path })\n .then(Client.unwrap)\n .catch(() => null);\n\n if (!existing) {\n consola.error(`Note not found: ${theme.primary(input.path)}`);\n process.exit(1);\n }\n\n const { stream } = await input.client.sse.note.update({\n id: existing.id.toString(),\n content: input.content,\n dupe: true,\n });\n\n for await (const event of stream as AsyncGenerator<any>) {\n handleProgress(event);\n handleStreamError(event);\n if (event.tag === \"note.updated\") {\n return { action: \"updated\", info: event.info };\n }\n }\n\n throw new Error(\"Note stream ended without result\");\n }\n\n const { stream } = await input.client.sse.note.add({\n path: input.path,\n content: input.content,\n corpus: corpus.id,\n dupe: true,\n });\n\n for await (const event of stream as AsyncGenerator<any>) {\n handleProgress(event);\n handleStreamError(event);\n if (event.tag === \"note.created\") {\n return { action: \"added\", info: event.info };\n }\n }\n\n throw new Error(\"Note stream ended without result\");\n}\n\nexport const add: CommandDef = {\n description: \"Add a note to a corpus\",\n positionals: {\n path: {\n type: \"string\",\n description: \"Path/name for the note\",\n required: false,\n },\n },\n options: {\n text: {\n alias: \"t\",\n type: \"string\",\n description: \"Note content\",\n },\n corpus: {\n alias: \"c\",\n type: \"string\",\n description: \"Corpus name\",\n },\n update: {\n alias: \"u\",\n type: \"boolean\",\n description: \"Update if note exists (upsert)\",\n },\n },\n handler: async (argv) => {\n const hasPathArg = typeof argv.path === \"string\" && argv.path.length > 0;\n const hasTextArg = typeof argv.text === \"string\";\n const interactive = !hasPathArg || !hasTextArg;\n\n const defaultCorpusName = WorkspaceConfig.load(process.cwd()).scope.write;\n\n let corpusName: string =\n typeof (argv as any).corpus === \"string\"\n ? String((argv as any).corpus)\n : defaultCorpusName;\n let path = hasPathArg ? String(argv.path) : \"\";\n let content = hasTextArg ? String(argv.text) : \"\";\n\n const client = await Client.connect();\n const keepAlive = interactive ? new AbortController() : null;\n if (keepAlive) {\n keepServerAlive(client, keepAlive.signal);\n }\n\n try {\n if (interactive) {\n prompts.intro(\"spall add\");\n\n if (typeof (argv as any).corpus !== \"string\") {\n const corpora = await client.corpus.list().then(Client.unwrap);\n const corpusOptions = (corpora as any[])\n .map((c) => {\n const name = String(c.name);\n const noteCount =\n typeof c.noteCount === \"number\" ? c.noteCount : undefined;\n return {\n label: name,\n value: name,\n hint:\n noteCount === undefined\n ? undefined\n : `${noteCount} ${noteCount === 1 ? \"note\" : \"notes\"}`,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n\n const pickedCorpus = await prompts.autocomplete<string>({\n message: \"Select corpus\",\n options: corpusOptions,\n placeholder: \"Type to filter...\",\n maxItems: 12,\n initialValue: corpusName,\n });\n if (prompts.isCancel(pickedCorpus)) {\n prompts.outro(\"Cancelled\");\n return;\n }\n corpusName = String(pickedCorpus);\n }\n\n const corpusForPath = await client.corpus\n .get({ name: corpusName })\n .catch(() => {\n consola.error(\n `Failed to find corpus: ${theme.primary(corpusName)}`,\n );\n process.exit(1);\n })\n .then(Client.unwrap);\n\n const existing = await client.note\n .list({ id: String(corpusForPath.id) })\n .then(Client.unwrap)\n .catch(() => []);\n\n const existingPaths = (existing as any[])\n .map((item) => String(item.path))\n .sort((a, b) => a.localeCompare(b));\n\n const initial = hasPathArg ? splitPath(path) : { dir: \"\", name: \"\" };\n const directories = collectDirectories(existingPaths);\n const dirOptions = [\n {\n label: \"(new directory)\",\n value: NEW_DIRECTORY,\n hint: \"type custom path\",\n },\n ...directories.map((dir) => ({\n label: dir.length === 0 ? \"(root)\" : dir,\n value: dir,\n })),\n ];\n\n const pickedDir = await prompts.autocomplete<string>({\n message: \"Select directory\",\n options: dirOptions,\n placeholder: \"Type to filter...\",\n maxItems: 16,\n initialValue: directories.includes(initial.dir)\n ? initial.dir\n : NEW_DIRECTORY,\n });\n if (prompts.isCancel(pickedDir)) {\n prompts.outro(\"Cancelled\");\n return;\n }\n\n let dir = String(pickedDir);\n if (dir === NEW_DIRECTORY) {\n const enteredDir = await prompts.text({\n message: \"Directory\",\n placeholder: \"(root)\",\n initialValue: initial.dir,\n validate: (s) => {\n const value = String(s ?? \"\");\n if (value.startsWith(\"/\") || value.endsWith(\"/\")) {\n return \"Do not start or end with '/'\";\n }\n if (value.includes(\"\\\\\")) return \"Use '/' as path separator\";\n return undefined;\n },\n });\n if (prompts.isCancel(enteredDir)) {\n prompts.outro(\"Cancelled\");\n return;\n }\n dir = String(enteredDir);\n }\n\n const docName = await prompts.text({\n message: \"Document name\",\n placeholder: \"e.g. overview.md\",\n initialValue: initial.name,\n validate: (s) => {\n const name = String(s ?? \"\");\n if (name.length === 0) return \"Document name is required\";\n if (name.includes(\"/\") || name.includes(\"\\\\\")) {\n return \"Use directory picker for folders\";\n }\n return undefined;\n },\n });\n if (prompts.isCancel(docName)) {\n prompts.outro(\"Cancelled\");\n return;\n }\n\n path = joinPath(dir, String(docName));\n\n if (!hasTextArg) {\n const entered = await prompts.text({\n message: \"Note content\",\n placeholder: \"Write note content\",\n validate: (s) =>\n (s ?? \"\").length > 0 ? undefined : \"Content is required\",\n });\n if (prompts.isCancel(entered)) {\n prompts.outro(\"Cancelled\");\n return;\n }\n\n content = String(entered);\n }\n\n const action = argv.update ? \"Update\" : \"Add\";\n const confirmed = await prompts.confirm({\n message: `${action} ${theme.primary(path)} in corpus ${theme.primary(corpusName)}?`,\n initialValue: true,\n });\n\n if (prompts.isCancel(confirmed) || !confirmed) {\n prompts.outro(\"Cancelled\");\n return;\n }\n }\n\n if (path.length === 0) {\n consola.error(\"Path is required\");\n process.exit(1);\n }\n\n if (content.length === 0) {\n consola.error(`Note content cannot be empty: ${theme.primary(path)}`);\n process.exit(1);\n }\n\n let result: Awaited<ReturnType<typeof submitNote>>;\n try {\n result = await submitNote({\n client,\n corpusName,\n path,\n content,\n update: argv.update,\n });\n } catch (error: any) {\n const msg = error?.message ?? String(error);\n const stack = error?.stack ? `\\n${String(error.stack)}` : \"\";\n consola.error(`add submit failed: ${msg}${stack}`);\n throw error;\n }\n\n if (result.action === \"updated\") {\n consola.success(\n `Updated note ${theme.primary(result.info.path)} (id: ${result.info.id}, corpus: ${result.info.corpus})`,\n );\n } else {\n consola.success(\n `Added note ${theme.primary(result.info.path)} (id: ${result.info.id}, corpus: ${result.info.corpus})`,\n );\n }\n\n if (interactive) {\n prompts.outro(\"Done\");\n }\n } finally {\n keepAlive?.abort();\n }\n },\n};\n",
|
|
15
|
+
"import consola from \"consola\";\nimport { Client } from \"@spader/spall-sdk/client\";\nimport { type CommandDef, defaultTheme as theme } from \"@spader/spall-cli/shared\";\n\nexport const commit: CommandDef = {\n description:\n \"Update note weights based on queries since last commit\",\n handler: async () => {\n const client = await Client.connect();\n\n // `commit.run` is a POST with an empty JSON body.\n const res = await client.commit.run({ body: {} }).then(Client.unwrap);\n\n const moved = Number(res?.moved ?? 0);\n if (moved === 0) {\n consola.info(\"No staged events to commit\");\n return;\n }\n\n consola.success(`Committed ${theme.primary(String(moved))} event(s)`);\n },\n};\n",
|
|
16
|
+
"import { hooks, supportedShells, type Shell } from \"@spader/spall-integration\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const hook: CommandDef = {\n description: \"Print shell hook for completion support\",\n hidden: true,\n positionals: {\n shell: {\n type: \"string\",\n description: `Shell to generate hook for (${supportedShells.join(\", \")})`,\n required: true,\n },\n },\n handler: async (argv) => {\n const shell = argv.shell as string;\n\n if (!supportedShells.includes(shell as Shell)) {\n console.error(\n `Unknown shell: ${shell}. Supported: ${supportedShells.join(\", \")}`,\n );\n process.exit(1);\n }\n\n process.stdout.write(hooks[shell as Shell]);\n },\n};\n",
|
|
17
|
+
"import * as prompts from \"@clack/prompts\";\n\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nimport { bash, zsh } from \"./shell\";\nimport { opencode } from \"./opencode\";\n\nexport type Integration = {\n label: string;\n hint?: string;\n handler: () => Promise<void>;\n};\n\nconst integrations: Record<string, Integration> = {\n bash,\n zsh,\n opencode,\n};\n\nexport const integrate: CommandDef = {\n description: \"Set up integrations with third party tools\",\n handler: async () => {\n prompts.intro(\"Integrations\");\n\n const choice = await prompts.select({\n message: \"Select a tool\",\n options: Object.entries(integrations).map(([key, cfg]) => ({\n value: key,\n hint: cfg.hint,\n label: cfg.label,\n })),\n });\n\n if (prompts.isCancel(choice)) {\n prompts.cancel(\"Cancelled\");\n return;\n }\n\n await integrations[choice]!.handler();\n },\n};\n",
|
|
18
|
+
"import { existsSync, readFileSync, appendFileSync } from \"fs\";\nimport { homedir, platform } from \"os\";\nimport { join } from \"path\";\n\nimport * as prompts from \"@clack/prompts\";\n\nimport { snippets, type Shell } from \"@spader/spall-integration\";\nimport { defaultTheme as theme } from \"@spader/spall-cli/shared\";\n\nimport { type Integration } from \"./index\";\n\ntype ShellConfig = {\n defaultRc: string;\n};\n\nexport const bash: Integration = {\n label: \"bash\",\n hint: \"path completions, cli completions\",\n handler: () => shellIntegration(\"bash\"),\n};\n\nexport const zsh: Integration = {\n label: \"zsh\",\n hint: \"path completions, cli completions\",\n handler: () => shellIntegration(\"zsh\"),\n};\n\nconst SPALL_CANARY = \"@spall_canary\";\n\nconst configs: Record<Shell, ShellConfig> = {\n bash: {\n defaultRc: join(\n homedir(),\n platform() === \"darwin\" ? \".bash_profile\" : \".bashrc\",\n ),\n },\n zsh: {\n defaultRc: join(homedir(), \".zshrc\"),\n },\n};\n\nexport async function shellIntegration(shell: Shell): Promise<void> {\n const cfg = configs[shell];\n const snippet = snippets[shell];\n\n const rcFile = await prompts.text({\n message: \"Where should the hook be installed?\",\n initialValue: cfg.defaultRc,\n validate: (s) => (s && s.trim() ? undefined : \"Required\"),\n });\n\n if (prompts.isCancel(rcFile)) {\n prompts.cancel(\"Cancelled\");\n return;\n }\n\n const rc = String(rcFile).trim();\n\n if (existsSync(rc)) {\n const contents = readFileSync(rc, \"utf-8\");\n if (contents.includes(SPALL_CANARY)) {\n prompts.outro(`Hook is already installed in ${theme.primary(rc)}`);\n return;\n }\n }\n\n appendFileSync(rc, \"\\n\" + snippet);\n prompts.log.info(`Added hook to ${theme.primary(rc)}`);\n prompts.note(\n`Run ${theme.code(`source ${rc}`)} or restart your shell to activate\n\nGet completions for available commands:\n> ${theme.code(\"spall\")} <tab>\n\nGet completions for paths:\n> ${theme.code(\"spall list ai-gateway/tutorials/\")} <tab>\nai-gateway/tutorials/create-first-aig-workers.mdx\nai-gateway/tutorials/index.mdx\nai-gateway/tutorials/deploy-aig-worker.mdx`\n );\n}\n",
|
|
19
|
+
"import * as prompts from \"@clack/prompts\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join, resolve } from \"path\";\n\nimport { defaultTheme as theme } from \"@spader/spall-cli/shared\";\n\nimport type { Integration } from \"./index\";\n\nconst HELLO_PLUGIN_PKG = \"@spader/spall-plugin-opencode\";\n\n// JSONC editing is intentionally not supported here. If a user has JSONC,\n// we ask them to update it manually.\n\nfunction configCandidates(dir: string): string[] {\n return [join(dir, \"opencode.jsonc\"), join(dir, \"opencode.json\")];\n}\n\nfunction pickExistingConfigPath(dir: string): string | null {\n for (const p of configCandidates(dir)) {\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction findOpencodeDir(startDir: string): string | null {\n let dir = resolve(startDir);\n while (true) {\n const candidate = join(dir, \".opencode\");\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport const opencode: Integration = {\n label: \"opencode\",\n hint: \"install an OpenCode plugin\",\n handler: async () => {\n const scope = await prompts.select({\n message: \"Install for\",\n options: [\n {\n value: \"project\",\n label: \"This project\",\n hint: \"uses .opencode/plugins\",\n },\n {\n value: \"global\",\n label: \"Global\",\n hint: \"uses ~/.config/opencode/plugins\",\n },\n ],\n });\n\n if (prompts.isCancel(scope)) {\n prompts.cancel(\"Cancelled\");\n return;\n }\n\n let configDir: string;\n if (scope === \"global\") {\n configDir = join(homedir(), \".config\", \"opencode\");\n } else {\n const opencodeDir = findOpencodeDir(process.cwd());\n if (!opencodeDir) {\n prompts.log.error(\n `No ${theme.primary(\".opencode\")} directory found walking up from ${theme.primary(process.cwd())}`,\n );\n prompts.note(\n `Create one (or run OpenCode in this repo once), then re-run ${theme.code(\"spall integrate opencode\")}.`,\n );\n return;\n }\n configDir = opencodeDir;\n }\n\n const existingConfig = pickExistingConfigPath(configDir);\n const configPath = existingConfig ?? join(configDir, \"opencode.jsonc\");\n\n if (!existsSync(configPath)) {\n const ok = await prompts.confirm({\n message: `Create ${theme.primary(configPath)}?`,\n initialValue: true,\n });\n if (prompts.isCancel(ok) || !ok) {\n prompts.cancel(\"Cancelled\");\n return;\n }\n mkdirSync(dirname(configPath), { recursive: true });\n\n const initial = configPath.endsWith(\".jsonc\")\n ? `{\n \"$schema\": \"https://opencode.ai/config.json\",\n \"plugin\": [\"${HELLO_PLUGIN_PKG}\"]\n}\\n`\n : JSON.stringify(\n {\n $schema: \"https://opencode.ai/config.json\",\n plugin: [HELLO_PLUGIN_PKG],\n },\n null,\n 2,\n ) + \"\\n\";\n\n writeFileSync(configPath, initial, \"utf-8\");\n prompts.outro(`Wrote ${theme.primary(configPath)}`);\n prompts.note(\"Restart OpenCode to load the plugin.\");\n return;\n }\n\n const raw = readFileSync(configPath, \"utf-8\");\n if (raw.includes(HELLO_PLUGIN_PKG)) {\n prompts.outro(`Already configured in ${theme.primary(configPath)}`);\n return;\n }\n\n if (configPath.endsWith(\".jsonc\")) {\n prompts.log.warn(\n `Detected JSONC config at ${theme.primary(configPath)}. Automatic editing is disabled to preserve formatting/comments.`,\n );\n prompts.note(\n `Please add ${theme.code(`\"${HELLO_PLUGIN_PKG}\"`)} to the ${theme.code(\"plugin\")} array in ${theme.primary(configPath)}.`,\n );\n prompts.note(\"Restart OpenCode to load the plugin.\");\n return;\n }\n\n let config: any;\n try {\n config = JSON.parse(raw);\n } catch {\n prompts.log.error(`Failed to parse ${theme.primary(configPath)} as JSON`);\n return;\n }\n\n if (config == null || typeof config !== \"object\" || Array.isArray(config)) {\n prompts.log.error(\n `Unexpected config shape in ${theme.primary(configPath)}`,\n );\n return;\n }\n\n const existing = config.plugin;\n if (existing === undefined) {\n config.plugin = [];\n } else if (\n !Array.isArray(existing) ||\n existing.some((x: any) => typeof x !== \"string\")\n ) {\n prompts.log.error(\n `Expected ${theme.primary(\"plugin\")} to be an array of strings in ${theme.primary(configPath)}`,\n );\n return;\n }\n\n if (!config.plugin.includes(HELLO_PLUGIN_PKG)) {\n config.plugin.push(HELLO_PLUGIN_PKG);\n }\n if (!config.$schema) {\n config.$schema = \"https://opencode.ai/config.json\";\n }\n\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n\n prompts.outro(`Updated ${theme.primary(configPath)}`);\n prompts.note(\"Restart OpenCode to load the plugin.\");\n },\n};\n",
|
|
20
|
+
"import { Config } from \"@spader/spall-core/config\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const serve: CommandDef = {\n description: \"Start the spall server\",\n options: {\n kill: {\n type: \"boolean\",\n description:\n \"Stop the running server (best-effort) and remove the lock file\",\n },\n daemon: {\n alias: \"d\",\n type: \"boolean\",\n description: \"Do not stop after last client disconnects\",\n },\n timeout: {\n alias: \"t\",\n type: \"number\",\n description: \"Seconds to wait after last client disconnects\",\n default: Config.get().server.idleTimeout,\n },\n force: {\n alias: \"f\",\n type: \"boolean\",\n description: \"Kill existing server if running\",\n },\n },\n handler: async (argv) => {\n if (argv.kill) {\n const { Lock, checkHealth, isProcessAlive } =\n await import(\"@spader/spall-sdk/server\");\n const lock = Lock.read();\n\n try {\n let shutdownOk = false;\n\n if (lock?.port != null) {\n // Prefer a clean shutdown so the server can flush/cleanup.\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 500);\n try {\n const res = await fetch(`http://127.0.0.1:${lock.port}/shutdown`, {\n method: \"POST\",\n signal: controller.signal,\n });\n shutdownOk = res.ok;\n } catch {\n // ignore\n } finally {\n clearTimeout(timeout);\n }\n }\n\n // Give the server up to ~1s to exit on its own.\n if (shutdownOk) {\n const start = Date.now();\n while (Date.now() - start < 1000) {\n if (lock?.pid != null && !isProcessAlive(lock.pid)) {\n return;\n }\n if (lock?.port != null && !(await checkHealth(lock.port))) {\n return;\n }\n await Bun.sleep(50);\n }\n }\n\n // Fallback: kill by pid.\n if (lock?.pid != null) {\n try {\n process.kill(lock.pid, \"SIGTERM\");\n } catch {\n // ignore\n }\n }\n } finally {\n // Unconditionally remove lock file when done.\n Lock.remove();\n }\n return;\n }\n\n const { Server } = await import(\"@spader/spall-sdk/server\");\n const { port, stopped } = await Server.start({\n persist: argv.daemon,\n idleTimeoutMs: argv.timeout * 1000,\n force: argv.force,\n });\n\n await stopped;\n },\n};\n",
|
|
21
|
+
"import { Client } from \"@spader/spall-sdk/client\";\nimport {\n type CommandDef,\n createQuery,\n displayResults,\n help,\n} from \"@spader/spall-cli/shared\";\n\nexport const get: CommandDef = {\n description: \"Get note(s) by path or glob\",\n positionals: {\n path: {\n type: \"string\",\n description: \"Path or glob to notes\",\n required: true,\n },\n },\n options: {\n corpus: {\n alias: \"c\",\n type: \"string\",\n description: \"Corpus name\",\n },\n max: {\n alias: \"n\",\n type: \"number\",\n description: \"Maximum number of notes to return\",\n },\n output: {\n alias: \"o\",\n type: \"string\",\n description: \"Output format: list, tree, table, json\",\n },\n all: {\n alias: \"a\",\n type: \"boolean\",\n description: \"Print all results without limiting output\",\n },\n },\n handler: async (argv) => {\n const client = await Client.connect();\n\n const { query } = await createQuery({\n client,\n corpus: (argv as any).corpus,\n tracked: false,\n });\n\n const output = argv.output ?? (argv.path === \"*\" ? \"tree\" : \"list\");\n\n const showAll = argv.all === true;\n\n // query already created\n\n type NoteInfo = {\n id: number;\n corpus: number;\n path: string;\n content: string;\n contentHash: string;\n };\n type Page = { notes: NoteInfo[]; nextCursor: string | null };\n const notes: NoteInfo[] = [];\n let cursor: string | undefined = undefined;\n\n // Limit fetching to roughly what we'd display, to avoid over-fetching.\n // Keep this aligned with the renderer's own row budgets.\n const termRows = process.stdout.rows ?? 24;\n const displayRows =\n showAll || output === \"json\"\n ? Infinity\n : Math.max(1, termRows - (output === \"table\" ? 4 : 3));\n const fetchLimit = Math.min(argv.max ?? Infinity, displayRows + 1);\n\n while (notes.length < fetchLimit) {\n const page: Page = await client.query\n .notes({\n id: String(query.id),\n path: argv.path,\n limit: Math.min(100, fetchLimit - notes.length),\n after: cursor,\n })\n .then(Client.unwrap);\n\n notes.push(...page.notes);\n\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n\n displayResults(notes, {\n output,\n showAll,\n empty: \"(no notes matching pattern)\",\n path: (n) => n.path,\n id: (n) => String(n.id),\n preview: (n) => n.content,\n });\n },\n};\n",
|
|
22
|
+
"import {\n type CommandDef,\n defaultTheme,\n List,\n noteDirEntries,\n noteTreeEntries,\n} from \"@spader/spall-cli/shared\";\n\nexport const list: CommandDef = {\n description: \"List note paths as a tree\",\n positionals: List.positionals,\n options: {\n ...List.options,\n completion: {\n type: \"boolean\",\n description: \"Output bare paths for shell completion\",\n },\n },\n handler: async (argv) => {\n const theme = defaultTheme;\n const rawInput = String(argv.path ?? \"*\");\n const isCompletion = Boolean((argv as any).completion);\n\n const { notes, located, includeNames } = await List.run({\n path: rawInput,\n corpus: (argv as any).corpus,\n tracked: false,\n completion: isCompletion,\n });\n\n if (isCompletion) {\n printCompletions(\n notes.map((n) => n.path),\n rawInput,\n );\n return;\n }\n\n if (notes.length === 0) {\n console.log(\"(no notes found)\");\n if (\n !located &&\n includeNames.length === 1 &&\n includeNames[0] === \"default\"\n ) {\n console.log(\n `hint: no workspace found, only searched default corpus. run ${theme.code(\"spall status\")} to check workspace scope, or ${theme.code(\"spall workspace init\")} to create a workspace)`,\n );\n }\n return;\n }\n\n const showAll = Boolean((argv as any).all);\n const maxDepth = showAll\n ? List.parseDepth((argv as any).depth ?? \"max\")\n : List.parseDepth((argv as any).depth);\n const entries = showAll\n ? noteTreeEntries(notes, maxDepth)\n : noteDirEntries(notes, maxDepth);\n\n for (const e of entries) {\n const indent = \" \".repeat(e.depth);\n if (e.type === \"dir\") {\n const suffix =\n typeof e.noteCount === \"number\"\n ? theme.dim(` (${e.noteCount} note${e.noteCount === 1 ? \"\" : \"s\"})`)\n : \"\";\n console.log(`${indent}${e.name}${suffix}`);\n } else {\n console.log(\n `${theme.dim(indent)}${e.name}${theme.dim(` (id: ${e.id})`)}`,\n );\n }\n }\n },\n};\n\n/**\n * Print immediate children of the given prefix as bare paths for shell\n * completion. Directories get a trailing `/` so bash knows not to append\n * a space (allows continued tabbing).\n */\nfunction printCompletions(paths: string[], rawInput: string): void {\n // Determine the prefix directory we're completing under.\n // rawInput is what the user typed, e.g. \"ai-gateway/\" or \"ai-gateway/feat\"\n // We want the directory part: everything up to and including the last `/`.\n const lastSlash = rawInput.lastIndexOf(\"/\");\n const prefix = lastSlash >= 0 ? rawInput.slice(0, lastSlash + 1) : \"\";\n\n const seen = new Set<string>();\n\n for (const p of paths) {\n // Only consider paths under our prefix\n if (prefix && !p.startsWith(prefix)) continue;\n\n const rest = p.slice(prefix.length);\n const slash = rest.indexOf(\"/\");\n if (slash >= 0) {\n // It's a directory -- emit just the first segment with trailing /\n const dir = prefix + rest.slice(0, slash + 1);\n if (!seen.has(dir)) {\n seen.add(dir);\n console.log(dir);\n }\n } else {\n // It's a file at this level\n if (!seen.has(p)) {\n seen.add(p);\n console.log(p);\n }\n }\n }\n}\n",
|
|
23
|
+
"import consola from \"consola\";\nimport {\n type CommandDef,\n defaultTheme as theme,\n displayResults,\n highlightSnippet,\n Search,\n} from \"@spader/spall-cli/shared\";\n\ntype Mode = \"plain\" | \"fts\";\n\nexport const search: CommandDef = {\n description: `Full text keyword ${theme.search()} against note content`,\n positionals: Search.positionals,\n options: {\n output: {\n alias: \"o\",\n type: \"string\",\n description: \"Output format (table, json, tree, list)\",\n default: \"table\",\n },\n ...Search.options,\n mode: {\n alias: \"m\",\n type: \"string\",\n description: \"Query mode (plain, fts)\",\n default: \"plain\",\n },\n },\n handler: async (argv) => {\n const mode = String(argv.mode ?? \"plain\") as Mode;\n if (mode !== \"plain\" && mode !== \"fts\") {\n consola.error(`Invalid mode: ${theme.primary(String(argv.mode))}`);\n consola.info(`Use ${theme.option(\"--mode\")} plain | fts`);\n process.exit(1);\n }\n\n const out = String(argv.output ?? \"table\");\n\n const { results } = await Search.run({\n query: argv.query,\n corpus: (argv as any).corpus,\n path: argv.path,\n limit: argv.limit,\n tracked: false,\n mode,\n });\n\n displayResults(results, {\n output: out,\n empty: \"(no matches)\",\n path: (r: any) => r.path,\n id: (r: any) => String(r.id),\n preview: (r: any) => r.snippet,\n previewFormat: highlightSnippet,\n extraColumns: [\n {\n header: \"score\",\n value: (r: any) => r.score.toFixed(3),\n flex: 0,\n noTruncate: true,\n format: (s) => theme.code(s),\n },\n ],\n });\n },\n};\n",
|
|
24
|
+
"import pc from \"picocolors\";\nimport consola from \"consola\";\nimport { existsSync, statSync } from \"fs\";\nimport { basename, resolve } from \"path\";\nimport * as prompts from \"@clack/prompts\";\nimport { Glob } from \"bun\";\nimport { Client } from \"@spader/spall-sdk/client\";\nimport {\n type CommandDef,\n defaultTheme as theme,\n createModelProgressHandler,\n} from \"@spader/spall-cli/shared\";\n\nfunction keepServerAlive(client: any, signal: AbortSignal): void {\n // Fire-and-forget: keep SSE connection open; ignore errors.\n (async () => {\n try {\n const { stream } = await client.events({ signal });\n for await (const _ev of stream) {\n // keep-alive; ignore\n }\n } catch {\n // ignore\n }\n })();\n}\n\nfunction canonicalize(path: string): string {\n let p = path.replace(/\\\\/g, \"/\");\n p = p.replace(/\\/+$/, \"\");\n p = p.replace(/^\\.\\//, \"\");\n p = p.replace(/^\\//, \"\");\n p = p.replace(/\\/+/g, \"/\");\n if (p === \".\") return \"\";\n return p;\n}\n\nasync function countFiles(\n dir: string,\n globPattern: string,\n): Promise<{\n count: number;\n first: string | null;\n}> {\n const glob = new Glob(globPattern);\n let count = 0;\n let first: string | null = null;\n for await (const file of glob.scan({ cwd: dir, absolute: false })) {\n count++;\n if (!first) first = file;\n }\n return { count, first };\n}\n\nasync function extensionCounts(dir: string): Promise<Map<string, number>> {\n const glob = new Glob(\"**/*\");\n const counts = new Map<string, number>();\n for await (const file of glob.scan({ cwd: dir, absolute: false })) {\n const base = file.split(\"/\").pop() ?? file;\n const dot = base.lastIndexOf(\".\");\n if (dot <= 0 || dot === base.length - 1) continue;\n const ext = base.slice(dot + 1);\n counts.set(ext, (counts.get(ext) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction pickDefaultMask(counts: Map<string, number>): string {\n let bestExt: string | null = null;\n let bestCount = 0;\n for (const [ext, count] of counts) {\n if (count > bestCount) {\n bestExt = ext;\n bestCount = count;\n }\n }\n return bestExt ? `*.${bestExt}` : \"*\";\n}\n\nexport const sync: CommandDef = {\n description: \"Sync a directory under a path in a corpus\",\n positionals: {\n dir: {\n type: \"string\",\n description: \"Directory to scan, recursively\",\n required: true,\n },\n },\n options: {\n glob: {\n alias: \"g\",\n type: \"string\",\n description: \"Glob pattern to match (default: **/*.md)\",\n },\n mask: {\n alias: \"m\",\n type: \"string\",\n description: \"File mask to match (default: *.md)\",\n },\n corpus: {\n alias: \"c\",\n type: \"string\",\n description: \"Corpus name\",\n default: \"default\",\n },\n path: {\n alias: \"p\",\n type: \"string\",\n description: \"Destination path prefix in corpus\",\n },\n interactive: {\n type: \"boolean\",\n description:\n \"Enable interactive prompts (use --no-interactive to disable)\",\n default: true,\n },\n },\n handler: async (argv) => {\n let onSigint: (() => void) | null = null;\n const controller = new AbortController();\n try {\n const inputDir = argv.dir as string;\n const dir = resolve(inputDir);\n if (!existsSync(dir) || !statSync(dir).isDirectory()) {\n consola.error(`Not a directory: ${theme.primary(inputDir)}`);\n process.exit(1);\n }\n\n // First Ctrl-C should terminate quickly. We still abort to stop SSE streams.\n let interrupted = false;\n onSigint = () => {\n if (interrupted) process.exit(130);\n interrupted = true;\n controller.abort();\n process.exit(130);\n };\n process.on(\"SIGINT\", onSigint);\n\n const client = await Client.connect(controller.signal);\n\n keepServerAlive(client, controller.signal);\n\n const interactive =\n (argv as any).interactive !== false &&\n process.stdin.isTTY &&\n process.stdout.isTTY;\n\n const corpora = await client.corpus.list().then(Client.unwrap);\n const corpusOptions = (corpora as any[])\n .map((c) => {\n const name = c.name as string;\n const noteCount =\n typeof c.noteCount === \"number\" ? c.noteCount : null;\n return {\n label: name,\n value: name,\n hint: noteCount == null ? undefined : `${noteCount} notes`,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n\n const CREATE = \"__create_corpus__\";\n const corpusPickerOptions = [\n ...corpusOptions,\n { label: \"Create new corpus...\", value: CREATE, hint: \"new\" },\n ];\n\n const defaultCorpusName = String((argv as any).corpus ?? \"default\");\n const initialCorpus = corpusOptions.some(\n (o) => o.value === defaultCorpusName,\n )\n ? defaultCorpusName\n : corpusOptions[0]?.value;\n\n // Defaults from CLI flags\n const cliPath =\n typeof (argv as any).path === \"string\" ? (argv as any).path : \"\";\n const cliGlob =\n typeof (argv as any).glob === \"string\" ? (argv as any).glob : undefined;\n const cliMask =\n typeof (argv as any).mask === \"string\" ? (argv as any).mask : undefined;\n\n let corpusName = initialCorpus ?? \"default\";\n const defaultDestPrefix = cliPath || basename(inputDir) || inputDir;\n let destPrefix = defaultDestPrefix;\n\n let mask = cliMask ?? (cliGlob ? cliGlob.replace(/^\\*\\*\\//, \"\") : \"\");\n if (!mask) {\n const counts = await extensionCounts(dir);\n mask = pickDefaultMask(counts);\n }\n\n if (interactive) {\n prompts.intro(`${theme.dim(\"spall\")} ${theme.primary(\"sync\")}`);\n\n const pickedCorpus = await prompts.autocomplete<string>({\n message: \"Select a corpus\",\n options: corpusPickerOptions,\n placeholder: \"Type to filter...\",\n maxItems: 12,\n initialValue: corpusName,\n });\n if (prompts.isCancel(pickedCorpus)) {\n controller.abort();\n prompts.outro(\"Cancelled\");\n return;\n }\n if (String(pickedCorpus) === CREATE) {\n const name = await prompts.text({\n message: \"New corpus name\",\n initialValue: basename(inputDir) || \"docs\",\n validate: (s) =>\n s && s.trim().length > 0 ? undefined : \"Required\",\n });\n if (prompts.isCancel(name)) {\n controller.abort();\n prompts.outro(\"Cancelled\");\n return;\n }\n corpusName = String(name).trim();\n await client.corpus.create({ name: corpusName }).then(Client.unwrap);\n } else {\n corpusName = String(pickedCorpus);\n }\n\n const pickedPath = await prompts.text({\n message: \"Destination path prefix\",\n placeholder: \"(e.g. ai-gateway)\",\n initialValue: destPrefix,\n });\n if (prompts.isCancel(pickedPath)) {\n controller.abort();\n prompts.outro(\"Cancelled\");\n return;\n }\n destPrefix = String(pickedPath ?? \"\");\n\n const pickedMask = await prompts.text({\n message: \"File mask\",\n placeholder: \"(e.g. *.mdx)\",\n initialValue: mask,\n });\n if (prompts.isCancel(pickedMask)) {\n controller.abort();\n prompts.outro(\"Cancelled\");\n return;\n }\n mask = String(pickedMask ?? \"\");\n }\n\n const corpus = await client.corpus\n .get({ name: corpusName })\n .catch(() => {\n consola.error(\n `Corpus not found: ${theme.command(String(corpusName))}`,\n );\n process.exit(1);\n })\n .then(Client.unwrap);\n\n const globPattern = cliGlob ?? `**/${mask || \"*.md\"}`;\n const { count: fileCount, first: firstFile } = await countFiles(\n dir,\n globPattern,\n );\n\n if (interactive) {\n const prefixLabel = canonicalize(destPrefix) || \"(root)\";\n const msg = `Syncing ${theme.code(String(fileCount))} files under ${theme.dim(prefixLabel)}${theme.dim(\"/\")} in corpus ${theme.primary(corpusName)}`;\n\n const ok = await prompts.confirm({ message: msg, initialValue: true });\n if (prompts.isCancel(ok) || ok === false) {\n controller.abort();\n prompts.outro(\"Cancelled\");\n return;\n }\n }\n\n const handleModelEvent = (() => {\n const base = createModelProgressHandler();\n return (event: any) => {\n switch (event?.tag) {\n case \"model.load\":\n prompts.log.info(\n `Loading model ${theme.primary(event.info.name)}`,\n );\n return;\n case \"model.download\":\n prompts.log.info(\n `Downloading model ${theme.primary(event.info.name)}`,\n );\n return;\n case \"model.downloaded\":\n prompts.log.success(\n `Downloaded ${theme.primary(event.info.name)}`,\n );\n return;\n case \"model.progress\":\n return;\n default:\n return base(event);\n }\n };\n })();\n\n let scanTotal = 0;\n let scanProcessed = 0;\n let scanProgress: prompts.ProgressResult | null = null;\n let embedTotalBytes = 0;\n let embedTotalFiles = 0;\n let embedStartTime = 0;\n let embedBytesProcessed = 0;\n let embedProgress: prompts.ProgressResult | null = null;\n let ftsSpinner: ReturnType<typeof prompts.spinner> | null = null;\n let ftsActive = false;\n\n const { stream } = await (client.sse.note.sync as any)(\n {\n directory: dir,\n glob: globPattern,\n corpus: corpus.id,\n path: destPrefix,\n },\n { signal: controller.signal },\n );\n\n for await (const event of stream as AsyncGenerator<any>) {\n if (event?.tag === \"error\") {\n const e = event.error;\n const msg = e?.message ?? String(e ?? \"unknown error\");\n const code = e?.code ? `${e.code}: ` : \"\";\n consola.error(code + msg);\n process.exit(1);\n }\n\n handleModelEvent(event);\n\n switch (event?.tag) {\n case \"scan.start\":\n scanTotal = event.numFiles;\n scanProgress = prompts.progress({\n max: Math.max(1, scanTotal),\n indicator: \"timer\",\n });\n scanProgress.start(\n `Scanning ${theme.primary(dir)} (${theme.primary(String(scanTotal))} files)`,\n );\n break;\n case \"scan.progress\": {\n scanProcessed++;\n scanProgress?.advance(1, `Scanning ${scanProcessed}/${scanTotal}`);\n break;\n }\n case \"scan.done\":\n scanProgress?.stop(\n `Scan done (added: ${event.added}, modified: ${event.modified}, removed: ${event.removed}, ok: ${event.ok})`,\n );\n scanProgress = null;\n break;\n case \"embed.start\":\n embedTotalFiles = event.numFiles;\n embedTotalBytes = event.numBytes;\n embedStartTime = performance.now();\n embedBytesProcessed = 0;\n const sizeStr =\n embedTotalBytes >= 1024 * 1024\n ? `${(embedTotalBytes / (1024 * 1024)).toFixed(1)} MB`\n : embedTotalBytes >= 1024\n ? `${(embedTotalBytes / 1024).toFixed(1)} KB`\n : `${embedTotalBytes} B`;\n embedProgress = prompts.progress({\n max: Math.max(1, embedTotalBytes),\n indicator: \"timer\",\n });\n embedProgress.start(\n `Embedding ${event.numChunks} chunks from ${event.numFiles} files ${pc.dim(`(${sizeStr})`)}`,\n );\n break;\n case \"embed.progress\": {\n const delta = Math.max(\n 0,\n event.numBytesProcessed - embedBytesProcessed,\n );\n embedBytesProcessed = event.numBytesProcessed;\n\n const percent = embedTotalBytes\n ? (event.numBytesProcessed / embedTotalBytes) * 100\n : 0;\n const percentStr = percent.toFixed(0).padStart(3);\n const elapsed = (performance.now() - embedStartTime) / 1000;\n const bps = elapsed > 0 ? event.numBytesProcessed / elapsed : 0;\n const bpsStr =\n bps >= 1024 * 1024\n ? `${(bps / (1024 * 1024)).toFixed(1)} MB/s`\n : bps >= 1024\n ? `${(bps / 1024).toFixed(1)} KB/s`\n : `${bps.toFixed(0)} B/s`;\n\n embedProgress?.advance(\n delta,\n `${pc.bold(percentStr + \"%\")} ${event.numFilesProcessed}/${embedTotalFiles} ${pc.dim(`(${bpsStr})`)}`,\n );\n break;\n }\n case \"embed.cancel\": {\n embedProgress?.stop(\n `CANCELLED ${event.numFilesProcessed}/${embedTotalFiles}`,\n );\n embedProgress = null;\n prompts.log.warn(\"Index cancelled\");\n break;\n }\n case \"embed.done\":\n embedProgress?.stop(\"Index complete\");\n embedProgress = null;\n break;\n case \"fts.start\":\n ftsActive = true;\n ftsSpinner = prompts.spinner({ indicator: \"timer\" });\n ftsSpinner.start(\"Indexing text (FTS)\");\n break;\n case \"fts.done\":\n if (ftsActive) {\n ftsActive = false;\n ftsSpinner?.stop(\"FTS index updated\");\n ftsSpinner = null;\n }\n break;\n }\n }\n if (onSigint) process.off(\"SIGINT\", onSigint);\n } catch (e: any) {\n if (onSigint) process.off(\"SIGINT\", onSigint);\n const msg = e?.message ?? String(e ?? \"Unknown error\");\n if (process.stdin.isTTY && process.stdout.isTTY) {\n prompts.log.error(msg);\n prompts.outro(\"Done\");\n } else {\n consola.error(msg);\n }\n process.exit(1);\n } finally {\n // Ensure background /events stream is cancelled so we can exit.\n controller.abort();\n }\n },\n};\n",
|
|
25
|
+
"import { db } from \"@spader/spall-tui/store\";\nimport type { CommandDef } from \"@spader/spall-cli/shared\";\n\nexport const tui: CommandDef = {\n description: \"Launch the interactive TUI\",\n handler: async () => {\n db.init();\n\n await import(\"@opentui/solid/preload\");\n const { tui } = await import(\"@spader/spall-tui/app\");\n await tui({ repoPath: process.cwd() });\n },\n};\n",
|
|
26
|
+
"import { type CommandDef, displayResults, Vsearch } from \"@spader/spall-cli/shared\";\n\nfunction rgb(r: number, g: number, b: number): (s: string) => string {\n return (s: string) => `\\x1b[38;2;${r};${g};${b}m${s}\\x1b[39m`;\n}\n\nfunction hsvToRgb(h: number, s: number, v: number): [number, number, number] {\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n let r = 0,\n g = 0,\n b = 0;\n if (h < 60) [r, g, b] = [c, x, 0];\n else if (h < 120) [r, g, b] = [x, c, 0];\n else if (h < 180) [r, g, b] = [0, c, x];\n else if (h < 240) [r, g, b] = [0, x, c];\n else if (h < 300) [r, g, b] = [x, 0, c];\n else [r, g, b] = [c, 0, x];\n return [\n Math.round((r + m) * 255),\n Math.round((g + m) * 255),\n Math.round((b + m) * 255),\n ];\n}\n\nfunction heatColor(score: number): (s: string) => string {\n const shifted = (score - 0.5) / 0.35;\n const t = Math.max(0, Math.min(1, shifted));\n const sat = t * t;\n const [r, g, b] = hsvToRgb(140, sat, 0.85);\n return rgb(r, g, b);\n}\n\nexport const vsearch: CommandDef = {\n summary: Vsearch.summary,\n description: Vsearch.description(\"spall\"),\n positionals: Vsearch.positionals,\n options: {\n ...Vsearch.options,\n output: {\n alias: \"o\",\n type: \"string\",\n description: \"Output format: table | json | tree | list\",\n default: \"table\",\n },\n },\n handler: async (argv) => {\n const out = String(argv.output ?? \"table\");\n\n const { results } = await Vsearch.run({\n query: argv.query,\n corpus: (argv as any).corpus,\n path: argv.path,\n limit: argv.limit,\n tracked: false,\n });\n\n const scoreMap = new Map(\n results.map((r: any, i: number) => [i, r.score as number]),\n );\n\n displayResults(results, {\n output: out,\n empty: \"(no matches)\",\n path: (r: any) => r.path,\n id: (r: any) => String(r.id),\n preview: (r: any) => Vsearch.collapseWhitespace(r.chunk),\n extraColumns: [\n {\n header: \"score\",\n value: (r: any) => r.score.toFixed(3),\n flex: 0,\n noTruncate: true,\n format: (s, row) => heatColor(scoreMap.get(row) ?? 0)(s),\n },\n ],\n });\n },\n};\n",
|
|
27
|
+
"import consola from \"consola\";\nimport { type CommandDef, Status } from \"@spader/spall-cli/shared\";\n\nexport const status: CommandDef = {\n summary: Status.summary,\n description: Status.description,\n handler: async () => {\n const result = await Status.run();\n\n if (\"error\" in result) {\n consola.error(\"Failed to list corpora:\", result.error);\n process.exit(1);\n }\n\n Status.print(result, { highlightWorkspace: true });\n },\n};\n"
|
|
28
|
+
],
|
|
29
|
+
"mappings": "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",
|
|
30
|
+
"debugId": "C1C86137F67474C864756E2164756E21",
|
|
31
|
+
"names": []
|
|
32
|
+
}
|