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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/canonical.ts","../src/utils/fs.ts","../src/utils/git.ts","../src/utils/logger.ts","../src/commands/check.ts","../src/core/lockfile.ts","../src/schemas/lockfile.ts","../src/core/schema.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/commands/init.ts","../src/core/sync.ts","../src/core/merge.ts","../src/core/rules.ts","../src/core/targets.ts","../src/commands/shared.ts","../src/core/hooks.ts","../src/core/source.ts","../src/config/loader.ts","../src/core/version.ts","../src/core/workflows.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/upgrade-cli.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { canonicalInitCommand } from \"./commands/canonical.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { handleCompletion, installCompletion, uninstallCompletion } from \"./commands/completion.js\";\nimport { configGetCommand, configSetCommand, configShowCommand } from \"./commands/config.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { upgradeCliCommand } from \"./commands/upgrade-cli.js\";\nimport { checkCliVersionMismatch, getCliVersion } from \"./core/lockfile.js\";\nimport { getGitRoot } from \"./utils/git.js\";\n\n// Handle shell completion requests before anything else\n// This must happen synchronously at module load time\nif (handleCompletion()) {\n process.exit(0);\n}\n\n/**\n * Checks if the installed CLI is outdated compared to the version used in the last sync.\n * Shows a warning if the lockfile was created with a newer CLI version.\n */\nasync function warnIfCliOutdated(): Promise<void> {\n try {\n const cwd = process.cwd();\n const gitRoot = await getGitRoot(cwd);\n if (!gitRoot) return;\n\n const mismatch = await checkCliVersionMismatch(gitRoot);\n if (mismatch) {\n console.log();\n console.log(\n pc.yellow(\n `⚠ CLI is outdated: v${mismatch.currentVersion} installed, but repo was synced with v${mismatch.lockfileVersion}`,\n ),\n );\n console.log(pc.yellow(\" Run: agent-conf upgrade-cli\"));\n console.log();\n }\n } catch {\n // Silently ignore errors - this is a best-effort check\n }\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"agent-conf\")\n .description(\"Sync company engineering standards from agent-conf repository\")\n .version(getCliVersion())\n .hook(\"preAction\", async () => {\n await warnIfCliOutdated();\n });\n\n program\n .command(\"init\")\n .description(\"Initialize or sync agent-conf standards to the current repository\")\n .option(\n \"-s, --source <repo>\",\n \"Canonical repository in owner/repo format (e.g., acme/standards)\",\n )\n .option(\"--local [path]\", \"Use local canonical repository (auto-discover or specify path)\")\n .option(\"-y, --yes\", \"Non-interactive mode (merge by default)\")\n .option(\"--override\", \"Override existing AGENTS.md instead of merging\")\n .option(\"--ref <ref>\", \"GitHub ref/version to sync from (default: latest release)\")\n .option(\"-t, --target <targets...>\", \"Target platforms (claude, codex)\", [\"claude\"])\n .action(\n async (options: {\n source?: string;\n local?: string | boolean;\n yes?: boolean;\n override?: boolean;\n ref?: string;\n target?: string[];\n }) => {\n await initCommand(options);\n },\n );\n\n program\n .command(\"sync\")\n .description(\"Sync content from canonical repository (fetches latest by default)\")\n .option(\n \"-s, --source <repo>\",\n \"Canonical repository in owner/repo format (e.g., acme/standards)\",\n )\n .option(\"--local [path]\", \"Use local canonical repository (auto-discover or specify path)\")\n .option(\"-y, --yes\", \"Non-interactive mode (merge by default)\")\n .option(\"--override\", \"Override existing AGENTS.md instead of merging\")\n .option(\"--ref <ref>\", \"GitHub ref/version to sync from\")\n .option(\"--pinned\", \"Use lockfile version without fetching latest\")\n .option(\"-t, --target <targets...>\", \"Target platforms (claude, codex)\", [\"claude\"])\n .option(\"--summary-file <path>\", \"Write sync summary to file (markdown, for CI)\")\n .option(\"--expand-changes\", \"Show all items in output (default: first 5)\")\n .action(\n async (options: {\n source?: string;\n local?: string | boolean;\n yes?: boolean;\n override?: boolean;\n ref?: string;\n pinned?: boolean;\n target?: string[];\n summaryFile?: string;\n expandChanges?: boolean;\n }) => {\n await syncCommand(options);\n },\n );\n\n program\n .command(\"status\")\n .description(\"Show current sync status\")\n .option(\"-c, --check\", \"Check for manually modified skill files\")\n .action(async (options: { check?: boolean }) => {\n await statusCommand(options);\n });\n\n program\n .command(\"check\")\n .description(\"Check if managed files have been modified\")\n .option(\"-q, --quiet\", \"Minimal output, just exit code\")\n .action(async (options: { quiet?: boolean }) => {\n await checkCommand(options);\n });\n\n program\n .command(\"upgrade-cli\")\n .description(\"Upgrade the agent-conf CLI to the latest version\")\n .option(\"-y, --yes\", \"Non-interactive mode\")\n .action(async (options: { yes?: boolean }) => {\n await upgradeCliCommand(options);\n });\n\n // Config command with subcommands\n const configCmd = program.command(\"config\").description(\"Manage global CLI configuration\");\n\n configCmd\n .command(\"show\")\n .description(\"Show all configuration values\")\n .action(async () => {\n await configShowCommand();\n });\n\n configCmd\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .action(async (key: string) => {\n await configGetCommand(key);\n });\n\n configCmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action(async (key: string, value: string) => {\n await configSetCommand(key, value);\n });\n\n // Default for config command: show config\n configCmd.action(async () => {\n await configShowCommand();\n });\n\n // Completion command with subcommands\n const completionCmd = program\n .command(\"completion\")\n .description(\"Manage shell completions (bash, zsh, fish)\");\n\n completionCmd\n .command(\"install\")\n .description(\"Install shell completions for your current shell\")\n .action(async () => {\n await installCompletion();\n });\n\n completionCmd\n .command(\"uninstall\")\n .description(\"Remove shell completions\")\n .action(async () => {\n await uninstallCompletion();\n });\n\n // Default for completion command: install\n completionCmd.action(async () => {\n await installCompletion();\n });\n\n // Canonical command group\n const canonicalCmd = program.command(\"canonical\").description(\"Manage canonical repositories\");\n\n canonicalCmd\n .command(\"init\")\n .description(\"Scaffold a new canonical repository structure\")\n .option(\"-n, --name <name>\", \"Name for the canonical repository\")\n .option(\"-o, --org <organization>\", \"Organization name\")\n .option(\"-d, --dir <directory>\", \"Target directory (default: current)\")\n .option(\"--marker-prefix <prefix>\", \"Marker prefix (default: agent-conf)\")\n .option(\"--no-examples\", \"Skip example skill creation\")\n .option(\"--rules-dir <directory>\", \"Rules directory (e.g., 'rules')\")\n .option(\"-y, --yes\", \"Non-interactive mode\")\n .action(\n async (options: {\n name?: string;\n org?: string;\n dir?: string;\n markerPrefix?: string;\n examples?: boolean;\n rulesDir?: string;\n yes?: boolean;\n }) => {\n await canonicalInitCommand({\n name: options.name,\n org: options.org,\n dir: options.dir,\n markerPrefix: options.markerPrefix,\n includeExamples: options.examples,\n rulesDir: options.rulesDir,\n yes: options.yes,\n });\n },\n );\n\n // Default for canonical command: show help\n canonicalCmd.action(() => {\n canonicalCmd.help();\n });\n\n // Default command: show help\n program.action(() => {\n program.help();\n });\n\n return program;\n}\n","// biome-ignore-all lint/suspicious/noUselessEscapeInString: escaping $ is required in template literals that generate shell scripts\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { CURRENT_CONFIG_VERSION } from \"../config/schema.js\";\nimport { directoryExists, ensureDir, fileExists } from \"../utils/fs.js\";\nimport { getGitOrganization, getGitProjectName, isGitRoot } from \"../utils/git.js\";\nimport { createLogger, formatPath } from \"../utils/logger.js\";\n\nexport interface CanonicalInitOptions {\n /** Canonical repo name */\n name?: string | undefined;\n /** Organization name */\n org?: string | undefined;\n /** Target directory (default: cwd) */\n dir?: string | undefined;\n /** Marker prefix (default: \"agent-conf\") */\n markerPrefix?: string | undefined;\n /** Include example skill (default: true) */\n includeExamples?: boolean | undefined;\n /** Rules directory (omit or empty to skip rules) */\n rulesDir?: string | undefined;\n /** Non-interactive mode */\n yes?: boolean | undefined;\n}\n\ninterface ResolvedOptions {\n name: string;\n organization?: string | undefined;\n targetDir: string;\n markerPrefix: string;\n includeExamples: boolean;\n rulesDir?: string | undefined;\n}\n\n/**\n * Generates the agent-conf.yaml configuration file content.\n */\nfunction generateConfigYaml(options: ResolvedOptions): string {\n const content: Record<string, unknown> = {\n instructions: \"instructions/AGENTS.md\",\n skills_dir: \"skills\",\n };\n\n // Add rules_dir if specified\n if (options.rulesDir) {\n content.rules_dir = options.rulesDir;\n }\n\n const config: Record<string, unknown> = {\n version: CURRENT_CONFIG_VERSION,\n meta: {\n name: options.name,\n },\n content,\n targets: [\"claude\"],\n markers: {\n prefix: options.markerPrefix,\n },\n merge: {\n preserve_repo_content: true,\n },\n };\n\n if (options.organization) {\n (config.meta as Record<string, unknown>).organization = options.organization;\n }\n\n let yaml = stringifyYaml(config, { lineWidth: 0 });\n\n // If no rules_dir specified, add commented-out example after skills_dir\n if (!options.rulesDir) {\n yaml = yaml.replace(/skills_dir: skills\\n/, \"skills_dir: skills\\n # rules_dir: rules\\n\");\n }\n\n return yaml;\n}\n\n/**\n * Generates a template AGENTS.md file.\n */\nfunction generateAgentsMd(options: ResolvedOptions): string {\n const orgName = options.organization ?? \"Your Organization\";\n return `# ${orgName} Engineering Standards for AI Agents\n\nThis document defines company-wide engineering standards that all AI coding agents must follow.\n\n## Purpose\n\nThese standards ensure consistency, maintainability, and operational excellence across all engineering projects.\n\n---\n\n## Development Principles\n\n### Code Quality\n\n- Write clean, readable code with meaningful names\n- Follow existing patterns in the codebase\n- Keep functions small and focused\n- Add comments only when the \"why\" isn't obvious\n\n### Testing\n\n- Write tests for new functionality\n- Ensure tests are deterministic and fast\n- Use descriptive test names\n\n---\n\n## Getting Started\n\nAdd your organization's specific engineering standards below.\n\n---\n\n**Version**: 1.0\n**Last Updated**: ${new Date().toISOString().split(\"T\")[0]}\n`;\n}\n\n/**\n * Generates an example skill SKILL.md file.\n */\nfunction generateExampleSkillMd(): string {\n return `---\nname: example-skill\ndescription: An example skill demonstrating the skill format\n---\n\n# Example Skill\n\nThis is an example skill that demonstrates the skill format.\n\n## When to Use\n\nUse this skill when you need an example of how skills are structured.\n\n## Instructions\n\n1. Skills are defined in their own directories under \\`skills/\\`\n2. Each skill has a \\`SKILL.md\\` file with frontmatter\n3. The frontmatter must include \\`name\\` and \\`description\\`\n4. Optional: Include a \\`references/\\` directory for additional files\n\n## Example\n\n\\`\\`\\`\nskills/\n example-skill/\n SKILL.md\n references/\n .gitkeep\n\\`\\`\\`\n`;\n}\n\n/**\n * Generates the sync workflow file content.\n */\nfunction generateSyncWorkflow(repoFullName: string, prefix: string): string {\n return `# ${prefix} Auto-Sync Workflow (Reusable)\n# This workflow is called by downstream repositories.\n#\n# Downstream repos will reference this workflow like:\n# uses: ${repoFullName}/.github/workflows/sync-reusable.yml@v1.0.0\n#\n# TOKEN: Requires a token with read access to the canonical repository.\n# The default GITHUB_TOKEN is used for operations on the downstream repo.\n\nname: Sync Reusable\n\non:\n workflow_call:\n inputs:\n force:\n description: 'Force sync even if no updates detected'\n required: false\n default: false\n type: boolean\n commit_strategy:\n description: 'How to commit changes: \"pr\" (create pull request) or \"direct\" (commit to current branch)'\n required: false\n default: 'pr'\n type: string\n pr_branch_prefix:\n description: 'Branch prefix for PR branches'\n required: false\n default: '${prefix}/sync'\n type: string\n pr_title:\n description: 'Pull request title'\n required: false\n default: 'chore(${prefix}): sync agent configuration'\n type: string\n reviewers:\n description: 'PR reviewers (comma-separated GitHub usernames)'\n required: false\n type: string\n commit_message:\n description: 'Commit message for direct commits'\n required: false\n default: 'chore(${prefix}): sync agent configuration'\n type: string\n secrets:\n token:\n description: 'GitHub token with read access to the canonical repository'\n required: true\n outputs:\n changes_detected:\n description: 'Whether changes were detected after sync'\n value: \\${{ jobs.sync.outputs.changes_detected }}\n pr_number:\n description: 'Pull request number (if PR strategy and changes detected)'\n value: \\${{ jobs.sync.outputs.pr_number }}\n pr_url:\n description: 'Pull request URL (if PR strategy and changes detected)'\n value: \\${{ jobs.sync.outputs.pr_url }}\n\njobs:\n sync:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n pull-requests: write\n outputs:\n changes_detected: \\${{ steps.check-changes.outputs.changes_detected }}\n pr_number: \\${{ steps.create-pr.outputs.pr_number }}\n pr_url: \\${{ steps.create-pr.outputs.pr_url }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install agent-conf CLI\n run: npm install -g agconf\n\n - name: Run sync\n run: agent-conf sync --yes --summary-file /tmp/sync-summary.md --expand-changes\n env:\n GITHUB_TOKEN: \\${{ secrets.token }}\n\n - name: Check for changes\n id: check-changes\n run: |\n # Check for meaningful changes (excluding lockfile which always updates with synced_at)\n LOCKFILE_PATH=\".agent-conf/lockfile.json\"\n\n # Get changed files excluding lockfile\n MEANINGFUL_CHANGES=\\$(git status --porcelain | grep -v \"^.. \\$LOCKFILE_PATH\\$\" || true)\n\n if [ -n \"\\$MEANINGFUL_CHANGES\" ]; then\n echo \"changes_detected=true\" >> \\$GITHUB_OUTPUT\n echo \"Meaningful changes detected after sync:\"\n git status --short\n else\n echo \"changes_detected=false\" >> \\$GITHUB_OUTPUT\n echo \"No meaningful changes detected (only lockfile updated)\"\n fi\n\n - name: Configure git\n if: steps.check-changes.outputs.changes_detected == 'true'\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n - name: Check for existing PR\n id: check-pr\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'\n env:\n GH_TOKEN: \\${{ github.token }}\n run: |\n BRANCH_NAME=\"\\${{ inputs.pr_branch_prefix }}\"\n\n # Check if there's an existing open PR from this branch\n EXISTING_PR=\\$(gh pr list --head \"\\$BRANCH_NAME\" --state open --json number,url --jq '.[0]' 2>/dev/null || echo \"\")\n\n if [ -n \"\\$EXISTING_PR\" ] && [ \"\\$EXISTING_PR\" != \"null\" ]; then\n PR_NUMBER=\\$(echo \"\\$EXISTING_PR\" | jq -r '.number')\n PR_URL=\\$(echo \"\\$EXISTING_PR\" | jq -r '.url')\n echo \"existing_pr=true\" >> \\$GITHUB_OUTPUT\n echo \"pr_number=\\$PR_NUMBER\" >> \\$GITHUB_OUTPUT\n echo \"pr_url=\\$PR_URL\" >> \\$GITHUB_OUTPUT\n echo \"Found existing PR #\\$PR_NUMBER: \\$PR_URL\"\n else\n echo \"existing_pr=false\" >> \\$GITHUB_OUTPUT\n echo \"No existing PR found for branch \\$BRANCH_NAME\"\n fi\n\n echo \"BRANCH_NAME=\\$BRANCH_NAME\" >> \\$GITHUB_ENV\n\n - name: Create or update PR branch\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'\n run: |\n BRANCH_NAME=\"\\${{ inputs.pr_branch_prefix }}\"\n\n # Check if remote branch exists\n if git ls-remote --exit-code --heads origin \"\\$BRANCH_NAME\" >/dev/null 2>&1; then\n # Branch exists - fetch and reset to it, then apply our changes\n git fetch origin \"\\$BRANCH_NAME\"\n git checkout -B \"\\$BRANCH_NAME\" origin/\"\\$BRANCH_NAME\"\n # Reset to match the base branch, then apply changes\n git reset --soft \\${{ github.ref_name }}\n else\n # Create new branch\n git checkout -b \"\\$BRANCH_NAME\"\n fi\n\n git add -A\n git commit -m \"\\${{ inputs.pr_title }}\" || echo \"No changes to commit\"\n git push --force-with-lease -u origin \"\\$BRANCH_NAME\"\n\n - name: Create or update pull request\n id: create-pr\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'\n env:\n GH_TOKEN: \\${{ github.token }}\n run: |\n # Read sync summary if available\n if [ -f /tmp/sync-summary.md ]; then\n SYNC_SUMMARY=\\$(cat /tmp/sync-summary.md)\n else\n SYNC_SUMMARY=\"## Changes\n - Synced agent configuration from canonical repository\"\n fi\n\n PR_BODY=\"This PR was automatically created by the ${prefix} sync workflow.\n\n \\$SYNC_SUMMARY\n\n ---\n *This is an automated PR. Review the changes and merge when ready.*\"\n\n if [ \"\\${{ steps.check-pr.outputs.existing_pr }}\" == \"true\" ]; then\n # Update existing PR body\n PR_NUMBER=\"\\${{ steps.check-pr.outputs.pr_number }}\"\n PR_URL=\"\\${{ steps.check-pr.outputs.pr_url }}\"\n\n gh pr edit \"\\$PR_NUMBER\" --body \"\\$PR_BODY\"\n echo \"pr_url=\\$PR_URL\" >> \\$GITHUB_OUTPUT\n echo \"pr_number=\\$PR_NUMBER\" >> \\$GITHUB_OUTPUT\n echo \"Updated existing PR #\\$PR_NUMBER: \\$PR_URL\"\n else\n # Create new PR\n REVIEWERS_ARG=\"\"\n if [ -n \"\\${{ inputs.reviewers }}\" ]; then\n REVIEWERS_ARG=\"--reviewer \\${{ inputs.reviewers }}\"\n fi\n\n PR_URL=\\$(gh pr create \\\\\n --title \"\\${{ inputs.pr_title }}\" \\\\\n --body \"\\$PR_BODY\" \\\\\n \\$REVIEWERS_ARG)\n\n PR_NUMBER=\\$(gh pr view --json number -q .number)\n echo \"pr_url=\\$PR_URL\" >> \\$GITHUB_OUTPUT\n echo \"pr_number=\\$PR_NUMBER\" >> \\$GITHUB_OUTPUT\n echo \"Created PR #\\$PR_NUMBER: \\$PR_URL\"\n fi\n\n - name: Commit directly to branch\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'direct'\n run: |\n git add -A\n git commit -m \"\\${{ inputs.commit_message }}\"\n git push\n echo \"Changes committed directly to \\$(git branch --show-current)\"\n`;\n}\n\n/**\n * Generates the check workflow file content.\n */\nfunction generateCheckWorkflow(repoFullName: string, prefix: string): string {\n return `# ${prefix} File Integrity Check (Reusable)\n# This workflow is called by downstream repositories.\n#\n# Downstream repos will reference this workflow like:\n# uses: ${repoFullName}/.github/workflows/check-reusable.yml@v1.0.0\n\nname: Check Reusable\n\non:\n workflow_call:\n\njobs:\n check:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install agent-conf CLI\n run: npm install -g agconf\n\n - name: Check file integrity\n run: agent-conf check\n`;\n}\n\nexport async function canonicalInitCommand(options: CanonicalInitOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agent-conf canonical init\"));\n\n // Determine target directory\n const targetDir = options.dir ? path.resolve(options.dir) : process.cwd();\n const dirName = path.basename(targetDir);\n const cwd = process.cwd();\n\n // Compute smart defaults for name and organization\n // Check both target dir and cwd for git info\n // If target dir exists and is at git root, use that\n // Otherwise, if cwd is at git root and target is cwd or a new subdir, use cwd's git info\n let isAtGitRoot = await isGitRoot(targetDir);\n let gitProjectName = await getGitProjectName(targetDir);\n let gitOrganization = await getGitOrganization(targetDir);\n\n // If target dir doesn't have git info, try cwd (useful when creating new dir inside git repo)\n if (!gitProjectName) {\n const cwdIsGitRoot = await isGitRoot(cwd);\n const cwdGitProjectName = await getGitProjectName(cwd);\n const cwdGitOrganization = await getGitOrganization(cwd);\n\n // If cwd is a git root and target is cwd, use cwd's info\n if (cwdIsGitRoot && path.resolve(targetDir) === path.resolve(cwd)) {\n isAtGitRoot = true;\n gitProjectName = cwdGitProjectName;\n gitOrganization = cwdGitOrganization;\n } else if (cwdGitOrganization && !gitOrganization) {\n // At least use the organization from cwd if available\n gitOrganization = cwdGitOrganization;\n }\n }\n\n // Determine the default name suggestion\n let defaultName: string;\n let nameHint: string;\n if (isAtGitRoot && gitProjectName) {\n defaultName = gitProjectName;\n nameHint = \" (from current git project)\";\n } else {\n defaultName = dirName;\n nameHint = \"\";\n }\n\n // Check if directory exists and has content\n const dirExists = await directoryExists(targetDir);\n if (dirExists) {\n const configExists = await fileExists(path.join(targetDir, \"agent-conf.yaml\"));\n if (configExists && !options.yes) {\n const shouldContinue = await prompts.confirm({\n message: \"This directory already has an agent-conf.yaml. Overwrite?\",\n initialValue: false,\n });\n\n if (prompts.isCancel(shouldContinue) || !shouldContinue) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n }\n\n // Gather options (interactive or from CLI)\n let resolvedOptions: ResolvedOptions;\n\n if (options.yes) {\n // Non-interactive mode: use defaults or provided values\n resolvedOptions = {\n name: options.name ?? defaultName,\n organization: options.org ?? gitOrganization,\n targetDir,\n markerPrefix: options.markerPrefix ?? \"agent-conf\",\n includeExamples: options.includeExamples !== false,\n rulesDir: options.rulesDir || undefined,\n };\n } else {\n // Interactive mode: prompt for values\n const name = await prompts.text({\n message: `Canonical repository name${nameHint}:`,\n placeholder: defaultName,\n defaultValue: options.name ?? defaultName,\n validate: (value) => {\n if (!value.trim()) return \"Name is required\";\n if (!/^[a-z0-9-]+$/.test(value)) return \"Name must be lowercase alphanumeric with hyphens\";\n return undefined;\n },\n });\n\n if (prompts.isCancel(name)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n // Determine organization suggestion\n const orgDefault = options.org ?? gitOrganization;\n const orgHint = gitOrganization && !options.org ? \" (from git)\" : \"\";\n\n const organization = await prompts.text({\n message: `Organization name${orgHint} (optional):`,\n placeholder: orgDefault ?? \"ACME Corp\",\n ...(orgDefault ? { defaultValue: orgDefault } : {}),\n });\n\n if (prompts.isCancel(organization)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n const markerPrefix = await prompts.text({\n message: \"Marker prefix for managed content:\",\n placeholder: \"agent-conf\",\n defaultValue: options.markerPrefix ?? \"agent-conf\",\n validate: (value) => {\n if (!value.trim()) return \"Prefix is required\";\n if (!/^[a-z0-9-]+$/.test(value))\n return \"Prefix must be lowercase alphanumeric with hyphens\";\n return undefined;\n },\n });\n\n if (prompts.isCancel(markerPrefix)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n const includeExamples = await prompts.confirm({\n message: \"Include example skill?\",\n initialValue: options.includeExamples !== false,\n });\n\n if (prompts.isCancel(includeExamples)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n // Ask about rules\n const includeRules = await prompts.confirm({\n message: \"Include rules directory?\",\n initialValue: false,\n });\n\n if (prompts.isCancel(includeRules)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n let rulesDir: string | undefined;\n if (includeRules) {\n const rulesDirInput = await prompts.text({\n message: \"Rules directory name:\",\n placeholder: \"rules\",\n defaultValue: \"rules\",\n validate: (value) => {\n if (!value.trim()) return \"Directory name is required\";\n if (!/^[a-z0-9-_/]+$/.test(value))\n return \"Directory name must be lowercase alphanumeric with hyphens, underscores, or slashes\";\n return undefined;\n },\n });\n\n if (prompts.isCancel(rulesDirInput)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n rulesDir = rulesDirInput as string;\n }\n\n resolvedOptions = {\n name: name as string,\n organization: (organization as string) || undefined,\n targetDir,\n markerPrefix: markerPrefix as string,\n includeExamples: includeExamples as boolean,\n rulesDir,\n };\n }\n\n // Create directory structure\n const spinner = logger.spinner(\"Creating canonical repository structure...\");\n spinner.start();\n\n try {\n // Ensure target directory exists\n await ensureDir(resolvedOptions.targetDir);\n\n // Create directories\n const instructionsDir = path.join(resolvedOptions.targetDir, \"instructions\");\n const skillsDir = path.join(resolvedOptions.targetDir, \"skills\");\n const workflowsDir = path.join(resolvedOptions.targetDir, \".github\", \"workflows\");\n\n await ensureDir(instructionsDir);\n await ensureDir(skillsDir);\n await ensureDir(workflowsDir);\n\n // Create rules directory if specified\n if (resolvedOptions.rulesDir) {\n const rulesDir = path.join(resolvedOptions.targetDir, resolvedOptions.rulesDir);\n await ensureDir(rulesDir);\n // Add a .gitkeep to the rules directory\n await fs.writeFile(path.join(rulesDir, \".gitkeep\"), \"\", \"utf-8\");\n }\n\n // Write agent-conf.yaml\n const configPath = path.join(resolvedOptions.targetDir, \"agent-conf.yaml\");\n await fs.writeFile(configPath, generateConfigYaml(resolvedOptions), \"utf-8\");\n\n // Write AGENTS.md\n const agentsMdPath = path.join(instructionsDir, \"AGENTS.md\");\n await fs.writeFile(agentsMdPath, generateAgentsMd(resolvedOptions), \"utf-8\");\n\n // Write example skill if requested\n if (resolvedOptions.includeExamples) {\n const exampleSkillDir = path.join(skillsDir, \"example-skill\");\n const referencesDir = path.join(exampleSkillDir, \"references\");\n await ensureDir(referencesDir);\n\n const skillMdPath = path.join(exampleSkillDir, \"SKILL.md\");\n await fs.writeFile(skillMdPath, generateExampleSkillMd(), \"utf-8\");\n\n const gitkeepPath = path.join(referencesDir, \".gitkeep\");\n await fs.writeFile(gitkeepPath, \"\", \"utf-8\");\n }\n\n // Write workflow files\n const syncWorkflowPath = path.join(workflowsDir, \"sync-reusable.yml\");\n const checkWorkflowPath = path.join(workflowsDir, \"check-reusable.yml\");\n\n // Build repo full name for workflow references (org/name or just name if no org)\n const repoFullName = resolvedOptions.organization\n ? `${resolvedOptions.organization}/${resolvedOptions.name}`\n : resolvedOptions.name;\n\n await fs.writeFile(\n syncWorkflowPath,\n generateSyncWorkflow(repoFullName, resolvedOptions.markerPrefix),\n \"utf-8\",\n );\n await fs.writeFile(\n checkWorkflowPath,\n generateCheckWorkflow(repoFullName, resolvedOptions.markerPrefix),\n \"utf-8\",\n );\n\n spinner.succeed(\"Canonical repository structure created\");\n\n // Summary\n console.log();\n console.log(pc.bold(\"Created:\"));\n console.log(` ${pc.green(\"+\")} ${formatPath(configPath)}`);\n console.log(` ${pc.green(\"+\")} ${formatPath(agentsMdPath)}`);\n if (resolvedOptions.includeExamples) {\n console.log(\n ` ${pc.green(\"+\")} ${formatPath(path.join(skillsDir, \"example-skill/SKILL.md\"))}`,\n );\n }\n if (resolvedOptions.rulesDir) {\n console.log(\n ` ${pc.green(\"+\")} ${formatPath(path.join(resolvedOptions.targetDir, resolvedOptions.rulesDir))}/`,\n );\n }\n console.log(` ${pc.green(\"+\")} ${formatPath(syncWorkflowPath)}`);\n console.log(` ${pc.green(\"+\")} ${formatPath(checkWorkflowPath)}`);\n\n console.log();\n console.log(pc.dim(`Name: ${resolvedOptions.name}`));\n if (resolvedOptions.organization) {\n console.log(pc.dim(`Organization: ${resolvedOptions.organization}`));\n }\n console.log(pc.dim(`Marker prefix: ${resolvedOptions.markerPrefix}`));\n\n console.log();\n console.log(pc.bold(\"Next steps:\"));\n console.log(` 1. Edit ${pc.cyan(\"instructions/AGENTS.md\")} with your engineering standards`);\n console.log(` 2. Add skills to ${pc.cyan(\"skills/\")} directory`);\n if (resolvedOptions.rulesDir) {\n console.log(` 3. Add rules to ${pc.cyan(`${resolvedOptions.rulesDir}/`)} directory`);\n console.log(` 4. Commit and push to create your canonical repository`);\n } else {\n console.log(` 3. Commit and push to create your canonical repository`);\n }\n console.log();\n console.log(\n pc.dim(\n `See https://github.com/julian-pani/agent-conf/blob/master/cli/docs/CANONICAL_REPOSITORY_SETUP.md for detailed setup instructions.`,\n ),\n );\n\n prompts.outro(pc.green(\"Done!\"));\n } catch (error) {\n spinner.fail(\"Failed to create canonical repository\");\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function directoryExists(dirPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dirPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function createTempDir(prefix: string = \"agent-conf-\"): Promise<string> {\n const tmpDir = os.tmpdir();\n return fs.mkdtemp(path.join(tmpDir, prefix));\n}\n\nexport async function removeTempDir(dirPath: string): Promise<void> {\n try {\n await fs.rm(dirPath, { recursive: true, force: true });\n } catch {\n // Ignore errors during cleanup\n }\n}\n\nexport function resolvePath(inputPath: string): string {\n if (inputPath.startsWith(\"~\")) {\n return path.join(os.homedir(), inputPath.slice(1));\n }\n return path.resolve(inputPath);\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { type SimpleGit, simpleGit } from \"simple-git\";\n\n/**\n * Check if a directory exists.\n */\nasync function directoryExistsForGit(dir: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dir);\n return stat.isDirectory();\n } catch {\n // Expected: directory doesn't exist\n return false;\n }\n}\n\nexport async function isGitRepo(dir: string): Promise<boolean> {\n const git: SimpleGit = simpleGit(dir);\n try {\n return await git.checkIsRepo();\n } catch {\n // Expected: not a git repo or git not available\n return false;\n }\n}\n\nexport async function getGitRoot(dir: string): Promise<string | null> {\n if (!(await directoryExistsForGit(dir))) {\n return null;\n }\n try {\n const git: SimpleGit = simpleGit(dir);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return null;\n }\n // Get the root directory of the git repository\n const root = await git.revparse([\"--show-toplevel\"]);\n return root.trim();\n } catch {\n // Expected: not a git repo or git operation failed\n return null;\n }\n}\n\n/**\n * Get the git project name (basename of the git root directory).\n * Returns null if not in a git repository or directory doesn't exist.\n */\nexport async function getGitProjectName(dir: string): Promise<string | null> {\n const gitRoot = await getGitRoot(dir);\n if (!gitRoot) {\n return null;\n }\n return path.basename(gitRoot);\n}\n\n/**\n * Check if the given directory is the root of a git repository.\n * Returns false if directory doesn't exist.\n */\nexport async function isGitRoot(dir: string): Promise<boolean> {\n if (!(await directoryExistsForGit(dir))) {\n return false;\n }\n const gitRoot = await getGitRoot(dir);\n if (!gitRoot) {\n return false;\n }\n // Resolve real paths to handle symlinks (e.g., macOS /var -> /private/var)\n try {\n const realDir = await fs.realpath(dir);\n const realGitRoot = await fs.realpath(gitRoot);\n return realDir === realGitRoot;\n } catch {\n // Fallback to simple comparison if realpath fails (e.g., symlink issues)\n return path.resolve(dir) === path.resolve(gitRoot);\n }\n}\n\n/**\n * Get organization name from git config or remote URL.\n * Returns undefined if directory doesn't exist or not in a git repo.\n * Tries to extract org from remote origin URL first, then falls back to user.name.\n */\nexport async function getGitOrganization(dir: string): Promise<string | undefined> {\n if (!(await directoryExistsForGit(dir))) {\n return undefined;\n }\n try {\n const git: SimpleGit = simpleGit(dir);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return undefined;\n }\n\n // Try to extract organization from remote origin URL\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === \"origin\");\n if (origin?.refs.fetch) {\n const url = origin.refs.fetch;\n // Match patterns like:\n // https://github.com/org/repo.git\n // git@github.com:org/repo.git\n const httpsMatch = url.match(/github\\.com\\/([^/]+)\\//);\n const sshMatch = url.match(/github\\.com:([^/]+)\\//);\n const org = httpsMatch?.[1] ?? sshMatch?.[1];\n if (org) {\n return org;\n }\n }\n\n // Fallback to user.name from git config\n const userName = await git.getConfig(\"user.name\");\n return userName.value ?? undefined;\n } catch {\n // Expected: not a git repo or git operation failed\n return undefined;\n }\n}\n","import ora, { type Ora } from \"ora\";\nimport pc from \"picocolors\";\n\nexport interface Logger {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n dim(message: string): void;\n spinner(text: string): Ora;\n}\n\nexport function createLogger(quiet = false): Logger {\n return {\n info(message: string) {\n if (!quiet) {\n console.log(`${pc.blue(\"info\")} ${message}`);\n }\n },\n\n success(message: string) {\n if (!quiet) {\n console.log(`${pc.green(\"success\")} ${message}`);\n }\n },\n\n warn(message: string) {\n console.log(`${pc.yellow(\"warn\")} ${message}`);\n },\n\n error(message: string) {\n console.error(`${pc.red(\"error\")} ${message}`);\n },\n\n dim(message: string) {\n if (!quiet) {\n console.log(pc.dim(message));\n }\n },\n\n spinner(text: string): Ora {\n if (quiet) {\n return ora({ text, isSilent: true });\n }\n return ora({ text, color: \"blue\" });\n },\n };\n}\n\nexport function formatPath(p: string, cwd: string = process.cwd()): string {\n if (p.startsWith(cwd)) {\n return `.${p.slice(cwd.length)}`;\n }\n return p;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport pc from \"picocolors\";\nimport { readLockfile } from \"../core/lockfile.js\";\nimport {\n computeGlobalBlockHash,\n computeRulesSectionHash,\n parseAgentsMd,\n parseGlobalBlockMetadata,\n parseRulesSection,\n parseRulesSectionMetadata,\n stripMetadataComments,\n stripRulesSectionMetadata,\n} from \"../core/markers.js\";\nimport {\n checkAllManagedFiles,\n computeContentHash,\n parseFrontmatter,\n} from \"../core/skill-metadata.js\";\n\nexport interface CheckOptions {\n quiet?: boolean;\n}\n\nexport interface CheckResult {\n synced: boolean;\n modifiedFiles: ModifiedFileInfo[];\n}\n\nexport interface ModifiedFileInfo {\n path: string;\n type: \"skill\" | \"agents\" | \"rule\" | \"rules-section\";\n expectedHash: string;\n currentHash: string;\n /** Rule source path if type is rule */\n rulePath?: string;\n}\n\n/**\n * Check if managed files have been modified.\n * Exits with code 0 if all files are unchanged, code 1 if changes detected.\n */\nexport async function checkCommand(options: CheckOptions = {}): Promise<void> {\n const targetDir = process.cwd();\n\n // Check if synced (lockfile exists)\n const result = await readLockfile(targetDir);\n\n if (!result) {\n if (!options.quiet) {\n console.log();\n console.log(pc.yellow(\"Not synced\"));\n console.log();\n console.log(pc.dim(\"This repository has not been synced with agent-conf.\"));\n console.log(pc.dim(\"Run `agent-conf init` to sync engineering standards.\"));\n console.log();\n }\n // Exit 0 - not synced is not an error for the check command\n return;\n }\n\n // Check schema compatibility\n const { lockfile, schemaCompatibility } = result;\n if (!schemaCompatibility.compatible) {\n if (!options.quiet) {\n console.log();\n console.log(pc.red(`Schema error: ${schemaCompatibility.error}`));\n console.log();\n }\n process.exit(1);\n }\n if (schemaCompatibility.warning && !options.quiet) {\n console.log();\n console.log(pc.yellow(`Warning: ${schemaCompatibility.warning}`));\n console.log();\n }\n\n const targets = lockfile.content.targets ?? [\"claude\"];\n const markerPrefix = lockfile.content.marker_prefix;\n const modifiedFiles: ModifiedFileInfo[] = [];\n\n // Build options for checking managed files\n const checkOptions = markerPrefix ? { markerPrefix, metadataPrefix: markerPrefix } : {};\n\n // Check all managed files\n const allFiles = await checkAllManagedFiles(targetDir, targets, checkOptions);\n\n // Gather detailed info for modified files\n // Compute the metadata key prefix (convert dashes to underscores)\n const keyPrefix = markerPrefix ? `${markerPrefix.replace(/-/g, \"_\")}_` : \"agent_conf_\";\n\n for (const file of allFiles) {\n if (!file.hasChanges) continue;\n\n if (file.type === \"agents\") {\n // Get hash info for AGENTS.md\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const content = await fs.readFile(agentsMdPath, \"utf-8\");\n const parsed = parseAgentsMd(content, markerPrefix ? { prefix: markerPrefix } : undefined);\n\n if (parsed.globalBlock) {\n const metadata = parseGlobalBlockMetadata(parsed.globalBlock);\n const contentWithoutMeta = stripMetadataComments(parsed.globalBlock);\n const currentHash = computeGlobalBlockHash(contentWithoutMeta);\n\n modifiedFiles.push({\n path: \"AGENTS.md\",\n type: \"agents\",\n expectedHash: metadata.contentHash ?? \"unknown\",\n currentHash,\n });\n }\n } else if (file.type === \"skill\") {\n // Get hash info for skill file\n const skillPath = path.join(targetDir, file.path);\n const content = await fs.readFile(skillPath, \"utf-8\");\n const { frontmatter } = parseFrontmatter(content);\n\n const metadata = frontmatter.metadata as Record<string, string> | undefined;\n const storedHash = metadata?.[`${keyPrefix}content_hash`] ?? \"unknown\";\n const currentHash = computeContentHash(\n content,\n markerPrefix ? { metadataPrefix: markerPrefix } : undefined,\n );\n\n modifiedFiles.push({\n path: file.path,\n type: \"skill\",\n expectedHash: storedHash,\n currentHash,\n });\n } else if (file.type === \"rule\") {\n // Get hash info for rule file\n const rulePath = path.join(targetDir, file.path);\n const content = await fs.readFile(rulePath, \"utf-8\");\n const { frontmatter } = parseFrontmatter(content);\n\n const metadata = frontmatter.metadata as Record<string, string> | undefined;\n const storedHash = metadata?.[`${keyPrefix}content_hash`] ?? \"unknown\";\n const currentHash = computeContentHash(\n content,\n markerPrefix ? { metadataPrefix: markerPrefix } : undefined,\n );\n\n const ruleInfo: ModifiedFileInfo = {\n path: file.path,\n type: \"rule\",\n expectedHash: storedHash,\n currentHash,\n };\n if (file.rulePath) {\n ruleInfo.rulePath = file.rulePath;\n }\n modifiedFiles.push(ruleInfo);\n } else if (file.type === \"rules-section\") {\n // Get hash info for rules section in AGENTS.md (Codex target)\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const content = await fs.readFile(agentsMdPath, \"utf-8\");\n const parsed = parseRulesSection(\n content,\n markerPrefix ? { prefix: markerPrefix } : undefined,\n );\n\n if (parsed.content) {\n const metadata = parseRulesSectionMetadata(parsed.content);\n const contentWithoutMeta = stripRulesSectionMetadata(parsed.content);\n const currentHash = computeRulesSectionHash(contentWithoutMeta);\n\n modifiedFiles.push({\n path: \"AGENTS.md\",\n type: \"rules-section\",\n expectedHash: metadata.contentHash ?? \"unknown\",\n currentHash,\n });\n }\n }\n }\n\n // Check if any managed files were found\n if (allFiles.length === 0) {\n if (options.quiet) {\n process.exit(1);\n }\n console.log();\n console.log(pc.bold(\"agent-conf check\"));\n console.log();\n console.log(`${pc.red(\"✗\")} No managed files found`);\n console.log();\n console.log(pc.dim(\"This repository appears to be synced but no managed files were detected.\"));\n if (markerPrefix) {\n console.log(pc.dim(`Expected marker prefix: ${markerPrefix}`));\n }\n console.log(pc.dim(\"Run 'agent-conf sync' to restore the managed files.\"));\n console.log();\n process.exit(1);\n }\n\n // Output results\n if (options.quiet) {\n // Quiet mode: just exit with appropriate code\n if (modifiedFiles.length > 0) {\n process.exit(1);\n }\n return;\n }\n\n console.log();\n console.log(pc.bold(\"agent-conf check\"));\n console.log();\n console.log(\"Checking managed files...\");\n console.log();\n\n if (modifiedFiles.length === 0) {\n console.log(`${pc.green(\"✓\")} All managed files are unchanged`);\n console.log();\n return;\n }\n\n // Modified files found\n console.log(`${pc.red(\"✗\")} ${modifiedFiles.length} managed file(s) have been modified:`);\n console.log();\n\n for (const file of modifiedFiles) {\n let label = \"\";\n if (file.type === \"agents\") {\n label = \" (global block)\";\n } else if (file.type === \"rules-section\") {\n label = \" (rules section)\";\n } else if (file.type === \"rule\" && file.rulePath) {\n label = ` (rule: ${file.rulePath})`;\n }\n console.log(` ${file.path}${pc.dim(label)}`);\n console.log(` Expected hash: ${pc.dim(file.expectedHash)}`);\n console.log(` Current hash: ${pc.dim(file.currentHash)}`);\n console.log();\n }\n\n console.log(pc.dim(\"These files are managed by agent-conf and should not be modified manually.\"));\n console.log(pc.dim(\"Run 'agent-conf sync' to restore them to the expected state.\"));\n console.log();\n\n process.exit(1);\n}\n","import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport {\n CURRENT_LOCKFILE_VERSION,\n type Lockfile,\n LockfileSchema,\n type Source,\n} from \"../schemas/lockfile.js\";\nimport { checkSchemaCompatibility, type SchemaCompatibility } from \"./schema.js\";\n\n// Injected at build time by tsup\ndeclare const __BUILD_VERSION__: string;\n\nconst CONFIG_DIR = \".agent-conf\";\nconst LOCKFILE_NAME = \"lockfile.json\";\n\nexport function getLockfilePath(targetDir: string): string {\n return path.join(targetDir, CONFIG_DIR, LOCKFILE_NAME);\n}\n\nexport interface ReadLockfileResult {\n lockfile: Lockfile;\n schemaCompatibility: SchemaCompatibility;\n}\n\n/**\n * Reads and validates the lockfile from a target directory.\n * Returns null if the lockfile doesn't exist.\n *\n * The result includes schema compatibility information that callers should check:\n * - If compatible is false, the CLI should refuse to proceed\n * - If warning is set, the CLI should display it but can continue\n */\nexport async function readLockfile(targetDir: string): Promise<ReadLockfileResult | null> {\n const lockfilePath = getLockfilePath(targetDir);\n\n try {\n const content = await fs.readFile(lockfilePath, \"utf-8\");\n const parsed: unknown = JSON.parse(content);\n const lockfile = LockfileSchema.parse(parsed);\n\n // Check schema compatibility\n const schemaCompatibility = checkSchemaCompatibility(lockfile.version);\n\n return { lockfile, schemaCompatibility };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nexport interface WriteLockfileOptions {\n source: Source;\n globalBlockContent: string;\n skills: string[];\n targets?: string[];\n pinnedVersion?: string;\n /** Marker prefix used for managed content (default: \"agent-conf\") */\n markerPrefix?: string;\n /** Rules content for lockfile tracking */\n rules?: {\n files: string[];\n content_hash: string;\n };\n}\n\nexport async function writeLockfile(\n targetDir: string,\n options: WriteLockfileOptions,\n): Promise<Lockfile> {\n const lockfilePath = getLockfilePath(targetDir);\n\n const lockfile: Lockfile = {\n version: CURRENT_LOCKFILE_VERSION,\n pinned_version: options.pinnedVersion,\n synced_at: new Date().toISOString(),\n source: options.source,\n content: {\n agents_md: {\n global_block_hash: hashContent(options.globalBlockContent),\n merged: true,\n },\n skills: options.skills,\n targets: options.targets ?? [\"claude\"],\n marker_prefix: options.markerPrefix,\n rules: options.rules,\n },\n cli_version: getCliVersion(),\n };\n\n await fs.mkdir(path.dirname(lockfilePath), { recursive: true });\n await fs.writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`, \"utf-8\");\n\n return lockfile;\n}\n\nexport function hashContent(content: string): string {\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\n return `sha256:${hash.slice(0, 12)}`;\n}\n\nexport function getCliVersion(): string {\n return typeof __BUILD_VERSION__ !== \"undefined\" ? __BUILD_VERSION__ : \"0.0.0\";\n}\n\nexport interface VersionMismatch {\n currentVersion: string;\n lockfileVersion: string;\n}\n\n/**\n * Checks if the installed CLI version is older than the version used to sync.\n * Returns mismatch info if CLI is outdated, null otherwise.\n *\n * Note: This is for informational purposes only. The CLI version in lockfile\n * is optional and used for diagnostics, not for enforcing compatibility.\n * Schema version compatibility is enforced separately.\n */\nexport async function checkCliVersionMismatch(targetDir: string): Promise<VersionMismatch | null> {\n const result = await readLockfile(targetDir);\n\n // No lockfile means first sync - no mismatch\n if (!result) {\n return null;\n }\n\n const currentVersion = getCliVersion();\n const lockfileVersion = result.lockfile.cli_version;\n\n // Can't compare if either version is missing/invalid\n if (!currentVersion || !lockfileVersion) {\n return null;\n }\n\n // Compare versions: warn if lockfile was synced with a newer CLI\n // Simple semver comparison (major.minor.patch)\n const current = currentVersion.split(\".\").map(Number);\n const lockfile_ = lockfileVersion.split(\".\").map(Number);\n\n for (let i = 0; i < 3; i++) {\n if ((lockfile_[i] || 0) > (current[i] || 0)) {\n return {\n currentVersion,\n lockfileVersion,\n };\n }\n if ((current[i] || 0) > (lockfile_[i] || 0)) {\n return null; // Current is newer, no warning needed\n }\n }\n\n return null; // Versions are equal\n}\n","import { z } from \"zod\";\n\n/**\n * Current lockfile 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_LOCKFILE_VERSION = \"1.0.0\";\n\nexport const RulesContentSchema = z.object({\n /** List of rule file paths synced (relative to rules dir) */\n files: z.array(z.string()),\n /** Hash of all rules content */\n content_hash: z.string(),\n});\n\nexport const SourceSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"github\"),\n repository: z.string(),\n commit_sha: z.string(),\n ref: z.string(),\n }),\n z.object({\n type: z.literal(\"local\"),\n path: z.string(),\n commit_sha: z.string().optional(),\n }),\n]);\n\nexport const ContentSchema = z.object({\n agents_md: z.object({\n global_block_hash: z.string(),\n merged: z.boolean(),\n }),\n skills: z.array(z.string()),\n targets: z.array(z.string()).optional(),\n /** Marker prefix used for managed content (default: \"agent-conf\") */\n marker_prefix: z.string().optional(),\n /** Rules content tracking - optional for backward compat */\n rules: RulesContentSchema.optional(),\n});\n\nexport const LockfileSchema = 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 /** Pinned release version of the canonical source (e.g., \"1.2.0\") */\n pinned_version: z.string().optional(),\n synced_at: z.string().datetime(),\n source: SourceSchema,\n content: ContentSchema,\n /** CLI version used for sync (optional, for diagnostics only) */\n cli_version: z.string().optional(),\n});\n\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Content = z.infer<typeof ContentSchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\nexport type RulesContent = z.infer<typeof RulesContentSchema>;\n","/**\n * Schema versioning utilities for agent-conf.\n *\n * Schema versioning strategy:\n * - Schema version determines compatibility, not CLI version\n * - CLI refuses to work across major schema versions\n * - CLI warns but continues for minor version differences\n * - CLI version in lockfile is optional and for diagnostics only\n */\n\n/**\n * The schema version this CLI understands.\n * This is the version of the lockfile/config schema format.\n */\nexport const SUPPORTED_SCHEMA_VERSION = \"1.0.0\";\n\nexport interface SchemaCompatibility {\n /** Whether the CLI can work with this schema version */\n compatible: boolean;\n /** Warning message for minor version differences (continue with warning) */\n warning?: string;\n /** Error message for major version incompatibility (refuse to proceed) */\n error?: string;\n}\n\n/**\n * Checks if the CLI can work with a given schema version.\n *\n * Compatibility rules:\n * - Same major version: compatible\n * - Content has newer minor/patch: warn (may miss features)\n * - Content has newer major: error (upgrade CLI needed)\n * - Content has older major: error (migration needed)\n *\n * @param contentVersion - The schema version from the lockfile or config\n * @returns Compatibility status with optional warning/error messages\n */\nexport function checkSchemaCompatibility(contentVersion: string): SchemaCompatibility {\n const contentParts = contentVersion.split(\".\").map(Number);\n const supportedParts = SUPPORTED_SCHEMA_VERSION.split(\".\").map(Number);\n\n const contentMajor = contentParts[0] ?? 0;\n const contentMinor = contentParts[1] ?? 0;\n const supportedMajor = supportedParts[0] ?? 0;\n const supportedMinor = supportedParts[1] ?? 0;\n\n // Major version mismatch = hard error\n if (contentMajor > supportedMajor) {\n return {\n compatible: false,\n error: `Schema version ${contentVersion} requires a newer CLI. Run: npm install -g agconf@latest`,\n };\n }\n\n if (contentMajor < supportedMajor) {\n return {\n compatible: false,\n error: `Schema version ${contentVersion} is outdated and no longer supported. This content was created with an older version of agent-conf.`,\n };\n }\n\n // Same major, but content has newer minor = warn (may miss features)\n if (contentMinor > supportedMinor) {\n return {\n compatible: true,\n warning: `Content uses schema ${contentVersion}, CLI supports ${SUPPORTED_SCHEMA_VERSION}. Some features may not work. Consider upgrading: npm install -g agconf@latest`,\n };\n }\n\n // Fully compatible (same major, same or older minor)\n return { compatible: true };\n}\n\n/**\n * Validates that a string is a valid semver format.\n *\n * @param version - The version string to validate\n * @returns true if the version is valid semver format\n */\nexport function isValidSemver(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport tabtab from \"tabtab\";\n// @ts-expect-error - tabtab internal module not typed\nimport tabtabInstaller from \"tabtab/lib/installer.js\";\n\nconst CLI_NAME = \"agent-conf\";\n\n// Commands and their options for completion\nconst COMMANDS = {\n init: {\n description: \"Initialize or sync agent-conf standards\",\n options: [\"-s\", \"--source\", \"--local\", \"-y\", \"--yes\", \"--override\", \"--ref\", \"-t\", \"--target\"],\n },\n sync: {\n description: \"Sync agent-conf standards\",\n options: [\"-s\", \"--source\", \"--local\", \"-y\", \"--yes\", \"--override\", \"--ref\", \"-t\", \"--target\"],\n },\n status: {\n description: \"Show current sync status\",\n options: [\"-c\", \"--check\"],\n },\n update: {\n description: \"Check for and apply updates\",\n options: [\"-y\", \"--yes\", \"-t\", \"--target\"],\n },\n check: {\n description: \"Check if managed files have been modified\",\n options: [\"-q\", \"--quiet\"],\n },\n config: {\n description: \"Manage global CLI configuration\",\n options: [],\n },\n \"upgrade-cli\": {\n description: \"Upgrade the CLI to latest version\",\n options: [\"-y\", \"--yes\"],\n },\n canonical: {\n description: \"Manage canonical repositories\",\n options: [],\n subcommands: {\n init: {\n description: \"Scaffold a new canonical repository\",\n options: [\n \"-n\",\n \"--name\",\n \"-o\",\n \"--org\",\n \"-d\",\n \"--dir\",\n \"--marker-prefix\",\n \"--no-examples\",\n \"--rules-dir\",\n \"-y\",\n \"--yes\",\n ],\n },\n },\n },\n completion: {\n description: \"Manage shell completions\",\n options: [],\n },\n};\n\nconst CONFIG_SUBCOMMANDS = [\"show\", \"get\", \"set\"];\nconst COMPLETION_SUBCOMMANDS = [\"install\", \"uninstall\"];\nconst CANONICAL_SUBCOMMANDS = [\"init\"];\nconst TARGET_VALUES = [\"claude\", \"codex\"];\n\n/**\n * Handle shell completion requests.\n * This should be called early in the CLI lifecycle.\n * Returns true if this was a completion request (and it was handled).\n */\nexport function handleCompletion(): boolean {\n const env = tabtab.parseEnv(process.env);\n\n if (!env.complete) {\n return false;\n }\n\n // Determine what to complete based on context\n const { prev, words } = env;\n\n // Complete command names\n if (prev === CLI_NAME || words === 1) {\n tabtab.log(\n Object.entries(COMMANDS).map(([name, info]) => ({\n name,\n description: info.description,\n })),\n );\n return true;\n }\n\n // Find which command we're completing for\n const commandIndex = 1; // words[0] is the CLI name\n const currentCommand = env.line.split(/\\s+/)[commandIndex];\n\n // Complete subcommands for 'config'\n if (currentCommand === \"config\" && words === 2) {\n tabtab.log(\n CONFIG_SUBCOMMANDS.map((name) => ({\n name,\n description: `${name} configuration`,\n })),\n );\n return true;\n }\n\n // Complete subcommands for 'completion'\n if (currentCommand === \"completion\" && words === 2) {\n tabtab.log(\n COMPLETION_SUBCOMMANDS.map((name) => ({\n name,\n description: `${name} shell completions`,\n })),\n );\n return true;\n }\n\n // Complete subcommands for 'canonical'\n if (currentCommand === \"canonical\" && words === 2) {\n tabtab.log(\n CANONICAL_SUBCOMMANDS.map((name) => ({\n name,\n description: \"Scaffold a new canonical repository\",\n })),\n );\n return true;\n }\n\n // Complete options for 'canonical' subcommands\n if (currentCommand === \"canonical\" && words >= 3) {\n const subcommand = env.line.split(/\\s+/)[2];\n const canonicalCmd = COMMANDS.canonical as {\n subcommands: Record<string, { options: string[] }>;\n };\n if (subcommand && subcommand in canonicalCmd.subcommands) {\n const subcommandConfig = canonicalCmd.subcommands[subcommand];\n if (subcommandConfig) {\n tabtab.log(subcommandConfig.options);\n return true;\n }\n }\n }\n\n // Complete --target values\n if (prev === \"--target\" || prev === \"-t\") {\n tabtab.log(TARGET_VALUES);\n return true;\n }\n\n // Complete options for the current command\n if (currentCommand && currentCommand in COMMANDS) {\n const command = COMMANDS[currentCommand as keyof typeof COMMANDS];\n tabtab.log(command.options);\n return true;\n }\n\n // Default: complete command names\n tabtab.log(Object.keys(COMMANDS));\n return true;\n}\n\n/**\n * Get the tabtab completion script path for this CLI.\n * tabtab stores completions in ~/.config/tabtab/<name>.<shell>\n */\nfunction getTabtabCompletionFile(shell: string): string {\n const home = os.homedir();\n const ext = shell === \"fish\" ? \"fish\" : shell === \"zsh\" ? \"zsh\" : \"bash\";\n return path.join(home, \".config\", \"tabtab\", `${CLI_NAME}.${ext}`);\n}\n\n/**\n * Check if shell completions are already installed for the current shell.\n */\nexport function isCompletionInstalled(): boolean {\n const shell = detectShell();\n if (!shell) return false;\n\n // Check if the tabtab completion file exists for this CLI\n const completionFile = getTabtabCompletionFile(shell);\n if (fs.existsSync(completionFile)) {\n return true;\n }\n\n // Fallback: check if the shell config mentions this CLI's completions\n const configFile = getShellConfigFile(shell);\n if (!configFile || !fs.existsSync(configFile)) return false;\n\n try {\n const content = fs.readFileSync(configFile, \"utf-8\");\n return (\n content.includes(`tabtab source for ${CLI_NAME}`) || content.includes(`begin ${CLI_NAME}`)\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Detect shell from $SHELL environment variable.\n * Uses the same detection method as tabtab for consistency.\n * Exported for testing.\n */\nexport function detectShell(): string | null {\n const shell = process.env.SHELL || \"\";\n if (shell.includes(\"fish\")) return \"fish\";\n if (shell.includes(\"zsh\")) return \"zsh\";\n if (shell.includes(\"bash\")) return \"bash\";\n return null;\n}\n\n/** Get the config file path for a given shell. Exported for testing. */\nexport function getShellConfigFile(shell: string): string | null {\n const home = os.homedir();\n switch (shell) {\n case \"zsh\":\n return path.join(home, \".zshrc\");\n case \"bash\": {\n // Check for .bash_profile first (macOS), then .bashrc\n const bashProfile = path.join(home, \".bash_profile\");\n if (fs.existsSync(bashProfile)) return bashProfile;\n return path.join(home, \".bashrc\");\n }\n case \"fish\":\n return path.join(home, \".config\", \"fish\", \"config.fish\");\n default:\n return null;\n }\n}\n\n/**\n * Install shell completions directly without prompting for shell.\n * Uses the detected shell from $SHELL environment variable.\n */\nasync function installCompletionForShell(shell: string): Promise<void> {\n const location = getShellConfigFile(shell);\n if (!location) {\n throw new Error(`Unsupported shell: ${shell}`);\n }\n\n await tabtabInstaller.install({\n name: CLI_NAME,\n completer: CLI_NAME,\n location,\n });\n}\n\n/**\n * Install shell completions.\n */\nexport async function installCompletion(): Promise<void> {\n console.log();\n prompts.intro(pc.bold(\"Installing shell completions\"));\n\n const shell = detectShell();\n if (!shell) {\n prompts.log.warn(\"Could not detect shell. Supported shells: bash, zsh, fish\");\n prompts.outro(\"Completions not installed\");\n return;\n }\n\n prompts.log.info(`Detected shell: ${pc.cyan(shell)}`);\n\n if (isCompletionInstalled()) {\n prompts.log.success(\"Shell completions are already installed\");\n prompts.outro(\"Nothing to do\");\n return;\n }\n\n try {\n await installCompletionForShell(shell);\n\n prompts.log.success(`Completions installed for ${pc.cyan(shell)}`);\n prompts.log.info(\n `Restart your shell or run: ${pc.cyan(`source ${getShellConfigFile(shell)}`)}`,\n );\n prompts.outro(\"Done!\");\n } catch (error) {\n prompts.log.error(`Failed to install completions: ${error}`);\n prompts.outro(\"Installation failed\");\n process.exit(1);\n }\n}\n\n/**\n * Uninstall shell completions.\n */\nexport async function uninstallCompletion(): Promise<void> {\n console.log();\n prompts.intro(pc.bold(\"Uninstalling shell completions\"));\n\n try {\n await tabtab.uninstall({\n name: CLI_NAME,\n });\n\n prompts.log.success(\"Shell completions uninstalled\");\n prompts.outro(\"Done!\");\n } catch (error) {\n prompts.log.error(`Failed to uninstall completions: ${error}`);\n prompts.outro(\"Uninstallation failed\");\n process.exit(1);\n }\n}\n\n/**\n * Prompt user to install completions if not already installed.\n * Used during 'init' command.\n * Returns true if completions were installed.\n */\nexport async function promptCompletionInstall(): Promise<boolean> {\n if (isCompletionInstalled()) {\n return false;\n }\n\n const shell = detectShell();\n if (!shell) {\n // Don't prompt if we can't detect the shell\n return false;\n }\n\n const shouldInstall = await prompts.confirm({\n message: `Install shell completions for ${shell}?`,\n });\n\n if (prompts.isCancel(shouldInstall) || !shouldInstall) {\n prompts.log.info(`You can install later with: ${pc.cyan(\"agent-conf completion install\")}`);\n return false;\n }\n\n try {\n await installCompletionForShell(shell);\n\n prompts.log.success(`Completions installed for ${pc.cyan(shell)}`);\n prompts.log.info(\n `Restart your shell or run: ${pc.cyan(`source ${getShellConfigFile(shell)}`)}`,\n );\n return true;\n } catch (error) {\n prompts.log.warn(`Could not install completions: ${error}`);\n prompts.log.info(`You can try again with: ${pc.cyan(\"agent-conf completion install\")}`);\n return false;\n }\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { createLogger } from \"../utils/logger.js\";\n\nexport type ConfigOptions = Record<string, never>;\n\nexport async function configShowCommand(): Promise<void> {\n console.log();\n prompts.intro(pc.bold(\"agent-conf config\"));\n\n console.log();\n console.log(pc.bold(\"Global Configuration:\"));\n console.log();\n console.log(pc.dim(\" No configuration options available.\"));\n console.log();\n console.log(pc.dim(\"Config location: ~/.agent-conf/config.json\"));\n\n prompts.outro(\"\");\n}\n\nexport async function configGetCommand(key: string): Promise<void> {\n const logger = createLogger();\n logger.error(`Unknown config key: ${key}`);\n logger.info(\"No configuration options available.\");\n process.exit(1);\n}\n\nexport async function configSetCommand(key: string, _value: string): Promise<void> {\n const logger = createLogger();\n logger.error(`Unknown config key: ${key}`);\n logger.info(\"No configuration options available.\");\n process.exit(1);\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getSyncStatus } from \"../core/sync.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { promptCompletionInstall } from \"./completion.js\";\nimport {\n checkModifiedFilesBeforeSync,\n parseAndValidateTargets,\n performSync,\n promptMergeOrOverride,\n resolveSource,\n resolveTargetDirectory,\n resolveVersion,\n type SharedSyncOptions,\n} from \"./shared.js\";\n\nexport interface InitOptions extends SharedSyncOptions {}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agent-conf init\"));\n\n // Resolve target directory to git root\n const targetDir = await resolveTargetDirectory();\n\n // Parse targets\n const targets = await parseAndValidateTargets(options.target);\n\n // Check current status\n const status = await getSyncStatus(targetDir);\n\n // Check schema compatibility\n if (status.schemaError) {\n logger.error(status.schemaError);\n process.exit(1);\n }\n if (status.schemaWarning) {\n logger.warn(status.schemaWarning);\n }\n\n // Prompt if already synced (init-specific behavior)\n if (status.hasSynced && !options.yes) {\n const shouldContinue = await prompts.confirm({\n message: \"This repository has already been synced. Do you want to sync again?\",\n });\n\n if (prompts.isCancel(shouldContinue) || !shouldContinue) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n // Resolve version (fetches latest release if no --ref specified)\n // For GitHub sources, pass the repo to fetch releases from\n const resolvedVersion = await resolveVersion(options, status, \"init\", options.source);\n\n // Resolve source using the determined version\n const { resolvedSource, tempDir, repository } = await resolveSource(options, resolvedVersion);\n\n // Determine merge behavior\n const shouldOverride = await promptMergeOrOverride(status, options, tempDir);\n\n // Check for modified skill files and warn\n await checkModifiedFilesBeforeSync(targetDir, targets, options, tempDir);\n\n // Perform sync (includes workflow files for release versions)\n await performSync({\n targetDir,\n resolvedSource,\n resolvedVersion,\n shouldOverride,\n targets,\n context: {\n commandName: \"init\",\n status,\n },\n tempDir,\n yes: options.yes,\n sourceRepo: repository,\n });\n\n // Prompt to install shell completions (only if not in non-interactive mode)\n if (!options.yes) {\n await promptCompletionInstall();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { Lockfile } from \"../schemas/lockfile.js\";\nimport { readLockfile, writeLockfile } from \"./lockfile.js\";\nimport { ensureClaudeMd, mergeAgentsMd, writeAgentsMd } from \"./merge.js\";\nimport {\n addRuleMetadata,\n generateRulesSection,\n parseRule,\n type Rule,\n updateAgentsMdWithRules,\n} from \"./rules.js\";\nimport {\n addManagedMetadata,\n type SkillValidationError,\n validateSkillFrontmatter,\n} from \"./skill-metadata.js\";\nimport type { ResolvedSource } from \"./source.js\";\nimport { getTargetConfig, type Target, type TargetConfig } from \"./targets.js\";\n\nexport interface SyncOptions {\n override: boolean;\n targets: Target[];\n /** Pinned version to record in lockfile */\n pinnedVersion?: string;\n}\n\n// =============================================================================\n// Rules Sync\n// =============================================================================\n\nexport interface RulesSyncOptions {\n sourceRulesPath: string;\n targetDir: string;\n targets: Target[];\n markerPrefix: string;\n metadataPrefix: string;\n agentsMdContent: string;\n}\n\nexport interface RulesSyncResult {\n rules: Rule[];\n updatedAgentsMd: string | null;\n claudeFiles: string[];\n modifiedRules: string[];\n contentHash: string;\n}\n\n/**\n * Discover all markdown rule files in a directory recursively.\n */\nasync function discoverRules(rulesDir: string): Promise<Rule[]> {\n try {\n await fs.access(rulesDir);\n } catch {\n // Directory doesn't exist - return empty array\n return [];\n }\n\n const ruleFiles = await fg(\"**/*.md\", {\n cwd: rulesDir,\n absolute: false,\n });\n\n const rules: Rule[] = [];\n for (const relativePath of ruleFiles) {\n const fullPath = path.join(rulesDir, relativePath);\n const content = await fs.readFile(fullPath, \"utf-8\");\n rules.push(parseRule(content, relativePath));\n }\n\n return rules;\n}\n\n/**\n * Compute aggregate hash for a list of rules.\n * Rules are sorted by path for determinism.\n */\nfunction computeRulesHash(rules: Rule[]): string {\n if (rules.length === 0) return \"\";\n\n const sorted = [...rules].sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n const combined = sorted.map((r) => `${r.relativePath}:${r.body}`).join(\"\\n---\\n\");\n const hash = createHash(\"sha256\").update(combined).digest(\"hex\");\n return hash.slice(0, 16);\n}\n\n/**\n * Sync rules from a canonical source to target directory.\n *\n * For Claude target: Copy rules to .claude/rules/ with metadata added\n * For Codex target: Generate rules section and return updated AGENTS.md\n */\nexport async function syncRules(options: RulesSyncOptions): Promise<RulesSyncResult> {\n const { sourceRulesPath, targetDir, targets, markerPrefix, metadataPrefix, agentsMdContent } =\n options;\n\n // Discover all rules\n const rules = await discoverRules(sourceRulesPath);\n\n const result: RulesSyncResult = {\n rules,\n updatedAgentsMd: null,\n claudeFiles: [],\n modifiedRules: [],\n contentHash: \"\",\n };\n\n // No rules - return early\n if (rules.length === 0) {\n return result;\n }\n\n // Compute content hash for lockfile\n result.contentHash = computeRulesHash(rules);\n\n // Sync to Claude target\n if (targets.includes(\"claude\")) {\n const claudeRulesDir = path.join(targetDir, \".claude\", \"rules\");\n\n for (const rule of rules) {\n const targetPath = path.join(claudeRulesDir, rule.relativePath);\n\n // Ensure parent directory exists\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n\n // Add metadata and write file\n const contentWithMetadata = addRuleMetadata(rule, metadataPrefix);\n\n // Check if file exists and has same content\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(targetPath, \"utf-8\");\n } catch {\n // File doesn't exist\n }\n\n if (existingContent !== contentWithMetadata) {\n await fs.writeFile(targetPath, contentWithMetadata, \"utf-8\");\n result.modifiedRules.push(rule.relativePath);\n }\n\n result.claudeFiles.push(rule.relativePath);\n }\n }\n\n // Sync to Codex target\n if (targets.includes(\"codex\")) {\n const rulesSection = generateRulesSection(rules, markerPrefix);\n result.updatedAgentsMd = updateAgentsMdWithRules(agentsMdContent, rulesSection, markerPrefix);\n }\n\n return result;\n}\n\nexport interface TargetResult {\n target: Target;\n instructionsMd: {\n created: boolean;\n updated: boolean;\n location: \"root\" | \"dotdir\" | null;\n contentMerged: boolean;\n };\n skills: {\n copied: number;\n };\n}\n\nexport interface SyncResult {\n lockfile: Lockfile;\n agentsMd: {\n merged: boolean;\n preservedRepoContent: boolean;\n };\n targets: TargetResult[];\n skills: {\n synced: string[];\n modified: string[];\n totalCopied: number;\n validationErrors: SkillValidationError[];\n };\n rules?: {\n synced: string[];\n modified: string[];\n contentHash: string;\n claudeFiles: string[];\n codexUpdated: boolean;\n };\n}\n\nexport async function sync(\n targetDir: string,\n resolvedSource: ResolvedSource,\n options: SyncOptions = { override: false, targets: [\"claude\"] },\n): Promise<SyncResult> {\n // Get marker prefix from resolved source\n const markerPrefix = resolvedSource.markerPrefix;\n\n // Read global AGENTS.md content\n const globalContent = await fs.readFile(resolvedSource.agentsMdPath, \"utf-8\");\n\n // Merge/write AGENTS.md (also gathers existing CLAUDE.md content)\n const mergeResult = await mergeAgentsMd(targetDir, globalContent, resolvedSource.source, {\n override: options.override,\n markerPrefix,\n });\n await writeAgentsMd(targetDir, mergeResult.content);\n\n // Find all skill directories once\n const skillDirs = await fg(\"*/\", {\n cwd: resolvedSource.skillsPath,\n onlyDirectories: true,\n deep: 1,\n });\n const skillNames = skillDirs.map((d) => d.replace(/\\/$/, \"\"));\n\n // Validate all skills have required frontmatter\n const validationErrors: SkillValidationError[] = [];\n for (const skillName of skillNames) {\n const skillMdPath = path.join(resolvedSource.skillsPath, skillName, \"SKILL.md\");\n try {\n const content = await fs.readFile(skillMdPath, \"utf-8\");\n const error = validateSkillFrontmatter(content, skillName, skillMdPath);\n if (error) {\n validationErrors.push(error);\n }\n } catch {\n // Expected: SKILL.md may not exist, will be handled during sync\n }\n }\n\n // Process each target\n const targetResults: TargetResult[] = [];\n let totalCopied = 0;\n const allModifiedSkills = new Set<string>();\n\n for (const target of options.targets) {\n const config = getTargetConfig(target);\n\n // Sync skills to this target\n const skillsResult = await syncSkillsToTarget(\n targetDir,\n resolvedSource.skillsPath,\n skillNames,\n config,\n markerPrefix,\n );\n totalCopied += skillsResult.copied;\n for (const skill of skillsResult.modifiedSkills) {\n allModifiedSkills.add(skill);\n }\n\n // Only Claude needs an instructions file with @AGENTS.md reference\n // Other targets (codex, etc.) read AGENTS.md directly\n let instructionsResult: TargetResult[\"instructionsMd\"];\n if (config.instructionsFile) {\n instructionsResult = await ensureInstructionsMd(\n targetDir,\n config,\n target === \"claude\" ? mergeResult.claudeMdLocation : null,\n );\n } else {\n instructionsResult = {\n created: false,\n updated: false,\n location: null,\n contentMerged: false,\n };\n }\n\n targetResults.push({\n target,\n instructionsMd: instructionsResult,\n skills: { copied: skillsResult.copied },\n });\n }\n\n // Sync rules if canonical has rules configured\n let rulesResult: RulesSyncResult | null = null;\n if (resolvedSource.rulesPath) {\n // Read current AGENTS.md content for potential Codex rules insertion\n const currentAgentsMd = await fs.readFile(path.join(targetDir, \"AGENTS.md\"), \"utf-8\");\n\n rulesResult = await syncRules({\n sourceRulesPath: resolvedSource.rulesPath,\n targetDir,\n targets: options.targets,\n markerPrefix,\n metadataPrefix: markerPrefix.replace(/-/g, \"_\"),\n agentsMdContent: currentAgentsMd,\n });\n\n // If Codex target and rules were found, update AGENTS.md with rules section\n if (rulesResult.updatedAgentsMd && options.targets.includes(\"codex\")) {\n await writeAgentsMd(targetDir, rulesResult.updatedAgentsMd);\n }\n }\n\n // Write lockfile\n const lockfileOptions: Parameters<typeof writeLockfile>[1] = {\n source: resolvedSource.source,\n globalBlockContent: globalContent,\n skills: skillNames,\n targets: options.targets,\n markerPrefix,\n };\n if (options.pinnedVersion) {\n lockfileOptions.pinnedVersion = options.pinnedVersion;\n }\n if (rulesResult && rulesResult.rules.length > 0) {\n lockfileOptions.rules = {\n files: rulesResult.rules.map((r) => r.relativePath),\n content_hash: rulesResult.contentHash,\n };\n }\n const lockfile = await writeLockfile(targetDir, lockfileOptions);\n\n const result: SyncResult = {\n lockfile,\n agentsMd: {\n merged: mergeResult.merged,\n preservedRepoContent: mergeResult.preservedRepoContent,\n },\n targets: targetResults,\n skills: {\n synced: skillNames,\n modified: [...allModifiedSkills],\n totalCopied,\n validationErrors,\n },\n };\n\n if (rulesResult && rulesResult.rules.length > 0) {\n result.rules = {\n synced: rulesResult.rules.map((r) => r.relativePath),\n modified: rulesResult.modifiedRules,\n contentHash: rulesResult.contentHash,\n claudeFiles: rulesResult.claudeFiles,\n codexUpdated: rulesResult.updatedAgentsMd !== null,\n };\n }\n\n return result;\n}\n\ninterface SkillSyncResult {\n copied: number;\n modifiedSkills: string[];\n}\n\nasync function syncSkillsToTarget(\n targetDir: string,\n sourceSkillsPath: string,\n skillNames: string[],\n config: TargetConfig,\n metadataPrefix: string,\n): Promise<SkillSyncResult> {\n const targetSkillsPath = path.join(targetDir, config.dir, \"skills\");\n let copied = 0;\n const modifiedSkills: string[] = [];\n\n for (const skillName of skillNames) {\n const sourceDir = path.join(sourceSkillsPath, skillName);\n const targetSkillDir = path.join(targetSkillsPath, skillName);\n\n const result = await copySkillDirectory(sourceDir, targetSkillDir, metadataPrefix);\n copied += result.copied;\n if (result.modified) {\n modifiedSkills.push(skillName);\n }\n }\n\n return { copied, modifiedSkills };\n}\n\ninterface CopyResult {\n copied: number;\n modified: boolean;\n}\n\n/**\n * Copy a skill directory, adding managed metadata to SKILL.md files.\n * Returns whether any files were actually modified (content changed).\n */\nasync function copySkillDirectory(\n sourceDir: string,\n targetDir: string,\n metadataPrefix: string,\n): Promise<CopyResult> {\n await fs.mkdir(targetDir, { recursive: true });\n\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n let copied = 0;\n let modified = false;\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n const subResult = await copySkillDirectory(sourcePath, targetPath, metadataPrefix);\n copied += subResult.copied;\n if (subResult.modified) modified = true;\n } else if (entry.name === \"SKILL.md\") {\n // Add managed metadata to SKILL.md files\n const content = await fs.readFile(sourcePath, \"utf-8\");\n const contentWithMetadata = addManagedMetadata(content, { metadataPrefix });\n\n // Check if file exists and has same content\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(targetPath, \"utf-8\");\n } catch {\n // File doesn't exist\n }\n\n if (existingContent !== contentWithMetadata) {\n await fs.writeFile(targetPath, contentWithMetadata, \"utf-8\");\n modified = true;\n }\n copied++;\n } else {\n // Check if file exists and has same content\n let needsCopy = true;\n try {\n const [sourceContent, targetContent] = await Promise.all([\n fs.readFile(sourcePath),\n fs.readFile(targetPath),\n ]);\n needsCopy = !sourceContent.equals(targetContent);\n } catch {\n // Target doesn't exist\n }\n\n if (needsCopy) {\n await fs.copyFile(sourcePath, targetPath);\n modified = true;\n }\n copied++;\n }\n }\n\n return { copied, modified };\n}\n\nasync function ensureInstructionsMd(\n targetDir: string,\n config: TargetConfig,\n existingLocation: \"root\" | \"dotclaude\" | null,\n): Promise<{\n created: boolean;\n updated: boolean;\n location: \"root\" | \"dotdir\" | null;\n contentMerged: boolean;\n}> {\n // Only Claude needs an instructions file\n if (!config.instructionsFile) {\n return { created: false, updated: false, location: null, contentMerged: false };\n }\n\n // Use the existing ensureClaudeMd logic for Claude\n const result = await ensureClaudeMd(targetDir, existingLocation);\n return {\n created: result.created,\n updated: result.updated,\n location: result.location === \"dotclaude\" ? \"dotdir\" : result.location,\n contentMerged: result.contentMerged,\n };\n}\n\nexport interface SyncStatus {\n hasSynced: boolean;\n lockfile: Lockfile | null;\n agentsMdExists: boolean;\n skillsExist: boolean;\n /** Schema compatibility warning (null if no warning) */\n schemaWarning: string | null;\n /** Schema compatibility error (null if no error) */\n schemaError: string | null;\n}\n\nexport async function getSyncStatus(targetDir: string): Promise<SyncStatus> {\n const result = await readLockfile(targetDir);\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const skillsPath = path.join(targetDir, \".claude\", \"skills\");\n\n const [agentsMdExists, skillsExist] = await Promise.all([\n fs\n .access(agentsMdPath)\n .then(() => true)\n .catch(() => false),\n fs\n .access(skillsPath)\n .then(() => true)\n .catch(() => false),\n ]);\n\n return {\n hasSynced: result !== null,\n lockfile: result?.lockfile ?? null,\n agentsMdExists,\n skillsExist,\n schemaWarning: result?.schemaCompatibility.warning ?? null,\n schemaError: result?.schemaCompatibility.error ?? null,\n };\n}\n\n/**\n * Find skills that were previously synced but are no longer in the current sync.\n */\nexport function findOrphanedSkills(previousSkills: string[], currentSkills: string[]): string[] {\n return previousSkills.filter((skill) => !currentSkills.includes(skill));\n}\n\n/** Options for deleting orphaned skills */\nexport interface DeleteOrphanedSkillsOptions {\n /** Metadata prefix to use for checking managed status (default: \"agent-conf\") */\n metadataPrefix?: string;\n}\n\n/**\n * Delete orphaned skill directories from all targets.\n * Only deletes skills that:\n * 1. Are managed (have managed metadata in SKILL.md)\n * 2. AND either:\n * - Content hash matches (skill hasn't been modified), OR\n * - Skill was in the previous lockfile (confirming it was synced)\n *\n * This prevents accidentally deleting skills that were manually copied.\n */\nexport async function deleteOrphanedSkills(\n targetDir: string,\n orphanedSkills: string[],\n targets: string[],\n previouslyTrackedSkills: string[],\n options: DeleteOrphanedSkillsOptions = {},\n): Promise<{ deleted: string[]; skipped: string[] }> {\n const deleted: string[] = [];\n const skipped: string[] = [];\n const metadataOptions = options.metadataPrefix\n ? { metadataPrefix: options.metadataPrefix }\n : undefined;\n\n for (const skillName of orphanedSkills) {\n let wasDeleted = false;\n\n for (const target of targets) {\n const skillDir = path.join(targetDir, `.${target}`, \"skills\", skillName);\n\n // Check if skill directory exists\n try {\n await fs.access(skillDir);\n } catch {\n // Expected: skill directory may not exist for this target\n continue;\n }\n\n // Check if the skill is managed before deleting\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n try {\n const content = await fs.readFile(skillMdPath, \"utf-8\");\n const { isManaged, hasManualChanges } = await import(\"./skill-metadata.js\");\n\n if (!isManaged(content, metadataOptions)) {\n // Not managed, skip deletion\n if (!skipped.includes(skillName)) {\n skipped.push(skillName);\n }\n continue;\n }\n\n // Additional safety check: only delete if either:\n // 1. The skill was in the previous lockfile (confirming it was synced), OR\n // 2. The content hash matches (skill hasn't been modified)\n const wasInPreviousLockfile = previouslyTrackedSkills.includes(skillName);\n const isUnmodified = !hasManualChanges(content, metadataOptions);\n\n if (!wasInPreviousLockfile && !isUnmodified) {\n // Skill is managed but wasn't in lockfile and has been modified\n // This could be a manually copied skill - skip to be safe\n if (!skipped.includes(skillName)) {\n skipped.push(skillName);\n }\n continue;\n }\n } catch {\n // Expected: SKILL.md may not exist, skip deletion to be safe\n if (!skipped.includes(skillName)) {\n skipped.push(skillName);\n }\n continue;\n }\n\n // Delete the skill directory\n await fs.rm(skillDir, { recursive: true, force: true });\n wasDeleted = true;\n }\n\n if (wasDeleted && !deleted.includes(skillName)) {\n deleted.push(skillName);\n }\n }\n\n return { deleted, skipped };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { Source } from \"../schemas/lockfile.js\";\nimport { buildAgentsMd, extractRepoBlockContent, parseAgentsMd } from \"./markers.js\";\n\nexport interface MergeOptions {\n override: boolean;\n /** Marker prefix to use for managed content (default: \"agent-conf\") */\n markerPrefix?: string;\n}\n\nexport interface MergeResult {\n content: string;\n merged: boolean;\n preservedRepoContent: boolean;\n}\n\nexport interface ClaudeMdResult {\n created: boolean;\n updated: boolean;\n location: \"root\" | \"dotclaude\" | null;\n contentMerged: boolean;\n}\n\ninterface ExistingContent {\n agentsMd: string | null;\n claudeMd: string | null;\n claudeMdLocation: \"root\" | \"dotclaude\" | null;\n}\n\nasync function readFileIfExists(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function gatherExistingContent(targetDir: string): Promise<ExistingContent> {\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const rootClaudeMdPath = path.join(targetDir, \"CLAUDE.md\");\n const dotClaudeClaudeMdPath = path.join(targetDir, \".claude\", \"CLAUDE.md\");\n\n const agentsMd = await readFileIfExists(agentsMdPath);\n\n // Check root CLAUDE.md first, then .claude/CLAUDE.md\n const rootClaudeMd = await readFileIfExists(rootClaudeMdPath);\n if (rootClaudeMd !== null) {\n return { agentsMd, claudeMd: rootClaudeMd, claudeMdLocation: \"root\" };\n }\n\n const dotClaudeClaudeMd = await readFileIfExists(dotClaudeClaudeMdPath);\n if (dotClaudeClaudeMd !== null) {\n return { agentsMd, claudeMd: dotClaudeClaudeMd, claudeMdLocation: \"dotclaude\" };\n }\n\n return { agentsMd, claudeMd: null, claudeMdLocation: null };\n}\n\nfunction stripAgentsReference(content: string): string {\n // Remove @AGENTS.md, @../AGENTS.md, or @.claude/AGENTS.md references\n return content\n .split(\"\\n\")\n .filter((line) => {\n const trimmed = line.trim();\n return !trimmed.match(/^@(\\.\\.\\/|\\.claude\\/)?AGENTS\\.md$/);\n })\n .join(\"\\n\")\n .trim();\n}\n\nexport async function mergeAgentsMd(\n targetDir: string,\n globalContent: string,\n _source: Source,\n options: MergeOptions = { override: false },\n): Promise<\n MergeResult & {\n existingClaudeMdContent: string | null;\n claudeMdLocation: \"root\" | \"dotclaude\" | null;\n }\n> {\n const existing = await gatherExistingContent(targetDir);\n const markerOptions = options.markerPrefix ? { prefix: options.markerPrefix } : undefined;\n\n // Collect content to merge into repo block\n const contentToMerge: string[] = [];\n\n // Handle existing AGENTS.md\n if (existing.agentsMd !== null && !options.override) {\n const parsed = parseAgentsMd(existing.agentsMd, markerOptions);\n if (parsed.hasMarkers) {\n // Has markers - preserve repo block content\n const repoContent = extractRepoBlockContent(parsed);\n if (repoContent) {\n contentToMerge.push(repoContent);\n }\n } else {\n // No markers - treat entire content as repo-specific\n contentToMerge.push(existing.agentsMd.trim());\n }\n }\n\n // Handle existing CLAUDE.md content (merge into repo block)\n let claudeMdContentForMerge: string | null = null;\n if (existing.claudeMd !== null && !options.override) {\n const strippedContent = stripAgentsReference(existing.claudeMd);\n if (strippedContent) {\n claudeMdContentForMerge = strippedContent;\n contentToMerge.push(strippedContent);\n }\n }\n\n // Build final repo content\n const repoContent = contentToMerge.length > 0 ? contentToMerge.join(\"\\n\\n\") : null;\n const content = buildAgentsMd(globalContent, repoContent, {}, markerOptions);\n\n const merged = !options.override && (existing.agentsMd !== null || existing.claudeMd !== null);\n const preservedRepoContent = contentToMerge.length > 0;\n\n return {\n content,\n merged,\n preservedRepoContent,\n existingClaudeMdContent: claudeMdContentForMerge,\n claudeMdLocation: existing.claudeMdLocation,\n };\n}\n\nexport async function writeAgentsMd(targetDir: string, content: string): Promise<void> {\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n await fs.writeFile(agentsMdPath, content, \"utf-8\");\n}\n\nexport async function ensureClaudeMd(\n targetDir: string,\n existingLocation: \"root\" | \"dotclaude\" | null,\n): Promise<ClaudeMdResult> {\n // Determine where CLAUDE.md should be and what reference to use\n // If there's an existing one, update it in place; otherwise create in .claude/\n const rootPath = path.join(targetDir, \"CLAUDE.md\");\n const dotClaudePath = path.join(targetDir, \".claude\", \"CLAUDE.md\");\n\n // Reference paths (AGENTS.md is in root)\n const rootReference = \"@AGENTS.md\";\n const dotClaudeReference = \"@../AGENTS.md\";\n\n if (existingLocation === \"root\") {\n // Update root CLAUDE.md\n const existingContent = await readFileIfExists(rootPath);\n if (existingContent !== null) {\n // Check if reference already exists\n if (existingContent.includes(rootReference)) {\n return { created: false, updated: false, location: \"root\", contentMerged: false };\n }\n // Content was already merged into AGENTS.md, just add the reference\n await fs.writeFile(rootPath, `${rootReference}\\n`, \"utf-8\");\n return { created: false, updated: true, location: \"root\", contentMerged: true };\n }\n }\n\n if (existingLocation === \"dotclaude\") {\n // Update .claude/CLAUDE.md\n const existingContent = await readFileIfExists(dotClaudePath);\n if (existingContent !== null) {\n // Check if reference already exists\n if (existingContent.includes(dotClaudeReference)) {\n return { created: false, updated: false, location: \"dotclaude\", contentMerged: false };\n }\n // Content was already merged into AGENTS.md, just add the reference\n await fs.writeFile(dotClaudePath, `${dotClaudeReference}\\n`, \"utf-8\");\n return { created: false, updated: true, location: \"dotclaude\", contentMerged: true };\n }\n }\n\n // No existing CLAUDE.md - create in .claude/\n await fs.mkdir(path.dirname(dotClaudePath), { recursive: true });\n await fs.writeFile(dotClaudePath, `${dotClaudeReference}\\n`, \"utf-8\");\n return { created: true, updated: false, location: \"dotclaude\", contentMerged: false };\n}\n","import { createHash } from \"node:crypto\";\nimport { computeContentHash as computeSkillContentHash } from \"./skill-metadata.js\";\n\n// =============================================================================\n// Interfaces\n// =============================================================================\n\n/**\n * Frontmatter fields that can be present in a rule file.\n */\nexport interface RuleFrontmatter {\n /**\n * Glob patterns for conditional rule loading (Claude-specific feature).\n * Example: [\"src/api/all.ts\", \"lib/api/all.ts\"]\n */\n paths?: string[];\n\n /**\n * Metadata added by agent-conf during sync or by the rule author.\n */\n metadata?: Record<string, string>;\n\n /**\n * Any other frontmatter fields from the original rule.\n */\n [key: string]: unknown;\n}\n\n/**\n * Parsed representation of a rule file.\n */\nexport interface Rule {\n /**\n * Relative path from rules directory root.\n * Example: \"security/api-auth.md\"\n */\n relativePath: string;\n\n /**\n * Full file content including frontmatter.\n */\n rawContent: string;\n\n /**\n * Parsed frontmatter (null if no frontmatter or parse error).\n */\n frontmatter: RuleFrontmatter | null;\n\n /**\n * Content without frontmatter (body only).\n */\n body: string;\n}\n\n// =============================================================================\n// Frontmatter parsing\n// =============================================================================\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/**\n * Parse YAML frontmatter from markdown content.\n * Returns null frontmatter if parsing fails or no frontmatter exists.\n */\nfunction parseFrontmatter(content: string): {\n frontmatter: RuleFrontmatter | null;\n body: string;\n} {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match || !match[1]) {\n return { frontmatter: null, body: content };\n }\n\n const rawYaml = match[1];\n const body = content.slice(match[0].length);\n\n try {\n const frontmatter = parseSimpleYaml(rawYaml);\n return { frontmatter: frontmatter as RuleFrontmatter, body };\n } catch {\n // Parse error - treat as no frontmatter\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * Simple YAML parser for frontmatter.\n * Handles basic key-value pairs, nested metadata objects, and arrays.\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 currentValue: unknown = null;\n let isArray = false;\n\n for (const line of lines) {\n // Skip empty lines\n if (line.trim() === \"\") continue;\n\n // Check for array item (starts with spaces and dash)\n if (line.match(/^\\s+-\\s+/)) {\n if (currentKey && isArray) {\n const value = line\n .replace(/^\\s+-\\s+/, \"\")\n .replace(/^[\"']|[\"']$/g, \"\")\n .trim();\n (currentValue as string[]).push(value);\n }\n continue;\n }\n\n // Check for nested content (indented key: value)\n if (line.startsWith(\" \") && currentKey && typeof currentValue === \"object\" && !isArray) {\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].replace(/^[\"']|[\"']$/g, \"\");\n (currentValue as Record<string, string>)[key] = value;\n }\n continue;\n }\n\n // Save previous value if we're moving to a new key\n if (currentKey && currentValue !== null) {\n result[currentKey] = currentValue;\n currentValue = null;\n isArray = false;\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].trim();\n currentKey = key;\n\n if (value === \"\") {\n // Could be nested object or array - we'll determine based on next line\n // For now, assume object (metadata) or check for array indicator\n currentValue = {};\n isArray = false;\n } else if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n // Inline array: key: [item1, item2]\n try {\n currentValue = JSON.parse(value);\n result[key] = currentValue;\n currentKey = null;\n currentValue = null;\n } catch {\n result[key] = value.replace(/^[\"']|[\"']$/g, \"\");\n currentKey = null;\n currentValue = null;\n }\n } else {\n // Simple value - remove quotes if present\n result[key] = value.replace(/^[\"']|[\"']$/g, \"\");\n currentKey = null;\n currentValue = null;\n }\n }\n }\n\n // Don't forget the last value\n if (currentKey && currentValue !== null) {\n result[currentKey] = currentValue;\n }\n\n // Post-process: Check if any \"object\" values should actually be arrays\n // by checking if the first line after the key starts with a dash\n return result;\n}\n\n/**\n * Serialize frontmatter object back to YAML string.\n */\nfunction serializeFrontmatter(frontmatter: RuleFrontmatter): string {\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n // Array value\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${item}\"`);\n }\n } else if (typeof value === \"object\") {\n // Nested object (like metadata)\n lines.push(`${key}:`);\n for (const [nestedKey, nestedValue] of Object.entries(value as Record<string, string>)) {\n const quotedValue = needsQuoting(String(nestedValue))\n ? `\"${String(nestedValue)}\"`\n : String(nestedValue);\n lines.push(` ${nestedKey}: ${quotedValue}`);\n }\n } else {\n // Simple value\n const strValue = String(value);\n const quotedValue = needsQuoting(strValue) ? `\"${strValue}\"` : strValue;\n lines.push(`${key}: ${quotedValue}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Check if a YAML value needs quoting.\n */\nfunction needsQuoting(value: string): boolean {\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// Heading level adjustment\n// =============================================================================\n\n/**\n * Adjusts markdown heading levels by a given increment.\n *\n * @param content - Markdown content to adjust\n * @param increment - Number of levels to add (positive = deeper)\n * @returns Adjusted markdown content\n *\n * Rules:\n * - Only ATX headings are adjusted (# style, not underline style)\n * - Headings in code blocks are NOT adjusted\n * - Maximum heading level is 6 (h7+ stay as h6)\n * - Minimum heading level is 1 (can't go below h1)\n */\nexport function adjustHeadingLevels(content: string, increment: number): string {\n if (!content) return \"\";\n\n // Track if we're inside a code block\n let inCodeBlock = false;\n\n return content\n .split(\"\\n\")\n .map((line) => {\n // Check for code block boundaries (``` style)\n if (line.trim().startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock;\n return line;\n }\n\n // Skip lines in code blocks\n if (inCodeBlock) {\n return line;\n }\n\n // Match ATX headings: ^(#{1,6})(\\s+.*)$\n const headingMatch = line.match(/^(#{1,6})(\\s+.*)$/);\n if (!headingMatch || !headingMatch[1]) {\n return line;\n }\n\n const hashes = headingMatch[1];\n const rest = headingMatch[2] || \"\";\n const currentLevel = hashes.length;\n const newLevel = Math.min(6, Math.max(1, currentLevel + increment));\n\n return \"#\".repeat(newLevel) + rest;\n })\n .join(\"\\n\");\n}\n\n// =============================================================================\n// Rule parsing\n// =============================================================================\n\n/**\n * Parse markdown file content into a Rule object.\n *\n * @param content - Raw markdown file content\n * @param relativePath - Relative path from rules directory (e.g., \"security/api-auth.md\")\n * @returns Parsed Rule object\n */\nexport function parseRule(content: string, relativePath: string): Rule {\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Handle array-style paths in frontmatter\n // The simple parser may have issues with arrays, so let's re-parse specifically for paths\n if (frontmatter) {\n const pathsMatch = content.match(/^---\\r?\\n[\\s\\S]*?paths:\\s*\\n((?:\\s+-\\s+.+\\n?)+)/m);\n if (pathsMatch?.[1]) {\n const pathsContent = pathsMatch[1];\n const paths = pathsContent\n .split(\"\\n\")\n .filter((line) => line.trim().startsWith(\"-\"))\n .map((line) =>\n line\n .replace(/^\\s+-\\s+/, \"\")\n .replace(/^[\"']|[\"']$/g, \"\")\n .trim(),\n )\n .filter((p) => p.length > 0);\n if (paths.length > 0) {\n frontmatter.paths = paths;\n }\n }\n }\n\n return {\n relativePath,\n rawContent: content,\n frontmatter,\n body,\n };\n}\n\n// =============================================================================\n// Path comment generation\n// =============================================================================\n\n/**\n * Generates a comment describing the paths a rule applies to.\n * Only included if the rule has a `paths` frontmatter field.\n *\n * @param paths - Array of glob patterns\n * @returns HTML comment string or empty string if no paths\n */\nexport function generatePathsComment(paths: string[] | undefined): string {\n if (!paths || paths.length === 0) return \"\";\n\n // Single path\n if (paths.length === 1) {\n return `<!-- Applies to: ${paths[0]} -->`;\n }\n\n // Multiple paths\n return `<!-- Applies to:\\n${paths.map((p) => ` - ${p}`).join(\"\\n\")}\\n-->`;\n}\n\n// =============================================================================\n// Rules section generation (for Codex target)\n// =============================================================================\n\n/**\n * Generate the rules section for insertion into AGENTS.md.\n * This is used for Codex target which concatenates all rules into one section.\n *\n * @param rules - Array of Rule objects to include\n * @param markerPrefix - Prefix for marker comments (e.g., \"agent-conf\")\n * @returns Complete rules section with markers\n */\nexport function generateRulesSection(rules: Rule[], markerPrefix: string): string {\n // Sort rules alphabetically by path for deterministic output\n const sortedRules = [...rules].sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n\n // First, generate the content that will be hashed (excludes metadata comments)\n const contentParts: string[] = [];\n contentParts.push(\"# Project Rules\");\n contentParts.push(\"\");\n\n for (const rule of sortedRules) {\n contentParts.push(`<!-- Rule: ${rule.relativePath} -->`);\n\n if (rule.frontmatter?.paths && rule.frontmatter.paths.length > 0) {\n contentParts.push(generatePathsComment(rule.frontmatter.paths));\n }\n\n const adjustedBody = adjustHeadingLevels(rule.body.trim(), 1);\n contentParts.push(adjustedBody);\n contentParts.push(\"\");\n }\n\n // Compute hash of the content (same content that check will hash after stripping metadata)\n const contentForHash = contentParts.join(\"\\n\").trim();\n const hash = createHash(\"sha256\").update(contentForHash).digest(\"hex\");\n const contentHash = `sha256:${hash.slice(0, 12)}`;\n\n // Now build the full section with markers and metadata\n const parts: string[] = [];\n parts.push(`<!-- ${markerPrefix}:rules:start -->`);\n parts.push(`<!-- DO NOT EDIT THIS SECTION - Managed by agent-conf -->`);\n parts.push(`<!-- Content hash: ${contentHash} -->`);\n parts.push(`<!-- Rule count: ${rules.length} -->`);\n parts.push(\"\");\n parts.push(contentForHash);\n parts.push(\"\");\n parts.push(`<!-- ${markerPrefix}:rules:end -->`);\n\n return parts.join(\"\\n\");\n}\n\n// =============================================================================\n// AGENTS.md update\n// =============================================================================\n\n/**\n * Insert or replace the rules section in AGENTS.md content.\n *\n * Placement strategy:\n * 1. If rules markers exist: replace content between them\n * 2. If no rules markers but global:end exists: insert after global:end\n * 3. If no global:end but repo:start exists: insert before repo:start\n * 4. Otherwise: append at end\n *\n * @param agentsMdContent - Current AGENTS.md content\n * @param rulesSection - New rules section to insert\n * @param markerPrefix - Prefix for marker comments\n * @returns Updated AGENTS.md content\n */\nexport function updateAgentsMdWithRules(\n agentsMdContent: string,\n rulesSection: string,\n markerPrefix: string,\n): string {\n const rulesStartMarker = `<!-- ${markerPrefix}:rules:start -->`;\n const rulesEndMarker = `<!-- ${markerPrefix}:rules:end -->`;\n\n // Check if rules markers already exist\n const startIdx = agentsMdContent.indexOf(rulesStartMarker);\n const endIdx = agentsMdContent.indexOf(rulesEndMarker);\n\n if (startIdx !== -1 && endIdx !== -1) {\n // Replace existing rules section\n const before = agentsMdContent.slice(0, startIdx);\n const after = agentsMdContent.slice(endIdx + rulesEndMarker.length);\n return before + rulesSection + after;\n }\n\n // No existing rules section - find insertion point\n const globalEndMarker = `<!-- ${markerPrefix}:global:end -->`;\n const repoStartMarker = `<!-- ${markerPrefix}:repo:start -->`;\n\n // Try to insert between global end and repo start\n const globalEndIdx = agentsMdContent.indexOf(globalEndMarker);\n if (globalEndIdx !== -1) {\n const insertPoint = globalEndIdx + globalEndMarker.length;\n const before = agentsMdContent.slice(0, insertPoint);\n const after = agentsMdContent.slice(insertPoint);\n return `${before}\\n\\n${rulesSection}${after}`;\n }\n\n // No global section, try to insert before repo section\n const repoStartIdx = agentsMdContent.indexOf(repoStartMarker);\n if (repoStartIdx !== -1) {\n const before = agentsMdContent.slice(0, repoStartIdx);\n const after = agentsMdContent.slice(repoStartIdx);\n return `${before}${rulesSection}\\n\\n${after}`;\n }\n\n // No markers at all - append at end\n return `${agentsMdContent.trimEnd()}\\n\\n${rulesSection}\\n`;\n}\n\n// =============================================================================\n// Rule metadata (for Claude target)\n// =============================================================================\n\n/**\n * Add managed metadata to a rule file for Claude target.\n * This marks the file as managed by agent-conf and stores a content hash\n * for change detection.\n *\n * @param rule - The rule to add metadata to\n * @param metadataPrefix - Prefix for metadata keys (e.g., \"agent_conf\")\n * @returns Rule content with metadata frontmatter added\n */\nexport function addRuleMetadata(rule: Rule, metadataPrefix: string): string {\n const managedKey = `${metadataPrefix}_managed`;\n const hashKey = `${metadataPrefix}_content_hash`;\n const sourceKey = `${metadataPrefix}_source_path`;\n\n // Compute hash using the same function that check will use\n // This ensures hash consistency between sync and check operations\n // Convert underscore prefix to dash prefix for skill-metadata compatibility\n const hashMetadataPrefix = metadataPrefix.replace(/_/g, \"-\");\n const contentHash = computeSkillContentHash(rule.rawContent, {\n metadataPrefix: hashMetadataPrefix,\n });\n\n // Build new frontmatter\n const existingFrontmatter = rule.frontmatter || {};\n const existingMetadata = (existingFrontmatter.metadata as Record<string, string>) || {};\n\n const newMetadata: Record<string, string> = {\n ...existingMetadata,\n [managedKey]: \"true\",\n [hashKey]: contentHash,\n [sourceKey]: rule.relativePath,\n };\n\n // Build complete frontmatter, preserving other fields\n const newFrontmatter: RuleFrontmatter = {};\n\n // Copy non-metadata fields first (like paths)\n for (const [key, value] of Object.entries(existingFrontmatter)) {\n if (key !== \"metadata\") {\n newFrontmatter[key] = value;\n }\n }\n\n // Add metadata section\n newFrontmatter.metadata = newMetadata;\n\n // Serialize\n const yamlContent = serializeFrontmatter(newFrontmatter);\n return `---\\n${yamlContent}\\n---\\n${rule.body}`;\n}\n","export const SUPPORTED_TARGETS = [\"claude\", \"codex\"] as const;\nexport type Target = (typeof SUPPORTED_TARGETS)[number];\n\nexport interface TargetConfig {\n /** Directory name (e.g., \".claude\", \".codex\") */\n dir: string;\n /** Instructions file name if target needs one (only Claude uses this) */\n instructionsFile: string | null;\n}\n\nexport const TARGET_CONFIGS: Record<Target, TargetConfig> = {\n claude: {\n dir: \".claude\",\n instructionsFile: \"CLAUDE.md\",\n },\n codex: {\n dir: \".codex\",\n instructionsFile: null, // Codex reads AGENTS.md directly\n },\n};\n\nexport function isValidTarget(target: string): target is Target {\n return SUPPORTED_TARGETS.includes(target as Target);\n}\n\nexport function parseTargets(input: string[]): Target[] {\n const targets: Target[] = [];\n for (const t of input) {\n // Support comma-separated values\n const parts = t.split(\",\").map((p) => p.trim().toLowerCase());\n for (const part of parts) {\n if (!isValidTarget(part)) {\n throw new Error(\n `Invalid target \"${part}\". Supported targets: ${SUPPORTED_TARGETS.join(\", \")}`,\n );\n }\n if (!targets.includes(part)) {\n targets.push(part);\n }\n }\n }\n return targets.length > 0 ? targets : [\"claude\"];\n}\n\nexport function getTargetConfig(target: Target): TargetConfig {\n return TARGET_CONFIGS[target];\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { installPreCommitHook } from \"../core/hooks.js\";\nimport { readLockfile } from \"../core/lockfile.js\";\nimport { getModifiedManagedFiles } from \"../core/skill-metadata.js\";\nimport type { ResolvedSource } from \"../core/source.js\";\nimport { formatSourceString, resolveGithubSource, resolveLocalSource } from \"../core/source.js\";\nimport { deleteOrphanedSkills, findOrphanedSkills, type SyncStatus, sync } from \"../core/sync.js\";\nimport { getTargetConfig, parseTargets, SUPPORTED_TARGETS, type Target } from \"../core/targets.js\";\nimport {\n formatTag,\n getLatestRelease,\n isVersionRef,\n parseVersion,\n type ReleaseInfo,\n} from \"../core/version.js\";\nimport { syncWorkflows, type WorkflowSyncResult } from \"../core/workflows.js\";\nimport { createTempDir, removeTempDir, resolvePath } from \"../utils/fs.js\";\nimport { getGitRoot } from \"../utils/git.js\";\nimport { createLogger, formatPath } from \"../utils/logger.js\";\n\nexport interface SharedSyncOptions {\n source?: string;\n local?: string | boolean;\n yes?: boolean;\n override?: boolean;\n ref?: string;\n target?: string[];\n pinned?: boolean;\n summaryFile?: string;\n expandChanges?: boolean;\n}\n\nexport interface CommandContext {\n commandName: \"init\" | \"sync\";\n status: SyncStatus;\n}\n\nexport interface ResolvedVersion {\n ref: string; // The ref used for cloning (e.g., \"v1.2.0\" or \"master\")\n version: string | undefined; // The semantic version if ref is a release tag (e.g., \"1.2.0\")\n isRelease: boolean; // Whether this is a release version\n releaseInfo: ReleaseInfo | null; // Full release info if fetched\n}\n\nexport async function parseAndValidateTargets(\n targetOptions: string[] | undefined,\n): Promise<Target[]> {\n const logger = createLogger();\n try {\n return parseTargets(targetOptions ?? [\"claude\"]);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n logger.info(`Supported targets: ${SUPPORTED_TARGETS.join(\", \")}`);\n process.exit(1);\n }\n}\n\nexport async function resolveTargetDirectory(): Promise<string> {\n const logger = createLogger();\n const cwd = process.cwd();\n\n const gitRoot = await getGitRoot(cwd);\n if (!gitRoot) {\n logger.error(\n \"Not inside a git repository. Please run this command from within a git repository.\",\n );\n process.exit(1);\n }\n\n // If we're in a subdirectory, inform the user\n if (gitRoot !== cwd) {\n logger.info(`Syncing to repository root: ${formatPath(gitRoot)}`);\n }\n\n return gitRoot;\n}\n\n/**\n * Resolves the version to use for syncing.\n * - For init: fetches latest release if no ref specified\n * - For sync: uses lockfile version if no ref specified\n * - For explicit --ref: uses that ref\n *\n * @param repo - The repository to fetch releases from (only used for non-local sources)\n */\nexport async function resolveVersion(\n options: SharedSyncOptions,\n status: SyncStatus,\n _commandName: \"init\" | \"sync\",\n repo?: string,\n): Promise<ResolvedVersion> {\n const logger = createLogger();\n\n // If --local is used, no version management\n if (options.local !== undefined) {\n return {\n ref: \"local\",\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n\n // If explicit --ref is provided, use it\n if (options.ref) {\n if (isVersionRef(options.ref)) {\n return {\n ref: formatTag(options.ref),\n version: parseVersion(options.ref),\n isRelease: true,\n releaseInfo: null,\n };\n }\n // Branch ref\n return {\n ref: options.ref,\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n\n // If --pinned is specified, use lockfile version without fetching\n if (options.pinned) {\n if (!status.lockfile?.pinned_version) {\n logger.error(\"Cannot use --pinned: no version pinned in lockfile.\");\n process.exit(1);\n }\n const version = status.lockfile.pinned_version;\n return {\n ref: formatTag(version),\n version,\n isRelease: true,\n releaseInfo: null,\n };\n }\n\n // Default for both init and sync: fetch latest release\n // This requires a repo to be specified\n if (!repo) {\n // No repo means we can't fetch releases - use master as fallback\n logger.warn(\"No source repository specified. Using master branch.\");\n return {\n ref: \"master\",\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n\n const spinner = logger.spinner(\"Fetching latest release...\");\n spinner.start();\n\n try {\n const release = await getLatestRelease(repo);\n spinner.succeed(`Latest release: ${release.tag}`);\n return {\n ref: release.tag,\n version: release.version,\n isRelease: true,\n releaseInfo: release,\n };\n } catch {\n spinner.info(\"No releases found, using master branch\");\n return {\n ref: \"master\",\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n}\n\nexport async function resolveSource(\n options: SharedSyncOptions,\n resolvedVersion: ResolvedVersion,\n): Promise<{ resolvedSource: ResolvedSource; tempDir: string | null; repository: string }> {\n const logger = createLogger();\n let resolvedSource: ResolvedSource;\n let tempDir: string | null = null;\n\n const spinner = logger.spinner(\"Resolving source...\");\n\n try {\n if (options.local !== undefined) {\n spinner.start();\n const localSourceOptions =\n typeof options.local === \"string\" ? { path: resolvePath(options.local) } : {};\n resolvedSource = await resolveLocalSource(localSourceOptions);\n spinner.succeed(`Using local source: ${formatPath(resolvedSource.basePath)}`);\n // For local sources, repository is empty string (no GitHub repo)\n return { resolvedSource, tempDir, repository: \"\" };\n }\n\n // For GitHub sources, repository must be provided\n const repository = options.source;\n if (!repository) {\n spinner.fail(\"No canonical source specified\");\n logger.error(`No canonical source specified.\n\nSpecify a source using one of these methods:\n 1. CLI flag: agent-conf init --source acme/engineering-standards\n 2. Config file: Add 'source.repository' to .agent-conf.yaml\n\nExample .agent-conf.yaml:\n source:\n type: github\n repository: acme/engineering-standards`);\n process.exit(1);\n }\n\n spinner.start();\n tempDir = await createTempDir();\n const ref = resolvedVersion.ref;\n spinner.text = `Cloning ${repository}@${ref}...`;\n resolvedSource = await resolveGithubSource({ repository, ref }, tempDir);\n spinner.succeed(`Cloned from GitHub: ${formatSourceString(resolvedSource.source)}`);\n return { resolvedSource, tempDir, repository };\n } catch (error) {\n spinner.fail(\"Failed to resolve source\");\n logger.error(error instanceof Error ? error.message : String(error));\n if (tempDir) await removeTempDir(tempDir);\n process.exit(1);\n }\n}\n\nexport async function promptMergeOrOverride(\n status: SyncStatus,\n options: SharedSyncOptions,\n tempDir: string | null,\n): Promise<boolean> {\n let shouldOverride = options.override ?? false;\n\n // If the repo has already been synced, the AGENTS.md was created by agent-conf,\n // so we don't need to ask - just merge by default (unless --override is specified)\n if (status.hasSynced) {\n return shouldOverride;\n }\n\n if (status.agentsMdExists && !options.yes && !options.override) {\n const action = await prompts.select({\n message: \"An AGENTS.md file already exists. How would you like to proceed?\",\n options: [\n {\n value: \"merge\",\n label: \"Merge (recommended)\",\n hint: \"Preserves your existing content in a repository-specific block\",\n },\n {\n value: \"override\",\n label: \"Override\",\n hint: \"Replaces everything with fresh global standards\",\n },\n ],\n });\n\n if (prompts.isCancel(action)) {\n prompts.cancel(\"Operation cancelled\");\n if (tempDir) await removeTempDir(tempDir);\n process.exit(0);\n }\n\n shouldOverride = action === \"override\";\n }\n\n return shouldOverride;\n}\n\n/**\n * Check for manually modified managed files and warn/prompt the user.\n * Returns true if sync should proceed, false if cancelled.\n */\nexport async function checkModifiedFilesBeforeSync(\n targetDir: string,\n targets: Target[],\n options: SharedSyncOptions,\n tempDir: string | null,\n): Promise<boolean> {\n const modifiedFiles = await getModifiedManagedFiles(targetDir, targets);\n\n if (modifiedFiles.length === 0) {\n return true; // No modified files, proceed\n }\n\n const logger = createLogger();\n\n // Show warning about modified files\n console.log();\n console.log(pc.yellow(`⚠ ${modifiedFiles.length} managed file(s) have been manually modified:`));\n for (const file of modifiedFiles) {\n const label = file.type === \"agents\" ? \"(global block)\" : \"\";\n console.log(` ${pc.yellow(\"~\")} ${file.path} ${pc.dim(label)}`);\n }\n console.log();\n\n // In non-interactive mode, just warn and proceed\n if (options.yes) {\n logger.warn(\"Proceeding with sync (--yes flag). Modified files will be overwritten.\");\n return true;\n }\n\n // Ask for confirmation\n const proceed = await prompts.confirm({\n message: \"These files will be overwritten. Continue with sync?\",\n initialValue: false,\n });\n\n if (prompts.isCancel(proceed) || !proceed) {\n prompts.cancel(\"Sync cancelled. Your modified files were preserved.\");\n if (tempDir) await removeTempDir(tempDir);\n process.exit(0);\n }\n\n return true;\n}\n\nexport interface PerformSyncOptions {\n targetDir: string;\n resolvedSource: ResolvedSource;\n resolvedVersion: ResolvedVersion;\n shouldOverride: boolean;\n targets: Target[];\n context: CommandContext;\n tempDir: string | null;\n yes?: boolean | undefined;\n /** Source repository in owner/repo format (for GitHub sources) */\n sourceRepo?: string;\n /** Write markdown summary to this file (for CI PR descriptions) */\n summaryFile?: string | undefined;\n /** Show all items instead of truncating (skills, rules, hooks, etc.) */\n expandChanges?: boolean | undefined;\n}\n\nexport async function performSync(options: PerformSyncOptions): Promise<void> {\n const { targetDir, resolvedSource, resolvedVersion, shouldOverride, targets, context, tempDir } =\n options;\n\n const logger = createLogger();\n\n // Read previous lockfile to detect orphaned skills/rules later\n const previousLockfileResult = await readLockfile(targetDir);\n const previousSkills = previousLockfileResult?.lockfile.content.skills ?? [];\n const previousRules = previousLockfileResult?.lockfile.content.rules?.files ?? [];\n const previousTargets = previousLockfileResult?.lockfile.content.targets ?? [\"claude\"];\n\n const syncSpinner = logger.spinner(\"Syncing...\");\n syncSpinner.start();\n\n try {\n const syncOptions: Parameters<typeof sync>[2] = {\n override: shouldOverride,\n targets,\n };\n if (resolvedVersion.version) {\n syncOptions.pinnedVersion = resolvedVersion.version;\n }\n const result = await sync(targetDir, resolvedSource, syncOptions);\n syncSpinner.stop();\n\n // Detect and handle orphaned skills\n const orphanedSkills = findOrphanedSkills(previousSkills, result.skills.synced);\n let orphanResult: { deleted: string[]; skipped: string[] } = { deleted: [], skipped: [] };\n\n if (orphanedSkills.length > 0) {\n // Determine which targets to check (union of previous and current)\n const allTargets = [...new Set([...previousTargets, ...targets])];\n\n if (options.yes) {\n // Non-interactive mode: delete by default\n orphanResult = await deleteOrphanedSkills(\n targetDir,\n orphanedSkills,\n allTargets,\n previousSkills,\n );\n } else {\n // Interactive mode: prompt user\n console.log();\n console.log(\n pc.yellow(\n `⚠ ${orphanedSkills.length} skill(s) were previously synced but are no longer in the source:`,\n ),\n );\n for (const skill of orphanedSkills) {\n console.log(` ${pc.yellow(\"·\")} ${skill}`);\n }\n console.log();\n\n const deleteOrphans = await prompts.confirm({\n message: \"Delete these orphaned skills?\",\n initialValue: true,\n });\n\n if (prompts.isCancel(deleteOrphans)) {\n // User cancelled, skip deletion but continue with sync summary\n logger.info(\"Skipping orphan deletion.\");\n } else if (deleteOrphans) {\n orphanResult = await deleteOrphanedSkills(\n targetDir,\n orphanedSkills,\n allTargets,\n previousSkills,\n );\n }\n }\n }\n\n // Show validation errors if any\n if (result.skills.validationErrors.length > 0) {\n console.log();\n console.log(\n pc.yellow(`⚠ ${result.skills.validationErrors.length} skill(s) have invalid frontmatter:`),\n );\n for (const error of result.skills.validationErrors) {\n console.log(` ${pc.yellow(\"!\")} ${error.skillName}/SKILL.md`);\n for (const msg of error.errors) {\n console.log(` ${pc.dim(\"-\")} ${msg}`);\n }\n }\n console.log();\n console.log(pc.dim(\"Skills must have frontmatter with 'name' and 'description' fields.\"));\n }\n\n // Sync workflow files for GitHub sources only (not local)\n // Workflows reference the same ref that was used for syncing\n let workflowResult: WorkflowSyncResult | null = null;\n if (resolvedVersion.ref !== \"local\" && options.sourceRepo) {\n const workflowSpinner = logger.spinner(\"Syncing workflow files...\");\n workflowSpinner.start();\n // Use the version tag if it's a release, otherwise use the ref directly\n const workflowRef =\n resolvedVersion.isRelease && resolvedVersion.version\n ? formatTag(resolvedVersion.version)\n : resolvedVersion.ref;\n workflowResult = await syncWorkflows(targetDir, workflowRef, options.sourceRepo);\n workflowSpinner.stop();\n }\n\n // Install git hooks\n const hookResult = await installPreCommitHook(targetDir);\n\n // Build summary lines for both console and markdown file\n const summaryLines: string[] = [];\n\n // Summary header\n console.log();\n console.log(pc.bold(\"Sync complete:\"));\n console.log();\n\n // AGENTS.md status\n const agentsMdPath = formatPath(path.join(targetDir, \"AGENTS.md\"));\n if (result.agentsMd.merged) {\n const label = context.commandName === \"sync\" ? \"(updated)\" : \"(merged)\";\n console.log(` ${pc.green(\"+\")} ${agentsMdPath} ${pc.dim(label)}`);\n summaryLines.push(`- \\`AGENTS.md\\` ${label}`);\n } else {\n console.log(` ${pc.green(\"+\")} ${agentsMdPath} ${pc.dim(\"(created)\")}`);\n summaryLines.push(\"- `AGENTS.md` (created)\");\n }\n\n // Per-target results\n for (const targetResult of result.targets) {\n const config = getTargetConfig(targetResult.target);\n\n // Instructions file status (only for targets that use one, like Claude)\n if (config.instructionsFile) {\n const instructionsPath =\n targetResult.instructionsMd.location === \"root\"\n ? formatPath(path.join(targetDir, config.instructionsFile))\n : formatPath(path.join(targetDir, config.dir, config.instructionsFile));\n\n const instructionsRelPath =\n targetResult.instructionsMd.location === \"root\"\n ? config.instructionsFile\n : `${config.dir}/${config.instructionsFile}`;\n\n if (targetResult.instructionsMd.created) {\n console.log(` ${pc.green(\"+\")} ${instructionsPath} ${pc.dim(\"(created)\")}`);\n summaryLines.push(`- \\`${instructionsRelPath}\\` (created)`);\n } else if (targetResult.instructionsMd.updated) {\n const hint = targetResult.instructionsMd.contentMerged\n ? \"(content merged into AGENTS.md, reference added)\"\n : \"(reference added)\";\n console.log(` ${pc.yellow(\"~\")} ${instructionsPath} ${pc.dim(hint)}`);\n summaryLines.push(`- \\`${instructionsRelPath}\\` ${hint}`);\n } else {\n console.log(` ${pc.dim(\"-\")} ${instructionsPath} ${pc.dim(\"(unchanged)\")}`);\n summaryLines.push(`- \\`${instructionsRelPath}\\` (unchanged)`);\n }\n }\n\n // Skills status for this target\n const skillsPath = formatPath(path.join(targetDir, config.dir, \"skills\"));\n const skillsRelPath = `${config.dir}/skills/`;\n\n // Compute new vs actually modified skills\n const newSkills = result.skills.synced.filter((s) => !previousSkills.includes(s)).sort();\n // Only show as \"updated\" if content actually changed (not just re-synced)\n const updatedSkills = result.skills.modified.filter((s) => previousSkills.includes(s)).sort();\n const removedSkills = orphanResult.deleted.sort();\n\n // Determine if skills had any changes\n const skillsHadChanges =\n newSkills.length > 0 || updatedSkills.length > 0 || removedSkills.length > 0;\n const skillsStatusIcon = skillsHadChanges ? pc.green(\"+\") : pc.dim(\"-\");\n const skillsStatusLabel = skillsHadChanges ? \"(updated)\" : \"(unchanged)\";\n\n // Summary line for skills directory\n console.log(\n ` ${skillsStatusIcon} ${skillsPath}/ ${pc.dim(`(total: ${result.skills.synced.length} skills, ${targetResult.skills.copied} files) ${skillsStatusLabel}`)}`,\n );\n summaryLines.push(\n `- \\`${skillsRelPath}\\` (total: ${result.skills.synced.length} skills, ${targetResult.skills.copied} files) ${skillsStatusLabel}`,\n );\n\n // Helper to display skill list with truncation\n const MAX_ITEMS_DEFAULT = 5;\n const shouldExpand = options.expandChanges === true;\n\n const formatSkillList = (\n skills: string[],\n icon: string,\n colorFn: (s: string) => string,\n label: string,\n mdLabel: string,\n ) => {\n if (skills.length === 0) return;\n\n const maxDisplay = shouldExpand ? skills.length : MAX_ITEMS_DEFAULT;\n const displaySkills = skills.slice(0, maxDisplay);\n const hiddenCount = skills.length - displaySkills.length;\n\n for (const skill of displaySkills) {\n const skillPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n const skillRelPath = `${config.dir}/skills/${skill}/`;\n console.log(` ${colorFn(icon)} ${skillPath}/ ${pc.dim(`(${label})`)}`);\n summaryLines.push(` - \\`${skillRelPath}\\` (${mdLabel})`);\n }\n\n if (hiddenCount > 0) {\n console.log(` ${pc.dim(` ... ${hiddenCount} more ${label}`)}`);\n summaryLines.push(` - ... ${hiddenCount} more ${mdLabel}`);\n }\n };\n\n // Show new skills\n formatSkillList(newSkills, \"+\", pc.green, \"new\", \"new\");\n\n // Show updated skills\n formatSkillList(updatedSkills, \"~\", pc.yellow, \"updated\", \"updated\");\n\n // Show removed skills\n for (const skill of removedSkills) {\n const orphanPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n const orphanRelPath = `${config.dir}/skills/${skill}/`;\n console.log(` ${pc.red(\"-\")} ${orphanPath}/ ${pc.dim(\"(removed)\")}`);\n summaryLines.push(` - \\`${orphanRelPath}\\` (removed)`);\n }\n\n // Show skipped orphans\n if (orphanResult.skipped.length > 0) {\n for (const skill of orphanResult.skipped) {\n const orphanPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n const orphanRelPath = `${config.dir}/skills/${skill}/`;\n console.log(` ${pc.yellow(\"!\")} ${orphanPath}/ ${pc.dim(\"(orphaned but skipped)\")}`);\n summaryLines.push(` - \\`${orphanRelPath}\\` (orphaned but skipped)`);\n }\n }\n\n // Rules status for Claude target\n if (result.rules && result.rules.claudeFiles.length > 0 && targetResult.target === \"claude\") {\n const rulesPath = formatPath(path.join(targetDir, config.dir, \"rules\"));\n const rulesRelPath = `${config.dir}/rules/`;\n const rulesCount = result.rules.claudeFiles.length;\n\n // Compute new vs actually modified rules\n const newRules = result.rules.synced.filter((r) => !previousRules.includes(r)).sort();\n // Only show as \"updated\" if content actually changed (not just re-synced)\n const updatedRules = result.rules.modified.filter((r) => previousRules.includes(r)).sort();\n\n // Determine if rules had any changes\n const rulesHadChanges = newRules.length > 0 || updatedRules.length > 0;\n const rulesStatusIcon = rulesHadChanges ? pc.green(\"+\") : pc.dim(\"-\");\n const rulesStatusLabel = rulesHadChanges ? \"(updated)\" : \"(unchanged)\";\n\n console.log(\n ` ${rulesStatusIcon} ${rulesPath}/ ${pc.dim(`(total: ${rulesCount} rules) ${rulesStatusLabel}`)}`,\n );\n summaryLines.push(`- \\`${rulesRelPath}\\` (total: ${rulesCount} rules) ${rulesStatusLabel}`);\n\n // Helper to display rule list with truncation\n const formatRuleList = (\n rules: string[],\n icon: string,\n colorFn: (s: string) => string,\n label: string,\n mdLabel: string,\n ) => {\n if (rules.length === 0) return;\n\n const maxDisplay = shouldExpand ? rules.length : MAX_ITEMS_DEFAULT;\n const displayRules = rules.slice(0, maxDisplay);\n const hiddenCount = rules.length - displayRules.length;\n\n for (const rule of displayRules) {\n const rulePath = formatPath(path.join(targetDir, config.dir, \"rules\", rule));\n const ruleRelPath = `${config.dir}/rules/${rule}`;\n console.log(` ${colorFn(icon)} ${rulePath} ${pc.dim(`(${label})`)}`);\n summaryLines.push(` - \\`${ruleRelPath}\\` (${mdLabel})`);\n }\n\n if (hiddenCount > 0) {\n console.log(` ${pc.dim(` ... ${hiddenCount} more ${label}`)}`);\n summaryLines.push(` - ... ${hiddenCount} more ${mdLabel}`);\n }\n };\n\n // Show new rules\n formatRuleList(newRules, \"+\", pc.green, \"new\", \"new\");\n\n // Show updated rules\n formatRuleList(updatedRules, \"~\", pc.yellow, \"updated\", \"updated\");\n }\n\n // Rules status for Codex target (concatenated into AGENTS.md)\n if (result.rules?.codexUpdated && targetResult.target === \"codex\") {\n const rulesCount = result.rules.synced.length;\n console.log(\n ` ${pc.green(\"+\")} ${pc.dim(\"AGENTS.md rules section\")} ${pc.dim(`(total: ${rulesCount} rules concatenated) (updated)`)}`,\n );\n summaryLines.push(\n `- AGENTS.md rules section (total: ${rulesCount} rules concatenated) (updated)`,\n );\n\n // Compute new vs actually modified rules for Codex\n const newRules = result.rules.synced.filter((r) => !previousRules.includes(r)).sort();\n // Only show as \"updated\" if content actually changed (not just re-synced)\n const updatedRules = result.rules.modified.filter((r) => previousRules.includes(r)).sort();\n\n // Helper to display rule list with truncation (Codex version - no file paths)\n const formatCodexRuleList = (\n rules: string[],\n icon: string,\n colorFn: (s: string) => string,\n label: string,\n mdLabel: string,\n ) => {\n if (rules.length === 0) return;\n\n const maxDisplay = shouldExpand ? rules.length : MAX_ITEMS_DEFAULT;\n const displayRules = rules.slice(0, maxDisplay);\n const hiddenCount = rules.length - displayRules.length;\n\n for (const rule of displayRules) {\n console.log(` ${colorFn(icon)} ${rule} ${pc.dim(`(${label})`)}`);\n summaryLines.push(` - \\`${rule}\\` (${mdLabel})`);\n }\n\n if (hiddenCount > 0) {\n console.log(` ${pc.dim(` ... ${hiddenCount} more ${label}`)}`);\n summaryLines.push(` - ... ${hiddenCount} more ${mdLabel}`);\n }\n };\n\n // Show new rules\n formatCodexRuleList(newRules, \"+\", pc.green, \"new\", \"new\");\n\n // Show updated rules\n formatCodexRuleList(updatedRules, \"~\", pc.yellow, \"updated\", \"updated\");\n }\n }\n\n // Workflow files status\n if (workflowResult) {\n for (const filename of workflowResult.created) {\n const workflowPath = formatPath(path.join(targetDir, \".github/workflows\", filename));\n console.log(` ${pc.green(\"+\")} ${workflowPath} ${pc.dim(\"(created)\")}`);\n summaryLines.push(`- \\`.github/workflows/${filename}\\` (created)`);\n }\n for (const filename of workflowResult.updated) {\n const workflowPath = formatPath(path.join(targetDir, \".github/workflows\", filename));\n console.log(` ${pc.yellow(\"~\")} ${workflowPath} ${pc.dim(\"(updated)\")}`);\n summaryLines.push(`- \\`.github/workflows/${filename}\\` (updated)`);\n }\n for (const filename of workflowResult.unchanged) {\n const workflowPath = formatPath(path.join(targetDir, \".github/workflows\", filename));\n console.log(` ${pc.dim(\"-\")} ${workflowPath} ${pc.dim(\"(unchanged)\")}`);\n summaryLines.push(`- \\`.github/workflows/${filename}\\` (unchanged)`);\n }\n }\n\n // Lockfile status\n const lockfilePath = formatPath(path.join(targetDir, \".agent-conf\", \"agent-conf.lock\"));\n console.log(` ${pc.green(\"+\")} ${lockfilePath}`);\n summaryLines.push(\"- `.agent-conf/lockfile.json` (updated)\");\n\n // Git hook status\n const hookPath = formatPath(path.join(targetDir, \".git/hooks/pre-commit\"));\n if (hookResult.installed) {\n if (hookResult.alreadyExisted && !hookResult.wasUpdated) {\n console.log(` ${pc.dim(\"-\")} ${hookPath} ${pc.dim(\"(unchanged)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (unchanged)\");\n } else if (hookResult.wasUpdated) {\n console.log(` ${pc.yellow(\"~\")} ${hookPath} ${pc.dim(\"(updated)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (updated)\");\n } else {\n console.log(` ${pc.green(\"+\")} ${hookPath} ${pc.dim(\"(installed)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (installed)\");\n }\n } else if (hookResult.alreadyExisted) {\n console.log(` ${pc.yellow(\"!\")} ${hookPath} ${pc.dim(\"(skipped - custom hook exists)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (skipped - custom hook exists)\");\n }\n\n console.log();\n console.log(pc.dim(`Source: ${formatSourceString(resolvedSource.source)}`));\n if (resolvedVersion.version) {\n console.log(pc.dim(`Version: ${resolvedVersion.version}`));\n }\n if (targets.length > 1) {\n console.log(pc.dim(`Targets: ${targets.join(\", \")}`));\n }\n\n // Write summary file if requested (for CI PR descriptions)\n if (options.summaryFile) {\n const sourceStr = formatSourceString(resolvedSource.source);\n const versionStr = resolvedVersion.version\n ? `v${resolvedVersion.version}`\n : resolvedVersion.ref;\n const summary = `## Changes\n\n${summaryLines.join(\"\\n\")}\n\n---\n**Source:** ${sourceStr}\n**Version:** ${versionStr}\n`;\n await fs.writeFile(options.summaryFile, summary, \"utf-8\");\n }\n\n prompts.outro(pc.green(\"Done!\"));\n } catch (error) {\n syncSpinner.fail(\"Sync failed\");\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n } finally {\n if (tempDir) await removeTempDir(tempDir);\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ResolvedConfig } from \"../config/schema.js\";\n\n// Default values for hook configuration\nconst DEFAULT_CLI_NAME = \"agent-conf\";\nconst DEFAULT_CONFIG_DIR = \".agent-conf\";\nconst DEFAULT_LOCKFILE_NAME = \"lockfile.json\";\n\n// Hook identifier for detecting managed hooks\nconst HOOK_IDENTIFIER = \"# agent-conf pre-commit hook\";\n\n/**\n * Configuration for hook generation.\n */\nexport interface HookConfig {\n /** CLI command name (e.g., \"agent-conf\") */\n cliName: string;\n /** Config directory name (e.g., \".agent-conf\") */\n configDir: string;\n /** Lockfile name (e.g., \"lockfile.json\") */\n lockfileName: string;\n}\n\n/**\n * Generate pre-commit hook content with configurable names.\n */\nexport function generatePreCommitHook(config: HookConfig): string {\n const { cliName, configDir, lockfileName } = config;\n\n return `#!/bin/bash\n# ${cliName} pre-commit hook\n# Prevents committing changes to managed files (skills and AGENTS.md global block)\n#\n# Installation:\n# Copy this file to .git/hooks/pre-commit\n# Or run: ${cliName} hooks install\n\nset -e\n\n# Get the repository root\nREPO_ROOT=$(git rev-parse --show-toplevel)\n\n# Check if ${cliName} has been synced\nif [ ! -f \"$REPO_ROOT/${configDir}/${lockfileName}\" ]; then\n # Not synced, nothing to check\n exit 0\nfi\n\n# Check if ${cliName} CLI is available\nif ! command -v ${cliName} &> /dev/null; then\n # CLI not installed, skip check\n exit 0\nfi\n\n# Run ${cliName} check and capture output\ncd \"$REPO_ROOT\"\nCHECK_OUTPUT=$(${cliName} check 2>&1) || CHECK_EXIT=$?\nCHECK_EXIT=\\${CHECK_EXIT:-0}\n\nif [ $CHECK_EXIT -ne 0 ]; then\n echo \"\"\n echo \"Error: Cannot commit changes to ${cliName}-managed files\"\n echo \"\"\n echo \"Output from '${cliName} check' command:\"\n echo \"$CHECK_OUTPUT\"\n echo \"\"\n echo \"Options:\"\n echo \" 1. Discard your changes: git checkout -- <file>\"\n echo \" 2. Skip this check: git commit --no-verify\"\n echo \" 3. Restore managed files: ${cliName} sync\"\n echo \" 4. For AGENTS.md: edit only the repo-specific block (between repo:start and repo:end)\"\n echo \" 5. For skills: create a new custom skill instead\"\n echo \"\"\n exit 1\nfi\n\nexit 0\n`;\n}\n\n/**\n * Get hook config from resolved config or use defaults.\n */\nexport function getHookConfig(config?: Partial<ResolvedConfig>): HookConfig {\n return {\n cliName: config?.cliName ?? DEFAULT_CLI_NAME,\n configDir: config?.configDir ?? DEFAULT_CONFIG_DIR,\n lockfileName: config?.lockfileName ?? DEFAULT_LOCKFILE_NAME,\n };\n}\n\nexport interface HookInstallResult {\n installed: boolean;\n path: string;\n alreadyExisted: boolean;\n wasUpdated: boolean;\n}\n\n/**\n * Install the pre-commit hook in a git repository.\n * If a pre-commit hook already exists and is not from agent-conf, it will not be overwritten.\n */\nexport async function installPreCommitHook(\n targetDir: string,\n config?: Partial<ResolvedConfig>,\n): Promise<HookInstallResult> {\n const hookConfig = getHookConfig(config);\n const hooksDir = path.join(targetDir, \".git\", \"hooks\");\n const hookPath = path.join(hooksDir, \"pre-commit\");\n\n // Generate hook content\n const hookContent = generatePreCommitHook(hookConfig);\n\n // Ensure hooks directory exists\n await fs.mkdir(hooksDir, { recursive: true });\n\n // Check if hook already exists\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(hookPath, \"utf-8\");\n } catch {\n // Expected: hook file doesn't exist yet\n }\n\n if (existingContent !== null) {\n // Check if it's our hook (contains our identifier)\n const isOurHook = existingContent.includes(HOOK_IDENTIFIER);\n\n if (!isOurHook) {\n // Not our hook, don't overwrite\n return {\n installed: false,\n path: hookPath,\n alreadyExisted: true,\n wasUpdated: false,\n };\n }\n\n // Check if content is the same\n if (existingContent === hookContent) {\n return {\n installed: true,\n path: hookPath,\n alreadyExisted: true,\n wasUpdated: false,\n };\n }\n\n // Our hook but outdated, update it\n await fs.writeFile(hookPath, hookContent, { mode: 0o755 });\n return {\n installed: true,\n path: hookPath,\n alreadyExisted: true,\n wasUpdated: true,\n };\n }\n\n // Install new hook\n await fs.writeFile(hookPath, hookContent, { mode: 0o755 });\n return {\n installed: true,\n path: hookPath,\n alreadyExisted: false,\n wasUpdated: false,\n };\n}\n","import { exec } from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { type SimpleGit, simpleGit } from \"simple-git\";\nimport { loadCanonicalRepoConfig } from \"../config/loader.js\";\nimport type { Source } from \"../schemas/lockfile.js\";\n\nconst execAsync = promisify(exec);\n\nexport interface ResolvedSource {\n source: Source;\n basePath: string;\n agentsMdPath: string;\n skillsPath: string;\n /** Path to rules directory (null if no rules_dir configured) */\n rulesPath: string | null;\n /** Marker prefix from canonical config (default: \"agent-conf\") */\n markerPrefix: string;\n}\n\nexport interface LocalSourceOptions {\n path?: string;\n}\n\nexport interface GithubSourceOptions {\n repository: string;\n ref: string;\n}\n\nconst DEFAULT_REF = \"master\";\n\nexport async function resolveLocalSource(\n options: LocalSourceOptions = {},\n): Promise<ResolvedSource> {\n let basePath: string;\n\n if (options.path) {\n basePath = path.resolve(options.path);\n } else {\n basePath = await findCanonicalRepo(process.cwd());\n }\n\n await validateCanonicalRepo(basePath);\n\n const git: SimpleGit = simpleGit(basePath);\n let commitSha: string | undefined;\n\n try {\n const log = await git.log({ maxCount: 1 });\n commitSha = log.latest?.hash;\n } catch {\n // Expected: not a git repo or git not available, commit SHA is optional\n }\n\n // Load canonical config to get marker prefix and rules_dir\n const canonicalConfig = await loadCanonicalRepoConfig(basePath);\n const markerPrefix = canonicalConfig?.markers.prefix ?? \"agent-conf\";\n const rulesDir = canonicalConfig?.content.rules_dir;\n\n const source: Source = {\n type: \"local\",\n path: basePath,\n commit_sha: commitSha,\n };\n\n return {\n source,\n basePath,\n agentsMdPath: path.join(basePath, \"instructions\", \"AGENTS.md\"),\n skillsPath: path.join(basePath, \"skills\"),\n rulesPath: rulesDir ? path.join(basePath, rulesDir) : null,\n markerPrefix,\n };\n}\n\nexport async function resolveGithubSource(\n options: GithubSourceOptions,\n tempDir: string,\n): Promise<ResolvedSource> {\n const { repository, ref = DEFAULT_REF } = options;\n\n await cloneRepository(repository, ref, tempDir);\n\n const clonedGit: SimpleGit = simpleGit(tempDir);\n const log = await clonedGit.log({ maxCount: 1 });\n const commitSha = log.latest?.hash ?? \"\";\n\n // Load canonical config to get marker prefix and rules_dir\n const canonicalConfig = await loadCanonicalRepoConfig(tempDir);\n const markerPrefix = canonicalConfig?.markers.prefix ?? \"agent-conf\";\n const rulesDir = canonicalConfig?.content.rules_dir;\n\n const source: Source = {\n type: \"github\",\n repository,\n commit_sha: commitSha,\n ref,\n };\n\n return {\n source,\n basePath: tempDir,\n agentsMdPath: path.join(tempDir, \"instructions\", \"AGENTS.md\"),\n skillsPath: path.join(tempDir, \"skills\"),\n rulesPath: rulesDir ? path.join(tempDir, rulesDir) : null,\n markerPrefix,\n };\n}\n\n/**\n * Clone a repository using the best available method.\n * Tries in order: gh CLI, HTTPS with token, plain HTTPS.\n */\nasync function cloneRepository(repository: string, ref: string, tempDir: string): Promise<void> {\n // Try gh CLI first (handles auth automatically in CI)\n if (await isGhAvailable()) {\n try {\n await execAsync(`gh repo clone ${repository} ${tempDir} -- --depth 1 --branch ${ref}`);\n return;\n } catch {\n // Expected: gh clone may fail, fall back to git with token auth\n }\n }\n\n // Fall back to git with GITHUB_TOKEN authentication\n const token = process.env.GITHUB_TOKEN;\n const repoUrl = token\n ? `https://x-access-token:${token}@github.com/${repository}.git`\n : `https://github.com/${repository}.git`;\n\n const git: SimpleGit = simpleGit();\n await git.clone(repoUrl, tempDir, [\"--depth\", \"1\", \"--branch\", ref]);\n}\n\n/**\n * Check if gh CLI is available.\n */\nasync function isGhAvailable(): Promise<boolean> {\n try {\n await execAsync(\"gh --version\");\n return true;\n } catch {\n // Expected: gh CLI not installed\n return false;\n }\n}\n\nasync function findCanonicalRepo(startDir: string): Promise<string> {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n // First, check if we're already inside the agent-conf repo\n let checkDir = currentDir;\n while (checkDir !== root) {\n if (await isCanonicalRepo(checkDir)) {\n return checkDir;\n }\n checkDir = path.dirname(checkDir);\n }\n\n // Otherwise, look for a sibling \"agent-conf\" directory\n currentDir = path.resolve(startDir);\n while (currentDir !== root) {\n const parentDir = path.dirname(currentDir);\n const siblingCanonicalRepo = path.join(parentDir, \"agent-conf\");\n\n if (await isCanonicalRepo(siblingCanonicalRepo)) {\n return siblingCanonicalRepo;\n }\n\n currentDir = parentDir;\n }\n\n throw new Error(\n \"Could not find canonical repository. Please specify --local <path> or run from within the canonical repo.\",\n );\n}\n\nasync function isCanonicalRepo(dir: string): Promise<boolean> {\n try {\n // Check directory exists\n const stat = await fs.stat(dir).catch(() => null);\n if (!stat?.isDirectory()) {\n return false;\n }\n\n // Check for agent-conf structure\n const instructionsPath = path.join(dir, \"instructions\", \"AGENTS.md\");\n const skillsPath = path.join(dir, \"skills\");\n\n const [instructionsExists, skillsExists] = await Promise.all([\n fs\n .access(instructionsPath)\n .then(() => true)\n .catch(() => false),\n fs\n .access(skillsPath)\n .then(() => true)\n .catch(() => false),\n ]);\n\n if (!instructionsExists || !skillsExists) {\n return false;\n }\n\n // Optionally verify git remote contains \"agent-conf\"\n try {\n const git: SimpleGit = simpleGit(dir);\n const remotes = await git.getRemotes(true);\n const hasMatchingRemote = remotes.some(\n (r) => r.refs.fetch?.includes(\"agent-conf\") || r.refs.push?.includes(\"agent-conf\"),\n );\n if (hasMatchingRemote) {\n return true;\n }\n } catch {\n // Expected: git check may fail, fall back to structure check only\n }\n\n // Structure matches, accept it even without git verification\n return true;\n } catch {\n // Expected: directory access or structure check failed\n return false;\n }\n}\n\nasync function validateCanonicalRepo(basePath: string): Promise<void> {\n const agentsMdPath = path.join(basePath, \"instructions\", \"AGENTS.md\");\n const skillsPath = path.join(basePath, \"skills\");\n\n const [agentsMdExists, skillsExists] = await Promise.all([\n fs\n .access(agentsMdPath)\n .then(() => true)\n .catch(() => false),\n fs\n .access(skillsPath)\n .then(() => true)\n .catch(() => false),\n ]);\n\n if (!agentsMdExists) {\n throw new Error(`Invalid canonical repository: missing instructions/AGENTS.md at ${basePath}`);\n }\n\n if (!skillsExists) {\n throw new Error(`Invalid canonical repository: missing skills/ directory at ${basePath}`);\n }\n}\n\nexport function formatSourceString(source: Source): string {\n if (source.type === \"github\") {\n const sha = source.commit_sha.slice(0, 7);\n return `github:${source.repository}@${sha}`;\n }\n if (source.commit_sha) {\n return `local:${source.path}@${source.commit_sha.slice(0, 7)}`;\n }\n return `local:${source.path}`;\n}\n\nexport function getDefaultRef(): string {\n return DEFAULT_REF;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { type CanonicalRepoConfig, CanonicalRepoConfigSchema } from \"./schema.js\";\n\n// Config file names\nconst CANONICAL_REPO_CONFIG = \"agent-conf.yaml\";\n\n/**\n * Load canonical repository config (agent-conf.yaml).\n * Returns undefined if file doesn't exist.\n */\nexport async function loadCanonicalRepoConfig(\n basePath: string,\n): Promise<CanonicalRepoConfig | undefined> {\n const configPath = path.join(basePath, CANONICAL_REPO_CONFIG);\n\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n const parsed = parseYaml(content);\n return CanonicalRepoConfigSchema.parse(parsed);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw new Error(`Failed to load ${CANONICAL_REPO_CONFIG}: ${error}`);\n }\n}\n\n// Type guard for Node.js errors with code property\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","/**\n * Version resolution and management for agent-conf releases.\n *\n * Handles fetching release information from GitHub, parsing version strings,\n * and determining the appropriate version to use.\n */\n\nimport { execSync } from \"node:child_process\";\n\nconst GITHUB_API_BASE = \"https://api.github.com\";\n\n/**\n * Gets a GitHub token for API authentication.\n * Tries in order:\n * 1. GITHUB_TOKEN environment variable\n * 2. gh auth token (if gh CLI is installed)\n * Throws an error if no token is available.\n */\nfunction getGitHubToken(): string {\n // First try environment variable\n if (process.env.GITHUB_TOKEN) {\n return process.env.GITHUB_TOKEN;\n }\n\n // Try gh CLI\n try {\n const token = execSync(\"gh auth token\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (token) {\n return token;\n }\n } catch {\n // Expected: gh CLI not installed or not authenticated\n }\n\n throw new Error(\n `GitHub authentication required to access agent-conf releases.\n\nTo fix this, do one of the following:\n\n1. Install and authenticate GitHub CLI (recommended):\n brew install gh\n gh auth login\n\n2. Set GITHUB_TOKEN environment variable:\n export GITHUB_TOKEN=<your-personal-access-token>\n\n Create a token at https://github.com/settings/tokens\n with 'repo' scope for private repository access.`,\n );\n}\n\n/**\n * Builds headers for GitHub API requests.\n * Includes Authorization header with required token.\n */\nfunction getGitHubHeaders(): Record<string, string> {\n const token = getGitHubToken();\n return {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"agent-conf-cli\",\n Authorization: `token ${token}`,\n };\n}\n\nexport interface ReleaseInfo {\n tag: string; // e.g., \"v1.2.0\"\n version: string; // e.g., \"1.2.0\" (without 'v' prefix)\n commitSha: string;\n publishedAt: string;\n tarballUrl: string;\n}\n\n/**\n * Fetches the latest release from a GitHub repository.\n */\nexport async function getLatestRelease(repo: string): Promise<ReleaseInfo> {\n const url = `${GITHUB_API_BASE}/repos/${repo}/releases/latest`;\n\n const response = await fetch(url, {\n headers: getGitHubHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\"No releases found for agent-conf repository\");\n }\n throw new Error(`Failed to fetch latest release: ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return parseReleaseResponse(data as Record<string, unknown>);\n}\n\n/**\n * Fetches a specific release by tag from a GitHub repository.\n */\nexport async function getReleaseByTag(repo: string, tag: string): Promise<ReleaseInfo> {\n // Ensure tag has 'v' prefix\n const normalizedTag = tag.startsWith(\"v\") ? tag : `v${tag}`;\n const url = `${GITHUB_API_BASE}/repos/${repo}/releases/tags/${normalizedTag}`;\n\n const response = await fetch(url, {\n headers: getGitHubHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Release ${normalizedTag} not found`);\n }\n throw new Error(`Failed to fetch release ${normalizedTag}: ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return parseReleaseResponse(data as Record<string, unknown>);\n}\n\n/**\n * Parses a GitHub release API response into ReleaseInfo.\n */\nfunction parseReleaseResponse(data: Record<string, unknown>): ReleaseInfo {\n const tag = data.tag_name as string;\n return {\n tag,\n version: parseVersion(tag),\n commitSha: (data.target_commitish as string) || \"\",\n publishedAt: data.published_at as string,\n tarballUrl: data.tarball_url as string,\n };\n}\n\n/**\n * Parses a version tag into a clean version string.\n * \"v1.2.0\" -> \"1.2.0\"\n * \"1.2.0\" -> \"1.2.0\"\n */\nexport function parseVersion(tag: string): string {\n return tag.startsWith(\"v\") ? tag.slice(1) : tag;\n}\n\n/**\n * Formats a version string as a tag.\n * \"1.2.0\" -> \"v1.2.0\"\n * \"v1.2.0\" -> \"v1.2.0\"\n */\nexport function formatTag(version: string): string {\n return version.startsWith(\"v\") ? version : `v${version}`;\n}\n\n/**\n * Checks if a ref is a version tag (e.g., \"v1.2.0\" or \"1.2.0\").\n */\nexport function isVersionRef(ref: string): boolean {\n const normalized = ref.startsWith(\"v\") ? ref.slice(1) : ref;\n return /^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?$/.test(normalized);\n}\n\n/**\n * Compares two semantic versions.\n * Returns: -1 if a < b, 0 if a == b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n const parseVer = (v: string) => {\n const clean = v.startsWith(\"v\") ? v.slice(1) : v;\n const [main, prerelease] = clean.split(\"-\");\n const parts = (main ?? \"\").split(\".\").map(Number);\n return { parts, prerelease };\n };\n\n const verA = parseVer(a);\n const verB = parseVer(b);\n\n // Compare major.minor.patch\n for (let i = 0; i < 3; i++) {\n const partA = verA.parts[i] || 0;\n const partB = verB.parts[i] || 0;\n if (partA < partB) return -1;\n if (partA > partB) return 1;\n }\n\n // Handle prerelease (1.0.0-alpha < 1.0.0)\n if (verA.prerelease && !verB.prerelease) return -1;\n if (!verA.prerelease && verB.prerelease) return 1;\n if (verA.prerelease && verB.prerelease) {\n return verA.prerelease.localeCompare(verB.prerelease);\n }\n\n return 0;\n}\n","/**\n * GitHub workflow file management for agent-conf.\n *\n * Handles creating, reading, and updating workflow files in downstream repositories.\n * These workflow files call the reusable workflows in the canonical repository.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ResolvedConfig } from \"../config/schema.js\";\nimport { formatTag } from \"./version.js\";\n\n// Default values\nconst DEFAULT_CLI_NAME = \"agent-conf\";\nconst WORKFLOWS_DIR = \".github/workflows\";\n\n/**\n * Configuration for workflow generation.\n */\nexport interface WorkflowConfig {\n /** Source repository in owner/repo format */\n sourceRepo: string;\n /** CLI command name */\n cliName: string;\n /** GitHub secret name for the token */\n secretName: string;\n /** Workflow filename prefix (e.g., \"agent-conf\" -> \"agent-conf-sync.yml\") */\n workflowPrefix: string;\n}\n\n/**\n * Get workflow config from resolved config and source repo.\n * sourceRepo is required - there is no default content repository.\n */\nexport function getWorkflowConfig(\n sourceRepo: string,\n config?: Partial<ResolvedConfig>,\n): WorkflowConfig {\n const name = config?.name ?? DEFAULT_CLI_NAME;\n // Convert name to uppercase for secret name (e.g., \"agent-conf\" -> \"AGENT_CONF\")\n const secretName = `${name.toUpperCase().replace(/-/g, \"_\")}_TOKEN`;\n\n return {\n sourceRepo,\n cliName: config?.cliName ?? DEFAULT_CLI_NAME,\n secretName,\n workflowPrefix: name,\n };\n}\n\nexport interface WorkflowFile {\n name: string;\n filename: string;\n reusableWorkflow: string;\n}\n\n/**\n * Get workflow file definitions for a given config.\n */\nexport function getWorkflowFiles(config: WorkflowConfig): WorkflowFile[] {\n const prefix = config.workflowPrefix;\n return [\n {\n name: \"sync\",\n filename: `${prefix}-sync.yml`,\n reusableWorkflow: \"sync-reusable.yml\",\n },\n {\n name: \"check\",\n filename: `${prefix}-check.yml`,\n reusableWorkflow: \"check-reusable.yml\",\n },\n ];\n}\n\nexport interface WorkflowStatus {\n exists: boolean;\n currentRef?: string;\n isManaged: boolean;\n}\n\n/**\n * Gets the path to the workflows directory in a repository.\n */\nexport function getWorkflowsDir(repoRoot: string): string {\n return path.join(repoRoot, WORKFLOWS_DIR);\n}\n\n/**\n * Gets the path to a specific workflow file.\n */\nexport function getWorkflowPath(repoRoot: string, filename: string): string {\n return path.join(repoRoot, WORKFLOWS_DIR, filename);\n}\n\n/**\n * Checks the status of a workflow file.\n */\nexport async function getWorkflowStatus(\n repoRoot: string,\n workflow: WorkflowFile,\n config: WorkflowConfig,\n): Promise<WorkflowStatus> {\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const currentRef = extractWorkflowRef(content, workflow.reusableWorkflow, config.sourceRepo);\n const isManaged =\n content.includes(`# Managed by ${config.cliName}`) || content.includes(config.sourceRepo);\n\n const result: WorkflowStatus = { exists: true, isManaged };\n if (currentRef !== undefined) result.currentRef = currentRef;\n return result;\n } catch {\n // Expected: workflow file may not exist\n return {\n exists: false,\n isManaged: false,\n };\n }\n}\n\n/**\n * Extracts the version ref from a workflow file content.\n * Looks for: uses: owner/repo/.github/workflows/name.yml@ref\n */\nexport function extractWorkflowRef(\n content: string,\n reusableWorkflow: string,\n sourceRepo: string,\n): string | undefined {\n const pattern = new RegExp(\n `uses:\\\\s*${escapeRegex(sourceRepo)}\\\\/.github\\\\/workflows\\\\/${reusableWorkflow}@([^\\\\s]+)`,\n );\n const match = content.match(pattern);\n return match?.[1];\n}\n\n/**\n * Updates the version ref in a workflow file content.\n */\nexport function updateWorkflowRef(\n content: string,\n reusableWorkflow: string,\n newRef: string,\n sourceRepo: string,\n): string {\n const pattern = new RegExp(\n `(uses:\\\\s*${escapeRegex(sourceRepo)}\\\\/.github\\\\/workflows\\\\/${reusableWorkflow})@[^\\\\s]+`,\n \"g\",\n );\n return content.replace(pattern, `$1@${newRef}`);\n}\n\n/**\n * Generates the content for the sync workflow file.\n */\nexport function generateSyncWorkflow(versionRef: string, config: WorkflowConfig): string {\n const { sourceRepo, cliName, secretName } = config;\n\n return `# ${cliName} Auto-Sync Workflow\n# Managed by ${cliName} CLI - do not edit the version ref manually\n#\n# This workflow syncs standards from the central repository.\n# Version changes should be made using: ${cliName} sync --ref <version>\n#\n# TOKEN: Requires a PAT with read access to the source repository.\n# Create a fine-grained PAT at https://github.com/settings/tokens?type=beta\n# with read access to ${sourceRepo}, then add it as ${secretName} secret.\n\nname: ${cliName} Sync\n\non:\n schedule:\n - cron: '0 6 * * *' # Daily at 6am UTC\n\n workflow_dispatch:\n inputs:\n force:\n description: 'Force sync even if no updates detected'\n required: false\n default: false\n type: boolean\n\n repository_dispatch:\n types: [${cliName.replace(/-/g, \"_\")}-release]\n\nconcurrency:\n group: ${cliName}-sync\n cancel-in-progress: false\n\njobs:\n sync:\n uses: ${sourceRepo}/.github/workflows/sync-reusable.yml@${versionRef}\n with:\n force: \\${{ inputs.force || false }}\n reviewers: \\${{ vars.${secretName.replace(/_TOKEN$/, \"_REVIEWERS\")} || '' }}\n secrets:\n token: \\${{ secrets.${secretName} }}\n`;\n}\n\n/**\n * Generates the content for the check workflow file.\n */\nexport function generateCheckWorkflow(versionRef: string, config: WorkflowConfig): string {\n const { sourceRepo, cliName } = config;\n\n return `# ${cliName} File Integrity Check\n# Managed by ${cliName} CLI - do not edit the version ref manually\n#\n# This workflow checks that ${cliName}-managed files haven't been modified.\n# Version changes should be made using: ${cliName} sync --ref <version>\n\nname: ${cliName} Check\n\non:\n pull_request:\n paths:\n - '.claude/skills/**'\n - '.codex/skills/**'\n - 'AGENTS.md'\n push:\n paths:\n - '.claude/skills/**'\n - '.codex/skills/**'\n - 'AGENTS.md'\n\njobs:\n check:\n uses: ${sourceRepo}/.github/workflows/check-reusable.yml@${versionRef}\n`;\n}\n\n/**\n * Generates workflow content for a specific workflow type.\n */\nexport function generateWorkflow(\n workflow: WorkflowFile,\n versionRef: string,\n config: WorkflowConfig,\n): string {\n switch (workflow.name) {\n case \"sync\":\n return generateSyncWorkflow(versionRef, config);\n case \"check\":\n return generateCheckWorkflow(versionRef, config);\n default:\n throw new Error(`Unknown workflow: ${workflow.name}`);\n }\n}\n\n/**\n * Ensures the workflows directory exists.\n */\nexport async function ensureWorkflowsDir(repoRoot: string): Promise<void> {\n const dir = getWorkflowsDir(repoRoot);\n await fs.mkdir(dir, { recursive: true });\n}\n\n/**\n * Writes a workflow file to the repository.\n */\nexport async function writeWorkflow(\n repoRoot: string,\n workflow: WorkflowFile,\n versionRef: string,\n config: WorkflowConfig,\n): Promise<void> {\n await ensureWorkflowsDir(repoRoot);\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n const content = generateWorkflow(workflow, versionRef, config);\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Updates the version ref in an existing workflow file.\n */\nexport async function updateWorkflowVersion(\n repoRoot: string,\n workflow: WorkflowFile,\n newRef: string,\n config: WorkflowConfig,\n): Promise<boolean> {\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const currentRef = extractWorkflowRef(content, workflow.reusableWorkflow, config.sourceRepo);\n\n if (currentRef === newRef) {\n return false; // No change needed\n }\n\n const updatedContent = updateWorkflowRef(\n content,\n workflow.reusableWorkflow,\n newRef,\n config.sourceRepo,\n );\n await fs.writeFile(filePath, updatedContent, \"utf-8\");\n return true;\n } catch {\n // Expected: file doesn't exist, create it\n await writeWorkflow(repoRoot, workflow, newRef, config);\n return true;\n }\n}\n\n/**\n * Result of syncing all workflow files.\n */\nexport interface WorkflowSyncResult {\n created: string[];\n updated: string[];\n unchanged: string[];\n}\n\n/**\n * Syncs all workflow files to a specific version.\n * Always overwrites existing workflow files if they differ from the expected content.\n */\nexport async function syncWorkflows(\n repoRoot: string,\n versionRef: string,\n sourceRepo: string,\n resolvedConfig?: Partial<ResolvedConfig>,\n): Promise<WorkflowSyncResult> {\n const config = getWorkflowConfig(sourceRepo, resolvedConfig);\n const workflowFiles = getWorkflowFiles(config);\n\n const result: WorkflowSyncResult = {\n created: [],\n updated: [],\n unchanged: [],\n };\n\n for (const workflow of workflowFiles) {\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n const expectedContent = generateWorkflow(workflow, versionRef, config);\n\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(filePath, \"utf-8\");\n } catch {\n // Expected: file doesn't exist yet\n }\n\n if (existingContent === null) {\n // File doesn't exist, create it\n await writeWorkflow(repoRoot, workflow, versionRef, config);\n result.created.push(workflow.filename);\n } else if (existingContent !== expectedContent) {\n // File exists but differs from expected content, overwrite it\n await writeWorkflow(repoRoot, workflow, versionRef, config);\n result.updated.push(workflow.filename);\n } else {\n // File exists and matches expected content\n result.unchanged.push(workflow.filename);\n }\n }\n\n return result;\n}\n\n/**\n * Gets the current version ref from workflow files.\n * Returns the ref if all workflows have the same version, or undefined if mixed/missing.\n */\nexport async function getCurrentWorkflowVersion(\n repoRoot: string,\n sourceRepo: string,\n resolvedConfig?: Partial<ResolvedConfig>,\n): Promise<string | undefined> {\n const config = getWorkflowConfig(sourceRepo, resolvedConfig);\n const workflowFiles = getWorkflowFiles(config);\n const refs: (string | undefined)[] = [];\n\n for (const workflow of workflowFiles) {\n const status = await getWorkflowStatus(repoRoot, workflow, config);\n refs.push(status.currentRef);\n }\n\n // Check if all refs are the same and defined\n const uniqueRefs = [...new Set(refs.filter(Boolean))];\n if (uniqueRefs.length === 1) {\n return uniqueRefs[0];\n }\n\n return undefined;\n}\n\n/**\n * Formats a version for use as a workflow ref.\n * For version tags, uses the full tag (v1.2.0).\n * For branches, uses the branch name as-is.\n */\nexport function formatWorkflowRef(ref: string, isVersion: boolean): string {\n if (isVersion) {\n return formatTag(ref);\n }\n return ref;\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import * as path from \"node:path\";\nimport pc from \"picocolors\";\nimport { checkAllManagedFiles } from \"../core/skill-metadata.js\";\nimport { formatSourceString } from \"../core/source.js\";\nimport { getSyncStatus } from \"../core/sync.js\";\nimport { formatPath } from \"../utils/logger.js\";\n\nexport interface StatusOptions {\n check?: boolean;\n}\n\nexport async function statusCommand(options: StatusOptions = {}): Promise<void> {\n const targetDir = process.cwd();\n const status = await getSyncStatus(targetDir);\n\n console.log();\n console.log(pc.bold(\"agent-conf sync status\"));\n console.log();\n\n if (!status.hasSynced) {\n console.log(pc.yellow(\"Not synced\"));\n console.log();\n console.log(pc.dim(\"Run `agent-conf init` to sync engineering standards to this repository.\"));\n console.log();\n return;\n }\n\n const lockfile = status.lockfile!;\n\n console.log(`${pc.green(\"Synced\")}`);\n console.log();\n\n // Source info\n console.log(pc.bold(\"Source:\"));\n console.log(` ${formatSourceString(lockfile.source)}`);\n console.log();\n\n // Sync timestamp\n console.log(pc.bold(\"Last synced:\"));\n const syncedAt = new Date(lockfile.synced_at);\n console.log(` ${syncedAt.toLocaleString()}`);\n console.log();\n\n // Content\n console.log(pc.bold(\"Content:\"));\n console.log(` AGENTS.md: ${status.agentsMdExists ? pc.green(\"present\") : pc.red(\"missing\")}`);\n console.log(` Skills: ${lockfile.content.skills.length} synced`);\n if (lockfile.content.skills.length > 0) {\n for (const skill of lockfile.content.skills) {\n console.log(` - ${skill}`);\n }\n }\n console.log();\n\n // Check for modified files if --check flag is provided\n if (options.check) {\n const targets = lockfile.content.targets ?? [\"claude\"];\n const allFiles = await checkAllManagedFiles(targetDir, targets);\n const modifiedFiles = allFiles.filter((f) => f.hasChanges);\n\n console.log(pc.bold(\"File integrity:\"));\n if (modifiedFiles.length === 0) {\n console.log(` ${pc.green(\"✓\")} All managed files are unchanged`);\n } else {\n console.log(` ${pc.yellow(\"!\")} ${modifiedFiles.length} file(s) manually modified:`);\n for (const file of modifiedFiles) {\n const label = file.type === \"agents\" ? \"(global block)\" : \"\";\n console.log(` ${pc.yellow(\"~\")} ${file.path} ${pc.dim(label)}`);\n }\n console.log();\n console.log(pc.dim(\" These files will be overwritten on next sync. To preserve changes,\"));\n console.log(pc.dim(\" copy them elsewhere before running `agent-conf sync`.\"));\n }\n console.log();\n }\n\n // Lockfile location\n const lockfilePath = formatPath(path.join(targetDir, \".agent-conf\", \"agent-conf.lock\"));\n console.log(pc.dim(`Lock file: ${lockfilePath}`));\n console.log(pc.dim(`CLI version: ${lockfile.cli_version}`));\n console.log();\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getSyncStatus } from \"../core/sync.js\";\nimport { compareVersions } from \"../core/version.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n checkModifiedFilesBeforeSync,\n parseAndValidateTargets,\n performSync,\n promptMergeOrOverride,\n resolveSource,\n resolveTargetDirectory,\n resolveVersion,\n type SharedSyncOptions,\n} from \"./shared.js\";\n\nexport interface SyncOptions extends SharedSyncOptions {}\n\nexport async function syncCommand(options: SyncOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agent-conf sync\"));\n\n // Validate mutually exclusive flags\n if (options.pinned && options.ref) {\n logger.error(\"Cannot use --pinned with --ref. Choose one.\");\n process.exit(1);\n }\n if (options.pinned && options.local !== undefined) {\n logger.error(\"Cannot use --pinned with --local.\");\n process.exit(1);\n }\n\n // Resolve target directory to git root\n const targetDir = await resolveTargetDirectory();\n\n // Parse targets\n const targets = await parseAndValidateTargets(options.target);\n\n // Check current status (informational only, no confirmation prompt)\n const status = await getSyncStatus(targetDir);\n\n // Check schema compatibility\n if (status.schemaError) {\n logger.error(status.schemaError);\n process.exit(1);\n }\n if (status.schemaWarning) {\n logger.warn(status.schemaWarning);\n }\n\n if (!status.hasSynced) {\n logger.warn(\n \"This repository has not been synced yet. Consider running 'agent-conf init' first.\",\n );\n }\n\n // For sync command, try to get source from:\n // 1. --source flag (highest priority)\n // 2. Lockfile's recorded source\n let sourceRepo = options.source;\n if (!sourceRepo && status.lockfile?.source.type === \"github\") {\n sourceRepo = status.lockfile.source.repository;\n }\n\n // Resolve version (fetches latest by default, unless --pinned or --ref)\n const resolvedVersion = await resolveVersion(options, status, \"sync\", sourceRepo);\n\n // Check if already up to date (when fetching latest, not --pinned or --ref)\n if (!options.pinned && !options.ref && !options.local && status.lockfile?.pinned_version) {\n const currentVersion = status.lockfile.pinned_version;\n\n if (resolvedVersion.version) {\n const comparison = compareVersions(currentVersion, resolvedVersion.version);\n\n // Display version info\n console.log();\n console.log(`Canonical source: ${pc.cyan(sourceRepo)}`);\n console.log(`Latest release: ${pc.cyan(resolvedVersion.version)}`);\n console.log(`Pinned version: ${pc.cyan(currentVersion)}`);\n\n if (comparison >= 0) {\n // Current version is equal or newer\n console.log(` ${pc.green(\"✓\")} Up to date`);\n console.log();\n prompts.outro(pc.green(\"Already up to date!\"));\n return;\n }\n\n // Update available\n console.log(\n ` ${pc.yellow(\"→\")} Update available: ${currentVersion} → ${resolvedVersion.version}`,\n );\n console.log();\n\n // Confirm update\n if (!options.yes) {\n const shouldUpdate = await prompts.confirm({\n message: \"Proceed with update?\",\n initialValue: true,\n });\n\n if (prompts.isCancel(shouldUpdate) || !shouldUpdate) {\n prompts.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n }\n }\n }\n\n // If --ref was specified, inform user about version change\n if (options.ref && status.lockfile?.pinned_version) {\n const currentVersion = status.lockfile.pinned_version;\n if (resolvedVersion.version && currentVersion !== resolvedVersion.version) {\n logger.info(`Updating version: ${currentVersion} → ${resolvedVersion.version}`);\n }\n }\n\n // Pass the resolved source to options for resolveSource\n const optionsWithSource: SyncOptions = sourceRepo ? { ...options, source: sourceRepo } : options;\n\n // Resolve source using the determined version\n const { resolvedSource, tempDir, repository } = await resolveSource(\n optionsWithSource,\n resolvedVersion,\n );\n\n // Determine merge behavior\n const shouldOverride = await promptMergeOrOverride(status, options, tempDir);\n\n // Check for modified skill files and warn\n await checkModifiedFilesBeforeSync(targetDir, targets, options, tempDir);\n\n // Perform sync (includes workflow files for release versions)\n await performSync({\n targetDir,\n resolvedSource,\n resolvedVersion,\n shouldOverride,\n targets,\n context: {\n commandName: \"sync\",\n status,\n },\n tempDir,\n yes: options.yes,\n sourceRepo: repository,\n summaryFile: options.summaryFile,\n expandChanges: options.expandChanges,\n });\n}\n","import { execSync } from \"node:child_process\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getCliVersion } from \"../core/lockfile.js\";\nimport { compareVersions } from \"../core/version.js\";\nimport { createLogger } from \"../utils/logger.js\";\n\nconst NPM_PACKAGE_NAME = \"agconf\";\n\nexport interface UpgradeCliOptions {\n yes?: boolean;\n}\n\n/**\n * Fetches the latest version from the npm registry.\n */\nasync function getLatestNpmVersion(): Promise<string> {\n const response = await fetch(`https://registry.npmjs.org/${NPM_PACKAGE_NAME}/latest`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch package info: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { version: string };\n return data.version;\n}\n\nexport async function upgradeCliCommand(options: UpgradeCliOptions): Promise<void> {\n const logger = createLogger();\n const currentVersion = getCliVersion();\n\n console.log();\n prompts.intro(pc.bold(\"agent-conf upgrade-cli\"));\n\n // Check for updates\n const spinner = logger.spinner(\"Checking for CLI updates...\");\n spinner.start();\n\n let latestVersion: string;\n try {\n latestVersion = await getLatestNpmVersion();\n spinner.stop();\n } catch (error) {\n spinner.fail(\"Failed to check for CLI updates\");\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n // Display version info\n console.log();\n console.log(`Current version: ${pc.cyan(currentVersion)}`);\n console.log(`Latest version: ${pc.cyan(latestVersion)}`);\n\n // Check if update is needed\n const needsUpdate = compareVersions(currentVersion, latestVersion) < 0;\n\n if (!needsUpdate) {\n console.log();\n prompts.outro(pc.green(\"CLI is already up to date!\"));\n return;\n }\n\n console.log();\n console.log(`${pc.yellow(\"→\")} Update available: ${currentVersion} → ${latestVersion}`);\n console.log();\n\n // Confirm update\n if (!options.yes) {\n const shouldUpdate = await prompts.confirm({\n message: \"Proceed with CLI upgrade?\",\n initialValue: true,\n });\n\n if (prompts.isCancel(shouldUpdate) || !shouldUpdate) {\n prompts.cancel(\"Upgrade cancelled\");\n process.exit(0);\n }\n }\n\n // Perform upgrade\n const installSpinner = logger.spinner(\"Upgrading CLI...\");\n installSpinner.start();\n\n try {\n execSync(`npm install -g ${NPM_PACKAGE_NAME}@latest`, {\n stdio: \"pipe\",\n });\n installSpinner.succeed(\"CLI upgraded\");\n\n console.log();\n prompts.outro(pc.green(`CLI upgraded to ${latestVersion}!`));\n } catch (error) {\n installSpinner.fail(\"Upgrade failed\");\n logger.error(error instanceof Error ? error.message : String(error));\n logger.info(`\\nYou can try manually: npm install -g ${NPM_PACKAGE_NAME}@latest`);\n process.exit(1);\n }\n}\n","import { createCli } from \"./cli.js\";\n\nconst cli = createCli();\ncli.parse(process.argv);\n"],"mappings":"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","names":["pc","fs","path","pc","stat","fs","path","stat","text","pc","fs","path","pc","fs","path","pc","fs","os","path","prompts","pc","prompts","pc","pc","prompts","pc","createHash","fs","path","fs","path","repoContent","createHash","parseFrontmatter","createHash","createHash","fs","path","prompts","pc","fs","path","fs","path","simpleGit","fs","path","simpleGit","log","stat","fs","path","DEFAULT_CLI_NAME","generateSyncWorkflow","generateCheckWorkflow","pc","pc","path","pc","pc","prompts","pc","pc","execSync","prompts","pc","pc","execSync","pc"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/canonical.ts","../src/utils/fs.ts","../src/utils/git.ts","../src/utils/logger.ts","../src/commands/check.ts","../src/core/lockfile.ts","../src/schemas/lockfile.ts","../src/core/schema.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/commands/init.ts","../src/core/sync.ts","../src/core/merge.ts","../src/core/rules.ts","../src/core/targets.ts","../src/commands/shared.ts","../src/core/hooks.ts","../src/core/source.ts","../src/config/loader.ts","../src/core/version.ts","../src/core/workflows.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/upgrade-cli.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { canonicalInitCommand } from \"./commands/canonical.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { handleCompletion, installCompletion, uninstallCompletion } from \"./commands/completion.js\";\nimport { configGetCommand, configSetCommand, configShowCommand } from \"./commands/config.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { upgradeCliCommand } from \"./commands/upgrade-cli.js\";\nimport { checkCliVersionMismatch, getCliVersion } from \"./core/lockfile.js\";\nimport { getGitRoot } from \"./utils/git.js\";\n\n// Handle shell completion requests before anything else\n// This must happen synchronously at module load time\nif (handleCompletion()) {\n process.exit(0);\n}\n\n/**\n * Checks if the installed CLI is outdated compared to the version used in the last sync.\n * Shows a warning if the lockfile was created with a newer CLI version.\n */\nasync function warnIfCliOutdated(): Promise<void> {\n try {\n const cwd = process.cwd();\n const gitRoot = await getGitRoot(cwd);\n if (!gitRoot) return;\n\n const mismatch = await checkCliVersionMismatch(gitRoot);\n if (mismatch) {\n console.log();\n console.log(\n pc.yellow(\n `⚠ CLI is outdated: v${mismatch.currentVersion} installed, but repo was synced with v${mismatch.lockfileVersion}`,\n ),\n );\n console.log(pc.yellow(\" Run: agconf upgrade-cli\"));\n console.log();\n }\n } catch {\n // Silently ignore errors - this is a best-effort check\n }\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"agconf\")\n .description(\"Sync company engineering standards from canonical repository\")\n .version(getCliVersion())\n .hook(\"preAction\", async () => {\n await warnIfCliOutdated();\n });\n\n program\n .command(\"init\")\n .description(\"Initialize or sync agconf standards to the current repository\")\n .option(\n \"-s, --source <repo>\",\n \"Canonical repository in owner/repo format (e.g., acme/standards)\",\n )\n .option(\"--local [path]\", \"Use local canonical repository (auto-discover or specify path)\")\n .option(\"-y, --yes\", \"Non-interactive mode (merge by default)\")\n .option(\"--override\", \"Override existing AGENTS.md instead of merging\")\n .option(\"--ref <ref>\", \"GitHub ref/version to sync from (default: latest release)\")\n .option(\"-t, --target <targets...>\", \"Target platforms (claude, codex)\", [\"claude\"])\n .action(\n async (options: {\n source?: string;\n local?: string | boolean;\n yes?: boolean;\n override?: boolean;\n ref?: string;\n target?: string[];\n }) => {\n await initCommand(options);\n },\n );\n\n program\n .command(\"sync\")\n .description(\"Sync content from canonical repository (fetches latest by default)\")\n .option(\n \"-s, --source <repo>\",\n \"Canonical repository in owner/repo format (e.g., acme/standards)\",\n )\n .option(\"--local [path]\", \"Use local canonical repository (auto-discover or specify path)\")\n .option(\"-y, --yes\", \"Non-interactive mode (merge by default)\")\n .option(\"--override\", \"Override existing AGENTS.md instead of merging\")\n .option(\"--ref <ref>\", \"GitHub ref/version to sync from\")\n .option(\"--pinned\", \"Use lockfile version without fetching latest\")\n .option(\"-t, --target <targets...>\", \"Target platforms (claude, codex)\")\n .option(\"--summary-file <path>\", \"Write sync summary to file (markdown, for CI)\")\n .option(\"--expand-changes\", \"Show all items in output (default: first 5)\")\n .action(\n async (options: {\n source?: string;\n local?: string | boolean;\n yes?: boolean;\n override?: boolean;\n ref?: string;\n pinned?: boolean;\n target?: string[];\n summaryFile?: string;\n expandChanges?: boolean;\n }) => {\n await syncCommand(options);\n },\n );\n\n program\n .command(\"status\")\n .description(\"Show current sync status\")\n .option(\"-c, --check\", \"Check for manually modified skill files\")\n .action(async (options: { check?: boolean }) => {\n await statusCommand(options);\n });\n\n program\n .command(\"check\")\n .description(\"Check if managed files have been modified\")\n .option(\"-q, --quiet\", \"Minimal output, just exit code\")\n .action(async (options: { quiet?: boolean }) => {\n await checkCommand(options);\n });\n\n program\n .command(\"upgrade-cli\")\n .description(\"Upgrade the agconf CLI to the latest version\")\n .option(\"-y, --yes\", \"Non-interactive mode\")\n .action(async (options: { yes?: boolean }) => {\n await upgradeCliCommand(options);\n });\n\n // Config command with subcommands\n const configCmd = program.command(\"config\").description(\"Manage global CLI configuration\");\n\n configCmd\n .command(\"show\")\n .description(\"Show all configuration values\")\n .action(async () => {\n await configShowCommand();\n });\n\n configCmd\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .action(async (key: string) => {\n await configGetCommand(key);\n });\n\n configCmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action(async (key: string, value: string) => {\n await configSetCommand(key, value);\n });\n\n // Default for config command: show config\n configCmd.action(async () => {\n await configShowCommand();\n });\n\n // Completion command with subcommands\n const completionCmd = program\n .command(\"completion\")\n .description(\"Manage shell completions (bash, zsh, fish)\");\n\n completionCmd\n .command(\"install\")\n .description(\"Install shell completions for your current shell\")\n .action(async () => {\n await installCompletion();\n });\n\n completionCmd\n .command(\"uninstall\")\n .description(\"Remove shell completions\")\n .action(async () => {\n await uninstallCompletion();\n });\n\n // Default for completion command: install\n completionCmd.action(async () => {\n await installCompletion();\n });\n\n // Canonical command group\n const canonicalCmd = program.command(\"canonical\").description(\"Manage canonical repositories\");\n\n canonicalCmd\n .command(\"init\")\n .description(\"Scaffold a new canonical repository structure\")\n .option(\"-n, --name <name>\", \"Name for the canonical repository\")\n .option(\"-o, --org <organization>\", \"Organization name\")\n .option(\"-d, --dir <directory>\", \"Target directory (default: current)\")\n .option(\"--marker-prefix <prefix>\", \"Marker prefix (default: agconf)\")\n .option(\"--no-examples\", \"Skip example skill creation\")\n .option(\"--rules-dir <directory>\", \"Rules directory (e.g., 'rules')\")\n .option(\"-y, --yes\", \"Non-interactive mode\")\n .action(\n async (options: {\n name?: string;\n org?: string;\n dir?: string;\n markerPrefix?: string;\n examples?: boolean;\n rulesDir?: string;\n yes?: boolean;\n }) => {\n await canonicalInitCommand({\n name: options.name,\n org: options.org,\n dir: options.dir,\n markerPrefix: options.markerPrefix,\n includeExamples: options.examples,\n rulesDir: options.rulesDir,\n yes: options.yes,\n });\n },\n );\n\n // Default for canonical command: show help\n canonicalCmd.action(() => {\n canonicalCmd.help();\n });\n\n // Default command: show help\n program.action(() => {\n program.help();\n });\n\n return program;\n}\n","// biome-ignore-all lint/suspicious/noUselessEscapeInString: escaping $ is required in template literals that generate shell scripts\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { CURRENT_CONFIG_VERSION } from \"../config/schema.js\";\nimport { directoryExists, ensureDir, fileExists } from \"../utils/fs.js\";\nimport { getGitOrganization, getGitProjectName, isGitRoot } from \"../utils/git.js\";\nimport { createLogger, formatPath } from \"../utils/logger.js\";\n\nexport interface CanonicalInitOptions {\n /** Canonical repo name */\n name?: string | undefined;\n /** Organization name */\n org?: string | undefined;\n /** Target directory (default: cwd) */\n dir?: string | undefined;\n /** Marker prefix (default: \"agconf\") */\n markerPrefix?: string | undefined;\n /** Include example skill (default: true) */\n includeExamples?: boolean | undefined;\n /** Rules directory (omit or empty to skip rules) */\n rulesDir?: string | undefined;\n /** Non-interactive mode */\n yes?: boolean | undefined;\n}\n\ninterface ResolvedOptions {\n name: string;\n organization?: string | undefined;\n targetDir: string;\n markerPrefix: string;\n includeExamples: boolean;\n rulesDir?: string | undefined;\n}\n\n/**\n * Generates the agconf.yaml configuration file content.\n */\nfunction generateConfigYaml(options: ResolvedOptions): string {\n const content: Record<string, unknown> = {\n instructions: \"instructions/AGENTS.md\",\n skills_dir: \"skills\",\n };\n\n // Add rules_dir if specified\n if (options.rulesDir) {\n content.rules_dir = options.rulesDir;\n }\n\n const config: Record<string, unknown> = {\n version: CURRENT_CONFIG_VERSION,\n meta: {\n name: options.name,\n },\n content,\n targets: [\"claude\"],\n markers: {\n prefix: options.markerPrefix,\n },\n merge: {\n preserve_repo_content: true,\n },\n };\n\n if (options.organization) {\n (config.meta as Record<string, unknown>).organization = options.organization;\n }\n\n let yaml = stringifyYaml(config, { lineWidth: 0 });\n\n // If no rules_dir specified, add commented-out example after skills_dir\n if (!options.rulesDir) {\n yaml = yaml.replace(/skills_dir: skills\\n/, \"skills_dir: skills\\n # rules_dir: rules\\n\");\n }\n\n return yaml;\n}\n\n/**\n * Generates a template AGENTS.md file.\n */\nfunction generateAgentsMd(options: ResolvedOptions): string {\n const orgName = options.organization ?? \"Your Organization\";\n return `# ${orgName} Engineering Standards for AI Agents\n\nThis document defines company-wide engineering standards that all AI coding agents must follow.\n\n## Purpose\n\nThese standards ensure consistency, maintainability, and operational excellence across all engineering projects.\n\n---\n\n## Development Principles\n\n### Code Quality\n\n- Write clean, readable code with meaningful names\n- Follow existing patterns in the codebase\n- Keep functions small and focused\n- Add comments only when the \"why\" isn't obvious\n\n### Testing\n\n- Write tests for new functionality\n- Ensure tests are deterministic and fast\n- Use descriptive test names\n\n---\n\n## Getting Started\n\nAdd your organization's specific engineering standards below.\n\n---\n\n**Version**: 1.0\n**Last Updated**: ${new Date().toISOString().split(\"T\")[0]}\n`;\n}\n\n/**\n * Generates an example skill SKILL.md file.\n */\nfunction generateExampleSkillMd(): string {\n return `---\nname: example-skill\ndescription: An example skill demonstrating the skill format\n---\n\n# Example Skill\n\nThis is an example skill that demonstrates the skill format.\n\n## When to Use\n\nUse this skill when you need an example of how skills are structured.\n\n## Instructions\n\n1. Skills are defined in their own directories under \\`skills/\\`\n2. Each skill has a \\`SKILL.md\\` file with frontmatter\n3. The frontmatter must include \\`name\\` and \\`description\\`\n4. Optional: Include a \\`references/\\` directory for additional files\n\n## Example\n\n\\`\\`\\`\nskills/\n example-skill/\n SKILL.md\n references/\n .gitkeep\n\\`\\`\\`\n`;\n}\n\n/**\n * Generates the sync workflow file content.\n */\nfunction generateSyncWorkflow(repoFullName: string, prefix: string): string {\n return `# ${prefix} Auto-Sync Workflow (Reusable)\n# This workflow is called by downstream repositories.\n#\n# Downstream repos will reference this workflow like:\n# uses: ${repoFullName}/.github/workflows/sync-reusable.yml@v1.0.0\n#\n# TOKEN: Requires a token with read access to the canonical repository.\n# The default GITHUB_TOKEN is used for operations on the downstream repo.\n\nname: Sync Reusable\n\non:\n workflow_call:\n inputs:\n force:\n description: 'Force sync even if no updates detected'\n required: false\n default: false\n type: boolean\n commit_strategy:\n description: 'How to commit changes: \"pr\" (create pull request) or \"direct\" (commit to current branch)'\n required: false\n default: 'pr'\n type: string\n pr_branch_prefix:\n description: 'Branch prefix for PR branches'\n required: false\n default: '${prefix}/sync'\n type: string\n pr_title:\n description: 'Pull request title'\n required: false\n default: 'chore(${prefix}): sync agent configuration'\n type: string\n reviewers:\n description: 'PR reviewers (comma-separated GitHub usernames)'\n required: false\n type: string\n commit_message:\n description: 'Commit message for direct commits'\n required: false\n default: 'chore(${prefix}): sync agent configuration'\n type: string\n secrets:\n token:\n description: 'GitHub token with read access to the canonical repository'\n required: true\n outputs:\n changes_detected:\n description: 'Whether changes were detected after sync'\n value: \\${{ jobs.sync.outputs.changes_detected }}\n pr_number:\n description: 'Pull request number (if PR strategy and changes detected)'\n value: \\${{ jobs.sync.outputs.pr_number }}\n pr_url:\n description: 'Pull request URL (if PR strategy and changes detected)'\n value: \\${{ jobs.sync.outputs.pr_url }}\n\njobs:\n sync:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n pull-requests: write\n outputs:\n changes_detected: \\${{ steps.check-changes.outputs.changes_detected }}\n pr_number: \\${{ steps.create-pr.outputs.pr_number }}\n pr_url: \\${{ steps.create-pr.outputs.pr_url }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install agconf CLI\n run: npm install -g agconf\n\n - name: Run sync\n run: agconf sync --yes --summary-file /tmp/sync-summary.md --expand-changes\n env:\n GITHUB_TOKEN: \\${{ secrets.token }}\n\n - name: Check for changes\n id: check-changes\n run: |\n # Check for meaningful changes (excluding lockfile which always updates with synced_at)\n LOCKFILE_PATH=\".agconf/lockfile.json\"\n\n # Get changed files excluding lockfile\n MEANINGFUL_CHANGES=\\$(git status --porcelain | grep -v \"^.. \\$LOCKFILE_PATH\\$\" || true)\n\n if [ -n \"\\$MEANINGFUL_CHANGES\" ]; then\n echo \"changes_detected=true\" >> \\$GITHUB_OUTPUT\n echo \"Meaningful changes detected after sync:\"\n git status --short\n else\n echo \"changes_detected=false\" >> \\$GITHUB_OUTPUT\n echo \"No meaningful changes detected (only lockfile updated)\"\n fi\n\n - name: Configure git\n if: steps.check-changes.outputs.changes_detected == 'true'\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n - name: Check for existing PR\n id: check-pr\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'\n env:\n GH_TOKEN: \\${{ github.token }}\n run: |\n BRANCH_NAME=\"\\${{ inputs.pr_branch_prefix }}\"\n\n # Check if there's an existing open PR from this branch\n EXISTING_PR=\\$(gh pr list --head \"\\$BRANCH_NAME\" --state open --json number,url --jq '.[0]' 2>/dev/null || echo \"\")\n\n if [ -n \"\\$EXISTING_PR\" ] && [ \"\\$EXISTING_PR\" != \"null\" ]; then\n PR_NUMBER=\\$(echo \"\\$EXISTING_PR\" | jq -r '.number')\n PR_URL=\\$(echo \"\\$EXISTING_PR\" | jq -r '.url')\n echo \"existing_pr=true\" >> \\$GITHUB_OUTPUT\n echo \"pr_number=\\$PR_NUMBER\" >> \\$GITHUB_OUTPUT\n echo \"pr_url=\\$PR_URL\" >> \\$GITHUB_OUTPUT\n echo \"Found existing PR #\\$PR_NUMBER: \\$PR_URL\"\n else\n echo \"existing_pr=false\" >> \\$GITHUB_OUTPUT\n echo \"No existing PR found for branch \\$BRANCH_NAME\"\n fi\n\n echo \"BRANCH_NAME=\\$BRANCH_NAME\" >> \\$GITHUB_ENV\n\n - name: Create or update PR branch\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'\n run: |\n BRANCH_NAME=\"\\${{ inputs.pr_branch_prefix }}\"\n\n # Check if remote branch exists\n if git ls-remote --exit-code --heads origin \"\\$BRANCH_NAME\" >/dev/null 2>&1; then\n # Branch exists - fetch and reset to it, then apply our changes\n git fetch origin \"\\$BRANCH_NAME\"\n git checkout -B \"\\$BRANCH_NAME\" origin/\"\\$BRANCH_NAME\"\n # Reset to match the base branch, then apply changes\n git reset --soft \\${{ github.ref_name }}\n else\n # Create new branch\n git checkout -b \"\\$BRANCH_NAME\"\n fi\n\n git add -A\n git commit -m \"\\${{ inputs.pr_title }}\" || echo \"No changes to commit\"\n git push --force-with-lease -u origin \"\\$BRANCH_NAME\"\n\n - name: Create or update pull request\n id: create-pr\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'\n env:\n GH_TOKEN: \\${{ github.token }}\n run: |\n # Read sync summary if available\n if [ -f /tmp/sync-summary.md ]; then\n SYNC_SUMMARY=\\$(cat /tmp/sync-summary.md)\n else\n SYNC_SUMMARY=\"## Changes\n - Synced agent configuration from canonical repository\"\n fi\n\n PR_BODY=\"This PR was automatically created by the ${prefix} sync workflow.\n\n \\$SYNC_SUMMARY\n\n ---\n *This is an automated PR. Review the changes and merge when ready.*\"\n\n if [ \"\\${{ steps.check-pr.outputs.existing_pr }}\" == \"true\" ]; then\n # Update existing PR body\n PR_NUMBER=\"\\${{ steps.check-pr.outputs.pr_number }}\"\n PR_URL=\"\\${{ steps.check-pr.outputs.pr_url }}\"\n\n gh pr edit \"\\$PR_NUMBER\" --body \"\\$PR_BODY\"\n echo \"pr_url=\\$PR_URL\" >> \\$GITHUB_OUTPUT\n echo \"pr_number=\\$PR_NUMBER\" >> \\$GITHUB_OUTPUT\n echo \"Updated existing PR #\\$PR_NUMBER: \\$PR_URL\"\n else\n # Create new PR\n REVIEWERS_ARG=\"\"\n if [ -n \"\\${{ inputs.reviewers }}\" ]; then\n REVIEWERS_ARG=\"--reviewer \\${{ inputs.reviewers }}\"\n fi\n\n PR_URL=\\$(gh pr create \\\\\n --title \"\\${{ inputs.pr_title }}\" \\\\\n --body \"\\$PR_BODY\" \\\\\n \\$REVIEWERS_ARG)\n\n PR_NUMBER=\\$(gh pr view --json number -q .number)\n echo \"pr_url=\\$PR_URL\" >> \\$GITHUB_OUTPUT\n echo \"pr_number=\\$PR_NUMBER\" >> \\$GITHUB_OUTPUT\n echo \"Created PR #\\$PR_NUMBER: \\$PR_URL\"\n fi\n\n - name: Commit directly to branch\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'direct'\n run: |\n git add -A\n git commit -m \"\\${{ inputs.commit_message }}\"\n git push\n echo \"Changes committed directly to \\$(git branch --show-current)\"\n`;\n}\n\n/**\n * Generates the check workflow file content.\n */\nfunction generateCheckWorkflow(repoFullName: string, prefix: string): string {\n return `# ${prefix} File Integrity Check (Reusable)\n# This workflow is called by downstream repositories.\n#\n# Downstream repos will reference this workflow like:\n# uses: ${repoFullName}/.github/workflows/check-reusable.yml@v1.0.0\n\nname: Check Reusable\n\non:\n workflow_call:\n\njobs:\n check:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install agconf CLI\n run: npm install -g agconf\n\n - name: Check file integrity\n run: agconf check\n`;\n}\n\nexport async function canonicalInitCommand(options: CanonicalInitOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agconf canonical init\"));\n\n // Determine target directory\n const targetDir = options.dir ? path.resolve(options.dir) : process.cwd();\n const dirName = path.basename(targetDir);\n const cwd = process.cwd();\n\n // Compute smart defaults for name and organization\n // Check both target dir and cwd for git info\n // If target dir exists and is at git root, use that\n // Otherwise, if cwd is at git root and target is cwd or a new subdir, use cwd's git info\n let isAtGitRoot = await isGitRoot(targetDir);\n let gitProjectName = await getGitProjectName(targetDir);\n let gitOrganization = await getGitOrganization(targetDir);\n\n // If target dir doesn't have git info, try cwd (useful when creating new dir inside git repo)\n if (!gitProjectName) {\n const cwdIsGitRoot = await isGitRoot(cwd);\n const cwdGitProjectName = await getGitProjectName(cwd);\n const cwdGitOrganization = await getGitOrganization(cwd);\n\n // If cwd is a git root and target is cwd, use cwd's info\n if (cwdIsGitRoot && path.resolve(targetDir) === path.resolve(cwd)) {\n isAtGitRoot = true;\n gitProjectName = cwdGitProjectName;\n gitOrganization = cwdGitOrganization;\n } else if (cwdGitOrganization && !gitOrganization) {\n // At least use the organization from cwd if available\n gitOrganization = cwdGitOrganization;\n }\n }\n\n // Determine the default name suggestion\n let defaultName: string;\n let nameHint: string;\n if (isAtGitRoot && gitProjectName) {\n defaultName = gitProjectName;\n nameHint = \" (from current git project)\";\n } else {\n defaultName = dirName;\n nameHint = \"\";\n }\n\n // Check if directory exists and has content\n const dirExists = await directoryExists(targetDir);\n if (dirExists) {\n const configExists = await fileExists(path.join(targetDir, \"agconf.yaml\"));\n if (configExists && !options.yes) {\n const shouldContinue = await prompts.confirm({\n message: \"This directory already has an agconf.yaml. Overwrite?\",\n initialValue: false,\n });\n\n if (prompts.isCancel(shouldContinue) || !shouldContinue) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n }\n\n // Gather options (interactive or from CLI)\n let resolvedOptions: ResolvedOptions;\n\n if (options.yes) {\n // Non-interactive mode: use defaults or provided values\n resolvedOptions = {\n name: options.name ?? defaultName,\n organization: options.org ?? gitOrganization,\n targetDir,\n markerPrefix: options.markerPrefix ?? \"agconf\",\n includeExamples: options.includeExamples !== false,\n rulesDir: options.rulesDir || undefined,\n };\n } else {\n // Interactive mode: prompt for values\n const name = await prompts.text({\n message: `Canonical repository name${nameHint}:`,\n placeholder: defaultName,\n defaultValue: options.name ?? defaultName,\n validate: (value) => {\n if (!value.trim()) return \"Name is required\";\n if (!/^[a-z0-9-]+$/.test(value)) return \"Name must be lowercase alphanumeric with hyphens\";\n return undefined;\n },\n });\n\n if (prompts.isCancel(name)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n // Determine organization suggestion\n const orgDefault = options.org ?? gitOrganization;\n const orgHint = gitOrganization && !options.org ? \" (from git)\" : \"\";\n\n const organization = await prompts.text({\n message: `Organization name${orgHint} (optional):`,\n placeholder: orgDefault ?? \"ACME Corp\",\n ...(orgDefault ? { defaultValue: orgDefault } : {}),\n });\n\n if (prompts.isCancel(organization)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n const markerPrefix = await prompts.text({\n message: \"Marker prefix for managed content:\",\n placeholder: \"agconf\",\n defaultValue: options.markerPrefix ?? \"agconf\",\n validate: (value) => {\n if (!value.trim()) return \"Prefix is required\";\n if (!/^[a-z0-9-]+$/.test(value))\n return \"Prefix must be lowercase alphanumeric with hyphens\";\n return undefined;\n },\n });\n\n if (prompts.isCancel(markerPrefix)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n const includeExamples = await prompts.confirm({\n message: \"Include example skill?\",\n initialValue: options.includeExamples !== false,\n });\n\n if (prompts.isCancel(includeExamples)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n // Ask about rules\n const includeRules = await prompts.confirm({\n message: \"Include rules directory?\",\n initialValue: false,\n });\n\n if (prompts.isCancel(includeRules)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n let rulesDir: string | undefined;\n if (includeRules) {\n const rulesDirInput = await prompts.text({\n message: \"Rules directory name:\",\n placeholder: \"rules\",\n defaultValue: \"rules\",\n validate: (value) => {\n if (!value.trim()) return \"Directory name is required\";\n if (!/^[a-z0-9-_/]+$/.test(value))\n return \"Directory name must be lowercase alphanumeric with hyphens, underscores, or slashes\";\n return undefined;\n },\n });\n\n if (prompts.isCancel(rulesDirInput)) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n rulesDir = rulesDirInput as string;\n }\n\n resolvedOptions = {\n name: name as string,\n organization: (organization as string) || undefined,\n targetDir,\n markerPrefix: markerPrefix as string,\n includeExamples: includeExamples as boolean,\n rulesDir,\n };\n }\n\n // Create directory structure\n const spinner = logger.spinner(\"Creating canonical repository structure...\");\n spinner.start();\n\n try {\n // Ensure target directory exists\n await ensureDir(resolvedOptions.targetDir);\n\n // Create directories\n const instructionsDir = path.join(resolvedOptions.targetDir, \"instructions\");\n const skillsDir = path.join(resolvedOptions.targetDir, \"skills\");\n const workflowsDir = path.join(resolvedOptions.targetDir, \".github\", \"workflows\");\n\n await ensureDir(instructionsDir);\n await ensureDir(skillsDir);\n await ensureDir(workflowsDir);\n\n // Create rules directory if specified\n if (resolvedOptions.rulesDir) {\n const rulesDir = path.join(resolvedOptions.targetDir, resolvedOptions.rulesDir);\n await ensureDir(rulesDir);\n // Add a .gitkeep to the rules directory\n await fs.writeFile(path.join(rulesDir, \".gitkeep\"), \"\", \"utf-8\");\n }\n\n // Write agconf.yaml\n const configPath = path.join(resolvedOptions.targetDir, \"agconf.yaml\");\n await fs.writeFile(configPath, generateConfigYaml(resolvedOptions), \"utf-8\");\n\n // Write AGENTS.md\n const agentsMdPath = path.join(instructionsDir, \"AGENTS.md\");\n await fs.writeFile(agentsMdPath, generateAgentsMd(resolvedOptions), \"utf-8\");\n\n // Write example skill if requested\n if (resolvedOptions.includeExamples) {\n const exampleSkillDir = path.join(skillsDir, \"example-skill\");\n const referencesDir = path.join(exampleSkillDir, \"references\");\n await ensureDir(referencesDir);\n\n const skillMdPath = path.join(exampleSkillDir, \"SKILL.md\");\n await fs.writeFile(skillMdPath, generateExampleSkillMd(), \"utf-8\");\n\n const gitkeepPath = path.join(referencesDir, \".gitkeep\");\n await fs.writeFile(gitkeepPath, \"\", \"utf-8\");\n }\n\n // Write workflow files\n const syncWorkflowPath = path.join(workflowsDir, \"sync-reusable.yml\");\n const checkWorkflowPath = path.join(workflowsDir, \"check-reusable.yml\");\n\n // Build repo full name for workflow references (org/name or just name if no org)\n const repoFullName = resolvedOptions.organization\n ? `${resolvedOptions.organization}/${resolvedOptions.name}`\n : resolvedOptions.name;\n\n await fs.writeFile(\n syncWorkflowPath,\n generateSyncWorkflow(repoFullName, resolvedOptions.markerPrefix),\n \"utf-8\",\n );\n await fs.writeFile(\n checkWorkflowPath,\n generateCheckWorkflow(repoFullName, resolvedOptions.markerPrefix),\n \"utf-8\",\n );\n\n spinner.succeed(\"Canonical repository structure created\");\n\n // Summary\n console.log();\n console.log(pc.bold(\"Created:\"));\n console.log(` ${pc.green(\"+\")} ${formatPath(configPath)}`);\n console.log(` ${pc.green(\"+\")} ${formatPath(agentsMdPath)}`);\n if (resolvedOptions.includeExamples) {\n console.log(\n ` ${pc.green(\"+\")} ${formatPath(path.join(skillsDir, \"example-skill/SKILL.md\"))}`,\n );\n }\n if (resolvedOptions.rulesDir) {\n console.log(\n ` ${pc.green(\"+\")} ${formatPath(path.join(resolvedOptions.targetDir, resolvedOptions.rulesDir))}/`,\n );\n }\n console.log(` ${pc.green(\"+\")} ${formatPath(syncWorkflowPath)}`);\n console.log(` ${pc.green(\"+\")} ${formatPath(checkWorkflowPath)}`);\n\n console.log();\n console.log(pc.dim(`Name: ${resolvedOptions.name}`));\n if (resolvedOptions.organization) {\n console.log(pc.dim(`Organization: ${resolvedOptions.organization}`));\n }\n console.log(pc.dim(`Marker prefix: ${resolvedOptions.markerPrefix}`));\n\n console.log();\n console.log(pc.bold(\"Next steps:\"));\n console.log(` 1. Edit ${pc.cyan(\"instructions/AGENTS.md\")} with your engineering standards`);\n console.log(` 2. Add skills to ${pc.cyan(\"skills/\")} directory`);\n if (resolvedOptions.rulesDir) {\n console.log(` 3. Add rules to ${pc.cyan(`${resolvedOptions.rulesDir}/`)} directory`);\n console.log(` 4. Commit and push to create your canonical repository`);\n } else {\n console.log(` 3. Commit and push to create your canonical repository`);\n }\n console.log();\n console.log(\n pc.dim(\n `See https://github.com/julian-pani/agconf/blob/master/cli/docs/CANONICAL_REPOSITORY_SETUP.md for detailed setup instructions.`,\n ),\n );\n\n prompts.outro(pc.green(\"Done!\"));\n } catch (error) {\n spinner.fail(\"Failed to create canonical repository\");\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function directoryExists(dirPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dirPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function createTempDir(prefix: string = \"agconf-\"): Promise<string> {\n const tmpDir = os.tmpdir();\n return fs.mkdtemp(path.join(tmpDir, prefix));\n}\n\nexport async function removeTempDir(dirPath: string): Promise<void> {\n try {\n await fs.rm(dirPath, { recursive: true, force: true });\n } catch {\n // Ignore errors during cleanup\n }\n}\n\nexport function resolvePath(inputPath: string): string {\n if (inputPath.startsWith(\"~\")) {\n return path.join(os.homedir(), inputPath.slice(1));\n }\n return path.resolve(inputPath);\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { type SimpleGit, simpleGit } from \"simple-git\";\n\n/**\n * Check if a directory exists.\n */\nasync function directoryExistsForGit(dir: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dir);\n return stat.isDirectory();\n } catch {\n // Expected: directory doesn't exist\n return false;\n }\n}\n\nexport async function isGitRepo(dir: string): Promise<boolean> {\n const git: SimpleGit = simpleGit(dir);\n try {\n return await git.checkIsRepo();\n } catch {\n // Expected: not a git repo or git not available\n return false;\n }\n}\n\nexport async function getGitRoot(dir: string): Promise<string | null> {\n if (!(await directoryExistsForGit(dir))) {\n return null;\n }\n try {\n const git: SimpleGit = simpleGit(dir);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return null;\n }\n // Get the root directory of the git repository\n const root = await git.revparse([\"--show-toplevel\"]);\n return root.trim();\n } catch {\n // Expected: not a git repo or git operation failed\n return null;\n }\n}\n\n/**\n * Get the git project name (basename of the git root directory).\n * Returns null if not in a git repository or directory doesn't exist.\n */\nexport async function getGitProjectName(dir: string): Promise<string | null> {\n const gitRoot = await getGitRoot(dir);\n if (!gitRoot) {\n return null;\n }\n return path.basename(gitRoot);\n}\n\n/**\n * Check if the given directory is the root of a git repository.\n * Returns false if directory doesn't exist.\n */\nexport async function isGitRoot(dir: string): Promise<boolean> {\n if (!(await directoryExistsForGit(dir))) {\n return false;\n }\n const gitRoot = await getGitRoot(dir);\n if (!gitRoot) {\n return false;\n }\n // Resolve real paths to handle symlinks (e.g., macOS /var -> /private/var)\n try {\n const realDir = await fs.realpath(dir);\n const realGitRoot = await fs.realpath(gitRoot);\n return realDir === realGitRoot;\n } catch {\n // Fallback to simple comparison if realpath fails (e.g., symlink issues)\n return path.resolve(dir) === path.resolve(gitRoot);\n }\n}\n\n/**\n * Get organization name from git config or remote URL.\n * Returns undefined if directory doesn't exist or not in a git repo.\n * Tries to extract org from remote origin URL first, then falls back to user.name.\n */\nexport async function getGitOrganization(dir: string): Promise<string | undefined> {\n if (!(await directoryExistsForGit(dir))) {\n return undefined;\n }\n try {\n const git: SimpleGit = simpleGit(dir);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return undefined;\n }\n\n // Try to extract organization from remote origin URL\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === \"origin\");\n if (origin?.refs.fetch) {\n const url = origin.refs.fetch;\n // Match patterns like:\n // https://github.com/org/repo.git\n // git@github.com:org/repo.git\n const httpsMatch = url.match(/github\\.com\\/([^/]+)\\//);\n const sshMatch = url.match(/github\\.com:([^/]+)\\//);\n const org = httpsMatch?.[1] ?? sshMatch?.[1];\n if (org) {\n return org;\n }\n }\n\n // Fallback to user.name from git config\n const userName = await git.getConfig(\"user.name\");\n return userName.value ?? undefined;\n } catch {\n // Expected: not a git repo or git operation failed\n return undefined;\n }\n}\n","import ora, { type Ora } from \"ora\";\nimport pc from \"picocolors\";\n\nexport interface Logger {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n dim(message: string): void;\n spinner(text: string): Ora;\n}\n\nexport function createLogger(quiet = false): Logger {\n return {\n info(message: string) {\n if (!quiet) {\n console.log(`${pc.blue(\"info\")} ${message}`);\n }\n },\n\n success(message: string) {\n if (!quiet) {\n console.log(`${pc.green(\"success\")} ${message}`);\n }\n },\n\n warn(message: string) {\n console.log(`${pc.yellow(\"warn\")} ${message}`);\n },\n\n error(message: string) {\n console.error(`${pc.red(\"error\")} ${message}`);\n },\n\n dim(message: string) {\n if (!quiet) {\n console.log(pc.dim(message));\n }\n },\n\n spinner(text: string): Ora {\n if (quiet) {\n return ora({ text, isSilent: true });\n }\n return ora({ text, color: \"blue\" });\n },\n };\n}\n\nexport function formatPath(p: string, cwd: string = process.cwd()): string {\n if (p.startsWith(cwd)) {\n return `.${p.slice(cwd.length)}`;\n }\n return p;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport pc from \"picocolors\";\nimport { readLockfile } from \"../core/lockfile.js\";\nimport {\n computeGlobalBlockHash,\n computeRulesSectionHash,\n parseAgentsMd,\n parseGlobalBlockMetadata,\n parseRulesSection,\n parseRulesSectionMetadata,\n stripMetadataComments,\n stripRulesSectionMetadata,\n} from \"../core/markers.js\";\nimport {\n checkAllManagedFiles,\n computeContentHash,\n parseFrontmatter,\n} from \"../core/skill-metadata.js\";\n\nexport interface CheckOptions {\n quiet?: boolean;\n}\n\nexport interface CheckResult {\n synced: boolean;\n modifiedFiles: ModifiedFileInfo[];\n}\n\nexport interface ModifiedFileInfo {\n path: string;\n type: \"skill\" | \"agents\" | \"rule\" | \"rules-section\";\n expectedHash: string;\n currentHash: string;\n /** Rule source path if type is rule */\n rulePath?: string;\n}\n\n/**\n * Check if managed files have been modified.\n * Exits with code 0 if all files are unchanged, code 1 if changes detected.\n */\nexport async function checkCommand(options: CheckOptions = {}): Promise<void> {\n const targetDir = process.cwd();\n\n // Check if synced (lockfile exists)\n const result = await readLockfile(targetDir);\n\n if (!result) {\n if (!options.quiet) {\n console.log();\n console.log(pc.yellow(\"Not synced\"));\n console.log();\n console.log(pc.dim(\"This repository has not been synced with agconf.\"));\n console.log(pc.dim(\"Run `agconf init` to sync engineering standards.\"));\n console.log();\n }\n // Exit 0 - not synced is not an error for the check command\n return;\n }\n\n // Check schema compatibility\n const { lockfile, schemaCompatibility } = result;\n if (!schemaCompatibility.compatible) {\n if (!options.quiet) {\n console.log();\n console.log(pc.red(`Schema error: ${schemaCompatibility.error}`));\n console.log();\n }\n process.exit(1);\n }\n if (schemaCompatibility.warning && !options.quiet) {\n console.log();\n console.log(pc.yellow(`Warning: ${schemaCompatibility.warning}`));\n console.log();\n }\n\n const targets = lockfile.content.targets ?? [\"claude\"];\n const markerPrefix = lockfile.content.marker_prefix;\n const modifiedFiles: ModifiedFileInfo[] = [];\n\n // Build options for checking managed files\n const checkOptions = markerPrefix ? { markerPrefix, metadataPrefix: markerPrefix } : {};\n\n // Check all managed files\n const allFiles = await checkAllManagedFiles(targetDir, targets, checkOptions);\n\n // Gather detailed info for modified files\n // Compute the metadata key prefix (convert dashes to underscores)\n const keyPrefix = markerPrefix ? `${markerPrefix.replace(/-/g, \"_\")}_` : \"agent_conf_\";\n\n for (const file of allFiles) {\n if (!file.hasChanges) continue;\n\n if (file.type === \"agents\") {\n // Get hash info for AGENTS.md\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const content = await fs.readFile(agentsMdPath, \"utf-8\");\n const parsed = parseAgentsMd(content, markerPrefix ? { prefix: markerPrefix } : undefined);\n\n if (parsed.globalBlock) {\n const metadata = parseGlobalBlockMetadata(parsed.globalBlock);\n const contentWithoutMeta = stripMetadataComments(parsed.globalBlock);\n const currentHash = computeGlobalBlockHash(contentWithoutMeta);\n\n modifiedFiles.push({\n path: \"AGENTS.md\",\n type: \"agents\",\n expectedHash: metadata.contentHash ?? \"unknown\",\n currentHash,\n });\n }\n } else if (file.type === \"skill\") {\n // Get hash info for skill file\n const skillPath = path.join(targetDir, file.path);\n const content = await fs.readFile(skillPath, \"utf-8\");\n const { frontmatter } = parseFrontmatter(content);\n\n const metadata = frontmatter.metadata as Record<string, string> | undefined;\n const storedHash = metadata?.[`${keyPrefix}content_hash`] ?? \"unknown\";\n const currentHash = computeContentHash(\n content,\n markerPrefix ? { metadataPrefix: markerPrefix } : undefined,\n );\n\n modifiedFiles.push({\n path: file.path,\n type: \"skill\",\n expectedHash: storedHash,\n currentHash,\n });\n } else if (file.type === \"rule\") {\n // Get hash info for rule file\n const rulePath = path.join(targetDir, file.path);\n const content = await fs.readFile(rulePath, \"utf-8\");\n const { frontmatter } = parseFrontmatter(content);\n\n const metadata = frontmatter.metadata as Record<string, string> | undefined;\n const storedHash = metadata?.[`${keyPrefix}content_hash`] ?? \"unknown\";\n const currentHash = computeContentHash(\n content,\n markerPrefix ? { metadataPrefix: markerPrefix } : undefined,\n );\n\n const ruleInfo: ModifiedFileInfo = {\n path: file.path,\n type: \"rule\",\n expectedHash: storedHash,\n currentHash,\n };\n if (file.rulePath) {\n ruleInfo.rulePath = file.rulePath;\n }\n modifiedFiles.push(ruleInfo);\n } else if (file.type === \"rules-section\") {\n // Get hash info for rules section in AGENTS.md (Codex target)\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const content = await fs.readFile(agentsMdPath, \"utf-8\");\n const parsed = parseRulesSection(\n content,\n markerPrefix ? { prefix: markerPrefix } : undefined,\n );\n\n if (parsed.content) {\n const metadata = parseRulesSectionMetadata(parsed.content);\n const contentWithoutMeta = stripRulesSectionMetadata(parsed.content);\n const currentHash = computeRulesSectionHash(contentWithoutMeta);\n\n modifiedFiles.push({\n path: \"AGENTS.md\",\n type: \"rules-section\",\n expectedHash: metadata.contentHash ?? \"unknown\",\n currentHash,\n });\n }\n }\n }\n\n // Check if any managed files were found\n if (allFiles.length === 0) {\n if (options.quiet) {\n process.exit(1);\n }\n console.log();\n console.log(pc.bold(\"agconf check\"));\n console.log();\n console.log(`${pc.red(\"✗\")} No managed files found`);\n console.log();\n console.log(pc.dim(\"This repository appears to be synced but no managed files were detected.\"));\n if (markerPrefix) {\n console.log(pc.dim(`Expected marker prefix: ${markerPrefix}`));\n }\n console.log(pc.dim(\"Run 'agconf sync' to restore the managed files.\"));\n console.log();\n process.exit(1);\n }\n\n // Output results\n if (options.quiet) {\n // Quiet mode: just exit with appropriate code\n if (modifiedFiles.length > 0) {\n process.exit(1);\n }\n return;\n }\n\n console.log();\n console.log(pc.bold(\"agconf check\"));\n console.log();\n console.log(\"Checking managed files...\");\n console.log();\n\n if (modifiedFiles.length === 0) {\n console.log(`${pc.green(\"✓\")} All managed files are unchanged`);\n console.log();\n return;\n }\n\n // Modified files found\n console.log(`${pc.red(\"✗\")} ${modifiedFiles.length} managed file(s) have been modified:`);\n console.log();\n\n for (const file of modifiedFiles) {\n let label = \"\";\n if (file.type === \"agents\") {\n label = \" (global block)\";\n } else if (file.type === \"rules-section\") {\n label = \" (rules section)\";\n } else if (file.type === \"rule\" && file.rulePath) {\n label = ` (rule: ${file.rulePath})`;\n }\n console.log(` ${file.path}${pc.dim(label)}`);\n console.log(` Expected hash: ${pc.dim(file.expectedHash)}`);\n console.log(` Current hash: ${pc.dim(file.currentHash)}`);\n console.log();\n }\n\n console.log(pc.dim(\"These files are managed by agconf and should not be modified manually.\"));\n console.log(pc.dim(\"Run 'agconf sync' to restore them to the expected state.\"));\n console.log();\n\n process.exit(1);\n}\n","import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport {\n CURRENT_LOCKFILE_VERSION,\n type Lockfile,\n LockfileSchema,\n type Source,\n} from \"../schemas/lockfile.js\";\nimport { checkSchemaCompatibility, type SchemaCompatibility } from \"./schema.js\";\n\n// Injected at build time by tsup\ndeclare const __BUILD_VERSION__: string;\n\nconst CONFIG_DIR = \".agconf\";\nconst LOCKFILE_NAME = \"lockfile.json\";\n\nexport function getLockfilePath(targetDir: string): string {\n return path.join(targetDir, CONFIG_DIR, LOCKFILE_NAME);\n}\n\nexport interface ReadLockfileResult {\n lockfile: Lockfile;\n schemaCompatibility: SchemaCompatibility;\n}\n\n/**\n * Reads and validates the lockfile from a target directory.\n * Returns null if the lockfile doesn't exist.\n *\n * The result includes schema compatibility information that callers should check:\n * - If compatible is false, the CLI should refuse to proceed\n * - If warning is set, the CLI should display it but can continue\n */\nexport async function readLockfile(targetDir: string): Promise<ReadLockfileResult | null> {\n const lockfilePath = getLockfilePath(targetDir);\n\n try {\n const content = await fs.readFile(lockfilePath, \"utf-8\");\n const parsed: unknown = JSON.parse(content);\n const lockfile = LockfileSchema.parse(parsed);\n\n // Check schema compatibility\n const schemaCompatibility = checkSchemaCompatibility(lockfile.version);\n\n return { lockfile, schemaCompatibility };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nexport interface WriteLockfileOptions {\n source: Source;\n globalBlockContent: string;\n skills: string[];\n targets?: string[];\n pinnedVersion?: string;\n /** Marker prefix used for managed content (default: \"agconf\") */\n markerPrefix?: string;\n /** Rules content for lockfile tracking */\n rules?: {\n files: string[];\n content_hash: string;\n };\n}\n\nexport async function writeLockfile(\n targetDir: string,\n options: WriteLockfileOptions,\n): Promise<Lockfile> {\n const lockfilePath = getLockfilePath(targetDir);\n\n const lockfile: Lockfile = {\n version: CURRENT_LOCKFILE_VERSION,\n pinned_version: options.pinnedVersion,\n synced_at: new Date().toISOString(),\n source: options.source,\n content: {\n agents_md: {\n global_block_hash: hashContent(options.globalBlockContent),\n merged: true,\n },\n skills: options.skills,\n targets: options.targets ?? [\"claude\"],\n marker_prefix: options.markerPrefix,\n rules: options.rules,\n },\n cli_version: getCliVersion(),\n };\n\n await fs.mkdir(path.dirname(lockfilePath), { recursive: true });\n await fs.writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`, \"utf-8\");\n\n return lockfile;\n}\n\nexport function hashContent(content: string): string {\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\n return `sha256:${hash.slice(0, 12)}`;\n}\n\nexport function getCliVersion(): string {\n return typeof __BUILD_VERSION__ !== \"undefined\" ? __BUILD_VERSION__ : \"0.0.0\";\n}\n\nexport interface VersionMismatch {\n currentVersion: string;\n lockfileVersion: string;\n}\n\n/**\n * Checks if the installed CLI version is older than the version used to sync.\n * Returns mismatch info if CLI is outdated, null otherwise.\n *\n * Note: This is for informational purposes only. The CLI version in lockfile\n * is optional and used for diagnostics, not for enforcing compatibility.\n * Schema version compatibility is enforced separately.\n */\nexport async function checkCliVersionMismatch(targetDir: string): Promise<VersionMismatch | null> {\n const result = await readLockfile(targetDir);\n\n // No lockfile means first sync - no mismatch\n if (!result) {\n return null;\n }\n\n const currentVersion = getCliVersion();\n const lockfileVersion = result.lockfile.cli_version;\n\n // Can't compare if either version is missing/invalid\n if (!currentVersion || !lockfileVersion) {\n return null;\n }\n\n // Compare versions: warn if lockfile was synced with a newer CLI\n // Simple semver comparison (major.minor.patch)\n const current = currentVersion.split(\".\").map(Number);\n const lockfile_ = lockfileVersion.split(\".\").map(Number);\n\n for (let i = 0; i < 3; i++) {\n if ((lockfile_[i] || 0) > (current[i] || 0)) {\n return {\n currentVersion,\n lockfileVersion,\n };\n }\n if ((current[i] || 0) > (lockfile_[i] || 0)) {\n return null; // Current is newer, no warning needed\n }\n }\n\n return null; // Versions are equal\n}\n","import { z } from \"zod\";\n\n/**\n * Current lockfile 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_LOCKFILE_VERSION = \"1.0.0\";\n\nexport const RulesContentSchema = z.object({\n /** List of rule file paths synced (relative to rules dir) */\n files: z.array(z.string()),\n /** Hash of all rules content */\n content_hash: z.string(),\n});\n\nexport const SourceSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"github\"),\n repository: z.string(),\n commit_sha: z.string(),\n ref: z.string(),\n }),\n z.object({\n type: z.literal(\"local\"),\n path: z.string(),\n commit_sha: z.string().optional(),\n }),\n]);\n\nexport const ContentSchema = z.object({\n agents_md: z.object({\n global_block_hash: z.string(),\n merged: z.boolean(),\n }),\n skills: z.array(z.string()),\n targets: z.array(z.string()).optional(),\n /** Marker prefix used for managed content (default: \"agconf\") */\n marker_prefix: z.string().optional(),\n /** Rules content tracking - optional for backward compat */\n rules: RulesContentSchema.optional(),\n});\n\nexport const LockfileSchema = 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 /** Pinned release version of the canonical source (e.g., \"1.2.0\") */\n pinned_version: z.string().optional(),\n synced_at: z.string().datetime(),\n source: SourceSchema,\n content: ContentSchema,\n /** CLI version used for sync (optional, for diagnostics only) */\n cli_version: z.string().optional(),\n});\n\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Content = z.infer<typeof ContentSchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\nexport type RulesContent = z.infer<typeof RulesContentSchema>;\n","/**\n * Schema versioning utilities for agconf.\n *\n * Schema versioning strategy:\n * - Schema version determines compatibility, not CLI version\n * - CLI refuses to work across major schema versions\n * - CLI warns but continues for minor version differences\n * - CLI version in lockfile is optional and for diagnostics only\n */\n\n/**\n * The schema version this CLI understands.\n * This is the version of the lockfile/config schema format.\n */\nexport const SUPPORTED_SCHEMA_VERSION = \"1.0.0\";\n\nexport interface SchemaCompatibility {\n /** Whether the CLI can work with this schema version */\n compatible: boolean;\n /** Warning message for minor version differences (continue with warning) */\n warning?: string;\n /** Error message for major version incompatibility (refuse to proceed) */\n error?: string;\n}\n\n/**\n * Checks if the CLI can work with a given schema version.\n *\n * Compatibility rules:\n * - Same major version: compatible\n * - Content has newer minor/patch: warn (may miss features)\n * - Content has newer major: error (upgrade CLI needed)\n * - Content has older major: error (migration needed)\n *\n * @param contentVersion - The schema version from the lockfile or config\n * @returns Compatibility status with optional warning/error messages\n */\nexport function checkSchemaCompatibility(contentVersion: string): SchemaCompatibility {\n const contentParts = contentVersion.split(\".\").map(Number);\n const supportedParts = SUPPORTED_SCHEMA_VERSION.split(\".\").map(Number);\n\n const contentMajor = contentParts[0] ?? 0;\n const contentMinor = contentParts[1] ?? 0;\n const supportedMajor = supportedParts[0] ?? 0;\n const supportedMinor = supportedParts[1] ?? 0;\n\n // Major version mismatch = hard error\n if (contentMajor > supportedMajor) {\n return {\n compatible: false,\n error: `Schema version ${contentVersion} requires a newer CLI. Run: npm install -g agconf@latest`,\n };\n }\n\n if (contentMajor < supportedMajor) {\n return {\n compatible: false,\n error: `Schema version ${contentVersion} is outdated and no longer supported. This content was created with an older version of agconf.`,\n };\n }\n\n // Same major, but content has newer minor = warn (may miss features)\n if (contentMinor > supportedMinor) {\n return {\n compatible: true,\n warning: `Content uses schema ${contentVersion}, CLI supports ${SUPPORTED_SCHEMA_VERSION}. Some features may not work. Consider upgrading: npm install -g agconf@latest`,\n };\n }\n\n // Fully compatible (same major, same or older minor)\n return { compatible: true };\n}\n\n/**\n * Validates that a string is a valid semver format.\n *\n * @param version - The version string to validate\n * @returns true if the version is valid semver format\n */\nexport function isValidSemver(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport tabtab from \"tabtab\";\n// @ts-expect-error - tabtab internal module not typed\nimport tabtabInstaller from \"tabtab/lib/installer.js\";\n\nconst CLI_NAME = \"agconf\";\n\n// Commands and their options for completion\nconst COMMANDS = {\n init: {\n description: \"Initialize or sync agconf standards\",\n options: [\"-s\", \"--source\", \"--local\", \"-y\", \"--yes\", \"--override\", \"--ref\", \"-t\", \"--target\"],\n },\n sync: {\n description: \"Sync agconf standards\",\n options: [\"-s\", \"--source\", \"--local\", \"-y\", \"--yes\", \"--override\", \"--ref\", \"-t\", \"--target\"],\n },\n status: {\n description: \"Show current sync status\",\n options: [\"-c\", \"--check\"],\n },\n update: {\n description: \"Check for and apply updates\",\n options: [\"-y\", \"--yes\", \"-t\", \"--target\"],\n },\n check: {\n description: \"Check if managed files have been modified\",\n options: [\"-q\", \"--quiet\"],\n },\n config: {\n description: \"Manage global CLI configuration\",\n options: [],\n },\n \"upgrade-cli\": {\n description: \"Upgrade the CLI to latest version\",\n options: [\"-y\", \"--yes\"],\n },\n canonical: {\n description: \"Manage canonical repositories\",\n options: [],\n subcommands: {\n init: {\n description: \"Scaffold a new canonical repository\",\n options: [\n \"-n\",\n \"--name\",\n \"-o\",\n \"--org\",\n \"-d\",\n \"--dir\",\n \"--marker-prefix\",\n \"--no-examples\",\n \"--rules-dir\",\n \"-y\",\n \"--yes\",\n ],\n },\n },\n },\n completion: {\n description: \"Manage shell completions\",\n options: [],\n },\n};\n\nconst CONFIG_SUBCOMMANDS = [\"show\", \"get\", \"set\"];\nconst COMPLETION_SUBCOMMANDS = [\"install\", \"uninstall\"];\nconst CANONICAL_SUBCOMMANDS = [\"init\"];\nconst TARGET_VALUES = [\"claude\", \"codex\"];\n\n/**\n * Handle shell completion requests.\n * This should be called early in the CLI lifecycle.\n * Returns true if this was a completion request (and it was handled).\n */\nexport function handleCompletion(): boolean {\n const env = tabtab.parseEnv(process.env);\n\n if (!env.complete) {\n return false;\n }\n\n // Determine what to complete based on context\n const { prev, words } = env;\n\n // Complete command names\n if (prev === CLI_NAME || words === 1) {\n tabtab.log(\n Object.entries(COMMANDS).map(([name, info]) => ({\n name,\n description: info.description,\n })),\n );\n return true;\n }\n\n // Find which command we're completing for\n const commandIndex = 1; // words[0] is the CLI name\n const currentCommand = env.line.split(/\\s+/)[commandIndex];\n\n // Complete subcommands for 'config'\n if (currentCommand === \"config\" && words === 2) {\n tabtab.log(\n CONFIG_SUBCOMMANDS.map((name) => ({\n name,\n description: `${name} configuration`,\n })),\n );\n return true;\n }\n\n // Complete subcommands for 'completion'\n if (currentCommand === \"completion\" && words === 2) {\n tabtab.log(\n COMPLETION_SUBCOMMANDS.map((name) => ({\n name,\n description: `${name} shell completions`,\n })),\n );\n return true;\n }\n\n // Complete subcommands for 'canonical'\n if (currentCommand === \"canonical\" && words === 2) {\n tabtab.log(\n CANONICAL_SUBCOMMANDS.map((name) => ({\n name,\n description: \"Scaffold a new canonical repository\",\n })),\n );\n return true;\n }\n\n // Complete options for 'canonical' subcommands\n if (currentCommand === \"canonical\" && words >= 3) {\n const subcommand = env.line.split(/\\s+/)[2];\n const canonicalCmd = COMMANDS.canonical as {\n subcommands: Record<string, { options: string[] }>;\n };\n if (subcommand && subcommand in canonicalCmd.subcommands) {\n const subcommandConfig = canonicalCmd.subcommands[subcommand];\n if (subcommandConfig) {\n tabtab.log(subcommandConfig.options);\n return true;\n }\n }\n }\n\n // Complete --target values\n if (prev === \"--target\" || prev === \"-t\") {\n tabtab.log(TARGET_VALUES);\n return true;\n }\n\n // Complete options for the current command\n if (currentCommand && currentCommand in COMMANDS) {\n const command = COMMANDS[currentCommand as keyof typeof COMMANDS];\n tabtab.log(command.options);\n return true;\n }\n\n // Default: complete command names\n tabtab.log(Object.keys(COMMANDS));\n return true;\n}\n\n/**\n * Get the tabtab completion script path for this CLI.\n * tabtab stores completions in ~/.config/tabtab/<name>.<shell>\n */\nfunction getTabtabCompletionFile(shell: string): string {\n const home = os.homedir();\n const ext = shell === \"fish\" ? \"fish\" : shell === \"zsh\" ? \"zsh\" : \"bash\";\n return path.join(home, \".config\", \"tabtab\", `${CLI_NAME}.${ext}`);\n}\n\n/**\n * Check if shell completions are already installed for the current shell.\n */\nexport function isCompletionInstalled(): boolean {\n const shell = detectShell();\n if (!shell) return false;\n\n // Check if the tabtab completion file exists for this CLI\n const completionFile = getTabtabCompletionFile(shell);\n if (fs.existsSync(completionFile)) {\n return true;\n }\n\n // Fallback: check if the shell config mentions this CLI's completions\n const configFile = getShellConfigFile(shell);\n if (!configFile || !fs.existsSync(configFile)) return false;\n\n try {\n const content = fs.readFileSync(configFile, \"utf-8\");\n return (\n content.includes(`tabtab source for ${CLI_NAME}`) || content.includes(`begin ${CLI_NAME}`)\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Detect shell from $SHELL environment variable.\n * Uses the same detection method as tabtab for consistency.\n * Exported for testing.\n */\nexport function detectShell(): string | null {\n const shell = process.env.SHELL || \"\";\n if (shell.includes(\"fish\")) return \"fish\";\n if (shell.includes(\"zsh\")) return \"zsh\";\n if (shell.includes(\"bash\")) return \"bash\";\n return null;\n}\n\n/** Get the config file path for a given shell. Exported for testing. */\nexport function getShellConfigFile(shell: string): string | null {\n const home = os.homedir();\n switch (shell) {\n case \"zsh\":\n return path.join(home, \".zshrc\");\n case \"bash\": {\n // Check for .bash_profile first (macOS), then .bashrc\n const bashProfile = path.join(home, \".bash_profile\");\n if (fs.existsSync(bashProfile)) return bashProfile;\n return path.join(home, \".bashrc\");\n }\n case \"fish\":\n return path.join(home, \".config\", \"fish\", \"config.fish\");\n default:\n return null;\n }\n}\n\n/**\n * Install shell completions directly without prompting for shell.\n * Uses the detected shell from $SHELL environment variable.\n */\nasync function installCompletionForShell(shell: string): Promise<void> {\n const location = getShellConfigFile(shell);\n if (!location) {\n throw new Error(`Unsupported shell: ${shell}`);\n }\n\n await tabtabInstaller.install({\n name: CLI_NAME,\n completer: CLI_NAME,\n location,\n });\n}\n\n/**\n * Install shell completions.\n */\nexport async function installCompletion(): Promise<void> {\n console.log();\n prompts.intro(pc.bold(\"Installing shell completions\"));\n\n const shell = detectShell();\n if (!shell) {\n prompts.log.warn(\"Could not detect shell. Supported shells: bash, zsh, fish\");\n prompts.outro(\"Completions not installed\");\n return;\n }\n\n prompts.log.info(`Detected shell: ${pc.cyan(shell)}`);\n\n if (isCompletionInstalled()) {\n prompts.log.success(\"Shell completions are already installed\");\n prompts.outro(\"Nothing to do\");\n return;\n }\n\n try {\n await installCompletionForShell(shell);\n\n prompts.log.success(`Completions installed for ${pc.cyan(shell)}`);\n prompts.log.info(\n `Restart your shell or run: ${pc.cyan(`source ${getShellConfigFile(shell)}`)}`,\n );\n prompts.outro(\"Done!\");\n } catch (error) {\n prompts.log.error(`Failed to install completions: ${error}`);\n prompts.outro(\"Installation failed\");\n process.exit(1);\n }\n}\n\n/**\n * Uninstall shell completions.\n */\nexport async function uninstallCompletion(): Promise<void> {\n console.log();\n prompts.intro(pc.bold(\"Uninstalling shell completions\"));\n\n try {\n await tabtab.uninstall({\n name: CLI_NAME,\n });\n\n prompts.log.success(\"Shell completions uninstalled\");\n prompts.outro(\"Done!\");\n } catch (error) {\n prompts.log.error(`Failed to uninstall completions: ${error}`);\n prompts.outro(\"Uninstallation failed\");\n process.exit(1);\n }\n}\n\n/**\n * Prompt user to install completions if not already installed.\n * Used during 'init' command.\n * Returns true if completions were installed.\n */\nexport async function promptCompletionInstall(): Promise<boolean> {\n if (isCompletionInstalled()) {\n return false;\n }\n\n const shell = detectShell();\n if (!shell) {\n // Don't prompt if we can't detect the shell\n return false;\n }\n\n const shouldInstall = await prompts.confirm({\n message: `Install shell completions for ${shell}?`,\n });\n\n if (prompts.isCancel(shouldInstall) || !shouldInstall) {\n prompts.log.info(`You can install later with: ${pc.cyan(\"agconf completion install\")}`);\n return false;\n }\n\n try {\n await installCompletionForShell(shell);\n\n prompts.log.success(`Completions installed for ${pc.cyan(shell)}`);\n prompts.log.info(\n `Restart your shell or run: ${pc.cyan(`source ${getShellConfigFile(shell)}`)}`,\n );\n return true;\n } catch (error) {\n prompts.log.warn(`Could not install completions: ${error}`);\n prompts.log.info(`You can try again with: ${pc.cyan(\"agconf completion install\")}`);\n return false;\n }\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { createLogger } from \"../utils/logger.js\";\n\nexport type ConfigOptions = Record<string, never>;\n\nexport async function configShowCommand(): Promise<void> {\n console.log();\n prompts.intro(pc.bold(\"agconf config\"));\n\n console.log();\n console.log(pc.bold(\"Global Configuration:\"));\n console.log();\n console.log(pc.dim(\" No configuration options available.\"));\n console.log();\n console.log(pc.dim(\"Config location: ~/.agconf/config.json\"));\n\n prompts.outro(\"\");\n}\n\nexport async function configGetCommand(key: string): Promise<void> {\n const logger = createLogger();\n logger.error(`Unknown config key: ${key}`);\n logger.info(\"No configuration options available.\");\n process.exit(1);\n}\n\nexport async function configSetCommand(key: string, _value: string): Promise<void> {\n const logger = createLogger();\n logger.error(`Unknown config key: ${key}`);\n logger.info(\"No configuration options available.\");\n process.exit(1);\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getSyncStatus } from \"../core/sync.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { promptCompletionInstall } from \"./completion.js\";\nimport {\n checkModifiedFilesBeforeSync,\n parseAndValidateTargets,\n performSync,\n promptMergeOrOverride,\n resolveSource,\n resolveTargetDirectory,\n resolveVersion,\n type SharedSyncOptions,\n} from \"./shared.js\";\n\nexport interface InitOptions extends SharedSyncOptions {}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agconf init\"));\n\n // Resolve target directory to git root\n const targetDir = await resolveTargetDirectory();\n\n // Parse targets\n const targets = await parseAndValidateTargets(options.target);\n\n // Check current status\n const status = await getSyncStatus(targetDir);\n\n // Check schema compatibility\n if (status.schemaError) {\n logger.error(status.schemaError);\n process.exit(1);\n }\n if (status.schemaWarning) {\n logger.warn(status.schemaWarning);\n }\n\n // Prompt if already synced (init-specific behavior)\n if (status.hasSynced && !options.yes) {\n const shouldContinue = await prompts.confirm({\n message: \"This repository has already been synced. Do you want to sync again?\",\n });\n\n if (prompts.isCancel(shouldContinue) || !shouldContinue) {\n prompts.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n }\n\n // Resolve version (fetches latest release if no --ref specified)\n // For GitHub sources, pass the repo to fetch releases from\n const resolvedVersion = await resolveVersion(options, status, \"init\", options.source);\n\n // Resolve source using the determined version\n const { resolvedSource, tempDir, repository } = await resolveSource(options, resolvedVersion);\n\n // Determine merge behavior\n const shouldOverride = await promptMergeOrOverride(status, options, tempDir);\n\n // Check for modified skill files and warn\n await checkModifiedFilesBeforeSync(targetDir, targets, options, tempDir);\n\n // Perform sync (includes workflow files for release versions)\n await performSync({\n targetDir,\n resolvedSource,\n resolvedVersion,\n shouldOverride,\n targets,\n context: {\n commandName: \"init\",\n status,\n },\n tempDir,\n yes: options.yes,\n sourceRepo: repository,\n });\n\n // Prompt to install shell completions (only if not in non-interactive mode)\n if (!options.yes) {\n await promptCompletionInstall();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { Lockfile } from \"../schemas/lockfile.js\";\nimport { readLockfile, writeLockfile } from \"./lockfile.js\";\nimport { ensureClaudeMd, mergeAgentsMd, writeAgentsMd } from \"./merge.js\";\nimport {\n addRuleMetadata,\n generateRulesSection,\n parseRule,\n type Rule,\n updateAgentsMdWithRules,\n} from \"./rules.js\";\nimport {\n addManagedMetadata,\n type SkillValidationError,\n validateSkillFrontmatter,\n} from \"./skill-metadata.js\";\nimport type { ResolvedSource } from \"./source.js\";\nimport { getTargetConfig, type Target, type TargetConfig } from \"./targets.js\";\n\nexport interface SyncOptions {\n override: boolean;\n targets: Target[];\n /** Pinned version to record in lockfile */\n pinnedVersion?: string;\n}\n\n// =============================================================================\n// Rules Sync\n// =============================================================================\n\nexport interface RulesSyncOptions {\n sourceRulesPath: string;\n targetDir: string;\n targets: Target[];\n markerPrefix: string;\n metadataPrefix: string;\n agentsMdContent: string;\n}\n\nexport interface RulesSyncResult {\n rules: Rule[];\n updatedAgentsMd: string | null;\n claudeFiles: string[];\n modifiedRules: string[];\n contentHash: string;\n}\n\n/**\n * Discover all markdown rule files in a directory recursively.\n */\nasync function discoverRules(rulesDir: string): Promise<Rule[]> {\n try {\n await fs.access(rulesDir);\n } catch {\n // Directory doesn't exist - return empty array\n return [];\n }\n\n const ruleFiles = await fg(\"**/*.md\", {\n cwd: rulesDir,\n absolute: false,\n });\n\n const rules: Rule[] = [];\n for (const relativePath of ruleFiles) {\n const fullPath = path.join(rulesDir, relativePath);\n const content = await fs.readFile(fullPath, \"utf-8\");\n rules.push(parseRule(content, relativePath));\n }\n\n return rules;\n}\n\n/**\n * Compute aggregate hash for a list of rules.\n * Rules are sorted by path for determinism.\n */\nfunction computeRulesHash(rules: Rule[]): string {\n if (rules.length === 0) return \"\";\n\n const sorted = [...rules].sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n const combined = sorted.map((r) => `${r.relativePath}:${r.body}`).join(\"\\n---\\n\");\n const hash = createHash(\"sha256\").update(combined).digest(\"hex\");\n return hash.slice(0, 16);\n}\n\n/**\n * Sync rules from a canonical source to target directory.\n *\n * For Claude target: Copy rules to .claude/rules/ with metadata added\n * For Codex target: Generate rules section and return updated AGENTS.md\n */\nexport async function syncRules(options: RulesSyncOptions): Promise<RulesSyncResult> {\n const { sourceRulesPath, targetDir, targets, markerPrefix, metadataPrefix, agentsMdContent } =\n options;\n\n // Discover all rules\n const rules = await discoverRules(sourceRulesPath);\n\n const result: RulesSyncResult = {\n rules,\n updatedAgentsMd: null,\n claudeFiles: [],\n modifiedRules: [],\n contentHash: \"\",\n };\n\n // No rules - return early\n if (rules.length === 0) {\n return result;\n }\n\n // Compute content hash for lockfile\n result.contentHash = computeRulesHash(rules);\n\n // Sync to Claude target\n if (targets.includes(\"claude\")) {\n const claudeRulesDir = path.join(targetDir, \".claude\", \"rules\");\n\n for (const rule of rules) {\n const targetPath = path.join(claudeRulesDir, rule.relativePath);\n\n // Ensure parent directory exists\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n\n // Add metadata and write file\n const contentWithMetadata = addRuleMetadata(rule, metadataPrefix);\n\n // Check if file exists and has same content\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(targetPath, \"utf-8\");\n } catch {\n // File doesn't exist\n }\n\n if (existingContent !== contentWithMetadata) {\n await fs.writeFile(targetPath, contentWithMetadata, \"utf-8\");\n result.modifiedRules.push(rule.relativePath);\n }\n\n result.claudeFiles.push(rule.relativePath);\n }\n }\n\n // Sync to Codex target\n if (targets.includes(\"codex\")) {\n const rulesSection = generateRulesSection(rules, markerPrefix);\n result.updatedAgentsMd = updateAgentsMdWithRules(agentsMdContent, rulesSection, markerPrefix);\n }\n\n return result;\n}\n\nexport interface TargetResult {\n target: Target;\n instructionsMd: {\n created: boolean;\n updated: boolean;\n location: \"root\" | \"dotdir\" | null;\n contentMerged: boolean;\n };\n skills: {\n copied: number;\n };\n}\n\nexport interface SyncResult {\n lockfile: Lockfile;\n agentsMd: {\n merged: boolean;\n preservedRepoContent: boolean;\n };\n targets: TargetResult[];\n skills: {\n synced: string[];\n modified: string[];\n totalCopied: number;\n validationErrors: SkillValidationError[];\n };\n rules?: {\n synced: string[];\n modified: string[];\n contentHash: string;\n claudeFiles: string[];\n codexUpdated: boolean;\n };\n}\n\nexport async function sync(\n targetDir: string,\n resolvedSource: ResolvedSource,\n options: SyncOptions = { override: false, targets: [\"claude\"] },\n): Promise<SyncResult> {\n // Get marker prefix from resolved source\n const markerPrefix = resolvedSource.markerPrefix;\n\n // Read global AGENTS.md content\n const globalContent = await fs.readFile(resolvedSource.agentsMdPath, \"utf-8\");\n\n // Merge/write AGENTS.md (also gathers existing CLAUDE.md content)\n const mergeResult = await mergeAgentsMd(targetDir, globalContent, resolvedSource.source, {\n override: options.override,\n markerPrefix,\n });\n await writeAgentsMd(targetDir, mergeResult.content);\n\n // Find all skill directories once\n const skillDirs = await fg(\"*/\", {\n cwd: resolvedSource.skillsPath,\n onlyDirectories: true,\n deep: 1,\n });\n const skillNames = skillDirs.map((d) => d.replace(/\\/$/, \"\"));\n\n // Validate all skills have required frontmatter\n const validationErrors: SkillValidationError[] = [];\n for (const skillName of skillNames) {\n const skillMdPath = path.join(resolvedSource.skillsPath, skillName, \"SKILL.md\");\n try {\n const content = await fs.readFile(skillMdPath, \"utf-8\");\n const error = validateSkillFrontmatter(content, skillName, skillMdPath);\n if (error) {\n validationErrors.push(error);\n }\n } catch {\n // Expected: SKILL.md may not exist, will be handled during sync\n }\n }\n\n // Process each target\n const targetResults: TargetResult[] = [];\n let totalCopied = 0;\n const allModifiedSkills = new Set<string>();\n\n for (const target of options.targets) {\n const config = getTargetConfig(target);\n\n // Sync skills to this target\n const skillsResult = await syncSkillsToTarget(\n targetDir,\n resolvedSource.skillsPath,\n skillNames,\n config,\n markerPrefix,\n );\n totalCopied += skillsResult.copied;\n for (const skill of skillsResult.modifiedSkills) {\n allModifiedSkills.add(skill);\n }\n\n // Only Claude needs an instructions file with @AGENTS.md reference\n // Other targets (codex, etc.) read AGENTS.md directly\n let instructionsResult: TargetResult[\"instructionsMd\"];\n if (config.instructionsFile) {\n instructionsResult = await ensureInstructionsMd(\n targetDir,\n config,\n target === \"claude\" ? mergeResult.claudeMdLocation : null,\n );\n } else {\n instructionsResult = {\n created: false,\n updated: false,\n location: null,\n contentMerged: false,\n };\n }\n\n targetResults.push({\n target,\n instructionsMd: instructionsResult,\n skills: { copied: skillsResult.copied },\n });\n }\n\n // Sync rules if canonical has rules configured\n let rulesResult: RulesSyncResult | null = null;\n if (resolvedSource.rulesPath) {\n // Read current AGENTS.md content for potential Codex rules insertion\n const currentAgentsMd = await fs.readFile(path.join(targetDir, \"AGENTS.md\"), \"utf-8\");\n\n rulesResult = await syncRules({\n sourceRulesPath: resolvedSource.rulesPath,\n targetDir,\n targets: options.targets,\n markerPrefix,\n metadataPrefix: markerPrefix.replace(/-/g, \"_\"),\n agentsMdContent: currentAgentsMd,\n });\n\n // If Codex target and rules were found, update AGENTS.md with rules section\n if (rulesResult.updatedAgentsMd && options.targets.includes(\"codex\")) {\n await writeAgentsMd(targetDir, rulesResult.updatedAgentsMd);\n }\n }\n\n // Write lockfile\n const lockfileOptions: Parameters<typeof writeLockfile>[1] = {\n source: resolvedSource.source,\n globalBlockContent: globalContent,\n skills: skillNames,\n targets: options.targets,\n markerPrefix,\n };\n if (options.pinnedVersion) {\n lockfileOptions.pinnedVersion = options.pinnedVersion;\n }\n if (rulesResult && rulesResult.rules.length > 0) {\n lockfileOptions.rules = {\n files: rulesResult.rules.map((r) => r.relativePath),\n content_hash: rulesResult.contentHash,\n };\n }\n const lockfile = await writeLockfile(targetDir, lockfileOptions);\n\n const result: SyncResult = {\n lockfile,\n agentsMd: {\n merged: mergeResult.merged,\n preservedRepoContent: mergeResult.preservedRepoContent,\n },\n targets: targetResults,\n skills: {\n synced: skillNames,\n modified: [...allModifiedSkills],\n totalCopied,\n validationErrors,\n },\n };\n\n if (rulesResult && rulesResult.rules.length > 0) {\n result.rules = {\n synced: rulesResult.rules.map((r) => r.relativePath),\n modified: rulesResult.modifiedRules,\n contentHash: rulesResult.contentHash,\n claudeFiles: rulesResult.claudeFiles,\n codexUpdated: rulesResult.updatedAgentsMd !== null,\n };\n }\n\n return result;\n}\n\ninterface SkillSyncResult {\n copied: number;\n modifiedSkills: string[];\n}\n\nasync function syncSkillsToTarget(\n targetDir: string,\n sourceSkillsPath: string,\n skillNames: string[],\n config: TargetConfig,\n metadataPrefix: string,\n): Promise<SkillSyncResult> {\n const targetSkillsPath = path.join(targetDir, config.dir, \"skills\");\n let copied = 0;\n const modifiedSkills: string[] = [];\n\n for (const skillName of skillNames) {\n const sourceDir = path.join(sourceSkillsPath, skillName);\n const targetSkillDir = path.join(targetSkillsPath, skillName);\n\n const result = await copySkillDirectory(sourceDir, targetSkillDir, metadataPrefix);\n copied += result.copied;\n if (result.modified) {\n modifiedSkills.push(skillName);\n }\n }\n\n return { copied, modifiedSkills };\n}\n\ninterface CopyResult {\n copied: number;\n modified: boolean;\n}\n\n/**\n * Copy a skill directory, adding managed metadata to SKILL.md files.\n * Returns whether any files were actually modified (content changed).\n */\nasync function copySkillDirectory(\n sourceDir: string,\n targetDir: string,\n metadataPrefix: string,\n): Promise<CopyResult> {\n await fs.mkdir(targetDir, { recursive: true });\n\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n let copied = 0;\n let modified = false;\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n const subResult = await copySkillDirectory(sourcePath, targetPath, metadataPrefix);\n copied += subResult.copied;\n if (subResult.modified) modified = true;\n } else if (entry.name === \"SKILL.md\") {\n // Add managed metadata to SKILL.md files\n const content = await fs.readFile(sourcePath, \"utf-8\");\n const contentWithMetadata = addManagedMetadata(content, { metadataPrefix });\n\n // Check if file exists and has same content\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(targetPath, \"utf-8\");\n } catch {\n // File doesn't exist\n }\n\n if (existingContent !== contentWithMetadata) {\n await fs.writeFile(targetPath, contentWithMetadata, \"utf-8\");\n modified = true;\n }\n copied++;\n } else {\n // Check if file exists and has same content\n let needsCopy = true;\n try {\n const [sourceContent, targetContent] = await Promise.all([\n fs.readFile(sourcePath),\n fs.readFile(targetPath),\n ]);\n needsCopy = !sourceContent.equals(targetContent);\n } catch {\n // Target doesn't exist\n }\n\n if (needsCopy) {\n await fs.copyFile(sourcePath, targetPath);\n modified = true;\n }\n copied++;\n }\n }\n\n return { copied, modified };\n}\n\nasync function ensureInstructionsMd(\n targetDir: string,\n config: TargetConfig,\n existingLocation: \"root\" | \"dotclaude\" | null,\n): Promise<{\n created: boolean;\n updated: boolean;\n location: \"root\" | \"dotdir\" | null;\n contentMerged: boolean;\n}> {\n // Only Claude needs an instructions file\n if (!config.instructionsFile) {\n return { created: false, updated: false, location: null, contentMerged: false };\n }\n\n // Use the existing ensureClaudeMd logic for Claude\n const result = await ensureClaudeMd(targetDir, existingLocation);\n return {\n created: result.created,\n updated: result.updated,\n location: result.location === \"dotclaude\" ? \"dotdir\" : result.location,\n contentMerged: result.contentMerged,\n };\n}\n\nexport interface SyncStatus {\n hasSynced: boolean;\n lockfile: Lockfile | null;\n agentsMdExists: boolean;\n skillsExist: boolean;\n /** Schema compatibility warning (null if no warning) */\n schemaWarning: string | null;\n /** Schema compatibility error (null if no error) */\n schemaError: string | null;\n}\n\nexport async function getSyncStatus(targetDir: string): Promise<SyncStatus> {\n const result = await readLockfile(targetDir);\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const skillsPath = path.join(targetDir, \".claude\", \"skills\");\n\n const [agentsMdExists, skillsExist] = await Promise.all([\n fs\n .access(agentsMdPath)\n .then(() => true)\n .catch(() => false),\n fs\n .access(skillsPath)\n .then(() => true)\n .catch(() => false),\n ]);\n\n return {\n hasSynced: result !== null,\n lockfile: result?.lockfile ?? null,\n agentsMdExists,\n skillsExist,\n schemaWarning: result?.schemaCompatibility.warning ?? null,\n schemaError: result?.schemaCompatibility.error ?? null,\n };\n}\n\n/**\n * Find skills that were previously synced but are no longer in the current sync.\n */\nexport function findOrphanedSkills(previousSkills: string[], currentSkills: string[]): string[] {\n return previousSkills.filter((skill) => !currentSkills.includes(skill));\n}\n\n/** Options for deleting orphaned skills */\nexport interface DeleteOrphanedSkillsOptions {\n /** Metadata prefix to use for checking managed status (default: \"agconf\") */\n metadataPrefix?: string;\n}\n\n/**\n * Delete orphaned skill directories from all targets.\n * Only deletes skills that:\n * 1. Are managed (have managed metadata in SKILL.md)\n * 2. AND either:\n * - Content hash matches (skill hasn't been modified), OR\n * - Skill was in the previous lockfile (confirming it was synced)\n *\n * This prevents accidentally deleting skills that were manually copied.\n */\nexport async function deleteOrphanedSkills(\n targetDir: string,\n orphanedSkills: string[],\n targets: string[],\n previouslyTrackedSkills: string[],\n options: DeleteOrphanedSkillsOptions = {},\n): Promise<{ deleted: string[]; skipped: string[] }> {\n const deleted: string[] = [];\n const skipped: string[] = [];\n const metadataOptions = options.metadataPrefix\n ? { metadataPrefix: options.metadataPrefix }\n : undefined;\n\n for (const skillName of orphanedSkills) {\n let wasDeleted = false;\n\n for (const target of targets) {\n const skillDir = path.join(targetDir, `.${target}`, \"skills\", skillName);\n\n // Check if skill directory exists\n try {\n await fs.access(skillDir);\n } catch {\n // Expected: skill directory may not exist for this target\n continue;\n }\n\n // Check if the skill is managed before deleting\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n try {\n const content = await fs.readFile(skillMdPath, \"utf-8\");\n const { isManaged, hasManualChanges } = await import(\"./skill-metadata.js\");\n\n if (!isManaged(content, metadataOptions)) {\n // Not managed, skip deletion\n if (!skipped.includes(skillName)) {\n skipped.push(skillName);\n }\n continue;\n }\n\n // Additional safety check: only delete if either:\n // 1. The skill was in the previous lockfile (confirming it was synced), OR\n // 2. The content hash matches (skill hasn't been modified)\n const wasInPreviousLockfile = previouslyTrackedSkills.includes(skillName);\n const isUnmodified = !hasManualChanges(content, metadataOptions);\n\n if (!wasInPreviousLockfile && !isUnmodified) {\n // Skill is managed but wasn't in lockfile and has been modified\n // This could be a manually copied skill - skip to be safe\n if (!skipped.includes(skillName)) {\n skipped.push(skillName);\n }\n continue;\n }\n } catch {\n // Expected: SKILL.md may not exist, skip deletion to be safe\n if (!skipped.includes(skillName)) {\n skipped.push(skillName);\n }\n continue;\n }\n\n // Delete the skill directory\n await fs.rm(skillDir, { recursive: true, force: true });\n wasDeleted = true;\n }\n\n if (wasDeleted && !deleted.includes(skillName)) {\n deleted.push(skillName);\n }\n }\n\n return { deleted, skipped };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { Source } from \"../schemas/lockfile.js\";\nimport { buildAgentsMd, extractRepoBlockContent, parseAgentsMd } from \"./markers.js\";\n\nexport interface MergeOptions {\n override: boolean;\n /** Marker prefix to use for managed content (default: \"agconf\") */\n markerPrefix?: string;\n}\n\nexport interface MergeResult {\n content: string;\n merged: boolean;\n preservedRepoContent: boolean;\n}\n\nexport interface ClaudeMdResult {\n created: boolean;\n updated: boolean;\n location: \"root\" | \"dotclaude\" | null;\n contentMerged: boolean;\n}\n\ninterface ExistingContent {\n agentsMd: string | null;\n claudeMd: string | null;\n claudeMdLocation: \"root\" | \"dotclaude\" | null;\n}\n\nasync function readFileIfExists(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function gatherExistingContent(targetDir: string): Promise<ExistingContent> {\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n const rootClaudeMdPath = path.join(targetDir, \"CLAUDE.md\");\n const dotClaudeClaudeMdPath = path.join(targetDir, \".claude\", \"CLAUDE.md\");\n\n const agentsMd = await readFileIfExists(agentsMdPath);\n\n // Check root CLAUDE.md first, then .claude/CLAUDE.md\n const rootClaudeMd = await readFileIfExists(rootClaudeMdPath);\n if (rootClaudeMd !== null) {\n return { agentsMd, claudeMd: rootClaudeMd, claudeMdLocation: \"root\" };\n }\n\n const dotClaudeClaudeMd = await readFileIfExists(dotClaudeClaudeMdPath);\n if (dotClaudeClaudeMd !== null) {\n return { agentsMd, claudeMd: dotClaudeClaudeMd, claudeMdLocation: \"dotclaude\" };\n }\n\n return { agentsMd, claudeMd: null, claudeMdLocation: null };\n}\n\nfunction stripAgentsReference(content: string): string {\n // Remove @AGENTS.md, @../AGENTS.md, or @.claude/AGENTS.md references\n return content\n .split(\"\\n\")\n .filter((line) => {\n const trimmed = line.trim();\n return !trimmed.match(/^@(\\.\\.\\/|\\.claude\\/)?AGENTS\\.md$/);\n })\n .join(\"\\n\")\n .trim();\n}\n\nexport async function mergeAgentsMd(\n targetDir: string,\n globalContent: string,\n _source: Source,\n options: MergeOptions = { override: false },\n): Promise<\n MergeResult & {\n existingClaudeMdContent: string | null;\n claudeMdLocation: \"root\" | \"dotclaude\" | null;\n }\n> {\n const existing = await gatherExistingContent(targetDir);\n const markerOptions = options.markerPrefix ? { prefix: options.markerPrefix } : undefined;\n\n // Collect content to merge into repo block\n const contentToMerge: string[] = [];\n\n // Handle existing AGENTS.md\n if (existing.agentsMd !== null && !options.override) {\n const parsed = parseAgentsMd(existing.agentsMd, markerOptions);\n if (parsed.hasMarkers) {\n // Has markers - preserve repo block content\n const repoContent = extractRepoBlockContent(parsed);\n if (repoContent) {\n contentToMerge.push(repoContent);\n }\n } else {\n // No markers - treat entire content as repo-specific\n contentToMerge.push(existing.agentsMd.trim());\n }\n }\n\n // Handle existing CLAUDE.md content (merge into repo block)\n let claudeMdContentForMerge: string | null = null;\n if (existing.claudeMd !== null && !options.override) {\n const strippedContent = stripAgentsReference(existing.claudeMd);\n if (strippedContent) {\n claudeMdContentForMerge = strippedContent;\n contentToMerge.push(strippedContent);\n }\n }\n\n // Build final repo content\n const repoContent = contentToMerge.length > 0 ? contentToMerge.join(\"\\n\\n\") : null;\n const content = buildAgentsMd(globalContent, repoContent, {}, markerOptions);\n\n const merged = !options.override && (existing.agentsMd !== null || existing.claudeMd !== null);\n const preservedRepoContent = contentToMerge.length > 0;\n\n return {\n content,\n merged,\n preservedRepoContent,\n existingClaudeMdContent: claudeMdContentForMerge,\n claudeMdLocation: existing.claudeMdLocation,\n };\n}\n\nexport async function writeAgentsMd(targetDir: string, content: string): Promise<void> {\n const agentsMdPath = path.join(targetDir, \"AGENTS.md\");\n await fs.writeFile(agentsMdPath, content, \"utf-8\");\n}\n\nexport async function ensureClaudeMd(\n targetDir: string,\n existingLocation: \"root\" | \"dotclaude\" | null,\n): Promise<ClaudeMdResult> {\n // Determine where CLAUDE.md should be and what reference to use\n // If there's an existing one, update it in place; otherwise create in .claude/\n const rootPath = path.join(targetDir, \"CLAUDE.md\");\n const dotClaudePath = path.join(targetDir, \".claude\", \"CLAUDE.md\");\n\n // Reference paths (AGENTS.md is in root)\n const rootReference = \"@AGENTS.md\";\n const dotClaudeReference = \"@../AGENTS.md\";\n\n if (existingLocation === \"root\") {\n // Update root CLAUDE.md\n const existingContent = await readFileIfExists(rootPath);\n if (existingContent !== null) {\n // Check if reference already exists\n if (existingContent.includes(rootReference)) {\n return { created: false, updated: false, location: \"root\", contentMerged: false };\n }\n // Content was already merged into AGENTS.md, just add the reference\n await fs.writeFile(rootPath, `${rootReference}\\n`, \"utf-8\");\n return { created: false, updated: true, location: \"root\", contentMerged: true };\n }\n }\n\n if (existingLocation === \"dotclaude\") {\n // Update .claude/CLAUDE.md\n const existingContent = await readFileIfExists(dotClaudePath);\n if (existingContent !== null) {\n // Check if reference already exists\n if (existingContent.includes(dotClaudeReference)) {\n return { created: false, updated: false, location: \"dotclaude\", contentMerged: false };\n }\n // Content was already merged into AGENTS.md, just add the reference\n await fs.writeFile(dotClaudePath, `${dotClaudeReference}\\n`, \"utf-8\");\n return { created: false, updated: true, location: \"dotclaude\", contentMerged: true };\n }\n }\n\n // No existing CLAUDE.md - create in .claude/\n await fs.mkdir(path.dirname(dotClaudePath), { recursive: true });\n await fs.writeFile(dotClaudePath, `${dotClaudeReference}\\n`, \"utf-8\");\n return { created: true, updated: false, location: \"dotclaude\", contentMerged: false };\n}\n","import { createHash } from \"node:crypto\";\nimport { computeContentHash as computeSkillContentHash } from \"./skill-metadata.js\";\n\n// =============================================================================\n// Interfaces\n// =============================================================================\n\n/**\n * Frontmatter fields that can be present in a rule file.\n */\nexport interface RuleFrontmatter {\n /**\n * Glob patterns for conditional rule loading (Claude-specific feature).\n * Example: [\"src/api/all.ts\", \"lib/api/all.ts\"]\n */\n paths?: string[];\n\n /**\n * Metadata added by agconf during sync or by the rule author.\n */\n metadata?: Record<string, string>;\n\n /**\n * Any other frontmatter fields from the original rule.\n */\n [key: string]: unknown;\n}\n\n/**\n * Parsed representation of a rule file.\n */\nexport interface Rule {\n /**\n * Relative path from rules directory root.\n * Example: \"security/api-auth.md\"\n */\n relativePath: string;\n\n /**\n * Full file content including frontmatter.\n */\n rawContent: string;\n\n /**\n * Parsed frontmatter (null if no frontmatter or parse error).\n */\n frontmatter: RuleFrontmatter | null;\n\n /**\n * Content without frontmatter (body only).\n */\n body: string;\n}\n\n// =============================================================================\n// Frontmatter parsing\n// =============================================================================\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/**\n * Parse YAML frontmatter from markdown content.\n * Returns null frontmatter if parsing fails or no frontmatter exists.\n */\nfunction parseFrontmatter(content: string): {\n frontmatter: RuleFrontmatter | null;\n body: string;\n} {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match || !match[1]) {\n return { frontmatter: null, body: content };\n }\n\n const rawYaml = match[1];\n const body = content.slice(match[0].length);\n\n try {\n const frontmatter = parseSimpleYaml(rawYaml);\n return { frontmatter: frontmatter as RuleFrontmatter, body };\n } catch {\n // Parse error - treat as no frontmatter\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * Simple YAML parser for frontmatter.\n * Handles basic key-value pairs, nested metadata objects, and arrays.\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 currentValue: unknown = null;\n let isArray = false;\n\n for (const line of lines) {\n // Skip empty lines\n if (line.trim() === \"\") continue;\n\n // Check for array item (starts with spaces and dash)\n if (line.match(/^\\s+-\\s+/)) {\n if (currentKey && isArray) {\n const value = line\n .replace(/^\\s+-\\s+/, \"\")\n .replace(/^[\"']|[\"']$/g, \"\")\n .trim();\n (currentValue as string[]).push(value);\n }\n continue;\n }\n\n // Check for nested content (indented key: value)\n if (line.startsWith(\" \") && currentKey && typeof currentValue === \"object\" && !isArray) {\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].replace(/^[\"']|[\"']$/g, \"\");\n (currentValue as Record<string, string>)[key] = value;\n }\n continue;\n }\n\n // Save previous value if we're moving to a new key\n if (currentKey && currentValue !== null) {\n result[currentKey] = currentValue;\n currentValue = null;\n isArray = false;\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].trim();\n currentKey = key;\n\n if (value === \"\") {\n // Could be nested object or array - we'll determine based on next line\n // For now, assume object (metadata) or check for array indicator\n currentValue = {};\n isArray = false;\n } else if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n // Inline array: key: [item1, item2]\n try {\n currentValue = JSON.parse(value);\n result[key] = currentValue;\n currentKey = null;\n currentValue = null;\n } catch {\n result[key] = value.replace(/^[\"']|[\"']$/g, \"\");\n currentKey = null;\n currentValue = null;\n }\n } else {\n // Simple value - remove quotes if present\n result[key] = value.replace(/^[\"']|[\"']$/g, \"\");\n currentKey = null;\n currentValue = null;\n }\n }\n }\n\n // Don't forget the last value\n if (currentKey && currentValue !== null) {\n result[currentKey] = currentValue;\n }\n\n // Post-process: Check if any \"object\" values should actually be arrays\n // by checking if the first line after the key starts with a dash\n return result;\n}\n\n/**\n * Serialize frontmatter object back to YAML string.\n */\nfunction serializeFrontmatter(frontmatter: RuleFrontmatter): string {\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n // Array value\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${item}\"`);\n }\n } else if (typeof value === \"object\") {\n // Nested object (like metadata)\n lines.push(`${key}:`);\n for (const [nestedKey, nestedValue] of Object.entries(value as Record<string, string>)) {\n const quotedValue = needsQuoting(String(nestedValue))\n ? `\"${String(nestedValue)}\"`\n : String(nestedValue);\n lines.push(` ${nestedKey}: ${quotedValue}`);\n }\n } else {\n // Simple value\n const strValue = String(value);\n const quotedValue = needsQuoting(strValue) ? `\"${strValue}\"` : strValue;\n lines.push(`${key}: ${quotedValue}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Check if a YAML value needs quoting.\n */\nfunction needsQuoting(value: string): boolean {\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// Heading level adjustment\n// =============================================================================\n\n/**\n * Adjusts markdown heading levels by a given increment.\n *\n * @param content - Markdown content to adjust\n * @param increment - Number of levels to add (positive = deeper)\n * @returns Adjusted markdown content\n *\n * Rules:\n * - Only ATX headings are adjusted (# style, not underline style)\n * - Headings in code blocks are NOT adjusted\n * - Maximum heading level is 6 (h7+ stay as h6)\n * - Minimum heading level is 1 (can't go below h1)\n */\nexport function adjustHeadingLevels(content: string, increment: number): string {\n if (!content) return \"\";\n\n // Track if we're inside a code block\n let inCodeBlock = false;\n\n return content\n .split(\"\\n\")\n .map((line) => {\n // Check for code block boundaries (``` style)\n if (line.trim().startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock;\n return line;\n }\n\n // Skip lines in code blocks\n if (inCodeBlock) {\n return line;\n }\n\n // Match ATX headings: ^(#{1,6})(\\s+.*)$\n const headingMatch = line.match(/^(#{1,6})(\\s+.*)$/);\n if (!headingMatch || !headingMatch[1]) {\n return line;\n }\n\n const hashes = headingMatch[1];\n const rest = headingMatch[2] || \"\";\n const currentLevel = hashes.length;\n const newLevel = Math.min(6, Math.max(1, currentLevel + increment));\n\n return \"#\".repeat(newLevel) + rest;\n })\n .join(\"\\n\");\n}\n\n// =============================================================================\n// Rule parsing\n// =============================================================================\n\n/**\n * Parse markdown file content into a Rule object.\n *\n * @param content - Raw markdown file content\n * @param relativePath - Relative path from rules directory (e.g., \"security/api-auth.md\")\n * @returns Parsed Rule object\n */\nexport function parseRule(content: string, relativePath: string): Rule {\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Handle array-style paths in frontmatter\n // The simple parser may have issues with arrays, so let's re-parse specifically for paths\n if (frontmatter) {\n const pathsMatch = content.match(/^---\\r?\\n[\\s\\S]*?paths:\\s*\\n((?:\\s+-\\s+.+\\n?)+)/m);\n if (pathsMatch?.[1]) {\n const pathsContent = pathsMatch[1];\n const paths = pathsContent\n .split(\"\\n\")\n .filter((line) => line.trim().startsWith(\"-\"))\n .map((line) =>\n line\n .replace(/^\\s+-\\s+/, \"\")\n .replace(/^[\"']|[\"']$/g, \"\")\n .trim(),\n )\n .filter((p) => p.length > 0);\n if (paths.length > 0) {\n frontmatter.paths = paths;\n }\n }\n }\n\n return {\n relativePath,\n rawContent: content,\n frontmatter,\n body,\n };\n}\n\n// =============================================================================\n// Path comment generation\n// =============================================================================\n\n/**\n * Generates a comment describing the paths a rule applies to.\n * Only included if the rule has a `paths` frontmatter field.\n *\n * @param paths - Array of glob patterns\n * @returns HTML comment string or empty string if no paths\n */\nexport function generatePathsComment(paths: string[] | undefined): string {\n if (!paths || paths.length === 0) return \"\";\n\n // Single path\n if (paths.length === 1) {\n return `<!-- Applies to: ${paths[0]} -->`;\n }\n\n // Multiple paths\n return `<!-- Applies to:\\n${paths.map((p) => ` - ${p}`).join(\"\\n\")}\\n-->`;\n}\n\n// =============================================================================\n// Rules section generation (for Codex target)\n// =============================================================================\n\n/**\n * Generate the rules section for insertion into AGENTS.md.\n * This is used for Codex target which concatenates all rules into one section.\n *\n * @param rules - Array of Rule objects to include\n * @param markerPrefix - Prefix for marker comments (e.g., \"agconf\")\n * @returns Complete rules section with markers\n */\nexport function generateRulesSection(rules: Rule[], markerPrefix: string): string {\n // Sort rules alphabetically by path for deterministic output\n const sortedRules = [...rules].sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n\n // First, generate the content that will be hashed (excludes metadata comments)\n const contentParts: string[] = [];\n contentParts.push(\"# Project Rules\");\n contentParts.push(\"\");\n\n for (const rule of sortedRules) {\n contentParts.push(`<!-- Rule: ${rule.relativePath} -->`);\n\n if (rule.frontmatter?.paths && rule.frontmatter.paths.length > 0) {\n contentParts.push(generatePathsComment(rule.frontmatter.paths));\n }\n\n const adjustedBody = adjustHeadingLevels(rule.body.trim(), 1);\n contentParts.push(adjustedBody);\n contentParts.push(\"\");\n }\n\n // Compute hash of the content (same content that check will hash after stripping metadata)\n const contentForHash = contentParts.join(\"\\n\").trim();\n const hash = createHash(\"sha256\").update(contentForHash).digest(\"hex\");\n const contentHash = `sha256:${hash.slice(0, 12)}`;\n\n // Now build the full section with markers and metadata\n const parts: string[] = [];\n parts.push(`<!-- ${markerPrefix}:rules:start -->`);\n parts.push(`<!-- DO NOT EDIT THIS SECTION - Managed by agconf -->`);\n parts.push(`<!-- Content hash: ${contentHash} -->`);\n parts.push(`<!-- Rule count: ${rules.length} -->`);\n parts.push(\"\");\n parts.push(contentForHash);\n parts.push(\"\");\n parts.push(`<!-- ${markerPrefix}:rules:end -->`);\n\n return parts.join(\"\\n\");\n}\n\n// =============================================================================\n// AGENTS.md update\n// =============================================================================\n\n/**\n * Insert or replace the rules section in AGENTS.md content.\n *\n * Placement strategy:\n * 1. If rules markers exist: replace content between them\n * 2. If no rules markers but global:end exists: insert after global:end\n * 3. If no global:end but repo:start exists: insert before repo:start\n * 4. Otherwise: append at end\n *\n * @param agentsMdContent - Current AGENTS.md content\n * @param rulesSection - New rules section to insert\n * @param markerPrefix - Prefix for marker comments\n * @returns Updated AGENTS.md content\n */\nexport function updateAgentsMdWithRules(\n agentsMdContent: string,\n rulesSection: string,\n markerPrefix: string,\n): string {\n const rulesStartMarker = `<!-- ${markerPrefix}:rules:start -->`;\n const rulesEndMarker = `<!-- ${markerPrefix}:rules:end -->`;\n\n // Check if rules markers already exist\n const startIdx = agentsMdContent.indexOf(rulesStartMarker);\n const endIdx = agentsMdContent.indexOf(rulesEndMarker);\n\n if (startIdx !== -1 && endIdx !== -1) {\n // Replace existing rules section\n const before = agentsMdContent.slice(0, startIdx);\n const after = agentsMdContent.slice(endIdx + rulesEndMarker.length);\n return before + rulesSection + after;\n }\n\n // No existing rules section - find insertion point\n const globalEndMarker = `<!-- ${markerPrefix}:global:end -->`;\n const repoStartMarker = `<!-- ${markerPrefix}:repo:start -->`;\n\n // Try to insert between global end and repo start\n const globalEndIdx = agentsMdContent.indexOf(globalEndMarker);\n if (globalEndIdx !== -1) {\n const insertPoint = globalEndIdx + globalEndMarker.length;\n const before = agentsMdContent.slice(0, insertPoint);\n const after = agentsMdContent.slice(insertPoint);\n return `${before}\\n\\n${rulesSection}${after}`;\n }\n\n // No global section, try to insert before repo section\n const repoStartIdx = agentsMdContent.indexOf(repoStartMarker);\n if (repoStartIdx !== -1) {\n const before = agentsMdContent.slice(0, repoStartIdx);\n const after = agentsMdContent.slice(repoStartIdx);\n return `${before}${rulesSection}\\n\\n${after}`;\n }\n\n // No markers at all - append at end\n return `${agentsMdContent.trimEnd()}\\n\\n${rulesSection}\\n`;\n}\n\n// =============================================================================\n// Rule metadata (for Claude target)\n// =============================================================================\n\n/**\n * Add managed metadata to a rule file for Claude target.\n * This marks the file as managed by agconf and stores a content hash\n * for change detection.\n *\n * @param rule - The rule to add metadata to\n * @param metadataPrefix - Prefix for metadata keys (e.g., \"agconf\")\n * @returns Rule content with metadata frontmatter added\n */\nexport function addRuleMetadata(rule: Rule, metadataPrefix: string): string {\n const managedKey = `${metadataPrefix}_managed`;\n const hashKey = `${metadataPrefix}_content_hash`;\n const sourceKey = `${metadataPrefix}_source_path`;\n\n // Compute hash using the same function that check will use\n // This ensures hash consistency between sync and check operations\n // Convert underscore prefix to dash prefix for skill-metadata compatibility\n const hashMetadataPrefix = metadataPrefix.replace(/_/g, \"-\");\n const contentHash = computeSkillContentHash(rule.rawContent, {\n metadataPrefix: hashMetadataPrefix,\n });\n\n // Build new frontmatter\n const existingFrontmatter = rule.frontmatter || {};\n const existingMetadata = (existingFrontmatter.metadata as Record<string, string>) || {};\n\n const newMetadata: Record<string, string> = {\n ...existingMetadata,\n [managedKey]: \"true\",\n [hashKey]: contentHash,\n [sourceKey]: rule.relativePath,\n };\n\n // Build complete frontmatter, preserving other fields\n const newFrontmatter: RuleFrontmatter = {};\n\n // Copy non-metadata fields first (like paths)\n for (const [key, value] of Object.entries(existingFrontmatter)) {\n if (key !== \"metadata\") {\n newFrontmatter[key] = value;\n }\n }\n\n // Add metadata section\n newFrontmatter.metadata = newMetadata;\n\n // Serialize\n const yamlContent = serializeFrontmatter(newFrontmatter);\n return `---\\n${yamlContent}\\n---\\n${rule.body}`;\n}\n","export const SUPPORTED_TARGETS = [\"claude\", \"codex\"] as const;\nexport type Target = (typeof SUPPORTED_TARGETS)[number];\n\nexport interface TargetConfig {\n /** Directory name (e.g., \".claude\", \".codex\") */\n dir: string;\n /** Instructions file name if target needs one (only Claude uses this) */\n instructionsFile: string | null;\n}\n\nexport const TARGET_CONFIGS: Record<Target, TargetConfig> = {\n claude: {\n dir: \".claude\",\n instructionsFile: \"CLAUDE.md\",\n },\n codex: {\n dir: \".codex\",\n instructionsFile: null, // Codex reads AGENTS.md directly\n },\n};\n\nexport function isValidTarget(target: string): target is Target {\n return SUPPORTED_TARGETS.includes(target as Target);\n}\n\nexport function parseTargets(input: string[]): Target[] {\n const targets: Target[] = [];\n for (const t of input) {\n // Support comma-separated values\n const parts = t.split(\",\").map((p) => p.trim().toLowerCase());\n for (const part of parts) {\n if (!isValidTarget(part)) {\n throw new Error(\n `Invalid target \"${part}\". Supported targets: ${SUPPORTED_TARGETS.join(\", \")}`,\n );\n }\n if (!targets.includes(part)) {\n targets.push(part);\n }\n }\n }\n return targets.length > 0 ? targets : [\"claude\"];\n}\n\nexport function getTargetConfig(target: Target): TargetConfig {\n return TARGET_CONFIGS[target];\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { installPreCommitHook } from \"../core/hooks.js\";\nimport { readLockfile } from \"../core/lockfile.js\";\nimport { getModifiedManagedFiles } from \"../core/skill-metadata.js\";\nimport type { ResolvedSource } from \"../core/source.js\";\nimport { formatSourceString, resolveGithubSource, resolveLocalSource } from \"../core/source.js\";\nimport { deleteOrphanedSkills, findOrphanedSkills, type SyncStatus, sync } from \"../core/sync.js\";\nimport { getTargetConfig, parseTargets, SUPPORTED_TARGETS, type Target } from \"../core/targets.js\";\nimport {\n formatTag,\n getLatestRelease,\n isVersionRef,\n parseVersion,\n type ReleaseInfo,\n} from \"../core/version.js\";\nimport { syncWorkflows, type WorkflowSyncResult } from \"../core/workflows.js\";\nimport { createTempDir, removeTempDir, resolvePath } from \"../utils/fs.js\";\nimport { getGitRoot } from \"../utils/git.js\";\nimport { createLogger, formatPath } from \"../utils/logger.js\";\n\nexport interface SharedSyncOptions {\n source?: string;\n local?: string | boolean;\n yes?: boolean;\n override?: boolean;\n ref?: string;\n target?: string[];\n pinned?: boolean;\n summaryFile?: string;\n expandChanges?: boolean;\n}\n\nexport interface CommandContext {\n commandName: \"init\" | \"sync\";\n status: SyncStatus;\n}\n\nexport interface ResolvedVersion {\n ref: string; // The ref used for cloning (e.g., \"v1.2.0\" or \"master\")\n version: string | undefined; // The semantic version if ref is a release tag (e.g., \"1.2.0\")\n isRelease: boolean; // Whether this is a release version\n releaseInfo: ReleaseInfo | null; // Full release info if fetched\n}\n\nexport async function parseAndValidateTargets(\n targetOptions: string[] | undefined,\n): Promise<Target[]> {\n const logger = createLogger();\n try {\n return parseTargets(targetOptions ?? [\"claude\"]);\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n logger.info(`Supported targets: ${SUPPORTED_TARGETS.join(\", \")}`);\n process.exit(1);\n }\n}\n\nexport async function resolveTargetDirectory(): Promise<string> {\n const logger = createLogger();\n const cwd = process.cwd();\n\n const gitRoot = await getGitRoot(cwd);\n if (!gitRoot) {\n logger.error(\n \"Not inside a git repository. Please run this command from within a git repository.\",\n );\n process.exit(1);\n }\n\n // If we're in a subdirectory, inform the user\n if (gitRoot !== cwd) {\n logger.info(`Syncing to repository root: ${formatPath(gitRoot)}`);\n }\n\n return gitRoot;\n}\n\n/**\n * Resolves the version to use for syncing.\n * - For init: fetches latest release if no ref specified\n * - For sync: uses lockfile version if no ref specified\n * - For explicit --ref: uses that ref\n *\n * @param repo - The repository to fetch releases from (only used for non-local sources)\n */\nexport async function resolveVersion(\n options: SharedSyncOptions,\n status: SyncStatus,\n _commandName: \"init\" | \"sync\",\n repo?: string,\n): Promise<ResolvedVersion> {\n const logger = createLogger();\n\n // If --local is used, no version management\n if (options.local !== undefined) {\n return {\n ref: \"local\",\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n\n // If explicit --ref is provided, use it\n if (options.ref) {\n if (isVersionRef(options.ref)) {\n return {\n ref: formatTag(options.ref),\n version: parseVersion(options.ref),\n isRelease: true,\n releaseInfo: null,\n };\n }\n // Branch ref\n return {\n ref: options.ref,\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n\n // If --pinned is specified, use lockfile version without fetching\n if (options.pinned) {\n if (!status.lockfile?.pinned_version) {\n logger.error(\"Cannot use --pinned: no version pinned in lockfile.\");\n process.exit(1);\n }\n const version = status.lockfile.pinned_version;\n return {\n ref: formatTag(version),\n version,\n isRelease: true,\n releaseInfo: null,\n };\n }\n\n // Default for both init and sync: fetch latest release\n // This requires a repo to be specified\n if (!repo) {\n // No repo means we can't fetch releases - use master as fallback\n logger.warn(\"No source repository specified. Using master branch.\");\n return {\n ref: \"master\",\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n\n const spinner = logger.spinner(\"Fetching latest release...\");\n spinner.start();\n\n try {\n const release = await getLatestRelease(repo);\n spinner.succeed(`Latest release: ${release.tag}`);\n return {\n ref: release.tag,\n version: release.version,\n isRelease: true,\n releaseInfo: release,\n };\n } catch {\n spinner.info(\"No releases found, using master branch\");\n return {\n ref: \"master\",\n version: undefined,\n isRelease: false,\n releaseInfo: null,\n };\n }\n}\n\nexport async function resolveSource(\n options: SharedSyncOptions,\n resolvedVersion: ResolvedVersion,\n): Promise<{ resolvedSource: ResolvedSource; tempDir: string | null; repository: string }> {\n const logger = createLogger();\n let resolvedSource: ResolvedSource;\n let tempDir: string | null = null;\n\n const spinner = logger.spinner(\"Resolving source...\");\n\n try {\n if (options.local !== undefined) {\n spinner.start();\n const localSourceOptions =\n typeof options.local === \"string\" ? { path: resolvePath(options.local) } : {};\n resolvedSource = await resolveLocalSource(localSourceOptions);\n spinner.succeed(`Using local source: ${formatPath(resolvedSource.basePath)}`);\n // For local sources, repository is empty string (no GitHub repo)\n return { resolvedSource, tempDir, repository: \"\" };\n }\n\n // For GitHub sources, repository must be provided\n const repository = options.source;\n if (!repository) {\n spinner.fail(\"No canonical source specified\");\n logger.error(`No canonical source specified.\n\nSpecify a source using one of these methods:\n 1. CLI flag: agconf init --source acme/engineering-standards\n 2. Config file: Add 'source.repository' to .agconf.yaml\n\nExample .agconf.yaml:\n source:\n type: github\n repository: acme/engineering-standards`);\n process.exit(1);\n }\n\n spinner.start();\n tempDir = await createTempDir();\n const ref = resolvedVersion.ref;\n spinner.text = `Cloning ${repository}@${ref}...`;\n resolvedSource = await resolveGithubSource({ repository, ref }, tempDir);\n spinner.succeed(`Cloned from GitHub: ${formatSourceString(resolvedSource.source)}`);\n return { resolvedSource, tempDir, repository };\n } catch (error) {\n spinner.fail(\"Failed to resolve source\");\n logger.error(error instanceof Error ? error.message : String(error));\n if (tempDir) await removeTempDir(tempDir);\n process.exit(1);\n }\n}\n\nexport async function promptMergeOrOverride(\n status: SyncStatus,\n options: SharedSyncOptions,\n tempDir: string | null,\n): Promise<boolean> {\n let shouldOverride = options.override ?? false;\n\n // If the repo has already been synced, the AGENTS.md was created by agconf,\n // so we don't need to ask - just merge by default (unless --override is specified)\n if (status.hasSynced) {\n return shouldOverride;\n }\n\n if (status.agentsMdExists && !options.yes && !options.override) {\n const action = await prompts.select({\n message: \"An AGENTS.md file already exists. How would you like to proceed?\",\n options: [\n {\n value: \"merge\",\n label: \"Merge (recommended)\",\n hint: \"Preserves your existing content in a repository-specific block\",\n },\n {\n value: \"override\",\n label: \"Override\",\n hint: \"Replaces everything with fresh global standards\",\n },\n ],\n });\n\n if (prompts.isCancel(action)) {\n prompts.cancel(\"Operation cancelled\");\n if (tempDir) await removeTempDir(tempDir);\n process.exit(0);\n }\n\n shouldOverride = action === \"override\";\n }\n\n return shouldOverride;\n}\n\n/**\n * Check for manually modified managed files and warn/prompt the user.\n * Returns true if sync should proceed, false if cancelled.\n */\nexport async function checkModifiedFilesBeforeSync(\n targetDir: string,\n targets: Target[],\n options: SharedSyncOptions,\n tempDir: string | null,\n): Promise<boolean> {\n const modifiedFiles = await getModifiedManagedFiles(targetDir, targets);\n\n if (modifiedFiles.length === 0) {\n return true; // No modified files, proceed\n }\n\n const logger = createLogger();\n\n // Show warning about modified files\n console.log();\n console.log(pc.yellow(`⚠ ${modifiedFiles.length} managed file(s) have been manually modified:`));\n for (const file of modifiedFiles) {\n const label = file.type === \"agents\" ? \"(global block)\" : \"\";\n console.log(` ${pc.yellow(\"~\")} ${file.path} ${pc.dim(label)}`);\n }\n console.log();\n\n // In non-interactive mode, just warn and proceed\n if (options.yes) {\n logger.warn(\"Proceeding with sync (--yes flag). Modified files will be overwritten.\");\n return true;\n }\n\n // Ask for confirmation\n const proceed = await prompts.confirm({\n message: \"These files will be overwritten. Continue with sync?\",\n initialValue: false,\n });\n\n if (prompts.isCancel(proceed) || !proceed) {\n prompts.cancel(\"Sync cancelled. Your modified files were preserved.\");\n if (tempDir) await removeTempDir(tempDir);\n process.exit(0);\n }\n\n return true;\n}\n\nexport interface PerformSyncOptions {\n targetDir: string;\n resolvedSource: ResolvedSource;\n resolvedVersion: ResolvedVersion;\n shouldOverride: boolean;\n targets: Target[];\n context: CommandContext;\n tempDir: string | null;\n yes?: boolean | undefined;\n /** Source repository in owner/repo format (for GitHub sources) */\n sourceRepo?: string;\n /** Write markdown summary to this file (for CI PR descriptions) */\n summaryFile?: string | undefined;\n /** Show all items instead of truncating (skills, rules, hooks, etc.) */\n expandChanges?: boolean | undefined;\n}\n\nexport async function performSync(options: PerformSyncOptions): Promise<void> {\n const { targetDir, resolvedSource, resolvedVersion, shouldOverride, targets, context, tempDir } =\n options;\n\n const logger = createLogger();\n\n // Read previous lockfile to detect orphaned skills/rules later\n const previousLockfileResult = await readLockfile(targetDir);\n const previousSkills = previousLockfileResult?.lockfile.content.skills ?? [];\n const previousRules = previousLockfileResult?.lockfile.content.rules?.files ?? [];\n const previousTargets = previousLockfileResult?.lockfile.content.targets ?? [\"claude\"];\n\n const syncSpinner = logger.spinner(\"Syncing...\");\n syncSpinner.start();\n\n try {\n const syncOptions: Parameters<typeof sync>[2] = {\n override: shouldOverride,\n targets,\n };\n if (resolvedVersion.version) {\n syncOptions.pinnedVersion = resolvedVersion.version;\n }\n const result = await sync(targetDir, resolvedSource, syncOptions);\n syncSpinner.stop();\n\n // Detect and handle orphaned skills\n const orphanedSkills = findOrphanedSkills(previousSkills, result.skills.synced);\n let orphanResult: { deleted: string[]; skipped: string[] } = { deleted: [], skipped: [] };\n\n if (orphanedSkills.length > 0) {\n // Determine which targets to check (union of previous and current)\n const allTargets = [...new Set([...previousTargets, ...targets])];\n\n if (options.yes) {\n // Non-interactive mode: delete by default\n orphanResult = await deleteOrphanedSkills(\n targetDir,\n orphanedSkills,\n allTargets,\n previousSkills,\n );\n } else {\n // Interactive mode: prompt user\n console.log();\n console.log(\n pc.yellow(\n `⚠ ${orphanedSkills.length} skill(s) were previously synced but are no longer in the source:`,\n ),\n );\n for (const skill of orphanedSkills) {\n console.log(` ${pc.yellow(\"·\")} ${skill}`);\n }\n console.log();\n\n const deleteOrphans = await prompts.confirm({\n message: \"Delete these orphaned skills?\",\n initialValue: true,\n });\n\n if (prompts.isCancel(deleteOrphans)) {\n // User cancelled, skip deletion but continue with sync summary\n logger.info(\"Skipping orphan deletion.\");\n } else if (deleteOrphans) {\n orphanResult = await deleteOrphanedSkills(\n targetDir,\n orphanedSkills,\n allTargets,\n previousSkills,\n );\n }\n }\n }\n\n // Show validation errors if any\n if (result.skills.validationErrors.length > 0) {\n console.log();\n console.log(\n pc.yellow(`⚠ ${result.skills.validationErrors.length} skill(s) have invalid frontmatter:`),\n );\n for (const error of result.skills.validationErrors) {\n console.log(` ${pc.yellow(\"!\")} ${error.skillName}/SKILL.md`);\n for (const msg of error.errors) {\n console.log(` ${pc.dim(\"-\")} ${msg}`);\n }\n }\n console.log();\n console.log(pc.dim(\"Skills must have frontmatter with 'name' and 'description' fields.\"));\n }\n\n // Sync workflow files for GitHub sources only (not local)\n // Workflows reference the same ref that was used for syncing\n let workflowResult: WorkflowSyncResult | null = null;\n if (resolvedVersion.ref !== \"local\" && options.sourceRepo) {\n const workflowSpinner = logger.spinner(\"Syncing workflow files...\");\n workflowSpinner.start();\n // Use the version tag if it's a release, otherwise use the ref directly\n const workflowRef =\n resolvedVersion.isRelease && resolvedVersion.version\n ? formatTag(resolvedVersion.version)\n : resolvedVersion.ref;\n workflowResult = await syncWorkflows(targetDir, workflowRef, options.sourceRepo);\n workflowSpinner.stop();\n }\n\n // Install git hooks\n const hookResult = await installPreCommitHook(targetDir);\n\n // Build summary lines for both console and markdown file\n const summaryLines: string[] = [];\n\n // Summary header\n console.log();\n console.log(pc.bold(\"Sync complete:\"));\n console.log();\n\n // AGENTS.md status\n const agentsMdPath = formatPath(path.join(targetDir, \"AGENTS.md\"));\n if (result.agentsMd.merged) {\n const label = context.commandName === \"sync\" ? \"(updated)\" : \"(merged)\";\n console.log(` ${pc.green(\"+\")} ${agentsMdPath} ${pc.dim(label)}`);\n summaryLines.push(`- \\`AGENTS.md\\` ${label}`);\n } else {\n console.log(` ${pc.green(\"+\")} ${agentsMdPath} ${pc.dim(\"(created)\")}`);\n summaryLines.push(\"- `AGENTS.md` (created)\");\n }\n\n // Per-target results\n for (const targetResult of result.targets) {\n const config = getTargetConfig(targetResult.target);\n\n // Instructions file status (only for targets that use one, like Claude)\n if (config.instructionsFile) {\n const instructionsPath =\n targetResult.instructionsMd.location === \"root\"\n ? formatPath(path.join(targetDir, config.instructionsFile))\n : formatPath(path.join(targetDir, config.dir, config.instructionsFile));\n\n const instructionsRelPath =\n targetResult.instructionsMd.location === \"root\"\n ? config.instructionsFile\n : `${config.dir}/${config.instructionsFile}`;\n\n if (targetResult.instructionsMd.created) {\n console.log(` ${pc.green(\"+\")} ${instructionsPath} ${pc.dim(\"(created)\")}`);\n summaryLines.push(`- \\`${instructionsRelPath}\\` (created)`);\n } else if (targetResult.instructionsMd.updated) {\n const hint = targetResult.instructionsMd.contentMerged\n ? \"(content merged into AGENTS.md, reference added)\"\n : \"(reference added)\";\n console.log(` ${pc.yellow(\"~\")} ${instructionsPath} ${pc.dim(hint)}`);\n summaryLines.push(`- \\`${instructionsRelPath}\\` ${hint}`);\n } else {\n console.log(` ${pc.dim(\"-\")} ${instructionsPath} ${pc.dim(\"(unchanged)\")}`);\n summaryLines.push(`- \\`${instructionsRelPath}\\` (unchanged)`);\n }\n }\n\n // Skills status for this target\n const skillsPath = formatPath(path.join(targetDir, config.dir, \"skills\"));\n const skillsRelPath = `${config.dir}/skills/`;\n\n // Compute new vs actually modified skills\n const newSkills = result.skills.synced.filter((s) => !previousSkills.includes(s)).sort();\n // Only show as \"updated\" if content actually changed (not just re-synced)\n const updatedSkills = result.skills.modified.filter((s) => previousSkills.includes(s)).sort();\n const removedSkills = orphanResult.deleted.sort();\n\n // Determine if skills had any changes\n const skillsHadChanges =\n newSkills.length > 0 || updatedSkills.length > 0 || removedSkills.length > 0;\n const skillsStatusIcon = skillsHadChanges ? pc.green(\"+\") : pc.dim(\"-\");\n const skillsStatusLabel = skillsHadChanges ? \"(updated)\" : \"(unchanged)\";\n\n // Summary line for skills directory\n console.log(\n ` ${skillsStatusIcon} ${skillsPath}/ ${pc.dim(`(total: ${result.skills.synced.length} skills, ${targetResult.skills.copied} files) ${skillsStatusLabel}`)}`,\n );\n summaryLines.push(\n `- \\`${skillsRelPath}\\` (total: ${result.skills.synced.length} skills, ${targetResult.skills.copied} files) ${skillsStatusLabel}`,\n );\n\n // Helper to display skill list with truncation\n const MAX_ITEMS_DEFAULT = 5;\n const shouldExpand = options.expandChanges === true;\n\n const formatSkillList = (\n skills: string[],\n icon: string,\n colorFn: (s: string) => string,\n label: string,\n mdLabel: string,\n ) => {\n if (skills.length === 0) return;\n\n const maxDisplay = shouldExpand ? skills.length : MAX_ITEMS_DEFAULT;\n const displaySkills = skills.slice(0, maxDisplay);\n const hiddenCount = skills.length - displaySkills.length;\n\n for (const skill of displaySkills) {\n const skillPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n const skillRelPath = `${config.dir}/skills/${skill}/`;\n console.log(` ${colorFn(icon)} ${skillPath}/ ${pc.dim(`(${label})`)}`);\n summaryLines.push(` - \\`${skillRelPath}\\` (${mdLabel})`);\n }\n\n if (hiddenCount > 0) {\n console.log(` ${pc.dim(` ... ${hiddenCount} more ${label}`)}`);\n summaryLines.push(` - ... ${hiddenCount} more ${mdLabel}`);\n }\n };\n\n // Show new skills\n formatSkillList(newSkills, \"+\", pc.green, \"new\", \"new\");\n\n // Show updated skills\n formatSkillList(updatedSkills, \"~\", pc.yellow, \"updated\", \"updated\");\n\n // Show removed skills\n for (const skill of removedSkills) {\n const orphanPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n const orphanRelPath = `${config.dir}/skills/${skill}/`;\n console.log(` ${pc.red(\"-\")} ${orphanPath}/ ${pc.dim(\"(removed)\")}`);\n summaryLines.push(` - \\`${orphanRelPath}\\` (removed)`);\n }\n\n // Show skipped orphans\n if (orphanResult.skipped.length > 0) {\n for (const skill of orphanResult.skipped) {\n const orphanPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n const orphanRelPath = `${config.dir}/skills/${skill}/`;\n console.log(` ${pc.yellow(\"!\")} ${orphanPath}/ ${pc.dim(\"(orphaned but skipped)\")}`);\n summaryLines.push(` - \\`${orphanRelPath}\\` (orphaned but skipped)`);\n }\n }\n\n // Rules status for Claude target\n if (result.rules && result.rules.claudeFiles.length > 0 && targetResult.target === \"claude\") {\n const rulesPath = formatPath(path.join(targetDir, config.dir, \"rules\"));\n const rulesRelPath = `${config.dir}/rules/`;\n const rulesCount = result.rules.claudeFiles.length;\n\n // Compute new vs actually modified rules\n const newRules = result.rules.synced.filter((r) => !previousRules.includes(r)).sort();\n // Only show as \"updated\" if content actually changed (not just re-synced)\n const updatedRules = result.rules.modified.filter((r) => previousRules.includes(r)).sort();\n\n // Determine if rules had any changes\n const rulesHadChanges = newRules.length > 0 || updatedRules.length > 0;\n const rulesStatusIcon = rulesHadChanges ? pc.green(\"+\") : pc.dim(\"-\");\n const rulesStatusLabel = rulesHadChanges ? \"(updated)\" : \"(unchanged)\";\n\n console.log(\n ` ${rulesStatusIcon} ${rulesPath}/ ${pc.dim(`(total: ${rulesCount} rules) ${rulesStatusLabel}`)}`,\n );\n summaryLines.push(`- \\`${rulesRelPath}\\` (total: ${rulesCount} rules) ${rulesStatusLabel}`);\n\n // Helper to display rule list with truncation\n const formatRuleList = (\n rules: string[],\n icon: string,\n colorFn: (s: string) => string,\n label: string,\n mdLabel: string,\n ) => {\n if (rules.length === 0) return;\n\n const maxDisplay = shouldExpand ? rules.length : MAX_ITEMS_DEFAULT;\n const displayRules = rules.slice(0, maxDisplay);\n const hiddenCount = rules.length - displayRules.length;\n\n for (const rule of displayRules) {\n const rulePath = formatPath(path.join(targetDir, config.dir, \"rules\", rule));\n const ruleRelPath = `${config.dir}/rules/${rule}`;\n console.log(` ${colorFn(icon)} ${rulePath} ${pc.dim(`(${label})`)}`);\n summaryLines.push(` - \\`${ruleRelPath}\\` (${mdLabel})`);\n }\n\n if (hiddenCount > 0) {\n console.log(` ${pc.dim(` ... ${hiddenCount} more ${label}`)}`);\n summaryLines.push(` - ... ${hiddenCount} more ${mdLabel}`);\n }\n };\n\n // Show new rules\n formatRuleList(newRules, \"+\", pc.green, \"new\", \"new\");\n\n // Show updated rules\n formatRuleList(updatedRules, \"~\", pc.yellow, \"updated\", \"updated\");\n }\n\n // Rules status for Codex target (concatenated into AGENTS.md)\n if (result.rules?.codexUpdated && targetResult.target === \"codex\") {\n const rulesCount = result.rules.synced.length;\n console.log(\n ` ${pc.green(\"+\")} ${pc.dim(\"AGENTS.md rules section\")} ${pc.dim(`(total: ${rulesCount} rules concatenated) (updated)`)}`,\n );\n summaryLines.push(\n `- AGENTS.md rules section (total: ${rulesCount} rules concatenated) (updated)`,\n );\n\n // Compute new vs actually modified rules for Codex\n const newRules = result.rules.synced.filter((r) => !previousRules.includes(r)).sort();\n // Only show as \"updated\" if content actually changed (not just re-synced)\n const updatedRules = result.rules.modified.filter((r) => previousRules.includes(r)).sort();\n\n // Helper to display rule list with truncation (Codex version - no file paths)\n const formatCodexRuleList = (\n rules: string[],\n icon: string,\n colorFn: (s: string) => string,\n label: string,\n mdLabel: string,\n ) => {\n if (rules.length === 0) return;\n\n const maxDisplay = shouldExpand ? rules.length : MAX_ITEMS_DEFAULT;\n const displayRules = rules.slice(0, maxDisplay);\n const hiddenCount = rules.length - displayRules.length;\n\n for (const rule of displayRules) {\n console.log(` ${colorFn(icon)} ${rule} ${pc.dim(`(${label})`)}`);\n summaryLines.push(` - \\`${rule}\\` (${mdLabel})`);\n }\n\n if (hiddenCount > 0) {\n console.log(` ${pc.dim(` ... ${hiddenCount} more ${label}`)}`);\n summaryLines.push(` - ... ${hiddenCount} more ${mdLabel}`);\n }\n };\n\n // Show new rules\n formatCodexRuleList(newRules, \"+\", pc.green, \"new\", \"new\");\n\n // Show updated rules\n formatCodexRuleList(updatedRules, \"~\", pc.yellow, \"updated\", \"updated\");\n }\n }\n\n // Workflow files status\n if (workflowResult) {\n for (const filename of workflowResult.created) {\n const workflowPath = formatPath(path.join(targetDir, \".github/workflows\", filename));\n console.log(` ${pc.green(\"+\")} ${workflowPath} ${pc.dim(\"(created)\")}`);\n summaryLines.push(`- \\`.github/workflows/${filename}\\` (created)`);\n }\n for (const filename of workflowResult.updated) {\n const workflowPath = formatPath(path.join(targetDir, \".github/workflows\", filename));\n console.log(` ${pc.yellow(\"~\")} ${workflowPath} ${pc.dim(\"(updated)\")}`);\n summaryLines.push(`- \\`.github/workflows/${filename}\\` (updated)`);\n }\n for (const filename of workflowResult.unchanged) {\n const workflowPath = formatPath(path.join(targetDir, \".github/workflows\", filename));\n console.log(` ${pc.dim(\"-\")} ${workflowPath} ${pc.dim(\"(unchanged)\")}`);\n summaryLines.push(`- \\`.github/workflows/${filename}\\` (unchanged)`);\n }\n }\n\n // Lockfile status\n const lockfilePath = formatPath(path.join(targetDir, \".agconf\", \"agconf.lock\"));\n console.log(` ${pc.green(\"+\")} ${lockfilePath}`);\n summaryLines.push(\"- `.agconf/lockfile.json` (updated)\");\n\n // Git hook status\n const hookPath = formatPath(path.join(targetDir, \".git/hooks/pre-commit\"));\n if (hookResult.installed) {\n if (hookResult.alreadyExisted && !hookResult.wasUpdated) {\n console.log(` ${pc.dim(\"-\")} ${hookPath} ${pc.dim(\"(unchanged)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (unchanged)\");\n } else if (hookResult.wasUpdated) {\n console.log(` ${pc.yellow(\"~\")} ${hookPath} ${pc.dim(\"(updated)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (updated)\");\n } else {\n console.log(` ${pc.green(\"+\")} ${hookPath} ${pc.dim(\"(installed)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (installed)\");\n }\n } else if (hookResult.alreadyExisted) {\n console.log(` ${pc.yellow(\"!\")} ${hookPath} ${pc.dim(\"(skipped - custom hook exists)\")}`);\n summaryLines.push(\"- `.git/hooks/pre-commit` (skipped - custom hook exists)\");\n }\n\n console.log();\n console.log(pc.dim(`Source: ${formatSourceString(resolvedSource.source)}`));\n if (resolvedVersion.version) {\n console.log(pc.dim(`Version: ${resolvedVersion.version}`));\n }\n if (targets.length > 1) {\n console.log(pc.dim(`Targets: ${targets.join(\", \")}`));\n }\n\n // Write summary file if requested (for CI PR descriptions)\n if (options.summaryFile) {\n const sourceStr = formatSourceString(resolvedSource.source);\n const versionStr = resolvedVersion.version\n ? `v${resolvedVersion.version}`\n : resolvedVersion.ref;\n const summary = `## Changes\n\n${summaryLines.join(\"\\n\")}\n\n---\n**Source:** ${sourceStr}\n**Version:** ${versionStr}\n`;\n await fs.writeFile(options.summaryFile, summary, \"utf-8\");\n }\n\n prompts.outro(pc.green(\"Done!\"));\n } catch (error) {\n syncSpinner.fail(\"Sync failed\");\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n } finally {\n if (tempDir) await removeTempDir(tempDir);\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ResolvedConfig } from \"../config/schema.js\";\n\n// Default values for hook configuration\nconst DEFAULT_CLI_NAME = \"agconf\";\nconst DEFAULT_CONFIG_DIR = \".agconf\";\nconst DEFAULT_LOCKFILE_NAME = \"lockfile.json\";\n\n// Hook identifier for detecting managed hooks\nconst HOOK_IDENTIFIER = \"# agconf pre-commit hook\";\n\n/**\n * Configuration for hook generation.\n */\nexport interface HookConfig {\n /** CLI command name (e.g., \"agconf\") */\n cliName: string;\n /** Config directory name (e.g., \".agconf\") */\n configDir: string;\n /** Lockfile name (e.g., \"lockfile.json\") */\n lockfileName: string;\n}\n\n/**\n * Generate pre-commit hook content with configurable names.\n */\nexport function generatePreCommitHook(config: HookConfig): string {\n const { cliName, configDir, lockfileName } = config;\n\n return `#!/bin/bash\n# ${cliName} pre-commit hook\n# Prevents committing changes to managed files (skills and AGENTS.md global block)\n#\n# Installation:\n# Copy this file to .git/hooks/pre-commit\n# Or run: ${cliName} hooks install\n\nset -e\n\n# Get the repository root\nREPO_ROOT=$(git rev-parse --show-toplevel)\n\n# Check if ${cliName} has been synced\nif [ ! -f \"$REPO_ROOT/${configDir}/${lockfileName}\" ]; then\n # Not synced, nothing to check\n exit 0\nfi\n\n# Check if ${cliName} CLI is available\nif ! command -v ${cliName} &> /dev/null; then\n # CLI not installed, skip check\n exit 0\nfi\n\n# Run ${cliName} check and capture output\ncd \"$REPO_ROOT\"\nCHECK_OUTPUT=$(${cliName} check 2>&1) || CHECK_EXIT=$?\nCHECK_EXIT=\\${CHECK_EXIT:-0}\n\nif [ $CHECK_EXIT -ne 0 ]; then\n echo \"\"\n echo \"Error: Cannot commit changes to ${cliName}-managed files\"\n echo \"\"\n echo \"Output from '${cliName} check' command:\"\n echo \"$CHECK_OUTPUT\"\n echo \"\"\n echo \"Options:\"\n echo \" 1. Discard your changes: git checkout -- <file>\"\n echo \" 2. Skip this check: git commit --no-verify\"\n echo \" 3. Restore managed files: ${cliName} sync\"\n echo \" 4. For AGENTS.md: edit only the repo-specific block (between repo:start and repo:end)\"\n echo \" 5. For skills: create a new custom skill instead\"\n echo \"\"\n exit 1\nfi\n\nexit 0\n`;\n}\n\n/**\n * Get hook config from resolved config or use defaults.\n */\nexport function getHookConfig(config?: Partial<ResolvedConfig>): HookConfig {\n return {\n cliName: config?.cliName ?? DEFAULT_CLI_NAME,\n configDir: config?.configDir ?? DEFAULT_CONFIG_DIR,\n lockfileName: config?.lockfileName ?? DEFAULT_LOCKFILE_NAME,\n };\n}\n\nexport interface HookInstallResult {\n installed: boolean;\n path: string;\n alreadyExisted: boolean;\n wasUpdated: boolean;\n}\n\n/**\n * Install the pre-commit hook in a git repository.\n * If a pre-commit hook already exists and is not from agconf, it will not be overwritten.\n */\nexport async function installPreCommitHook(\n targetDir: string,\n config?: Partial<ResolvedConfig>,\n): Promise<HookInstallResult> {\n const hookConfig = getHookConfig(config);\n const hooksDir = path.join(targetDir, \".git\", \"hooks\");\n const hookPath = path.join(hooksDir, \"pre-commit\");\n\n // Generate hook content\n const hookContent = generatePreCommitHook(hookConfig);\n\n // Ensure hooks directory exists\n await fs.mkdir(hooksDir, { recursive: true });\n\n // Check if hook already exists\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(hookPath, \"utf-8\");\n } catch {\n // Expected: hook file doesn't exist yet\n }\n\n if (existingContent !== null) {\n // Check if it's our hook (contains our identifier)\n const isOurHook = existingContent.includes(HOOK_IDENTIFIER);\n\n if (!isOurHook) {\n // Not our hook, don't overwrite\n return {\n installed: false,\n path: hookPath,\n alreadyExisted: true,\n wasUpdated: false,\n };\n }\n\n // Check if content is the same\n if (existingContent === hookContent) {\n return {\n installed: true,\n path: hookPath,\n alreadyExisted: true,\n wasUpdated: false,\n };\n }\n\n // Our hook but outdated, update it\n await fs.writeFile(hookPath, hookContent, { mode: 0o755 });\n return {\n installed: true,\n path: hookPath,\n alreadyExisted: true,\n wasUpdated: true,\n };\n }\n\n // Install new hook\n await fs.writeFile(hookPath, hookContent, { mode: 0o755 });\n return {\n installed: true,\n path: hookPath,\n alreadyExisted: false,\n wasUpdated: false,\n };\n}\n","import { exec } from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { type SimpleGit, simpleGit } from \"simple-git\";\nimport { loadCanonicalRepoConfig } from \"../config/loader.js\";\nimport type { Source } from \"../schemas/lockfile.js\";\n\nconst execAsync = promisify(exec);\n\nexport interface ResolvedSource {\n source: Source;\n basePath: string;\n agentsMdPath: string;\n skillsPath: string;\n /** Path to rules directory (null if no rules_dir configured) */\n rulesPath: string | null;\n /** Marker prefix from canonical config (default: \"agconf\") */\n markerPrefix: string;\n}\n\nexport interface LocalSourceOptions {\n path?: string;\n}\n\nexport interface GithubSourceOptions {\n repository: string;\n ref: string;\n}\n\nconst DEFAULT_REF = \"master\";\n\nexport async function resolveLocalSource(\n options: LocalSourceOptions = {},\n): Promise<ResolvedSource> {\n let basePath: string;\n\n if (options.path) {\n basePath = path.resolve(options.path);\n } else {\n basePath = await findCanonicalRepo(process.cwd());\n }\n\n await validateCanonicalRepo(basePath);\n\n const git: SimpleGit = simpleGit(basePath);\n let commitSha: string | undefined;\n\n try {\n const log = await git.log({ maxCount: 1 });\n commitSha = log.latest?.hash;\n } catch {\n // Expected: not a git repo or git not available, commit SHA is optional\n }\n\n // Load canonical config to get marker prefix and rules_dir\n const canonicalConfig = await loadCanonicalRepoConfig(basePath);\n const markerPrefix = canonicalConfig?.markers.prefix ?? \"agconf\";\n const rulesDir = canonicalConfig?.content.rules_dir;\n\n const source: Source = {\n type: \"local\",\n path: basePath,\n commit_sha: commitSha,\n };\n\n return {\n source,\n basePath,\n agentsMdPath: path.join(basePath, \"instructions\", \"AGENTS.md\"),\n skillsPath: path.join(basePath, \"skills\"),\n rulesPath: rulesDir ? path.join(basePath, rulesDir) : null,\n markerPrefix,\n };\n}\n\nexport async function resolveGithubSource(\n options: GithubSourceOptions,\n tempDir: string,\n): Promise<ResolvedSource> {\n const { repository, ref = DEFAULT_REF } = options;\n\n await cloneRepository(repository, ref, tempDir);\n\n const clonedGit: SimpleGit = simpleGit(tempDir);\n const log = await clonedGit.log({ maxCount: 1 });\n const commitSha = log.latest?.hash ?? \"\";\n\n // Load canonical config to get marker prefix and rules_dir\n const canonicalConfig = await loadCanonicalRepoConfig(tempDir);\n const markerPrefix = canonicalConfig?.markers.prefix ?? \"agconf\";\n const rulesDir = canonicalConfig?.content.rules_dir;\n\n const source: Source = {\n type: \"github\",\n repository,\n commit_sha: commitSha,\n ref,\n };\n\n return {\n source,\n basePath: tempDir,\n agentsMdPath: path.join(tempDir, \"instructions\", \"AGENTS.md\"),\n skillsPath: path.join(tempDir, \"skills\"),\n rulesPath: rulesDir ? path.join(tempDir, rulesDir) : null,\n markerPrefix,\n };\n}\n\n/**\n * Clone a repository using the best available method.\n * Tries in order: gh CLI, HTTPS with token, plain HTTPS.\n */\nasync function cloneRepository(repository: string, ref: string, tempDir: string): Promise<void> {\n // Try gh CLI first (handles auth automatically in CI)\n if (await isGhAvailable()) {\n try {\n await execAsync(`gh repo clone ${repository} ${tempDir} -- --depth 1 --branch ${ref}`);\n return;\n } catch {\n // Expected: gh clone may fail, fall back to git with token auth\n }\n }\n\n // Fall back to git with GITHUB_TOKEN authentication\n const token = process.env.GITHUB_TOKEN;\n const repoUrl = token\n ? `https://x-access-token:${token}@github.com/${repository}.git`\n : `https://github.com/${repository}.git`;\n\n const git: SimpleGit = simpleGit();\n await git.clone(repoUrl, tempDir, [\"--depth\", \"1\", \"--branch\", ref]);\n}\n\n/**\n * Check if gh CLI is available.\n */\nasync function isGhAvailable(): Promise<boolean> {\n try {\n await execAsync(\"gh --version\");\n return true;\n } catch {\n // Expected: gh CLI not installed\n return false;\n }\n}\n\nasync function findCanonicalRepo(startDir: string): Promise<string> {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n // First, check if we're already inside the agconf repo\n let checkDir = currentDir;\n while (checkDir !== root) {\n if (await isCanonicalRepo(checkDir)) {\n return checkDir;\n }\n checkDir = path.dirname(checkDir);\n }\n\n // Otherwise, look for a sibling \"agconf\" directory\n currentDir = path.resolve(startDir);\n while (currentDir !== root) {\n const parentDir = path.dirname(currentDir);\n const siblingCanonicalRepo = path.join(parentDir, \"agconf\");\n\n if (await isCanonicalRepo(siblingCanonicalRepo)) {\n return siblingCanonicalRepo;\n }\n\n currentDir = parentDir;\n }\n\n throw new Error(\n \"Could not find canonical repository. Please specify --local <path> or run from within the canonical repo.\",\n );\n}\n\nasync function isCanonicalRepo(dir: string): Promise<boolean> {\n try {\n // Check directory exists\n const stat = await fs.stat(dir).catch(() => null);\n if (!stat?.isDirectory()) {\n return false;\n }\n\n // Check for agconf structure\n const instructionsPath = path.join(dir, \"instructions\", \"AGENTS.md\");\n const skillsPath = path.join(dir, \"skills\");\n\n const [instructionsExists, skillsExists] = await Promise.all([\n fs\n .access(instructionsPath)\n .then(() => true)\n .catch(() => false),\n fs\n .access(skillsPath)\n .then(() => true)\n .catch(() => false),\n ]);\n\n if (!instructionsExists || !skillsExists) {\n return false;\n }\n\n // Optionally verify git remote contains \"agconf\"\n try {\n const git: SimpleGit = simpleGit(dir);\n const remotes = await git.getRemotes(true);\n const hasMatchingRemote = remotes.some(\n (r) => r.refs.fetch?.includes(\"agconf\") || r.refs.push?.includes(\"agconf\"),\n );\n if (hasMatchingRemote) {\n return true;\n }\n } catch {\n // Expected: git check may fail, fall back to structure check only\n }\n\n // Structure matches, accept it even without git verification\n return true;\n } catch {\n // Expected: directory access or structure check failed\n return false;\n }\n}\n\nasync function validateCanonicalRepo(basePath: string): Promise<void> {\n const agentsMdPath = path.join(basePath, \"instructions\", \"AGENTS.md\");\n const skillsPath = path.join(basePath, \"skills\");\n\n const [agentsMdExists, skillsExists] = await Promise.all([\n fs\n .access(agentsMdPath)\n .then(() => true)\n .catch(() => false),\n fs\n .access(skillsPath)\n .then(() => true)\n .catch(() => false),\n ]);\n\n if (!agentsMdExists) {\n throw new Error(`Invalid canonical repository: missing instructions/AGENTS.md at ${basePath}`);\n }\n\n if (!skillsExists) {\n throw new Error(`Invalid canonical repository: missing skills/ directory at ${basePath}`);\n }\n}\n\nexport function formatSourceString(source: Source): string {\n if (source.type === \"github\") {\n const sha = source.commit_sha.slice(0, 7);\n return `github:${source.repository}@${sha}`;\n }\n if (source.commit_sha) {\n return `local:${source.path}@${source.commit_sha.slice(0, 7)}`;\n }\n return `local:${source.path}`;\n}\n\nexport function getDefaultRef(): string {\n return DEFAULT_REF;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { type CanonicalRepoConfig, CanonicalRepoConfigSchema } from \"./schema.js\";\n\n// Config file names\nconst CANONICAL_REPO_CONFIG = \"agconf.yaml\";\n\n/**\n * Load canonical repository config (agconf.yaml).\n * Returns undefined if file doesn't exist.\n */\nexport async function loadCanonicalRepoConfig(\n basePath: string,\n): Promise<CanonicalRepoConfig | undefined> {\n const configPath = path.join(basePath, CANONICAL_REPO_CONFIG);\n\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n const parsed = parseYaml(content);\n return CanonicalRepoConfigSchema.parse(parsed);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw new Error(`Failed to load ${CANONICAL_REPO_CONFIG}: ${error}`);\n }\n}\n\n// Type guard for Node.js errors with code property\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n","/**\n * Version resolution and management for agconf releases.\n *\n * Handles fetching release information from GitHub, parsing version strings,\n * and determining the appropriate version to use.\n */\n\nimport { execSync } from \"node:child_process\";\n\nconst GITHUB_API_BASE = \"https://api.github.com\";\n\n/**\n * Gets a GitHub token for API authentication.\n * Tries in order:\n * 1. GITHUB_TOKEN environment variable\n * 2. gh auth token (if gh CLI is installed)\n * Throws an error if no token is available.\n */\nfunction getGitHubToken(): string {\n // First try environment variable\n if (process.env.GITHUB_TOKEN) {\n return process.env.GITHUB_TOKEN;\n }\n\n // Try gh CLI\n try {\n const token = execSync(\"gh auth token\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (token) {\n return token;\n }\n } catch {\n // Expected: gh CLI not installed or not authenticated\n }\n\n throw new Error(\n `GitHub authentication required to access agconf releases.\n\nTo fix this, do one of the following:\n\n1. Install and authenticate GitHub CLI (recommended):\n brew install gh\n gh auth login\n\n2. Set GITHUB_TOKEN environment variable:\n export GITHUB_TOKEN=<your-personal-access-token>\n\n Create a token at https://github.com/settings/tokens\n with 'repo' scope for private repository access.`,\n );\n}\n\n/**\n * Builds headers for GitHub API requests.\n * Includes Authorization header with required token.\n */\nfunction getGitHubHeaders(): Record<string, string> {\n const token = getGitHubToken();\n return {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"agconf-cli\",\n Authorization: `token ${token}`,\n };\n}\n\nexport interface ReleaseInfo {\n tag: string; // e.g., \"v1.2.0\"\n version: string; // e.g., \"1.2.0\" (without 'v' prefix)\n commitSha: string;\n publishedAt: string;\n tarballUrl: string;\n}\n\n/**\n * Fetches the latest release from a GitHub repository.\n */\nexport async function getLatestRelease(repo: string): Promise<ReleaseInfo> {\n const url = `${GITHUB_API_BASE}/repos/${repo}/releases/latest`;\n\n const response = await fetch(url, {\n headers: getGitHubHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\"No releases found for agconf repository\");\n }\n throw new Error(`Failed to fetch latest release: ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return parseReleaseResponse(data as Record<string, unknown>);\n}\n\n/**\n * Fetches a specific release by tag from a GitHub repository.\n */\nexport async function getReleaseByTag(repo: string, tag: string): Promise<ReleaseInfo> {\n // Ensure tag has 'v' prefix\n const normalizedTag = tag.startsWith(\"v\") ? tag : `v${tag}`;\n const url = `${GITHUB_API_BASE}/repos/${repo}/releases/tags/${normalizedTag}`;\n\n const response = await fetch(url, {\n headers: getGitHubHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Release ${normalizedTag} not found`);\n }\n throw new Error(`Failed to fetch release ${normalizedTag}: ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return parseReleaseResponse(data as Record<string, unknown>);\n}\n\n/**\n * Parses a GitHub release API response into ReleaseInfo.\n */\nfunction parseReleaseResponse(data: Record<string, unknown>): ReleaseInfo {\n const tag = data.tag_name as string;\n return {\n tag,\n version: parseVersion(tag),\n commitSha: (data.target_commitish as string) || \"\",\n publishedAt: data.published_at as string,\n tarballUrl: data.tarball_url as string,\n };\n}\n\n/**\n * Parses a version tag into a clean version string.\n * \"v1.2.0\" -> \"1.2.0\"\n * \"1.2.0\" -> \"1.2.0\"\n */\nexport function parseVersion(tag: string): string {\n return tag.startsWith(\"v\") ? tag.slice(1) : tag;\n}\n\n/**\n * Formats a version string as a tag.\n * \"1.2.0\" -> \"v1.2.0\"\n * \"v1.2.0\" -> \"v1.2.0\"\n */\nexport function formatTag(version: string): string {\n return version.startsWith(\"v\") ? version : `v${version}`;\n}\n\n/**\n * Checks if a ref is a version tag (e.g., \"v1.2.0\" or \"1.2.0\").\n */\nexport function isVersionRef(ref: string): boolean {\n const normalized = ref.startsWith(\"v\") ? ref.slice(1) : ref;\n return /^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?$/.test(normalized);\n}\n\n/**\n * Compares two semantic versions.\n * Returns: -1 if a < b, 0 if a == b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n const parseVer = (v: string) => {\n const clean = v.startsWith(\"v\") ? v.slice(1) : v;\n const [main, prerelease] = clean.split(\"-\");\n const parts = (main ?? \"\").split(\".\").map(Number);\n return { parts, prerelease };\n };\n\n const verA = parseVer(a);\n const verB = parseVer(b);\n\n // Compare major.minor.patch\n for (let i = 0; i < 3; i++) {\n const partA = verA.parts[i] || 0;\n const partB = verB.parts[i] || 0;\n if (partA < partB) return -1;\n if (partA > partB) return 1;\n }\n\n // Handle prerelease (1.0.0-alpha < 1.0.0)\n if (verA.prerelease && !verB.prerelease) return -1;\n if (!verA.prerelease && verB.prerelease) return 1;\n if (verA.prerelease && verB.prerelease) {\n return verA.prerelease.localeCompare(verB.prerelease);\n }\n\n return 0;\n}\n","/**\n * GitHub workflow file management for agconf.\n *\n * Handles creating, reading, and updating workflow files in downstream repositories.\n * These workflow files call the reusable workflows in the canonical repository.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ResolvedConfig } from \"../config/schema.js\";\nimport { formatTag } from \"./version.js\";\n\n// Default values\nconst DEFAULT_CLI_NAME = \"agconf\";\nconst WORKFLOWS_DIR = \".github/workflows\";\n\n/**\n * Configuration for workflow generation.\n */\nexport interface WorkflowConfig {\n /** Source repository in owner/repo format */\n sourceRepo: string;\n /** CLI command name */\n cliName: string;\n /** GitHub secret name for the token */\n secretName: string;\n /** Workflow filename prefix (e.g., \"agconf\" -> \"agconf-sync.yml\") */\n workflowPrefix: string;\n}\n\n/**\n * Get workflow config from resolved config and source repo.\n * sourceRepo is required - there is no default content repository.\n */\nexport function getWorkflowConfig(\n sourceRepo: string,\n config?: Partial<ResolvedConfig>,\n): WorkflowConfig {\n const name = config?.name ?? DEFAULT_CLI_NAME;\n // Convert name to uppercase for secret name (e.g., \"agconf\" -> \"AGCONF\")\n const secretName = `${name.toUpperCase().replace(/-/g, \"_\")}_TOKEN`;\n\n return {\n sourceRepo,\n cliName: config?.cliName ?? DEFAULT_CLI_NAME,\n secretName,\n workflowPrefix: name,\n };\n}\n\nexport interface WorkflowFile {\n name: string;\n filename: string;\n reusableWorkflow: string;\n}\n\n/**\n * Get workflow file definitions for a given config.\n */\nexport function getWorkflowFiles(config: WorkflowConfig): WorkflowFile[] {\n const prefix = config.workflowPrefix;\n return [\n {\n name: \"sync\",\n filename: `${prefix}-sync.yml`,\n reusableWorkflow: \"sync-reusable.yml\",\n },\n {\n name: \"check\",\n filename: `${prefix}-check.yml`,\n reusableWorkflow: \"check-reusable.yml\",\n },\n ];\n}\n\nexport interface WorkflowStatus {\n exists: boolean;\n currentRef?: string;\n isManaged: boolean;\n}\n\n/**\n * Gets the path to the workflows directory in a repository.\n */\nexport function getWorkflowsDir(repoRoot: string): string {\n return path.join(repoRoot, WORKFLOWS_DIR);\n}\n\n/**\n * Gets the path to a specific workflow file.\n */\nexport function getWorkflowPath(repoRoot: string, filename: string): string {\n return path.join(repoRoot, WORKFLOWS_DIR, filename);\n}\n\n/**\n * Checks the status of a workflow file.\n */\nexport async function getWorkflowStatus(\n repoRoot: string,\n workflow: WorkflowFile,\n config: WorkflowConfig,\n): Promise<WorkflowStatus> {\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const currentRef = extractWorkflowRef(content, workflow.reusableWorkflow, config.sourceRepo);\n const isManaged =\n content.includes(`# Managed by ${config.cliName}`) || content.includes(config.sourceRepo);\n\n const result: WorkflowStatus = { exists: true, isManaged };\n if (currentRef !== undefined) result.currentRef = currentRef;\n return result;\n } catch {\n // Expected: workflow file may not exist\n return {\n exists: false,\n isManaged: false,\n };\n }\n}\n\n/**\n * Extracts the version ref from a workflow file content.\n * Looks for: uses: owner/repo/.github/workflows/name.yml@ref\n */\nexport function extractWorkflowRef(\n content: string,\n reusableWorkflow: string,\n sourceRepo: string,\n): string | undefined {\n const pattern = new RegExp(\n `uses:\\\\s*${escapeRegex(sourceRepo)}\\\\/.github\\\\/workflows\\\\/${reusableWorkflow}@([^\\\\s]+)`,\n );\n const match = content.match(pattern);\n return match?.[1];\n}\n\n/**\n * Updates the version ref in a workflow file content.\n */\nexport function updateWorkflowRef(\n content: string,\n reusableWorkflow: string,\n newRef: string,\n sourceRepo: string,\n): string {\n const pattern = new RegExp(\n `(uses:\\\\s*${escapeRegex(sourceRepo)}\\\\/.github\\\\/workflows\\\\/${reusableWorkflow})@[^\\\\s]+`,\n \"g\",\n );\n return content.replace(pattern, `$1@${newRef}`);\n}\n\n/**\n * Generates the content for the sync workflow file.\n */\nexport function generateSyncWorkflow(versionRef: string, config: WorkflowConfig): string {\n const { sourceRepo, cliName, secretName } = config;\n\n return `# ${cliName} Auto-Sync Workflow\n# Managed by ${cliName} CLI - do not edit the version ref manually\n#\n# This workflow syncs standards from the central repository.\n# Version changes should be made using: ${cliName} sync --ref <version>\n#\n# TOKEN: Requires a PAT with read access to the source repository.\n# Create a fine-grained PAT at https://github.com/settings/tokens?type=beta\n# with read access to ${sourceRepo}, then add it as ${secretName} secret.\n\nname: ${cliName} Sync\n\non:\n schedule:\n - cron: '0 6 * * *' # Daily at 6am UTC\n\n workflow_dispatch:\n inputs:\n force:\n description: 'Force sync even if no updates detected'\n required: false\n default: false\n type: boolean\n\n repository_dispatch:\n types: [${cliName.replace(/-/g, \"_\")}-release]\n\nconcurrency:\n group: ${cliName}-sync\n cancel-in-progress: false\n\njobs:\n sync:\n uses: ${sourceRepo}/.github/workflows/sync-reusable.yml@${versionRef}\n with:\n force: \\${{ inputs.force || false }}\n reviewers: \\${{ vars.${secretName.replace(/_TOKEN$/, \"_REVIEWERS\")} || '' }}\n secrets:\n token: \\${{ secrets.${secretName} }}\n`;\n}\n\n/**\n * Generates the content for the check workflow file.\n */\nexport function generateCheckWorkflow(versionRef: string, config: WorkflowConfig): string {\n const { sourceRepo, cliName } = config;\n\n return `# ${cliName} File Integrity Check\n# Managed by ${cliName} CLI - do not edit the version ref manually\n#\n# This workflow checks that ${cliName}-managed files haven't been modified.\n# Version changes should be made using: ${cliName} sync --ref <version>\n\nname: ${cliName} Check\n\non:\n pull_request:\n paths:\n - '.claude/skills/**'\n - '.codex/skills/**'\n - 'AGENTS.md'\n push:\n paths:\n - '.claude/skills/**'\n - '.codex/skills/**'\n - 'AGENTS.md'\n\njobs:\n check:\n uses: ${sourceRepo}/.github/workflows/check-reusable.yml@${versionRef}\n`;\n}\n\n/**\n * Generates workflow content for a specific workflow type.\n */\nexport function generateWorkflow(\n workflow: WorkflowFile,\n versionRef: string,\n config: WorkflowConfig,\n): string {\n switch (workflow.name) {\n case \"sync\":\n return generateSyncWorkflow(versionRef, config);\n case \"check\":\n return generateCheckWorkflow(versionRef, config);\n default:\n throw new Error(`Unknown workflow: ${workflow.name}`);\n }\n}\n\n/**\n * Ensures the workflows directory exists.\n */\nexport async function ensureWorkflowsDir(repoRoot: string): Promise<void> {\n const dir = getWorkflowsDir(repoRoot);\n await fs.mkdir(dir, { recursive: true });\n}\n\n/**\n * Writes a workflow file to the repository.\n */\nexport async function writeWorkflow(\n repoRoot: string,\n workflow: WorkflowFile,\n versionRef: string,\n config: WorkflowConfig,\n): Promise<void> {\n await ensureWorkflowsDir(repoRoot);\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n const content = generateWorkflow(workflow, versionRef, config);\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Updates the version ref in an existing workflow file.\n */\nexport async function updateWorkflowVersion(\n repoRoot: string,\n workflow: WorkflowFile,\n newRef: string,\n config: WorkflowConfig,\n): Promise<boolean> {\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const currentRef = extractWorkflowRef(content, workflow.reusableWorkflow, config.sourceRepo);\n\n if (currentRef === newRef) {\n return false; // No change needed\n }\n\n const updatedContent = updateWorkflowRef(\n content,\n workflow.reusableWorkflow,\n newRef,\n config.sourceRepo,\n );\n await fs.writeFile(filePath, updatedContent, \"utf-8\");\n return true;\n } catch {\n // Expected: file doesn't exist, create it\n await writeWorkflow(repoRoot, workflow, newRef, config);\n return true;\n }\n}\n\n/**\n * Result of syncing all workflow files.\n */\nexport interface WorkflowSyncResult {\n created: string[];\n updated: string[];\n unchanged: string[];\n}\n\n/**\n * Syncs all workflow files to a specific version.\n * Always overwrites existing workflow files if they differ from the expected content.\n */\nexport async function syncWorkflows(\n repoRoot: string,\n versionRef: string,\n sourceRepo: string,\n resolvedConfig?: Partial<ResolvedConfig>,\n): Promise<WorkflowSyncResult> {\n const config = getWorkflowConfig(sourceRepo, resolvedConfig);\n const workflowFiles = getWorkflowFiles(config);\n\n const result: WorkflowSyncResult = {\n created: [],\n updated: [],\n unchanged: [],\n };\n\n for (const workflow of workflowFiles) {\n const filePath = getWorkflowPath(repoRoot, workflow.filename);\n const expectedContent = generateWorkflow(workflow, versionRef, config);\n\n let existingContent: string | null = null;\n try {\n existingContent = await fs.readFile(filePath, \"utf-8\");\n } catch {\n // Expected: file doesn't exist yet\n }\n\n if (existingContent === null) {\n // File doesn't exist, create it\n await writeWorkflow(repoRoot, workflow, versionRef, config);\n result.created.push(workflow.filename);\n } else if (existingContent !== expectedContent) {\n // File exists but differs from expected content, overwrite it\n await writeWorkflow(repoRoot, workflow, versionRef, config);\n result.updated.push(workflow.filename);\n } else {\n // File exists and matches expected content\n result.unchanged.push(workflow.filename);\n }\n }\n\n return result;\n}\n\n/**\n * Gets the current version ref from workflow files.\n * Returns the ref if all workflows have the same version, or undefined if mixed/missing.\n */\nexport async function getCurrentWorkflowVersion(\n repoRoot: string,\n sourceRepo: string,\n resolvedConfig?: Partial<ResolvedConfig>,\n): Promise<string | undefined> {\n const config = getWorkflowConfig(sourceRepo, resolvedConfig);\n const workflowFiles = getWorkflowFiles(config);\n const refs: (string | undefined)[] = [];\n\n for (const workflow of workflowFiles) {\n const status = await getWorkflowStatus(repoRoot, workflow, config);\n refs.push(status.currentRef);\n }\n\n // Check if all refs are the same and defined\n const uniqueRefs = [...new Set(refs.filter(Boolean))];\n if (uniqueRefs.length === 1) {\n return uniqueRefs[0];\n }\n\n return undefined;\n}\n\n/**\n * Formats a version for use as a workflow ref.\n * For version tags, uses the full tag (v1.2.0).\n * For branches, uses the branch name as-is.\n */\nexport function formatWorkflowRef(ref: string, isVersion: boolean): string {\n if (isVersion) {\n return formatTag(ref);\n }\n return ref;\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import * as path from \"node:path\";\nimport pc from \"picocolors\";\nimport { checkAllManagedFiles } from \"../core/skill-metadata.js\";\nimport { formatSourceString } from \"../core/source.js\";\nimport { getSyncStatus } from \"../core/sync.js\";\nimport { formatPath } from \"../utils/logger.js\";\n\nexport interface StatusOptions {\n check?: boolean;\n}\n\nexport async function statusCommand(options: StatusOptions = {}): Promise<void> {\n const targetDir = process.cwd();\n const status = await getSyncStatus(targetDir);\n\n console.log();\n console.log(pc.bold(\"agconf sync status\"));\n console.log();\n\n if (!status.hasSynced) {\n console.log(pc.yellow(\"Not synced\"));\n console.log();\n console.log(pc.dim(\"Run `agconf init` to sync engineering standards to this repository.\"));\n console.log();\n return;\n }\n\n const lockfile = status.lockfile!;\n\n console.log(`${pc.green(\"Synced\")}`);\n console.log();\n\n // Source info\n console.log(pc.bold(\"Source:\"));\n console.log(` ${formatSourceString(lockfile.source)}`);\n console.log();\n\n // Sync timestamp\n console.log(pc.bold(\"Last synced:\"));\n const syncedAt = new Date(lockfile.synced_at);\n console.log(` ${syncedAt.toLocaleString()}`);\n console.log();\n\n // Content\n console.log(pc.bold(\"Content:\"));\n console.log(` AGENTS.md: ${status.agentsMdExists ? pc.green(\"present\") : pc.red(\"missing\")}`);\n console.log(` Skills: ${lockfile.content.skills.length} synced`);\n if (lockfile.content.skills.length > 0) {\n for (const skill of lockfile.content.skills) {\n console.log(` - ${skill}`);\n }\n }\n console.log();\n\n // Check for modified files if --check flag is provided\n if (options.check) {\n const targets = lockfile.content.targets ?? [\"claude\"];\n const allFiles = await checkAllManagedFiles(targetDir, targets);\n const modifiedFiles = allFiles.filter((f) => f.hasChanges);\n\n console.log(pc.bold(\"File integrity:\"));\n if (modifiedFiles.length === 0) {\n console.log(` ${pc.green(\"✓\")} All managed files are unchanged`);\n } else {\n console.log(` ${pc.yellow(\"!\")} ${modifiedFiles.length} file(s) manually modified:`);\n for (const file of modifiedFiles) {\n const label = file.type === \"agents\" ? \"(global block)\" : \"\";\n console.log(` ${pc.yellow(\"~\")} ${file.path} ${pc.dim(label)}`);\n }\n console.log();\n console.log(pc.dim(\" These files will be overwritten on next sync. To preserve changes,\"));\n console.log(pc.dim(\" copy them elsewhere before running `agconf sync`.\"));\n }\n console.log();\n }\n\n // Lockfile location\n const lockfilePath = formatPath(path.join(targetDir, \".agconf\", \"agconf.lock\"));\n console.log(pc.dim(`Lock file: ${lockfilePath}`));\n console.log(pc.dim(`CLI version: ${lockfile.cli_version}`));\n console.log();\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getSyncStatus } from \"../core/sync.js\";\nimport { compareVersions } from \"../core/version.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n checkModifiedFilesBeforeSync,\n parseAndValidateTargets,\n performSync,\n promptMergeOrOverride,\n resolveSource,\n resolveTargetDirectory,\n resolveVersion,\n type SharedSyncOptions,\n} from \"./shared.js\";\n\nexport interface SyncOptions extends SharedSyncOptions {}\n\nexport async function syncCommand(options: SyncOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agconf sync\"));\n\n // Validate mutually exclusive flags\n if (options.pinned && options.ref) {\n logger.error(\"Cannot use --pinned with --ref. Choose one.\");\n process.exit(1);\n }\n if (options.pinned && options.local !== undefined) {\n logger.error(\"Cannot use --pinned with --local.\");\n process.exit(1);\n }\n\n // Resolve target directory to git root\n const targetDir = await resolveTargetDirectory();\n\n // Check current status (informational only, no confirmation prompt)\n const status = await getSyncStatus(targetDir);\n\n // Parse targets: use lockfile targets if --target not explicitly specified\n const targetsFromLockfile = status.lockfile?.content.targets;\n const effectiveTargetOption =\n options.target ?? (targetsFromLockfile?.length ? targetsFromLockfile : undefined);\n const targets = await parseAndValidateTargets(effectiveTargetOption);\n\n // Check schema compatibility\n if (status.schemaError) {\n logger.error(status.schemaError);\n process.exit(1);\n }\n if (status.schemaWarning) {\n logger.warn(status.schemaWarning);\n }\n\n if (!status.hasSynced) {\n logger.warn(\"This repository has not been synced yet. Consider running 'agconf init' first.\");\n }\n\n // For sync command, try to get source from:\n // 1. --source flag (highest priority)\n // 2. Lockfile's recorded source\n let sourceRepo = options.source;\n if (!sourceRepo && status.lockfile?.source.type === \"github\") {\n sourceRepo = status.lockfile.source.repository;\n }\n\n // Resolve version (fetches latest by default, unless --pinned or --ref)\n const resolvedVersion = await resolveVersion(options, status, \"sync\", sourceRepo);\n\n // Check if already up to date (when fetching latest, not --pinned or --ref)\n if (!options.pinned && !options.ref && !options.local && status.lockfile?.pinned_version) {\n const currentVersion = status.lockfile.pinned_version;\n\n if (resolvedVersion.version) {\n const comparison = compareVersions(currentVersion, resolvedVersion.version);\n\n // Display version info\n console.log();\n console.log(`Canonical source: ${pc.cyan(sourceRepo)}`);\n console.log(`Latest release: ${pc.cyan(resolvedVersion.version)}`);\n console.log(`Pinned version: ${pc.cyan(currentVersion)}`);\n\n if (comparison >= 0) {\n // Current version is equal or newer\n console.log(` ${pc.green(\"✓\")} Up to date`);\n console.log();\n prompts.outro(pc.green(\"Already up to date!\"));\n return;\n }\n\n // Update available\n console.log(\n ` ${pc.yellow(\"→\")} Update available: ${currentVersion} → ${resolvedVersion.version}`,\n );\n console.log();\n\n // Confirm update\n if (!options.yes) {\n const shouldUpdate = await prompts.confirm({\n message: \"Proceed with update?\",\n initialValue: true,\n });\n\n if (prompts.isCancel(shouldUpdate) || !shouldUpdate) {\n prompts.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n }\n }\n }\n\n // If --ref was specified, inform user about version change\n if (options.ref && status.lockfile?.pinned_version) {\n const currentVersion = status.lockfile.pinned_version;\n if (resolvedVersion.version && currentVersion !== resolvedVersion.version) {\n logger.info(`Updating version: ${currentVersion} → ${resolvedVersion.version}`);\n }\n }\n\n // Pass the resolved source to options for resolveSource\n const optionsWithSource: SyncOptions = sourceRepo ? { ...options, source: sourceRepo } : options;\n\n // Resolve source using the determined version\n const { resolvedSource, tempDir, repository } = await resolveSource(\n optionsWithSource,\n resolvedVersion,\n );\n\n // Determine merge behavior\n const shouldOverride = await promptMergeOrOverride(status, options, tempDir);\n\n // Check for modified skill files and warn\n await checkModifiedFilesBeforeSync(targetDir, targets, options, tempDir);\n\n // Perform sync (includes workflow files for release versions)\n await performSync({\n targetDir,\n resolvedSource,\n resolvedVersion,\n shouldOverride,\n targets,\n context: {\n commandName: \"sync\",\n status,\n },\n tempDir,\n yes: options.yes,\n sourceRepo: repository,\n summaryFile: options.summaryFile,\n expandChanges: options.expandChanges,\n });\n}\n","import { execSync } from \"node:child_process\";\nimport * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getCliVersion } from \"../core/lockfile.js\";\nimport { compareVersions } from \"../core/version.js\";\nimport { createLogger } from \"../utils/logger.js\";\n\nconst NPM_PACKAGE_NAME = \"agconf\";\n\nexport interface UpgradeCliOptions {\n yes?: boolean;\n}\n\n/**\n * Fetches the latest version from the npm registry.\n */\nasync function getLatestNpmVersion(): Promise<string> {\n const response = await fetch(`https://registry.npmjs.org/${NPM_PACKAGE_NAME}/latest`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch package info: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { version: string };\n return data.version;\n}\n\nexport async function upgradeCliCommand(options: UpgradeCliOptions): Promise<void> {\n const logger = createLogger();\n const currentVersion = getCliVersion();\n\n console.log();\n prompts.intro(pc.bold(\"agconf upgrade-cli\"));\n\n // Check for updates\n const spinner = logger.spinner(\"Checking for CLI updates...\");\n spinner.start();\n\n let latestVersion: string;\n try {\n latestVersion = await getLatestNpmVersion();\n spinner.stop();\n } catch (error) {\n spinner.fail(\"Failed to check for CLI updates\");\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n // Display version info\n console.log();\n console.log(`Current version: ${pc.cyan(currentVersion)}`);\n console.log(`Latest version: ${pc.cyan(latestVersion)}`);\n\n // Check if update is needed\n const needsUpdate = compareVersions(currentVersion, latestVersion) < 0;\n\n if (!needsUpdate) {\n console.log();\n prompts.outro(pc.green(\"CLI is already up to date!\"));\n return;\n }\n\n console.log();\n console.log(`${pc.yellow(\"→\")} Update available: ${currentVersion} → ${latestVersion}`);\n console.log();\n\n // Confirm update\n if (!options.yes) {\n const shouldUpdate = await prompts.confirm({\n message: \"Proceed with CLI upgrade?\",\n initialValue: true,\n });\n\n if (prompts.isCancel(shouldUpdate) || !shouldUpdate) {\n prompts.cancel(\"Upgrade cancelled\");\n process.exit(0);\n }\n }\n\n // Perform upgrade\n const installSpinner = logger.spinner(\"Upgrading CLI...\");\n installSpinner.start();\n\n try {\n execSync(`npm install -g ${NPM_PACKAGE_NAME}@latest`, {\n stdio: \"pipe\",\n });\n installSpinner.succeed(\"CLI upgraded\");\n\n console.log();\n prompts.outro(pc.green(`CLI upgraded to ${latestVersion}!`));\n } catch (error) {\n installSpinner.fail(\"Upgrade failed\");\n logger.error(error instanceof Error ? error.message : String(error));\n logger.info(`\\nYou can try manually: npm install -g ${NPM_PACKAGE_NAME}@latest`);\n process.exit(1);\n }\n}\n","import { createCli } from \"./cli.js\";\n\nconst cli = createCli();\ncli.parse(process.argv);\n"],"mappings":"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","names":["pc","fs","path","pc","stat","fs","path","stat","text","pc","fs","path","pc","fs","path","pc","fs","os","path","prompts","pc","prompts","pc","pc","prompts","pc","createHash","fs","path","fs","path","repoContent","createHash","parseFrontmatter","createHash","createHash","fs","path","prompts","pc","fs","path","fs","path","simpleGit","fs","path","simpleGit","log","stat","fs","path","DEFAULT_CLI_NAME","generateSyncWorkflow","generateCheckWorkflow","pc","pc","path","pc","pc","prompts","pc","pc","execSync","prompts","pc","pc","execSync","pc"]}