agconf 0.3.1 → 0.3.3
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/README.md +9 -9
- package/dist/{chunk-B53WKCQU.js → chunk-OHYGKXGJ.js} +10 -10
- package/dist/chunk-OHYGKXGJ.js.map +1 -0
- package/dist/index.js +67 -68
- package/dist/index.js.map +1 -1
- package/dist/{skill-metadata-XXNMIXLD.js → skill-metadata-NPSEW5UJ.js} +2 -2
- package/package.json +5 -6
- package/dist/chunk-B53WKCQU.js.map +0 -1
- /package/dist/{skill-metadata-XXNMIXLD.js.map → skill-metadata-NPSEW5UJ.js.map} +0 -0
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
parseFrontmatter,
|
|
17
17
|
stripManagedMetadata,
|
|
18
18
|
validateSkillFrontmatter
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OHYGKXGJ.js";
|
|
20
20
|
export {
|
|
21
21
|
addManagedMetadata,
|
|
22
22
|
checkAgentsMd,
|
|
@@ -35,4 +35,4 @@ export {
|
|
|
35
35
|
stripManagedMetadata,
|
|
36
36
|
validateSkillFrontmatter
|
|
37
37
|
};
|
|
38
|
-
//# sourceMappingURL=skill-metadata-
|
|
38
|
+
//# sourceMappingURL=skill-metadata-NPSEW5UJ.js.map
|
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agconf",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "CLI utility to sync AI agent configurations across repositories",
|
|
5
5
|
"author": "Julian Pani",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"agconf": "./dist/index.js"
|
|
9
|
-
"agent-conf": "./dist/index.js"
|
|
8
|
+
"agconf": "./dist/index.js"
|
|
10
9
|
},
|
|
11
10
|
"main": "./dist/index.js",
|
|
12
11
|
"types": "./dist/index.d.ts",
|
|
@@ -74,12 +73,12 @@
|
|
|
74
73
|
],
|
|
75
74
|
"repository": {
|
|
76
75
|
"type": "git",
|
|
77
|
-
"url": "git+https://github.com/julian-pani/
|
|
76
|
+
"url": "git+https://github.com/julian-pani/agconf.git",
|
|
78
77
|
"directory": "cli"
|
|
79
78
|
},
|
|
80
|
-
"homepage": "https://github.com/julian-pani/
|
|
79
|
+
"homepage": "https://github.com/julian-pani/agconf#readme",
|
|
81
80
|
"bugs": {
|
|
82
|
-
"url": "https://github.com/julian-pani/
|
|
81
|
+
"url": "https://github.com/julian-pani/agconf/issues"
|
|
83
82
|
},
|
|
84
83
|
"license": "MIT",
|
|
85
84
|
"publishConfig": {
|
|
@@ -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 hasRulesSectionChanges,\n isAgentsMdManaged,\n type MarkerOptions,\n parseAgentsMd,\n parseGlobalBlockMetadata,\n parseRulesSection,\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 options: MetadataOptions = {},\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 // Expected: skills directory may not exist for this target\n continue;\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, options);\n const hasChanges = fileIsManaged && hasManualChanges(content, options);\n\n results.push({\n path: relativePath,\n skillName,\n isManaged: fileIsManaged,\n hasChanges,\n });\n } catch (_error) {\n // Expected: file read may fail, skip this skill file\n }\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 options: MetadataOptions = {},\n): Promise<SkillFileCheckResult[]> {\n const allFiles = await checkSkillFiles(targetDir, targets, options);\n return allFiles.filter((f) => f.hasChanges);\n}\n\n/**\n * Check all synced rule files in a target directory for manual modifications.\n * Returns information about each managed rule file found.\n */\nexport async function checkRuleFiles(\n targetDir: string,\n targets: string[] = [\"claude\"],\n options: MetadataOptions = {},\n): Promise<RuleFileCheckResult[]> {\n const results: RuleFileCheckResult[] = [];\n\n for (const target of targets) {\n const rulesDir = path.join(targetDir, `.${target}`, \"rules\");\n\n // Check if rules directory exists\n try {\n await fs.access(rulesDir);\n } catch {\n // Expected: rules directory may not exist for this target\n continue;\n }\n\n // Find all .md files recursively\n const ruleFiles = await fg(\"**/*.md\", {\n cwd: rulesDir,\n absolute: false,\n });\n\n for (const ruleFile of ruleFiles) {\n const fullPath = path.join(rulesDir, ruleFile);\n const relativePath = path.join(`.${target}`, \"rules\", ruleFile);\n\n try {\n const content = await fs.readFile(fullPath, \"utf-8\");\n const fileIsManaged = isManaged(content, options);\n const hasChanges = fileIsManaged && hasManualChanges(content, options);\n\n // Extract rulePath from metadata if available\n const { frontmatter } = parseFrontmatter(content);\n const metadata = frontmatter.metadata as Record<string, string> | undefined;\n const keyPrefix = (options.metadataPrefix || \"agent-conf\").replace(/-/g, \"_\");\n const rulePath = metadata?.[`${keyPrefix}_source_path`] || ruleFile;\n\n results.push({\n path: relativePath,\n rulePath,\n isManaged: fileIsManaged,\n hasChanges,\n });\n } catch (_error) {\n // Expected: file read may fail, skip this rule file\n }\n }\n }\n\n return results;\n}\n\n/**\n * Get only the modified rule files.\n */\nexport async function getModifiedRuleFiles(\n targetDir: string,\n targets: string[] = [\"claude\"],\n options: MetadataOptions = {},\n): Promise<RuleFileCheckResult[]> {\n const allFiles = await checkRuleFiles(targetDir, targets, options);\n return allFiles.filter((f) => f.hasChanges);\n}\n\n/**\n * Result of checking a managed file for modifications.\n * Used for skill files, rule 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\" | \"rule\" | \"rules-section\";\n /** Skill name if type is skill */\n skillName?: string;\n /** Rule source path if type is rule (e.g., \"security/auth.md\") */\n rulePath?: 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 * Result of checking a rule file for modifications.\n */\nexport interface RuleFileCheckResult {\n /** Relative path to the rule file (from target dir) */\n path: string;\n /** Original rule path (e.g., \"security/auth.md\") */\n rulePath: 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 AGENTS.md for manual modifications.\n */\nexport async function checkAgentsMd(\n targetDir: string,\n options: MarkerOptions = {},\n): 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 managed = isAgentsMdManaged(content, options);\n\n if (!managed) {\n return null;\n }\n\n const hasChanges = hasGlobalBlockChanges(content, options);\n\n // Extract metadata\n const parsed = parseAgentsMd(content, options);\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: managed,\n hasChanges,\n };\n if (source !== undefined) result.source = source;\n if (syncedAt !== undefined) result.syncedAt = syncedAt;\n return result;\n } catch {\n // Expected: AGENTS.md may not exist or can't be read\n return null;\n }\n}\n\n/** Options for checking managed files */\nexport interface CheckManagedFilesOptions {\n /** Marker prefix for AGENTS.md (default: \"agent-conf\") */\n markerPrefix?: string;\n /** Metadata prefix for skill files (default: \"agent-conf\") */\n metadataPrefix?: string;\n}\n\n/**\n * Check all managed files (skills, rules, and AGENTS.md) for modifications.\n */\nexport async function checkAllManagedFiles(\n targetDir: string,\n targets: string[] = [\"claude\"],\n options: CheckManagedFilesOptions = {},\n): Promise<ManagedFileCheckResult[]> {\n const results: ManagedFileCheckResult[] = [];\n const markerOptions = options.markerPrefix ? { prefix: options.markerPrefix } : {};\n const metadataOptions = options.metadataPrefix ? { metadataPrefix: options.metadataPrefix } : {};\n\n // Check AGENTS.md global block\n const agentsMdResult = await checkAgentsMd(targetDir, markerOptions);\n if (agentsMdResult) {\n results.push(agentsMdResult);\n }\n\n // Check AGENTS.md rules section (for Codex target where rules are concatenated)\n const rulesSectionResult = await checkAgentsMdRulesSection(targetDir, markerOptions);\n if (rulesSectionResult) {\n results.push(rulesSectionResult);\n }\n\n // Check skill files\n const skillFiles = await checkSkillFiles(targetDir, targets, metadataOptions);\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 // Check rule files (for Claude target where rules are separate files)\n const ruleFiles = await checkRuleFiles(targetDir, targets, metadataOptions);\n for (const rule of ruleFiles) {\n if (rule.isManaged) {\n results.push({\n path: rule.path,\n type: \"rule\",\n rulePath: rule.rulePath,\n isManaged: rule.isManaged,\n hasChanges: rule.hasChanges,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Check AGENTS.md rules section for manual modifications.\n * This is used for Codex target where rules are concatenated into AGENTS.md.\n */\nexport async function checkAgentsMdRulesSection(\n targetDir: string,\n options: MarkerOptions = {},\n): 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 parsed = parseRulesSection(content, options);\n\n if (!parsed.hasMarkers || !parsed.content) {\n return null; // No rules section\n }\n\n const hasChanges = hasRulesSectionChanges(content, options);\n\n return {\n path: \"AGENTS.md\",\n type: \"rules-section\",\n isManaged: true,\n hasChanges,\n };\n } catch {\n // Expected: AGENTS.md may not exist or can't be read\n return null;\n }\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 options: CheckManagedFilesOptions = {},\n): Promise<ManagedFileCheckResult[]> {\n const allFiles = await checkAllManagedFiles(targetDir, targets, options);\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\n/**\n * Current canonical config schema version.\n * Follows semver: MAJOR.MINOR.PATCH\n *\n * Version bump guidelines:\n * - PATCH: Bug fixes in validation\n * - MINOR: Add optional fields (backwards compatible)\n * - MAJOR: Required field changes, field type changes, field removal\n */\nexport const CURRENT_CONFIG_VERSION = \"1.0.0\";\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 /** Path to the rules directory (e.g., \"rules\") - optional for backward compat */\n rules_dir: z.string().optional(),\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 /** Schema version in semver format (e.g., \"1.0.0\") */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, \"Version must be in semver format (e.g., 1.0.0)\"),\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 /** Path to rules directory within source - optional for backward compat */\n rulesDir: z.string().optional(),\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\n/**\n * Generate rules marker strings based on the configured prefix.\n */\nexport function getRulesMarkers(prefix: string) {\n return {\n rulesStart: `<!-- ${prefix}:rules:start -->`,\n rulesEnd: `<!-- ${prefix}:rules:end -->`,\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\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\n// =============================================================================\n// Rules section parsing (for Codex target)\n// =============================================================================\n\nexport interface ParsedRulesSection {\n /** The content between rules markers, or null if not found */\n content: string | null;\n /** Whether rules markers exist */\n hasMarkers: boolean;\n}\n\nexport interface RulesSectionMetadata {\n /** Content hash stored in the rules section */\n contentHash?: string;\n /** Number of rules stored in the section */\n ruleCount?: number;\n}\n\n/**\n * Parse the rules section from AGENTS.md content.\n * The rules section is between <!-- prefix:rules:start --> and <!-- prefix:rules:end --> markers.\n */\nexport function parseRulesSection(\n agentsMdContent: string,\n options: MarkerOptions = {},\n): ParsedRulesSection {\n const { prefix = DEFAULT_MARKER_PREFIX } = options;\n const rulesStartMarker = `<!-- ${prefix}:rules:start -->`;\n const rulesEndMarker = `<!-- ${prefix}:rules:end -->`;\n\n const startIdx = agentsMdContent.indexOf(rulesStartMarker);\n const endIdx = agentsMdContent.indexOf(rulesEndMarker);\n\n if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {\n return { content: null, hasMarkers: false };\n }\n\n const content = agentsMdContent.slice(startIdx + rulesStartMarker.length, endIdx).trim();\n\n return { content, hasMarkers: true };\n}\n\n/**\n * Parse metadata from the rules section.\n */\nexport function parseRulesSectionMetadata(rulesSection: string): RulesSectionMetadata {\n const result: RulesSectionMetadata = {};\n\n const hashMatch = rulesSection.match(/<!--\\s*Content hash:\\s*(.+?)\\s*-->/);\n if (hashMatch?.[1]) {\n result.contentHash = hashMatch[1];\n }\n\n const countMatch = rulesSection.match(/<!--\\s*Rule count:\\s*(\\d+)\\s*-->/);\n if (countMatch?.[1]) {\n result.ruleCount = Number.parseInt(countMatch[1], 10);\n }\n\n return result;\n}\n\n/**\n * Strip metadata comments from a rules section, keeping only the actual content.\n */\nexport function stripRulesSectionMetadata(rulesSection: string): string {\n const lines = rulesSection.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(\"<!-- Content hash:\")) return false;\n if (trimmed.startsWith(\"<!-- Rule count:\")) return false;\n return true;\n });\n return filteredLines.join(\"\\n\").trim();\n}\n\n/**\n * Compute content hash for the rules section.\n */\nexport function computeRulesSectionHash(content: string): string {\n const hash = createHash(\"sha256\").update(content.trim()).digest(\"hex\");\n return `sha256:${hash.slice(0, 12)}`;\n}\n\n/**\n * Check if the rules section of AGENTS.md has been manually modified.\n * Returns true if the content hash doesn't match.\n */\nexport function hasRulesSectionChanges(\n agentsMdContent: string,\n options: MarkerOptions = {},\n): boolean {\n const parsed = parseRulesSection(agentsMdContent, options);\n\n if (!parsed.content) {\n return false; // No rules section\n }\n\n const metadata = parseRulesSectionMetadata(parsed.content);\n\n if (!metadata.contentHash) {\n return false; // No hash stored\n }\n\n // Get content without metadata comments\n const content = stripRulesSectionMetadata(parsed.content);\n const currentHash = computeRulesSectionHash(content);\n\n return metadata.contentHash !== currentHash;\n}\n"],"mappings":"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","names":["createHash","getMarkers","createHash"]}
|
|
File without changes
|