agconf 0.3.0 → 0.3.2

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 CHANGED
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  layout: default
3
- title: agent-conf cli
3
+ title: agconf cli
4
4
  nav_order: 8
5
5
  ---
6
6
 
7
- # agent-conf
7
+ # agconf
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/agconf.svg)](https://www.npmjs.com/package/agconf)
10
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -15,7 +15,7 @@ CLI to sync AI agent configurations across repositories.
15
15
 
16
16
  Full documentation, setup guides, and FAQ available on GitHub:
17
17
 
18
- **https://github.com/julian-pani/agent-conf**
18
+ **https://github.com/julian-pani/agconf**
19
19
 
20
20
  ## Commands
21
21
 
@@ -39,7 +39,7 @@ Full documentation, setup guides, and FAQ available on GitHub:
39
39
  ```bash
40
40
  mkdir engineering-standards && cd engineering-standards
41
41
  git init
42
- agent-conf canonical init --name my-standards --org "My Org"
42
+ agconf canonical init --name my-standards --org "My Org"
43
43
  ```
44
44
 
45
45
  This scaffolds the structure for your standards. Edit `instructions/AGENTS.md` to add your engineering guidelines, then commit and push to GitHub.
@@ -48,7 +48,7 @@ This scaffolds the structure for your standards. Edit `instructions/AGENTS.md` t
48
48
 
49
49
  ```bash
50
50
  cd your-project
51
- agent-conf init --source your-org/engineering-standards
51
+ agconf init --source your-org/engineering-standards
52
52
  ```
53
53
 
54
54
  ## Rules
@@ -57,7 +57,7 @@ Rules are modular, topic-specific project instructions that live in `.claude/rul
57
57
 
58
58
  ### Configuration
59
59
 
60
- Add `rules_dir` to your canonical `agent-conf.yaml`:
60
+ Add `rules_dir` to your canonical `agconf.yaml`:
61
61
 
62
62
  ```yaml
63
63
  version: "1.0.0"
@@ -74,7 +74,7 @@ Rules support arbitrary subdirectory nesting:
74
74
 
75
75
  ```
76
76
  canonical-repo/
77
- ├── agent-conf.yaml
77
+ ├── agconf.yaml
78
78
  ├── instructions/
79
79
  │ └── AGENTS.md
80
80
  ├── skills/
@@ -105,7 +105,7 @@ downstream-repo/
105
105
  **Codex**: Rules are concatenated into AGENTS.md under a `# Project Rules` section. Heading levels are automatically adjusted (h1 becomes h2, etc.) to nest under the section header.
106
106
 
107
107
  ```markdown
108
- <!-- agent-conf:rules:start -->
108
+ <!-- agconf:rules:start -->
109
109
  # Project Rules
110
110
 
111
111
  <!-- Rule: code-style.md -->
@@ -115,7 +115,7 @@ downstream-repo/
115
115
  <!-- Rule: security/api-auth.md -->
116
116
  ## API Authentication
117
117
  ...
118
- <!-- agent-conf:rules:end -->
118
+ <!-- agconf:rules:end -->
119
119
  ```
120
120
 
121
121
  ### Path-Specific Rules
@@ -29,9 +29,9 @@ var MarkersConfigSchema = z.object({
29
29
  /**
30
30
  * Prefix for marker comments in managed files.
31
31
  * Generates markers like: <!-- {prefix}:global:start -->
32
- * Default: "agent-conf"
32
+ * Default: "agconf"
33
33
  */
34
- prefix: z.string().default("agent-conf")
34
+ prefix: z.string().default("agconf")
35
35
  });
36
36
  var MergeConfigSchema = z.object({
37
37
  /** Whether to preserve repository-specific content blocks during sync */
@@ -84,9 +84,9 @@ var ResolvedConfigSchema = z.object({
84
84
  /** Whether to preserve repo-specific content during merge */
85
85
  preserveRepoContent: z.boolean(),
86
86
  /** CLI name for hooks and workflows */
87
- cliName: z.string().default("agent-conf"),
88
- /** Directory name for lockfile and config (e.g., ".agent-conf") */
89
- configDir: z.string().default(".agent-conf"),
87
+ cliName: z.string().default("agconf"),
88
+ /** Directory name for lockfile and config (e.g., ".agconf") */
89
+ configDir: z.string().default(".agconf"),
90
90
  /** Lockfile name */
91
91
  lockfileName: z.string().default("lockfile.json")
92
92
  });
@@ -108,7 +108,7 @@ function getMetadataKeys(prefix) {
108
108
 
109
109
  // src/core/markers.ts
110
110
  import { createHash } from "crypto";
111
- var DEFAULT_MARKER_PREFIX = "agent-conf";
111
+ var DEFAULT_MARKER_PREFIX = "agconf";
112
112
  function getMarkers2(prefix = DEFAULT_MARKER_PREFIX) {
113
113
  return getMarkers(prefix);
114
114
  }
@@ -140,7 +140,7 @@ function computeGlobalBlockHash(content) {
140
140
  return `sha256:${hash.slice(0, 12)}`;
141
141
  }
142
142
  function buildGlobalBlock(content, metadata, options = {}) {
143
- const { prefix = DEFAULT_MARKER_PREFIX, cliName = "agent-conf" } = options;
143
+ const { prefix = DEFAULT_MARKER_PREFIX, cliName = "agconf" } = options;
144
144
  const markers = getMarkers2(prefix);
145
145
  const contentHash = metadata.contentHash ?? computeGlobalBlockHash(content);
146
146
  const lines = [
@@ -284,7 +284,7 @@ function hasRulesSectionChanges(agentsMdContent, options = {}) {
284
284
  }
285
285
 
286
286
  // src/core/skill-metadata.ts
287
- var DEFAULT_METADATA_PREFIX = "agent-conf";
287
+ var DEFAULT_METADATA_PREFIX = "agconf";
288
288
  function getMetadataKeyNames(prefix = DEFAULT_METADATA_PREFIX) {
289
289
  return getMetadataKeys(prefix);
290
290
  }
@@ -510,7 +510,7 @@ async function checkRuleFiles(targetDir, targets = ["claude"], options = {}) {
510
510
  const hasChanges = fileIsManaged && hasManualChanges(content, options);
511
511
  const { frontmatter } = parseFrontmatter(content);
512
512
  const metadata = frontmatter.metadata;
513
- const keyPrefix = (options.metadataPrefix || "agent-conf").replace(/-/g, "_");
513
+ const keyPrefix = (options.metadataPrefix || "agconf").replace(/-/g, "_");
514
514
  const rulePath = metadata?.[`${keyPrefix}_source_path`] || ruleFile;
515
515
  results.push({
516
516
  path: relativePath,
@@ -650,4 +650,4 @@ export {
650
650
  checkAgentsMdRulesSection,
651
651
  getModifiedManagedFiles
652
652
  };
653
- //# sourceMappingURL=chunk-B53WKCQU.js.map
653
+ //# sourceMappingURL=chunk-OHYGKXGJ.js.map
@@ -0,0 +1 @@
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 = \"agconf\";\n\n/**\n * Options for metadata operations.\n */\nexport interface MetadataOptions extends MarkerOptions {\n /** Prefix for metadata keys (default: \"agconf\") */\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 agconf.\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 agconf */\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 || \"agconf\").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 agconf */\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 agconf */\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: \"agconf\") */\n markerPrefix?: string;\n /** Metadata prefix for skill files (default: \"agconf\") */\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 (agconf.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: \"agconf\"\n */\n prefix: z.string().default(\"agconf\"),\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 (agconf.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 (.agconf.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 (.agconf.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(\"agconf\"),\n /** Directory name for lockfile and config (e.g., \".agconf\") */\n configDir: z.string().default(\".agconf\"),\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: \"agconf\",\n instructionsPath: \"instructions/AGENTS.md\",\n skillsDir: \"skills\",\n markerPrefix: \"agconf\",\n targets: [\"claude\"],\n preserveRepoContent: true,\n cliName: \"agconf\",\n configDir: \".agconf\",\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 = \"agconf\";\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: \"agconf\") */\n prefix?: string;\n /** CLI name for comments (default: \"agconf\") */\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 = \"agconf\" } = 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 agconf.\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"]}