agent-conf 2.0.1 → 2.0.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 CHANGED
@@ -66,7 +66,7 @@ var CONFIG_DIR = ".agent-conf";
66
66
  var LOCKFILE_NAME = "lockfile.json";
67
67
  var CLI_VERSION = "0.1.0";
68
68
  function getBuildCommit() {
69
- return true ? "95b3bde2e0c69d73035f93e655d08eb0c89e3b53" : "unknown";
69
+ return true ? "8dbc8e1181a2dcf46440e66df3306677ddb96bd1" : "unknown";
70
70
  }
71
71
  function getLockfilePath(targetDir) {
72
72
  return path.join(targetDir, CONFIG_DIR, LOCKFILE_NAME);
@@ -1998,6 +1998,9 @@ function generateSyncWorkflow2(repoFullName, prefix) {
1998
1998
  #
1999
1999
  # Downstream repos will reference this workflow like:
2000
2000
  # uses: ${repoFullName}/.github/workflows/sync-reusable.yml@v1.0.0
2001
+ #
2002
+ # TOKEN: Requires a token with read access to the canonical repository.
2003
+ # The default GITHUB_TOKEN is used for operations on the downstream repo.
2001
2004
 
2002
2005
  name: Sync Reusable
2003
2006
 
@@ -2009,23 +2012,60 @@ on:
2009
2012
  required: false
2010
2013
  default: false
2011
2014
  type: boolean
2015
+ commit_strategy:
2016
+ description: 'How to commit changes: "pr" (create pull request) or "direct" (commit to current branch)'
2017
+ required: false
2018
+ default: 'pr'
2019
+ type: string
2020
+ pr_branch_prefix:
2021
+ description: 'Branch prefix for PR branches'
2022
+ required: false
2023
+ default: '${prefix}/sync'
2024
+ type: string
2025
+ pr_title:
2026
+ description: 'Pull request title'
2027
+ required: false
2028
+ default: 'chore(${prefix}): sync agent configuration'
2029
+ type: string
2012
2030
  reviewers:
2013
- description: 'PR reviewers (comma-separated)'
2031
+ description: 'PR reviewers (comma-separated GitHub usernames)'
2014
2032
  required: false
2015
2033
  type: string
2034
+ commit_message:
2035
+ description: 'Commit message for direct commits'
2036
+ required: false
2037
+ default: 'chore(${prefix}): sync agent configuration'
2038
+ type: string
2016
2039
  secrets:
2017
2040
  token:
2018
- description: 'GitHub token with repo access'
2041
+ description: 'GitHub token with read access to the canonical repository'
2019
2042
  required: true
2043
+ outputs:
2044
+ changes_detected:
2045
+ description: 'Whether changes were detected after sync'
2046
+ value: \${{ jobs.sync.outputs.changes_detected }}
2047
+ pr_number:
2048
+ description: 'Pull request number (if PR strategy and changes detected)'
2049
+ value: \${{ jobs.sync.outputs.pr_number }}
2050
+ pr_url:
2051
+ description: 'Pull request URL (if PR strategy and changes detected)'
2052
+ value: \${{ jobs.sync.outputs.pr_url }}
2020
2053
 
2021
2054
  jobs:
2022
2055
  sync:
2023
2056
  runs-on: ubuntu-latest
2057
+ permissions:
2058
+ contents: write
2059
+ pull-requests: write
2060
+ outputs:
2061
+ changes_detected: \${{ steps.check-changes.outputs.changes_detected }}
2062
+ pr_number: \${{ steps.create-pr.outputs.pr_number }}
2063
+ pr_url: \${{ steps.create-pr.outputs.pr_url }}
2024
2064
  steps:
2025
- - name: Checkout downstream repo
2065
+ - name: Checkout
2026
2066
  uses: actions/checkout@v4
2027
2067
  with:
2028
- token: \${{ secrets.token }}
2068
+ fetch-depth: 0
2029
2069
 
2030
2070
  - name: Setup Node.js
2031
2071
  uses: actions/setup-node@v4
@@ -2036,10 +2076,74 @@ jobs:
2036
2076
  run: npm install -g agent-conf
2037
2077
 
2038
2078
  - name: Run sync
2039
- run: |
2040
- agent-conf sync --yes
2079
+ run: agent-conf sync --yes
2041
2080
  env:
2042
2081
  GITHUB_TOKEN: \${{ secrets.token }}
2082
+
2083
+ - name: Check for changes
2084
+ id: check-changes
2085
+ run: |
2086
+ if [ -n "$(git status --porcelain)" ]; then
2087
+ echo "changes_detected=true" >> $GITHUB_OUTPUT
2088
+ echo "Changes detected after sync"
2089
+ git status --short
2090
+ else
2091
+ echo "changes_detected=false" >> $GITHUB_OUTPUT
2092
+ echo "No changes detected after sync"
2093
+ fi
2094
+
2095
+ - name: Configure git
2096
+ if: steps.check-changes.outputs.changes_detected == 'true'
2097
+ run: |
2098
+ git config user.name "github-actions[bot]"
2099
+ git config user.email "github-actions[bot]@users.noreply.github.com"
2100
+
2101
+ - name: Create PR branch and commit
2102
+ if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'
2103
+ run: |
2104
+ BRANCH_NAME="\${{ inputs.pr_branch_prefix }}-$(date +%Y%m%d-%H%M%S)"
2105
+ git checkout -b "$BRANCH_NAME"
2106
+ git add -A
2107
+ git commit -m "\${{ inputs.pr_title }}"
2108
+ git push -u origin "$BRANCH_NAME"
2109
+ echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
2110
+
2111
+ - name: Create pull request
2112
+ id: create-pr
2113
+ if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'
2114
+ env:
2115
+ GH_TOKEN: \${{ github.token }}
2116
+ run: |
2117
+ PR_BODY="This PR was automatically created by the ${prefix} sync workflow.
2118
+
2119
+ ## Changes
2120
+ - Synced agent configuration from canonical repository
2121
+
2122
+ ---
2123
+ *This is an automated PR. Review the changes and merge when ready.*"
2124
+
2125
+ REVIEWERS_ARG=""
2126
+ if [ -n "\${{ inputs.reviewers }}" ]; then
2127
+ REVIEWERS_ARG="--reviewer \${{ inputs.reviewers }}"
2128
+ fi
2129
+
2130
+ PR_URL=$(gh pr create \\
2131
+ --title "\${{ inputs.pr_title }}" \\
2132
+ --body "$PR_BODY" \\
2133
+ $REVIEWERS_ARG)
2134
+
2135
+ PR_NUMBER=$(gh pr view --json number -q .number)
2136
+ echo "pr_url=$PR_URL" >> $GITHUB_OUTPUT
2137
+ echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
2138
+ echo "Created PR #$PR_NUMBER: $PR_URL"
2139
+
2140
+ - name: Commit directly to branch
2141
+ if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'direct'
2142
+ run: |
2143
+ git add -A
2144
+ git commit -m "\${{ inputs.commit_message }}"
2145
+ git push
2146
+ echo "Changes committed directly to $(git branch --show-current)"
2043
2147
  `;
2044
2148
  }
2045
2149
  function generateCheckWorkflow2(repoFullName, prefix) {
@@ -2048,6 +2152,8 @@ function generateCheckWorkflow2(repoFullName, prefix) {
2048
2152
  #
2049
2153
  # Downstream repos will reference this workflow like:
2050
2154
  # uses: ${repoFullName}/.github/workflows/check-reusable.yml@v1.0.0
2155
+ #
2156
+ # TOKEN: Requires a token with read access to the canonical repository.
2051
2157
 
2052
2158
  name: Check Reusable
2053
2159
 
@@ -2055,7 +2161,7 @@ on:
2055
2161
  workflow_call:
2056
2162
  secrets:
2057
2163
  token:
2058
- description: 'GitHub token with repo access'
2164
+ description: 'GitHub token with read access to the canonical repository'
2059
2165
  required: true
2060
2166
 
2061
2167
  jobs:
@@ -2064,8 +2170,6 @@ jobs:
2064
2170
  steps:
2065
2171
  - name: Checkout
2066
2172
  uses: actions/checkout@v4
2067
- with:
2068
- token: \${{ secrets.token }}
2069
2173
 
2070
2174
  - name: Setup Node.js
2071
2175
  uses: actions/setup-node@v4
@@ -2076,8 +2180,9 @@ jobs:
2076
2180
  run: npm install -g agent-conf
2077
2181
 
2078
2182
  - name: Check file integrity
2079
- run: |
2080
- agent-conf check
2183
+ run: agent-conf check
2184
+ env:
2185
+ GITHUB_TOKEN: \${{ secrets.token }}
2081
2186
  `;
2082
2187
  }
2083
2188
  async function initCanonicalRepoCommand(options) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/check.ts","../src/core/lockfile.ts","../src/schemas/lockfile.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/utils/logger.ts","../src/commands/init.ts","../src/core/sync.ts","../src/core/merge.ts","../src/core/targets.ts","../src/commands/shared.ts","../src/core/hooks.ts","../src/core/source.ts","../src/core/version.ts","../src/core/workflows.ts","../src/utils/fs.ts","../src/utils/git.ts","../src/commands/init-canonical-repo.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 { 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 { initCanonicalRepoCommand } from \"./commands/init-canonical-repo.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 lockfile's source commit.\n * Shows a warning if they don't match.\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: built from ${mismatch.cliCommit}, but repo was synced from ${mismatch.lockfileCommit}`,\n ),\n );\n console.log(\n pc.yellow(\n \" Rebuild the CLI: cd <agent-conf-repo>/cli && pnpm build && pnpm link --global\",\n ),\n );\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 .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 }) => {\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 program\n .command(\"init-canonical-repo\")\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(\"-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 yes?: boolean;\n }) => {\n await initCanonicalRepoCommand({\n name: options.name,\n org: options.org,\n dir: options.dir,\n markerPrefix: options.markerPrefix,\n includeExamples: options.examples,\n yes: options.yes,\n });\n },\n );\n\n // Default command: show help\n program.action(() => {\n program.help();\n });\n\n return program;\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 parseAgentsMd,\n parseGlobalBlockMetadata,\n stripMetadataComments,\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\";\n expectedHash: string;\n currentHash: 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 lockfile = await readLockfile(targetDir);\n\n if (!lockfile) {\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 const targets = lockfile.content.targets ?? [\"claude\"];\n const modifiedFiles: ModifiedFileInfo[] = [];\n\n // Check all managed files\n const allFiles = await checkAllManagedFiles(targetDir, targets);\n\n // Gather detailed info for modified files\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);\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?.agent_conf_content_hash ?? \"unknown\";\n const currentHash = computeContentHash(content);\n\n modifiedFiles.push({\n path: file.path,\n type: \"skill\",\n expectedHash: storedHash,\n currentHash,\n });\n }\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 const label = file.type === \"agents\" ? \" (global block)\" : \"\";\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 { type Lockfile, LockfileSchema, type Source } from \"../schemas/lockfile.js\";\n\n// Injected at build time by tsup\ndeclare const __BUILD_COMMIT__: string;\n\nconst CONFIG_DIR = \".agent-conf\";\nconst LOCKFILE_NAME = \"lockfile.json\";\nconst CLI_VERSION = \"0.1.0\";\n\n/**\n * Gets the git commit SHA the CLI was built from.\n */\nexport function getBuildCommit(): string {\n return typeof __BUILD_COMMIT__ !== \"undefined\" ? __BUILD_COMMIT__ : \"unknown\";\n}\n\nexport function getLockfilePath(targetDir: string): string {\n return path.join(targetDir, CONFIG_DIR, LOCKFILE_NAME);\n}\n\nexport async function readLockfile(targetDir: string): Promise<Lockfile | 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 return LockfileSchema.parse(parsed);\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}\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: \"1\",\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 },\n cli_version: CLI_VERSION,\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 CLI_VERSION;\n}\n\nexport interface VersionMismatch {\n cliCommit: string;\n lockfileCommit: string;\n}\n\n/**\n * Checks if the CLI's build commit matches the lockfile's source commit.\n * Returns mismatch info if they differ (CLI is outdated), null otherwise.\n */\nexport async function checkCliVersionMismatch(targetDir: string): Promise<VersionMismatch | null> {\n const lockfile = await readLockfile(targetDir);\n\n // No lockfile means first sync - no mismatch\n if (!lockfile) {\n return null;\n }\n\n // Only check for GitHub sources (local doesn't have a meaningful commit to compare)\n if (lockfile.source.type !== \"github\") {\n return null;\n }\n\n const cliCommit = getBuildCommit();\n const lockfileCommit = lockfile.source.commit_sha;\n\n // If CLI commit is unknown, we can't compare\n if (cliCommit === \"unknown\") {\n return null;\n }\n\n // Check if commits match (compare first 7 chars for short SHA compatibility)\n const cliShort = cliCommit.slice(0, 7);\n const lockfileShort = lockfileCommit.slice(0, 7);\n\n if (cliShort !== lockfileShort) {\n return {\n cliCommit: cliShort,\n lockfileCommit: lockfileShort,\n };\n }\n\n return null;\n}\n","import { z } from \"zod\";\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});\n\nexport const LockfileSchema = z.object({\n version: z.literal(\"1\"),\n pinned_version: z.string().optional(), // Pinned release version (e.g., \"1.2.0\")\n synced_at: z.string().datetime(),\n source: SourceSchema,\n content: ContentSchema,\n cli_version: z.string(),\n});\n\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Content = z.infer<typeof ContentSchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\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 \"init-canonical-repo\": {\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 \"-y\",\n \"--yes\",\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 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 --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 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\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getSyncStatus } from \"../core/sync.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 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 // 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 * 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 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\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 totalCopied: number;\n validationErrors: SkillValidationError[];\n };\n}\n\nexport async function sync(\n targetDir: string,\n resolvedSource: ResolvedSource,\n options: SyncOptions = { override: false, targets: [\"claude\"] },\n): Promise<SyncResult> {\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 });\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 // Skip if SKILL.md doesn't exist (will be handled elsewhere)\n }\n }\n\n // Process each target\n const targetResults: TargetResult[] = [];\n let totalCopied = 0;\n\n for (const target of options.targets) {\n const config = getTargetConfig(target);\n\n // Sync skills to this target\n const skillsCopied = await syncSkillsToTarget(\n targetDir,\n resolvedSource.skillsPath,\n skillNames,\n config,\n );\n totalCopied += skillsCopied;\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: skillsCopied },\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 };\n if (options.pinnedVersion) {\n lockfileOptions.pinnedVersion = options.pinnedVersion;\n }\n const lockfile = await writeLockfile(targetDir, lockfileOptions);\n\n return {\n lockfile,\n agentsMd: {\n merged: mergeResult.merged,\n preservedRepoContent: mergeResult.preservedRepoContent,\n },\n targets: targetResults,\n skills: {\n synced: skillNames,\n totalCopied,\n validationErrors,\n },\n };\n}\n\nasync function syncSkillsToTarget(\n targetDir: string,\n sourceSkillsPath: string,\n skillNames: string[],\n config: TargetConfig,\n): Promise<number> {\n const targetSkillsPath = path.join(targetDir, config.dir, \"skills\");\n let copied = 0;\n\n for (const skillName of skillNames) {\n const sourceDir = path.join(sourceSkillsPath, skillName);\n const targetSkillDir = path.join(targetSkillsPath, skillName);\n\n const filesCopied = await copySkillDirectory(sourceDir, targetSkillDir);\n copied += filesCopied;\n }\n\n return copied;\n}\n\n/**\n * Copy a skill directory, adding managed metadata to SKILL.md files.\n */\nasync function copySkillDirectory(sourceDir: string, targetDir: string): Promise<number> {\n await fs.mkdir(targetDir, { recursive: true });\n\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n let copied = 0;\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 copied += await copySkillDirectory(sourcePath, targetPath);\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);\n await fs.writeFile(targetPath, contentWithMetadata, \"utf-8\");\n copied++;\n } else {\n // Copy other files as-is\n await fs.copyFile(sourcePath, targetPath);\n copied++;\n }\n }\n\n return copied;\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}\n\nexport async function getSyncStatus(targetDir: string): Promise<SyncStatus> {\n const lockfile = 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: lockfile !== null,\n lockfile,\n agentsMdExists,\n skillsExist,\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/**\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): Promise<{ deleted: string[]; skipped: string[] }> {\n const deleted: string[] = [];\n const skipped: string[] = [];\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 continue; // Directory doesn't exist for this target\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)) {\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);\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 // SKILL.md doesn't 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}\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\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);\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, {});\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","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 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}\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.fail(\"Failed to fetch latest release, falling back to master\");\n logger.warn(\"Could not fetch latest release. Using master branch instead.\");\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}\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 later\n const previousLockfile = await readLockfile(targetDir);\n const previousSkills = previousLockfile?.content.skills ?? [];\n const previousTargets = previousLockfile?.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 // Summary\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 } else {\n console.log(` ${pc.green(\"+\")} ${agentsMdPath} ${pc.dim(\"(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 if (targetResult.instructionsMd.created) {\n console.log(` ${pc.green(\"+\")} ${instructionsPath} ${pc.dim(\"(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 } else {\n console.log(` ${pc.dim(\"-\")} ${instructionsPath} ${pc.dim(\"(unchanged)\")}`);\n }\n }\n\n // Skills status for this target\n const skillsPath = formatPath(path.join(targetDir, config.dir, \"skills\"));\n console.log(\n ` ${pc.green(\"+\")} ${skillsPath}/ ${pc.dim(`(${result.skills.synced.length} skills, ${targetResult.skills.copied} files)`)}`,\n );\n\n // Orphan deletion status for this target\n if (orphanResult.deleted.length > 0) {\n for (const skill of orphanResult.deleted) {\n const orphanPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n console.log(\n ` ${pc.red(\"-\")} ${orphanPath}/ ${pc.dim(\"(removed - no longer in source)\")}`,\n );\n }\n }\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 console.log(` ${pc.yellow(\"!\")} ${orphanPath}/ ${pc.dim(\"(orphaned but skipped)\")}`);\n }\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 }\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 }\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 }\n }\n\n // Lockfile status\n const lockfilePath = formatPath(path.join(targetDir, \".agent-conf\", \"agent-conf.lock\"));\n console.log(` ${pc.green(\"+\")} ${lockfilePath}`);\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 } else if (hookResult.wasUpdated) {\n console.log(` ${pc.yellow(\"~\")} ${hookPath} ${pc.dim(\"(updated)\")}`);\n } else {\n console.log(` ${pc.green(\"+\")} ${hookPath} ${pc.dim(\"(installed)\")}`);\n }\n } else if (hookResult.alreadyExisted) {\n console.log(` ${pc.yellow(\"!\")} ${hookPath} ${pc.dim(\"(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 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 // Hook doesn't exist\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\n/**\n * Check if the pre-commit hook is installed.\n */\nexport async function isPreCommitHookInstalled(targetDir: string): Promise<boolean> {\n const hookPath = path.join(targetDir, \".git\", \"hooks\", \"pre-commit\");\n\n try {\n const content = await fs.readFile(hookPath, \"utf-8\");\n return content.includes(HOOK_IDENTIFIER);\n } catch {\n return false;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { type SimpleGit, simpleGit } from \"simple-git\";\nimport type { Source } from \"../schemas/lockfile.js\";\n\nexport interface ResolvedSource {\n source: Source;\n basePath: string;\n agentsMdPath: string;\n skillsPath: 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 // Not a git repo or git not available\n }\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 };\n}\n\nexport async function resolveGithubSource(\n options: GithubSourceOptions,\n tempDir: string,\n): Promise<ResolvedSource> {\n const { repository, ref = DEFAULT_REF } = options;\n const repoUrl = `https://github.com/${repository}.git`;\n\n const git: SimpleGit = simpleGit();\n await git.clone(repoUrl, tempDir, [\"--depth\", \"1\", \"--branch\", ref]);\n\n const clonedGit: SimpleGit = simpleGit(tempDir);\n const log = await clonedGit.log({ maxCount: 1 });\n const commitSha = log.latest?.hash ?? \"\";\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 };\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 // Git check failed, fall back to structure check only\n }\n\n // Structure matches, accept it even without git verification\n return true;\n } catch {\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","/**\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 // gh CLI not available 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 * Lists all releases from a GitHub repository.\n */\nexport async function listReleases(repo: string, limit = 10): Promise<ReleaseInfo[]> {\n const url = `${GITHUB_API_BASE}/repos/${repo}/releases?per_page=${limit}`;\n\n const response = await fetch(url, {\n headers: getGitHubHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch releases: ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return (data as Record<string, unknown>[]).map(parseReleaseResponse);\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 * Checks if a ref is a branch name (e.g., \"master\", \"main\", \"develop\").\n */\nexport function isBranchRef(ref: string): boolean {\n return !isVersionRef(ref);\n}\n\n/**\n * Resolves a ref to release info.\n * - \"latest\" -> fetches latest release\n * - \"v1.2.0\" or \"1.2.0\" -> fetches specific release\n * - \"master\" or other branch -> returns null (not a release)\n */\nexport async function resolveRef(repo: string, ref: string): Promise<ReleaseInfo | null> {\n if (ref === \"latest\") {\n return getLatestRelease(repo);\n }\n\n if (isVersionRef(ref)) {\n return getReleaseByTag(repo, ref);\n }\n\n // Branch ref - not a release\n return null;\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/**\n * Gets the download URL for a CLI tarball from a release.\n */\nexport function getCliTarballUrl(repo: string, version: string): string {\n const tag = formatTag(version);\n return `https://github.com/${repo}/releases/download/${tag}/agent-conf-cli-${tag}.tar.gz`;\n}\n\n/**\n * Gets the download URL for the latest CLI tarball.\n */\nexport function getLatestCliTarballUrl(repo: string): string {\n return `https://github.com/${repo}/releases/latest/download/agent-conf-cli.tar.gz`;\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 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, secretName } = 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#\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} 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 secrets:\n token: \\${{ secrets.${secretName} }}\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 // 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 // File doesn't exist\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 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 return false;\n }\n}\n\nexport interface GitInfo {\n isGitRepo: boolean;\n branch?: string;\n commitSha?: string;\n isDirty?: boolean;\n}\n\nexport async function getGitInfo(dir: string): Promise<GitInfo> {\n const git: SimpleGit = simpleGit(dir);\n\n try {\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return { isGitRepo: false };\n }\n\n const [branch, log, status] = await Promise.all([\n git\n .branch()\n .then((b) => b.current)\n .catch(() => undefined),\n git\n .log({ maxCount: 1 })\n .then((l) => l.latest?.hash)\n .catch(() => undefined),\n git\n .status()\n .then((s) => !s.isClean())\n .catch(() => undefined),\n ]);\n\n const result: GitInfo = { isGitRepo: true };\n if (branch !== undefined) result.branch = branch;\n if (log !== undefined) result.commitSha = log;\n if (status !== undefined) result.isDirty = status;\n return result;\n } catch {\n return { isGitRepo: 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 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 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\n return path.resolve(dir) === path.resolve(gitRoot);\n }\n}\n\n/**\n * Get git config value.\n * Returns undefined if directory doesn't exist, not in a git repo, or config not set.\n */\nexport async function getGitConfig(dir: string, key: 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 const value = await git.getConfig(key);\n return value.value ?? undefined;\n } catch {\n return undefined;\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 return undefined;\n }\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 { stringify as stringifyYaml } from \"yaml\";\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 InitCanonicalRepoOptions {\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 /** 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}\n\n/**\n * Generates the agent-conf.yaml configuration file content.\n */\nfunction generateConfigYaml(options: ResolvedOptions): string {\n const config: Record<string, unknown> = {\n version: \"1\",\n meta: {\n name: options.name,\n },\n content: {\n instructions: \"instructions/AGENTS.md\",\n skills_dir: \"skills\",\n },\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 return stringifyYaml(config, { lineWidth: 0 });\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\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 reviewers:\n description: 'PR reviewers (comma-separated)'\n required: false\n type: string\n secrets:\n token:\n description: 'GitHub token with repo access'\n required: true\n\njobs:\n sync:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout downstream repo\n uses: actions/checkout@v4\n with:\n token: \\${{ secrets.token }}\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 agent-conf\n\n - name: Run sync\n run: |\n agent-conf sync --yes\n env:\n GITHUB_TOKEN: \\${{ secrets.token }}\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 secrets:\n token:\n description: 'GitHub token with repo access'\n required: true\n\njobs:\n check:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n with:\n token: \\${{ secrets.token }}\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 agent-conf\n\n - name: Check file integrity\n run: |\n agent-conf check\n`;\n}\n\nexport async function initCanonicalRepoCommand(options: InitCanonicalRepoOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agent-conf init-canonical-repo\"));\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 };\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 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 };\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 // 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 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 console.log(` 3. Commit and push to create your canonical repository`);\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 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 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 });\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 = \"agent-conf\";\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","fs","path","pc","prompts","pc","pc","text","pc","prompts","pc","fs","path","fs","path","repoContent","path","prompts","pc","fs","path","fs","path","log","stat","fs","path","DEFAULT_CLI_NAME","fs","os","path","stat","fs","path","simpleGit","stat","simpleGit","simpleGit","pc","pc","fs","path","prompts","pc","generateSyncWorkflow","generateCheckWorkflow","pc","path","pc","pc","prompts","pc","pc","execSync","prompts","pc","pc","execSync","pc"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/check.ts","../src/core/lockfile.ts","../src/schemas/lockfile.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/utils/logger.ts","../src/commands/init.ts","../src/core/sync.ts","../src/core/merge.ts","../src/core/targets.ts","../src/commands/shared.ts","../src/core/hooks.ts","../src/core/source.ts","../src/core/version.ts","../src/core/workflows.ts","../src/utils/fs.ts","../src/utils/git.ts","../src/commands/init-canonical-repo.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 { 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 { initCanonicalRepoCommand } from \"./commands/init-canonical-repo.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 lockfile's source commit.\n * Shows a warning if they don't match.\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: built from ${mismatch.cliCommit}, but repo was synced from ${mismatch.lockfileCommit}`,\n ),\n );\n console.log(\n pc.yellow(\n \" Rebuild the CLI: cd <agent-conf-repo>/cli && pnpm build && pnpm link --global\",\n ),\n );\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 .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 }) => {\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 program\n .command(\"init-canonical-repo\")\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(\"-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 yes?: boolean;\n }) => {\n await initCanonicalRepoCommand({\n name: options.name,\n org: options.org,\n dir: options.dir,\n markerPrefix: options.markerPrefix,\n includeExamples: options.examples,\n yes: options.yes,\n });\n },\n );\n\n // Default command: show help\n program.action(() => {\n program.help();\n });\n\n return program;\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 parseAgentsMd,\n parseGlobalBlockMetadata,\n stripMetadataComments,\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\";\n expectedHash: string;\n currentHash: 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 lockfile = await readLockfile(targetDir);\n\n if (!lockfile) {\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 const targets = lockfile.content.targets ?? [\"claude\"];\n const modifiedFiles: ModifiedFileInfo[] = [];\n\n // Check all managed files\n const allFiles = await checkAllManagedFiles(targetDir, targets);\n\n // Gather detailed info for modified files\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);\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?.agent_conf_content_hash ?? \"unknown\";\n const currentHash = computeContentHash(content);\n\n modifiedFiles.push({\n path: file.path,\n type: \"skill\",\n expectedHash: storedHash,\n currentHash,\n });\n }\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 const label = file.type === \"agents\" ? \" (global block)\" : \"\";\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 { type Lockfile, LockfileSchema, type Source } from \"../schemas/lockfile.js\";\n\n// Injected at build time by tsup\ndeclare const __BUILD_COMMIT__: string;\n\nconst CONFIG_DIR = \".agent-conf\";\nconst LOCKFILE_NAME = \"lockfile.json\";\nconst CLI_VERSION = \"0.1.0\";\n\n/**\n * Gets the git commit SHA the CLI was built from.\n */\nexport function getBuildCommit(): string {\n return typeof __BUILD_COMMIT__ !== \"undefined\" ? __BUILD_COMMIT__ : \"unknown\";\n}\n\nexport function getLockfilePath(targetDir: string): string {\n return path.join(targetDir, CONFIG_DIR, LOCKFILE_NAME);\n}\n\nexport async function readLockfile(targetDir: string): Promise<Lockfile | 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 return LockfileSchema.parse(parsed);\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}\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: \"1\",\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 },\n cli_version: CLI_VERSION,\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 CLI_VERSION;\n}\n\nexport interface VersionMismatch {\n cliCommit: string;\n lockfileCommit: string;\n}\n\n/**\n * Checks if the CLI's build commit matches the lockfile's source commit.\n * Returns mismatch info if they differ (CLI is outdated), null otherwise.\n */\nexport async function checkCliVersionMismatch(targetDir: string): Promise<VersionMismatch | null> {\n const lockfile = await readLockfile(targetDir);\n\n // No lockfile means first sync - no mismatch\n if (!lockfile) {\n return null;\n }\n\n // Only check for GitHub sources (local doesn't have a meaningful commit to compare)\n if (lockfile.source.type !== \"github\") {\n return null;\n }\n\n const cliCommit = getBuildCommit();\n const lockfileCommit = lockfile.source.commit_sha;\n\n // If CLI commit is unknown, we can't compare\n if (cliCommit === \"unknown\") {\n return null;\n }\n\n // Check if commits match (compare first 7 chars for short SHA compatibility)\n const cliShort = cliCommit.slice(0, 7);\n const lockfileShort = lockfileCommit.slice(0, 7);\n\n if (cliShort !== lockfileShort) {\n return {\n cliCommit: cliShort,\n lockfileCommit: lockfileShort,\n };\n }\n\n return null;\n}\n","import { z } from \"zod\";\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});\n\nexport const LockfileSchema = z.object({\n version: z.literal(\"1\"),\n pinned_version: z.string().optional(), // Pinned release version (e.g., \"1.2.0\")\n synced_at: z.string().datetime(),\n source: SourceSchema,\n content: ContentSchema,\n cli_version: z.string(),\n});\n\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Content = z.infer<typeof ContentSchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\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 \"init-canonical-repo\": {\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 \"-y\",\n \"--yes\",\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 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 --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 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\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n}\n","import * as prompts from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getSyncStatus } from \"../core/sync.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 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 // 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 * 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 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\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 totalCopied: number;\n validationErrors: SkillValidationError[];\n };\n}\n\nexport async function sync(\n targetDir: string,\n resolvedSource: ResolvedSource,\n options: SyncOptions = { override: false, targets: [\"claude\"] },\n): Promise<SyncResult> {\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 });\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 // Skip if SKILL.md doesn't exist (will be handled elsewhere)\n }\n }\n\n // Process each target\n const targetResults: TargetResult[] = [];\n let totalCopied = 0;\n\n for (const target of options.targets) {\n const config = getTargetConfig(target);\n\n // Sync skills to this target\n const skillsCopied = await syncSkillsToTarget(\n targetDir,\n resolvedSource.skillsPath,\n skillNames,\n config,\n );\n totalCopied += skillsCopied;\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: skillsCopied },\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 };\n if (options.pinnedVersion) {\n lockfileOptions.pinnedVersion = options.pinnedVersion;\n }\n const lockfile = await writeLockfile(targetDir, lockfileOptions);\n\n return {\n lockfile,\n agentsMd: {\n merged: mergeResult.merged,\n preservedRepoContent: mergeResult.preservedRepoContent,\n },\n targets: targetResults,\n skills: {\n synced: skillNames,\n totalCopied,\n validationErrors,\n },\n };\n}\n\nasync function syncSkillsToTarget(\n targetDir: string,\n sourceSkillsPath: string,\n skillNames: string[],\n config: TargetConfig,\n): Promise<number> {\n const targetSkillsPath = path.join(targetDir, config.dir, \"skills\");\n let copied = 0;\n\n for (const skillName of skillNames) {\n const sourceDir = path.join(sourceSkillsPath, skillName);\n const targetSkillDir = path.join(targetSkillsPath, skillName);\n\n const filesCopied = await copySkillDirectory(sourceDir, targetSkillDir);\n copied += filesCopied;\n }\n\n return copied;\n}\n\n/**\n * Copy a skill directory, adding managed metadata to SKILL.md files.\n */\nasync function copySkillDirectory(sourceDir: string, targetDir: string): Promise<number> {\n await fs.mkdir(targetDir, { recursive: true });\n\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n let copied = 0;\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 copied += await copySkillDirectory(sourcePath, targetPath);\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);\n await fs.writeFile(targetPath, contentWithMetadata, \"utf-8\");\n copied++;\n } else {\n // Copy other files as-is\n await fs.copyFile(sourcePath, targetPath);\n copied++;\n }\n }\n\n return copied;\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}\n\nexport async function getSyncStatus(targetDir: string): Promise<SyncStatus> {\n const lockfile = 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: lockfile !== null,\n lockfile,\n agentsMdExists,\n skillsExist,\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/**\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): Promise<{ deleted: string[]; skipped: string[] }> {\n const deleted: string[] = [];\n const skipped: string[] = [];\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 continue; // Directory doesn't exist for this target\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)) {\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);\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 // SKILL.md doesn't 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}\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\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);\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, {});\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","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 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}\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.fail(\"Failed to fetch latest release, falling back to master\");\n logger.warn(\"Could not fetch latest release. Using master branch instead.\");\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}\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 later\n const previousLockfile = await readLockfile(targetDir);\n const previousSkills = previousLockfile?.content.skills ?? [];\n const previousTargets = previousLockfile?.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 // Summary\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 } else {\n console.log(` ${pc.green(\"+\")} ${agentsMdPath} ${pc.dim(\"(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 if (targetResult.instructionsMd.created) {\n console.log(` ${pc.green(\"+\")} ${instructionsPath} ${pc.dim(\"(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 } else {\n console.log(` ${pc.dim(\"-\")} ${instructionsPath} ${pc.dim(\"(unchanged)\")}`);\n }\n }\n\n // Skills status for this target\n const skillsPath = formatPath(path.join(targetDir, config.dir, \"skills\"));\n console.log(\n ` ${pc.green(\"+\")} ${skillsPath}/ ${pc.dim(`(${result.skills.synced.length} skills, ${targetResult.skills.copied} files)`)}`,\n );\n\n // Orphan deletion status for this target\n if (orphanResult.deleted.length > 0) {\n for (const skill of orphanResult.deleted) {\n const orphanPath = formatPath(path.join(targetDir, config.dir, \"skills\", skill));\n console.log(\n ` ${pc.red(\"-\")} ${orphanPath}/ ${pc.dim(\"(removed - no longer in source)\")}`,\n );\n }\n }\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 console.log(` ${pc.yellow(\"!\")} ${orphanPath}/ ${pc.dim(\"(orphaned but skipped)\")}`);\n }\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 }\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 }\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 }\n }\n\n // Lockfile status\n const lockfilePath = formatPath(path.join(targetDir, \".agent-conf\", \"agent-conf.lock\"));\n console.log(` ${pc.green(\"+\")} ${lockfilePath}`);\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 } else if (hookResult.wasUpdated) {\n console.log(` ${pc.yellow(\"~\")} ${hookPath} ${pc.dim(\"(updated)\")}`);\n } else {\n console.log(` ${pc.green(\"+\")} ${hookPath} ${pc.dim(\"(installed)\")}`);\n }\n } else if (hookResult.alreadyExisted) {\n console.log(` ${pc.yellow(\"!\")} ${hookPath} ${pc.dim(\"(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 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 // Hook doesn't exist\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\n/**\n * Check if the pre-commit hook is installed.\n */\nexport async function isPreCommitHookInstalled(targetDir: string): Promise<boolean> {\n const hookPath = path.join(targetDir, \".git\", \"hooks\", \"pre-commit\");\n\n try {\n const content = await fs.readFile(hookPath, \"utf-8\");\n return content.includes(HOOK_IDENTIFIER);\n } catch {\n return false;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { type SimpleGit, simpleGit } from \"simple-git\";\nimport type { Source } from \"../schemas/lockfile.js\";\n\nexport interface ResolvedSource {\n source: Source;\n basePath: string;\n agentsMdPath: string;\n skillsPath: 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 // Not a git repo or git not available\n }\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 };\n}\n\nexport async function resolveGithubSource(\n options: GithubSourceOptions,\n tempDir: string,\n): Promise<ResolvedSource> {\n const { repository, ref = DEFAULT_REF } = options;\n const repoUrl = `https://github.com/${repository}.git`;\n\n const git: SimpleGit = simpleGit();\n await git.clone(repoUrl, tempDir, [\"--depth\", \"1\", \"--branch\", ref]);\n\n const clonedGit: SimpleGit = simpleGit(tempDir);\n const log = await clonedGit.log({ maxCount: 1 });\n const commitSha = log.latest?.hash ?? \"\";\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 };\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 // Git check failed, fall back to structure check only\n }\n\n // Structure matches, accept it even without git verification\n return true;\n } catch {\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","/**\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 // gh CLI not available 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 * Lists all releases from a GitHub repository.\n */\nexport async function listReleases(repo: string, limit = 10): Promise<ReleaseInfo[]> {\n const url = `${GITHUB_API_BASE}/repos/${repo}/releases?per_page=${limit}`;\n\n const response = await fetch(url, {\n headers: getGitHubHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch releases: ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return (data as Record<string, unknown>[]).map(parseReleaseResponse);\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 * Checks if a ref is a branch name (e.g., \"master\", \"main\", \"develop\").\n */\nexport function isBranchRef(ref: string): boolean {\n return !isVersionRef(ref);\n}\n\n/**\n * Resolves a ref to release info.\n * - \"latest\" -> fetches latest release\n * - \"v1.2.0\" or \"1.2.0\" -> fetches specific release\n * - \"master\" or other branch -> returns null (not a release)\n */\nexport async function resolveRef(repo: string, ref: string): Promise<ReleaseInfo | null> {\n if (ref === \"latest\") {\n return getLatestRelease(repo);\n }\n\n if (isVersionRef(ref)) {\n return getReleaseByTag(repo, ref);\n }\n\n // Branch ref - not a release\n return null;\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/**\n * Gets the download URL for a CLI tarball from a release.\n */\nexport function getCliTarballUrl(repo: string, version: string): string {\n const tag = formatTag(version);\n return `https://github.com/${repo}/releases/download/${tag}/agent-conf-cli-${tag}.tar.gz`;\n}\n\n/**\n * Gets the download URL for the latest CLI tarball.\n */\nexport function getLatestCliTarballUrl(repo: string): string {\n return `https://github.com/${repo}/releases/latest/download/agent-conf-cli.tar.gz`;\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 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, secretName } = 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#\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} 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 secrets:\n token: \\${{ secrets.${secretName} }}\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 // 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 // File doesn't exist\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 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 return false;\n }\n}\n\nexport interface GitInfo {\n isGitRepo: boolean;\n branch?: string;\n commitSha?: string;\n isDirty?: boolean;\n}\n\nexport async function getGitInfo(dir: string): Promise<GitInfo> {\n const git: SimpleGit = simpleGit(dir);\n\n try {\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n return { isGitRepo: false };\n }\n\n const [branch, log, status] = await Promise.all([\n git\n .branch()\n .then((b) => b.current)\n .catch(() => undefined),\n git\n .log({ maxCount: 1 })\n .then((l) => l.latest?.hash)\n .catch(() => undefined),\n git\n .status()\n .then((s) => !s.isClean())\n .catch(() => undefined),\n ]);\n\n const result: GitInfo = { isGitRepo: true };\n if (branch !== undefined) result.branch = branch;\n if (log !== undefined) result.commitSha = log;\n if (status !== undefined) result.isDirty = status;\n return result;\n } catch {\n return { isGitRepo: 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 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 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\n return path.resolve(dir) === path.resolve(gitRoot);\n }\n}\n\n/**\n * Get git config value.\n * Returns undefined if directory doesn't exist, not in a git repo, or config not set.\n */\nexport async function getGitConfig(dir: string, key: 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 const value = await git.getConfig(key);\n return value.value ?? undefined;\n } catch {\n return undefined;\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 return undefined;\n }\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 { stringify as stringifyYaml } from \"yaml\";\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 InitCanonicalRepoOptions {\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 /** 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}\n\n/**\n * Generates the agent-conf.yaml configuration file content.\n */\nfunction generateConfigYaml(options: ResolvedOptions): string {\n const config: Record<string, unknown> = {\n version: \"1\",\n meta: {\n name: options.name,\n },\n content: {\n instructions: \"instructions/AGENTS.md\",\n skills_dir: \"skills\",\n },\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 return stringifyYaml(config, { lineWidth: 0 });\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 agent-conf\n\n - name: Run sync\n run: agent-conf sync --yes\n env:\n GITHUB_TOKEN: \\${{ secrets.token }}\n\n - name: Check for changes\n id: check-changes\n run: |\n if [ -n \"\\$(git status --porcelain)\" ]; then\n echo \"changes_detected=true\" >> \\$GITHUB_OUTPUT\n echo \"Changes detected after sync\"\n git status --short\n else\n echo \"changes_detected=false\" >> \\$GITHUB_OUTPUT\n echo \"No changes detected after sync\"\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: Create PR branch and commit\n if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'\n run: |\n BRANCH_NAME=\"\\${{ inputs.pr_branch_prefix }}-\\$(date +%Y%m%d-%H%M%S)\"\n git checkout -b \"\\$BRANCH_NAME\"\n git add -A\n git commit -m \"\\${{ inputs.pr_title }}\"\n git push -u origin \"\\$BRANCH_NAME\"\n echo \"BRANCH_NAME=\\$BRANCH_NAME\" >> \\$GITHUB_ENV\n\n - name: Create 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 PR_BODY=\"This PR was automatically created by the ${prefix} sync workflow.\n\n ## Changes\n - Synced agent configuration from canonical repository\n\n ---\n *This is an automated PR. Review the changes and merge when ready.*\"\n\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\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#\n# TOKEN: Requires a token with read access to the canonical repository.\n\nname: Check Reusable\n\non:\n workflow_call:\n secrets:\n token:\n description: 'GitHub token with read access to the canonical repository'\n required: true\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 agent-conf\n\n - name: Check file integrity\n run: agent-conf check\n env:\n GITHUB_TOKEN: \\${{ secrets.token }}\n`;\n}\n\nexport async function initCanonicalRepoCommand(options: InitCanonicalRepoOptions): Promise<void> {\n const logger = createLogger();\n\n console.log();\n prompts.intro(pc.bold(\"agent-conf init-canonical-repo\"));\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 };\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 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 };\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 // 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 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 console.log(` 3. Commit and push to create your canonical repository`);\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 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 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 });\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 = \"agent-conf\";\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","fs","path","pc","prompts","pc","pc","text","pc","prompts","pc","fs","path","fs","path","repoContent","path","prompts","pc","fs","path","fs","path","log","stat","fs","path","DEFAULT_CLI_NAME","fs","os","path","stat","fs","path","simpleGit","stat","simpleGit","simpleGit","pc","pc","fs","path","prompts","pc","generateSyncWorkflow","generateCheckWorkflow","pc","path","pc","pc","prompts","pc","pc","execSync","prompts","pc","pc","execSync","pc"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-conf",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "CLI utility to sync AI agent configurations across repositories",
5
5
  "author": "Julian Pani",
6
6
  "type": "module",