docz-cli 0.5.0 → 0.6.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts","../src/config.ts","../src/commands.ts"],"sourcesContent":["/**\n * DocSync API Client\n *\n * DocSync 底层是 Git 仓库,每个 Space = 一个 Git repo。\n * 认证:Authorization: Bearer {token}(支持 JWT 和永久 API Token)。\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface Space {\n id: string;\n name: string;\n slug?: string;\n owner_id: string;\n is_private: boolean;\n created_at: string;\n member_count: number;\n}\n\nexport interface TreeEntry {\n name: string;\n type: 'blob' | 'tree';\n size: number;\n}\n\nexport interface LogEntry {\n hash: string;\n author: string;\n message: string;\n date: string;\n num_files: number;\n}\n\nexport interface TrashEntry {\n path: string;\n deleted_by: string;\n deleted_at: string;\n commit: string;\n}\n\nexport interface User {\n id: string;\n email: string;\n name: string;\n is_admin: boolean;\n is_active: boolean;\n created_at: string;\n}\n\nexport interface ShareLink {\n id: string;\n token: string;\n space_id: string;\n file_path: string;\n created_by: string;\n created_by_name?: string;\n created_by_email?: string;\n expires_at: string | null;\n created_at: string;\n user_ids?: string[];\n group_ids?: string[];\n}\n\nexport interface ShareFileInfo {\n file_path: string;\n file_name: string;\n space_name: string;\n created_by_name: string;\n expires_at: string | null;\n}\n\nexport interface DiffResponse {\n from: string;\n to: string;\n path: string;\n diff: string;\n old_body: string;\n new_body: string;\n}\n\nexport interface DiffFileEntry {\n path: string;\n status: string;\n}\n\nexport interface DiffSummary {\n from: string;\n to: string;\n files: DiffFileEntry[];\n}\n\nexport interface FileRef {\n id: string;\n space_id: string;\n path: string;\n}\n\nexport interface CatResult {\n content: string;\n ref: string;\n}\n\nexport interface SaveResult {\n path: string;\n ref: string;\n}\n\nexport interface SaveConflict {\n error: 'conflict';\n current_ref: string;\n path: string;\n}\n\nexport interface Comment {\n id: number;\n space_id: string;\n file_path: string;\n comment_type: string;\n target_type: string;\n target_selector: string;\n target_content: string;\n content: string;\n user_id: string;\n user_name: string;\n user_email: string;\n is_closed: boolean;\n created_at: string;\n updated_at: string;\n replies: CommentReply[];\n}\n\nexport interface CommentReply {\n id: number;\n comment_id: number;\n content: string;\n user_id: string;\n user_name: string;\n user_email: string;\n created_at: string;\n updated_at: string;\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport class ConflictError extends Error {\n constructor(public readonly detail: SaveConflict) {\n super(\n 'Conflict: file has been modified by others. Please re-read the latest content and re-apply your changes.'\n );\n this.name = 'ConflictError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Client\n// ---------------------------------------------------------------------------\n\nexport class DocSyncClient {\n constructor(\n private baseUrl: string,\n private token: string\n ) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${this.token}`,\n ...init?.headers,\n },\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n throw new Error(`${res.status} ${res.statusText}: ${body}`.trim());\n }\n\n const ct = res.headers.get('content-type') ?? '';\n if (ct.includes('application/json')) return res.json() as Promise<T>;\n return res.text() as unknown as T;\n }\n\n // --- Auth ---\n async me(): Promise<User> {\n return this.request('/api/auth/me');\n }\n\n // --- Spaces ---\n async listSpaces(): Promise<Space[]> {\n return this.request('/api/spaces');\n }\n\n async resolveSpace(nameOrId: string): Promise<Space> {\n const spaces = await this.listSpaces();\n const s = spaces.find(\n (s) =>\n s.id === nameOrId ||\n s.name === nameOrId ||\n s.name.toLowerCase() === nameOrId.toLowerCase()\n );\n if (!s) {\n const available = spaces.map((s) => s.name).join(', ');\n throw new Error(`Space \"${nameOrId}\" not found. Available: ${available}`);\n }\n return s;\n }\n\n // --- Tree ---\n async ls(spaceId: string, path = ''): Promise<TreeEntry[]> {\n return this.request(\n `/api/spaces/${spaceId}/tree?path=${encodeURIComponent(path)}`\n );\n }\n\n async treeFull(spaceId: string): Promise<TreeEntry[]> {\n return this.request(`/api/spaces/${spaceId}/tree/full`);\n }\n\n // --- Blob ---\n async cat(spaceId: string, filepath: string): Promise<string> {\n return this.request(\n `/api/spaces/${spaceId}/blob/${encodeURIComponent(filepath)}`\n );\n }\n\n async catWithRef(spaceId: string, filepath: string): Promise<CatResult> {\n const res = await fetch(\n `${this.baseUrl}/api/spaces/${spaceId}/blob/${encodeURIComponent(filepath)}`,\n { headers: { Authorization: `Bearer ${this.token}` } }\n );\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n throw new Error(`${res.status} ${res.statusText}: ${body}`.trim());\n }\n const content = await res.text();\n const ref = res.headers.get('X-Git-Ref') ?? '';\n return { content, ref };\n }\n\n // --- Write ---\n async upload(\n spaceId: string,\n dir: string,\n filename: string,\n content: string | Buffer\n ): Promise<{ path: string }> {\n const blob =\n typeof content === 'string'\n ? new Blob([content], { type: 'application/octet-stream' })\n : new Blob([content], { type: 'application/octet-stream' });\n const form = new FormData();\n form.append('file', blob, filename);\n form.append('path', dir);\n return this.request(`/api/spaces/${spaceId}/files/upload`, {\n method: 'POST',\n body: form,\n });\n }\n\n async save(\n spaceId: string,\n path: string,\n content: string,\n opts?: { baseRef?: string; message?: string }\n ): Promise<SaveResult> {\n const body: Record<string, string> = { path, content };\n if (opts?.baseRef) body.base_ref = opts.baseRef;\n if (opts?.message) body.message = opts.message;\n\n const res = await fetch(\n `${this.baseUrl}/api/spaces/${spaceId}/files/save`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n );\n\n if (res.status === 409) {\n const data = (await res.json()) as SaveConflict;\n throw new ConflictError(data);\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`${res.status} ${res.statusText}: ${text}`.trim());\n }\n\n return res.json() as Promise<SaveResult>;\n }\n\n async mkdir(spaceId: string, path: string): Promise<void> {\n await this.request(`/api/spaces/${spaceId}/files/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(spaceId: string, path: string): Promise<void> {\n await this.request(`/api/spaces/${spaceId}/files/delete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path }),\n });\n }\n\n async mv(spaceId: string, from: string, to: string): Promise<void> {\n await this.request(`/api/spaces/${spaceId}/files/rename`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ old_path: from, new_path: to }),\n });\n }\n\n async rollback(\n spaceId: string,\n filePath: string,\n commitHash: string\n ): Promise<void> {\n await this.request(`/api/spaces/${spaceId}/files/rollback`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ file_path: filePath, commit_hash: commitHash }),\n });\n }\n\n // --- History ---\n async log(spaceId: string, filepath?: string): Promise<LogEntry[]> {\n const path = filepath\n ? `/api/spaces/${spaceId}/log/${encodeURIComponent(filepath)}`\n : `/api/spaces/${spaceId}/log/`;\n return this.request(path);\n }\n\n // --- Trash ---\n async trash(spaceId: string): Promise<TrashEntry[]> {\n return this.request(`/api/spaces/${spaceId}/trash`);\n }\n\n async restore(spaceId: string, path: string, commit: string): Promise<void> {\n await this.request(`/api/spaces/${spaceId}/trash/restore`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path, commit }),\n });\n }\n\n // --- Comments ---\n async listComments(spaceId: string, filePath: string): Promise<Comment[]> {\n return this.request(\n `/api/spaces/${spaceId}/comments?path=${encodeURIComponent(filePath)}`\n );\n }\n\n async createComment(\n spaceId: string,\n filePath: string,\n content: string\n ): Promise<Comment> {\n return this.request(`/api/spaces/${spaceId}/comments`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ file_path: filePath, content }),\n });\n }\n\n async replyComment(\n spaceId: string,\n commentId: number,\n content: string\n ): Promise<CommentReply> {\n return this.request(\n `/api/spaces/${spaceId}/comments/${commentId}/replies`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ content }),\n }\n );\n }\n\n async closeComment(spaceId: string, commentId: number): Promise<Comment> {\n return this.request(`/api/spaces/${spaceId}/comments/${commentId}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ is_closed: true }),\n });\n }\n\n async deleteComment(spaceId: string, commentId: number): Promise<void> {\n await this.request(`/api/spaces/${spaceId}/comments/${commentId}`, {\n method: 'DELETE',\n });\n }\n\n // --- Share Links ---\n async createShareLink(\n spaceId: string,\n filePath: string,\n opts?: { expiresAt?: string; userIds?: string[]; groupIds?: string[] }\n ): Promise<ShareLink> {\n const body: Record<string, unknown> = { file_path: filePath };\n if (opts?.expiresAt) body.expires_at = opts.expiresAt;\n if (opts?.userIds?.length) body.user_ids = opts.userIds;\n if (opts?.groupIds?.length) body.group_ids = opts.groupIds;\n return this.request(`/api/spaces/${spaceId}/share-links`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n }\n\n async listShareLinks(\n spaceId: string,\n filePath?: string\n ): Promise<ShareLink[]> {\n const q = filePath ? `?file_path=${encodeURIComponent(filePath)}` : '';\n return this.request(`/api/spaces/${spaceId}/share-links${q}`);\n }\n\n async updateShareLink(\n spaceId: string,\n linkId: string,\n opts: { expiresAt?: string; userIds?: string[]; groupIds?: string[] }\n ): Promise<ShareLink> {\n const body: Record<string, unknown> = {};\n if (opts.expiresAt !== undefined) body.expires_at = opts.expiresAt;\n if (opts.userIds) body.user_ids = opts.userIds;\n if (opts.groupIds) body.group_ids = opts.groupIds;\n return this.request(`/api/spaces/${spaceId}/share-links/${linkId}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n }\n\n async deleteShareLink(spaceId: string, linkId: string): Promise<void> {\n await this.request(`/api/spaces/${spaceId}/share-links/${linkId}`, {\n method: 'DELETE',\n });\n }\n\n async getSharedFile(token: string): Promise<string> {\n return this.request(`/api/share/${token}`);\n }\n\n async getSharedFileInfo(token: string): Promise<ShareFileInfo> {\n return this.request(`/api/share/${token}/info`);\n }\n\n // --- Diff ---\n async diffFile(\n spaceId: string,\n filePath: string,\n to: string,\n from?: string\n ): Promise<DiffResponse> {\n const params = new URLSearchParams({ to });\n if (from) params.set('from', from);\n return this.request(\n `/api/spaces/${spaceId}/diff/${encodeURIComponent(filePath)}?${params}`\n );\n }\n\n async diffSummary(\n spaceId: string,\n to: string,\n from?: string\n ): Promise<DiffSummary> {\n const params = new URLSearchParams({ to });\n if (from) params.set('from', from);\n return this.request(`/api/spaces/${spaceId}/diff?${params}`);\n }\n\n // --- File Ref ---\n async getFileRef(\n spaceId: string,\n path: string\n ): Promise<{\n id: string;\n space_id: string;\n slug: string;\n path: string;\n is_dir: boolean;\n url: string;\n }> {\n return this.request(\n `/api/spaces/${spaceId}/file-ref?path=${encodeURIComponent(path)}`\n );\n }\n\n // --- Resolve short URLs ---\n async resolveBySlug(slug: string): Promise<Space> {\n return this.request(`/api/spaces/by-slug/${encodeURIComponent(slug)}`);\n }\n\n async resolveFileRef(fileId: string): Promise<FileRef> {\n return this.request(`/api/file-refs/${encodeURIComponent(fileId)}`);\n }\n}\n","/**\n * 配置管理\n *\n * 优先级:环境变量 > ~/.docz/config.json\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst CONFIG_DIR = join(homedir(), '.docz');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\n\ninterface Config {\n base_url?: string;\n token?: string;\n}\n\nfunction readConfig(): Config {\n if (!existsSync(CONFIG_FILE)) return {};\n try {\n return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction writeConfig(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n');\n}\n\nexport function getBaseUrl(): string {\n return (\n process.env.DOCSYNC_BASE_URL ??\n readConfig().base_url ??\n 'https://docz.zhenguanyu.com'\n );\n}\n\nexport function getToken(): string | undefined {\n return process.env.DOCSYNC_API_TOKEN ?? readConfig().token;\n}\n\nexport function saveConfig(baseUrl: string, token: string): void {\n writeConfig({ base_url: baseUrl, token });\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n","/**\n * CLI Commands\n */\n\nimport { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { ConflictError, DocSyncClient } from './client.js';\nimport { getBaseUrl, getConfigPath, getToken, saveConfig } from './config.js';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getClient(): DocSyncClient {\n const token = getToken();\n if (!token) {\n console.error(\n 'Error: No token configured.\\n' +\n 'Run `docz login` or set DOCSYNC_API_TOKEN environment variable.'\n );\n process.exit(1);\n }\n return new DocSyncClient(getBaseUrl(), token);\n}\n\n/** Parse \"space:path\" or \"space path\" format */\nfunction parseTarget(args: string[]): { space: string; path: string } {\n if (args.length === 0) {\n console.error(\n 'Error: space is required. Usage: docz <cmd> <space>[:<path>]'\n );\n process.exit(1);\n }\n const first = args[0];\n if (first.includes(':')) {\n const [space, ...rest] = first.split(':');\n return { space, path: rest.join(':') };\n }\n return { space: first, path: args.slice(1).join(' ') };\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// Short URL patterns: /s/{slug}/f/{fileId} or /s/{slug}\nconst SHORT_URL_RE = /\\/s\\/([^/]+)\\/f\\/([^/?\\s]+)/;\nconst SLUG_ONLY_RE = /\\/s\\/([^/?\\s]+)\\/?(?:\\?.*)?$/;\n// Share URL: /share/{token}\nconst SHARE_URL_RE = /\\/share\\/([^/?\\s]+)/;\n\n/**\n * Detect if input is a URL and resolve it to { spaceId, path }.\n * Returns null if not a URL.\n */\nasync function resolveUrl(\n client: DocSyncClient,\n input: string\n): Promise<{ spaceId: string; path: string } | null> {\n // Match /s/{slug}/f/{fileId}\n const fileMatch = input.match(SHORT_URL_RE);\n if (fileMatch) {\n const [, slug, fileId] = fileMatch;\n const space = await resolveSlug(client, slug);\n const ref = await client.resolveFileRef(fileId);\n return { spaceId: space.id, path: ref.path };\n }\n // Match /s/{slug} (directory listing)\n const slugMatch = input.match(SLUG_ONLY_RE);\n if (slugMatch) {\n const [, slug] = slugMatch;\n const space = await resolveSlug(client, slug);\n return { spaceId: space.id, path: '' };\n }\n return null;\n}\n\n/** Resolve slug: try local spaces cache first, then API */\nasync function resolveSlug(\n client: DocSyncClient,\n slug: string\n): Promise<{ id: string }> {\n try {\n const spaces = await client.listSpaces();\n const found = spaces.find((s) => s.slug === slug);\n if (found) return found;\n } catch {\n // fall through to by-slug API\n }\n return client.resolveBySlug(slug);\n}\n\n/**\n * Resolve target: if it's a short URL, resolve it; otherwise use parseTarget + resolveSpace.\n */\nasync function resolveTarget(\n client: DocSyncClient,\n args: string[]\n): Promise<{ spaceId: string; path: string }> {\n const first = args[0];\n if (first && (first.startsWith('http://') || first.startsWith('https://'))) {\n const result = await resolveUrl(client, first);\n if (result) return result;\n }\n const { space, path } = parseTarget(args);\n const s = await client.resolveSpace(space);\n return { spaceId: s.id, path };\n}\n\n/** Parse relative duration (7d, 24h, 30d) to RFC3339 */\nexport function parseExpires(value: string): string {\n const match = value.match(/^(\\d+)([dh])$/);\n if (!match)\n throw new Error(\n `Invalid expires format: \"${value}\". Use e.g. 7d, 24h, 30d`\n );\n const [, num, unit] = match;\n const ms = unit === 'd' ? Number(num) * 86400000 : Number(num) * 3600000;\n return new Date(Date.now() + ms).toISOString();\n}\n\n/** Extract share token from URL or return as-is */\nfunction extractShareToken(input: string): string {\n const m = input.match(SHARE_URL_RE);\n if (m) return m[1];\n return input;\n}\n\n/** Read all of stdin into a string */\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString('utf-8');\n}\n\nconst MAX_SAVE_SIZE = 2 * 1024 * 1024; // 2MB\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nexport function registerCommands(program: Command): void {\n // --- login ---\n program\n .command('login')\n .description('Configure DocSync credentials')\n .option('-u, --url <url>', 'DocSync server URL')\n .option('-t, --token <token>', 'API token')\n .action(async (opts) => {\n const url = opts.url ?? getBaseUrl();\n const token = opts.token;\n if (!token) {\n console.error(\n 'Error: --token is required.\\n' +\n 'Get one at: ' +\n url +\n ' → Settings → API Tokens'\n );\n process.exit(1);\n }\n const client = new DocSyncClient(url, token);\n try {\n const user = await client.me();\n saveConfig(url, token);\n console.log(`Logged in as ${user.name} (${user.email})`);\n console.log(`Config saved to ${getConfigPath()}`);\n } catch (err) {\n console.error(\n `Error: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n });\n\n // --- whoami ---\n program\n .command('whoami')\n .description('Show current user')\n .action(async () => {\n const client = getClient();\n const user = await client.me();\n console.log(`${user.name} (${user.email})`);\n });\n\n // --- spaces ---\n program\n .command('spaces')\n .description('List all accessible spaces')\n .action(async () => {\n const client = getClient();\n const spaces = await client.listSpaces();\n for (const s of spaces) {\n const tag = s.is_private ? 'private' : 'team';\n console.log(`${s.name}\\t${tag}\\t${s.member_count} members\\t${s.id}`);\n }\n });\n\n // --- ls ---\n program\n .command('ls')\n .description('List files — docz ls <space>[:<path>] or <url>')\n .argument('<target...>')\n .option('-R, --recursive', 'Recursively list all files')\n .action(async (args: string[], opts: { recursive?: boolean }) => {\n const client = getClient();\n const { spaceId, path } = await resolveTarget(client, args);\n const entries = opts.recursive\n ? await client.treeFull(spaceId)\n : await client.ls(spaceId, path);\n if (entries.length === 0) {\n console.log('(empty)');\n return;\n }\n for (const e of entries) {\n if (e.type === 'tree') {\n console.log(`${e.name}/`);\n } else {\n console.log(`${e.name}\\t${formatSize(e.size)}`);\n }\n }\n });\n\n // --- cat ---\n program\n .command('cat')\n .description('Read file content — docz cat <space>:<path> or <url>')\n .argument('<target...>')\n .option('--ref', 'Also output Git ref to stderr')\n .action(async (args: string[], opts: { ref?: boolean }) => {\n const client = getClient();\n const { spaceId, path } = await resolveTarget(client, args);\n if (!path) {\n console.error(\n 'Error: file path is required. Usage: docz cat <space>:<path>'\n );\n process.exit(1);\n }\n if (opts.ref) {\n const result = await client.catWithRef(spaceId, path);\n console.error(`ref: ${result.ref}`);\n process.stdout.write(result.content);\n } else {\n const content = await client.cat(spaceId, path);\n process.stdout.write(content);\n }\n });\n\n // --- upload ---\n program\n .command('upload')\n .description('Upload file — docz upload <local-file> <space>[:<dir>]')\n .argument('<file>', 'Local file to upload')\n .argument('<target...>')\n .action(async (file: string, args: string[]) => {\n const { space, path: dir } = parseTarget(args);\n const client = getClient();\n const s = await client.resolveSpace(space);\n const content = readFileSync(file);\n const filename = basename(file);\n const targetDir = dir || '';\n const result = await client.upload(s.id, targetDir, filename, content);\n console.log(`Uploaded: ${result.path}`);\n });\n\n // --- write ---\n program\n .command('write')\n .description('Write content to file — docz write <space>:<path> <content>')\n .argument('<target>', 'space:dir/filename.md')\n .argument('<content>', 'File content (or - for stdin)')\n .option('--force', 'Skip conflict detection')\n .option('-m, --message <msg>', 'Custom commit message')\n .action(\n async (\n target: string,\n content: string,\n opts: { force?: boolean; message?: string }\n ) => {\n const { space, path } = parseTarget([target]);\n if (!path) {\n console.error(\n 'Error: path is required. Usage: docz write <space>:<dir/filename> <content>'\n );\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n const body = content === '-' ? await readStdin() : content;\n\n if (Buffer.byteLength(body, 'utf-8') > MAX_SAVE_SIZE) {\n console.error(\n 'Error: content exceeds 2MB limit. Use `docz upload` for large files.'\n );\n process.exit(1);\n }\n\n let baseRef: string | undefined;\n if (!opts.force) {\n try {\n const existing = await client.catWithRef(s.id, path);\n baseRef = existing.ref;\n } catch (err) {\n const msg = err instanceof Error ? err.message : '';\n if (!msg.includes('404')) throw err;\n }\n }\n\n try {\n const result = await client.save(s.id, path, body, {\n baseRef,\n message: opts.message,\n });\n console.log(`Written: ${result.path} (ref: ${result.ref})`);\n } catch (err) {\n if (err instanceof ConflictError) {\n console.error(\n 'Error: file was modified by someone else. Please re-read the latest content and try again.'\n );\n process.exit(1);\n }\n throw err;\n }\n }\n );\n\n // --- mkdir ---\n program\n .command('mkdir')\n .description('Create folder — docz mkdir <space>:<path>')\n .argument('<target...>')\n .action(async (args: string[]) => {\n const { space, path } = parseTarget(args);\n if (!path) {\n console.error('Error: path is required.');\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n await client.mkdir(s.id, path);\n console.log(`Created: ${path}`);\n });\n\n // --- rm ---\n program\n .command('rm')\n .description('Delete file/folder — docz rm <space>:<path>')\n .argument('<target...>')\n .action(async (args: string[]) => {\n const { space, path } = parseTarget(args);\n if (!path) {\n console.error('Error: path is required.');\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n await client.rm(s.id, path);\n console.log(`Deleted: ${path} (recoverable from trash for 30 days)`);\n });\n\n // --- mv ---\n program\n .command('mv')\n .description('Rename/move — docz mv <space>:<from> <to>')\n .argument('<target>', 'space:old-path')\n .argument('<to>', 'new-path')\n .action(async (target: string, to: string) => {\n const { space, path: from } = parseTarget([target]);\n if (!from) {\n console.error('Error: source path is required.');\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n await client.mv(s.id, from, to);\n console.log(`Moved: ${from} → ${to}`);\n });\n\n // --- log ---\n program\n .command('log')\n .description('Show change history — docz log <space>[:<path>] or <url>')\n .argument('<target...>')\n .action(async (args: string[]) => {\n const client = getClient();\n const { spaceId, path } = await resolveTarget(client, args);\n const logs = await client.log(spaceId, path || undefined);\n if (logs.length === 0) {\n console.log('No history.');\n return;\n }\n for (const l of logs) {\n console.log(`${l.hash} ${l.date} ${l.message}`);\n }\n });\n\n // --- rollback ---\n program\n .command('rollback')\n .description(\n 'Rollback file to a previous version — docz rollback <space>:<path> <commit>'\n )\n .argument('<target>', 'space:path')\n .argument('<commit>', 'Commit hash to rollback to')\n .action(async (target: string, commit: string) => {\n const { space, path } = parseTarget([target]);\n if (!path) {\n console.error('Error: file path is required.');\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n await client.rollback(s.id, path, commit);\n console.log(`Rolled back: ${path} → ${commit.substring(0, 7)}`);\n });\n\n // --- trash ---\n program\n .command('trash')\n .description('Show deleted files — docz trash <space>')\n .argument('<space>')\n .action(async (spaceName: string) => {\n const client = getClient();\n const s = await client.resolveSpace(spaceName);\n const items = await client.trash(s.id);\n if (items.length === 0) {\n console.log('Trash is empty.');\n return;\n }\n for (const t of items) {\n console.log(\n `${t.path}\\tdeleted ${t.deleted_at}\\t${t.commit.substring(0, 7)}`\n );\n }\n });\n\n // --- restore ---\n program\n .command('restore')\n .description(\n 'Restore file from trash — docz restore <space>:<path> <commit>'\n )\n .argument('<target>', 'space:path')\n .argument('<commit>', 'Commit hash from trash listing')\n .action(async (target: string, commit: string) => {\n const { space, path } = parseTarget([target]);\n if (!path) {\n console.error('Error: path is required.');\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n await client.restore(s.id, path, commit);\n console.log(`Restored: ${path}`);\n });\n\n // --- comment ---\n const comment = program\n .command('comment')\n .description('Manage file comments');\n\n comment\n .command('list')\n .description('List comments — docz comment list <space>:<path>')\n .argument('<target...>')\n .action(async (args: string[]) => {\n const client = getClient();\n const { spaceId, path } = await resolveTarget(client, args);\n if (!path) {\n console.error('Error: file path is required.');\n process.exit(1);\n }\n const comments = await client.listComments(spaceId, path);\n if (comments.length === 0) {\n console.log('No comments.');\n return;\n }\n for (const c of comments) {\n const status = c.is_closed ? ' [closed]' : '';\n console.log(`#${c.id} ${c.user_name} (${c.created_at})${status}`);\n console.log(` ${c.content}`);\n for (const r of c.replies) {\n console.log(` → ${r.user_name}: ${r.content}`);\n }\n }\n });\n\n comment\n .command('add')\n .description('Add comment — docz comment add <space>:<path> <content>')\n .argument('<target>', 'space:path')\n .argument('<content>', 'Comment text (or - for stdin)')\n .action(async (target: string, content: string) => {\n const { space, path } = parseTarget([target]);\n if (!path) {\n console.error('Error: file path is required.');\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n const body = content === '-' ? await readStdin() : content;\n const c = await client.createComment(s.id, path, body);\n console.log(`Comment #${c.id} created.`);\n });\n\n comment\n .command('reply')\n .description(\n 'Reply to comment — docz comment reply <space> <commentId> <content>'\n )\n .argument('<space>')\n .argument('<commentId>')\n .argument('<content>', 'Reply text (or - for stdin)')\n .action(async (spaceName: string, commentId: string, content: string) => {\n const client = getClient();\n const s = await client.resolveSpace(spaceName);\n const body = content === '-' ? await readStdin() : content;\n const r = await client.replyComment(s.id, Number(commentId), body);\n console.log(`Reply #${r.id} created.`);\n });\n\n comment\n .command('close')\n .description('Close comment — docz comment close <space> <commentId>')\n .argument('<space>')\n .argument('<commentId>')\n .action(async (spaceName: string, commentId: string) => {\n const client = getClient();\n const s = await client.resolveSpace(spaceName);\n await client.closeComment(s.id, Number(commentId));\n console.log(`Comment #${commentId} closed.`);\n });\n\n comment\n .command('rm')\n .description('Delete comment — docz comment rm <space> <commentId>')\n .argument('<space>')\n .argument('<commentId>')\n .action(async (spaceName: string, commentId: string) => {\n const client = getClient();\n const s = await client.resolveSpace(spaceName);\n await client.deleteComment(s.id, Number(commentId));\n console.log(`Comment #${commentId} deleted.`);\n });\n\n // --- share ---\n const share = program.command('share').description('Manage share links');\n\n share\n .command('create')\n .description('Create share link — docz share create <space>:<path>')\n .argument('<target>', 'space:path')\n .option('--expires <duration>', 'Expiry duration (e.g. 7d, 24h)')\n .option('--users <emails>', 'Comma-separated user emails or IDs')\n .option('--groups <ids>', 'Comma-separated group IDs')\n .action(\n async (\n target: string,\n opts: { expires?: string; users?: string; groups?: string }\n ) => {\n const { space, path } = parseTarget([target]);\n if (!path) {\n console.error(\n 'Error: file path is required. Usage: docz share create <space>:<path>'\n );\n process.exit(1);\n }\n const client = getClient();\n const s = await client.resolveSpace(space);\n const apiOpts: {\n expiresAt?: string;\n userIds?: string[];\n groupIds?: string[];\n } = {};\n if (opts.expires) apiOpts.expiresAt = parseExpires(opts.expires);\n if (opts.users)\n apiOpts.userIds = opts.users.split(',').map((s) => s.trim());\n if (opts.groups)\n apiOpts.groupIds = opts.groups.split(',').map((s) => s.trim());\n const link = await client.createShareLink(s.id, path, apiOpts);\n const baseUrl = getBaseUrl();\n console.log('Created share link:');\n console.log(` id: ${link.id}`);\n console.log(` token: ${link.token}`);\n console.log(` url: ${baseUrl}/share/${link.token}`);\n console.log(` expires: ${link.expires_at ?? 'never'}`);\n if (link.user_ids?.length)\n console.log(` users: ${link.user_ids.join(', ')}`);\n if (link.group_ids?.length)\n console.log(` groups: ${link.group_ids.length}`);\n }\n );\n\n share\n .command('list')\n .description('List share links — docz share list <space>')\n .argument('<space>')\n .option('--file <path>', 'Filter by file path')\n .action(async (spaceName: string, opts: { file?: string }) => {\n const client = getClient();\n const s = await client.resolveSpace(spaceName);\n const links = await client.listShareLinks(s.id, opts.file);\n if (links.length === 0) {\n console.log('No share links.');\n return;\n }\n for (const l of links) {\n const expires = l.expires_at ?? 'never';\n const creator = l.created_by_name ?? l.created_by_email ?? l.created_by;\n console.log(\n `${l.id}\\t${l.token}\\t${l.file_path}\\t${expires}\\t${creator}`\n );\n }\n });\n\n share\n .command('update')\n .description('Update share link — docz share update <space> <link-id>')\n .argument('<space>')\n .argument('<linkId>')\n .option('--expires <duration>', 'New expiry duration (e.g. 30d)')\n .option('--users <emails>', 'Comma-separated user emails or IDs')\n .option('--groups <ids>', 'Comma-separated group IDs')\n .action(\n async (\n spaceName: string,\n linkId: string,\n opts: { expires?: string; users?: string; groups?: string }\n ) => {\n const client = getClient();\n const s = await client.resolveSpace(spaceName);\n const apiOpts: {\n expiresAt?: string;\n userIds?: string[];\n groupIds?: string[];\n } = {};\n if (opts.expires) apiOpts.expiresAt = parseExpires(opts.expires);\n if (opts.users)\n apiOpts.userIds = opts.users.split(',').map((s) => s.trim());\n if (opts.groups)\n apiOpts.groupIds = opts.groups.split(',').map((s) => s.trim());\n await client.updateShareLink(s.id, linkId, apiOpts);\n console.log(`Updated share link: ${linkId}`);\n }\n );\n\n share\n .command('cat')\n .description('Read shared file — docz share cat <token-or-url>')\n .argument('<token>', 'Share token or full URL')\n .option('--raw', 'Output raw content only')\n .action(async (tokenArg: string, opts: { raw?: boolean }) => {\n const client = getClient();\n const token = extractShareToken(tokenArg);\n if (!opts.raw) {\n try {\n const info = await client.getSharedFileInfo(token);\n console.log(`File: ${info.file_path} (${info.space_name})`);\n console.log(\n `Shared by: ${info.created_by_name} | Expires: ${info.expires_at ?? 'never'}`\n );\n console.log('---');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes('404')) {\n console.error(`Warning: failed to fetch share info: ${msg}`);\n }\n }\n }\n const content = await client.getSharedFile(token);\n process.stdout.write(content);\n });\n\n share\n .command('info')\n .description('Show share link info — docz share info <token-or-url>')\n .argument('<token>', 'Share token or full URL')\n .action(async (tokenArg: string) => {\n const client = getClient();\n const token = extractShareToken(tokenArg);\n const info = await client.getSharedFileInfo(token);\n console.log(`File: ${info.file_path}`);\n console.log(`Space: ${info.space_name}`);\n console.log(`Shared by: ${info.created_by_name}`);\n console.log(`Expires: ${info.expires_at ?? 'never'}`);\n });\n\n share\n .command('rm')\n .description('Delete share link — docz share rm <space> <link-id>')\n .argument('<space>')\n .argument('<linkId>')\n .action(async (spaceName: string, linkId: string) => {\n const client = getClient();\n const s = await client.resolveSpace(spaceName);\n await client.deleteShareLink(s.id, linkId);\n console.log(`Deleted share link: ${linkId}`);\n });\n\n // --- shortlink ---\n program\n .command('shortlink')\n .description('Get short URL — docz shortlink <space>:<path> or <url>')\n .argument('<target...>')\n .action(async (args: string[]) => {\n const client = getClient();\n const { spaceId, path } = await resolveTarget(client, args);\n if (!path) {\n console.error(\n 'Error: file path is required. Usage: docz shortlink <space>:<path>'\n );\n process.exit(1);\n }\n const ref = await client.getFileRef(spaceId, path);\n console.log(ref.url);\n });\n\n // --- diff ---\n program\n .command('diff')\n .description('Show changes — docz diff <space>[:<path>] <commit> [<from>]')\n .argument('<target>', 'space or space:path')\n .argument('<to>', 'Commit hash')\n .argument('[from]', 'From commit hash (default: to^)')\n .action(async (target: string, to: string, from?: string) => {\n const client = getClient();\n const { space, path } = parseTarget([target]);\n const s = await client.resolveSpace(space);\n if (path) {\n const result = await client.diffFile(s.id, path, to, from);\n if (result.diff) {\n process.stdout.write(result.diff);\n } else {\n console.log('No changes.');\n }\n } else {\n const result = await client.diffSummary(s.id, to, from);\n if (result.files.length === 0) {\n console.log('No changes.');\n return;\n }\n for (const f of result.files) {\n console.log(`${f.status} ${f.path}`);\n }\n }\n });\n}\n"],"mappings":"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","names":["s","readFileSync","readFileSync","s"]}
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  registerCommands
4
- } from "./chunk-EBJ32KUL.js";
4
+ } from "./chunk-XUT76ACQ.js";
5
5
 
6
6
  // src/index.ts
7
7
  import { Command } from "commander";
8
8
  var program = new Command();
9
- program.name("docz").description("DocSync CLI \u2014 read and write company documents").version("0.5.0");
9
+ program.name("docz").description("DocSync CLI \u2014 read and write company documents").version("0.6.0");
10
10
  registerCommands(program);
11
11
  program.command("mcp").description("Start MCP stdio server for AI agent integration").action(async () => {
12
- const { startMcpServer } = await import("./mcp-26HFT6SQ.js");
12
+ const { startMcpServer } = await import("./mcp-OHEL4DCQ.js");
13
13
  await startMcpServer();
14
14
  });
15
15
  program.parse();