import { existsSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { execFileSync } from 'node:child_process'; import { initProject, writeRecord } from '../src/index.mjs'; export const git = (repo, ...args) => execFileSync('git', ['-c', 'core.hooksPath=/dev/null', '-c', 'maintenance.auto=false', '-c', 'gc.auto=0', '-C', repo, ...args], { encoding: 'utf8', env: { ...process.env, GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_SYSTEM: '/dev/null', GIT_AUTHOR_NAME: 'jason', GIT_AUTHOR_EMAIL: 'jason@mosaic.invalid', GIT_COMMITTER_NAME: 'jason', GIT_COMMITTER_EMAIL: 'jason@mosaic.invalid' } }).trim(); export async function prdFixture(t, context) { const root = context?.dataRoot ?? mkdtempSync(join(tmpdir(), 'prd-')); if (!context) t.after(() => rmSync(root, { recursive: true, force: true })); context ??= { dataRoot: root, project: 'timer', business: { id: 'demo', human: 'jason', projects: { timer: { root: join(root, 'code') } } } }; const repo = context.business.projects[context.project].repo ?? join(context.dataRoot, 'projects', context.business.id, context.project); if (!existsSync(join(repo, '.git'))) await initProject(context); const save = (path, bytes, author = 'jason') => { writeFileSync(join(repo, path), bytes); git(repo, 'add', '--', path); git(repo, 'commit', '--author', `${author} `, '-qm', 'Save ' + path); return git(repo, 'rev-parse', 'HEAD'); }; if (git(repo, 'show', 'HEAD:spec/north-star.md') !== 'Build a timer.') save('spec/north-star.md', 'Build a timer.\n'); const author = { definition: 'pm', instance: 'pm' }; await writeRecord({ ...context, author, path: 'docs/prd-1.0.md', record: '# Timer 1.0\nA timer.\n' }); await writeRecord({ ...context, author, path: 'requirements/REQ-POMO-1.json', record: { recordVersion: 1, id: 'REQ-POMO-1', title: 'Timer', text: 'A working timer.', status: 'draft' } }); const args = { ...context, request: 'request-1', prd_version: '1.0', records_commit: git(repo, 'rev-parse', 'HEAD'), prd_path: 'docs/prd-1.0.md', requirement_ids: ['REQ-POMO-1'], mode_revision: 1 }; return { context, repo, save, args }; }