agent-conf 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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 ? "8edc768a3a69b7b027b2494ad2da77099dc2a8b0" : "unknown";
70
70
  }
71
71
  function getLockfilePath(targetDir) {
72
72
  return path.join(targetDir, CONFIG_DIR, LOCKFILE_NAME);
@@ -981,9 +981,12 @@ async function installPreCommitHook(targetDir, config) {
981
981
  }
982
982
 
983
983
  // src/core/source.ts
984
+ import { exec } from "child_process";
984
985
  import * as fs7 from "fs/promises";
985
986
  import * as path7 from "path";
987
+ import { promisify } from "util";
986
988
  import { simpleGit } from "simple-git";
989
+ var execAsync = promisify(exec);
987
990
  var DEFAULT_REF = "master";
988
991
  async function resolveLocalSource(options = {}) {
989
992
  let basePath;
@@ -1014,9 +1017,7 @@ async function resolveLocalSource(options = {}) {
1014
1017
  }
1015
1018
  async function resolveGithubSource(options, tempDir) {
1016
1019
  const { repository, ref = DEFAULT_REF } = options;
1017
- const repoUrl = `https://github.com/${repository}.git`;
1018
- const git = simpleGit();
1019
- await git.clone(repoUrl, tempDir, ["--depth", "1", "--branch", ref]);
1020
+ await cloneRepository(repository, ref, tempDir);
1020
1021
  const clonedGit = simpleGit(tempDir);
1021
1022
  const log2 = await clonedGit.log({ maxCount: 1 });
1022
1023
  const commitSha = log2.latest?.hash ?? "";
@@ -1033,6 +1034,27 @@ async function resolveGithubSource(options, tempDir) {
1033
1034
  skillsPath: path7.join(tempDir, "skills")
1034
1035
  };
1035
1036
  }
1037
+ async function cloneRepository(repository, ref, tempDir) {
1038
+ if (await isGhAvailable()) {
1039
+ try {
1040
+ await execAsync(`gh repo clone ${repository} ${tempDir} -- --depth 1 --branch ${ref}`);
1041
+ return;
1042
+ } catch {
1043
+ }
1044
+ }
1045
+ const token = process.env.GITHUB_TOKEN;
1046
+ const repoUrl = token ? `https://x-access-token:${token}@github.com/${repository}.git` : `https://github.com/${repository}.git`;
1047
+ const git = simpleGit();
1048
+ await git.clone(repoUrl, tempDir, ["--depth", "1", "--branch", ref]);
1049
+ }
1050
+ async function isGhAvailable() {
1051
+ try {
1052
+ await execAsync("gh --version");
1053
+ return true;
1054
+ } catch {
1055
+ return false;
1056
+ }
1057
+ }
1036
1058
  async function findCanonicalRepo(startDir) {
1037
1059
  let currentDir = path7.resolve(startDir);
1038
1060
  const root = path7.parse(currentDir).root;
@@ -1998,6 +2020,9 @@ function generateSyncWorkflow2(repoFullName, prefix) {
1998
2020
  #
1999
2021
  # Downstream repos will reference this workflow like:
2000
2022
  # uses: ${repoFullName}/.github/workflows/sync-reusable.yml@v1.0.0
2023
+ #
2024
+ # TOKEN: Requires a token with read access to the canonical repository.
2025
+ # The default GITHUB_TOKEN is used for operations on the downstream repo.
2001
2026
 
2002
2027
  name: Sync Reusable
2003
2028
 
@@ -2009,23 +2034,60 @@ on:
2009
2034
  required: false
2010
2035
  default: false
2011
2036
  type: boolean
2037
+ commit_strategy:
2038
+ description: 'How to commit changes: "pr" (create pull request) or "direct" (commit to current branch)'
2039
+ required: false
2040
+ default: 'pr'
2041
+ type: string
2042
+ pr_branch_prefix:
2043
+ description: 'Branch prefix for PR branches'
2044
+ required: false
2045
+ default: '${prefix}/sync'
2046
+ type: string
2047
+ pr_title:
2048
+ description: 'Pull request title'
2049
+ required: false
2050
+ default: 'chore(${prefix}): sync agent configuration'
2051
+ type: string
2012
2052
  reviewers:
2013
- description: 'PR reviewers (comma-separated)'
2053
+ description: 'PR reviewers (comma-separated GitHub usernames)'
2014
2054
  required: false
2015
2055
  type: string
2056
+ commit_message:
2057
+ description: 'Commit message for direct commits'
2058
+ required: false
2059
+ default: 'chore(${prefix}): sync agent configuration'
2060
+ type: string
2016
2061
  secrets:
2017
2062
  token:
2018
- description: 'GitHub token with repo access'
2063
+ description: 'GitHub token with read access to the canonical repository'
2019
2064
  required: true
2065
+ outputs:
2066
+ changes_detected:
2067
+ description: 'Whether changes were detected after sync'
2068
+ value: \${{ jobs.sync.outputs.changes_detected }}
2069
+ pr_number:
2070
+ description: 'Pull request number (if PR strategy and changes detected)'
2071
+ value: \${{ jobs.sync.outputs.pr_number }}
2072
+ pr_url:
2073
+ description: 'Pull request URL (if PR strategy and changes detected)'
2074
+ value: \${{ jobs.sync.outputs.pr_url }}
2020
2075
 
2021
2076
  jobs:
2022
2077
  sync:
2023
2078
  runs-on: ubuntu-latest
2079
+ permissions:
2080
+ contents: write
2081
+ pull-requests: write
2082
+ outputs:
2083
+ changes_detected: \${{ steps.check-changes.outputs.changes_detected }}
2084
+ pr_number: \${{ steps.create-pr.outputs.pr_number }}
2085
+ pr_url: \${{ steps.create-pr.outputs.pr_url }}
2024
2086
  steps:
2025
- - name: Checkout downstream repo
2087
+ - name: Checkout
2026
2088
  uses: actions/checkout@v4
2027
2089
  with:
2028
- token: \${{ secrets.token }}
2090
+ fetch-depth: 0
2029
2091
 
2030
2092
  - name: Setup Node.js
2031
2093
  uses: actions/setup-node@v4
@@ -2036,10 +2098,74 @@ jobs:
2036
2098
  run: npm install -g agent-conf
2037
2099
 
2038
2100
  - name: Run sync
2039
- run: |
2040
- agent-conf sync --yes
2101
+ run: agent-conf sync --yes
2041
2102
  env:
2042
2103
  GITHUB_TOKEN: \${{ secrets.token }}
2104
+
2105
+ - name: Check for changes
2106
+ id: check-changes
2107
+ run: |
2108
+ if [ -n "$(git status --porcelain)" ]; then
2109
+ echo "changes_detected=true" >> $GITHUB_OUTPUT
2110
+ echo "Changes detected after sync"
2111
+ git status --short
2112
+ else
2113
+ echo "changes_detected=false" >> $GITHUB_OUTPUT
2114
+ echo "No changes detected after sync"
2115
+ fi
2116
+
2117
+ - name: Configure git
2118
+ if: steps.check-changes.outputs.changes_detected == 'true'
2119
+ run: |
2120
+ git config user.name "github-actions[bot]"
2121
+ git config user.email "github-actions[bot]@users.noreply.github.com"
2122
+
2123
+ - name: Create PR branch and commit
2124
+ if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'
2125
+ run: |
2126
+ BRANCH_NAME="\${{ inputs.pr_branch_prefix }}-$(date +%Y%m%d-%H%M%S)"
2127
+ git checkout -b "$BRANCH_NAME"
2128
+ git add -A
2129
+ git commit -m "\${{ inputs.pr_title }}"
2130
+ git push -u origin "$BRANCH_NAME"
2131
+ echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
2132
+
2133
+ - name: Create pull request
2134
+ id: create-pr
2135
+ if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'pr'
2136
+ env:
2137
+ GH_TOKEN: \${{ github.token }}
2138
+ run: |
2139
+ PR_BODY="This PR was automatically created by the ${prefix} sync workflow.
2140
+
2141
+ ## Changes
2142
+ - Synced agent configuration from canonical repository
2143
+
2144
+ ---
2145
+ *This is an automated PR. Review the changes and merge when ready.*"
2146
+
2147
+ REVIEWERS_ARG=""
2148
+ if [ -n "\${{ inputs.reviewers }}" ]; then
2149
+ REVIEWERS_ARG="--reviewer \${{ inputs.reviewers }}"
2150
+ fi
2151
+
2152
+ PR_URL=$(gh pr create \\
2153
+ --title "\${{ inputs.pr_title }}" \\
2154
+ --body "$PR_BODY" \\
2155
+ $REVIEWERS_ARG)
2156
+
2157
+ PR_NUMBER=$(gh pr view --json number -q .number)
2158
+ echo "pr_url=$PR_URL" >> $GITHUB_OUTPUT
2159
+ echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
2160
+ echo "Created PR #$PR_NUMBER: $PR_URL"
2161
+
2162
+ - name: Commit directly to branch
2163
+ if: steps.check-changes.outputs.changes_detected == 'true' && inputs.commit_strategy == 'direct'
2164
+ run: |
2165
+ git add -A
2166
+ git commit -m "\${{ inputs.commit_message }}"
2167
+ git push
2168
+ echo "Changes committed directly to $(git branch --show-current)"
2043
2169
  `;
2044
2170
  }
2045
2171
  function generateCheckWorkflow2(repoFullName, prefix) {
@@ -2048,6 +2174,8 @@ function generateCheckWorkflow2(repoFullName, prefix) {
2048
2174
  #
2049
2175
  # Downstream repos will reference this workflow like:
2050
2176
  # uses: ${repoFullName}/.github/workflows/check-reusable.yml@v1.0.0
2177
+ #
2178
+ # TOKEN: Requires a token with read access to the canonical repository.
2051
2179
 
2052
2180
  name: Check Reusable
2053
2181
 
@@ -2055,7 +2183,7 @@ on:
2055
2183
  workflow_call:
2056
2184
  secrets:
2057
2185
  token:
2058
- description: 'GitHub token with repo access'
2186
+ description: 'GitHub token with read access to the canonical repository'
2059
2187
  required: true
2060
2188
 
2061
2189
  jobs:
@@ -2064,8 +2192,6 @@ jobs:
2064
2192
  steps:
2065
2193
  - name: Checkout
2066
2194
  uses: actions/checkout@v4
2067
- with:
2068
- token: \${{ secrets.token }}
2069
2195
 
2070
2196
  - name: Setup Node.js
2071
2197
  uses: actions/setup-node@v4
@@ -2076,8 +2202,9 @@ jobs:
2076
2202
  run: npm install -g agent-conf
2077
2203
 
2078
2204
  - name: Check file integrity
2079
- run: |
2080
- agent-conf check
2205
+ run: agent-conf check
2206
+ env:
2207
+ GITHUB_TOKEN: \${{ secrets.token }}
2081
2208
  `;
2082
2209
  }
2083
2210
  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 { exec } from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { type SimpleGit, simpleGit } from \"simple-git\";\nimport type { Source } from \"../schemas/lockfile.js\";\n\nconst execAsync = promisify(exec);\n\nexport interface ResolvedSource {\n source: Source;\n basePath: string;\n agentsMdPath: string;\n skillsPath: string;\n}\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\n await cloneRepository(repository, ref, tempDir);\n\n const clonedGit: SimpleGit = simpleGit(tempDir);\n const log = await clonedGit.log({ maxCount: 1 });\n const commitSha = log.latest?.hash ?? \"\";\n\n 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\n/**\n * Clone a repository using the best available method.\n * Tries in order: gh CLI, HTTPS with token, plain HTTPS.\n */\nasync function cloneRepository(repository: string, ref: string, tempDir: string): Promise<void> {\n // Try gh CLI first (handles auth automatically in CI)\n if (await isGhAvailable()) {\n try {\n await execAsync(`gh repo clone ${repository} ${tempDir} -- --depth 1 --branch ${ref}`);\n return;\n } catch {\n // gh failed, try other methods\n }\n }\n\n // Fall back to git with GITHUB_TOKEN authentication\n const token = process.env.GITHUB_TOKEN;\n const repoUrl = token\n ? `https://x-access-token:${token}@github.com/${repository}.git`\n : `https://github.com/${repository}.git`;\n\n const git: SimpleGit = simpleGit();\n await git.clone(repoUrl, tempDir, [\"--depth\", \"1\", \"--branch\", ref]);\n}\n\n/**\n * Check if gh CLI is available.\n */\nasync function isGhAvailable(): Promise<boolean> {\n try {\n await execAsync(\"gh --version\");\n return true;\n } catch {\n return false;\n }\n}\n\nasync function findCanonicalRepo(startDir: string): Promise<string> {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n // First, check if we're already inside the agent-conf repo\n let checkDir = currentDir;\n while (checkDir !== root) {\n if (await isCanonicalRepo(checkDir)) {\n return checkDir;\n }\n checkDir = path.dirname(checkDir);\n }\n\n // Otherwise, look for a sibling \"agent-conf\" directory\n currentDir = path.resolve(startDir);\n while (currentDir !== root) {\n const parentDir = path.dirname(currentDir);\n const siblingCanonicalRepo = path.join(parentDir, \"agent-conf\");\n\n if (await isCanonicalRepo(siblingCanonicalRepo)) {\n return siblingCanonicalRepo;\n }\n\n currentDir = parentDir;\n }\n\n throw new Error(\n \"Could not find canonical repository. Please specify --local <path> or run from within the canonical repo.\",\n );\n}\n\nasync function isCanonicalRepo(dir: string): Promise<boolean> {\n try {\n // Check directory exists\n const stat = await fs.stat(dir).catch(() => null);\n if (!stat?.isDirectory()) {\n return false;\n }\n\n // Check for agent-conf structure\n const instructionsPath = path.join(dir, \"instructions\", \"AGENTS.md\");\n const skillsPath = path.join(dir, \"skills\");\n\n const [instructionsExists, skillsExists] = await Promise.all([\n fs\n .access(instructionsPath)\n .then(() => true)\n .catch(() => false),\n fs\n .access(skillsPath)\n .then(() => true)\n .catch(() => false),\n ]);\n\n if (!instructionsExists || !skillsExists) {\n return false;\n }\n\n // Optionally verify git remote contains \"agent-conf\"\n try {\n const git: SimpleGit = simpleGit(dir);\n const remotes = await git.getRemotes(true);\n const hasMatchingRemote = remotes.some(\n (r) => r.refs.fetch?.includes(\"agent-conf\") || r.refs.push?.includes(\"agent-conf\"),\n );\n if (hasMatchingRemote) {\n return true;\n }\n } catch {\n // 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.3",
4
4
  "description": "CLI utility to sync AI agent configurations across repositories",
5
5
  "author": "Julian Pani",
6
6
  "type": "module",