agent-conf 2.0.3 → 2.1.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/{chunk-EN5LTDER.js → chunk-MZ2GBXCB.js} +20 -17
- package/dist/chunk-MZ2GBXCB.js.map +1 -0
- package/dist/index.js +176 -107
- package/dist/index.js.map +1 -1
- package/dist/{skill-metadata-XANK6RZP.js → skill-metadata-DK2WBJJ3.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-EN5LTDER.js.map +0 -1
- /package/dist/{skill-metadata-XANK6RZP.js.map → skill-metadata-DK2WBJJ3.js.map} +0 -0
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
parseFrontmatter,
|
|
14
14
|
stripManagedMetadata,
|
|
15
15
|
validateSkillFrontmatter
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-MZ2GBXCB.js";
|
|
17
17
|
export {
|
|
18
18
|
addManagedMetadata,
|
|
19
19
|
checkAgentsMd,
|
|
@@ -29,4 +29,4 @@ export {
|
|
|
29
29
|
stripManagedMetadata,
|
|
30
30
|
validateSkillFrontmatter
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=skill-metadata-
|
|
32
|
+
//# sourceMappingURL=skill-metadata-DK2WBJJ3.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/skill-metadata.ts","../src/config/schema.ts","../src/core/markers.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { getMetadataKeys } from \"../config/schema.js\";\nimport {\n hasGlobalBlockChanges,\n isAgentsMdManaged,\n type MarkerOptions,\n parseAgentsMd,\n parseGlobalBlockMetadata,\n} from \"./markers.js\";\n\n// Default metadata prefix\nconst DEFAULT_METADATA_PREFIX = \"agent-conf\";\n\n/**\n * Options for metadata operations.\n */\nexport interface MetadataOptions extends MarkerOptions {\n /** Prefix for metadata keys (default: \"agent-conf\") */\n metadataPrefix?: string;\n}\n\n/**\n * Get metadata key names for a given prefix.\n */\nexport function getMetadataKeyNames(prefix: string = DEFAULT_METADATA_PREFIX) {\n return getMetadataKeys(prefix);\n}\n\n/**\n * Metadata fields added to synced skill files.\n * These are stored under the `metadata` key in YAML frontmatter.\n *\n * Note: Source and sync timestamp are tracked in lockfile\n * to avoid unnecessary file changes on every sync.\n */\nexport interface ManagedMetadata {\n managed: string; // \"true\"\n content_hash: string; // e.g., \"sha256:abc123...\"\n}\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/**\n * Parse YAML frontmatter from markdown content.\n * Returns the frontmatter object and the body content.\n */\nexport function parseFrontmatter(content: string): {\n frontmatter: Record<string, unknown>;\n body: string;\n raw: string;\n} {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match || !match[1]) {\n return { frontmatter: {}, body: content, raw: \"\" };\n }\n\n const rawYaml = match[1];\n const body = content.slice(match[0].length);\n const frontmatter = parseSimpleYaml(rawYaml);\n\n return { frontmatter, body, raw: rawYaml };\n}\n\n/**\n * Simple YAML parser for frontmatter.\n * Handles basic key-value pairs and nested metadata objects.\n */\nfunction parseSimpleYaml(yaml: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const lines = yaml.split(\"\\n\");\n let currentKey: string | null = null;\n let nestedObject: Record<string, string> | null = null;\n\n for (const line of lines) {\n // Skip empty lines\n if (line.trim() === \"\") continue;\n\n // Check for nested content (indented lines)\n if (line.startsWith(\" \") && currentKey && nestedObject !== null) {\n const nestedMatch = line.match(/^\\s+(\\w+):\\s*[\"']?(.*)[\"']?$/);\n if (nestedMatch?.[1] && nestedMatch[2] !== undefined) {\n const key = nestedMatch[1];\n const value = nestedMatch[2];\n nestedObject[key] = value.replace(/^[\"']|[\"']$/g, \"\");\n }\n continue;\n }\n\n // Save previous nested object if we're moving to a new key\n if (currentKey && nestedObject !== null) {\n result[currentKey] = nestedObject;\n nestedObject = null;\n }\n\n // Parse top-level key-value\n const match = line.match(/^(\\w+):\\s*(.*)$/);\n if (match?.[1] && match[2] !== undefined) {\n const key = match[1];\n const value = match[2];\n currentKey = key;\n\n if (value.trim() === \"\") {\n // This is a nested object (like metadata:)\n nestedObject = {};\n } else {\n // Simple value - remove quotes if present\n result[key] = value.replace(/^[\"']|[\"']$/g, \"\");\n }\n }\n }\n\n // Don't forget the last nested object\n if (currentKey && nestedObject !== null) {\n result[currentKey] = nestedObject;\n }\n\n return result;\n}\n\n/**\n * Serialize frontmatter object back to YAML string.\n */\nfunction serializeFrontmatter(frontmatter: Record<string, unknown>): string {\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (typeof value === \"object\" && value !== null) {\n lines.push(`${key}:`);\n for (const [nestedKey, nestedValue] of Object.entries(value as Record<string, string>)) {\n // Quote values that might need it\n const quotedValue = needsQuoting(String(nestedValue))\n ? `\"${String(nestedValue)}\"`\n : String(nestedValue);\n lines.push(` ${nestedKey}: ${quotedValue}`);\n }\n } else {\n // Handle multiline descriptions\n const strValue = String(value);\n if (strValue.length > 80 || strValue.includes(\"\\n\")) {\n lines.push(`${key}: ${strValue}`);\n } else {\n lines.push(`${key}: ${strValue}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Validation error for skill frontmatter.\n */\nexport interface SkillValidationError {\n skillName: string;\n path: string;\n errors: string[];\n}\n\n/**\n * Validate that a skill file has required frontmatter fields.\n * Returns validation errors if any required fields are missing.\n */\nexport function validateSkillFrontmatter(\n content: string,\n skillName: string,\n filePath: string,\n): SkillValidationError | null {\n const { frontmatter } = parseFrontmatter(content);\n const errors: string[] = [];\n\n // Check for frontmatter existence\n if (Object.keys(frontmatter).length === 0) {\n errors.push(\"Missing frontmatter (must have --- delimiters)\");\n } else {\n // Check for required fields\n if (!frontmatter.name) {\n errors.push(\"Missing required field: name\");\n }\n if (!frontmatter.description) {\n errors.push(\"Missing required field: description\");\n }\n }\n\n if (errors.length > 0) {\n return { skillName, path: filePath, errors };\n }\n return null;\n}\n\n/**\n * Check if a YAML value needs quoting.\n */\nfunction needsQuoting(value: string): boolean {\n // Quote if contains special characters or looks like a boolean/number\n return (\n value.includes(\":\") ||\n value.includes(\"#\") ||\n value.includes(\"@\") ||\n value === \"true\" ||\n value === \"false\" ||\n /^\\d+$/.test(value)\n );\n}\n\n/**\n * Compute content hash excluding managed metadata.\n * This allows detecting manual changes to synced files.\n */\nexport function computeContentHash(content: string, options: MetadataOptions = {}): string {\n const stripped = stripManagedMetadata(content, options);\n const hash = createHash(\"sha256\").update(stripped).digest(\"hex\");\n return `sha256:${hash.slice(0, 12)}`;\n}\n\n/**\n * Strip managed metadata from content for hashing purposes.\n * Removes metadata fields with the configured prefix.\n */\nexport function stripManagedMetadata(content: string, options: MetadataOptions = {}): string {\n const { metadataPrefix = DEFAULT_METADATA_PREFIX } = options;\n const { frontmatter, body } = parseFrontmatter(content);\n\n if (Object.keys(frontmatter).length === 0) {\n return content;\n }\n\n // Get the key prefix (convert dashes to underscores for key names)\n const keyPrefix = `${metadataPrefix.replace(/-/g, \"_\")}_`;\n\n // Remove managed fields from metadata\n if (frontmatter.metadata && typeof frontmatter.metadata === \"object\") {\n const metadata = frontmatter.metadata as Record<string, string>;\n const cleanedMetadata: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n // Skip keys with configured prefix\n if (!key.startsWith(keyPrefix)) {\n cleanedMetadata[key] = value;\n }\n }\n\n if (Object.keys(cleanedMetadata).length > 0) {\n frontmatter.metadata = cleanedMetadata;\n } else {\n delete frontmatter.metadata;\n }\n }\n\n // Rebuild content\n const yamlContent = serializeFrontmatter(frontmatter);\n return `---\\n${yamlContent}\\n---\\n${body}`;\n}\n\n/**\n * Add managed metadata to a skill file content.\n * Only adds managed flag and content hash - source/timestamp are in lockfile.\n */\nexport function addManagedMetadata(content: string, options: MetadataOptions = {}): string {\n const { metadataPrefix = DEFAULT_METADATA_PREFIX } = options;\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Compute hash of original content (without any existing managed metadata)\n const contentHash = computeContentHash(content, options);\n\n // Ensure metadata object exists\n if (!frontmatter.metadata || typeof frontmatter.metadata !== \"object\") {\n frontmatter.metadata = {};\n }\n\n const metadata = frontmatter.metadata as Record<string, string>;\n const keys = getMetadataKeyNames(metadataPrefix);\n\n // Add managed fields (only managed flag and hash - source/timestamp in lockfile)\n metadata[keys.managed] = \"true\";\n metadata[keys.contentHash] = contentHash;\n\n // Rebuild content\n const yamlContent = serializeFrontmatter(frontmatter);\n return `---\\n${yamlContent}\\n---\\n${body}`;\n}\n\n/**\n * Check if a file has been manually modified since last sync.\n * Returns true if the content hash doesn't match.\n */\nexport function hasManualChanges(content: string, options: MetadataOptions = {}): boolean {\n const { metadataPrefix = DEFAULT_METADATA_PREFIX } = options;\n const { frontmatter } = parseFrontmatter(content);\n\n if (!frontmatter.metadata || typeof frontmatter.metadata !== \"object\") {\n return false; // No metadata means not managed\n }\n\n const metadata = frontmatter.metadata as Record<string, string>;\n const keys = getMetadataKeyNames(metadataPrefix);\n const storedHash = metadata[keys.contentHash];\n\n if (!storedHash) {\n return false; // No hash stored\n }\n\n const currentHash = computeContentHash(content, options);\n return storedHash !== currentHash;\n}\n\n/**\n * Check if a file is managed by agent-conf.\n */\nexport function isManaged(content: string, options: MetadataOptions = {}): boolean {\n const { metadataPrefix = DEFAULT_METADATA_PREFIX } = options;\n const { frontmatter } = parseFrontmatter(content);\n\n if (!frontmatter.metadata || typeof frontmatter.metadata !== \"object\") {\n return false;\n }\n\n const metadata = frontmatter.metadata as Record<string, string>;\n const keys = getMetadataKeyNames(metadataPrefix);\n return metadata[keys.managed] === \"true\";\n}\n\n/**\n * Result of checking a skill file for modifications.\n */\nexport interface SkillFileCheckResult {\n /** Relative path to the skill file */\n path: string;\n /** Skill name (directory name) */\n skillName: string;\n /** Whether the file is managed by agent-conf */\n isManaged: boolean;\n /** Whether the file has been manually modified */\n hasChanges: boolean;\n}\n\n/**\n * Check all synced skill files in a target directory for manual modifications.\n * Returns information about each managed SKILL.md file found.\n */\nexport async function checkSkillFiles(\n targetDir: string,\n targets: string[] = [\"claude\"],\n): Promise<SkillFileCheckResult[]> {\n const results: SkillFileCheckResult[] = [];\n\n for (const target of targets) {\n const skillsDir = path.join(targetDir, `.${target}`, \"skills\");\n\n // Check if skills directory exists\n try {\n await fs.access(skillsDir);\n } catch {\n continue; // Skills directory doesn't exist for this target\n }\n\n // Find all SKILL.md files\n const skillFiles = await fg(\"*/SKILL.md\", {\n cwd: skillsDir,\n absolute: false,\n });\n\n for (const skillFile of skillFiles) {\n const fullPath = path.join(skillsDir, skillFile);\n const skillName = path.dirname(skillFile);\n const relativePath = path.join(`.${target}`, \"skills\", skillFile);\n\n try {\n const content = await fs.readFile(fullPath, \"utf-8\");\n const fileIsManaged = isManaged(content);\n const hasChanges = fileIsManaged && hasManualChanges(content);\n\n results.push({\n path: relativePath,\n skillName,\n isManaged: fileIsManaged,\n hasChanges,\n });\n } catch (_error) {}\n }\n }\n\n return results;\n}\n\n/**\n * Get only the modified skill files.\n */\nexport async function getModifiedSkillFiles(\n targetDir: string,\n targets: string[] = [\"claude\"],\n): Promise<SkillFileCheckResult[]> {\n const allFiles = await checkSkillFiles(targetDir, targets);\n return allFiles.filter((f) => f.hasChanges);\n}\n\n/**\n * Result of checking a managed file for modifications.\n * Used for both skill files and AGENTS.md.\n */\nexport interface ManagedFileCheckResult {\n /** Relative path to the file */\n path: string;\n /** Type of file */\n type: \"skill\" | \"agents\";\n /** Skill name if type is skill */\n skillName?: string;\n /** Whether the file is managed by agent-conf */\n isManaged: boolean;\n /** Whether the file has been manually modified */\n hasChanges: boolean;\n /** Source info from the file's metadata */\n source?: string;\n /** When the file was synced */\n syncedAt?: string;\n}\n\n/**\n * Check AGENTS.md for manual modifications.\n */\nexport async function checkAgentsMd(targetDir: string): Promise<ManagedFileCheckResult | null> {\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n\n try {\n const content = await fs.readFile(agentsMdPath, \"utf-8\");\n const isManaged = isAgentsMdManaged(content);\n\n if (!isManaged) {\n return null;\n }\n\n const hasChanges = hasGlobalBlockChanges(content);\n\n // Extract metadata\n const parsed = parseAgentsMd(content);\n let source: string | undefined;\n let syncedAt: string | undefined;\n\n if (parsed.globalBlock) {\n const metadata = parseGlobalBlockMetadata(parsed.globalBlock);\n source = metadata.source;\n syncedAt = metadata.syncedAt;\n }\n\n const result: ManagedFileCheckResult = {\n path: \"AGENTS.md\",\n type: \"agents\",\n isManaged,\n hasChanges,\n };\n if (source !== undefined) result.source = source;\n if (syncedAt !== undefined) result.syncedAt = syncedAt;\n return result;\n } catch {\n return null; // File doesn't exist or can't be read\n }\n}\n\n/**\n * Check all managed files (skills and AGENTS.md) for modifications.\n */\nexport async function checkAllManagedFiles(\n targetDir: string,\n targets: string[] = [\"claude\"],\n): Promise<ManagedFileCheckResult[]> {\n const results: ManagedFileCheckResult[] = [];\n\n // Check AGENTS.md\n const agentsMdResult = await checkAgentsMd(targetDir);\n if (agentsMdResult) {\n results.push(agentsMdResult);\n }\n\n // Check skill files\n const skillFiles = await checkSkillFiles(targetDir, targets);\n for (const skill of skillFiles) {\n if (skill.isManaged) {\n results.push({\n path: skill.path,\n type: \"skill\",\n skillName: skill.skillName,\n isManaged: skill.isManaged,\n hasChanges: skill.hasChanges,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Get all modified managed files (skills and AGENTS.md).\n */\nexport async function getModifiedManagedFiles(\n targetDir: string,\n targets: string[] = [\"claude\"],\n): Promise<ManagedFileCheckResult[]> {\n const allFiles = await checkAllManagedFiles(targetDir, targets);\n return allFiles.filter((f) => f.hasChanges);\n}\n","import { z } from \"zod\";\n\n// =============================================================================\n// Canonical Repository Configuration Schema (agent-conf.yaml)\n// =============================================================================\n// This is the config file that lives in the canonical repository (the source of\n// skills and standards). It defines metadata about the canonical content, marker prefix,\n// and which targets are supported.\n\nexport const CanonicalMetaSchema = z.object({\n /** Unique identifier for this canonical source (e.g., \"acme-standards\") */\n name: z.string().min(1),\n /** Organization name for display purposes */\n organization: z.string().optional(),\n /** Description of what this canonical repository provides */\n description: z.string().optional(),\n});\n\nexport const CanonicalPathsSchema = z.object({\n /** Path to the global instructions file (e.g., \"instructions/AGENTS.md\") */\n instructions: z.string().default(\"instructions/AGENTS.md\"),\n /** Path to the skills directory (e.g., \"skills\") */\n skills_dir: z.string().default(\"skills\"),\n});\n\nexport const MarkersConfigSchema = z.object({\n /**\n * Prefix for marker comments in managed files.\n * Generates markers like: <!-- {prefix}:global:start -->\n * Default: \"agent-conf\"\n */\n prefix: z.string().default(\"agent-conf\"),\n});\n\nexport const MergeConfigSchema = z.object({\n /** Whether to preserve repository-specific content blocks during sync */\n preserve_repo_content: z.boolean().default(true),\n});\n\n/**\n * Configuration schema for canonical repositories (agent-conf.yaml).\n * This file lives in the canonical source repo (e.g., acme-agent-standards).\n */\nexport const CanonicalRepoConfigSchema = z.object({\n version: z.literal(\"1\"),\n meta: CanonicalMetaSchema,\n content: CanonicalPathsSchema.default({}),\n /** List of supported target agents (e.g., [\"claude\", \"codex\"]) */\n targets: z.array(z.string()).default([\"claude\"]),\n markers: MarkersConfigSchema.default({}),\n merge: MergeConfigSchema.default({}),\n});\n\nexport type CanonicalMeta = z.infer<typeof CanonicalMetaSchema>;\nexport type CanonicalPaths = z.infer<typeof CanonicalPathsSchema>;\nexport type MarkersConfig = z.infer<typeof MarkersConfigSchema>;\nexport type MergeConfig = z.infer<typeof MergeConfigSchema>;\nexport type CanonicalRepoConfig = z.infer<typeof CanonicalRepoConfigSchema>;\n\n// =============================================================================\n// Downstream Repository Configuration Schema (.agent-conf.yaml)\n// =============================================================================\n// This is the config file that lives in downstream repositories (the consumers\n// of skills and standards). It defines which sources to sync from.\n\nexport const SourceConfigSchema = z.object({\n /** URL of the canonical repository (e.g., \"https://github.com/acme/agent-standards\") */\n url: z.string().url().optional(),\n /** GitHub repository in owner/repo format (alternative to url) */\n repository: z.string().optional(),\n /** Git ref to sync from (branch, tag, or commit) */\n ref: z.string().optional(),\n /** Priority for conflict resolution (higher wins). Default: 0 */\n priority: z.number().default(0),\n});\n\n/**\n * Configuration schema for downstream repositories (.agent-conf.yaml).\n * This file lives in repos that consume content from canonical repos.\n */\nexport const DownstreamConfigSchema = z.object({\n /**\n * List of canonical sources to sync from.\n * For MVP, only single source is supported; multi-source is future work.\n */\n sources: z.array(SourceConfigSchema).min(1).optional(),\n /** Override which targets to sync to (defaults to source repo's targets) */\n targets: z.array(z.string()).optional(),\n});\n\nexport type SourceConfig = z.infer<typeof SourceConfigSchema>;\nexport type DownstreamConfig = z.infer<typeof DownstreamConfigSchema>;\n\n// =============================================================================\n// Resolved Configuration (Runtime)\n// =============================================================================\n// After loading and merging configs, we work with a resolved configuration\n// that has all values filled in with defaults.\n\nexport const ResolvedConfigSchema = z.object({\n /** Name of the canonical source */\n name: z.string(),\n /** Organization name */\n organization: z.string().optional(),\n /** Path to instructions file within source */\n instructionsPath: z.string(),\n /** Path to skills directory within source */\n skillsDir: z.string(),\n /** Marker prefix for managed content */\n markerPrefix: z.string(),\n /** Target agents to sync to */\n targets: z.array(z.string()),\n /** Whether to preserve repo-specific content during merge */\n preserveRepoContent: z.boolean(),\n /** CLI name for hooks and workflows */\n cliName: z.string().default(\"agent-conf\"),\n /** Directory name for lockfile and config (e.g., \".agent-conf\") */\n configDir: z.string().default(\".agent-conf\"),\n /** Lockfile name */\n lockfileName: z.string().default(\"lockfile.json\"),\n});\n\nexport type ResolvedConfig = z.infer<typeof ResolvedConfigSchema>;\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nexport const DEFAULT_CONFIG: ResolvedConfig = {\n name: \"agent-conf\",\n instructionsPath: \"instructions/AGENTS.md\",\n skillsDir: \"skills\",\n markerPrefix: \"agent-conf\",\n targets: [\"claude\"],\n preserveRepoContent: true,\n cliName: \"agent-conf\",\n configDir: \".agent-conf\",\n lockfileName: \"lockfile.json\",\n};\n\n// =============================================================================\n// Marker Generation Helpers\n// =============================================================================\n\n/**\n * Generate marker strings based on the configured prefix.\n */\nexport function getMarkers(prefix: string) {\n return {\n globalStart: `<!-- ${prefix}:global:start -->`,\n globalEnd: `<!-- ${prefix}:global:end -->`,\n repoStart: `<!-- ${prefix}:repo:start -->`,\n repoEnd: `<!-- ${prefix}:repo:end -->`,\n };\n}\n\n/**\n * Generate metadata key names based on the configured prefix.\n * Used in skill frontmatter to track managed content.\n */\nexport function getMetadataKeys(prefix: string) {\n // Normalize prefix for use as key (replace dashes with underscores)\n const keyPrefix = prefix.replace(/-/g, \"_\");\n return {\n managed: `${keyPrefix}_managed`,\n contentHash: `${keyPrefix}_content_hash`,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { getMarkers as getMarkersFromConfig } from \"../config/schema.js\";\n\n// Default marker prefix\nconst DEFAULT_MARKER_PREFIX = \"agent-conf\";\n\n/**\n * Marker strings for managed content blocks.\n */\nexport interface Markers {\n globalStart: string;\n globalEnd: string;\n repoStart: string;\n repoEnd: string;\n}\n\n/**\n * Get markers for a given prefix.\n * Uses the config schema helper for consistency.\n */\nexport function getMarkers(prefix: string = DEFAULT_MARKER_PREFIX): Markers {\n return getMarkersFromConfig(prefix);\n}\n\n// Legacy exports for backwards compatibility (default prefix)\nexport const GLOBAL_START_MARKER = `<!-- ${DEFAULT_MARKER_PREFIX}:global:start -->`;\nexport const GLOBAL_END_MARKER = `<!-- ${DEFAULT_MARKER_PREFIX}:global:end -->`;\nexport const REPO_START_MARKER = `<!-- ${DEFAULT_MARKER_PREFIX}:repo:start -->`;\nexport const REPO_END_MARKER = `<!-- ${DEFAULT_MARKER_PREFIX}:repo:end -->`;\n\nexport interface ParsedAgentsMd {\n globalBlock: string | null;\n repoBlock: string | null;\n hasMarkers: boolean;\n}\n\nexport interface GlobalBlockMetadata {\n contentHash?: string;\n}\n\nexport interface ParsedGlobalBlockMetadata {\n source?: string;\n syncedAt?: string;\n contentHash?: string;\n}\n\n/**\n * Options for marker-based operations.\n */\nexport interface MarkerOptions {\n /** Marker prefix to use (default: \"agent-conf\") */\n prefix?: string;\n /** CLI name for comments (default: \"agent-conf\") */\n cliName?: string;\n}\n\n/**\n * Parse AGENTS.md content to extract global and repo blocks.\n */\nexport function parseAgentsMd(content: string, options: MarkerOptions = {}): ParsedAgentsMd {\n const { prefix = DEFAULT_MARKER_PREFIX } = options;\n const markers = getMarkers(prefix);\n return parseWithMarkers(content, markers);\n}\n\nfunction parseWithMarkers(content: string, markers: Markers): ParsedAgentsMd {\n const globalStartIdx = content.indexOf(markers.globalStart);\n const globalEndIdx = content.indexOf(markers.globalEnd);\n const repoStartIdx = content.indexOf(markers.repoStart);\n const repoEndIdx = content.indexOf(markers.repoEnd);\n\n const hasMarkers = globalStartIdx !== -1 || repoStartIdx !== -1;\n\n let globalBlock: string | null = null;\n let repoBlock: string | null = null;\n\n if (globalStartIdx !== -1 && globalEndIdx !== -1 && globalEndIdx > globalStartIdx) {\n const startContent = globalStartIdx + markers.globalStart.length;\n globalBlock = content.slice(startContent, globalEndIdx).trim();\n }\n\n if (repoStartIdx !== -1 && repoEndIdx !== -1 && repoEndIdx > repoStartIdx) {\n const startContent = repoStartIdx + markers.repoStart.length;\n repoBlock = content.slice(startContent, repoEndIdx).trim();\n }\n\n return { globalBlock, repoBlock, hasMarkers };\n}\n\n/**\n * Compute content hash for AGENTS.md global block.\n */\nexport function computeGlobalBlockHash(content: string): string {\n const hash = createHash(\"sha256\").update(content.trim()).digest(\"hex\");\n return `sha256:${hash.slice(0, 12)}`;\n}\n\n/**\n * Build the global block section of AGENTS.md.\n */\nexport function buildGlobalBlock(\n content: string,\n metadata: GlobalBlockMetadata,\n options: MarkerOptions = {},\n): string {\n const { prefix = DEFAULT_MARKER_PREFIX, cliName = \"agent-conf\" } = options;\n const markers = getMarkers(prefix);\n\n // Compute hash if not provided\n const contentHash = metadata.contentHash ?? computeGlobalBlockHash(content);\n\n const lines = [\n markers.globalStart,\n `<!-- DO NOT EDIT THIS SECTION - Managed by ${cliName} CLI -->`,\n `<!-- Content hash: ${contentHash} -->`,\n \"\",\n content.trim(),\n \"\",\n markers.globalEnd,\n ];\n return lines.join(\"\\n\");\n}\n\n/**\n * Build the repo-specific block section of AGENTS.md.\n */\nexport function buildRepoBlock(content: string | null, options: MarkerOptions = {}): string {\n const { prefix = DEFAULT_MARKER_PREFIX } = options;\n const markers = getMarkers(prefix);\n\n const lines = [\n markers.repoStart,\n \"<!-- Repository-specific instructions below -->\",\n \"\",\n content?.trim() ?? \"\",\n \"\",\n markers.repoEnd,\n ];\n return lines.join(\"\\n\");\n}\n\n/**\n * Build a complete AGENTS.md file with global and repo blocks.\n */\nexport function buildAgentsMd(\n globalContent: string,\n repoContent: string | null,\n metadata: GlobalBlockMetadata,\n options: MarkerOptions = {},\n): string {\n const globalBlock = buildGlobalBlock(globalContent, metadata, options);\n const repoBlock = buildRepoBlock(repoContent, options);\n return `${globalBlock}\\n\\n${repoBlock}\\n`;\n}\n\n/**\n * Extract the content from a repo block, stripping metadata comments.\n */\nexport function extractRepoBlockContent(parsed: ParsedAgentsMd): string | null {\n if (!parsed.repoBlock) return null;\n\n // Strip the \"Repository-specific instructions below\" comment since buildRepoBlock adds it fresh\n const lines = parsed.repoBlock.split(\"\\n\");\n const filtered = lines.filter((line) => {\n const trimmed = line.trim();\n return trimmed !== \"<!-- Repository-specific instructions below -->\";\n });\n\n const result = filtered.join(\"\\n\").trim();\n return result || null;\n}\n\n/**\n * Strip metadata comments from a global block.\n */\nexport function stripMetadataComments(globalBlock: string): string {\n const lines = globalBlock.split(\"\\n\");\n const filteredLines = lines.filter((line) => {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"<!-- DO NOT EDIT\")) return false;\n if (trimmed.startsWith(\"<!-- Source:\")) return false;\n if (trimmed.startsWith(\"<!-- Last synced:\")) return false;\n if (trimmed.startsWith(\"<!-- Content hash:\")) return false;\n return true;\n });\n return filteredLines.join(\"\\n\").trim();\n}\n\n/**\n * Parse metadata comments from a global block.\n */\nexport function parseGlobalBlockMetadata(globalBlock: string): ParsedGlobalBlockMetadata {\n const result: ParsedGlobalBlockMetadata = {};\n\n const sourceMatch = globalBlock.match(/<!--\\s*Source:\\s*(.+?)\\s*-->/);\n if (sourceMatch?.[1]) {\n result.source = sourceMatch[1];\n }\n\n const syncedMatch = globalBlock.match(/<!--\\s*Last synced:\\s*(.+?)\\s*-->/);\n if (syncedMatch?.[1]) {\n result.syncedAt = syncedMatch[1];\n }\n\n const hashMatch = globalBlock.match(/<!--\\s*Content hash:\\s*(.+?)\\s*-->/);\n if (hashMatch?.[1]) {\n result.contentHash = hashMatch[1];\n }\n\n return result;\n}\n\n/**\n * Check if the global block of AGENTS.md has been manually modified.\n * Returns true if the content hash doesn't match.\n */\nexport function hasGlobalBlockChanges(\n agentsMdContent: string,\n options: MarkerOptions = {},\n): boolean {\n const parsed = parseAgentsMd(agentsMdContent, options);\n\n if (!parsed.globalBlock) {\n return false; // No global block\n }\n\n const metadata = parseGlobalBlockMetadata(parsed.globalBlock);\n\n if (!metadata.contentHash) {\n return false; // No hash stored (old format)\n }\n\n // Get content without metadata comments\n const content = stripMetadataComments(parsed.globalBlock);\n const currentHash = computeGlobalBlockHash(content);\n\n return metadata.contentHash !== currentHash;\n}\n\n/**\n * Check if AGENTS.md is managed by agent-conf.\n */\nexport function isAgentsMdManaged(agentsMdContent: string, options: MarkerOptions = {}): boolean {\n const parsed = parseAgentsMd(agentsMdContent, options);\n return parsed.hasMarkers && parsed.globalBlock !== null;\n}\n"],"mappings":";;;AAAA,SAAS,cAAAA,mBAAkB;AAC3B,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,OAAO,QAAQ;;;ACHf,SAAS,SAAS;AASX,IAAM,sBAAsB,EAAE,OAAO;AAAA;AAAA,EAE1C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA;AAAA,EAEtB,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAElC,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA;AAAA,EAE3C,cAAc,EAAE,OAAO,EAAE,QAAQ,wBAAwB;AAAA;AAAA,EAEzD,YAAY,EAAE,OAAO,EAAE,QAAQ,QAAQ;AACzC,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1C,QAAQ,EAAE,OAAO,EAAE,QAAQ,YAAY;AACzC,CAAC;AAEM,IAAM,oBAAoB,EAAE,OAAO;AAAA;AAAA,EAExC,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACjD,CAAC;AAMM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,SAAS,EAAE,QAAQ,GAAG;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,qBAAqB,QAAQ,CAAC,CAAC;AAAA;AAAA,EAExC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;AAAA,EAC/C,SAAS,oBAAoB,QAAQ,CAAC,CAAC;AAAA,EACvC,OAAO,kBAAkB,QAAQ,CAAC,CAAC;AACrC,CAAC;AAcM,IAAM,qBAAqB,EAAE,OAAO;AAAA;AAAA,EAEzC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAE/B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAEhC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAEzB,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;AAChC,CAAC;AAMM,IAAM,yBAAyB,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7C,SAAS,EAAE,MAAM,kBAAkB,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAErD,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACxC,CAAC;AAWM,IAAM,uBAAuB,EAAE,OAAO;AAAA;AAAA,EAE3C,MAAM,EAAE,OAAO;AAAA;AAAA,EAEf,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAElC,kBAAkB,EAAE,OAAO;AAAA;AAAA,EAE3B,WAAW,EAAE,OAAO;AAAA;AAAA,EAEpB,cAAc,EAAE,OAAO;AAAA;AAAA,EAEvB,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAAA,EAE3B,qBAAqB,EAAE,QAAQ;AAAA;AAAA,EAE/B,SAAS,EAAE,OAAO,EAAE,QAAQ,YAAY;AAAA;AAAA,EAExC,WAAW,EAAE,OAAO,EAAE,QAAQ,aAAa;AAAA;AAAA,EAE3C,cAAc,EAAE,OAAO,EAAE,QAAQ,eAAe;AAClD,CAAC;AA2BM,SAAS,WAAW,QAAgB;AACzC,SAAO;AAAA,IACL,aAAa,QAAQ,MAAM;AAAA,IAC3B,WAAW,QAAQ,MAAM;AAAA,IACzB,WAAW,QAAQ,MAAM;AAAA,IACzB,SAAS,QAAQ,MAAM;AAAA,EACzB;AACF;AAMO,SAAS,gBAAgB,QAAgB;AAE9C,QAAM,YAAY,OAAO,QAAQ,MAAM,GAAG;AAC1C,SAAO;AAAA,IACL,SAAS,GAAG,SAAS;AAAA,IACrB,aAAa,GAAG,SAAS;AAAA,EAC3B;AACF;;;ACvKA,SAAS,kBAAkB;AAI3B,IAAM,wBAAwB;AAgBvB,SAASC,YAAW,SAAiB,uBAAgC;AAC1E,SAAO,WAAqB,MAAM;AACpC;AAGO,IAAM,sBAAsB,QAAQ,qBAAqB;AACzD,IAAM,oBAAoB,QAAQ,qBAAqB;AACvD,IAAM,oBAAoB,QAAQ,qBAAqB;AACvD,IAAM,kBAAkB,QAAQ,qBAAqB;AA+BrD,SAAS,cAAc,SAAiB,UAAyB,CAAC,GAAmB;AAC1F,QAAM,EAAE,SAAS,sBAAsB,IAAI;AAC3C,QAAM,UAAUA,YAAW,MAAM;AACjC,SAAO,iBAAiB,SAAS,OAAO;AAC1C;AAEA,SAAS,iBAAiB,SAAiB,SAAkC;AAC3E,QAAM,iBAAiB,QAAQ,QAAQ,QAAQ,WAAW;AAC1D,QAAM,eAAe,QAAQ,QAAQ,QAAQ,SAAS;AACtD,QAAM,eAAe,QAAQ,QAAQ,QAAQ,SAAS;AACtD,QAAM,aAAa,QAAQ,QAAQ,QAAQ,OAAO;AAElD,QAAM,aAAa,mBAAmB,MAAM,iBAAiB;AAE7D,MAAI,cAA6B;AACjC,MAAI,YAA2B;AAE/B,MAAI,mBAAmB,MAAM,iBAAiB,MAAM,eAAe,gBAAgB;AACjF,UAAM,eAAe,iBAAiB,QAAQ,YAAY;AAC1D,kBAAc,QAAQ,MAAM,cAAc,YAAY,EAAE,KAAK;AAAA,EAC/D;AAEA,MAAI,iBAAiB,MAAM,eAAe,MAAM,aAAa,cAAc;AACzE,UAAM,eAAe,eAAe,QAAQ,UAAU;AACtD,gBAAY,QAAQ,MAAM,cAAc,UAAU,EAAE,KAAK;AAAA,EAC3D;AAEA,SAAO,EAAE,aAAa,WAAW,WAAW;AAC9C;AAKO,SAAS,uBAAuB,SAAyB;AAC9D,QAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,KAAK,CAAC,EAAE,OAAO,KAAK;AACrE,SAAO,UAAU,KAAK,MAAM,GAAG,EAAE,CAAC;AACpC;AAKO,SAAS,iBACd,SACA,UACA,UAAyB,CAAC,GAClB;AACR,QAAM,EAAE,SAAS,uBAAuB,UAAU,aAAa,IAAI;AACnE,QAAM,UAAUA,YAAW,MAAM;AAGjC,QAAM,cAAc,SAAS,eAAe,uBAAuB,OAAO;AAE1E,QAAM,QAAQ;AAAA,IACZ,QAAQ;AAAA,IACR,8CAA8C,OAAO;AAAA,IACrD,sBAAsB,WAAW;AAAA,IACjC;AAAA,IACA,QAAQ,KAAK;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,EACV;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,eAAe,SAAwB,UAAyB,CAAC,GAAW;AAC1F,QAAM,EAAE,SAAS,sBAAsB,IAAI;AAC3C,QAAM,UAAUA,YAAW,MAAM;AAEjC,QAAM,QAAQ;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,QAAQ;AAAA,EACV;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,cACd,eACA,aACA,UACA,UAAyB,CAAC,GAClB;AACR,QAAM,cAAc,iBAAiB,eAAe,UAAU,OAAO;AACrE,QAAM,YAAY,eAAe,aAAa,OAAO;AACrD,SAAO,GAAG,WAAW;AAAA;AAAA,EAAO,SAAS;AAAA;AACvC;AAKO,SAAS,wBAAwB,QAAuC;AAC7E,MAAI,CAAC,OAAO,UAAW,QAAO;AAG9B,QAAM,QAAQ,OAAO,UAAU,MAAM,IAAI;AACzC,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS;AACtC,UAAM,UAAU,KAAK,KAAK;AAC1B,WAAO,YAAY;AAAA,EACrB,CAAC;AAED,QAAM,SAAS,SAAS,KAAK,IAAI,EAAE,KAAK;AACxC,SAAO,UAAU;AACnB;AAKO,SAAS,sBAAsB,aAA6B;AACjE,QAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,QAAM,gBAAgB,MAAM,OAAO,CAAC,SAAS;AAC3C,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,QAAQ,WAAW,kBAAkB,EAAG,QAAO;AACnD,QAAI,QAAQ,WAAW,cAAc,EAAG,QAAO;AAC/C,QAAI,QAAQ,WAAW,mBAAmB,EAAG,QAAO;AACpD,QAAI,QAAQ,WAAW,oBAAoB,EAAG,QAAO;AACrD,WAAO;AAAA,EACT,CAAC;AACD,SAAO,cAAc,KAAK,IAAI,EAAE,KAAK;AACvC;AAKO,SAAS,yBAAyB,aAAgD;AACvF,QAAM,SAAoC,CAAC;AAE3C,QAAM,cAAc,YAAY,MAAM,8BAA8B;AACpE,MAAI,cAAc,CAAC,GAAG;AACpB,WAAO,SAAS,YAAY,CAAC;AAAA,EAC/B;AAEA,QAAM,cAAc,YAAY,MAAM,mCAAmC;AACzE,MAAI,cAAc,CAAC,GAAG;AACpB,WAAO,WAAW,YAAY,CAAC;AAAA,EACjC;AAEA,QAAM,YAAY,YAAY,MAAM,oCAAoC;AACxE,MAAI,YAAY,CAAC,GAAG;AAClB,WAAO,cAAc,UAAU,CAAC;AAAA,EAClC;AAEA,SAAO;AACT;AAMO,SAAS,sBACd,iBACA,UAAyB,CAAC,GACjB;AACT,QAAM,SAAS,cAAc,iBAAiB,OAAO;AAErD,MAAI,CAAC,OAAO,aAAa;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,yBAAyB,OAAO,WAAW;AAE5D,MAAI,CAAC,SAAS,aAAa;AACzB,WAAO;AAAA,EACT;AAGA,QAAM,UAAU,sBAAsB,OAAO,WAAW;AACxD,QAAM,cAAc,uBAAuB,OAAO;AAElD,SAAO,SAAS,gBAAgB;AAClC;AAKO,SAAS,kBAAkB,iBAAyB,UAAyB,CAAC,GAAY;AAC/F,QAAM,SAAS,cAAc,iBAAiB,OAAO;AACrD,SAAO,OAAO,cAAc,OAAO,gBAAgB;AACrD;;;AFvOA,IAAM,0BAA0B;AAazB,SAAS,oBAAoB,SAAiB,yBAAyB;AAC5E,SAAO,gBAAgB,MAAM;AAC/B;AAcA,IAAM,oBAAoB;AAMnB,SAAS,iBAAiB,SAI/B;AACA,QAAM,QAAQ,QAAQ,MAAM,iBAAiB;AAC7C,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AACvB,WAAO,EAAE,aAAa,CAAC,GAAG,MAAM,SAAS,KAAK,GAAG;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,CAAC;AACvB,QAAM,OAAO,QAAQ,MAAM,MAAM,CAAC,EAAE,MAAM;AAC1C,QAAM,cAAc,gBAAgB,OAAO;AAE3C,SAAO,EAAE,aAAa,MAAM,KAAK,QAAQ;AAC3C;AAMA,SAAS,gBAAgB,MAAuC;AAC9D,QAAM,SAAkC,CAAC;AACzC,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAI,aAA4B;AAChC,MAAI,eAA8C;AAElD,aAAW,QAAQ,OAAO;AAExB,QAAI,KAAK,KAAK,MAAM,GAAI;AAGxB,QAAI,KAAK,WAAW,IAAI,KAAK,cAAc,iBAAiB,MAAM;AAChE,YAAM,cAAc,KAAK,MAAM,8BAA8B;AAC7D,UAAI,cAAc,CAAC,KAAK,YAAY,CAAC,MAAM,QAAW;AACpD,cAAM,MAAM,YAAY,CAAC;AACzB,cAAM,QAAQ,YAAY,CAAC;AAC3B,qBAAa,GAAG,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,MACtD;AACA;AAAA,IACF;AAGA,QAAI,cAAc,iBAAiB,MAAM;AACvC,aAAO,UAAU,IAAI;AACrB,qBAAe;AAAA,IACjB;AAGA,UAAM,QAAQ,KAAK,MAAM,iBAAiB;AAC1C,QAAI,QAAQ,CAAC,KAAK,MAAM,CAAC,MAAM,QAAW;AACxC,YAAM,MAAM,MAAM,CAAC;AACnB,YAAM,QAAQ,MAAM,CAAC;AACrB,mBAAa;AAEb,UAAI,MAAM,KAAK,MAAM,IAAI;AAEvB,uBAAe,CAAC;AAAA,MAClB,OAAO;AAEL,eAAO,GAAG,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,iBAAiB,MAAM;AACvC,WAAO,UAAU,IAAI;AAAA,EACvB;AAEA,SAAO;AACT;AAKA,SAAS,qBAAqB,aAA8C;AAC1E,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,YAAM,KAAK,GAAG,GAAG,GAAG;AACpB,iBAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,KAA+B,GAAG;AAEtF,cAAM,cAAc,aAAa,OAAO,WAAW,CAAC,IAChD,IAAI,OAAO,WAAW,CAAC,MACvB,OAAO,WAAW;AACtB,cAAM,KAAK,KAAK,SAAS,KAAK,WAAW,EAAE;AAAA,MAC7C;AAAA,IACF,OAAO;AAEL,YAAM,WAAW,OAAO,KAAK;AAC7B,UAAI,SAAS,SAAS,MAAM,SAAS,SAAS,IAAI,GAAG;AACnD,cAAM,KAAK,GAAG,GAAG,KAAK,QAAQ,EAAE;AAAA,MAClC,OAAO;AACL,cAAM,KAAK,GAAG,GAAG,KAAK,QAAQ,EAAE;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAeO,SAAS,yBACd,SACA,WACA,UAC6B;AAC7B,QAAM,EAAE,YAAY,IAAI,iBAAiB,OAAO;AAChD,QAAM,SAAmB,CAAC;AAG1B,MAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,WAAO,KAAK,gDAAgD;AAAA,EAC9D,OAAO;AAEL,QAAI,CAAC,YAAY,MAAM;AACrB,aAAO,KAAK,8BAA8B;AAAA,IAC5C;AACA,QAAI,CAAC,YAAY,aAAa;AAC5B,aAAO,KAAK,qCAAqC;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,WAAW,MAAM,UAAU,OAAO;AAAA,EAC7C;AACA,SAAO;AACT;AAKA,SAAS,aAAa,OAAwB;AAE5C,SACE,MAAM,SAAS,GAAG,KAClB,MAAM,SAAS,GAAG,KAClB,MAAM,SAAS,GAAG,KAClB,UAAU,UACV,UAAU,WACV,QAAQ,KAAK,KAAK;AAEtB;AAMO,SAAS,mBAAmB,SAAiB,UAA2B,CAAC,GAAW;AACzF,QAAM,WAAW,qBAAqB,SAAS,OAAO;AACtD,QAAM,OAAOC,YAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK;AAC/D,SAAO,UAAU,KAAK,MAAM,GAAG,EAAE,CAAC;AACpC;AAMO,SAAS,qBAAqB,SAAiB,UAA2B,CAAC,GAAW;AAC3F,QAAM,EAAE,iBAAiB,wBAAwB,IAAI;AACrD,QAAM,EAAE,aAAa,KAAK,IAAI,iBAAiB,OAAO;AAEtD,MAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,GAAG,eAAe,QAAQ,MAAM,GAAG,CAAC;AAGtD,MAAI,YAAY,YAAY,OAAO,YAAY,aAAa,UAAU;AACpE,UAAM,WAAW,YAAY;AAC7B,UAAM,kBAA0C,CAAC;AAEjD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAEnD,UAAI,CAAC,IAAI,WAAW,SAAS,GAAG;AAC9B,wBAAgB,GAAG,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,eAAe,EAAE,SAAS,GAAG;AAC3C,kBAAY,WAAW;AAAA,IACzB,OAAO;AACL,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAGA,QAAM,cAAc,qBAAqB,WAAW;AACpD,SAAO;AAAA,EAAQ,WAAW;AAAA;AAAA,EAAU,IAAI;AAC1C;AAMO,SAAS,mBAAmB,SAAiB,UAA2B,CAAC,GAAW;AACzF,QAAM,EAAE,iBAAiB,wBAAwB,IAAI;AACrD,QAAM,EAAE,aAAa,KAAK,IAAI,iBAAiB,OAAO;AAGtD,QAAM,cAAc,mBAAmB,SAAS,OAAO;AAGvD,MAAI,CAAC,YAAY,YAAY,OAAO,YAAY,aAAa,UAAU;AACrE,gBAAY,WAAW,CAAC;AAAA,EAC1B;AAEA,QAAM,WAAW,YAAY;AAC7B,QAAM,OAAO,oBAAoB,cAAc;AAG/C,WAAS,KAAK,OAAO,IAAI;AACzB,WAAS,KAAK,WAAW,IAAI;AAG7B,QAAM,cAAc,qBAAqB,WAAW;AACpD,SAAO;AAAA,EAAQ,WAAW;AAAA;AAAA,EAAU,IAAI;AAC1C;AAMO,SAAS,iBAAiB,SAAiB,UAA2B,CAAC,GAAY;AACxF,QAAM,EAAE,iBAAiB,wBAAwB,IAAI;AACrD,QAAM,EAAE,YAAY,IAAI,iBAAiB,OAAO;AAEhD,MAAI,CAAC,YAAY,YAAY,OAAO,YAAY,aAAa,UAAU;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY;AAC7B,QAAM,OAAO,oBAAoB,cAAc;AAC/C,QAAM,aAAa,SAAS,KAAK,WAAW;AAE5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,mBAAmB,SAAS,OAAO;AACvD,SAAO,eAAe;AACxB;AAKO,SAAS,UAAU,SAAiB,UAA2B,CAAC,GAAY;AACjF,QAAM,EAAE,iBAAiB,wBAAwB,IAAI;AACrD,QAAM,EAAE,YAAY,IAAI,iBAAiB,OAAO;AAEhD,MAAI,CAAC,YAAY,YAAY,OAAO,YAAY,aAAa,UAAU;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY;AAC7B,QAAM,OAAO,oBAAoB,cAAc;AAC/C,SAAO,SAAS,KAAK,OAAO,MAAM;AACpC;AAoBA,eAAsB,gBACpB,WACA,UAAoB,CAAC,QAAQ,GACI;AACjC,QAAM,UAAkC,CAAC;AAEzC,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAiB,UAAK,WAAW,IAAI,MAAM,IAAI,QAAQ;AAG7D,QAAI;AACF,YAAS,UAAO,SAAS;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,GAAG,cAAc;AAAA,MACxC,KAAK;AAAA,MACL,UAAU;AAAA,IACZ,CAAC;AAED,eAAW,aAAa,YAAY;AAClC,YAAM,WAAgB,UAAK,WAAW,SAAS;AAC/C,YAAM,YAAiB,aAAQ,SAAS;AACxC,YAAM,eAAoB,UAAK,IAAI,MAAM,IAAI,UAAU,SAAS;AAEhE,UAAI;AACF,cAAM,UAAU,MAAS,YAAS,UAAU,OAAO;AACnD,cAAM,gBAAgB,UAAU,OAAO;AACvC,cAAM,aAAa,iBAAiB,iBAAiB,OAAO;AAE5D,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,WAAW;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH,SAAS,QAAQ;AAAA,MAAC;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAsB,sBACpB,WACA,UAAoB,CAAC,QAAQ,GACI;AACjC,QAAM,WAAW,MAAM,gBAAgB,WAAW,OAAO;AACzD,SAAO,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU;AAC5C;AA0BA,eAAsB,cAAc,WAA2D;AAC7F,QAAM,eAAoB,UAAK,WAAW,WAAW;AAErD,MAAI;AACF,UAAM,UAAU,MAAS,YAAS,cAAc,OAAO;AACvD,UAAMC,aAAY,kBAAkB,OAAO;AAE3C,QAAI,CAACA,YAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,sBAAsB,OAAO;AAGhD,UAAM,SAAS,cAAc,OAAO;AACpC,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,aAAa;AACtB,YAAM,WAAW,yBAAyB,OAAO,WAAW;AAC5D,eAAS,SAAS;AAClB,iBAAW,SAAS;AAAA,IACtB;AAEA,UAAM,SAAiC;AAAA,MACrC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAAA;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,OAAW,QAAO,SAAS;AAC1C,QAAI,aAAa,OAAW,QAAO,WAAW;AAC9C,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,qBACpB,WACA,UAAoB,CAAC,QAAQ,GACM;AACnC,QAAM,UAAoC,CAAC;AAG3C,QAAM,iBAAiB,MAAM,cAAc,SAAS;AACpD,MAAI,gBAAgB;AAClB,YAAQ,KAAK,cAAc;AAAA,EAC7B;AAGA,QAAM,aAAa,MAAM,gBAAgB,WAAW,OAAO;AAC3D,aAAW,SAAS,YAAY;AAC9B,QAAI,MAAM,WAAW;AACnB,cAAQ,KAAK;AAAA,QACX,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAsB,wBACpB,WACA,UAAoB,CAAC,QAAQ,GACM;AACnC,QAAM,WAAW,MAAM,qBAAqB,WAAW,OAAO;AAC9D,SAAO,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU;AAC5C;","names":["createHash","getMarkers","createHash","isManaged"]}
|
|
File without changes
|