@gitgov/core 2.7.1 → 2.8.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/src/{agent_runner-DijNVjaF.d.ts → agent_runner-D3G5zzGv.d.ts} +2 -2
- package/dist/src/fs.d.ts +20 -8
- package/dist/src/fs.js +537 -825
- package/dist/src/fs.js.map +1 -1
- package/dist/src/github.d.ts +115 -115
- package/dist/src/github.js +1594 -1596
- package/dist/src/github.js.map +1 -1
- package/dist/src/index.d.ts +617 -1212
- package/dist/src/index.js +550 -1176
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory.d.ts +1 -1
- package/dist/src/prisma.d.ts +3 -1
- package/dist/src/prisma.js +7 -2
- package/dist/src/prisma.js.map +1 -1
- package/dist/src/{record_projection.types-D9NkQbL_.d.ts → record_projection.types-B2OZbgoW.d.ts} +127 -166
- package/dist/src/{sync_state-C2a2RuBQ.d.ts → sync_state-GmqG3pLj.d.ts} +7 -3
- package/package.json +1 -1
package/dist/src/github.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/file_lister/file_lister.errors.ts","../../src/file_lister/github/github_file_lister.ts","../../src/record_store/github/github_record_store.ts","../../src/git/errors.ts","../../src/git/github/github_git_module.ts","../../src/config_store/github/github_config_store.ts","../../src/sync_state/sync_state.types.ts","../../src/sync_state/sync_state.utils.ts","../../src/sync_state/github_sync_state/github_sync_state.ts","../../src/github.ts"],"names":["path"],"mappings":"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","file":"github.js","sourcesContent":["/**\n * Error codes for FileLister operations.\n */\nexport type FileListerErrorCode =\n | 'FILE_NOT_FOUND'\n | 'READ_ERROR'\n | 'PERMISSION_DENIED'\n | 'INVALID_PATH'\n | 'NETWORK_ERROR';\n\n/**\n * Error thrown when file operations fail.\n */\nexport class FileListerError extends Error {\n constructor(\n message: string,\n public readonly code: FileListerErrorCode,\n public readonly filePath?: string\n ) {\n super(message);\n this.name = 'FileListerError';\n }\n}\n","/**\n * GitHubFileLister - GitHub REST API implementation of FileLister\n *\n * Provides file listing and reading operations via GitHub's REST API\n * for SaaS environments where direct filesystem access is not available.\n *\n * Uses the Git Trees API for listing (with caching) and the Contents API\n * for reading individual files. Falls back to the Blobs API for files\n * larger than 1MB where the Contents API returns null content.\n *\n * @module file_lister/github/github_file_lister\n */\n\nimport picomatch from 'picomatch';\nimport type { Octokit } from '@octokit/rest';\nimport type { FileLister, FileListOptions, FileStats } from '../file_lister';\nimport { FileListerError } from '../file_lister';\nimport { isOctokitRequestError } from '../../github';\nimport type { GitHubFileListerOptions } from './github_file_lister.types';\n\n/** Tree entry shape from Octokit git.getTree response */\ntype TreeEntry = {\n path?: string;\n type?: string;\n sha?: string;\n size?: number;\n};\n\n/**\n * GitHubFileLister - GitHub REST API FileLister implementation.\n *\n * Implements the FileLister interface using GitHub's REST API endpoints:\n * - Trees API for listing files (cached)\n * - Contents API for reading, stat, and exists\n * - Blobs API as fallback for large files (>1MB)\n *\n * @example\n * ```typescript\n * import { Octokit } from '@octokit/rest';\n * const octokit = new Octokit({ auth: 'ghp_xxx' });\n * const lister = new GitHubFileLister({\n * owner: 'myorg',\n * repo: 'myrepo',\n * ref: 'gitgov-state',\n * basePath: '.gitgov',\n * }, octokit);\n *\n * const files = await lister.list(['**\\/*.ts']);\n * const content = await lister.read('config.json');\n * ```\n */\nexport class GitHubFileLister implements FileLister {\n private readonly owner: string;\n private readonly repo: string;\n private readonly ref: string;\n private readonly basePath: string;\n private readonly octokit: Octokit;\n\n /** Cached tree entries from the Trees API */\n private treeCache: TreeEntry[] | null = null;\n\n constructor(options: GitHubFileListerOptions, octokit: Octokit) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.ref = options.ref ?? 'gitgov-state';\n this.basePath = options.basePath ?? '';\n this.octokit = octokit;\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // FileLister Interface\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * [EARS-A1] Lists files matching glob patterns.\n * [EARS-B1] Uses Trees API with recursive=1 and picomatch filter.\n * [EARS-B3] Applies basePath prefix for tree entries, strips from results.\n * [EARS-B6] Caches tree between list() calls.\n */\n async list(patterns: string[], options?: FileListOptions): Promise<string[]> {\n const entries = await this.fetchTree();\n\n // Filter only blobs (files, not directories)\n const blobs = entries.filter(entry => entry.type === 'blob');\n\n // Apply basePath: only entries under basePath, then strip prefix\n const prefix = this.basePath ? `${this.basePath}/` : '';\n const relativePaths: string[] = [];\n\n for (const blob of blobs) {\n if (!blob.path) continue;\n if (prefix && !blob.path.startsWith(prefix)) {\n continue;\n }\n const relativePath = prefix ? blob.path.slice(prefix.length) : blob.path;\n relativePaths.push(relativePath);\n }\n\n // Match against patterns using picomatch\n const isMatch = picomatch(patterns, {\n ignore: options?.ignore,\n });\n\n return relativePaths.filter(p => isMatch(p)).sort();\n }\n\n /**\n * [EARS-A2] Checks if a file exists via Contents API.\n * [EARS-B4] Returns false for 404 responses.\n */\n async exists(filePath: string): Promise<boolean> {\n const fullPath = this.buildFullPath(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: fullPath,\n ref: this.ref,\n });\n // [EARS-A2] Verify it's a file, not a directory\n if (Array.isArray(data) || data.type !== 'file') {\n return false;\n }\n return true;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) return false;\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error checking file: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n\n /**\n * [EARS-A3] Reads file content as string.\n * [EARS-B2] Decodes base64 content from Contents API.\n * [EARS-B7] Falls back to Blobs API for files >1MB (null content).\n */\n async read(filePath: string): Promise<string> {\n const fullPath = this.buildFullPath(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: fullPath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new FileListerError(\n `Not a file: ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n\n // [EARS-B2] Decode base64 content\n if (data.content !== null && data.content !== undefined) {\n return Buffer.from(data.content, 'base64').toString('utf-8');\n }\n\n // [EARS-B7] Content is null (file >1MB), fallback to Blobs API\n return this.readViaBlobs(data.sha, filePath);\n } catch (error: unknown) {\n if (error instanceof FileListerError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath,\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error reading file: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n\n /**\n * [EARS-A4] Gets file statistics via Contents API.\n * Returns size from API, mtime as 0 (not available via Contents API), isFile as true.\n */\n async stat(filePath: string): Promise<FileStats> {\n const fullPath = this.buildFullPath(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: fullPath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new FileListerError(\n `Not a file: ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n\n return {\n size: data.size,\n mtime: 0,\n isFile: true,\n };\n } catch (error: unknown) {\n if (error instanceof FileListerError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath,\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error getting file stats: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private Helpers\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Builds the full file path including basePath prefix.\n */\n private buildFullPath(filePath: string): string {\n if (this.basePath) {\n return `${this.basePath}/${filePath}`;\n }\n return filePath;\n }\n\n /**\n * [EARS-B6] Fetches and caches the full repository tree.\n * [EARS-C3] Throws READ_ERROR if the tree response is truncated.\n */\n private async fetchTree(): Promise<TreeEntry[]> {\n if (this.treeCache !== null) {\n return this.treeCache;\n }\n\n try {\n const { data } = await this.octokit.rest.git.getTree({\n owner: this.owner,\n repo: this.repo,\n tree_sha: this.ref,\n recursive: '1',\n });\n\n // [EARS-C3] Truncated tree means we cannot reliably list all files\n if (data.truncated) {\n throw new FileListerError(\n 'Repository tree is truncated; too many files to list via Trees API',\n 'READ_ERROR',\n );\n }\n\n this.treeCache = data.tree;\n return this.treeCache;\n } catch (error: unknown) {\n if (error instanceof FileListerError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n 'Repository or ref not found',\n 'FILE_NOT_FOUND',\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n 'Permission denied accessing repository tree',\n 'PERMISSION_DENIED',\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}) fetching tree`,\n 'READ_ERROR',\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}) fetching tree`,\n 'READ_ERROR',\n );\n }\n throw new FileListerError(\n 'Network error fetching repository tree',\n 'NETWORK_ERROR',\n );\n }\n }\n\n /**\n * [EARS-B7] Reads file content via the Blobs API (fallback for >1MB files).\n */\n private async readViaBlobs(sha: string, filePath: string): Promise<string> {\n try {\n const { data } = await this.octokit.rest.git.getBlob({\n owner: this.owner,\n repo: this.repo,\n file_sha: sha,\n });\n\n return Buffer.from(data.content, 'base64').toString('utf-8');\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath,\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n throw new FileListerError(\n `GitHub API error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error reading blob for file: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n}\n","import type { Octokit } from '@octokit/rest';\nimport type { RecordStore, IdEncoder } from '../record_store';\nimport type { GitHubRecordStoreOptions, GitHubWriteResult, GitHubWriteOpts } from './github_record_store.types';\nimport type { IGitModule } from '../../git/index';\nimport { GitHubApiError, mapOctokitError, isOctokitRequestError } from '../../github';\n\n/**\n * GitHubRecordStore<V> - GitHub Contents API implementation of RecordStore<V, GitHubWriteResult, GitHubWriteOpts>\n *\n * Persists records as JSON files in a GitHub repository via Octokit.\n * Supports SHA caching to avoid redundant GET calls before PUT/DELETE.\n */\nexport class GitHubRecordStore<V> implements RecordStore<V, GitHubWriteResult, GitHubWriteOpts> {\n private readonly owner: string;\n private readonly repo: string;\n private readonly ref: string;\n private readonly basePath: string;\n private readonly extension: string;\n private readonly idEncoder: IdEncoder | undefined;\n private readonly octokit: Octokit;\n\n /** SHA cache keyed by full file path (basePath/encoded + extension) */\n private readonly shaCache: Map<string, string> = new Map();\n\n /** IGitModule dependency for putMany() atomic commits. Optional — only needed for putMany(). */\n private readonly gitModule: IGitModule | undefined;\n\n constructor(options: GitHubRecordStoreOptions, octokit: Octokit, gitModule?: IGitModule) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.ref = options.ref ?? 'gitgov-state';\n this.basePath = options.basePath;\n this.extension = options.extension ?? '.json';\n this.idEncoder = options.idEncoder;\n this.octokit = octokit;\n this.gitModule = gitModule;\n }\n\n async get(id: string): Promise<V | null> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new GitHubApiError(`Not a file: ${filePath}`, 'INVALID_RESPONSE');\n }\n\n if (data.content === null || data.content === undefined) {\n throw new GitHubApiError(\n `File content is null (file may exceed 1MB): ${filePath}`,\n 'INVALID_RESPONSE',\n );\n }\n\n // Cache the SHA for subsequent operations\n this.shaCache.set(filePath, data.sha);\n\n const decoded = Buffer.from(data.content, 'base64').toString('utf-8');\n return JSON.parse(decoded) as V;\n } catch (error: unknown) {\n if (error instanceof GitHubApiError) throw error;\n if (isOctokitRequestError(error) && error.status === 404) return null;\n throw mapOctokitError(error, `GET ${filePath}`);\n }\n }\n\n async put(id: string, value: V, opts?: GitHubWriteOpts): Promise<GitHubWriteResult> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n const content = Buffer.from(JSON.stringify(value, null, 2)).toString('base64');\n\n const cachedSha = this.shaCache.get(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.createOrUpdateFileContents({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n message: opts?.commitMessage ?? `put ${id}`,\n content,\n branch: this.ref,\n ...(cachedSha ? { sha: cachedSha } : {}),\n });\n\n // Cache the new SHA from the response\n if (data.content?.sha) {\n this.shaCache.set(filePath, data.content.sha);\n }\n\n return { commitSha: data.commit.sha! };\n } catch (error: unknown) {\n throw mapOctokitError(error, `PUT ${filePath}`);\n }\n }\n\n /**\n * [EARS-A11, EARS-A12, EARS-B8] Persists multiple records in a single atomic commit.\n * Uses GitHubGitModule staging buffer: add() with contentMap, then commit().\n * Empty entries array returns { commitSha: undefined } without API calls.\n * Requires gitModule dependency — throws if not injected.\n */\n async putMany(entries: Array<{ id: string; value: V }>, opts?: GitHubWriteOpts): Promise<GitHubWriteResult> {\n if (entries.length === 0) {\n return {};\n }\n\n if (!this.gitModule) {\n throw new Error('putMany requires IGitModule dependency for atomic commits');\n }\n\n for (const { id } of entries) {\n this.validateId(id);\n }\n\n const contentMap: Record<string, string> = {};\n const filePaths: string[] = [];\n\n for (const { id, value } of entries) {\n const filePath = this.buildFilePath(id);\n contentMap[filePath] = JSON.stringify(value, null, 2);\n filePaths.push(filePath);\n }\n\n await this.gitModule.add(filePaths, { contentMap });\n\n const message = opts?.commitMessage ?? `putMany ${entries.length} records`;\n const commitSha = await this.gitModule.commit(message);\n\n return { commitSha };\n }\n\n async delete(id: string, opts?: GitHubWriteOpts): Promise<GitHubWriteResult> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n\n let sha = this.shaCache.get(filePath);\n\n // If no cached SHA, do a GET to obtain it\n if (sha === undefined) {\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n return {};\n }\n\n sha = data.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return {};\n }\n throw mapOctokitError(error, `GET ${filePath} (for delete)`);\n }\n }\n\n try {\n const { data } = await this.octokit.rest.repos.deleteFile({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n message: opts?.commitMessage ?? `delete ${id}`,\n sha: sha!,\n branch: this.ref,\n });\n\n this.shaCache.delete(filePath);\n return { commitSha: data.commit.sha! };\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n this.shaCache.delete(filePath);\n return {};\n }\n throw mapOctokitError(error, `DELETE ${filePath}`);\n }\n }\n\n async list(): Promise<string[]> {\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: this.basePath,\n ref: this.ref,\n });\n\n if (!Array.isArray(data)) {\n return [];\n }\n\n const ids = data\n .filter((entry) => entry.name.endsWith(this.extension))\n .map((entry) => entry.name.slice(0, -this.extension.length));\n\n return this.idEncoder ? ids.map((encoded) => this.idEncoder!.decode(encoded)) : ids;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return [];\n }\n throw mapOctokitError(error, `GET ${this.basePath} (list)`);\n }\n }\n\n async exists(id: string): Promise<boolean> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n\n try {\n await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: this.ref,\n });\n return true;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return false;\n }\n throw mapOctokitError(error, `GET ${filePath} (exists)`);\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Private helpers\n // ─────────────────────────────────────────────────────────\n\n private validateId(id: string): void {\n if (!id || typeof id !== 'string') {\n throw new GitHubApiError('ID must be a non-empty string', 'INVALID_ID');\n }\n if (id.includes('..') || /[\\/\\\\]/.test(id)) {\n throw new GitHubApiError(\n `Invalid ID: \"${id}\". IDs cannot contain /, \\\\, or ..`,\n 'INVALID_ID',\n );\n }\n }\n\n private buildFilePath(id: string): string {\n const encoded = this.idEncoder ? this.idEncoder.encode(id) : id;\n return `${this.basePath}/${encoded}${this.extension}`;\n }\n}\n","/**\n * Custom Error Classes for GitModule\n * \n * These errors provide typed exceptions for better error handling\n * and diagnostics in the Git module operations.\n */\n\n/**\n * Base error class for all Git-related errors\n */\nexport class GitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GitError';\n Object.setPrototypeOf(this, GitError.prototype);\n }\n}\n\n/**\n * Error thrown when a Git command fails\n */\nexport class GitCommandError extends GitError {\n public readonly stderr: string;\n public readonly stdout?: string | undefined;\n public readonly command?: string | undefined;\n\n constructor(message: string, stderr: string = '', command?: string | undefined, stdout?: string) {\n super(message);\n this.name = 'GitCommandError';\n this.stderr = stderr;\n this.stdout = stdout;\n this.command = command;\n Object.setPrototypeOf(this, GitCommandError.prototype);\n }\n}\n\n/**\n * Error thrown when a branch does not exist\n */\nexport class BranchNotFoundError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch not found: ${branchName}`);\n this.name = 'BranchNotFoundError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a file does not exist in a commit\n */\nexport class FileNotFoundError extends GitError {\n public readonly filePath: string;\n public readonly commitHash: string;\n\n constructor(filePath: string, commitHash: string) {\n super(`File not found: ${filePath} in commit ${commitHash}`);\n this.name = 'FileNotFoundError';\n this.filePath = filePath;\n this.commitHash = commitHash;\n Object.setPrototypeOf(this, FileNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a merge conflict occurs\n */\nexport class MergeConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Merge conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'MergeConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, MergeConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when a rebase conflict occurs\n */\nexport class RebaseConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Rebase conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'RebaseConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, RebaseConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to continue/abort a rebase that is not in progress\n */\nexport class RebaseNotInProgressError extends GitError {\n constructor() {\n super('No rebase in progress');\n this.name = 'RebaseNotInProgressError';\n Object.setPrototypeOf(this, RebaseNotInProgressError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to create a branch that already exists\n */\nexport class BranchAlreadyExistsError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch already exists: ${branchName}`);\n this.name = 'BranchAlreadyExistsError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchAlreadyExistsError.prototype);\n }\n}\n\n","/**\n * GitHubGitModule - GitHub REST API implementation of IGitModule\n *\n * Implements IGitModule for SaaS environments where direct filesystem\n * and git CLI are not available. Uses GitHub REST API via Octokit for all operations.\n *\n * Method categories:\n * - Category A (Implement): Real API calls — getFileContent, getCommitHash, etc.\n * - Category B (No-op): Return sensible defaults — push, fetch, stash, etc.\n * - Category C (Not Supported): Throw GitError — rebase, resetHard, etc.\n *\n * All EARS prefixes map to github_git_module.md\n *\n * @module git/github\n */\n\nimport type { Octokit } from '@octokit/rest';\nimport type { IGitModule } from '..';\nimport type {\n ExecOptions,\n ExecResult,\n GetCommitHistoryOptions,\n CommitInfo,\n ChangedFile,\n CommitAuthor,\n} from '../types';\nimport { isOctokitRequestError } from '../../github';\nimport type { GitHubGitModuleOptions } from './github_git_module.types';\nimport { GitError, FileNotFoundError, BranchNotFoundError, BranchAlreadyExistsError } from '../errors';\n\nexport class GitHubGitModule implements IGitModule {\n private readonly owner: string;\n private readonly repo: string;\n private readonly defaultBranch: string;\n private readonly octokit: Octokit;\n\n /** Staging buffer: path → content (null = delete) */\n private stagingBuffer: Map<string, string | null> = new Map();\n\n /** Active ref for operations (can be changed via checkoutBranch) */\n private activeRef: string;\n\n constructor(options: GitHubGitModuleOptions, octokit: Octokit) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.defaultBranch = options.defaultBranch ?? 'gitgov-state';\n this.octokit = octokit;\n this.activeRef = this.defaultBranch;\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PRIVATE HELPERS\n // ═══════════════════════════════════════════════════════════════\n\n /** Category C: Not supported via GitHub API */\n private notSupported(method: string): never {\n throw new GitError(\n `${method} is not supported via GitHub API`\n );\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY A: READ OPERATIONS (EARS-A1 to A6)\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * [EARS-A1] Read file content via Contents API + base64 decode\n * [EARS-A2] Fallback to Blobs API for files >1MB\n */\n async getFileContent(commitHash: string, filePath: string): Promise<string> {\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: commitHash,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new GitError(`Not a file: ${filePath}`);\n }\n\n // [EARS-A1] Decode base64 content\n if (data.content !== null && data.content !== undefined) {\n return Buffer.from(data.content, 'base64').toString('utf-8');\n }\n\n // [EARS-A2] Content is null (file >1MB), fallback to Blobs API\n const { data: blobData } = await this.octokit.rest.git.getBlob({\n owner: this.owner,\n repo: this.repo,\n file_sha: data.sha,\n });\n\n return Buffer.from(blobData.content, 'base64').toString('utf-8');\n } catch (error: unknown) {\n if (error instanceof GitError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileNotFoundError(filePath, commitHash);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getFileContent ${filePath}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getFileContent ${filePath}`);\n }\n throw new GitError(`GitHub API error (${error.status}): getFileContent ${filePath}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A3] Get commit SHA from branch via Refs API\n * [EARS-B4] Return SHA directly if already a 40-char hex\n */\n async getCommitHash(ref: string = this.activeRef): Promise<string> {\n // [EARS-B4] If ref is already a 40-char hex SHA, return directly\n if (/^[0-9a-f]{40}$/i.test(ref)) {\n return ref;\n }\n\n try {\n const { data } = await this.octokit.rest.git.getRef({\n owner: this.owner,\n repo: this.repo,\n ref: `heads/${ref}`,\n });\n return data.object.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new BranchNotFoundError(ref);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitHash ${ref}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitHash ${ref}`);\n }\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A4] List changed files via Compare API\n */\n async getChangedFiles(\n fromCommit: string,\n toCommit: string,\n pathFilter: string\n ): Promise<ChangedFile[]> {\n try {\n const { data } = await this.octokit.rest.repos.compareCommits({\n owner: this.owner,\n repo: this.repo,\n base: fromCommit,\n head: toCommit,\n });\n\n const statusMap: Record<string, 'A' | 'M' | 'D'> = {\n added: 'A',\n modified: 'M',\n removed: 'D',\n renamed: 'M',\n };\n\n const files: ChangedFile[] = (data.files ?? [])\n .map(f => ({\n status: statusMap[f.status] ?? ('M' as const),\n file: f.filename,\n }))\n .filter(f => !pathFilter || f.file.startsWith(pathFilter));\n\n return files;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getChangedFiles ${fromCommit}...${toCommit}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getChangedFiles`);\n }\n throw new GitError(`Failed to compare ${fromCommit}...${toCommit}: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A5] Get commit history via Commits API\n */\n async getCommitHistory(\n branch: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n try {\n const { data } = await this.octokit.rest.repos.listCommits({\n owner: this.owner,\n repo: this.repo,\n sha: branch,\n ...(options?.maxCount !== undefined && { per_page: options.maxCount }),\n ...(options?.pathFilter !== undefined && { path: options.pathFilter }),\n });\n\n return data.map(c => ({\n hash: c.sha,\n message: c.commit.message,\n author: `${c.commit.author?.name ?? 'unknown'} <${c.commit.author?.email ?? 'unknown'}>`,\n date: c.commit.author?.date ?? '',\n }));\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitHistory ${branch}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitHistory`);\n }\n throw new GitError(`Failed to get commit history: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-B3] Get commit history between two commits via Compare API\n */\n async getCommitHistoryRange(\n fromHash: string,\n toHash: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n try {\n const { data } = await this.octokit.rest.repos.compareCommits({\n owner: this.owner,\n repo: this.repo,\n base: fromHash,\n head: toHash,\n });\n\n let commits: CommitInfo[] = data.commits.map(c => ({\n hash: c.sha,\n message: c.commit.message,\n author: `${c.commit.author?.name ?? 'unknown'} <${c.commit.author?.email ?? 'unknown'}>`,\n date: c.commit.author?.date ?? '',\n }));\n\n if (options?.pathFilter) {\n const changedPaths = new Set((data.files ?? []).map(f => f.filename));\n commits = commits.filter(() =>\n Array.from(changedPaths).some(f => f.startsWith(options.pathFilter!))\n );\n }\n\n if (options?.maxCount) {\n commits = commits.slice(0, options.maxCount);\n }\n\n return commits;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitHistoryRange ${fromHash}...${toHash}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitHistoryRange`);\n }\n throw new GitError(`Failed to get commit range: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A6] Get commit message via Commits API\n */\n async getCommitMessage(commitHash: string): Promise<string> {\n try {\n const { data } = await this.octokit.rest.repos.getCommit({\n owner: this.owner,\n repo: this.repo,\n ref: commitHash,\n });\n return data.commit.message;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new GitError(`Commit not found: ${commitHash}`);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitMessage ${commitHash}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitMessage`);\n }\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY A: BRANCH OPERATIONS (EARS-B1 to B2)\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * [EARS-B1] Check if branch exists via Branches API\n */\n async branchExists(branchName: string): Promise<boolean> {\n try {\n await this.octokit.rest.repos.getBranch({\n owner: this.owner,\n repo: this.repo,\n branch: branchName,\n });\n return true;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) return false;\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): branchExists ${branchName}`);\n }\n throw new GitError(`Failed to check branch: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-B2] List remote branches via Branches API\n * remoteName is ignored — repo itself is the implicit remote\n */\n async listRemoteBranches(_remoteName: string): Promise<string[]> {\n try {\n const { data } = await this.octokit.rest.repos.listBranches({\n owner: this.owner,\n repo: this.repo,\n });\n return data.map(b => b.name);\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): listRemoteBranches`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): listRemoteBranches`);\n }\n throw new GitError(`Failed to list branches: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY A: WRITE OPERATIONS (EARS-C1 to C7)\n // ═══════════════════════════════════════════════════════════════\n\n /** [EARS-C1] Read file content and store in staging buffer */\n async add(filePaths: string[], options?: { force?: boolean; contentMap?: Record<string, string> }): Promise<void> {\n for (const filePath of filePaths) {\n const content = options?.contentMap?.[filePath]\n ?? await this.getFileContent(this.activeRef, filePath);\n this.stagingBuffer.set(filePath, content);\n }\n }\n\n /** [EARS-C2] Mark files as deleted in staging buffer */\n async rm(filePaths: string[]): Promise<void> {\n for (const filePath of filePaths) {\n this.stagingBuffer.set(filePath, null);\n }\n }\n\n /** [EARS-C7] Return staged file paths from buffer */\n async getStagedFiles(): Promise<string[]> {\n return Array.from(this.stagingBuffer.keys());\n }\n\n /**\n * [EARS-C6] Create branch via Refs API POST\n */\n async createBranch(branchName: string, startPoint?: string): Promise<void> {\n // Resolve startPoint to SHA\n const sha = startPoint\n ? await this.getCommitHash(startPoint)\n : await this.getCommitHash(this.activeRef);\n\n try {\n await this.octokit.rest.git.createRef({\n owner: this.owner,\n repo: this.repo,\n ref: `refs/heads/${branchName}`,\n sha,\n });\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 422) {\n throw new BranchAlreadyExistsError(branchName);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): createBranch ${branchName}`);\n }\n throw new GitError(`Failed to create branch ${branchName}: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * Internal commit implementation shared by commit() and commitAllowEmpty().\n *\n * [EARS-C3] 6-step atomic transaction\n * [EARS-C4] Clears staging buffer after successful commit\n * [EARS-C5] Throws if staging buffer is empty (unless allowEmpty)\n */\n private async commitInternal(message: string, author?: CommitAuthor, allowEmpty = false): Promise<string> {\n // [EARS-C5] Empty buffer check (skipped for commitAllowEmpty)\n if (!allowEmpty && this.stagingBuffer.size === 0) {\n throw new GitError('Nothing to commit: staging buffer is empty');\n }\n\n try {\n // Step 1: GET current ref SHA\n const { data: refData } = await this.octokit.rest.git.getRef({\n owner: this.owner,\n repo: this.repo,\n ref: `heads/${this.activeRef}`,\n });\n const currentSha = refData.object.sha;\n\n // Step 2: GET commit to obtain tree SHA\n const { data: commitData } = await this.octokit.rest.git.getCommit({\n owner: this.owner,\n repo: this.repo,\n commit_sha: currentSha,\n });\n const treeSha = commitData.tree.sha;\n\n // Step 3: POST blobs for each staged file (adds/updates only, not deletes)\n const treeEntries: Array<{\n path: string;\n mode: '100644';\n type: 'blob';\n sha: string | null;\n }> = [];\n\n for (const [path, content] of this.stagingBuffer) {\n if (content === null) {\n // Delete entry\n treeEntries.push({\n path,\n mode: '100644',\n type: 'blob',\n sha: null,\n });\n } else {\n // Create blob\n const { data: blobData } = await this.octokit.rest.git.createBlob({\n owner: this.owner,\n repo: this.repo,\n content: Buffer.from(content).toString('base64'),\n encoding: 'base64',\n });\n\n treeEntries.push({\n path,\n mode: '100644',\n type: 'blob',\n sha: blobData.sha,\n });\n }\n }\n\n // Step 4: POST new tree\n const { data: treeData } = await this.octokit.rest.git.createTree({\n owner: this.owner,\n repo: this.repo,\n base_tree: treeSha,\n tree: treeEntries,\n });\n const newTreeSha = treeData.sha;\n\n // Step 5: POST new commit\n const commitParams: {\n owner: string;\n repo: string;\n message: string;\n tree: string;\n parents: string[];\n author?: { name: string; email: string; date: string };\n } = {\n owner: this.owner,\n repo: this.repo,\n message,\n tree: newTreeSha,\n parents: [currentSha],\n };\n\n if (author) {\n commitParams.author = {\n name: author.name,\n email: author.email,\n date: new Date().toISOString(),\n };\n }\n\n const { data: newCommitData } = await this.octokit.rest.git.createCommit(commitParams);\n const newCommitSha = newCommitData.sha;\n\n // Step 6: PATCH ref to point to new commit\n try {\n await this.octokit.rest.git.updateRef({\n owner: this.owner,\n repo: this.repo,\n ref: `heads/${this.activeRef}`,\n sha: newCommitSha,\n });\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 422) {\n throw new GitError('non-fast-forward update rejected');\n }\n throw error;\n }\n\n // [EARS-C4] Clear staging buffer after successful commit\n this.stagingBuffer.clear();\n\n return newCommitSha;\n } catch (error: unknown) {\n if (error instanceof GitError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): commit`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): commit`);\n }\n throw new GitError(`GitHub API error (${error.status}): commit`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-C3] Commit staged changes via 6-step atomic transaction\n * [EARS-C5] Throws if staging buffer is empty\n */\n async commit(message: string, author?: CommitAuthor): Promise<string> {\n return this.commitInternal(message, author, false);\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY B: NO-OPS (sensible defaults)\n // ═══════════════════════════════════════════════════════════════\n\n /** [EARS-D5] exec not supported in API mode */\n async exec(\n _command: string,\n _args: string[],\n _options?: ExecOptions\n ): Promise<ExecResult> {\n return { exitCode: 1, stdout: '', stderr: 'exec() not supported in GitHub API mode' };\n }\n\n /** No-op: repos are created via GitHub API, not initialized locally */\n async init(): Promise<void> {\n // No-op\n }\n\n /** [EARS-D1] Return virtual path representing the repo */\n async getRepoRoot(): Promise<string> {\n return `github://${this.owner}/${this.repo}`;\n }\n\n /** [EARS-D1] Return active ref (starts as defaultBranch) */\n async getCurrentBranch(): Promise<string> {\n return this.activeRef;\n }\n\n /** No-op: git config doesn't apply to GitHub API */\n async setConfig(\n _key: string,\n _value: string,\n _scope?: 'local' | 'global' | 'system'\n ): Promise<void> {\n // No-op\n }\n\n /** [EARS-D1] Return true if staging buffer has entries */\n async hasUncommittedChanges(_pathFilter?: string): Promise<boolean> {\n return this.stagingBuffer.size > 0;\n }\n\n /** No-op: GitHub API doesn't have rebase-in-progress concept */\n async isRebaseInProgress(): Promise<boolean> {\n return false;\n }\n\n /** [EARS-D1] GitHub repos always have 'origin' conceptually */\n async isRemoteConfigured(_remoteName: string): Promise<boolean> {\n return true;\n }\n\n /** No-op: always 'origin' */\n async getBranchRemote(_branchName: string): Promise<string | null> {\n return 'origin';\n }\n\n /** No-op: GitHub API handles merges atomically */\n async getConflictedFiles(): Promise<string[]> {\n return [];\n }\n\n /** [EARS-D2] Update activeRef for subsequent operations */\n async checkoutBranch(branchName: string): Promise<void> {\n this.activeRef = branchName;\n }\n\n /** No-op: GitHub API doesn't have stash concept */\n async stash(_message?: string): Promise<string | null> {\n return null;\n }\n\n /** No-op */\n async stashPop(): Promise<boolean> {\n return false;\n }\n\n /** No-op */\n async stashDrop(_stashHash?: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API always fresh */\n async fetch(_remote: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API mode */\n async pull(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API mode */\n async pullRebase(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** [EARS-D4] No-op: commits via API are already remote */\n async push(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** [EARS-D4] No-op: commits via API are already remote */\n async pushWithUpstream(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API mode */\n async setUpstream(\n _branchName: string,\n _remote: string,\n _remoteBranch: string\n ): Promise<void> {\n // No-op\n }\n\n /** No-op */\n async rebaseAbort(): Promise<void> {\n // No-op\n }\n\n /** [EARS-D1] Delegates to commitInternal, allowing empty staging buffer */\n async commitAllowEmpty(message: string, author?: CommitAuthor): Promise<string> {\n return this.commitInternal(message, author, true);\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY C: NOT SUPPORTED (throw GitError)\n // ═══════════════════════════════════════════════════════════════\n\n /** [EARS-D3] Not supported via GitHub API */\n async rebase(_targetBranch: string): Promise<void> {\n this.notSupported('rebase');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async rebaseContinue(): Promise<string> {\n this.notSupported('rebaseContinue');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async resetHard(_target: string): Promise<void> {\n this.notSupported('resetHard');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async checkoutOrphanBranch(_branchName: string): Promise<void> {\n this.notSupported('checkoutOrphanBranch');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async checkoutFilesFromBranch(\n _sourceBranch: string,\n _filePaths: string[]\n ): Promise<void> {\n this.notSupported('checkoutFilesFromBranch');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async getMergeBase(_branchA: string, _branchB: string): Promise<string> {\n this.notSupported('getMergeBase');\n }\n}\n","/**\n * GitHubConfigStore - GitHub Contents API implementation of ConfigStore\n *\n * Persists config.json to a GitHub repository via Octokit.\n * Used by SaaS/server-side environments where the project lives on GitHub\n * and direct filesystem access is not available.\n *\n * Key behaviors:\n * - loadConfig: GET contents, base64 decode, JSON parse. Fail-safe on 404/invalid JSON.\n * - saveConfig: JSON serialize + base64 encode, PUT contents with optional SHA for updates.\n * - Caches blob SHA from loadConfig for subsequent saveConfig (optimistic concurrency).\n */\n\nimport type { Octokit } from '@octokit/rest';\nimport type { ConfigStore } from '../config_store';\nimport type { GitGovConfig } from '../../config_manager/config_manager.types';\nimport type { GitHubConfigStoreOptions, GitHubSaveResult } from './github_config_store.types';\nimport { mapOctokitError, isOctokitRequestError } from '../../github';\n\nexport class GitHubConfigStore implements ConfigStore<GitHubSaveResult> {\n private readonly owner: string;\n private readonly repo: string;\n private readonly ref: string;\n private readonly basePath: string;\n private readonly octokit: Octokit;\n\n /** Cached blob SHA from the last loadConfig call, used for PUT updates */\n private cachedSha: string | null = null;\n\n constructor(options: GitHubConfigStoreOptions, octokit: Octokit) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.ref = options.ref ?? 'gitgov-state';\n this.basePath = options.basePath ?? '.gitgov';\n this.octokit = octokit;\n }\n\n /**\n * Load project configuration from GitHub Contents API.\n *\n * [EARS-A1] Returns GitGovConfig when valid JSON is found.\n * [EARS-A2] Returns null on 404 (fail-safe).\n * [EARS-A3] Returns null on invalid JSON (fail-safe).\n * [EARS-B1] Fetches via Contents API with base64 decode.\n * [EARS-B2] Caches SHA from response for subsequent saveConfig.\n */\n async loadConfig(): Promise<GitGovConfig | null> {\n const path = `${this.basePath}/config.json`;\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path,\n ref: this.ref,\n });\n\n // getContent can return array (directory) — we expect a file\n if (Array.isArray(data) || data.type !== 'file') {\n return null;\n }\n\n // Decode base64 content\n if (!data.content) {\n return null;\n }\n\n // Cache SHA for subsequent saveConfig (only when content is present)\n this.cachedSha = data.sha;\n\n try {\n const decoded = Buffer.from(data.content, 'base64').toString('utf-8');\n return JSON.parse(decoded) as GitGovConfig;\n } catch {\n // Invalid JSON - fail-safe\n return null;\n }\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return null;\n }\n throw mapOctokitError(error, `loadConfig ${this.owner}/${this.repo}/${path}`);\n }\n }\n\n /**\n * Save project configuration to GitHub via Contents API PUT.\n *\n * [EARS-A4] Writes config via PUT to Contents API.\n * [EARS-B3] Includes cached SHA for updates (optimistic concurrency).\n * [EARS-B4] Omits SHA for initial creation.\n * [EARS-C1] Throws PERMISSION_DENIED on 401/403.\n * [EARS-C2] Throws CONFLICT on 409.\n * [EARS-C3] Throws SERVER_ERROR on 5xx.\n */\n async saveConfig(config: GitGovConfig): Promise<GitHubSaveResult> {\n const path = `${this.basePath}/config.json`;\n const content = Buffer.from(JSON.stringify(config, null, 2)).toString('base64');\n\n try {\n const { data } = await this.octokit.rest.repos.createOrUpdateFileContents({\n owner: this.owner,\n repo: this.repo,\n path,\n message: 'chore(config): update gitgov config.json',\n content,\n branch: this.ref,\n ...(this.cachedSha ? { sha: this.cachedSha } : {}),\n });\n\n // Update cached SHA for subsequent saves\n if (data.content?.sha) {\n this.cachedSha = data.content.sha;\n }\n\n return { commitSha: data.commit.sha! };\n } catch (error: unknown) {\n throw mapOctokitError(error, `saveConfig ${this.owner}/${this.repo}/${path}`);\n }\n }\n}\n","import type { IGitModule } from '../git';\nimport type { ConfigManager } from \"../config_manager\";\nimport type { IIdentityAdapter } from \"../adapters/identity_adapter\";\nimport type { LintReport } from \"../lint\";\nimport type { ILintModule } from \"../lint\";\nimport type { IRecordProjector } from \"../record_projection\";\n\n/**\n * SyncStateModule Dependencies\n */\nexport type SyncStateModuleDependencies = {\n /** Low-level Git module (required) */\n git: IGitModule;\n /** Configuration manager (required) */\n config: ConfigManager;\n /** Identity adapter for signature verification and signing (required) */\n identity: IIdentityAdapter;\n /** Lint module for record validation (required) */\n lint: ILintModule;\n /** Record projector for automatic re-indexing after pull/resolve (required) */\n indexer: IRecordProjector;\n}\n\n/**\n * Options for pushState operation\n */\nexport type SyncStatePushOptions = {\n /** Branch to push from (default: current branch) */\n sourceBranch?: string;\n /** Actor ID publishing the state (required) */\n actorId: string;\n /** Simulate operation without making real changes */\n dryRun?: boolean;\n /** Force push even if there are unsynced remote changes */\n force?: boolean;\n}\n\n/**\n * Result of pushState operation\n */\nexport type SyncStatePushResult = {\n /** Indicates if the operation was successful */\n success: boolean;\n /** Number of files synced */\n filesSynced: number;\n /** Name of the branch pushed from */\n sourceBranch: string;\n /** Created commit hash (null if no changes or dry-run) */\n commitHash: string | null;\n /** Created commit message */\n commitMessage: string | null;\n /** Indicates if a conflict was detected during reconciliation */\n conflictDetected: boolean;\n /** Conflict information if detected */\n conflictInfo?: ConflictInfo;\n /** Error message if operation failed */\n error?: string;\n /** [EARS-B16] Implicit pull results when push does reconciliation with remote */\n implicitPull?: {\n /** Whether changes were pulled from remote */\n hasChanges: boolean;\n /** Number of files updated from remote */\n filesUpdated: number;\n /** Whether index was regenerated */\n reindexed: boolean;\n };\n}\n\n/**\n * Options for pullState operation\n */\nexport type SyncStatePullOptions = {\n /** Force re-indexing even if there are no new changes */\n forceReindex?: boolean;\n /** [EARS-C11] Force pull even if local changes would be overwritten */\n force?: boolean;\n}\n\n/**\n * Result of pullState operation\n */\nexport type SyncStatePullResult = {\n /** Indicates if the operation was successful */\n success: boolean;\n /** Indicates if there were new remote changes */\n hasChanges: boolean;\n /** Number of files updated */\n filesUpdated: number;\n /** Indicates if re-indexing was executed */\n reindexed: boolean;\n /** Indicates if a conflict was detected during pull */\n conflictDetected: boolean;\n /** Conflict information if detected */\n conflictInfo?: ConflictInfo;\n /** Error message if operation failed */\n error?: string;\n /** [EARS-C11] Files that were forcefully overwritten (when force: true) */\n forcedOverwrites?: string[];\n}\n\n/**\n * Options for resolveConflict operation\n */\nexport type SyncStateResolveOptions = {\n /** Justification for the conflict resolution (required) */\n reason: string;\n /** Actor ID resolving the conflict (required) */\n actorId: string;\n}\n\n/**\n * Result of resolveConflict operation\n */\nexport type SyncStateResolveResult = {\n /** Indicates if the operation was successful */\n success: boolean;\n /** Commit hash of the created rebase commit */\n rebaseCommitHash: string;\n /** Commit hash of the signed resolution commit */\n resolutionCommitHash: string;\n /** Number of conflicts resolved */\n conflictsResolved: number;\n /** Actor ID who resolved the conflict */\n resolvedBy: string;\n /** Reason for resolution */\n reason: string;\n /** Error message if operation failed */\n error?: string;\n}\n\n/**\n * Detailed information about a detected conflict\n */\nexport type ConflictInfo = {\n /** Type of conflict detected */\n type: ConflictType;\n /** Files affected by the conflict */\n affectedFiles: string[];\n /** Descriptive message of the conflict */\n message: string;\n /** Instructions to resolve the conflict */\n resolutionSteps: string[];\n}\n\n/**\n * Auxiliary type to identify the conflict type\n *\n * Git-Native conflict model (post-refactor):\n * - rebase_conflict: Used for all Git-level conflicts during push/pull\n * - local_changes_conflict: Used when pull would overwrite local changes (EARS-C10)\n * - integrity_violation: Used when resolution commits are missing\n */\nexport type ConflictType =\n | \"rebase_conflict\" // Conflict during automatic rebase (Git-native, includes EARS-B23 scenarios)\n | \"integrity_violation\" // Integrity violation (rebase without resolution commit)\n | \"local_changes_conflict\"; // [EARS-C10] Local changes would be overwritten by pull\n\n/**\n * Information about a detected integrity violation\n */\nexport type IntegrityViolation = {\n /** Commit hash of the rebase commit without resolution */\n rebaseCommitHash: string;\n /** Message of the rebase commit */\n commitMessage: string;\n /** Timestamp of the commit */\n timestamp: string;\n /** Author of the commit */\n author: string;\n}\n\n/**\n * Verification scope for state audit\n */\nexport type AuditScope =\n | \"current\" // Only verify Records in the current branch (useful for pre-push)\n | \"state-branch\" // Only verify Records in gitgov-state (useful for remote audit)\n | \"all\"; // Verify both (useful for complete audit)\n\n/**\n * Scope for expected files verification\n */\nexport type ExpectedFilesScope =\n | \"head\" // Only verify in HEAD of gitgov-state (default, faster)\n | \"all-commits\"; // Verify in all commits (more exhaustive, slower)\n\n/**\n * Options for state audit\n */\nexport type AuditStateOptions = {\n /** Verification scope: which Records to verify (default: \"all\") */\n scope?: AuditScope;\n /** Verify signatures in Records (default: true) */\n verifySignatures?: boolean;\n /** Verify checksums of Records (default: true) */\n verifyChecksums?: boolean;\n /** Verify that expected files exist (default: true) */\n verifyExpectedFiles?: boolean;\n /** Scope for expected files verification (default: \"head\") */\n expectedFilesScope?: ExpectedFilesScope;\n /** Path of specific files to audit (default: all in .gitgov/) */\n filePaths?: string[];\n}\n\n/**\n * Conflict diff information for a file\n */\nexport type ConflictFileDiff = {\n /** Path of the conflicted file */\n filePath: string;\n /** Content of the local version (ours) */\n localContent: string;\n /** Content of the remote version (theirs) */\n remoteContent: string;\n /** Base content (common ancestor) */\n baseContent: string | null;\n /** Lines with conflict markers (if they still exist) */\n conflictMarkers?: Array<{\n line: number;\n marker: string; // \"<<<<<\", \"=====\", \">>>>>\"\n }>;\n}\n\n/**\n * Structured conflict diff\n */\nexport type ConflictDiff = {\n /** Conflicted files with their diff */\n files: ConflictFileDiff[];\n /** Descriptive message of the conflict */\n message: string;\n /** Instructions to resolve */\n resolutionSteps: string[];\n}\n\n/**\n * Complete state audit report\n * \n * This report combines SyncStateModule-specific audits (rebase integrity, commits)\n * with structural validation from LintModule (signatures, checksums, schemas).\n */\nexport type AuditStateReport = {\n /** Indicates if the audit passed without violations */\n passed: boolean;\n /** Scope used for the audit */\n scope: AuditScope;\n /** Total commits analyzed */\n totalCommits: number;\n /** Rebase commits found */\n rebaseCommits: number;\n /** Resolution commits found */\n resolutionCommits: number;\n /** Integrity violations of resolutions (SyncStateModule-specific) */\n integrityViolations: IntegrityViolation[];\n /** Summary message of the audit */\n summary: string;\n /** Complete LintModule report for structural validation (signatures, checksums, schemas, etc.) */\n lintReport?: LintReport;\n}\n\n/**\n * Information of a changed file in the delta\n */\nexport type StateDeltaFile = {\n /** File status: Added, Modified, Deleted */\n status: \"A\" | \"M\" | \"D\";\n /** File path */\n file: string;\n}\n\n/**\n * Whitelist of files and directories allowed for synchronization.\n * Only these paths will be copied from .gitgov/ to gitgov-state.\n * \n * [EARS-B9] Explicitly defines what gets synced, avoiding temporary files,\n * builds, scripts, and local configurations like .gitignore\n * \n * Excluded (not in whitelist):\n * - builds/ (local build artifacts)\n * - scripts/ (local helper scripts)\n * - .gitignore (per-branch file, should not be synced)\n * - *.backup-* (backup files)\n * - *.tmp (temporary files)\n * - .DS_Store (macOS metadata)\n */\n/**\n * Directories to SYNC to gitgov-state branch (shared state)\n * Only *.json files within these directories will be synced\n */\nexport const SYNC_DIRECTORIES = [\n 'tasks',\n 'cycles',\n 'actors',\n 'agents',\n 'feedbacks',\n 'executions',\n 'changelogs',\n 'workflows',\n] as const;\n\n/**\n * Root-level files to SYNC to gitgov-state\n */\nexport const SYNC_ROOT_FILES = [\n 'config.json',\n] as const;\n\n/**\n * File extensions that are ALLOWED to be synced\n * Only these extensions will be copied to gitgov-state\n */\nexport const SYNC_ALLOWED_EXTENSIONS = ['.json'] as const;\n\n/**\n * File patterns that are NEVER synced (even if they match allowed extensions)\n * These are excluded from gitgov-state branch\n */\nexport const SYNC_EXCLUDED_PATTERNS = [\n /\\.key$/, // Private keys (e.g., keys/*.key)\n /\\.backup$/, // Backup files from lint\n /\\.backup-\\d+$/, // Numbered backup files\n /\\.tmp$/, // Temporary files\n /\\.bak$/, // Backup files\n] as const;\n\n/**\n * Files/directories that are LOCAL-ONLY (never synced to gitgov-state)\n * These are regenerated or machine-specific\n */\nexport const LOCAL_ONLY_FILES = [\n 'index.json', // Generated index, rebuilt on each machine\n '.session.json', // Local session state for current user/agent\n 'gitgov', // Local binary/script\n] as const;\n\n","/**\n * Shared utilities for SyncState modules (FsSyncState, GithubSyncState).\n *\n * @module sync_state/utils\n */\n\nimport path from \"path\";\nimport {\n SYNC_DIRECTORIES,\n SYNC_ROOT_FILES,\n SYNC_ALLOWED_EXTENSIONS,\n SYNC_EXCLUDED_PATTERNS,\n LOCAL_ONLY_FILES,\n} from \"./sync_state.types\";\n\n/**\n * Check if a file should be synced to gitgov-state.\n * Returns true only for allowed *.json files in SYNC_DIRECTORIES or SYNC_ROOT_FILES.\n *\n * Accepts paths in multiple formats:\n * - .gitgov/tasks/foo.json (git ls-files output)\n * - /absolute/path/.gitgov/tasks/foo.json\n * - /tmp/tempdir/tasks/foo.json (tempDir copy without .gitgov)\n * - tasks/foo.json (relative to .gitgov)\n */\nexport function shouldSyncFile(filePath: string): boolean {\n const fileName = path.basename(filePath);\n const ext = path.extname(filePath);\n\n // Check if extension is allowed\n if (!SYNC_ALLOWED_EXTENSIONS.includes(ext as typeof SYNC_ALLOWED_EXTENSIONS[number])) {\n return false;\n }\n\n // Check if file matches any excluded pattern (.key, .backup, etc.)\n for (const pattern of SYNC_EXCLUDED_PATTERNS) {\n if (pattern.test(fileName)) {\n return false;\n }\n }\n\n // Check if it's a local-only file (.session.json, index.json, gitgov)\n if (LOCAL_ONLY_FILES.includes(fileName as typeof LOCAL_ONLY_FILES[number])) {\n return false;\n }\n\n // CRITICAL: Verify file is in an allowed sync directory or is a root sync file\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n const parts = normalizedPath.split('/');\n\n // Find .gitgov in path and get the part after it\n const gitgovIndex = parts.findIndex(p => p === '.gitgov');\n\n let relativeParts: string[];\n if (gitgovIndex !== -1) {\n // Path contains .gitgov: .gitgov/tasks/foo.json or /path/.gitgov/tasks/foo.json\n relativeParts = parts.slice(gitgovIndex + 1);\n } else {\n // Path is relative to .gitgov or from tempDir: tasks/foo.json or /tmp/tempdir/tasks/foo.json\n // Check if any part matches a sync directory\n const syncDirIndex = parts.findIndex(p =>\n SYNC_DIRECTORIES.includes(p as typeof SYNC_DIRECTORIES[number])\n );\n if (syncDirIndex !== -1) {\n relativeParts = parts.slice(syncDirIndex);\n } else if (SYNC_ROOT_FILES.includes(fileName as typeof SYNC_ROOT_FILES[number])) {\n // It's a root sync file like config.json\n return true;\n } else {\n return false;\n }\n }\n\n if (relativeParts.length === 1) {\n // Root file: config.json\n return SYNC_ROOT_FILES.includes(relativeParts[0] as typeof SYNC_ROOT_FILES[number]);\n } else if (relativeParts.length >= 2) {\n // Directory file: tasks/foo.json\n const dirName = relativeParts[0];\n return SYNC_DIRECTORIES.includes(dirName as typeof SYNC_DIRECTORIES[number]);\n }\n\n return false;\n}\n\n/**\n * Filter an array of file paths, returning only those that should be synced.\n */\nexport function filterSyncableFiles(files: string[]): string[] {\n return files.filter(shouldSyncFile);\n}\n","/**\n * GithubSyncStateModule — ISyncStateModule via GitHub API (Octokit)\n *\n * Implements state synchronization between .gitgov/ records and a shared\n * gitgov-state branch using the GitHub Trees/Commits/Refs API.\n * No local filesystem or git CLI required.\n *\n * Blueprint: github_sync_state_module.md\n * @module sync_state/github_sync_state\n */\n\nimport type { ISyncStateModule } from '../sync_state';\nimport type {\n SyncStatePushOptions,\n SyncStatePushResult,\n SyncStatePullOptions,\n SyncStatePullResult,\n SyncStateResolveOptions,\n SyncStateResolveResult,\n AuditStateOptions,\n AuditStateReport,\n ConflictDiff,\n IntegrityViolation,\n StateDeltaFile,\n} from '../sync_state.types';\nimport type { GithubSyncStateDependencies } from './github_sync_state.types';\nimport type { LintReport, LintResult } from '../../lint';\nimport type { GitGovRecord, GitGovRecordType } from '../../record_types';\nimport { shouldSyncFile } from '../sync_state.utils';\nimport { isOctokitRequestError } from '../../github';\n\n/**\n * [EARS-GS-A1..F2] GithubSyncStateModule\n *\n * Synchronizes .gitgov/ state with a GitHub remote via API.\n * Uses optimistic concurrency (SHA-based) instead of rebase.\n */\nexport class GithubSyncStateModule implements ISyncStateModule {\n private readonly deps: GithubSyncStateDependencies;\n private lastKnownSha: string | null = null;\n\n constructor(deps: GithubSyncStateDependencies) {\n this.deps = deps;\n }\n\n // ==================== Block A: Branch Management ====================\n\n /**\n * [EARS-GS-A3] Returns the configured state branch name.\n */\n async getStateBranchName(): Promise<string> {\n return 'gitgov-state';\n }\n\n /**\n * [EARS-GS-A1] Creates gitgov-state branch if it does not exist.\n * [EARS-GS-A2] Idempotent — no-op if branch already exists.\n */\n async ensureStateBranch(): Promise<void> {\n const branchName = await this.getStateBranchName();\n\n try {\n // Check if branch exists\n await this.deps.octokit.rest.repos.getBranch({\n owner: this.deps.owner,\n repo: this.deps.repo,\n branch: branchName,\n });\n // [EARS-GS-A2] Branch exists, nothing to do\n return;\n } catch (error: unknown) {\n if (!isOctokitRequestError(error) || error.status !== 404) {\n throw error;\n }\n }\n\n // [EARS-GS-A1] Branch does not exist — create from default branch HEAD\n const { data: repoData } = await this.deps.octokit.rest.repos.get({\n owner: this.deps.owner,\n repo: this.deps.repo,\n });\n const defaultBranch = repoData.default_branch;\n\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${defaultBranch}`,\n });\n\n await this.deps.octokit.rest.git.createRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `refs/heads/${branchName}`,\n sha: refData.object.sha,\n });\n }\n\n // ==================== Block B: Push State ====================\n\n /**\n * [EARS-GS-B1..B5] Push local .gitgov/ state to gitgov-state branch via API.\n *\n * Uses the 6-step atomic commit pattern:\n * getRef → getCommit → createBlob → createTree → createCommit → updateRef\n *\n * Optimistic concurrency: if remote ref advanced since our read, updateRef\n * fails with 422 → return conflictDetected: true.\n */\n async pushState(options: SyncStatePushOptions): Promise<SyncStatePushResult> {\n const branchName = await this.getStateBranchName();\n const sourceBranch = options.sourceBranch ?? 'main';\n\n try {\n // Step 1: Get current gitgov-state ref SHA\n const { data: stateRefData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n const currentSha = stateRefData.object.sha;\n\n // Step 2: Get source branch tree (files from .gitgov/ on source branch)\n const { data: sourceTree } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: sourceBranch,\n recursive: 'true',\n });\n\n const sourceFiles = (sourceTree.tree ?? []).filter(\n (item) => item.type === 'blob' && item.path?.startsWith('.gitgov/') && shouldSyncFile(item.path)\n );\n\n // Step 3: Get target tree (current gitgov-state contents)\n const { data: targetCommit } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: currentSha,\n });\n\n const { data: targetTree } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: targetCommit.tree.sha,\n recursive: 'true',\n });\n\n const targetFileMap = new Map<string, string>();\n for (const item of targetTree.tree ?? []) {\n if (item.type === 'blob' && item.path && item.sha) {\n targetFileMap.set(item.path, item.sha);\n }\n }\n\n // Step 4: Diff trees — find files that changed\n const delta: StateDeltaFile[] = [];\n const treeEntries: Array<{\n path: string;\n mode: '100644';\n type: 'blob';\n sha: string | null;\n }> = [];\n\n // Files in source that differ from target (add/modify)\n for (const sourceFile of sourceFiles) {\n if (!sourceFile.path || !sourceFile.sha) continue;\n // Strip .gitgov/ prefix for gitgov-state branch (files live at root)\n const statePath = sourceFile.path.replace(/^\\.gitgov\\//, '');\n const targetSha = targetFileMap.get(statePath);\n\n if (targetSha !== sourceFile.sha) {\n delta.push({\n status: targetSha ? 'M' : 'A',\n file: statePath,\n });\n treeEntries.push({\n path: statePath,\n mode: '100644',\n type: 'blob',\n sha: sourceFile.sha,\n });\n }\n targetFileMap.delete(statePath);\n }\n\n // Files in target but not in source (deleted)\n for (const [deletedPath] of targetFileMap) {\n if (shouldSyncFile(deletedPath)) {\n delta.push({ status: 'D', file: deletedPath });\n treeEntries.push({\n path: deletedPath,\n mode: '100644',\n type: 'blob',\n sha: null,\n });\n }\n }\n\n // [EARS-GS-B5] No changes\n if (delta.length === 0) {\n return {\n success: true,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: false,\n };\n }\n\n // [EARS-GS-B3] Dry run — return delta without creating commit\n if (options.dryRun) {\n return {\n success: true,\n filesSynced: delta.length,\n sourceBranch,\n commitHash: null,\n commitMessage: `[dry-run] gitgov sync: ${delta.length} files`,\n conflictDetected: false,\n };\n }\n\n // Step 5: Create new tree\n const { data: newTreeData } = await this.deps.octokit.rest.git.createTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n base_tree: targetCommit.tree.sha,\n tree: treeEntries,\n });\n\n // Step 6: Create commit\n const commitMessage = `gitgov sync: ${delta.length} files from ${sourceBranch}`;\n const { data: newCommitData } = await this.deps.octokit.rest.git.createCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n message: commitMessage,\n tree: newTreeData.sha,\n parents: [currentSha],\n });\n\n // Step 7: Update ref (optimistic concurrency)\n try {\n await this.deps.octokit.rest.git.updateRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n sha: newCommitData.sha,\n });\n } catch (error: unknown) {\n // [EARS-GS-B2] SHA mismatch — remote advanced\n if (isOctokitRequestError(error) && (error.status === 422 || error.status === 409)) {\n return {\n success: false,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: true,\n conflictInfo: {\n type: 'rebase_conflict',\n affectedFiles: delta.map((d) => d.file),\n message: 'Remote gitgov-state ref has advanced since last read. Pull and retry.',\n resolutionSteps: [\n 'Call pullState() to fetch latest remote state',\n 'Retry pushState() with updated parent SHA',\n ],\n },\n };\n }\n throw error;\n }\n\n // [EARS-GS-B4] Success\n this.lastKnownSha = newCommitData.sha;\n return {\n success: true,\n filesSynced: delta.length,\n sourceBranch,\n commitHash: newCommitData.sha,\n commitMessage,\n conflictDetected: false,\n };\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n return {\n success: false,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: false,\n error: `GitHub API error (${error.status}): ${error.message}`,\n };\n }\n const msg = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: false,\n error: msg,\n };\n }\n }\n\n // ==================== Block C: Pull State ====================\n\n /**\n * [EARS-GS-C1..C4] Pull remote state from gitgov-state branch.\n *\n * Fetches tree + blobs, updates lastKnownSha, triggers re-indexing.\n */\n async pullState(options?: SyncStatePullOptions): Promise<SyncStatePullResult> {\n const branchName = await this.getStateBranchName();\n\n // [EARS-GS-C4] Check if branch exists\n let remoteSha: string;\n try {\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n remoteSha = refData.object.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return {\n success: true,\n hasChanges: false,\n filesUpdated: 0,\n reindexed: false,\n conflictDetected: false,\n };\n }\n throw error;\n }\n\n // [EARS-GS-C2] No changes if SHA matches (unless forceReindex)\n if (this.lastKnownSha === remoteSha && !options?.forceReindex) {\n return {\n success: true,\n hasChanges: false,\n filesUpdated: 0,\n reindexed: false,\n conflictDetected: false,\n };\n }\n\n // [EARS-GS-C1] Fetch tree contents\n const { data: commitData } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: remoteSha,\n });\n\n const { data: treeData } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: commitData.tree.sha,\n recursive: 'true',\n });\n\n const syncableFiles = (treeData.tree ?? []).filter(\n (item) => item.type === 'blob' && item.path && shouldSyncFile(item.path)\n );\n\n const filesUpdated = syncableFiles.length;\n\n // Update tracking SHA\n this.lastKnownSha = remoteSha;\n\n // [EARS-GS-C3] Trigger re-indexing\n let reindexed = false;\n if (filesUpdated > 0 || options?.forceReindex) {\n try {\n await this.deps.indexer.computeProjection();\n reindexed = true;\n } catch {\n // Re-indexing failure is non-fatal for pull\n reindexed = false;\n }\n }\n\n return {\n success: true,\n hasChanges: filesUpdated > 0,\n filesUpdated,\n reindexed,\n conflictDetected: false,\n };\n }\n\n // ==================== Block D: Change Detection ====================\n\n /**\n * [EARS-GS-D1..D3] Calculate file delta between known state and current remote.\n */\n async calculateStateDelta(_sourceBranch: string): Promise<StateDeltaFile[]> {\n const branchName = await this.getStateBranchName();\n\n // Get current remote SHA\n let currentSha: string;\n try {\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n currentSha = refData.object.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return [];\n }\n throw error;\n }\n\n // [EARS-GS-D2] No changes if SHAs match\n if (this.lastKnownSha === currentSha) {\n return [];\n }\n\n // [EARS-GS-D3] Full sync if lastKnownSha is unknown\n if (this.lastKnownSha === null) {\n const { data: commitData } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: currentSha,\n });\n\n const { data: treeData } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: commitData.tree.sha,\n recursive: 'true',\n });\n\n return (treeData.tree ?? [])\n .filter((item) => item.type === 'blob' && item.path && shouldSyncFile(item.path))\n .map((item) => ({\n status: 'A' as const,\n file: item.path!,\n }));\n }\n\n // [EARS-GS-D1] Compare commits for delta\n const { data: comparison } = await this.deps.octokit.rest.repos.compareCommits({\n owner: this.deps.owner,\n repo: this.deps.repo,\n base: this.lastKnownSha,\n head: currentSha,\n });\n\n return (comparison.files ?? [])\n .filter((file) => shouldSyncFile(file.filename))\n .map((file) => ({\n status: (file.status === 'added' ? 'A' : file.status === 'removed' ? 'D' : 'M') as 'A' | 'M' | 'D',\n file: file.filename,\n }));\n }\n\n /**\n * Always empty — no local pending changes in API mode.\n * In API mode there is no local filesystem; all state is remote.\n */\n async getPendingChanges(): Promise<StateDeltaFile[]> {\n return [];\n }\n\n // ==================== Block E: Conflict Handling ====================\n\n /**\n * Always false — no rebase in API mode.\n */\n async isRebaseInProgress(): Promise<boolean> {\n return false;\n }\n\n /**\n * Always empty — no conflict markers in API mode.\n */\n async checkConflictMarkers(_filePaths: string[]): Promise<string[]> {\n return [];\n }\n\n /**\n * Empty diff — no git-level conflict markers in API mode.\n */\n async getConflictDiff(_filePaths?: string[]): Promise<ConflictDiff> {\n return {\n files: [],\n message: 'No conflict markers in API mode. Conflicts are SHA-based.',\n resolutionSteps: [\n 'Call pullState() to fetch latest remote state',\n 'Retry pushState() with updated records',\n ],\n };\n }\n\n /**\n * [EARS-GS-E1..E2] Resolve conflict by pulling latest and retrying push.\n */\n async resolveConflict(options: SyncStateResolveOptions): Promise<SyncStateResolveResult> {\n // [EARS-GS-E1] Pull latest state\n const pullResult = await this.pullState({ forceReindex: false });\n\n if (!pullResult.success) {\n return {\n success: false,\n rebaseCommitHash: '',\n resolutionCommitHash: '',\n conflictsResolved: 0,\n resolvedBy: options.actorId,\n reason: options.reason,\n error: `Pull failed during conflict resolution: ${pullResult.error}`,\n };\n }\n\n // Retry push with latest parent SHA\n const pushResult = await this.pushState({\n actorId: options.actorId,\n });\n\n // [EARS-GS-E2] If push still fails, content conflict\n if (!pushResult.success || pushResult.conflictDetected) {\n const errorMsg = pushResult.conflictDetected\n ? 'Content conflict: same file modified by both sides. Manual resolution required.'\n : (pushResult.error ?? 'Unknown push error');\n return {\n success: false,\n rebaseCommitHash: '',\n resolutionCommitHash: '',\n conflictsResolved: 0,\n resolvedBy: options.actorId,\n reason: options.reason,\n error: errorMsg,\n };\n }\n\n return {\n success: true,\n rebaseCommitHash: this.lastKnownSha ?? '',\n resolutionCommitHash: pushResult.commitHash ?? '',\n conflictsResolved: pushResult.filesSynced,\n resolvedBy: options.actorId,\n reason: options.reason,\n };\n }\n\n /**\n * No integrity violations in API mode (no rebase commits).\n */\n async verifyResolutionIntegrity(): Promise<IntegrityViolation[]> {\n return [];\n }\n\n // ==================== Block F: Audit ====================\n\n /**\n * [EARS-GS-F1..F2] Audit the remote gitgov-state branch.\n */\n async auditState(options?: AuditStateOptions): Promise<AuditStateReport> {\n const branchName = await this.getStateBranchName();\n const scope = options?.scope ?? 'all';\n\n // Get commit history\n let totalCommits = 0;\n try {\n const { data: commits } = await this.deps.octokit.rest.repos.listCommits({\n owner: this.deps.owner,\n repo: this.deps.repo,\n sha: branchName,\n per_page: 100,\n });\n totalCommits = commits.length;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return {\n passed: true,\n scope,\n totalCommits: 0,\n rebaseCommits: 0,\n resolutionCommits: 0,\n integrityViolations: [],\n summary: 'Branch gitgov-state does not exist. No audit needed.',\n };\n }\n throw error;\n }\n\n // No rebase commits in API mode\n const rebaseCommits = 0;\n const resolutionCommits = 0;\n const integrityViolations: IntegrityViolation[] = [];\n\n // [EARS-GS-F1] Validate records via lint if requested\n let lintReport: LintReport | undefined;\n if (options?.verifySignatures !== false || options?.verifyChecksums !== false) {\n try {\n // Fetch tree to get records\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n\n const { data: commitData } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: refData.object.sha,\n });\n\n const { data: treeData } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: commitData.tree.sha,\n recursive: 'true',\n });\n\n const treeItems = (treeData.tree ?? [])\n .filter((item) => item.type === 'blob' && item.path && item.sha && shouldSyncFile(item.path));\n\n // Fetch each record blob and validate via lintRecord()\n const startTime = Date.now();\n const allResults: LintResult[] = [];\n let filesChecked = 0;\n\n for (const item of treeItems) {\n try {\n const { data: blobData } = await this.deps.octokit.rest.git.getBlob({\n owner: this.deps.owner,\n repo: this.deps.repo,\n file_sha: item.sha!,\n });\n const content = Buffer.from(blobData.content, 'base64').toString('utf-8');\n const record = JSON.parse(content) as GitGovRecord;\n const entityType = pathToEntityType(item.path!);\n\n if (entityType) {\n const results = this.deps.lint.lintRecord(record, {\n recordId: item.path!.split('/').pop()?.replace('.json', '') ?? item.path!,\n entityType,\n filePath: item.path,\n });\n allResults.push(...results);\n }\n filesChecked++;\n } catch {\n // Skip unreadable/unparseable blobs\n }\n }\n\n // Aggregate results into LintReport\n if (filesChecked > 0) {\n lintReport = {\n summary: {\n filesChecked,\n errors: allResults.filter((r) => r.level === 'error').length,\n warnings: allResults.filter((r) => r.level === 'warning').length,\n fixable: allResults.filter((r) => r.fixable).length,\n executionTime: Date.now() - startTime,\n },\n results: allResults,\n metadata: {\n timestamp: new Date().toISOString(),\n options: {},\n version: '1.0.0',\n },\n };\n }\n } catch {\n // Lint failure is non-fatal for audit\n }\n }\n\n // [EARS-GS-F2] Check lint report for violations\n const lintPassed = !lintReport || lintReport.summary.errors === 0;\n const passed = integrityViolations.length === 0 && lintPassed;\n\n const lintErrors = lintReport?.summary.errors ?? 0;\n let summary: string;\n if (passed) {\n summary = `Audit passed. ${totalCommits} commits analyzed, 0 violations.`;\n } else if (integrityViolations.length > 0 && lintErrors > 0) {\n summary = `Audit failed. ${integrityViolations.length} integrity violations, ${lintErrors} lint errors.`;\n } else if (lintErrors > 0) {\n summary = `Audit failed. ${lintErrors} lint errors found.`;\n } else {\n summary = `Audit failed. ${integrityViolations.length} integrity violations found.`;\n }\n\n const report: AuditStateReport = {\n passed,\n scope,\n totalCommits,\n rebaseCommits,\n resolutionCommits,\n integrityViolations,\n summary,\n };\n\n if (lintReport) {\n report.lintReport = lintReport;\n }\n\n return report;\n }\n}\n\n/**\n * Maps a file path (e.g., \"tasks/task-1.json\") to its GitGovRecordType.\n * Returns undefined for root files (config.json) and directories without\n * a corresponding GitGovRecordType (e.g., workflows/ — present in\n * SYNC_DIRECTORIES but not in GitGovRecordType union).\n * Files with undefined entityType are still counted in filesChecked\n * but skipped for lintRecord() validation.\n */\nfunction pathToEntityType(filePath: string): Exclude<GitGovRecordType, 'custom'> | undefined {\n const dirMap: Record<string, Exclude<GitGovRecordType, 'custom'>> = {\n tasks: 'task',\n cycles: 'cycle',\n actors: 'actor',\n agents: 'agent',\n feedbacks: 'feedback',\n executions: 'execution',\n changelogs: 'changelog',\n };\n const firstSegment = filePath.split('/')[0] ?? '';\n return dirMap[firstSegment];\n}\n","/**\n * GitHub API implementations for @gitgov/core/github\n *\n * This module exports all implementations that use GitHub REST API.\n * Suitable for SaaS environments, Forge apps, GitHub Actions,\n * and any context without local filesystem access.\n *\n * Usage:\n * import { GitHubFileLister, GitHubRecordStore, GitHubGitModule, GitHubConfigStore } from '@gitgov/core/github';\n *\n * Each implementation receives an `Octokit` instance for testability and shared auth/base-URL config.\n */\n\n// ==================== Re-exports: Octokit (types only) ====================\n\nexport type { Octokit, RestEndpointMethodTypes } from '@octokit/rest';\n\n// ==================== Shared Types ====================\n\n/**\n * Error codes for GitHub API errors.\n * Semantic codes that abstract HTTP status codes.\n */\nexport type GitHubApiErrorCode =\n | 'PERMISSION_DENIED'\n | 'NOT_FOUND'\n | 'CONFLICT'\n | 'SERVER_ERROR'\n | 'NETWORK_ERROR'\n | 'INVALID_ID'\n | 'INVALID_RESPONSE';\n\n/**\n * Typed error for GitHub API operations.\n * Used by RecordStore, ConfigStore, and other modules that\n * interact with GitHub Contents API directly.\n */\nexport class GitHubApiError extends Error {\n constructor(\n message: string,\n /** Semantic error code */\n public readonly code: GitHubApiErrorCode,\n /** HTTP status code (if applicable) */\n public readonly statusCode?: number,\n ) {\n super(message);\n this.name = 'GitHubApiError';\n Object.setPrototypeOf(this, GitHubApiError.prototype);\n }\n}\n\n/**\n * Type guard: checks if an error is an Octokit RequestError (duck-typing).\n * Avoids runtime import of ESM-only @octokit/request-error.\n */\nexport function isOctokitRequestError(error: unknown): error is { status: number; message: string } {\n return (\n error instanceof Error &&\n typeof (error as unknown as Record<string, unknown>)['status'] === 'number'\n );\n}\n\n/**\n * Maps Octokit RequestError (and unknown errors) to GitHubApiError.\n * Shared utility used by all GitHub backend modules.\n */\nexport function mapOctokitError(error: unknown, context: string): GitHubApiError {\n if (isOctokitRequestError(error)) {\n const status = error.status;\n\n if (status === 401 || status === 403) {\n return new GitHubApiError(\n `Permission denied: ${context}`,\n 'PERMISSION_DENIED',\n status,\n );\n }\n if (status === 404) {\n return new GitHubApiError(\n `Not found: ${context}`,\n 'NOT_FOUND',\n status,\n );\n }\n if (status === 409) {\n return new GitHubApiError(\n `Conflict: ${context}`,\n 'CONFLICT',\n status,\n );\n }\n if (status === 422) {\n return new GitHubApiError(\n `Validation failed: ${context}`,\n 'CONFLICT',\n status,\n );\n }\n if (status >= 500) {\n return new GitHubApiError(\n `Server error (${status}): ${context}`,\n 'SERVER_ERROR',\n status,\n );\n }\n\n return new GitHubApiError(\n `GitHub API error (${status}): ${context}`,\n 'SERVER_ERROR',\n status,\n );\n }\n\n // Network / unknown errors\n const message = error instanceof Error ? error.message : String(error);\n return new GitHubApiError(`Network error: ${message}`, 'NETWORK_ERROR');\n}\n\n// ==================== Module Exports ====================\n\n// FileLister\nexport { GitHubFileLister } from './file_lister/github';\nexport type {\n GitHubFileListerOptions,\n} from './file_lister/github';\n\n// RecordStore\nexport { GitHubRecordStore } from './record_store/github';\nexport type {\n GitHubRecordStoreOptions,\n GitHubWriteResult,\n GitHubWriteOpts,\n} from './record_store/github';\n\n// GitModule\nexport { GitHubGitModule } from './git/github';\nexport type { GitHubGitModuleOptions } from './git/github';\n\n// ConfigStore\nexport { GitHubConfigStore } from './config_store/github';\nexport type {\n GitHubConfigStoreOptions,\n GitHubSaveResult,\n} from './config_store/github';\n\n// SyncState\nexport { GithubSyncStateModule } from './sync_state/github_sync_state';\nexport type { GithubSyncStateDependencies } from './sync_state/github_sync_state';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sync_state/sync_state.types.ts","../../src/sync_state/sync_state.utils.ts","../../src/sync_state/github_sync_state/github_sync_state.ts","../../src/file_lister/file_lister.errors.ts","../../src/file_lister/github/github_file_lister.ts","../../src/record_store/github/github_record_store.ts","../../src/git/errors.ts","../../src/git/github/github_git_module.ts","../../src/config_store/github/github_config_store.ts","../../src/github.ts"],"names":["path"],"mappings":"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","file":"github.js","sourcesContent":["import type { IGitModule } from '../git';\nimport type { ConfigManager } from \"../config_manager\";\nimport type { IIdentityAdapter } from \"../adapters/identity_adapter\";\nimport type { LintReport } from \"../lint\";\nimport type { ILintModule } from \"../lint\";\nimport type { IRecordProjector } from \"../record_projection\";\n\n/**\n * SyncStateModule Dependencies\n */\nexport type SyncStateModuleDependencies = {\n /** Low-level Git module (required) */\n git: IGitModule;\n /** Configuration manager (required) */\n config: ConfigManager;\n /** Identity adapter for signature verification and signing (required) */\n identity: IIdentityAdapter;\n /** Lint module for record validation (required) */\n lint: ILintModule;\n /** Record projector for automatic re-indexing after pull/resolve (required) */\n indexer: IRecordProjector;\n}\n\n/**\n * Options for pushState operation\n */\nexport type SyncStatePushOptions = {\n /** Branch to push from (default: current branch) */\n sourceBranch?: string;\n /** Actor ID publishing the state (required) */\n actorId: string;\n /** Simulate operation without making real changes */\n dryRun?: boolean;\n /** Force push even if there are unsynced remote changes */\n force?: boolean;\n}\n\n/**\n * Result of pushState operation\n */\nexport type SyncStatePushResult = {\n /** Indicates if the operation was successful */\n success: boolean;\n /** Number of files synced */\n filesSynced: number;\n /** Name of the branch pushed from */\n sourceBranch: string;\n /** Created commit hash (null if no changes or dry-run) */\n commitHash: string | null;\n /** Created commit message */\n commitMessage: string | null;\n /** Indicates if a conflict was detected during reconciliation */\n conflictDetected: boolean;\n /** Conflict information if detected */\n conflictInfo?: ConflictInfo;\n /** Error message if operation failed */\n error?: string;\n /** [EARS-B16] Implicit pull results when push does reconciliation with remote */\n implicitPull?: {\n /** Whether changes were pulled from remote */\n hasChanges: boolean;\n /** Number of files updated from remote */\n filesUpdated: number;\n /** Whether index was regenerated */\n reindexed: boolean;\n };\n}\n\n/**\n * Options for pullState operation\n */\nexport type SyncStatePullOptions = {\n /** Force re-indexing even if there are no new changes */\n forceReindex?: boolean;\n /** [EARS-C11] Force pull even if local changes would be overwritten */\n force?: boolean;\n}\n\n/**\n * Result of pullState operation\n */\nexport type SyncStatePullResult = {\n /** Indicates if the operation was successful */\n success: boolean;\n /** Indicates if there were new remote changes */\n hasChanges: boolean;\n /** Number of files updated */\n filesUpdated: number;\n /** Indicates if re-indexing was executed */\n reindexed: boolean;\n /** Indicates if a conflict was detected during pull */\n conflictDetected: boolean;\n /** Conflict information if detected */\n conflictInfo?: ConflictInfo;\n /** Error message if operation failed */\n error?: string;\n /** [EARS-C11] Files that were forcefully overwritten (when force: true) */\n forcedOverwrites?: string[];\n}\n\n/**\n * Options for resolveConflict operation\n */\nexport type SyncStateResolveOptions = {\n /** Justification for the conflict resolution (required) */\n reason: string;\n /** Actor ID resolving the conflict (required) */\n actorId: string;\n}\n\n/**\n * Result of resolveConflict operation\n */\nexport type SyncStateResolveResult = {\n /** Indicates if the operation was successful */\n success: boolean;\n /** Commit hash of the created rebase commit */\n rebaseCommitHash: string;\n /** Commit hash of the signed resolution commit */\n resolutionCommitHash: string;\n /** Number of conflicts resolved */\n conflictsResolved: number;\n /** Actor ID who resolved the conflict */\n resolvedBy: string;\n /** Reason for resolution */\n reason: string;\n /** Error message if operation failed */\n error?: string;\n}\n\n/**\n * Detailed information about a detected conflict\n */\nexport type ConflictInfo = {\n /** Type of conflict detected */\n type: ConflictType;\n /** Files affected by the conflict */\n affectedFiles: string[];\n /** Descriptive message of the conflict */\n message: string;\n /** Instructions to resolve the conflict */\n resolutionSteps: string[];\n}\n\n/**\n * Auxiliary type to identify the conflict type\n *\n * Git-Native conflict model (post-refactor):\n * - rebase_conflict: Used for all Git-level conflicts during push/pull\n * - local_changes_conflict: Used when pull would overwrite local changes (EARS-C10)\n * - integrity_violation: Used when resolution commits are missing\n */\nexport type ConflictType =\n | \"rebase_conflict\" // Conflict during automatic rebase (Git-native, includes EARS-B23 scenarios)\n | \"integrity_violation\" // Integrity violation (rebase without resolution commit)\n | \"local_changes_conflict\"; // [EARS-C10] Local changes would be overwritten by pull\n\n/**\n * Information about a detected integrity violation\n */\nexport type IntegrityViolation = {\n /** Commit hash of the rebase commit without resolution */\n rebaseCommitHash: string;\n /** Message of the rebase commit */\n commitMessage: string;\n /** Timestamp of the commit */\n timestamp: string;\n /** Author of the commit */\n author: string;\n}\n\n/**\n * Verification scope for state audit\n */\nexport type AuditScope =\n | \"current\" // Only verify Records in the current branch (useful for pre-push)\n | \"state-branch\" // Only verify Records in gitgov-state (useful for remote audit)\n | \"all\"; // Verify both (useful for complete audit)\n\n/**\n * Scope for expected files verification\n */\nexport type ExpectedFilesScope =\n | \"head\" // Only verify in HEAD of gitgov-state (default, faster)\n | \"all-commits\"; // Verify in all commits (more exhaustive, slower)\n\n/**\n * Options for state audit\n */\nexport type AuditStateOptions = {\n /** Verification scope: which Records to verify (default: \"all\") */\n scope?: AuditScope;\n /** Verify signatures in Records (default: true) */\n verifySignatures?: boolean;\n /** Verify checksums of Records (default: true) */\n verifyChecksums?: boolean;\n /** Verify that expected files exist (default: true) */\n verifyExpectedFiles?: boolean;\n /** Scope for expected files verification (default: \"head\") */\n expectedFilesScope?: ExpectedFilesScope;\n /** Path of specific files to audit (default: all in .gitgov/) */\n filePaths?: string[];\n}\n\n/**\n * Conflict diff information for a file\n */\nexport type ConflictFileDiff = {\n /** Path of the conflicted file */\n filePath: string;\n /** Content of the local version (ours) */\n localContent: string;\n /** Content of the remote version (theirs) */\n remoteContent: string;\n /** Base content (common ancestor) */\n baseContent: string | null;\n /** Lines with conflict markers (if they still exist) */\n conflictMarkers?: Array<{\n line: number;\n marker: string; // \"<<<<<\", \"=====\", \">>>>>\"\n }>;\n}\n\n/**\n * Structured conflict diff\n */\nexport type ConflictDiff = {\n /** Conflicted files with their diff */\n files: ConflictFileDiff[];\n /** Descriptive message of the conflict */\n message: string;\n /** Instructions to resolve */\n resolutionSteps: string[];\n}\n\n/**\n * Complete state audit report\n * \n * This report combines SyncStateModule-specific audits (rebase integrity, commits)\n * with structural validation from LintModule (signatures, checksums, schemas).\n */\nexport type AuditStateReport = {\n /** Indicates if the audit passed without violations */\n passed: boolean;\n /** Scope used for the audit */\n scope: AuditScope;\n /** Total commits analyzed */\n totalCommits: number;\n /** Rebase commits found */\n rebaseCommits: number;\n /** Resolution commits found */\n resolutionCommits: number;\n /** Integrity violations of resolutions (SyncStateModule-specific) */\n integrityViolations: IntegrityViolation[];\n /** Summary message of the audit */\n summary: string;\n /** Complete LintModule report for structural validation (signatures, checksums, schemas, etc.) */\n lintReport?: LintReport;\n}\n\n/**\n * Information of a changed file in the delta\n */\nexport type StateDeltaFile = {\n /** File status: Added, Modified, Deleted */\n status: \"A\" | \"M\" | \"D\";\n /** File path */\n file: string;\n}\n\n/**\n * Whitelist of files and directories allowed for synchronization.\n * Only these paths will be copied from .gitgov/ to gitgov-state.\n * \n * [EARS-B9] Explicitly defines what gets synced, avoiding temporary files,\n * builds, scripts, and local configurations like .gitignore\n * \n * Excluded (not in whitelist):\n * - builds/ (local build artifacts)\n * - scripts/ (local helper scripts)\n * - .gitignore (per-branch file, should not be synced)\n * - *.backup-* (backup files)\n * - *.tmp (temporary files)\n * - .DS_Store (macOS metadata)\n */\n/**\n * Directories to SYNC to gitgov-state branch (shared state)\n * Only *.json files within these directories will be synced\n */\nexport const SYNC_DIRECTORIES = [\n 'tasks',\n 'cycles',\n 'actors',\n 'agents',\n 'feedbacks',\n 'executions',\n 'workflows',\n] as const;\n\n/**\n * Root-level files to SYNC to gitgov-state\n */\nexport const SYNC_ROOT_FILES = [\n 'config.json',\n] as const;\n\n/**\n * File extensions that are ALLOWED to be synced\n * Only these extensions will be copied to gitgov-state\n */\nexport const SYNC_ALLOWED_EXTENSIONS = ['.json'] as const;\n\n/**\n * File patterns that are NEVER synced (even if they match allowed extensions)\n * These are excluded from gitgov-state branch\n */\nexport const SYNC_EXCLUDED_PATTERNS = [\n /\\.key$/, // Private keys (e.g., keys/*.key)\n /\\.backup$/, // Backup files from lint\n /\\.backup-\\d+$/, // Numbered backup files\n /\\.tmp$/, // Temporary files\n /\\.bak$/, // Backup files\n] as const;\n\n/**\n * Files/directories that are LOCAL-ONLY (never synced to gitgov-state)\n * These are regenerated or machine-specific\n */\nexport const LOCAL_ONLY_FILES = [\n 'index.json', // Generated index, rebuilt on each machine\n '.session.json', // Local session state for current user/agent\n 'gitgov', // Local binary/script\n] as const;\n\n","/**\n * Shared utilities for SyncState modules (FsSyncState, GithubSyncState).\n *\n * @module sync_state/utils\n */\n\nimport path from \"path\";\nimport {\n SYNC_DIRECTORIES,\n SYNC_ROOT_FILES,\n SYNC_ALLOWED_EXTENSIONS,\n SYNC_EXCLUDED_PATTERNS,\n LOCAL_ONLY_FILES,\n} from \"./sync_state.types\";\n\n/**\n * Check if a file should be synced to gitgov-state.\n * Returns true only for allowed *.json files in SYNC_DIRECTORIES or SYNC_ROOT_FILES.\n *\n * Accepts paths in multiple formats:\n * - .gitgov/tasks/foo.json (git ls-files output)\n * - /absolute/path/.gitgov/tasks/foo.json\n * - /tmp/tempdir/tasks/foo.json (tempDir copy without .gitgov)\n * - tasks/foo.json (relative to .gitgov)\n */\nexport function shouldSyncFile(filePath: string): boolean {\n const fileName = path.basename(filePath);\n const ext = path.extname(filePath);\n\n // Check if extension is allowed\n if (!SYNC_ALLOWED_EXTENSIONS.includes(ext as typeof SYNC_ALLOWED_EXTENSIONS[number])) {\n return false;\n }\n\n // Check if file matches any excluded pattern (.key, .backup, etc.)\n for (const pattern of SYNC_EXCLUDED_PATTERNS) {\n if (pattern.test(fileName)) {\n return false;\n }\n }\n\n // Check if it's a local-only file (.session.json, index.json, gitgov)\n if (LOCAL_ONLY_FILES.includes(fileName as typeof LOCAL_ONLY_FILES[number])) {\n return false;\n }\n\n // CRITICAL: Verify file is in an allowed sync directory or is a root sync file\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n const parts = normalizedPath.split('/');\n\n // Find .gitgov in path and get the part after it\n const gitgovIndex = parts.findIndex(p => p === '.gitgov');\n\n let relativeParts: string[];\n if (gitgovIndex !== -1) {\n // Path contains .gitgov: .gitgov/tasks/foo.json or /path/.gitgov/tasks/foo.json\n relativeParts = parts.slice(gitgovIndex + 1);\n } else {\n // Path is relative to .gitgov or from tempDir: tasks/foo.json or /tmp/tempdir/tasks/foo.json\n // Check if any part matches a sync directory\n const syncDirIndex = parts.findIndex(p =>\n SYNC_DIRECTORIES.includes(p as typeof SYNC_DIRECTORIES[number])\n );\n if (syncDirIndex !== -1) {\n relativeParts = parts.slice(syncDirIndex);\n } else if (SYNC_ROOT_FILES.includes(fileName as typeof SYNC_ROOT_FILES[number])) {\n // It's a root sync file like config.json\n return true;\n } else {\n return false;\n }\n }\n\n if (relativeParts.length === 1) {\n // Root file: config.json\n return SYNC_ROOT_FILES.includes(relativeParts[0] as typeof SYNC_ROOT_FILES[number]);\n } else if (relativeParts.length >= 2) {\n // Directory file: tasks/foo.json\n const dirName = relativeParts[0];\n return SYNC_DIRECTORIES.includes(dirName as typeof SYNC_DIRECTORIES[number]);\n }\n\n return false;\n}\n\n/**\n * Filter an array of file paths, returning only those that should be synced.\n */\nexport function filterSyncableFiles(files: string[]): string[] {\n return files.filter(shouldSyncFile);\n}\n","/**\n * GithubSyncStateModule — ISyncStateModule via GitHub API (Octokit)\n *\n * Implements state synchronization between .gitgov/ records and a shared\n * gitgov-state branch using the GitHub Trees/Commits/Refs API.\n * No local filesystem or git CLI required.\n *\n * Blueprint: github_sync_state_module.md\n * @module sync_state/github_sync_state\n */\n\nimport type { ISyncStateModule } from '../sync_state';\nimport type {\n SyncStatePushOptions,\n SyncStatePushResult,\n SyncStatePullOptions,\n SyncStatePullResult,\n SyncStateResolveOptions,\n SyncStateResolveResult,\n AuditStateOptions,\n AuditStateReport,\n ConflictDiff,\n IntegrityViolation,\n StateDeltaFile,\n} from '../sync_state.types';\nimport type { GithubSyncStateDependencies } from './github_sync_state.types';\nimport type { LintReport, LintResult } from '../../lint';\nimport type { GitGovRecord, GitGovRecordType } from '../../record_types';\nimport { shouldSyncFile } from '../sync_state.utils';\nimport { isOctokitRequestError } from '../../github';\n\n/**\n * [EARS-GS-A1..F2] GithubSyncStateModule\n *\n * Synchronizes .gitgov/ state with a GitHub remote via API.\n * Uses optimistic concurrency (SHA-based) instead of rebase.\n */\nexport class GithubSyncStateModule implements ISyncStateModule {\n private readonly deps: GithubSyncStateDependencies;\n private lastKnownSha: string | null = null;\n\n constructor(deps: GithubSyncStateDependencies) {\n this.deps = deps;\n }\n\n // ==================== Block A: Branch Management ====================\n\n /**\n * [EARS-GS-A3] Returns the configured state branch name.\n */\n async getStateBranchName(): Promise<string> {\n return 'gitgov-state';\n }\n\n /**\n * [EARS-GS-A1] Creates gitgov-state branch if it does not exist.\n * [EARS-GS-A2] Idempotent — no-op if branch already exists.\n */\n async ensureStateBranch(): Promise<void> {\n const branchName = await this.getStateBranchName();\n\n try {\n // Check if branch exists\n await this.deps.octokit.rest.repos.getBranch({\n owner: this.deps.owner,\n repo: this.deps.repo,\n branch: branchName,\n });\n // [EARS-GS-A2] Branch exists, nothing to do\n return;\n } catch (error: unknown) {\n if (!isOctokitRequestError(error) || error.status !== 404) {\n throw error;\n }\n }\n\n // [EARS-GS-A1] Branch does not exist — create from default branch HEAD\n const { data: repoData } = await this.deps.octokit.rest.repos.get({\n owner: this.deps.owner,\n repo: this.deps.repo,\n });\n const defaultBranch = repoData.default_branch;\n\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${defaultBranch}`,\n });\n\n await this.deps.octokit.rest.git.createRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `refs/heads/${branchName}`,\n sha: refData.object.sha,\n });\n }\n\n // ==================== Block B: Push State ====================\n\n /**\n * [EARS-GS-B1..B5] Push local .gitgov/ state to gitgov-state branch via API.\n *\n * Uses the 6-step atomic commit pattern:\n * getRef → getCommit → createBlob → createTree → createCommit → updateRef\n *\n * Optimistic concurrency: if remote ref advanced since our read, updateRef\n * fails with 422 → return conflictDetected: true.\n */\n async pushState(options: SyncStatePushOptions): Promise<SyncStatePushResult> {\n const branchName = await this.getStateBranchName();\n const sourceBranch = options.sourceBranch ?? 'main';\n\n try {\n // Step 1: Get current gitgov-state ref SHA\n const { data: stateRefData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n const currentSha = stateRefData.object.sha;\n\n // Step 2: Get source branch tree (files from .gitgov/ on source branch)\n const { data: sourceTree } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: sourceBranch,\n recursive: 'true',\n });\n\n const sourceFiles = (sourceTree.tree ?? []).filter(\n (item) => item.type === 'blob' && item.path?.startsWith('.gitgov/') && shouldSyncFile(item.path)\n );\n\n // Step 3: Get target tree (current gitgov-state contents)\n const { data: targetCommit } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: currentSha,\n });\n\n const { data: targetTree } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: targetCommit.tree.sha,\n recursive: 'true',\n });\n\n const targetFileMap = new Map<string, string>();\n for (const item of targetTree.tree ?? []) {\n if (item.type === 'blob' && item.path && item.sha) {\n targetFileMap.set(item.path, item.sha);\n }\n }\n\n // Step 4: Diff trees — find files that changed\n const delta: StateDeltaFile[] = [];\n const treeEntries: Array<{\n path: string;\n mode: '100644';\n type: 'blob';\n sha: string | null;\n }> = [];\n\n // Files in source that differ from target (add/modify)\n for (const sourceFile of sourceFiles) {\n if (!sourceFile.path || !sourceFile.sha) continue;\n // Strip .gitgov/ prefix for gitgov-state branch (files live at root)\n const statePath = sourceFile.path.replace(/^\\.gitgov\\//, '');\n const targetSha = targetFileMap.get(statePath);\n\n if (targetSha !== sourceFile.sha) {\n delta.push({\n status: targetSha ? 'M' : 'A',\n file: statePath,\n });\n treeEntries.push({\n path: statePath,\n mode: '100644',\n type: 'blob',\n sha: sourceFile.sha,\n });\n }\n targetFileMap.delete(statePath);\n }\n\n // Files in target but not in source (deleted)\n for (const [deletedPath] of targetFileMap) {\n if (shouldSyncFile(deletedPath)) {\n delta.push({ status: 'D', file: deletedPath });\n treeEntries.push({\n path: deletedPath,\n mode: '100644',\n type: 'blob',\n sha: null,\n });\n }\n }\n\n // [EARS-GS-B5] No changes\n if (delta.length === 0) {\n return {\n success: true,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: false,\n };\n }\n\n // [EARS-GS-B3] Dry run — return delta without creating commit\n if (options.dryRun) {\n return {\n success: true,\n filesSynced: delta.length,\n sourceBranch,\n commitHash: null,\n commitMessage: `[dry-run] gitgov sync: ${delta.length} files`,\n conflictDetected: false,\n };\n }\n\n // Step 5: Create new tree\n const { data: newTreeData } = await this.deps.octokit.rest.git.createTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n base_tree: targetCommit.tree.sha,\n tree: treeEntries,\n });\n\n // Step 6: Create commit\n const commitMessage = `gitgov sync: ${delta.length} files from ${sourceBranch}`;\n const { data: newCommitData } = await this.deps.octokit.rest.git.createCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n message: commitMessage,\n tree: newTreeData.sha,\n parents: [currentSha],\n });\n\n // Step 7: Update ref (optimistic concurrency)\n try {\n await this.deps.octokit.rest.git.updateRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n sha: newCommitData.sha,\n });\n } catch (error: unknown) {\n // [EARS-GS-B2] SHA mismatch — remote advanced\n if (isOctokitRequestError(error) && (error.status === 422 || error.status === 409)) {\n return {\n success: false,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: true,\n conflictInfo: {\n type: 'rebase_conflict',\n affectedFiles: delta.map((d) => d.file),\n message: 'Remote gitgov-state ref has advanced since last read. Pull and retry.',\n resolutionSteps: [\n 'Call pullState() to fetch latest remote state',\n 'Retry pushState() with updated parent SHA',\n ],\n },\n };\n }\n throw error;\n }\n\n // [EARS-GS-B4] Success\n this.lastKnownSha = newCommitData.sha;\n return {\n success: true,\n filesSynced: delta.length,\n sourceBranch,\n commitHash: newCommitData.sha,\n commitMessage,\n conflictDetected: false,\n };\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n return {\n success: false,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: false,\n error: `GitHub API error (${error.status}): ${error.message}`,\n };\n }\n const msg = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n filesSynced: 0,\n sourceBranch,\n commitHash: null,\n commitMessage: null,\n conflictDetected: false,\n error: msg,\n };\n }\n }\n\n // ==================== Block C: Pull State ====================\n\n /**\n * [EARS-GS-C1..C4] Pull remote state from gitgov-state branch.\n *\n * Fetches tree + blobs, updates lastKnownSha, triggers re-indexing.\n */\n async pullState(options?: SyncStatePullOptions): Promise<SyncStatePullResult> {\n const branchName = await this.getStateBranchName();\n\n // [EARS-GS-C4] Check if branch exists\n let remoteSha: string;\n try {\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n remoteSha = refData.object.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return {\n success: true,\n hasChanges: false,\n filesUpdated: 0,\n reindexed: false,\n conflictDetected: false,\n };\n }\n throw error;\n }\n\n // [EARS-GS-C2] No changes if SHA matches (unless forceReindex)\n if (this.lastKnownSha === remoteSha && !options?.forceReindex) {\n return {\n success: true,\n hasChanges: false,\n filesUpdated: 0,\n reindexed: false,\n conflictDetected: false,\n };\n }\n\n // [EARS-GS-C1] Fetch tree contents\n const { data: commitData } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: remoteSha,\n });\n\n const { data: treeData } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: commitData.tree.sha,\n recursive: 'true',\n });\n\n const syncableFiles = (treeData.tree ?? []).filter(\n (item) => item.type === 'blob' && item.path && shouldSyncFile(item.path)\n );\n\n const filesUpdated = syncableFiles.length;\n\n // Update tracking SHA\n this.lastKnownSha = remoteSha;\n\n // [EARS-GS-C3] Trigger re-indexing\n let reindexed = false;\n if (filesUpdated > 0 || options?.forceReindex) {\n try {\n await this.deps.indexer.computeProjection();\n reindexed = true;\n } catch {\n // Re-indexing failure is non-fatal for pull\n reindexed = false;\n }\n }\n\n return {\n success: true,\n hasChanges: filesUpdated > 0,\n filesUpdated,\n reindexed,\n conflictDetected: false,\n };\n }\n\n // ==================== Block D: Change Detection ====================\n\n /**\n * [EARS-GS-D1..D3] Calculate file delta between known state and current remote.\n */\n async calculateStateDelta(_sourceBranch: string): Promise<StateDeltaFile[]> {\n const branchName = await this.getStateBranchName();\n\n // Get current remote SHA\n let currentSha: string;\n try {\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n currentSha = refData.object.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return [];\n }\n throw error;\n }\n\n // [EARS-GS-D2] No changes if SHAs match\n if (this.lastKnownSha === currentSha) {\n return [];\n }\n\n // [EARS-GS-D3] Full sync if lastKnownSha is unknown\n if (this.lastKnownSha === null) {\n const { data: commitData } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: currentSha,\n });\n\n const { data: treeData } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: commitData.tree.sha,\n recursive: 'true',\n });\n\n return (treeData.tree ?? [])\n .filter((item) => item.type === 'blob' && item.path && shouldSyncFile(item.path))\n .map((item) => ({\n status: 'A' as const,\n file: item.path!,\n }));\n }\n\n // [EARS-GS-D1] Compare commits for delta\n const { data: comparison } = await this.deps.octokit.rest.repos.compareCommits({\n owner: this.deps.owner,\n repo: this.deps.repo,\n base: this.lastKnownSha,\n head: currentSha,\n });\n\n return (comparison.files ?? [])\n .filter((file) => shouldSyncFile(file.filename))\n .map((file) => ({\n status: (file.status === 'added' ? 'A' : file.status === 'removed' ? 'D' : 'M') as 'A' | 'M' | 'D',\n file: file.filename,\n }));\n }\n\n /**\n * Always empty — no local pending changes in API mode.\n * In API mode there is no local filesystem; all state is remote.\n */\n async getPendingChanges(): Promise<StateDeltaFile[]> {\n return [];\n }\n\n // ==================== Block E: Conflict Handling ====================\n\n /**\n * Always false — no rebase in API mode.\n */\n async isRebaseInProgress(): Promise<boolean> {\n return false;\n }\n\n /**\n * Always empty — no conflict markers in API mode.\n */\n async checkConflictMarkers(_filePaths: string[]): Promise<string[]> {\n return [];\n }\n\n /**\n * Empty diff — no git-level conflict markers in API mode.\n */\n async getConflictDiff(_filePaths?: string[]): Promise<ConflictDiff> {\n return {\n files: [],\n message: 'No conflict markers in API mode. Conflicts are SHA-based.',\n resolutionSteps: [\n 'Call pullState() to fetch latest remote state',\n 'Retry pushState() with updated records',\n ],\n };\n }\n\n /**\n * [EARS-GS-E1..E2] Resolve conflict by pulling latest and retrying push.\n */\n async resolveConflict(options: SyncStateResolveOptions): Promise<SyncStateResolveResult> {\n // [EARS-GS-E1] Pull latest state\n const pullResult = await this.pullState({ forceReindex: false });\n\n if (!pullResult.success) {\n return {\n success: false,\n rebaseCommitHash: '',\n resolutionCommitHash: '',\n conflictsResolved: 0,\n resolvedBy: options.actorId,\n reason: options.reason,\n error: `Pull failed during conflict resolution: ${pullResult.error}`,\n };\n }\n\n // Retry push with latest parent SHA\n const pushResult = await this.pushState({\n actorId: options.actorId,\n });\n\n // [EARS-GS-E2] If push still fails, content conflict\n if (!pushResult.success || pushResult.conflictDetected) {\n const errorMsg = pushResult.conflictDetected\n ? 'Content conflict: same file modified by both sides. Manual resolution required.'\n : (pushResult.error ?? 'Unknown push error');\n return {\n success: false,\n rebaseCommitHash: '',\n resolutionCommitHash: '',\n conflictsResolved: 0,\n resolvedBy: options.actorId,\n reason: options.reason,\n error: errorMsg,\n };\n }\n\n return {\n success: true,\n rebaseCommitHash: this.lastKnownSha ?? '',\n resolutionCommitHash: pushResult.commitHash ?? '',\n conflictsResolved: pushResult.filesSynced,\n resolvedBy: options.actorId,\n reason: options.reason,\n };\n }\n\n /**\n * No integrity violations in API mode (no rebase commits).\n */\n async verifyResolutionIntegrity(): Promise<IntegrityViolation[]> {\n return [];\n }\n\n // ==================== Block F: Audit ====================\n\n /**\n * [EARS-GS-F1..F2] Audit the remote gitgov-state branch.\n */\n async auditState(options?: AuditStateOptions): Promise<AuditStateReport> {\n const branchName = await this.getStateBranchName();\n const scope = options?.scope ?? 'all';\n\n // Get commit history\n let totalCommits = 0;\n try {\n const { data: commits } = await this.deps.octokit.rest.repos.listCommits({\n owner: this.deps.owner,\n repo: this.deps.repo,\n sha: branchName,\n per_page: 100,\n });\n totalCommits = commits.length;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return {\n passed: true,\n scope,\n totalCommits: 0,\n rebaseCommits: 0,\n resolutionCommits: 0,\n integrityViolations: [],\n summary: 'Branch gitgov-state does not exist. No audit needed.',\n };\n }\n throw error;\n }\n\n // No rebase commits in API mode\n const rebaseCommits = 0;\n const resolutionCommits = 0;\n const integrityViolations: IntegrityViolation[] = [];\n\n // [EARS-GS-F1] Validate records via lint if requested\n let lintReport: LintReport | undefined;\n if (options?.verifySignatures !== false || options?.verifyChecksums !== false) {\n try {\n // Fetch tree to get records\n const { data: refData } = await this.deps.octokit.rest.git.getRef({\n owner: this.deps.owner,\n repo: this.deps.repo,\n ref: `heads/${branchName}`,\n });\n\n const { data: commitData } = await this.deps.octokit.rest.git.getCommit({\n owner: this.deps.owner,\n repo: this.deps.repo,\n commit_sha: refData.object.sha,\n });\n\n const { data: treeData } = await this.deps.octokit.rest.git.getTree({\n owner: this.deps.owner,\n repo: this.deps.repo,\n tree_sha: commitData.tree.sha,\n recursive: 'true',\n });\n\n const treeItems = (treeData.tree ?? [])\n .filter((item) => item.type === 'blob' && item.path && item.sha && shouldSyncFile(item.path));\n\n // Fetch each record blob and validate via lintRecord()\n const startTime = Date.now();\n const allResults: LintResult[] = [];\n let filesChecked = 0;\n\n for (const item of treeItems) {\n try {\n const { data: blobData } = await this.deps.octokit.rest.git.getBlob({\n owner: this.deps.owner,\n repo: this.deps.repo,\n file_sha: item.sha!,\n });\n const content = Buffer.from(blobData.content, 'base64').toString('utf-8');\n const record = JSON.parse(content) as GitGovRecord;\n const entityType = pathToEntityType(item.path!);\n\n if (entityType) {\n const results = this.deps.lint.lintRecord(record, {\n recordId: item.path!.split('/').pop()?.replace('.json', '') ?? item.path!,\n entityType,\n filePath: item.path,\n });\n allResults.push(...results);\n }\n filesChecked++;\n } catch {\n // Skip unreadable/unparseable blobs\n }\n }\n\n // Aggregate results into LintReport\n if (filesChecked > 0) {\n lintReport = {\n summary: {\n filesChecked,\n errors: allResults.filter((r) => r.level === 'error').length,\n warnings: allResults.filter((r) => r.level === 'warning').length,\n fixable: allResults.filter((r) => r.fixable).length,\n executionTime: Date.now() - startTime,\n },\n results: allResults,\n metadata: {\n timestamp: new Date().toISOString(),\n options: {},\n version: '1.0.0',\n },\n };\n }\n } catch {\n // Lint failure is non-fatal for audit\n }\n }\n\n // [EARS-GS-F2] Check lint report for violations\n const lintPassed = !lintReport || lintReport.summary.errors === 0;\n const passed = integrityViolations.length === 0 && lintPassed;\n\n const lintErrors = lintReport?.summary.errors ?? 0;\n let summary: string;\n if (passed) {\n summary = `Audit passed. ${totalCommits} commits analyzed, 0 violations.`;\n } else if (integrityViolations.length > 0 && lintErrors > 0) {\n summary = `Audit failed. ${integrityViolations.length} integrity violations, ${lintErrors} lint errors.`;\n } else if (lintErrors > 0) {\n summary = `Audit failed. ${lintErrors} lint errors found.`;\n } else {\n summary = `Audit failed. ${integrityViolations.length} integrity violations found.`;\n }\n\n const report: AuditStateReport = {\n passed,\n scope,\n totalCommits,\n rebaseCommits,\n resolutionCommits,\n integrityViolations,\n summary,\n };\n\n if (lintReport) {\n report.lintReport = lintReport;\n }\n\n return report;\n }\n}\n\n/**\n * Maps a file path (e.g., \"tasks/task-1.json\") to its GitGovRecordType.\n * Returns undefined for root files (config.json) and directories without\n * a corresponding GitGovRecordType (e.g., workflows/ — present in\n * SYNC_DIRECTORIES but not in GitGovRecordType union).\n * Files with undefined entityType are still counted in filesChecked\n * but skipped for lintRecord() validation.\n */\nfunction pathToEntityType(filePath: string): GitGovRecordType | undefined {\n const dirMap: Record<string, GitGovRecordType> = {\n tasks: 'task',\n cycles: 'cycle',\n actors: 'actor',\n agents: 'agent',\n feedbacks: 'feedback',\n executions: 'execution',\n };\n const firstSegment = filePath.split('/')[0] ?? '';\n return dirMap[firstSegment];\n}\n","/**\n * Error codes for FileLister operations.\n */\nexport type FileListerErrorCode =\n | 'FILE_NOT_FOUND'\n | 'READ_ERROR'\n | 'PERMISSION_DENIED'\n | 'INVALID_PATH'\n | 'NETWORK_ERROR';\n\n/**\n * Error thrown when file operations fail.\n */\nexport class FileListerError extends Error {\n constructor(\n message: string,\n public readonly code: FileListerErrorCode,\n public readonly filePath?: string\n ) {\n super(message);\n this.name = 'FileListerError';\n }\n}\n","/**\n * GitHubFileLister - GitHub REST API implementation of FileLister\n *\n * Provides file listing and reading operations via GitHub's REST API\n * for SaaS environments where direct filesystem access is not available.\n *\n * Uses the Git Trees API for listing (with caching) and the Contents API\n * for reading individual files. Falls back to the Blobs API for files\n * larger than 1MB where the Contents API returns null content.\n *\n * @module file_lister/github/github_file_lister\n */\n\nimport picomatch from 'picomatch';\nimport type { Octokit } from '@octokit/rest';\nimport type { FileLister, FileListOptions, FileStats } from '../file_lister';\nimport { FileListerError } from '../file_lister';\nimport { isOctokitRequestError } from '../../github';\nimport type { GitHubFileListerOptions } from './github_file_lister.types';\n\n/** Tree entry shape from Octokit git.getTree response */\ntype TreeEntry = {\n path?: string;\n type?: string;\n sha?: string;\n size?: number;\n};\n\n/**\n * GitHubFileLister - GitHub REST API FileLister implementation.\n *\n * Implements the FileLister interface using GitHub's REST API endpoints:\n * - Trees API for listing files (cached)\n * - Contents API for reading, stat, and exists\n * - Blobs API as fallback for large files (>1MB)\n *\n * @example\n * ```typescript\n * import { Octokit } from '@octokit/rest';\n * const octokit = new Octokit({ auth: 'ghp_xxx' });\n * const lister = new GitHubFileLister({\n * owner: 'myorg',\n * repo: 'myrepo',\n * ref: 'gitgov-state',\n * basePath: '.gitgov',\n * }, octokit);\n *\n * const files = await lister.list(['**\\/*.ts']);\n * const content = await lister.read('config.json');\n * ```\n */\nexport class GitHubFileLister implements FileLister {\n private readonly owner: string;\n private readonly repo: string;\n private readonly ref: string;\n private readonly basePath: string;\n private readonly octokit: Octokit;\n\n /** Cached tree entries from the Trees API */\n private treeCache: TreeEntry[] | null = null;\n\n constructor(options: GitHubFileListerOptions, octokit: Octokit) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.ref = options.ref ?? 'gitgov-state';\n this.basePath = options.basePath ?? '';\n this.octokit = octokit;\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // FileLister Interface\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * [EARS-A1] Lists files matching glob patterns.\n * [EARS-B1] Uses Trees API with recursive=1 and picomatch filter.\n * [EARS-B3] Applies basePath prefix for tree entries, strips from results.\n * [EARS-B6] Caches tree between list() calls.\n */\n async list(patterns: string[], options?: FileListOptions): Promise<string[]> {\n const entries = await this.fetchTree();\n\n // Filter only blobs (files, not directories)\n const blobs = entries.filter(entry => entry.type === 'blob');\n\n // Apply basePath: only entries under basePath, then strip prefix\n const prefix = this.basePath ? `${this.basePath}/` : '';\n const relativePaths: string[] = [];\n\n for (const blob of blobs) {\n if (!blob.path) continue;\n if (prefix && !blob.path.startsWith(prefix)) {\n continue;\n }\n const relativePath = prefix ? blob.path.slice(prefix.length) : blob.path;\n relativePaths.push(relativePath);\n }\n\n // Match against patterns using picomatch\n const isMatch = picomatch(patterns, {\n ignore: options?.ignore,\n });\n\n return relativePaths.filter(p => isMatch(p)).sort();\n }\n\n /**\n * [EARS-A2] Checks if a file exists via Contents API.\n * [EARS-B4] Returns false for 404 responses.\n */\n async exists(filePath: string): Promise<boolean> {\n const fullPath = this.buildFullPath(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: fullPath,\n ref: this.ref,\n });\n // [EARS-A2] Verify it's a file, not a directory\n if (Array.isArray(data) || data.type !== 'file') {\n return false;\n }\n return true;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) return false;\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error checking file: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n\n /**\n * [EARS-A3] Reads file content as string.\n * [EARS-B2] Decodes base64 content from Contents API.\n * [EARS-B7] Falls back to Blobs API for files >1MB (null content).\n */\n async read(filePath: string): Promise<string> {\n const fullPath = this.buildFullPath(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: fullPath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new FileListerError(\n `Not a file: ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n\n // [EARS-B2] Decode base64 content\n if (data.content !== null && data.content !== undefined) {\n return Buffer.from(data.content, 'base64').toString('utf-8');\n }\n\n // [EARS-B7] Content is null (file >1MB), fallback to Blobs API\n return this.readViaBlobs(data.sha, filePath);\n } catch (error: unknown) {\n if (error instanceof FileListerError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath,\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error reading file: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n\n /**\n * [EARS-A4] Gets file statistics via Contents API.\n * Returns size from API, mtime as 0 (not available via Contents API), isFile as true.\n */\n async stat(filePath: string): Promise<FileStats> {\n const fullPath = this.buildFullPath(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: fullPath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new FileListerError(\n `Not a file: ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n\n return {\n size: data.size,\n mtime: 0,\n isFile: true,\n };\n } catch (error: unknown) {\n if (error instanceof FileListerError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath,\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error getting file stats: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private Helpers\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Builds the full file path including basePath prefix.\n */\n private buildFullPath(filePath: string): string {\n if (this.basePath) {\n return `${this.basePath}/${filePath}`;\n }\n return filePath;\n }\n\n /**\n * [EARS-B6] Fetches and caches the full repository tree.\n * [EARS-C3] Throws READ_ERROR if the tree response is truncated.\n */\n private async fetchTree(): Promise<TreeEntry[]> {\n if (this.treeCache !== null) {\n return this.treeCache;\n }\n\n try {\n const { data } = await this.octokit.rest.git.getTree({\n owner: this.owner,\n repo: this.repo,\n tree_sha: this.ref,\n recursive: '1',\n });\n\n // [EARS-C3] Truncated tree means we cannot reliably list all files\n if (data.truncated) {\n throw new FileListerError(\n 'Repository tree is truncated; too many files to list via Trees API',\n 'READ_ERROR',\n );\n }\n\n this.treeCache = data.tree;\n return this.treeCache;\n } catch (error: unknown) {\n if (error instanceof FileListerError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n 'Repository or ref not found',\n 'FILE_NOT_FOUND',\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n 'Permission denied accessing repository tree',\n 'PERMISSION_DENIED',\n );\n }\n if (error.status >= 500) {\n throw new FileListerError(\n `GitHub API server error (${error.status}) fetching tree`,\n 'READ_ERROR',\n );\n }\n throw new FileListerError(\n `Unexpected GitHub API response (${error.status}) fetching tree`,\n 'READ_ERROR',\n );\n }\n throw new FileListerError(\n 'Network error fetching repository tree',\n 'NETWORK_ERROR',\n );\n }\n }\n\n /**\n * [EARS-B7] Reads file content via the Blobs API (fallback for >1MB files).\n */\n private async readViaBlobs(sha: string, filePath: string): Promise<string> {\n try {\n const { data } = await this.octokit.rest.git.getBlob({\n owner: this.owner,\n repo: this.repo,\n file_sha: sha,\n });\n\n return Buffer.from(data.content, 'base64').toString('utf-8');\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileListerError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND',\n filePath,\n );\n }\n if (error.status === 401 || error.status === 403) {\n throw new FileListerError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED',\n filePath,\n );\n }\n throw new FileListerError(\n `GitHub API error (${error.status}): ${filePath}`,\n 'READ_ERROR',\n filePath,\n );\n }\n throw new FileListerError(\n `Network error reading blob for file: ${filePath}`,\n 'NETWORK_ERROR',\n filePath,\n );\n }\n }\n}\n","import type { Octokit } from '@octokit/rest';\nimport type { RecordStore, IdEncoder } from '../record_store';\nimport type { GitHubRecordStoreOptions, GitHubWriteResult, GitHubWriteOpts } from './github_record_store.types';\nimport type { IGitModule } from '../../git/index';\nimport { GitHubApiError, mapOctokitError, isOctokitRequestError } from '../../github';\n\n/**\n * GitHubRecordStore<V> - GitHub Contents API implementation of RecordStore<V, GitHubWriteResult, GitHubWriteOpts>\n *\n * Persists records as JSON files in a GitHub repository via Octokit.\n * Supports SHA caching to avoid redundant GET calls before PUT/DELETE.\n */\nexport class GitHubRecordStore<V> implements RecordStore<V, GitHubWriteResult, GitHubWriteOpts> {\n private readonly owner: string;\n private readonly repo: string;\n private readonly ref: string;\n private readonly basePath: string;\n private readonly extension: string;\n private readonly idEncoder: IdEncoder | undefined;\n private readonly octokit: Octokit;\n\n /** SHA cache keyed by full file path (basePath/encoded + extension) */\n private readonly shaCache: Map<string, string> = new Map();\n\n /** IGitModule dependency for putMany() atomic commits. Optional — only needed for putMany(). */\n private readonly gitModule: IGitModule | undefined;\n\n constructor(options: GitHubRecordStoreOptions, octokit: Octokit, gitModule?: IGitModule) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.ref = options.ref ?? 'gitgov-state';\n this.basePath = options.basePath;\n this.extension = options.extension ?? '.json';\n this.idEncoder = options.idEncoder;\n this.octokit = octokit;\n this.gitModule = gitModule;\n }\n\n async get(id: string): Promise<V | null> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new GitHubApiError(`Not a file: ${filePath}`, 'INVALID_RESPONSE');\n }\n\n if (data.content === null || data.content === undefined) {\n throw new GitHubApiError(\n `File content is null (file may exceed 1MB): ${filePath}`,\n 'INVALID_RESPONSE',\n );\n }\n\n // Cache the SHA for subsequent operations\n this.shaCache.set(filePath, data.sha);\n\n const decoded = Buffer.from(data.content, 'base64').toString('utf-8');\n return JSON.parse(decoded) as V;\n } catch (error: unknown) {\n if (error instanceof GitHubApiError) throw error;\n if (isOctokitRequestError(error) && error.status === 404) return null;\n throw mapOctokitError(error, `GET ${filePath}`);\n }\n }\n\n async put(id: string, value: V, opts?: GitHubWriteOpts): Promise<GitHubWriteResult> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n const content = Buffer.from(JSON.stringify(value, null, 2)).toString('base64');\n\n const cachedSha = this.shaCache.get(filePath);\n\n try {\n const { data } = await this.octokit.rest.repos.createOrUpdateFileContents({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n message: opts?.commitMessage ?? `put ${id}`,\n content,\n branch: this.ref,\n ...(cachedSha ? { sha: cachedSha } : {}),\n });\n\n // Cache the new SHA from the response\n if (data.content?.sha) {\n this.shaCache.set(filePath, data.content.sha);\n }\n\n return { commitSha: data.commit.sha! };\n } catch (error: unknown) {\n throw mapOctokitError(error, `PUT ${filePath}`);\n }\n }\n\n /**\n * [EARS-A11, EARS-A12, EARS-B8] Persists multiple records in a single atomic commit.\n * Uses GitHubGitModule staging buffer: add() with contentMap, then commit().\n * Empty entries array returns { commitSha: undefined } without API calls.\n * Requires gitModule dependency — throws if not injected.\n */\n async putMany(entries: Array<{ id: string; value: V }>, opts?: GitHubWriteOpts): Promise<GitHubWriteResult> {\n if (entries.length === 0) {\n return {};\n }\n\n if (!this.gitModule) {\n throw new Error('putMany requires IGitModule dependency for atomic commits');\n }\n\n for (const { id } of entries) {\n this.validateId(id);\n }\n\n const contentMap: Record<string, string> = {};\n const filePaths: string[] = [];\n\n for (const { id, value } of entries) {\n const filePath = this.buildFilePath(id);\n contentMap[filePath] = JSON.stringify(value, null, 2);\n filePaths.push(filePath);\n }\n\n await this.gitModule.add(filePaths, { contentMap });\n\n const message = opts?.commitMessage ?? `putMany ${entries.length} records`;\n const commitSha = await this.gitModule.commit(message);\n\n return { commitSha };\n }\n\n async delete(id: string, opts?: GitHubWriteOpts): Promise<GitHubWriteResult> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n\n let sha = this.shaCache.get(filePath);\n\n // If no cached SHA, do a GET to obtain it\n if (sha === undefined) {\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: this.ref,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n return {};\n }\n\n sha = data.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return {};\n }\n throw mapOctokitError(error, `GET ${filePath} (for delete)`);\n }\n }\n\n try {\n const { data } = await this.octokit.rest.repos.deleteFile({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n message: opts?.commitMessage ?? `delete ${id}`,\n sha: sha!,\n branch: this.ref,\n });\n\n this.shaCache.delete(filePath);\n return { commitSha: data.commit.sha! };\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n this.shaCache.delete(filePath);\n return {};\n }\n throw mapOctokitError(error, `DELETE ${filePath}`);\n }\n }\n\n async list(): Promise<string[]> {\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: this.basePath,\n ref: this.ref,\n });\n\n if (!Array.isArray(data)) {\n return [];\n }\n\n const ids = data\n .filter((entry) => entry.name.endsWith(this.extension))\n .map((entry) => entry.name.slice(0, -this.extension.length));\n\n return this.idEncoder ? ids.map((encoded) => this.idEncoder!.decode(encoded)) : ids;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return [];\n }\n throw mapOctokitError(error, `GET ${this.basePath} (list)`);\n }\n }\n\n async exists(id: string): Promise<boolean> {\n this.validateId(id);\n const filePath = this.buildFilePath(id);\n\n try {\n await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: this.ref,\n });\n return true;\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return false;\n }\n throw mapOctokitError(error, `GET ${filePath} (exists)`);\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Private helpers\n // ─────────────────────────────────────────────────────────\n\n private validateId(id: string): void {\n if (!id || typeof id !== 'string') {\n throw new GitHubApiError('ID must be a non-empty string', 'INVALID_ID');\n }\n if (id.includes('..') || /[\\/\\\\]/.test(id)) {\n throw new GitHubApiError(\n `Invalid ID: \"${id}\". IDs cannot contain /, \\\\, or ..`,\n 'INVALID_ID',\n );\n }\n }\n\n private buildFilePath(id: string): string {\n const encoded = this.idEncoder ? this.idEncoder.encode(id) : id;\n return `${this.basePath}/${encoded}${this.extension}`;\n }\n}\n","/**\n * Custom Error Classes for GitModule\n * \n * These errors provide typed exceptions for better error handling\n * and diagnostics in the Git module operations.\n */\n\n/**\n * Base error class for all Git-related errors\n */\nexport class GitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GitError';\n Object.setPrototypeOf(this, GitError.prototype);\n }\n}\n\n/**\n * Error thrown when a Git command fails\n */\nexport class GitCommandError extends GitError {\n public readonly stderr: string;\n public readonly stdout?: string | undefined;\n public readonly command?: string | undefined;\n\n constructor(message: string, stderr: string = '', command?: string | undefined, stdout?: string) {\n super(message);\n this.name = 'GitCommandError';\n this.stderr = stderr;\n this.stdout = stdout;\n this.command = command;\n Object.setPrototypeOf(this, GitCommandError.prototype);\n }\n}\n\n/**\n * Error thrown when a branch does not exist\n */\nexport class BranchNotFoundError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch not found: ${branchName}`);\n this.name = 'BranchNotFoundError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a file does not exist in a commit\n */\nexport class FileNotFoundError extends GitError {\n public readonly filePath: string;\n public readonly commitHash: string;\n\n constructor(filePath: string, commitHash: string) {\n super(`File not found: ${filePath} in commit ${commitHash}`);\n this.name = 'FileNotFoundError';\n this.filePath = filePath;\n this.commitHash = commitHash;\n Object.setPrototypeOf(this, FileNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when a merge conflict occurs\n */\nexport class MergeConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Merge conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'MergeConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, MergeConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when a rebase conflict occurs\n */\nexport class RebaseConflictError extends GitError {\n public readonly conflictedFiles: string[];\n\n constructor(conflictedFiles: string[]) {\n super(`Rebase conflict detected in ${conflictedFiles.length} file(s)`);\n this.name = 'RebaseConflictError';\n this.conflictedFiles = conflictedFiles;\n Object.setPrototypeOf(this, RebaseConflictError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to continue/abort a rebase that is not in progress\n */\nexport class RebaseNotInProgressError extends GitError {\n constructor() {\n super('No rebase in progress');\n this.name = 'RebaseNotInProgressError';\n Object.setPrototypeOf(this, RebaseNotInProgressError.prototype);\n }\n}\n\n/**\n * Error thrown when trying to create a branch that already exists\n */\nexport class BranchAlreadyExistsError extends GitError {\n public readonly branchName: string;\n\n constructor(branchName: string) {\n super(`Branch already exists: ${branchName}`);\n this.name = 'BranchAlreadyExistsError';\n this.branchName = branchName;\n Object.setPrototypeOf(this, BranchAlreadyExistsError.prototype);\n }\n}\n\n","/**\n * GitHubGitModule - GitHub REST API implementation of IGitModule\n *\n * Implements IGitModule for SaaS environments where direct filesystem\n * and git CLI are not available. Uses GitHub REST API via Octokit for all operations.\n *\n * Method categories:\n * - Category A (Implement): Real API calls — getFileContent, getCommitHash, etc.\n * - Category B (No-op): Return sensible defaults — push, fetch, stash, etc.\n * - Category C (Not Supported): Throw GitError — rebase, resetHard, etc.\n *\n * All EARS prefixes map to github_git_module.md\n *\n * @module git/github\n */\n\nimport type { Octokit } from '@octokit/rest';\nimport type { IGitModule } from '..';\nimport type {\n ExecOptions,\n ExecResult,\n GetCommitHistoryOptions,\n CommitInfo,\n ChangedFile,\n CommitAuthor,\n} from '../types';\nimport { isOctokitRequestError } from '../../github';\nimport type { GitHubGitModuleOptions } from './github_git_module.types';\nimport { GitError, FileNotFoundError, BranchNotFoundError, BranchAlreadyExistsError } from '../errors';\n\nexport class GitHubGitModule implements IGitModule {\n private readonly owner: string;\n private readonly repo: string;\n private readonly defaultBranch: string;\n private readonly octokit: Octokit;\n\n /** Staging buffer: path → content (null = delete) */\n private stagingBuffer: Map<string, string | null> = new Map();\n\n /** Active ref for operations (can be changed via checkoutBranch) */\n private activeRef: string;\n\n constructor(options: GitHubGitModuleOptions, octokit: Octokit) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.defaultBranch = options.defaultBranch ?? 'gitgov-state';\n this.octokit = octokit;\n this.activeRef = this.defaultBranch;\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PRIVATE HELPERS\n // ═══════════════════════════════════════════════════════════════\n\n /** Category C: Not supported via GitHub API */\n private notSupported(method: string): never {\n throw new GitError(\n `${method} is not supported via GitHub API`\n );\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY A: READ OPERATIONS (EARS-A1 to A6)\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * [EARS-A1] Read file content via Contents API + base64 decode\n * [EARS-A2] Fallback to Blobs API for files >1MB\n */\n async getFileContent(commitHash: string, filePath: string): Promise<string> {\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path: filePath,\n ref: commitHash,\n });\n\n if (Array.isArray(data) || data.type !== 'file') {\n throw new GitError(`Not a file: ${filePath}`);\n }\n\n // [EARS-A1] Decode base64 content\n if (data.content !== null && data.content !== undefined) {\n return Buffer.from(data.content, 'base64').toString('utf-8');\n }\n\n // [EARS-A2] Content is null (file >1MB), fallback to Blobs API\n const { data: blobData } = await this.octokit.rest.git.getBlob({\n owner: this.owner,\n repo: this.repo,\n file_sha: data.sha,\n });\n\n return Buffer.from(blobData.content, 'base64').toString('utf-8');\n } catch (error: unknown) {\n if (error instanceof GitError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new FileNotFoundError(filePath, commitHash);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getFileContent ${filePath}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getFileContent ${filePath}`);\n }\n throw new GitError(`GitHub API error (${error.status}): getFileContent ${filePath}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A3] Get commit SHA from branch via Refs API\n * [EARS-B4] Return SHA directly if already a 40-char hex\n */\n async getCommitHash(ref: string = this.activeRef): Promise<string> {\n // [EARS-B4] If ref is already a 40-char hex SHA, return directly\n if (/^[0-9a-f]{40}$/i.test(ref)) {\n return ref;\n }\n\n try {\n const { data } = await this.octokit.rest.git.getRef({\n owner: this.owner,\n repo: this.repo,\n ref: `heads/${ref}`,\n });\n return data.object.sha;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new BranchNotFoundError(ref);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitHash ${ref}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitHash ${ref}`);\n }\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A4] List changed files via Compare API\n */\n async getChangedFiles(\n fromCommit: string,\n toCommit: string,\n pathFilter: string\n ): Promise<ChangedFile[]> {\n try {\n const { data } = await this.octokit.rest.repos.compareCommits({\n owner: this.owner,\n repo: this.repo,\n base: fromCommit,\n head: toCommit,\n });\n\n const statusMap: Record<string, 'A' | 'M' | 'D'> = {\n added: 'A',\n modified: 'M',\n removed: 'D',\n renamed: 'M',\n };\n\n const files: ChangedFile[] = (data.files ?? [])\n .map(f => ({\n status: statusMap[f.status] ?? ('M' as const),\n file: f.filename,\n }))\n .filter(f => !pathFilter || f.file.startsWith(pathFilter));\n\n return files;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getChangedFiles ${fromCommit}...${toCommit}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getChangedFiles`);\n }\n throw new GitError(`Failed to compare ${fromCommit}...${toCommit}: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A5] Get commit history via Commits API\n */\n async getCommitHistory(\n branch: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n try {\n const { data } = await this.octokit.rest.repos.listCommits({\n owner: this.owner,\n repo: this.repo,\n sha: branch,\n ...(options?.maxCount !== undefined && { per_page: options.maxCount }),\n ...(options?.pathFilter !== undefined && { path: options.pathFilter }),\n });\n\n return data.map(c => ({\n hash: c.sha,\n message: c.commit.message,\n author: `${c.commit.author?.name ?? 'unknown'} <${c.commit.author?.email ?? 'unknown'}>`,\n date: c.commit.author?.date ?? '',\n }));\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitHistory ${branch}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitHistory`);\n }\n throw new GitError(`Failed to get commit history: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-B3] Get commit history between two commits via Compare API\n */\n async getCommitHistoryRange(\n fromHash: string,\n toHash: string,\n options?: GetCommitHistoryOptions\n ): Promise<CommitInfo[]> {\n try {\n const { data } = await this.octokit.rest.repos.compareCommits({\n owner: this.owner,\n repo: this.repo,\n base: fromHash,\n head: toHash,\n });\n\n let commits: CommitInfo[] = data.commits.map(c => ({\n hash: c.sha,\n message: c.commit.message,\n author: `${c.commit.author?.name ?? 'unknown'} <${c.commit.author?.email ?? 'unknown'}>`,\n date: c.commit.author?.date ?? '',\n }));\n\n if (options?.pathFilter) {\n const changedPaths = new Set((data.files ?? []).map(f => f.filename));\n commits = commits.filter(() =>\n Array.from(changedPaths).some(f => f.startsWith(options.pathFilter!))\n );\n }\n\n if (options?.maxCount) {\n commits = commits.slice(0, options.maxCount);\n }\n\n return commits;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitHistoryRange ${fromHash}...${toHash}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitHistoryRange`);\n }\n throw new GitError(`Failed to get commit range: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-A6] Get commit message via Commits API\n */\n async getCommitMessage(commitHash: string): Promise<string> {\n try {\n const { data } = await this.octokit.rest.repos.getCommit({\n owner: this.owner,\n repo: this.repo,\n ref: commitHash,\n });\n return data.commit.message;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) {\n throw new GitError(`Commit not found: ${commitHash}`);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): getCommitMessage ${commitHash}`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): getCommitMessage`);\n }\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY A: BRANCH OPERATIONS (EARS-B1 to B2)\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * [EARS-B1] Check if branch exists via Branches API\n */\n async branchExists(branchName: string): Promise<boolean> {\n try {\n await this.octokit.rest.repos.getBranch({\n owner: this.owner,\n repo: this.repo,\n branch: branchName,\n });\n return true;\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 404) return false;\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): branchExists ${branchName}`);\n }\n throw new GitError(`Failed to check branch: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-B2] List remote branches via Branches API\n * remoteName is ignored — repo itself is the implicit remote\n */\n async listRemoteBranches(_remoteName: string): Promise<string[]> {\n try {\n const { data } = await this.octokit.rest.repos.listBranches({\n owner: this.owner,\n repo: this.repo,\n });\n return data.map(b => b.name);\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): listRemoteBranches`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): listRemoteBranches`);\n }\n throw new GitError(`Failed to list branches: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY A: WRITE OPERATIONS (EARS-C1 to C7)\n // ═══════════════════════════════════════════════════════════════\n\n /** [EARS-C1] Read file content and store in staging buffer */\n async add(filePaths: string[], options?: { force?: boolean; contentMap?: Record<string, string> }): Promise<void> {\n for (const filePath of filePaths) {\n const content = options?.contentMap?.[filePath]\n ?? await this.getFileContent(this.activeRef, filePath);\n this.stagingBuffer.set(filePath, content);\n }\n }\n\n /** [EARS-C2] Mark files as deleted in staging buffer */\n async rm(filePaths: string[]): Promise<void> {\n for (const filePath of filePaths) {\n this.stagingBuffer.set(filePath, null);\n }\n }\n\n /** [EARS-C7] Return staged file paths from buffer */\n async getStagedFiles(): Promise<string[]> {\n return Array.from(this.stagingBuffer.keys());\n }\n\n /**\n * [EARS-C6] Create branch via Refs API POST\n */\n async createBranch(branchName: string, startPoint?: string): Promise<void> {\n // Resolve startPoint to SHA\n const sha = startPoint\n ? await this.getCommitHash(startPoint)\n : await this.getCommitHash(this.activeRef);\n\n try {\n await this.octokit.rest.git.createRef({\n owner: this.owner,\n repo: this.repo,\n ref: `refs/heads/${branchName}`,\n sha,\n });\n } catch (error: unknown) {\n if (isOctokitRequestError(error)) {\n if (error.status === 422) {\n throw new BranchAlreadyExistsError(branchName);\n }\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): createBranch ${branchName}`);\n }\n throw new GitError(`Failed to create branch ${branchName}: HTTP ${error.status}`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * Internal commit implementation shared by commit() and commitAllowEmpty().\n *\n * [EARS-C3] 6-step atomic transaction\n * [EARS-C4] Clears staging buffer after successful commit\n * [EARS-C5] Throws if staging buffer is empty (unless allowEmpty)\n */\n private async commitInternal(message: string, author?: CommitAuthor, allowEmpty = false): Promise<string> {\n // [EARS-C5] Empty buffer check (skipped for commitAllowEmpty)\n if (!allowEmpty && this.stagingBuffer.size === 0) {\n throw new GitError('Nothing to commit: staging buffer is empty');\n }\n\n try {\n // Step 1: GET current ref SHA\n const { data: refData } = await this.octokit.rest.git.getRef({\n owner: this.owner,\n repo: this.repo,\n ref: `heads/${this.activeRef}`,\n });\n const currentSha = refData.object.sha;\n\n // Step 2: GET commit to obtain tree SHA\n const { data: commitData } = await this.octokit.rest.git.getCommit({\n owner: this.owner,\n repo: this.repo,\n commit_sha: currentSha,\n });\n const treeSha = commitData.tree.sha;\n\n // Step 3: POST blobs for each staged file (adds/updates only, not deletes)\n const treeEntries: Array<{\n path: string;\n mode: '100644';\n type: 'blob';\n sha: string | null;\n }> = [];\n\n for (const [path, content] of this.stagingBuffer) {\n if (content === null) {\n // Delete entry\n treeEntries.push({\n path,\n mode: '100644',\n type: 'blob',\n sha: null,\n });\n } else {\n // Create blob\n const { data: blobData } = await this.octokit.rest.git.createBlob({\n owner: this.owner,\n repo: this.repo,\n content: Buffer.from(content).toString('base64'),\n encoding: 'base64',\n });\n\n treeEntries.push({\n path,\n mode: '100644',\n type: 'blob',\n sha: blobData.sha,\n });\n }\n }\n\n // Step 4: POST new tree\n const { data: treeData } = await this.octokit.rest.git.createTree({\n owner: this.owner,\n repo: this.repo,\n base_tree: treeSha,\n tree: treeEntries,\n });\n const newTreeSha = treeData.sha;\n\n // Step 5: POST new commit\n const commitParams: {\n owner: string;\n repo: string;\n message: string;\n tree: string;\n parents: string[];\n author?: { name: string; email: string; date: string };\n } = {\n owner: this.owner,\n repo: this.repo,\n message,\n tree: newTreeSha,\n parents: [currentSha],\n };\n\n if (author) {\n commitParams.author = {\n name: author.name,\n email: author.email,\n date: new Date().toISOString(),\n };\n }\n\n const { data: newCommitData } = await this.octokit.rest.git.createCommit(commitParams);\n const newCommitSha = newCommitData.sha;\n\n // Step 6: PATCH ref to point to new commit\n try {\n await this.octokit.rest.git.updateRef({\n owner: this.owner,\n repo: this.repo,\n ref: `heads/${this.activeRef}`,\n sha: newCommitSha,\n });\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 422) {\n throw new GitError('non-fast-forward update rejected');\n }\n throw error;\n }\n\n // [EARS-C4] Clear staging buffer after successful commit\n this.stagingBuffer.clear();\n\n return newCommitSha;\n } catch (error: unknown) {\n if (error instanceof GitError) throw error;\n if (isOctokitRequestError(error)) {\n if (error.status === 401 || error.status === 403) {\n throw new GitError(`authentication/permission error (${error.status}): commit`);\n }\n if (error.status >= 500) {\n throw new GitError(`GitHub server error (${error.status}): commit`);\n }\n throw new GitError(`GitHub API error (${error.status}): commit`);\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new GitError(`network error: ${msg}`);\n }\n }\n\n /**\n * [EARS-C3] Commit staged changes via 6-step atomic transaction\n * [EARS-C5] Throws if staging buffer is empty\n */\n async commit(message: string, author?: CommitAuthor): Promise<string> {\n return this.commitInternal(message, author, false);\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY B: NO-OPS (sensible defaults)\n // ═══════════════════════════════════════════════════════════════\n\n /** [EARS-D5] exec not supported in API mode */\n async exec(\n _command: string,\n _args: string[],\n _options?: ExecOptions\n ): Promise<ExecResult> {\n return { exitCode: 1, stdout: '', stderr: 'exec() not supported in GitHub API mode' };\n }\n\n /** No-op: repos are created via GitHub API, not initialized locally */\n async init(): Promise<void> {\n // No-op\n }\n\n /** [EARS-D1] Return virtual path representing the repo */\n async getRepoRoot(): Promise<string> {\n return `github://${this.owner}/${this.repo}`;\n }\n\n /** [EARS-D1] Return active ref (starts as defaultBranch) */\n async getCurrentBranch(): Promise<string> {\n return this.activeRef;\n }\n\n /** No-op: git config doesn't apply to GitHub API */\n async setConfig(\n _key: string,\n _value: string,\n _scope?: 'local' | 'global' | 'system'\n ): Promise<void> {\n // No-op\n }\n\n /** [EARS-D1] Return true if staging buffer has entries */\n async hasUncommittedChanges(_pathFilter?: string): Promise<boolean> {\n return this.stagingBuffer.size > 0;\n }\n\n /** No-op: GitHub API doesn't have rebase-in-progress concept */\n async isRebaseInProgress(): Promise<boolean> {\n return false;\n }\n\n /** [EARS-D1] GitHub repos always have 'origin' conceptually */\n async isRemoteConfigured(_remoteName: string): Promise<boolean> {\n return true;\n }\n\n /** No-op: always 'origin' */\n async getBranchRemote(_branchName: string): Promise<string | null> {\n return 'origin';\n }\n\n /** No-op: GitHub API handles merges atomically */\n async getConflictedFiles(): Promise<string[]> {\n return [];\n }\n\n /** [EARS-D2] Update activeRef for subsequent operations */\n async checkoutBranch(branchName: string): Promise<void> {\n this.activeRef = branchName;\n }\n\n /** No-op: GitHub API doesn't have stash concept */\n async stash(_message?: string): Promise<string | null> {\n return null;\n }\n\n /** No-op */\n async stashPop(): Promise<boolean> {\n return false;\n }\n\n /** No-op */\n async stashDrop(_stashHash?: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API always fresh */\n async fetch(_remote: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API mode */\n async pull(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API mode */\n async pullRebase(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** [EARS-D4] No-op: commits via API are already remote */\n async push(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** [EARS-D4] No-op: commits via API are already remote */\n async pushWithUpstream(_remote: string, _branchName: string): Promise<void> {\n // No-op\n }\n\n /** No-op: API mode */\n async setUpstream(\n _branchName: string,\n _remote: string,\n _remoteBranch: string\n ): Promise<void> {\n // No-op\n }\n\n /** No-op */\n async rebaseAbort(): Promise<void> {\n // No-op\n }\n\n /** [EARS-D1] Delegates to commitInternal, allowing empty staging buffer */\n async commitAllowEmpty(message: string, author?: CommitAuthor): Promise<string> {\n return this.commitInternal(message, author, true);\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CATEGORY C: NOT SUPPORTED (throw GitError)\n // ═══════════════════════════════════════════════════════════════\n\n /** [EARS-D3] Not supported via GitHub API */\n async rebase(_targetBranch: string): Promise<void> {\n this.notSupported('rebase');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async rebaseContinue(): Promise<string> {\n this.notSupported('rebaseContinue');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async resetHard(_target: string): Promise<void> {\n this.notSupported('resetHard');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async checkoutOrphanBranch(_branchName: string): Promise<void> {\n this.notSupported('checkoutOrphanBranch');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async checkoutFilesFromBranch(\n _sourceBranch: string,\n _filePaths: string[]\n ): Promise<void> {\n this.notSupported('checkoutFilesFromBranch');\n }\n\n /** [EARS-D3] Not supported via GitHub API */\n async getMergeBase(_branchA: string, _branchB: string): Promise<string> {\n this.notSupported('getMergeBase');\n }\n}\n","/**\n * GitHubConfigStore - GitHub Contents API implementation of ConfigStore\n *\n * Persists config.json to a GitHub repository via Octokit.\n * Used by SaaS/server-side environments where the project lives on GitHub\n * and direct filesystem access is not available.\n *\n * Key behaviors:\n * - loadConfig: GET contents, base64 decode, JSON parse. Fail-safe on 404/invalid JSON.\n * - saveConfig: JSON serialize + base64 encode, PUT contents with optional SHA for updates.\n * - Caches blob SHA from loadConfig for subsequent saveConfig (optimistic concurrency).\n */\n\nimport type { Octokit } from '@octokit/rest';\nimport type { ConfigStore } from '../config_store';\nimport type { GitGovConfig } from '../../config_manager/config_manager.types';\nimport type { GitHubConfigStoreOptions, GitHubSaveResult } from './github_config_store.types';\nimport { mapOctokitError, isOctokitRequestError } from '../../github';\n\nexport class GitHubConfigStore implements ConfigStore<GitHubSaveResult> {\n private readonly owner: string;\n private readonly repo: string;\n private readonly ref: string;\n private readonly basePath: string;\n private readonly octokit: Octokit;\n\n /** Cached blob SHA from the last loadConfig call, used for PUT updates */\n private cachedSha: string | null = null;\n\n constructor(options: GitHubConfigStoreOptions, octokit: Octokit) {\n this.owner = options.owner;\n this.repo = options.repo;\n this.ref = options.ref ?? 'gitgov-state';\n this.basePath = options.basePath ?? '.gitgov';\n this.octokit = octokit;\n }\n\n /**\n * Load project configuration from GitHub Contents API.\n *\n * [EARS-A1] Returns GitGovConfig when valid JSON is found.\n * [EARS-A2] Returns null on 404 (fail-safe).\n * [EARS-A3] Returns null on invalid JSON (fail-safe).\n * [EARS-B1] Fetches via Contents API with base64 decode.\n * [EARS-B2] Caches SHA from response for subsequent saveConfig.\n */\n async loadConfig(): Promise<GitGovConfig | null> {\n const path = `${this.basePath}/config.json`;\n\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner: this.owner,\n repo: this.repo,\n path,\n ref: this.ref,\n });\n\n // getContent can return array (directory) — we expect a file\n if (Array.isArray(data) || data.type !== 'file') {\n return null;\n }\n\n // Decode base64 content\n if (!data.content) {\n return null;\n }\n\n // Cache SHA for subsequent saveConfig (only when content is present)\n this.cachedSha = data.sha;\n\n try {\n const decoded = Buffer.from(data.content, 'base64').toString('utf-8');\n return JSON.parse(decoded) as GitGovConfig;\n } catch {\n // Invalid JSON - fail-safe\n return null;\n }\n } catch (error: unknown) {\n if (isOctokitRequestError(error) && error.status === 404) {\n return null;\n }\n throw mapOctokitError(error, `loadConfig ${this.owner}/${this.repo}/${path}`);\n }\n }\n\n /**\n * Save project configuration to GitHub via Contents API PUT.\n *\n * [EARS-A4] Writes config via PUT to Contents API.\n * [EARS-B3] Includes cached SHA for updates (optimistic concurrency).\n * [EARS-B4] Omits SHA for initial creation.\n * [EARS-C1] Throws PERMISSION_DENIED on 401/403.\n * [EARS-C2] Throws CONFLICT on 409.\n * [EARS-C3] Throws SERVER_ERROR on 5xx.\n */\n async saveConfig(config: GitGovConfig): Promise<GitHubSaveResult> {\n const path = `${this.basePath}/config.json`;\n const content = Buffer.from(JSON.stringify(config, null, 2)).toString('base64');\n\n try {\n const { data } = await this.octokit.rest.repos.createOrUpdateFileContents({\n owner: this.owner,\n repo: this.repo,\n path,\n message: 'chore(config): update gitgov config.json',\n content,\n branch: this.ref,\n ...(this.cachedSha ? { sha: this.cachedSha } : {}),\n });\n\n // Update cached SHA for subsequent saves\n if (data.content?.sha) {\n this.cachedSha = data.content.sha;\n }\n\n return { commitSha: data.commit.sha! };\n } catch (error: unknown) {\n throw mapOctokitError(error, `saveConfig ${this.owner}/${this.repo}/${path}`);\n }\n }\n}\n","/**\n * GitHub API implementations for @gitgov/core/github\n *\n * This module exports all implementations that use GitHub REST API.\n * Suitable for SaaS environments, Forge apps, GitHub Actions,\n * and any context without local filesystem access.\n *\n * Usage:\n * import { GitHubFileLister, GitHubRecordStore, GitHubGitModule, GitHubConfigStore } from '@gitgov/core/github';\n *\n * Each implementation receives an `Octokit` instance for testability and shared auth/base-URL config.\n */\n\n// ==================== Re-exports: Octokit (types only) ====================\n\nexport type { Octokit, RestEndpointMethodTypes } from '@octokit/rest';\n\n// ==================== Shared Types ====================\n\n/**\n * Error codes for GitHub API errors.\n * Semantic codes that abstract HTTP status codes.\n */\nexport type GitHubApiErrorCode =\n | 'PERMISSION_DENIED'\n | 'NOT_FOUND'\n | 'CONFLICT'\n | 'SERVER_ERROR'\n | 'NETWORK_ERROR'\n | 'INVALID_ID'\n | 'INVALID_RESPONSE';\n\n/**\n * Typed error for GitHub API operations.\n * Used by RecordStore, ConfigStore, and other modules that\n * interact with GitHub Contents API directly.\n */\nexport class GitHubApiError extends Error {\n constructor(\n message: string,\n /** Semantic error code */\n public readonly code: GitHubApiErrorCode,\n /** HTTP status code (if applicable) */\n public readonly statusCode?: number,\n ) {\n super(message);\n this.name = 'GitHubApiError';\n Object.setPrototypeOf(this, GitHubApiError.prototype);\n }\n}\n\n/**\n * Type guard: checks if an error is an Octokit RequestError (duck-typing).\n * Avoids runtime import of ESM-only @octokit/request-error.\n */\nexport function isOctokitRequestError(error: unknown): error is { status: number; message: string } {\n return (\n error instanceof Error &&\n typeof (error as unknown as Record<string, unknown>)['status'] === 'number'\n );\n}\n\n/**\n * Maps Octokit RequestError (and unknown errors) to GitHubApiError.\n * Shared utility used by all GitHub backend modules.\n */\nexport function mapOctokitError(error: unknown, context: string): GitHubApiError {\n if (isOctokitRequestError(error)) {\n const status = error.status;\n\n if (status === 401 || status === 403) {\n return new GitHubApiError(\n `Permission denied: ${context}`,\n 'PERMISSION_DENIED',\n status,\n );\n }\n if (status === 404) {\n return new GitHubApiError(\n `Not found: ${context}`,\n 'NOT_FOUND',\n status,\n );\n }\n if (status === 409) {\n return new GitHubApiError(\n `Conflict: ${context}`,\n 'CONFLICT',\n status,\n );\n }\n if (status === 422) {\n return new GitHubApiError(\n `Validation failed: ${context}`,\n 'CONFLICT',\n status,\n );\n }\n if (status >= 500) {\n return new GitHubApiError(\n `Server error (${status}): ${context}`,\n 'SERVER_ERROR',\n status,\n );\n }\n\n return new GitHubApiError(\n `GitHub API error (${status}): ${context}`,\n 'SERVER_ERROR',\n status,\n );\n }\n\n // Network / unknown errors\n const message = error instanceof Error ? error.message : String(error);\n return new GitHubApiError(`Network error: ${message}`, 'NETWORK_ERROR');\n}\n\n// ==================== Module Exports ====================\n\n// SyncState\nexport { GithubSyncStateModule } from './sync_state/github_sync_state';\nexport type { GithubSyncStateDependencies } from './sync_state/github_sync_state';\n\n// FileLister\nexport { GitHubFileLister } from './file_lister/github';\nexport type {\n GitHubFileListerOptions,\n} from './file_lister/github';\n\n// RecordStore\nexport { GitHubRecordStore } from './record_store/github';\nexport type {\n GitHubRecordStoreOptions,\n GitHubWriteResult,\n GitHubWriteOpts,\n} from './record_store/github';\n\n// GitModule\nexport { GitHubGitModule } from './git/github';\nexport type { GitHubGitModuleOptions } from './git/github';\n\n// ConfigStore\nexport { GitHubConfigStore } from './config_store/github';\nexport type {\n GitHubConfigStoreOptions,\n GitHubSaveResult,\n} from './config_store/github';\n"]}
|