import assert from 'node:assert/strict' import { mkdtemp, readdir, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import test from 'node:test' const testHome = await mkdtemp(join(tmpdir(), 'dsh-git-plugin-test-')) const previousHome = process.env.DSH_HOME process.env.DSH_HOME = testHome const { apply } = await import('../lib/index.js') test('plugin registration, agent tracking, and directory polling do not initialize editor state', async testContext => { testContext.after(async () => { if (previousHome === undefined) delete process.env.DSH_HOME else process.env.DSH_HOME = previousHome await rm(testHome, { recursive: true, force: true }) }) const routes = new Map() const toolDefinitions = [] const hooks = new Map() const guards = new Set() let dispose const context = { webServer: { register: ({ path, handler }) => { routes.set(path, handler); return () => routes.delete(path) } }, tools: { register: definition => { toolDefinitions.push(definition); return () => {} }, guard: guard => { guards.add(guard); return () => guards.delete(guard) }, }, fs: {}, on: (name, listener) => { hooks.set(name, listener); return () => hooks.delete(name) }, systemPrompt: { section: () => () => {} }, effect: setup => { dispose = setup() }, } apply(context) assert.equal(toolDefinitions.length, 3) assert.equal(routes.has('/touched-git/editor/open'), true) assert.equal(routes.has('/touched-git/editor/open-file'), true) assert.equal(routes.has('/touched-git/mutation'), true) assert.equal(guards.size, 1) assert.equal(hooks.has('fs/write-intent'), true) assert.equal(hooks.has('fs/edit-intent'), true) const request = { method: 'GET', url: '/touched-git/list?sessionId=empty-test-session', headers: { host: '127.0.0.1:3080', 'sec-fetch-site': 'same-origin' }, socket: { remoteAddress: '127.0.0.1' }, } let status let body const response = { writeHead: code => { status = code }, end: data => { body = JSON.parse(data) }, } await routes.get('/touched-git/list')(request, response) assert.equal(status, 200) assert.deepEqual(body.value.entries, []) assert.deepEqual(await readdir(testHome), []) const execution = { signal: new AbortController().signal, agent: { session: { header: { id: 'empty-test-session', cwd: process.cwd() } } }, } const add = toolDefinitions.find(tool => tool.name === 'add_touched_git_directory') const get = toolDefinitions.find(tool => tool.name === 'get_touched_git_directories') assert.equal((await add.execute({ path: process.cwd() }, execution)).ok, true) assert.equal((await get.execute({}, execution)).count, 1) await routes.get('/touched-git/list')(request, response) assert.equal(body.value.entries.length, 1) assert.deepEqual(await readdir(join(testHome, 'touched-git')), ['store.json']) await dispose() assert.equal(routes.size, 0) assert.equal(guards.size, 0) assert.equal(hooks.size, 0) })