getgloss 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/mcp/index.ts","../../src/cli/lifecycle.ts","../../src/shared/paths.ts","../../package.json","../../src/cli/server-client.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod/v4';\nimport { ensureServer, serverUrl } from '../cli/lifecycle';\nimport { ServerClient } from '../cli/server-client';\nimport { packageVersion } from '../shared/paths';\n\nfunction textResult(value: unknown) {\n return {\n content: [\n {\n type: 'text' as const,\n text: typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n }\n ]\n };\n}\n\nasync function client(): Promise<ServerClient> {\n const info = await ensureServer();\n return new ServerClient(serverUrl(info));\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = new McpServer({\n name: 'gloss',\n version: packageVersion\n });\n\n server.registerTool(\n 'list_pending_reviews',\n {\n title: 'List pending Gloss reviews',\n description: 'List pending local Gloss review sessions.'\n },\n async () => {\n const api = await client();\n const { reviews } = await api.listReviews();\n return textResult({ reviews: reviews.filter((review) => review.status === 'pending') });\n }\n );\n\n server.registerTool(\n 'get_review',\n {\n title: 'Get Gloss review',\n description: 'Fetch review metadata and diff payload.',\n inputSchema: { id: z.string() }\n },\n async ({ id }) => textResult(await (await client()).getReview(id))\n );\n\n server.registerTool(\n 'watch_review',\n {\n title: 'Watch Gloss review',\n description: 'Block until a review completes, then return feedback.',\n inputSchema: {\n id: z.string(),\n timeout: z.number().optional()\n }\n },\n async ({ id, timeout }) => {\n const api = await client();\n await api.watchReview(id, timeout);\n return textResult(await api.getFeedback(id));\n }\n );\n\n server.registerTool(\n 'get_review_feedback',\n {\n title: 'Get Gloss review feedback',\n description: 'Fetch completed review feedback.',\n inputSchema: { id: z.string() }\n },\n async ({ id }) => textResult(await (await client()).getFeedback(id))\n );\n\n server.registerTool(\n 'mark_review_resolved',\n {\n title: 'Mark Gloss review resolved',\n description: 'Write a resolved marker for a completed review.',\n inputSchema: {\n id: z.string(),\n summary: z.string().optional()\n }\n },\n async ({ id, summary }) => textResult(await (await client()).markResolved(id, summary))\n );\n\n await server.connect(new StdioServerTransport());\n}\n","import { spawn } from 'node:child_process';\nimport { existsSync, openSync } from 'node:fs';\nimport { readFile, rm, writeFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport getPort from 'get-port';\nimport {\n ensureDir,\n globalLogDir,\n globalServerFile,\n globalServerLogFile,\n globalStateDir,\n packageVersion\n} from '../shared/paths';\nimport type { ServerInfo } from '../shared/types';\nimport { ServerClient } from './server-client';\n\nexport async function readServerInfo(): Promise<ServerInfo | null> {\n try {\n return JSON.parse(await readFile(globalServerFile(), 'utf8')) as ServerInfo;\n } catch {\n return null;\n }\n}\n\nexport function serverUrl(info: Pick<ServerInfo, 'port'>): string {\n return `http://localhost:${info.port}`;\n}\n\nexport async function isServerResponsive(info: ServerInfo): Promise<boolean> {\n if (!isPidAlive(info.pid)) {\n return false;\n }\n try {\n const health = await new ServerClient(serverUrl(info)).health();\n return health.ok === true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureServer(options: { port?: number } = {}): Promise<ServerInfo> {\n const existing = await readServerInfo();\n if (existing && (await isServerResponsive(existing))) {\n return existing;\n }\n return startServer(options);\n}\n\nexport async function startServer(options: { port?: number } = {}): Promise<ServerInfo> {\n const existing = await readServerInfo();\n if (existing && (await isServerResponsive(existing))) {\n return existing;\n }\n\n await ensureDir(globalStateDir());\n await ensureDir(globalLogDir());\n const port = options.port ?? (await getPort());\n const daemonPath = fileURLToPath(new URL('../server/daemon.js', import.meta.url));\n if (!existsSync(daemonPath)) {\n throw new Error(`Cannot find server daemon at ${daemonPath}. Run pnpm build first.`);\n }\n\n const logFd = openSync(globalServerLogFile(), 'a');\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n env: {\n ...process.env,\n GLOSS_PORT: String(port),\n GLOSS_STATE_DIR: globalStateDir()\n },\n stdio: ['ignore', logFd, logFd]\n });\n child.unref();\n\n const info: ServerInfo = {\n pid: child.pid ?? -1,\n port,\n version: packageVersion,\n startedAt: new Date().toISOString(),\n stateDir: globalStateDir()\n };\n await writeFile(globalServerFile(), `${JSON.stringify(info, null, 2)}\\n`);\n\n const deadline = Date.now() + 8000;\n while (Date.now() < deadline) {\n if (await isServerResponsive(info)) {\n return info;\n }\n await new Promise((resolve) => setTimeout(resolve, 150));\n }\n\n throw new Error(`Server did not become responsive. See ${globalServerLogFile()}`);\n}\n\nexport async function stopServer(): Promise<{ stopped: boolean; info: ServerInfo | null }> {\n const info = await readServerInfo();\n if (!info) {\n return { stopped: false, info: null };\n }\n\n if (isPidAlive(info.pid)) {\n process.kill(info.pid, 'SIGTERM');\n }\n await rm(globalServerFile(), { force: true });\n return { stopped: true, info };\n}\n\nexport async function writeServerInfo(info: ServerInfo): Promise<void> {\n await ensureDir(globalStateDir());\n await writeFile(globalServerFile(), `${JSON.stringify(info, null, 2)}\\n`);\n}\n\nexport function isPidAlive(pid: number): boolean {\n if (pid <= 0) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n","import { mkdir } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport packageJson from '../../package.json';\n\nexport const packageVersion = packageJson.version;\n\nexport function expandHome(input: string): string {\n if (input === '~') {\n return homedir();\n }\n if (input.startsWith('~/')) {\n return path.join(homedir(), input.slice(2));\n }\n return input;\n}\n\nexport function globalStateDir(): string {\n return expandHome(process.env.GLOSS_STATE_DIR ?? '~/.gloss');\n}\n\nexport function globalServerFile(): string {\n return path.join(globalStateDir(), 'server.json');\n}\n\nexport function globalLogDir(): string {\n return path.join(globalStateDir(), 'logs');\n}\n\nexport function globalServerLogFile(): string {\n return path.join(globalLogDir(), 'server.log');\n}\n\nexport function globalReviewsDir(): string {\n return path.join(globalStateDir(), 'reviews');\n}\n\nexport function globalReviewDir(reviewId: string): string {\n return path.join(globalReviewsDir(), reviewId);\n}\n\nexport function globalReviewMetaFile(reviewId: string): string {\n return path.join(globalReviewDir(reviewId), 'meta.json');\n}\n\nexport function globalReviewDiffFile(reviewId: string): string {\n return path.join(globalReviewDir(reviewId), 'diff.json');\n}\n\nexport function globalReviewFeedbackFile(reviewId: string): string {\n return path.join(globalReviewDir(reviewId), 'feedback.json');\n}\n\nexport function globalReviewMarkdownFile(reviewId: string): string {\n return path.join(globalReviewDir(reviewId), 'feedback.md');\n}\n\nexport function globalReviewResolvedFile(reviewId: string): string {\n return path.join(globalReviewDir(reviewId), 'resolved.json');\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n","{\n \"name\": \"getgloss\",\n \"version\": \"0.3.0\",\n \"description\": \"Local browser-based diff review for coding-agent loops.\",\n \"type\": \"module\",\n \"packageManager\": \"pnpm@10.33.2\",\n \"bin\": {\n \"getgloss\": \"./dist/cli/index.js\",\n \"gloss\": \"./dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"skill\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"pnpm build:web && pnpm build:node\",\n \"build:web\": \"vite build\",\n \"build:node\": \"tsup\",\n \"check\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"prepack\": \"pnpm build\",\n \"dev:web\": \"vite --host 127.0.0.1\",\n \"setup\": \"tsx scripts/dev-cli.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"dependencies\": {\n \"@hono/node-server\": \"^1.14.4\",\n \"@modelcontextprotocol/sdk\": \"^1.29.0\",\n \"@pierre/diffs\": \"^1.2.1\",\n \"@tailwindcss/vite\": \"^4.1.7\",\n \"commander\": \"^14.0.0\",\n \"execa\": \"^9.5.3\",\n \"get-port\": \"^7.1.0\",\n \"hono\": \"^4.7.10\",\n \"lucide-react\": \"^1.16.0\",\n \"open\": \"^10.1.2\",\n \"react\": \"^19.1.0\",\n \"react-dom\": \"^19.1.0\",\n \"ulid\": \"^3.0.0\",\n \"zod\": \"^4.4.3\",\n \"zustand\": \"^5.0.5\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.0.6\",\n \"@types/node\": \"^24.0.1\",\n \"@types/react\": \"^19.1.6\",\n \"@types/react-dom\": \"^19.1.5\",\n \"@vitejs/plugin-react\": \"^4.5.2\",\n \"playwright\": \"^1.52.0\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.3\",\n \"typescript\": \"^5.8.3\",\n \"vite\": \"^6.3.5\",\n \"vitest\": \"^3.2.3\"\n },\n \"keywords\": [\n \"diff\",\n \"review\",\n \"coding-agents\",\n \"mcp\"\n ],\n \"author\": \"Raj Joshi\",\n \"license\": \"MIT\",\n \"homepage\": \"https://getgloss.dev\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/iamrajjoshi/gloss.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/iamrajjoshi/gloss/issues\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import type {\n Comment,\n DiffPayload,\n FeedbackBundle,\n OpenResult,\n ReviewEvent,\n ReviewMeta,\n ReviewRecord\n} from '../shared/types';\n\nexport class ServerClient {\n constructor(private readonly baseUrl: string) {}\n\n async health(): Promise<{ ok: boolean; version: string; activeReviews: number }> {\n return this.get('/api/health');\n }\n\n async createReview(diff: DiffPayload): Promise<{ meta: ReviewMeta; url: string }> {\n return this.post('/api/reviews', diff);\n }\n\n async getReview(reviewId: string): Promise<ReviewRecord> {\n return this.get(`/api/reviews/${reviewId}`);\n }\n\n async listReviews(): Promise<{ reviews: ReviewMeta[] }> {\n return this.get('/api/reviews');\n }\n\n async getFeedback(reviewId: string): Promise<FeedbackBundle> {\n return this.get(`/api/reviews/${reviewId}/feedback`);\n }\n\n async markResolved(reviewId: string, summary?: string): Promise<{ ok: true; path: string }> {\n return this.post(`/api/reviews/${reviewId}/resolved`, { summary });\n }\n\n async submitReview(reviewId: string, comments: Comment[]): Promise<OpenResult> {\n return this.post(`/api/reviews/${reviewId}/submit`, { comments });\n }\n\n async watchReview(reviewId: string, timeoutSeconds?: number): Promise<ReviewEvent> {\n const controller = new AbortController();\n const timeout =\n timeoutSeconds && timeoutSeconds > 0\n ? setTimeout(() => controller.abort(), timeoutSeconds * 1000)\n : null;\n\n try {\n const response = await fetch(`${this.baseUrl}/api/reviews/${reviewId}/events`, {\n signal: controller.signal\n });\n if (!response.ok || !response.body) {\n throw new Error(`watch failed: ${response.status} ${await response.text()}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n throw new Error('watch stream ended before completion');\n }\n buffer += decoder.decode(value, { stream: true });\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n for (const eventChunk of events) {\n const dataLine = eventChunk.split('\\n').find((line) => line.startsWith('data:'));\n if (!dataLine) {\n continue;\n }\n const event = JSON.parse(dataLine.slice(5).trim()) as ReviewEvent;\n if (event.type === 'review.completed' || event.type === 'review.cancelled') {\n return event;\n }\n }\n }\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n }\n\n private async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`);\n return parseResponse<T>(response);\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body)\n });\n return parseResponse<T>(response);\n }\n}\n\nasync function parseResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}: ${await response.text()}`);\n }\n return (await response.json()) as T;\n}\n"],"mappings":"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","names":["path"]}