skillcraft 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +222 -96
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json","../src/core/git.ts","../src/core/paths.ts","../src/core/fs.ts","../src/core/hooks.ts","../src/core/types.ts","../src/core/config.ts","../src/commands/disable.ts","../src/core/proof.ts","../src/core/validation.ts","../src/core/state.ts","../src/providers/github.ts","../src/providers/index.ts","../src/commands/status.ts","../src/commands/enable.ts","../src/commands/repos.ts","../src/core/progress.ts","../src/core/credentials.ts","../src/lib/output.ts","../src/commands/progress.ts","../src/commands/skills.ts","../src/core/remote.ts","../src/commands/verify.ts","../src/commands/claim.ts","../src/commands/loadout.ts","../src/commands/internalHook.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander'\nimport packageJson from '../package.json'\nimport { runDisable } from './commands/disable.js'\nimport { runDoctor, runStatus } from './commands/status.js'\nimport { runEnable } from './commands/enable.js'\nimport { runReposList, runReposPrune } from './commands/repos.js'\nimport { runProgress, runProgressTrack, runProgressUntrack } from './commands/progress.js'\nimport {\n runSkillsAdd,\n runSkillsInspect,\n runSkillsList,\n runSkillsPublish,\n runSkillsSearch,\n runSkillsValidateAndExit,\n} from './commands/skills.js'\nimport { runVerify } from './commands/verify.js'\nimport { runClaim, runClaimList, runClaimStatus } from './commands/claim.js'\nimport { runLoadoutUse, runLoadoutClear, runLoadoutShare } from './commands/loadout.js'\nimport { runHook } from './commands/internalHook.js'\nimport { runHookPush } from './commands/internalHook.js'\n\nconst program = new Command()\n\nprogram.name('skillcraft').description('Skillcraft CLI').version(packageJson.version)\nprogram.option('--json', 'machine-readable JSON output')\n\nprogram\n .command('enable')\n .description('Enable Skillcraft in the current repository')\n .action(withCommand(runEnable))\n\nprogram\n .command('disable')\n .description('Disable Skillcraft in the current repository')\n .action(withCommand(runDisable))\n\nprogram\n .command('status')\n .description('Show repository Skillcraft status')\n .action(withCommand(runStatus))\n\nprogram\n .command('doctor')\n .description('Check environment and integration readiness')\n .action(withCommand(runDoctor))\n\nconst reposCommand = program.command('repos').description('Manage tracked repositories')\nreposCommand.command('list').description('List tracked repositories').action(withCommand(runReposList))\nreposCommand.command('prune').description('Remove unavailable repository entries').action(withCommand(runReposPrune))\n\nconst progressCommand = program.command('progress').description('Show progress for tracked credentials')\nprogressCommand\n.option('--refresh', 'refresh the local credential index cache before evaluating progress')\n.action((options, command) => {\n const outputMode = command.parent?.opts()?.json ? 'json' : 'text'\n withCommand(() => runProgress({ outputMode, refreshIndex: options.refresh }))()\n})\n\nprogressCommand\n .command('track <credential-id>')\n .description('Track a credential for local progress evaluation')\n .action((credentialId: string) => withCommand(() => runProgressTrack(credentialId))())\n\nprogressCommand\n .command('untrack <credential-id>')\n .description('Untrack a credential from local progress evaluation')\n .action((credentialId: string) => withCommand(() => runProgressUntrack(credentialId))())\n\nconst skillsCommand = program.command('skills').description('Manage local skill publishing')\nskillsCommand\n .command('add <id>')\n .description('Add a local or external skill from the registry index')\n .action((id) => withCommand(() => runSkillsAdd(id))())\n\nskillsCommand\n .command('publish <owner-slug>')\n .description('Publish a skill to the registry')\n .action((ownerSlug) => withCommand(() => runSkillsPublish(ownerSlug))())\n\nskillsCommand\n .command('validate')\n .description('Validate local skill layout')\n .action(withCommand(runSkillsValidateAndExit))\n\nskillsCommand\n .command('list')\n .description('List detected skills in the current repository')\n .action(withCommand(runSkillsList))\n\nskillsCommand\n .command('inspect <id>')\n .description('Show detailed information for a registry skill')\n .action((id, _options, command) => {\n const outputMode = command.parent?.parent?.opts()?.json ? 'json' : 'text'\n withCommand(() => runSkillsInspect(id, { outputMode }))()\n })\n\nskillsCommand\n .command('search [query]')\n .description('Search the published skill index')\n .option('--source <source>', 'filter to a registry source')\n .option('--limit <n>', 'limit number of results', (value) => Number.parseInt(value, 10))\n .action((query, options, command) => {\n const outputMode = command.parent?.parent?.opts()?.json ? 'json' : 'text'\n withCommand(() => runSkillsSearch(query, { source: options.source, limit: options.limit, outputMode }))()\n })\n\nprogram\n .command('verify')\n .description('Verify local Skillcraft proofs and trailers')\n .action(withCommand(runVerify))\n\nconst claimCommand = program.command('claim').description('Claim a credential or inspect your claims')\nclaimCommand\n .argument('[credential]', 'credential identifier')\n .option('--all-repos', 'include tracked repositories')\n .option('--repo <path...>', 'explicit repositories to include')\n .action((credential: string | undefined, options) => {\n if (!credential) {\n withCommand(() => runClaimList())()\n return\n }\n withCommand(() =>\n runClaim(credential, {\n allRepos: options.allRepos,\n repo: options.repo,\n }),\n )()\n })\n\nclaimCommand\n .command('list')\n .description('List your claims in the credentials repository')\n .action(withCommand(runClaimList))\n\nclaimCommand\n .command('status <credential>')\n .description('Show claim status by credential identifier')\n .action((credential) => withCommand(() => runClaimStatus(credential))())\n\nconst loadoutCommand = program.command('loadout').description('Manage active loadouts')\nloadoutCommand\n .command('use <id>')\n .description('Activate a loadout in local context')\n .action((id) => withCommand(() => runLoadoutUse(id))())\n\nloadoutCommand\n .command('clear')\n .description('Clear active loadouts')\n .action(withCommand(runLoadoutClear))\n\nloadoutCommand\n .command('share <id>')\n .description('Publish local loadout to registry')\n .action((id) => withCommand(() => runLoadoutShare(id))())\n\nprogram\n .command('_hook <name> [repoPath] [remote]', { hidden: true })\n .description('internal hook command')\n .action((name, repoPath, remote) => withCommand(async () => {\n if (name === 'post-commit') {\n await runHook(repoPath || process.cwd())\n }\n if (name === 'pre-push' || name === 'post-push') {\n await runHookPush(repoPath || process.cwd(), remote || 'origin')\n }\n })())\n\nfunction withCommand<T extends (...args: readonly unknown[]) => Promise<void> | void>(fn: T): (...args: Parameters<T>) => void {\n return (...args: Parameters<T>) => {\n void Promise.resolve(fn(...args)).catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exitCode = 1\n })\n }\n}\n\nprogram.parse(process.argv)\n","{\n \"name\": \"skillcraft\",\n \"version\": \"0.1.7\",\n \"description\": \"Turn your work into verifiable AI credentials. Capture what you build, share your progress, and earn verifiable credentials that prove measurable real-world AI engineering work.\",\n \"keywords\": [\n \"skillcraft\",\n \"cli\",\n \"ai\",\n \"evidence\",\n \"credentials\",\n \"skills\",\n \"loadout\",\n \"git\",\n \"verification\",\n \"developer-tools\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/skillcraft-gg/skillcraft.git\"\n },\n \"homepage\": \"https://skillcraft.gg\",\n \"bugs\": {\n \"url\": \"https://github.com/skillcraft-gg/skillcraft/issues\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"skillcraft\": \"dist/index.js\"\n },\n \"files\": [\n \"dist/index.js\",\n \"dist/index.js.map\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"clean\": \"rm -rf dist\",\n \"test\": \"npm run build && node --test tests/*.test.mjs\",\n \"smoke\": \"npm test\",\n \"format\": \"printf ''\",\n \"start\": \"node dist/index.js\",\n \"check\": \"tsc --noEmit\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"commander\": \"^13.1.0\",\n \"ora\": \"^8.2.0\",\n \"yaml\": \"^2.6.0\",\n \"zod\": \"^3.24.2\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.8.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.7.2\"\n }\n}\n","import { execFile as execFileCb } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport path from 'node:path'\n\nconst execFile = promisify(execFileCb)\n\ntype GitOptions = {\n env?: NodeJS.ProcessEnv\n}\n\nexport async function git(args: readonly string[], cwd: string, options: GitOptions = {}): Promise<string> {\n try {\n const { stdout } = await execFile('git', args, {\n cwd,\n encoding: 'utf8',\n maxBuffer: 10 * 1024 * 1024,\n env: options.env,\n })\n return stdout.trim()\n } catch (error) {\n const message = (error as { message?: string }).message ?? String(error)\n throw new Error(`git command failed in ${cwd}: ${message}`)\n }\n}\n\nexport async function isGitRepo(cwd: string): Promise<boolean> {\n try {\n await git(['rev-parse', '--git-dir'], cwd)\n return true\n } catch {\n return false\n }\n}\n\nexport async function gitRoot(cwd: string): Promise<string> {\n return path.resolve(await git(['rev-parse', '--show-toplevel'], cwd))\n}\n\nexport async function gitRemote(cwd: string, remote = 'origin'): Promise<string | undefined> {\n try {\n const value = await git(['config', '--get', `remote.${remote}.url`], cwd)\n return value || undefined\n } catch {\n return undefined\n }\n}\n\nexport async function gitCommitMessage(cwd: string, commit = 'HEAD'): Promise<string> {\n return git(['log', '--format=%B', '-n', '1', commit], cwd)\n}\n\nexport async function gitHeadCommit(cwd: string): Promise<string> {\n return (await git(['rev-parse', 'HEAD'], cwd)).trim()\n}\n\nexport async function gitHasRef(cwd: string, ref: string): Promise<boolean> {\n try {\n await git(['show-ref', '--verify', '--quiet', ref], cwd)\n return true\n } catch {\n return false\n }\n}\n\nexport async function gitLsTreeNames(cwd: string, ref: string, subPath?: string): Promise<string[]> {\n try {\n const raw = await git(['ls-tree', '-r', '--name-only', ref, '--', ...(subPath ? [subPath] : [])], cwd)\n return raw ? raw.split('\\n').filter(Boolean) : []\n } catch {\n return []\n }\n}\n\nexport async function gitShowText(cwd: string, ref: string, filePath: string): Promise<string | undefined> {\n try {\n return await git(['show', `${ref}:${filePath}`], cwd)\n } catch {\n return undefined\n }\n}\n\nexport async function gitLogWithMessages(cwd: string, maxCount?: number): Promise<Array<{ commit: string; message: string }>> {\n const n = maxCount ? String(maxCount) : '200'\n const raw = await git(['log', `--max-count=${n}`, '--pretty=%H%x00%B'], cwd)\n if (!raw) {\n return []\n }\n return raw\n .split('\\u0000')\n .filter(Boolean)\n .map((entry) => {\n const [commit, ...messageParts] = entry.split('\\n')\n const message = messageParts.join('\\n').trimEnd()\n return { commit, message }\n })\n}\n\nexport async function amendCommitMessage(cwd: string, message: string): Promise<string> {\n const env = { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' }\n const tempFile = path.join(cwd, '.git', 'SKILLCRAFT_COMMIT_MESSAGE')\n const { writeFile } = await import('node:fs/promises')\n await writeFile(tempFile, `${message}\\n`, 'utf8')\n await execFile('git', ['commit', '--amend', '--file', tempFile, '--no-gpg-sign'], {\n cwd,\n encoding: 'utf8',\n env,\n })\n return gitHeadCommit(cwd)\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport os from 'node:os'\n\nfunction defaultUserDir(): string {\n return path.resolve(process.env.HOME || os.homedir(), '.skillcraft')\n}\n\nexport function skillcraftGlobalDir(): string {\n return defaultUserDir()\n}\n\nexport function skillcraftConfigPath(): string {\n return path.join(skillcraftGlobalDir(), 'config.json')\n}\n\nexport function skillcraftReposPath(): string {\n return path.join(skillcraftGlobalDir(), 'repos.json')\n}\n\nexport function trackedCredentialsPath(): string {\n return path.join(skillcraftGlobalDir(), 'credentials.json')\n}\n\nexport function credentialIndexCachePath(): string {\n return path.join(skillcraftGlobalDir(), 'cache', 'credentials', 'index.json')\n}\n\nexport function localStateDir(repoPath: string): string {\n return path.join(repoPath, '.skillcraft')\n}\n\nexport function localGitDir(repoPath: string): string {\n return path.join(repoPath, '.git', 'skillcraft')\n}\n\nexport function localSkillcraftConfig(repoPath: string): string {\n return path.join(localStateDir(repoPath), '.skillcraft.json')\n}\n\nexport function localRepoHookPath(repoPath: string): string {\n return path.join(repoPath, '.git', 'hooks', 'post-commit')\n}\n\nexport function localRepoPrePushHookPath(repoPath: string): string {\n return path.join(repoPath, '.git', 'hooks', 'pre-push')\n}\n\nexport function localRepoPostPushHookPath(repoPath: string): string {\n return path.join(repoPath, '.git', 'hooks', 'post-push')\n}\n\nexport function pendingPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'pending.json')\n}\n\nexport function contextPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'context.json')\n}\n\nexport function pluginPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'agent.json')\n}\n\nexport function managedPluginPath(repoPath: string): string {\n return path.join(repoPath, '.opencode', 'plugins', 'skillcraft.mjs')\n}\n\nexport function aiModelContextPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'ai-model-context.json')\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","import fs from 'node:fs/promises'\nimport 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 readText(filePath: string): Promise<string> {\n const data = await fs.readFile(filePath, 'utf8')\n return data\n}\n\nexport async function writeText(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf8')\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 readJson<T>(filePath: string): Promise<T | null> {\n if (!(await fileExists(filePath))) {\n return null\n }\n const raw = await readText(filePath)\n return JSON.parse(raw) as T\n}\n\nexport async function writeJson(filePath: string, value: unknown): Promise<void> {\n const json = JSON.stringify(value, null, 2)\n await writeText(filePath, `${json}\\n`)\n}\n\nexport async function removeFile(filePath: string): Promise<void> {\n try {\n await fs.rm(filePath, { force: true })\n } catch {\n // best effort cleanup\n }\n}\n","import { writeText } from './fs.js'\nimport { localRepoHookPath, localRepoPrePushHookPath, localRepoPostPushHookPath } from './paths.js'\nimport fs from 'node:fs/promises'\n\nfunction buildHookScript(body: string): string {\n const rawCliPath = process.argv[1] || 'skillcraft'\n const cliPath = JSON.stringify(rawCliPath)\n return `#!/usr/bin/env sh\nif [ -n \"$SKILLCRAFT_HOOK_DISABLED\" ]; then\n exit 0\nfi\n\nSKILLCRAFT_HOOK_DIR=\"$PWD\"\nSKILLCRAFT_HOOK_DIR=\"$(git -C \"$SKILLCRAFT_HOOK_DIR\" rev-parse --show-toplevel 2>/dev/null || printf \"%s\" \"$SKILLCRAFT_HOOK_DIR\")\"\nSKILLCRAFT_CLI=${cliPath}\nunset GIT_INDEX_FILE\n\n${body}\n`\n}\n\nconst postCommitScript = buildHookScript(`\"$SKILLCRAFT_CLI\" _hook post-commit \"$SKILLCRAFT_HOOK_DIR\" || true`)\n\nconst postPushScript = buildHookScript(`SKILLCRAFT_HOOK_REMOTE=\"$1\"\n\"$SKILLCRAFT_CLI\" _hook post-push \"$SKILLCRAFT_HOOK_DIR\" \"$SKILLCRAFT_HOOK_REMOTE\" || true`)\n\nconst prePushScript = buildHookScript(`SKILLCRAFT_HOOK_REMOTE=\"$1\"\n\"$SKILLCRAFT_CLI\" _hook post-push \"$SKILLCRAFT_HOOK_DIR\" \"$SKILLCRAFT_HOOK_REMOTE\" || true`)\n\nexport async function installPostCommitHook(repoPath: string): Promise<void> {\n await writeText(localRepoHookPath(repoPath), `${postCommitScript}\\n`)\n await fs.chmod(localRepoHookPath(repoPath), 0o755)\n\n await writeText(localRepoPostPushHookPath(repoPath), `${postPushScript}\\n`)\n await fs.chmod(localRepoPostPushHookPath(repoPath), 0o755)\n\n await writeText(localRepoPrePushHookPath(repoPath), `${prePushScript}\\n`)\n await fs.chmod(localRepoPrePushHookPath(repoPath), 0o755)\n}\n\nexport async function removePostCommitHook(repoPath: string): Promise<void> {\n await Promise.all([\n fs.rm(localRepoHookPath(repoPath), { force: true }),\n fs.rm(localRepoPostPushHookPath(repoPath), { force: true }),\n fs.rm(localRepoPrePushHookPath(repoPath), { force: true }),\n ])\n}\n","import { z } from 'zod'\n\nexport const ProofVersionSchema = z.literal(1)\n\nexport const DefaultProofRef = 'skillcraft/proofs/v1'\n\nexport const PendingSchema = z.object({\n skills: z.array(z.string()).default([]),\n})\n\nexport const ContextSchema = z.object({\n activeLoadouts: z.array(z.string()).default([]),\n})\n\nexport const ProofAgentSchema = z.object({\n provider: z.string().optional(),\n})\n\nexport const ProofModelSchema = z.object({\n provider: z.string().optional(),\n name: z.string().optional(),\n})\n\nexport const ConfigSchema = z.object({\n githubUser: z.string().optional(),\n provider: z.enum(['gh']).default('gh'),\n version: z.number().int().default(1),\n proofRef: z.string().default(DefaultProofRef),\n})\n\nexport const RepoEntrySchema = z.object({\n path: z.string(),\n remote: z.string().optional(),\n enabledAt: z.string().optional(),\n})\n\nexport const ReposFileSchema = z.object({\n repos: z.array(RepoEntrySchema).default([]),\n})\n\nexport const TrackedCredentialSchema = z.object({\n id: z.string(),\n trackedAt: z.string().optional(),\n})\n\nexport const TrackedCredentialsFileSchema = z.object({\n credentials: z.array(TrackedCredentialSchema).default([]),\n})\n\nexport type Proof = {\n version: number\n commit: string\n skills: Array<{ id: string; version?: string }>\n loadouts: string[]\n timestamp: string\n agent?: {\n provider?: string\n }\n model?: {\n provider?: string\n name?: string\n }\n}\n\nexport type RepoEntry = z.infer<typeof RepoEntrySchema>\nexport type ReposFile = z.infer<typeof ReposFileSchema>\nexport type TrackedCredentialEntry = z.infer<typeof TrackedCredentialSchema>\nexport type TrackedCredentialsFile = z.infer<typeof TrackedCredentialsFileSchema>\nexport type Config = z.infer<typeof ConfigSchema>\nexport type PendingFile = z.infer<typeof PendingSchema>\nexport type ContextFile = z.infer<typeof ContextSchema>\n\nexport type CliCommandResult = {\n ok: boolean\n message: string\n data?: unknown\n}\n","import { skillcraftGlobalDir, skillcraftConfigPath, skillcraftReposPath, trackedCredentialsPath, localSkillcraftConfig } from './paths.js'\nimport {\n ConfigSchema,\n ReposFileSchema,\n RepoEntry,\n TrackedCredentialsFileSchema,\n type Config,\n type ReposFile,\n type TrackedCredentialEntry,\n type TrackedCredentialsFile,\n} from './types.js'\nimport { ensureDir, readJson, writeJson } from './fs.js'\n\nexport async function loadGlobalConfig(): Promise<Config> {\n const raw = await readJson<unknown>(skillcraftConfigPath())\n const parsed = ConfigSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return ConfigSchema.parse({})\n }\n return parsed.data\n}\n\nexport async function loadLocalConfig(repoPath: string): Promise<Config> {\n const raw = await readJson<unknown>(localSkillcraftConfig(repoPath))\n const parsed = ConfigSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return ConfigSchema.parse({})\n }\n\n return parsed.data\n}\n\nexport async function saveGlobalConfig(config: Config): Promise<void> {\n await ensureDir(skillcraftGlobalDir())\n await writeJson(skillcraftConfigPath(), config)\n}\n\nexport async function loadRepos(): Promise<ReposFile> {\n const raw = await readJson<unknown>(skillcraftReposPath())\n const parsed = ReposFileSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return { repos: [] }\n }\n return parsed.data\n}\n\nexport async function saveRepos(file: ReposFile): Promise<void> {\n await ensureDir(skillcraftGlobalDir())\n await writeJson(skillcraftReposPath(), file)\n}\n\nexport async function addRepo(entry: RepoEntry): Promise<void> {\n const repos = await loadRepos()\n const next = repos.repos.filter((item) => item.path !== entry.path)\n next.push(entry)\n await saveRepos({ repos: next })\n}\n\nexport async function removeRepo(repoPath: string): Promise<void> {\n const repos = await loadRepos()\n const next = repos.repos.filter((item) => item.path !== repoPath)\n await saveRepos({ repos: next })\n}\n\nexport async function loadTrackedCredentials(): Promise<TrackedCredentialsFile> {\n const raw = await readJson<unknown>(trackedCredentialsPath())\n const parsed = TrackedCredentialsFileSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return { credentials: [] }\n }\n return parsed.data\n}\n\nexport async function saveTrackedCredentials(file: TrackedCredentialsFile): Promise<void> {\n await ensureDir(skillcraftGlobalDir())\n await writeJson(trackedCredentialsPath(), file)\n}\n\nexport async function addTrackedCredential(id: string): Promise<boolean> {\n const current = await loadTrackedCredentials()\n if (current.credentials.some((entry) => entry.id === id)) {\n return false\n }\n\n current.credentials.push({ id, trackedAt: new Date().toISOString() })\n current.credentials.sort(sortTrackedCredentialEntries)\n await saveTrackedCredentials(current)\n return true\n}\n\nexport async function removeTrackedCredential(id: string): Promise<boolean> {\n const current = await loadTrackedCredentials()\n const before = current.credentials.length\n const next = current.credentials.filter((entry) => entry.id !== id)\n if (next.length === before) {\n return false\n }\n await saveTrackedCredentials({ credentials: next })\n return true\n}\n\nexport function sortTrackedCredentialEntries(a: TrackedCredentialEntry, b: TrackedCredentialEntry): number {\n return a.id.localeCompare(b.id)\n}\n\nexport function reposByPath(repos: ReposFile, repoPath: string): RepoEntry | undefined {\n return repos.repos.find((r) => r.path === repoPath)\n}\n","import { isGitRepo, gitRoot } from '@/core/git'\nimport {\n localGitDir,\n localSkillcraftConfig,\n pendingPath,\n contextPath,\n pluginPath,\n managedPluginPath,\n aiModelContextPath,\n} from '@/core/paths'\nimport { removePostCommitHook } from '@/core/hooks'\nimport { removeFile } from '@/core/fs'\nimport { removeRepo } from '@/core/config'\n\nexport async function runDisable(): Promise<void> {\n const cwd = process.cwd()\n if (!(await isGitRepo(cwd))) {\n throw new Error('Current directory is not a git repository')\n }\n const root = await gitRoot(cwd)\n\n await Promise.all([\n removeFile(localSkillcraftConfig(root)),\n removeFile(pendingPath(root)),\n removeFile(contextPath(root)),\n removeFile(pluginPath(root)),\n removeFile(managedPluginPath(root)),\n removeFile(aiModelContextPath(root)),\n removeFile(localGitDir(root)),\n ])\n await removePostCommitHook(root)\n await removeRepo(root)\n process.stdout.write(`disabled skillcraft for ${root}\\n`)\n}\n","import { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport os from 'node:os'\nimport fs from 'node:fs/promises'\nimport { ensureDir, readJson, writeJson } from './fs.js'\nimport { pendingPath, contextPath, aiModelContextPath } from './paths.js'\nimport { DefaultProofRef, PendingSchema, ContextSchema, type Proof } from './types.js'\nimport { git, gitCommitMessage, gitHasRef, gitLsTreeNames, gitRemote, gitShowText } from './git.js'\nimport { isValidSkillIdentifier, splitSkillIdentifier } from './validation.js'\nimport { loadLocalConfig } from './config.js'\n\nconst PROOFS_DIR = 'proofs'\n\nfunction normalizeProofBranch(proofRef?: string): string {\n const clean = proofRef?.trim() || DefaultProofRef\n return clean.replace(/^refs\\/heads\\//, '')\n}\n\nfunction proofPathForId(proofId: string): string {\n return `${PROOFS_DIR}/${proofId}.json`\n}\n\nasync function proofBranch(repoPath: string): Promise<string> {\n const config = await loadLocalConfig(repoPath)\n return normalizeProofBranch(config.proofRef)\n}\n\nasync function proofSearchRefs(repoPath: string, branch: string): Promise<string[]> {\n const normalized = normalizeProofBranch(branch)\n const localRef = `refs/heads/${normalized}`\n const remoteRef = `refs/remotes/origin/${normalized}`\n const refs = [] as string[]\n\n if (await gitHasRef(repoPath, localRef)) {\n refs.push(normalized)\n }\n if (await gitHasRef(repoPath, remoteRef)) {\n refs.push(`origin/${normalized}`)\n }\n\n if (!refs.length) {\n refs.push(normalized)\n }\n\n return refs\n}\n\nasync function ensureProofBranch(repoPath: string, branch: string): Promise<void> {\n const fullRef = `refs/heads/${branch}`\n if (await gitHasRef(repoPath, fullRef)) {\n return\n }\n\n await git(['branch', branch], repoPath)\n}\n\nasync function withProofWorktree<T>(repoPath: string, branch: string, action: (worktree: string) => Promise<T>): Promise<T> {\n await removeProofWorktrees(repoPath, branch)\n const worktree = await fs.mkdtemp(path.join(os.tmpdir(), 'skillcraft-proof-'))\n\n try {\n await git(['worktree', 'add', '--quiet', worktree, branch], repoPath)\n return await action(worktree)\n } finally {\n await removeProofWorktree(repoPath, worktree)\n }\n}\n\nasync function removeProofWorktree(repoPath: string, worktreePath: string): Promise<void> {\n try {\n await git(['worktree', 'remove', '--force', worktreePath], repoPath)\n } catch {\n await fs.rm(worktreePath, { force: true, recursive: true })\n }\n}\n\nasync function removeProofWorktrees(repoPath: string, branch: string): Promise<void> {\n const targetRef = `refs/heads/${branch}`\n\n try {\n const raw = await git(['worktree', 'list', '--porcelain'], repoPath)\n const lines = raw.split('\\n')\n let currentWorktree: string | undefined\n let currentBranch: string | undefined\n\n const maybeRemove = async () => {\n if (!currentWorktree || currentBranch !== targetRef) {\n return\n }\n await removeProofWorktree(repoPath, currentWorktree)\n }\n\n for (const line of lines) {\n if (!line) {\n currentWorktree = undefined\n currentBranch = undefined\n continue\n }\n\n if (line.startsWith('worktree ')) {\n await maybeRemove()\n currentWorktree = line.slice(9)\n currentBranch = undefined\n continue\n }\n\n if (line.startsWith('branch ')) {\n currentBranch = line.slice(7)\n }\n }\n\n await maybeRemove()\n } catch {\n return\n }\n}\n\nexport async function loadProofsFromRepo(repoPath: string): Promise<Proof[]> {\n const branch = await proofBranch(repoPath)\n const searchRefs = await proofSearchRefs(repoPath, branch)\n const files = new Set<string>()\n\n for (const proofRef of searchRefs) {\n const listed = await gitLsTreeNames(repoPath, proofRef, PROOFS_DIR)\n for (const file of listed) {\n files.add(file)\n }\n }\n\n const proofs: Proof[] = []\n\n for (const file of files) {\n if (!file.endsWith('.json')) {\n continue\n }\n\n const proofId = path.basename(file, '.json')\n const proof = await readProof(repoPath, proofId)\n if (proof) {\n proofs.push(proof)\n }\n }\n\n return proofs\n}\n\nfunction parseSkillFromRaw(value: string): { id: string; version?: string } | undefined {\n const parsed = splitSkillIdentifier(value)\n if (!parsed.id) {\n return undefined\n }\n\n if (!isValidSkillIdentifier(parsed.id)) {\n return undefined\n }\n\n return {\n id: parsed.id,\n version: parsed.version,\n }\n}\n\nexport function normalizeSkillIds(raw: string[]): string[] {\n const normalized = raw\n .filter(Boolean)\n .map((item) => splitSkillIdentifier(item))\n .filter((entry): entry is { id: string; version?: string; slug: string } => !!entry.id)\n .map((entry) => `${entry.id}${entry.version ? `@${entry.version}` : ''}`)\n\n return Array.from(new Set(normalized)).filter(isValidSkillIdentifier).sort()\n}\n\nexport function buildProofId(skills: string[], timestamp: string, loadouts: string[]): string {\n const normalized = {\n skills,\n loadouts,\n timestamp,\n }\n const digest = createHash('sha256').update(JSON.stringify(normalized)).digest('hex')\n return digest.slice(0, 8)\n}\n\nexport async function loadPending(repoPath: string): Promise<string[]> {\n const raw = await readJson<unknown>(pendingPath(repoPath))\n const parsed = PendingSchema.safeParse(raw ?? { skills: [] })\n return parsed.success ? normalizeSkillIds(parsed.data.skills) : []\n}\n\nexport async function loadContext(repoPath: string): Promise<string[]> {\n const raw = await readJson<unknown>(contextPath(repoPath))\n const parsed = ContextSchema.safeParse(raw ?? { activeLoadouts: [] })\n return parsed.success ? parsed.data.activeLoadouts : []\n}\n\nexport async function loadAiModelContext(repoPath: string): Promise<{ agent?: { provider?: string }; model?: { provider?: string; name?: string } }> {\n const raw = await readJson<unknown>(aiModelContextPath(repoPath))\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return {}\n }\n\n const record = raw as Record<string, unknown>\n const agentValue = record.agent && typeof record.agent === 'object' && !Array.isArray(record.agent)\n ? (record.agent as Record<string, unknown>)\n : undefined\n\n const modelValue = record.model && typeof record.model === 'object' && !Array.isArray(record.model)\n ? (record.model as Record<string, unknown>)\n : undefined\n\n return {\n agent: typeof agentValue?.provider === 'string' ? { provider: normalizeLowerCase(agentValue.provider) } : undefined,\n model:\n typeof modelValue?.provider === 'string' || typeof modelValue?.name === 'string'\n ? {\n provider: typeof modelValue.provider === 'string' ? normalizeLowerCase(modelValue.provider) : undefined,\n name: typeof modelValue.name === 'string' ? normalizeModelName(modelValue.name) : undefined,\n }\n : undefined,\n }\n}\n\nfunction normalizeLowerCase(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction normalizeModelName(value: string): string {\n return value.trim()\n}\n\nexport function parseProof(payload: unknown): Proof | undefined {\n if (!payload || typeof payload !== 'object') {\n return undefined\n }\n const record = payload as Record<string, unknown>\n if (typeof record.version !== 'number' || typeof record.commit !== 'string' || !Array.isArray(record.skills)) {\n return undefined\n }\n if (!record.timestamp || typeof record.timestamp !== 'string') {\n return undefined\n }\n const loadouts = Array.isArray(record.loadouts) ? record.loadouts.map(String) : []\n const skills = record.skills\n .map((entry) => {\n if (typeof entry === 'string') {\n return { id: entry }\n }\n if (entry && typeof entry === 'object' && 'id' in entry && typeof entry.id === 'string') {\n return { id: entry.id, version: typeof entry.version === 'string' ? entry.version : undefined }\n }\n return undefined\n })\n .filter((entry): entry is { id: string; version?: string } => !!entry)\n return {\n version: record.version,\n commit: record.commit,\n skills,\n loadouts,\n timestamp: record.timestamp,\n agent: parseAgentValue(record.agent),\n model: parseModelValue(record.model),\n }\n}\n\nfunction parseAgentValue(value: unknown): { provider?: string } | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n const provider = (value as Record<string, unknown>).provider\n if (typeof provider !== 'string') {\n return undefined\n }\n\n const normalized = provider.trim().toLowerCase()\n return normalized ? { provider: normalized } : undefined\n}\n\nfunction parseModelValue(value: unknown): { provider?: string; name?: string } | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n const raw = value as Record<string, unknown>\n const normalizedProvider = typeof raw.provider === 'string' ? raw.provider.trim().toLowerCase() : undefined\n const normalizedName = typeof raw.name === 'string' ? raw.name.trim() : undefined\n\n if (!normalizedProvider && !normalizedName) {\n return undefined\n }\n\n return {\n provider: normalizedProvider,\n name: normalizedName,\n }\n}\n\nexport async function readProof(repoPath: string, proofId: string): Promise<Proof | undefined> {\n const branch = await proofBranch(repoPath)\n const file = proofPathForId(proofId)\n const searchRefs = await proofSearchRefs(repoPath, branch)\n\n for (const proofRef of searchRefs) {\n const payload = await gitShowText(repoPath, proofRef, file)\n if (!payload) {\n continue\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(payload)\n } catch {\n continue\n }\n\n const proof = parseProof(parsed)\n if (proof) {\n return proof\n }\n }\n\n return undefined\n}\n\nexport async function writeProof(repoPath: string, proof: Proof): Promise<string> {\n const proofId = buildProofId(proof.skills.map((skill) => skill.id), proof.timestamp, proof.loadouts)\n const branch = await proofBranch(repoPath)\n await ensureProofBranch(repoPath, branch)\n\n const proofFile = proofPathForId(proofId)\n await withProofWorktree(repoPath, branch, async (worktree) => {\n await ensureDir(path.join(worktree, PROOFS_DIR))\n await writeJson(path.join(worktree, proofFile), proof)\n await git(['add', proofFile], worktree, { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } })\n\n const status = await git(\n ['status', '--porcelain', '--', proofFile],\n worktree,\n { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } },\n )\n if (!status) {\n return\n }\n\n await git(\n ['commit', '--no-gpg-sign', '-m', `add Skillcraft proof ${proofId}`],\n worktree,\n { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } },\n )\n })\n\n return proofId\n}\n\nexport async function pushProofBranch(repoPath: string, remoteName = 'origin'): Promise<void> {\n const branch = await proofBranch(repoPath)\n const remote = await gitRemote(repoPath, remoteName)\n if (!remote || !remoteName) {\n return\n }\n\n try {\n await git(['push', remoteName, `${branch}:${branch}`], repoPath, { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } })\n } catch {\n return\n }\n}\n\nexport async function currentProofIdForCommit(repoPath: string, commit: string): Promise<string | undefined> {\n const proofs = await loadProofsFromRepo(repoPath)\n\n for (const proof of proofs) {\n if (proof.commit === commit) {\n return buildProofId(\n proof.skills.map((skill) => skill.id),\n proof.timestamp,\n proof.loadouts,\n )\n }\n }\n return undefined\n}\n\nexport async function buildProofFromPending(\n repoPath: string,\n commit: string,\n timestamp: string = new Date().toISOString(),\n): Promise<{ proofId: string; proof: Proof } | undefined> {\n const pending = await loadPending(repoPath)\n const loadouts = await loadContext(repoPath)\n const aiModelContext = await loadAiModelContext(repoPath)\n const parsedSkills = pending\n .map((skill) => parseSkillFromRaw(skill))\n .filter((entry): entry is { id: string; version?: string } => !!entry)\n\n const proof: Proof = {\n version: 1,\n commit,\n skills: parsedSkills,\n loadouts,\n timestamp,\n ...aiModelContext,\n }\n\n const proofId = await writeProof(repoPath, proof)\n return { proofId, proof }\n}\n\nexport async function stripDraftMessage(message: string): Promise<string> {\n return message\n .replace(/\\nSkillcraft-Ref: .*$/gm, '')\n .trimEnd()\n}\n\nexport async function buildCommitMessageWithProof(repoPath: string, proofId: string): Promise<string> {\n const existing = await gitCommitMessage(repoPath)\n const cleaned = await stripDraftMessage(existing)\n if (cleaned.includes('Skillcraft-Ref:')) {\n return cleaned\n }\n return `${cleaned}\\n\\nSkillcraft-Ref: ${proofId}\\n`\n}\n","const localIdentifierPattern = /^[a-zA-Z0-9][a-zA-Z0-9._-]*\\/[a-zA-Z0-9][a-zA-Z0-9._-]*(?:@[^\\s/]+)?$/\nconst localIdentifierPatternWithoutVersion = /^[a-zA-Z0-9][a-zA-Z0-9._-]*\\/[a-zA-Z0-9][a-zA-Z0-9._-]*$/\nconst externalSourceIdWithoutVersion = /^([a-zA-Z0-9][a-zA-Z0-9._-]*):([a-zA-Z0-9][a-zA-Z0-9._-]*)(?:\\/([a-zA-Z0-9][a-zA-Z0-9._-]*))?$/\n\nexport type ParsedSkillId = {\n id: string\n owner?: string\n slug: string\n source?: string\n version?: string\n}\n\nexport function normalizeSkillId(value: string): string | undefined {\n const parsed = splitSkillIdentifier(value)\n if (!parsed.id) {\n return undefined\n }\n return `${parsed.id}${parsed.version ? `@${parsed.version}` : ''}`\n}\n\nexport function isValidIdentifier(value: string): boolean {\n return localIdentifierPattern.test(value)\n}\n\nexport function isValidSkillIdentifier(value: string): boolean {\n return !!splitSkillIdentifier(value).id\n}\n\nexport function splitSkillIdentifier(input: string): ParsedSkillId {\n const trimmed = input.trim()\n const parsed = splitIdentifierAndVersion(trimmed)\n const id = parsed.id || ''\n\n if (isLocalIdentifierWithoutVersion(id)) {\n const [owner, slug] = id.split('/')\n return {\n id,\n owner,\n slug,\n version: parsed.version,\n }\n }\n\n const match = externalSourceIdWithoutVersion.exec(id)\n if (!match) {\n return {\n id: '',\n slug: '',\n version: parsed.version,\n }\n }\n\n const source = match[1]\n const firstPart = match[2]\n const secondPart = match[3]\n\n if (secondPart === undefined) {\n return {\n id: `${source}:${firstPart}`,\n source,\n slug: firstPart,\n version: parsed.version,\n }\n }\n\n return {\n id: `${source}:${firstPart}/${secondPart}`,\n source,\n owner: firstPart,\n slug: secondPart,\n version: parsed.version,\n }\n}\n\nfunction isLocalIdentifierWithoutVersion(value: string): boolean {\n return localIdentifierPatternWithoutVersion.test(value)\n}\n\nexport function assertNonEmpty(value: string, field: string): string {\n const v = value.trim()\n if (!v) {\n throw new Error(`Expected ${field} to be provided`)\n }\n return v\n}\n\nexport function splitIdentifierAndVersion(value: string): { id: string; version?: string } {\n const parts = value.split('@')\n const id = parts[0] || ''\n const version = parts.length > 1 ? parts.slice(1).join('@') : undefined\n return {\n id,\n version,\n }\n}\n\nexport function splitArgPair(input: string): { owner: string; slug: string } {\n const [owner, slug] = input.split('/')\n if (!owner || !slug) {\n throw new Error(`Expected <owner>/<slug>, received ${input}`)\n }\n return { owner, slug: slug.trim() }\n}\n","import { fileExists, readJson } from './fs.js'\nimport { localSkillcraftConfig, localGitDir } from './paths.js'\nimport { ConfigSchema } from './types.js'\n\nexport async function isEnabled(repoPath: string): Promise<boolean> {\n const configPath = localSkillcraftConfig(repoPath)\n if (!(await fileExists(configPath))) {\n return false\n }\n const raw = await readJson<unknown>(configPath)\n const parsed = ConfigSchema.safeParse(raw ?? {})\n return parsed.success\n}\n\nexport async function hasSkillcraftDir(repoPath: string): Promise<boolean> {\n return fileExists(localGitDir(repoPath))\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { execFile, execSync } from 'node:child_process'\nimport { promisify } from 'node:util'\n\nconst exec = promisify(execFile)\n\nexport type ClaimInputs = {\n credential: string\n claimant: string\n sources: Array<{ repo: string; commits: string[] }>\n claimId: string\n}\n\nexport type PublishInputs = {\n targetRepo: string\n sourceDir: string\n destinationPath: string\n branch: string\n commitMessage: string\n}\n\nexport interface ForgeProvider {\n providerName(): string\n getUser(): Promise<string>\n getIssueUrl(repo: string, number: number): Promise<string>\n createIssue(repo: string, title: string, body: string): Promise<number>\n createPullRequest(repo: string, branch: string, title: string): Promise<number>\n openPullRequestForBranch(\n targetRepo: string,\n sourceRepo: string,\n sourceBranch: string,\n title: string,\n body: string,\n ): Promise<number>\n getIssueStatus(repo: string, issueNumber: number): Promise<{ state: string; labels: string[]; url: string }>\n listClaimProcessingRuns(repo: string, issueNumber: number): Promise<\n Array<{\n status: string\n conclusion?: string | null\n url: string\n name?: string\n createdAt?: string\n workflowName?: string\n }>\n >\n listClaimIssues(repo: string): Promise<\n Array<{\n number: number\n title: string\n state: string\n body?: string\n url?: string\n labels?: Array<{ name: string }>\n }>\n >\n cloneRepo(fullName: string, destination: string): Promise<void>\n copyDirectory(source: string, destination: string): Promise<void>\n}\n\nfunction hasGh(): boolean {\n try {\n execSync('which gh', { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n\nasync function runGh(args: readonly string[]): Promise<string> {\n if (!hasGh()) {\n throw new Error('gh CLI is required for this workflow')\n }\n const result = await exec('gh', args, { encoding: 'utf8' })\n return result.stdout.trim()\n}\n\nasync function copyDirRecursively(source: string, target: string): Promise<void> {\n await fs.mkdir(target, { recursive: true })\n const entries = await fs.readdir(source, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.name === '.git') {\n continue\n }\n const from = path.join(source, entry.name)\n const to = path.join(target, entry.name)\n if (entry.isDirectory()) {\n await copyDirRecursively(from, to)\n continue\n }\n if (entry.isSymbolicLink()) {\n const link = await fs.readlink(from)\n await fs.symlink(link, to)\n continue\n }\n if (entry.isFile()) {\n await fs.copyFile(from, to)\n }\n }\n}\n\nexport class GitHubProvider implements ForgeProvider {\n providerName(): string {\n return 'gh'\n }\n\n async getUser(): Promise<string> {\n return await runGh(['api', 'user', '--jq', '.login'])\n }\n\n async getIssueUrl(repo: string, number: number): Promise<string> {\n return `https://github.com/${repo}/issues/${number}`\n }\n\n async createIssue(repo: string, title: string, body: string): Promise<number> {\n const raw = await runGh([\n 'issue',\n 'create',\n '-R',\n repo,\n '--title',\n title,\n '--body',\n body,\n ])\n const match = raw.match(/\\b(\\d+)$/)\n if (!match) {\n return 0\n }\n return Number(match[1])\n }\n\n async createPullRequest(targetRepo: string, branch: string, title: string): Promise<number> {\n const raw = await runGh([\n 'pr',\n 'create',\n '--repo',\n targetRepo,\n '--head',\n branch,\n '--base',\n 'main',\n '--title',\n title,\n '--body',\n `Generated by skillcraft for ${title}`,\n '--fill-first',\n ])\n const match = raw.match(/\\b(\\d+)$/)\n if (!match) {\n return 0\n }\n return Number(match[1])\n }\n\n async openPullRequestForBranch(\n targetRepo: string,\n sourceRepo: string,\n sourceBranch: string,\n title: string,\n body: string,\n ): Promise<number> {\n const raw = await runGh([\n 'pr',\n 'create',\n '--repo',\n targetRepo,\n '--head',\n `${sourceRepo}:${sourceBranch}`,\n '--base',\n 'main',\n '--title',\n title,\n '--body',\n body,\n ])\n const match = raw.match(/\\b(\\d+)$/)\n if (!match) {\n return 0\n }\n return Number(match[1])\n }\n\n async getIssueStatus(repo: string, issueNumber: number): Promise<{ state: string; labels: string[]; url: string }> {\n const raw = await runGh(['issue', 'view', String(issueNumber), '--repo', repo, '--json', 'state,labels,url'])\n const parsed = JSON.parse(raw) as { state: string; labels: Array<{ name: string }>; url: string }\n return {\n state: parsed.state,\n labels: parsed.labels?.map((label) => label.name) ?? [],\n url: parsed.url,\n }\n }\n\n async listClaimProcessingRuns(repo: string, issueNumber: number): Promise<\n Array<{\n status: string\n conclusion?: string | null\n url: string\n name?: string\n createdAt?: string\n workflowName?: string\n }>\n > {\n const raw = await runGh([\n 'run',\n 'list',\n '--repo',\n repo,\n '--workflow',\n 'Process credential claims',\n '--json',\n 'name,status,conclusion,url,createdAt,workflowName',\n ])\n const parsed = JSON.parse(raw) as Array<{\n status?: string\n conclusion?: string | null\n url?: string\n name?: string\n createdAt?: string\n workflowName?: string\n }>\n const issueMarker = `#${issueNumber}`\n\n const candidates = parsed.filter((entry) => {\n const name = entry.name || ''\n const workflowName = entry.workflowName || ''\n return name.includes(issueMarker) || workflowName.includes(issueMarker)\n })\n\n const runs = candidates.length > 0\n ? candidates\n : parsed.filter((entry) => entry.status && ['in_progress', 'queued', 'waiting', 'action_required', 'canceling'].includes(entry.status))\n if (!runs.length) {\n return []\n }\n\n return runs\n .filter((entry) => entry.url)\n .map((entry) => ({\n status: entry.status || 'unknown',\n conclusion: entry.conclusion ?? undefined,\n url: entry.url!,\n name: entry.name,\n createdAt: entry.createdAt,\n workflowName: entry.workflowName,\n }))\n }\n\n async listClaimIssues(repo: string): Promise<\n Array<{\n number: number\n title: string\n state: string\n body?: string\n url?: string\n labels?: Array<{ name: string }>\n }>\n > {\n const raw = await runGh([\n 'issue',\n 'list',\n '--repo',\n repo,\n '--state',\n 'all',\n '--json',\n 'number,title,state,body,labels,url',\n '--limit',\n '100',\n ])\n const parsed = JSON.parse(raw) as Array<{\n number: number\n title: string\n state: string\n body?: string\n labels?: Array<{ name: string }>\n url?: string\n }>\n return parsed.filter((issue) => hasClaimTitle(issue.title) || hasLabel(issue.labels, 'skillcraft-claim'))\n }\n\n async cloneRepo(fullName: string, destination: string): Promise<void> {\n const temp = path.resolve(destination)\n await runGh(['repo', 'clone', fullName, temp])\n }\n\n async copyDirectory(source: string, destination: string): Promise<void> {\n const info = await fs.readdir(destination).catch(() => undefined)\n if (info) {\n await fs.rm(destination, { recursive: true, force: true })\n }\n await fs.mkdir(destination, { recursive: true })\n await copyDirRecursively(source, destination)\n }\n}\n\nfunction normalizeText(value?: string): string {\n return String(value || '').trim().toLowerCase()\n}\n\nfunction hasClaimTitle(title?: string): boolean {\n return normalizeText(title).startsWith('claim:')\n}\n\nfunction hasLabel(labels: Array<{ name: string }> | undefined, expected: string): boolean {\n const normalized = normalizeText(expected)\n return (labels || []).some((entry) => normalizeText(entry?.name) === normalized)\n}\n","import { GitHubProvider } from './github.js'\n\nexport type ProviderName = 'gh'\n\nexport const providers = {\n gh: () => new GitHubProvider(),\n}\n\nexport function getProvider(name: 'gh'): GitHubProvider {\n return providers[name]()\n}\n","import { isGitRepo, gitHeadCommit, gitLogWithMessages, gitHasRef } from '@/core/git'\nimport { loadPending, currentProofIdForCommit } from '@/core/proof'\nimport { contextPath, localRepoHookPath } from '@/core/paths'\nimport { fileExists } from '@/core/fs'\nimport { isEnabled } from '@/core/state'\nimport { loadLocalConfig } from '@/core/config'\nimport { getProvider } from '@/providers'\n\nexport async function runStatus(): Promise<void> {\n const cwd = process.cwd()\n const git = await isGitRepo(cwd)\n process.stdout.write(`git: ${git ? 'enabled' : 'not a repository'}\\n`)\n\n const enabled = await isEnabled(cwd)\n process.stdout.write(`skillcraft: ${enabled ? 'enabled' : 'disabled'}\\n`)\n\n if (!git || !enabled) {\n return\n }\n\n const pending = await loadPending(cwd)\n process.stdout.write(`pending skills: ${pending.length}\\n`)\n const contextExists = await fileExists(contextPath(cwd))\n const hasHook = await fileExists(localRepoHookPath(cwd))\n process.stdout.write(`context file: ${contextExists ? 'present' : 'missing'}\\n`)\n process.stdout.write(`post-commit hook: ${hasHook ? 'installed' : 'missing'}\\n`)\n\n const head = await gitHeadCommit(cwd)\n const proofId = await currentProofIdForCommit(cwd, head)\n process.stdout.write(`head: ${head}\\n`)\n process.stdout.write(`latest proof: ${proofId ?? 'none'}\\n`)\n\n const logs = await gitLogWithMessages(cwd, 20)\n const withSkillcraft = logs.filter((entry) => entry.message.includes('Skillcraft-Ref:'))\n process.stdout.write(`recent commits with evidence: ${withSkillcraft.length}\\n`)\n\n const config = await loadLocalConfig(cwd)\n const branch = config.proofRef?.replace(/^refs\\/heads\\//, '') || 'skillcraft/proofs/v1'\n const proofBranchExists = await gitHasRef(cwd, `refs/heads/${branch}`)\n process.stdout.write(`proof branch: ${proofBranchExists ? 'present' : 'missing'}\\n`)\n\n if (pending.length > 0) {\n process.stdout.write(`pending evidence queued: ${pending.join(', ')}\\n`)\n }\n}\n\nexport async function runDoctor(): Promise<void> {\n const checks = await Promise.all([\n checkTool('node'),\n checkTool('npm'),\n checkTool('git'),\n checkTool('gh'),\n checkTool('opencode'),\n ])\n\n for (const [name, ok] of checks) {\n process.stdout.write(`${name}: ${ok ? 'ok' : 'missing'}\\n`)\n }\n\n const ghAvailable = checks.find(([name]) => name === 'gh')?.[1] ?? false\n if (!ghAvailable) {\n process.stdout.write('gh auth: missing\\n')\n process.stdout.write('github user: unknown\\n')\n return\n }\n\n const login = await getProvider('gh').getUser().catch(() => '')\n process.stdout.write(`gh auth: ${login ? 'ok' : 'missing'}\\n`)\n process.stdout.write(`github user: ${login || 'unknown'}\\n`)\n}\n\nasync function checkTool(tool: string): Promise<[string, boolean]> {\n return [tool, await isToolAvailable(tool)]\n}\n\nasync function isToolAvailable(tool: string): Promise<boolean> {\n try {\n const { execSync } = await import('node:child_process')\n execSync(`command -v ${tool}`, { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n","import { isGitRepo, gitRoot, gitRemote } from '@/core/git'\nimport path from 'node:path'\nimport { getProvider } from '@/providers'\nimport {\n skillcraftGlobalDir,\n localGitDir,\n localSkillcraftConfig,\n pluginPath,\n managedPluginPath,\n aiModelContextPath,\n pendingPath,\n contextPath,\n} from '@/core/paths'\nimport { ensureDir, writeJson, writeText } from '@/core/fs'\nimport { addRepo, loadGlobalConfig, saveGlobalConfig } from '@/core/config'\nimport { installPostCommitHook } from '@/core/hooks'\nimport { DefaultProofRef } from '@/core/types'\nimport { git, gitHasRef } from '@/core/git'\n\nexport async function runEnable(): Promise<void> {\n const cwd = process.cwd()\n if (!(await isGitRepo(cwd))) {\n throw new Error('Current directory is not a git repository')\n }\n const root = await gitRoot(cwd)\n\n const config = await loadGlobalConfig()\n if (!config.githubUser) {\n const provider = getProvider(config.provider ?? 'gh')\n const fallback = await provider.getUser().catch(() => process.env.GITHUB_USER || process.env.USER || 'developer')\n await saveGlobalConfig({ ...config, githubUser: fallback })\n }\n\n await ensureDir(localGitDir(root))\n await ensureDir(path.dirname(managedPluginPath(root)))\n await writeText(managedPluginPath(root), getManagedPluginSource())\n await writeJson(aiModelContextPath(root), {\n agent: { provider: 'opencode' },\n model: {},\n })\n\n const branchRef = `refs/heads/${DefaultProofRef}`\n if (!(await gitHasRef(root, branchRef))) {\n await git(['branch', DefaultProofRef], root)\n }\n await writeJson(localSkillcraftConfig(root), {\n version: 1,\n proofRef: DefaultProofRef,\n })\n await ensureDir(skillcraftGlobalDir())\n await writeJson(pendingPath(root), { skills: [] })\n await writeJson(contextPath(root), { activeLoadouts: [] })\n await writeJson(pluginPath(root), {\n version: 1,\n providers: ['opencode'],\n enabled: true,\n })\n await installPostCommitHook(root)\n\n const remote = await gitRemote(root)\n await addRepo({ path: root, remote, enabledAt: new Date().toISOString() })\n process.stdout.write(`enabled skillcraft for ${root}\\n`)\n}\n\nfunction getManagedPluginSource(): string {\n return `import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nfunction normalizeProvider(value) {\n return typeof value === 'string' ? value.trim().toLowerCase() : ''\n}\n\nfunction normalizeModelName(value) {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction extractModelInfo(payload) {\n if (!payload || typeof payload !== 'object') {\n return {}\n }\n\n const direct = {\n modelProvider: normalizeProvider(payload.model_provider || payload.modelProvider || payload.model_provider_id),\n modelName: normalizeModelName(payload.model_name || payload.modelName || payload.model),\n agentProvider: normalizeProvider(payload.provider || payload.agent_provider || payload.agentProvider),\n }\n\n const msg = payload.message\n const request = payload.request\n const context = payload.context\n\n const nestedMessage = msg && typeof msg === 'object' ? {\n modelProvider: normalizeProvider(msg.model_provider || msg.modelProvider),\n modelName: normalizeModelName(msg.model_name || msg.modelName || msg.model),\n agentProvider: normalizeProvider(msg.provider || msg.agent_provider || msg.agentProvider),\n } : {}\n\n const nestedRequest = request && typeof request === 'object' ? {\n modelProvider: normalizeProvider(request.model_provider || request.modelProvider),\n modelName: normalizeModelName(request.model_name || request.modelName || request.model),\n agentProvider: normalizeProvider(request.provider || request.agent_provider || request.agentProvider),\n } : {}\n\n const nestedContext = context && typeof context === 'object' ? {\n modelProvider: normalizeProvider(context.model_provider || context.modelProvider),\n modelName: normalizeModelName(context.model_name || context.modelName || context.model),\n agentProvider: normalizeProvider(context.provider || context.agent_provider || context.agentProvider),\n } : {}\n\n const candidate = {\n agentProvider: direct.agentProvider || nestedMessage.agentProvider || nestedRequest.agentProvider || nestedContext.agentProvider || 'opencode',\n modelProvider: direct.modelProvider || nestedMessage.modelProvider || nestedRequest.modelProvider || nestedContext.modelProvider,\n modelName: direct.modelName || nestedMessage.modelName || nestedRequest.modelName || nestedContext.modelName,\n }\n\n if (!candidate.modelProvider && !candidate.modelName && !candidate.agentProvider) {\n return {}\n }\n\n return candidate\n}\n\nfunction resolveStateFile() {\n return path.join(process.cwd(), '.git', 'skillcraft', 'ai-model-context.json')\n}\n\nasync function updateState(update) {\n const stateFile = resolveStateFile()\n let current = {}\n\n try {\n const raw = await fs.readFile(stateFile, 'utf8')\n const parsed = JSON.parse(raw)\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n current = parsed\n }\n } catch {\n current = {}\n }\n\n const next = {\n ...(current || {}),\n ...(update || {}),\n }\n\n if (!next.agent || typeof next.agent !== 'object' || Array.isArray(next.agent)) {\n next.agent = { provider: 'opencode' }\n } else if (!next.agent.provider && update?.agent?.provider) {\n next.agent = { ...next.agent }\n }\n\n if (update?.agent?.provider) {\n next.agent.provider = update.agent.provider\n }\n\n if (update?.model) {\n next.model = {\n ...(next.model || {}),\n ...(update.model || {}),\n }\n }\n\n try {\n await fs.mkdir(path.join(process.cwd(), '.git', 'skillcraft'), { recursive: true })\n await fs.writeFile(stateFile, JSON.stringify(next, null, 2) + '\\n', 'utf8')\n } catch {\n return\n }\n}\n\nasync function handlePayload(payload) {\n if (!payload || typeof payload !== 'object') {\n return\n }\n\n const extracted = extractModelInfo(payload)\n if (!extracted || !extracted.agentProvider && !extracted.modelProvider && !extracted.modelName) {\n return\n }\n\n const update = {\n agent: {\n provider: extracted.agentProvider || 'opencode',\n },\n model: {\n ...(extracted.modelProvider ? { provider: extracted.modelProvider } : {}),\n ...(extracted.modelName ? { name: extracted.modelName } : {}),\n },\n }\n\n await updateState(update)\n}\n\nexport default async function Skillcraft() {\n const handler = async (event) => {\n try {\n await handlePayload(event)\n } catch {\n return\n }\n }\n\n return {\n 'chat.message': async (event) => {\n try {\n await handler(event)\n } catch {\n return\n }\n },\n event: async (event) => {\n try {\n const payload = event?.type && typeof event.type === 'string' ? event : event?.payload\n await handler(payload)\n } catch {\n return\n }\n },\n }\n}\n`\n}\n","import { loadRepos, saveRepos } from '@/core/config'\nimport { isGitRepo, gitRoot } from '@/core/git'\n\nexport async function runReposList(): Promise<void> {\n const data = await loadRepos()\n if (!data.repos.length) {\n process.stdout.write('no repositories tracked\\n')\n return\n }\n data.repos.forEach((entry, index) => {\n process.stdout.write(`${index + 1}. ${entry.path}`)\n if (entry.remote) {\n process.stdout.write(` (${entry.remote})`)\n }\n process.stdout.write('\\n')\n })\n}\n\nexport async function runReposPrune(): Promise<void> {\n const data = await loadRepos()\n const next = [] as typeof data.repos\n for (const item of data.repos) {\n if (await isGitRepo(item.path)) {\n await gitRoot(item.path)\n next.push(item)\n }\n }\n await saveRepos({ repos: next })\n process.stdout.write(`pruned repo list: ${data.repos.length} -> ${next.length}\\n`)\n}\n","import { loadProofsFromRepo } from './proof.js'\nimport type { Proof } from './types.js'\n\nexport async function loadProofFromRepo(repoPath: string): Promise<Proof[]> {\n return loadProofsFromRepo(repoPath)\n}\n","import path from 'node:path'\nimport { ensureDir, fileExists, readJson, writeJson } from './fs.js'\nimport { credentialIndexCachePath } from './paths.js'\nimport type { Proof } from './types.js'\n\nexport type NormalizedRequirements = {\n minCommits: number\n minRepositories: number\n tree: RequirementNode\n}\n\nexport type RequirementNode =\n | { and: RequirementNode[] }\n | { or: RequirementNode[] }\n | { skill: string }\n | { loadout: string }\n | { agent: { provider: string } }\n | { model: { provider?: string; name?: string } }\n\nexport type CredentialIndexEntry = {\n id: string\n name?: string\n description?: string\n requirements: NormalizedRequirements\n}\n\nexport type RequirementCheck = {\n type: 'skill' | 'loadout' | 'agent' | 'model'\n requirement: string\n satisfied: boolean\n}\n\nexport type EvaluationProof = {\n proof: Proof\n}\n\nexport type CredentialRequirementResult = {\n passed: boolean\n proofs: EvaluationProof[]\n provenCommits: string[]\n provenRepos: string[]\n checks: RequirementCheck[]\n reasons: string[]\n noExplicitChecks: boolean\n}\n\ntype RawRequirementNode = Record<string, unknown>\n\nconst DEFAULT_CREDENTIAL_INDEX_URL = 'https://skillcraft.gg/credential-ledger/credentials/index.json'\nconst CREDENTIAL_INDEX_CACHE_REFRESH_MS = 6 * 60 * 60 * 1000\nconst CREDENTIAL_INDEX_CACHE_VERSION = 1\n\nconst CREDENTIAL_INDEX_CACHE_PATH = credentialIndexCachePath()\n\ntype CachedCredentialIndexFile = {\n cachedAt: number\n version: number\n entries: CredentialIndexEntry[]\n}\n\ntype CredentialIndexLoadOptions = {\n refresh?: boolean\n}\n\nfunction getCredentialIndexUrl(): string {\n return process.env.SKILLCRAFT_CREDENTIAL_INDEX_URL?.trim() || DEFAULT_CREDENTIAL_INDEX_URL\n}\n\nasync function readCredentialIndexCache(cachePath: string): Promise<CachedCredentialIndexFile | null> {\n try {\n const raw = await readJson<unknown>(cachePath)\n if (!raw || !isObject(raw)) {\n return null\n }\n\n const cachedAt = parseInteger(raw.cachedAt)\n if (cachedAt === undefined || cachedAt <= 0) {\n return null\n }\n\n if (raw.version !== CREDENTIAL_INDEX_CACHE_VERSION) {\n return null\n }\n\n if (!('entries' in raw)) {\n return null\n }\n\n const entries = normalizeCredentialIndexEntries(raw.entries)\n return {\n cachedAt,\n version: CREDENTIAL_INDEX_CACHE_VERSION,\n entries,\n }\n } catch {\n return null\n }\n}\n\nfunction parseInteger(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed)) {\n return parsed\n }\n }\n return undefined\n}\n\nfunction isCredentialIndexCacheFresh(cache: CachedCredentialIndexFile): boolean {\n const ageMs = Date.now() - cache.cachedAt\n return ageMs < CREDENTIAL_INDEX_CACHE_REFRESH_MS\n}\n\nexport async function loadCredentialIndex(options: CredentialIndexLoadOptions = {}): Promise<CredentialIndexEntry[]> {\n const explicitPath = process.env.SKILLCRAFT_CREDENTIAL_INDEX_PATH?.trim()\n if (explicitPath) {\n return loadIndexFromPath(explicitPath)\n }\n\n const cached = !options.refresh ? await readCredentialIndexCache(CREDENTIAL_INDEX_CACHE_PATH) : null\n if (cached && isCredentialIndexCacheFresh(cached)) {\n return cached.entries\n }\n\n try {\n const entries = await loadIndexFromRemote(getCredentialIndexUrl())\n await writeCredentialIndexCache(entries)\n return entries\n } catch (error) {\n if (await fileExists(CREDENTIAL_INDEX_CACHE_PATH)) {\n const cached = await readCredentialIndexCache(CREDENTIAL_INDEX_CACHE_PATH)\n if (cached) {\n return cached.entries\n }\n return loadIndexFromPath(CREDENTIAL_INDEX_CACHE_PATH)\n }\n if (error instanceof Error) {\n throw error\n }\n throw new Error('failed to load credential index')\n }\n}\n\nasync function loadIndexFromRemote(url: string): Promise<CredentialIndexEntry[]> {\n const response = await fetch(url, {\n headers: {\n 'user-agent': 'skillcraft-cli',\n },\n })\n\n if (!response.ok) {\n throw new Error(`failed to download credential index from ${url}`)\n }\n\n const raw = await response.json()\n const entries = normalizeCredentialIndexEntries(raw)\n return entries\n}\n\nasync function loadIndexFromPath(filePath: string): Promise<CredentialIndexEntry[]> {\n const raw = await readJson<unknown>(filePath)\n if (!raw) {\n return []\n }\n\n if (isObject(raw) && Array.isArray((raw as { entries?: unknown }).entries)) {\n return normalizeCredentialIndexEntries((raw as { entries: unknown }).entries)\n }\n\n return normalizeCredentialIndexEntries(raw)\n}\n\nasync function writeCredentialIndexCache(entries: CredentialIndexEntry[]): Promise<void> {\n await ensureDir(path.dirname(CREDENTIAL_INDEX_CACHE_PATH))\n const payload = {\n cachedAt: Date.now(),\n version: CREDENTIAL_INDEX_CACHE_VERSION,\n entries,\n }\n await writeJson(CREDENTIAL_INDEX_CACHE_PATH, payload)\n}\n\nexport function normalizeRequirements(value: unknown): NormalizedRequirements {\n const requirements = isObject(value) ? value : {}\n\n if (requirements.mode !== undefined) {\n throw new Error('requirements.mode is not supported. Use nested and/or expressions instead.')\n }\n\n const requirementTree = normalizeRequirementRoot(requirements)\n\n return {\n minCommits: normalizeNonNegativeInteger(requirements.min_commits ?? requirements.minCommits, 0),\n minRepositories: normalizeNonNegativeInteger(requirements.min_repositories ?? requirements.minRepositories, 0),\n tree: requirementTree,\n }\n}\n\nfunction normalizeRequirementRoot(value: RawRequirementNode): RequirementNode {\n if (Object.prototype.hasOwnProperty.call(value, 'tree')) {\n return parseRequirementNode(value.tree, 'requirements.tree')\n }\n\n const hasExplicitAnd = Object.prototype.hasOwnProperty.call(value, 'and')\n const hasExplicitOr = Object.prototype.hasOwnProperty.call(value, 'or')\n\n if (hasExplicitAnd && hasExplicitOr) {\n throw new Error('requirements cannot include both and and or at the same level')\n }\n\n if (hasExplicitAnd) {\n const unexpected = Object.keys(value).filter((key) =>\n !['and', 'min_commits', 'min_repositories', 'minRepositories', 'minCommits', 'tree'].includes(key),\n )\n if (unexpected.length) {\n throw new Error(`Unexpected requirement fields: ${unexpected.join(', ')}`)\n }\n\n return {\n and: normalizeRequirementList((value as RawRequirementNode).and, 'requirements.and'),\n }\n }\n\n if (hasExplicitOr) {\n const unexpected = Object.keys(value).filter((key) =>\n !['or', 'min_commits', 'min_repositories', 'minRepositories', 'minCommits', 'tree'].includes(key),\n )\n if (unexpected.length) {\n throw new Error(`Unexpected requirement fields: ${unexpected.join(', ')}`)\n }\n\n return {\n or: normalizeRequirementList((value as RawRequirementNode).or, 'requirements.or'),\n }\n }\n\n return { and: buildImplicitAndFromShortcuts(value) }\n}\n\nfunction normalizeRequirementList(value: unknown, location: string): RequirementNode[] {\n if (!Array.isArray(value)) {\n throw new Error(`Expected array at ${location}`)\n }\n\n return value.map((entry, index) => parseRequirementNode(entry, `${location}[${index}]`))\n}\n\nfunction normalizeShortHandList(values: unknown, location: string): string[] {\n if (values === undefined) {\n return []\n }\n\n if (Array.isArray(values)) {\n return values.map((entry) => {\n const text = parseScalarText(entry)\n if (text === undefined) {\n throw new Error(`Expected text values for ${location}`)\n }\n return text\n })\n }\n\n const text = parseScalarText(values)\n if (!text) {\n return []\n }\n\n return [text]\n}\n\nfunction buildImplicitAndFromShortcuts(requirements: RawRequirementNode): RequirementNode[] {\n const normalized: RequirementNode[] = []\n const known = ['and', 'or', 'min_commits', 'min_repositories', 'minRepositories', 'minCommits', 'tree', 'skill', 'loadout', 'agent', 'model']\n\n for (const skill of normalizeShortHandList(requirements.skill, 'requirements.skill')) {\n normalized.push({ skill })\n }\n\n for (const loadout of normalizeShortHandList(requirements.loadout, 'requirements.loadout')) {\n normalized.push({ loadout })\n }\n\n const hasAgent = Object.prototype.hasOwnProperty.call(requirements, 'agent')\n const agent = normalizeAgentRequirement(requirements.agent)\n if (agent) {\n normalized.push(agent)\n } else if (hasAgent) {\n throw new Error('requirements.agent must be an object with a provider')\n }\n\n const hasModel = Object.prototype.hasOwnProperty.call(requirements, 'model')\n const model = normalizeModelRequirement(requirements.model)\n if (model) {\n normalized.push(model)\n } else if (hasModel) {\n throw new Error('requirements.model must be an object with optional provider and/or name')\n }\n\n const nested = Object.keys(requirements).filter((key) => !known.includes(key) && !key.startsWith('$'))\n if (nested.length) {\n throw new Error(`Unexpected requirement fields: ${nested.join(', ')}`)\n }\n\n return normalized\n}\n\nfunction parseRequirementNode(value: unknown, location: string): RequirementNode {\n if (!isObject(value)) {\n throw new Error(`Invalid requirement node at ${location}`)\n }\n\n const keys = Object.keys(value)\n if (!keys.length) {\n throw new Error(`Empty requirement node at ${location}`)\n }\n\n if (keys.length > 1) {\n throw new Error(`Requirement node has multiple keys at ${location}`)\n }\n\n const [key] = keys\n\n if (key === 'and' || key === 'or') {\n const valueForKey = (value as RawRequirementNode)[key]\n if (!Array.isArray(valueForKey)) {\n throw new Error(`Requirement node ${location} expected array for ${key}`)\n }\n\n return {\n [key]: valueForKey.map((entry, childIndex) => parseRequirementNode(entry, `${location}.${key}[${childIndex}]`)),\n } as RequirementNode\n }\n\n if (key === 'skill') {\n const text = parseScalarText((value as RawRequirementNode)[key])\n if (!text) {\n throw new Error(`Requirement node ${location} has empty skill`)\n }\n return { skill: text }\n }\n\n if (key === 'loadout') {\n const text = parseScalarText((value as RawRequirementNode)[key])\n if (!text) {\n throw new Error(`Requirement node ${location} has empty loadout`)\n }\n return { loadout: text }\n }\n\n if (key === 'agent') {\n const node = normalizeAgentRequirement((value as RawRequirementNode)[key])\n if (!node) {\n throw new Error(`Requirement node ${location} has invalid agent requirement`)\n }\n return node\n }\n\n if (key === 'model') {\n const node = normalizeModelRequirement((value as RawRequirementNode)[key])\n if (!node) {\n throw new Error(`Requirement node ${location} has invalid model requirement`)\n }\n return node\n }\n\n throw new Error(`Unexpected requirement key ${key} at ${location}`)\n}\n\nfunction normalizeAgentRequirement(value: unknown): { agent: { provider: string } } | undefined {\n if (!isObject(value)) {\n return undefined\n }\n\n const provider = parseScalarText(value.provider)\n if (!provider) {\n return undefined\n }\n\n return {\n agent: {\n provider: provider.toLowerCase(),\n },\n }\n}\n\nfunction normalizeModelRequirement(value: unknown): { model: { provider?: string; name?: string } } | undefined {\n if (!isObject(value)) {\n return undefined\n }\n\n const provider = parseScalarText(value.provider)\n const name = parseScalarText(value.name)\n\n if (!provider && !name) {\n return undefined\n }\n\n return {\n model: {\n ...(provider ? { provider: provider.toLowerCase() } : {}),\n ...(name ? { name } : {}),\n },\n }\n}\n\nexport function evaluateRequirements(\n proofs: EvaluationProof[],\n provenCommits: string[],\n provenRepos: string[],\n requirements: NormalizedRequirements,\n): CredentialRequirementResult {\n const proofSkills = [] as Array<{ id: string; version?: string }>\n const proofLoadouts = [] as string[]\n const proofAgents = [] as string[]\n const proofModels = [] as Array<{ provider?: string; name?: string }>\n\n const dedupedCommits = Array.from(new Set((provenCommits || []).filter(Boolean)))\n const dedupedRepos = Array.from(new Set((provenRepos || []).filter(Boolean)))\n\n for (const proofEntry of proofs) {\n const proof = proofEntry.proof\n for (const skill of proof.skills) {\n const parsed = parseIdentifierWithVersion(skill.id)\n if (parsed.id) {\n proofSkills.push({ id: parsed.id, version: parsed.version })\n }\n }\n\n for (const loadout of proof.loadouts) {\n const normalized = parseScalarText(loadout)\n if (normalized) {\n proofLoadouts.push(normalized)\n }\n }\n\n if (proof.agent?.provider && typeof proof.agent.provider === 'string') {\n proofAgents.push(proof.agent.provider)\n }\n\n const modelProvider = proof.model?.provider\n const modelName = proof.model?.name\n if (typeof modelProvider === 'string' || typeof modelName === 'string') {\n proofModels.push({ provider: modelProvider, name: modelName })\n }\n }\n\n const requirementResult = evaluateRequirementTree(requirements.tree, {\n skills: proofSkills,\n loadouts: proofLoadouts,\n agents: proofAgents,\n models: proofModels,\n })\n\n const checks = requirementResult.checks\n const resultReasons = [...failedRequirementReasons(checks)]\n\n if (requirements.minCommits > dedupedCommits.length) {\n resultReasons.push(`minimum required commits not met: have ${dedupedCommits.length}, need ${requirements.minCommits}`)\n requirementResult.passed = false\n }\n\n if (requirements.minRepositories > dedupedRepos.length) {\n resultReasons.push(`minimum required repositories not met: have ${dedupedRepos.length}, need ${requirements.minRepositories}`)\n requirementResult.passed = false\n }\n\n return {\n passed: requirementResult.passed,\n proofs,\n provenCommits: dedupedCommits,\n provenRepos: dedupedRepos,\n checks,\n reasons: resultReasons,\n noExplicitChecks: requirementResult.noExplicitChecks,\n }\n}\n\nfunction evaluateRequirementTree(\n node: RequirementNode,\n context: { skills: Array<{ id: string; version?: string }>; loadouts: string[]; agents: string[]; models: Array<{ provider?: string; name?: string }> },\n): { passed: boolean; checks: RequirementCheck[]; noExplicitChecks: boolean } {\n if ('and' in node) {\n const checks: RequirementCheck[] = []\n const childResults = [] as { passed: boolean; checks: RequirementCheck[]; noExplicitChecks: boolean }[]\n let noExplicitChecks = true\n\n for (const child of node.and) {\n const childResult = evaluateRequirementTree(child, context)\n checks.push(...childResult.checks)\n childResults.push(childResult)\n if (!childResult.noExplicitChecks) {\n noExplicitChecks = false\n }\n }\n\n return {\n passed: childResults.every((entry) => entry.passed),\n checks,\n noExplicitChecks,\n }\n }\n\n if ('or' in node) {\n const checks: RequirementCheck[] = []\n const childResults = [] as { passed: boolean; checks: RequirementCheck[]; noExplicitChecks: boolean }[]\n let noExplicitChecks = true\n\n for (const child of node.or) {\n const childResult = evaluateRequirementTree(child, context)\n checks.push(...childResult.checks)\n childResults.push(childResult)\n if (!childResult.noExplicitChecks) {\n noExplicitChecks = false\n }\n }\n\n return {\n passed: childResults.some((entry) => entry.passed),\n checks,\n noExplicitChecks,\n }\n }\n\n if ('skill' in node) {\n const parsed = parseIdentifierWithVersion(node.skill)\n const satisfied = proofSkillsMatch(context.skills, parsed)\n return {\n passed: satisfied,\n checks: [{ type: 'skill', requirement: node.skill, satisfied }],\n noExplicitChecks: false,\n }\n }\n\n if ('loadout' in node) {\n const parsed = parseTextRequirement(node.loadout)\n const satisfied = context.loadouts.includes(node.loadout) || (parsed && parsed.id !== '' && context.loadouts.includes(parsed.id))\n\n return {\n passed: satisfied,\n checks: [{ type: 'loadout', requirement: node.loadout, satisfied }],\n noExplicitChecks: false,\n }\n }\n\n if ('agent' in node) {\n const expectedProvider = normalizeRequirementText(node.agent.provider)\n const satisfied = context.agents.some((provider) => provider === expectedProvider)\n return {\n passed: satisfied,\n checks: [{ type: 'agent', requirement: `provider=${expectedProvider}`, satisfied }],\n noExplicitChecks: false,\n }\n }\n\n if ('model' in node) {\n const expectedProvider = normalizeRequirementText(node.model.provider)\n const expectedName = normalizeRequirementText(node.model.name)\n const satisfied = context.models.some((candidate) => {\n const hasProvider = !expectedProvider || candidate.provider === expectedProvider\n const hasName = !expectedName || (candidate.name && candidate.name === expectedName)\n return hasProvider && hasName\n })\n\n const parts = [] as string[]\n if (expectedProvider) {\n parts.push(`provider=${expectedProvider}`)\n }\n if (expectedName) {\n parts.push(`name=${expectedName}`)\n }\n\n return {\n passed: satisfied,\n checks: [{ type: 'model', requirement: parts.join(',') || 'model', satisfied }],\n noExplicitChecks: false,\n }\n }\n\n throw new Error('Unknown requirement node encountered during evaluation')\n}\n\nfunction failedRequirementReasons(checks: RequirementCheck[]): string[] {\n return checks.filter((entry) => !entry.satisfied).map((entry) => `${entry.type} ${entry.requirement} not met`)\n}\n\nfunction proofSkillsMatch(proofSkills: Array<{ id: string; version?: string }>, parsed: { id: string; version?: string }): boolean {\n return proofSkills.some((skill) => matchesId(skill.id, skill.version, parsed))\n}\n\nfunction matchesId(actualId: string, actualVersion: string | undefined, expected: { id: string; version?: string }): boolean {\n if (actualId !== expected.id) {\n return false\n }\n\n if (!expected.version) {\n return true\n }\n\n return actualVersion === expected.version\n}\n\nfunction parseTextRequirement(value: unknown): { id: string; version?: string } {\n return parseIdentifierWithVersion(value)\n}\n\nfunction parseIdentifierWithVersion(value: unknown): { id: string; version?: string } {\n const trimmed = parseScalarText(value)\n if (!trimmed) {\n return { id: '' }\n }\n\n const parts = trimmed.split('@')\n return {\n id: parts[0],\n version: parts.length > 1 ? parts.slice(1).join('@') : undefined,\n }\n}\n\nfunction normalizeRequirementText(value: unknown): string {\n return typeof value === 'string' ? value.trim().toLowerCase() : ''\n}\n\nfunction parseScalarText(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined\n }\n const text = value.trim()\n return text || undefined\n}\n\nfunction normalizeNonNegativeInteger(value: unknown, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n return fallback\n }\n\n return Math.floor(value)\n}\n\nfunction isObject(value: unknown): value is RawRequirementNode {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeCredentialIndexEntries(entries: unknown): CredentialIndexEntry[] {\n if (!Array.isArray(entries)) {\n return []\n }\n\n const normalized = [] as CredentialIndexEntry[]\n for (const entry of entries) {\n const normalizedEntry = normalizeCredentialIndexEntry(entry)\n if (normalizedEntry) {\n normalized.push(normalizedEntry)\n }\n }\n\n return normalized.sort((left, right) => left.id.localeCompare(right.id))\n}\n\nfunction normalizeCredentialIndexEntry(raw: unknown): CredentialIndexEntry | undefined {\n if (!isObject(raw)) {\n return undefined\n }\n\n const id = parseScalarText(raw.id)\n if (!id) {\n return undefined\n }\n\n try {\n return {\n id,\n name: parseScalarText(raw.name),\n description: parseScalarText(raw.description),\n requirements: normalizeRequirements(raw.requirements),\n }\n } catch {\n return undefined\n }\n}\n\nexport async function getCredentialIndexEntries(options: CredentialIndexLoadOptions = {}): Promise<CredentialIndexEntry[]> {\n return loadCredentialIndex(options)\n}\n","import { Command } from 'commander'\n\ntype OutputMode = 'text' | 'json'\n\nexport function getOutputMode(program: Command): OutputMode {\n const raw = program.opts<{ json?: boolean }>().json\n return raw ? 'json' : 'text'\n}\n\nexport function printResult<T>(mode: OutputMode, label: string, data: T): void {\n if (mode === 'json') {\n process.stdout.write(`${JSON.stringify({ label, data })}\\n`)\n return\n }\n process.stdout.write(`${label}: ${JSON.stringify(data)}\\n`)\n}\n\nexport function printLines(lines: string[]): void {\n process.stdout.write(`${lines.join('\\n')}\\n`)\n}\n\nexport function printError(message: string): void {\n process.stderr.write(`${message}\\n`)\n}\n","import { isEnabled } from '@/core/state'\nimport { gitRemote } from '@/core/git'\nimport { loadProofFromRepo } from '@/core/progress'\nimport { addTrackedCredential, loadRepos, loadTrackedCredentials, removeTrackedCredential } from '@/core/config'\nimport { assertNonEmpty } from '@/core/validation'\nimport { evaluateRequirements, getCredentialIndexEntries, type CredentialIndexEntry, type CredentialRequirementResult, type RequirementCheck } from '@/core/credentials'\nimport { printLines } from '@/lib/output'\n\ntype ProgressOutputMode = {\n outputMode?: 'text' | 'json'\n refreshIndex?: boolean\n}\n\ntype EvaluatedCredentialResult = {\n credentialId: string\n name?: string\n description?: string\n passed: boolean\n status: 'eligible' | 'blocked'\n reasons: string[]\n checks: RequirementCheck[]\n requiredMinCommits: number\n requiredMinRepositories: number\n provenCommits: number\n provenRepositories: number\n proofFiles: number\n}\n\ntype ProgressPayload = {\n trackedCredentials: number\n trackedRepositories: number\n evidence: {\n proofFiles: number\n provenCommits: number\n provenRepositories: number\n }\n credentials: EvaluatedCredentialResult[]\n}\n\ntype ProofEntry = {\n proof: {\n commit: string\n loadouts: string[]\n skills: Array<{ id: string; version?: string }>\n agent?: { provider?: string }\n model?: { provider?: string; name?: string }\n version: number\n timestamp: string\n }\n}\n\nasync function resolveTrackedRepos(): Promise<string[]> {\n const data = await loadRepos()\n const repoPaths = new Set<string>()\n const repos: string[] = []\n\n for (const entry of data.repos) {\n if (repoPaths.has(entry.path)) {\n continue\n }\n repoPaths.add(entry.path)\n\n if (await isEnabled(entry.path)) {\n repos.push(entry.path)\n }\n }\n\n return repos\n}\n\nexport async function runProgress(options: ProgressOutputMode = {}): Promise<void> {\n const tracked = await resolveTrackedRepos()\n const trackedCredentials = await loadTrackedCredentials()\n\n const trackedCredList = trackedCredentials.credentials\n if (!trackedCredList.length) {\n if (options.outputMode === 'json') {\n printJsonResult(\n buildPayload({\n tracked,\n trackedCredentialsCount: 0,\n proofFiles: 0,\n provenCommits: 0,\n provenRepositories: 0,\n evaluated: [],\n }),\n )\n return\n }\n process.stdout.write('no credentials tracked\\n')\n return\n }\n\n const indexById = mapCredentials(await getCredentialIndexEntries({ refresh: options.refreshIndex }))\n\n let proofFiles = 0\n const proofs: ProofEntry[] = []\n const provenRepos = new Set<string>()\n const provenCommits = new Set<string>()\n\n for (const repoPath of tracked) {\n const proofsInRepo = await loadProofFromRepo(repoPath)\n proofFiles += proofsInRepo.length\n\n if (!proofsInRepo.length) {\n continue\n }\n\n const remote = (await gitRemote(repoPath)) || repoPath\n provenRepos.add(remote)\n\n for (const proof of proofsInRepo) {\n if (proof?.commit) {\n provenCommits.add(proof.commit)\n }\n proofs.push({ proof })\n }\n }\n\n const provenCommitList = Array.from(provenCommits)\n const provenRepoList = Array.from(provenRepos)\n\n const payload = buildPayload({\n tracked,\n trackedCredentialsCount: trackedCredList.length,\n proofFiles,\n provenCommits: provenCommitList.length,\n provenRepositories: provenRepoList.length,\n evaluated: [],\n })\n\n const evaluated = [] as EvaluatedCredentialResult[]\n for (const entry of trackedCredList) {\n const definition = indexById.get(entry.id)\n if (!definition) {\n evaluated.push(makeMissingDefinitionResult(entry.id, proofs.length, provenCommitList.length, provenRepoList.length))\n continue\n }\n\n const result = evaluateRequirements(proofs, provenCommitList, provenRepoList, definition.requirements)\n evaluated.push(formatResult(entry.id, definition, result, proofs.length, provenCommitList.length, provenRepoList.length))\n }\n\n payload.credentials = evaluated\n\n if (options.outputMode === 'json') {\n printJsonResult(payload)\n return\n }\n\n const lines = [] as string[]\n lines.push(`tracked credentials: ${trackedCredList.length}`)\n lines.push(`tracked repositories: ${tracked.length}`)\n lines.push(`proof files: ${proofFiles}`)\n lines.push(`proof commits: ${provenCommitList.length}`)\n lines.push(`proof repositories: ${provenRepoList.length}`)\n lines.push('')\n\n for (const entry of evaluated) {\n lines.push(`${entry.credentialId}: ${entry.status}`)\n lines.push(` checks: ${entry.passed ? 'passed' : 'blocked'}`)\n lines.push(` proof scope: ${entry.proofFiles} proofs, ${entry.provenCommits}/${entry.requiredMinCommits} commits, ${entry.provenRepositories}/${entry.requiredMinRepositories} repositories`)\n if (entry.reasons.length) {\n lines.push(' reasons:')\n for (const reason of entry.reasons) {\n lines.push(` - ${reason}`)\n }\n }\n lines.push('')\n }\n\n printLines(lines)\n}\n\nexport async function runProgressTrack(rawId: string): Promise<void> {\n const id = assertNonEmpty(rawId, 'credential id')\n const indexById = mapCredentials(await getCredentialIndexEntries())\n if (!indexById.has(id)) {\n throw new Error(`credential not found in credential index: ${id}`)\n }\n\n const added = await addTrackedCredential(id)\n if (!added) {\n process.stdout.write(`credential already tracked: ${id}\\n`)\n return\n }\n process.stdout.write(`tracking credential: ${id}\\n`)\n}\n\nexport async function runProgressUntrack(rawId: string): Promise<void> {\n const id = assertNonEmpty(rawId, 'credential id')\n const removed = await removeTrackedCredential(id)\n if (!removed) {\n process.stdout.write(`credential not tracked: ${id}\\n`)\n return\n }\n process.stdout.write(`untracked credential: ${id}\\n`)\n}\n\nfunction buildPayload(params: {\n tracked: string[]\n trackedCredentialsCount: number\n proofFiles: number\n provenCommits: number\n provenRepositories: number\n evaluated: EvaluatedCredentialResult[]\n}): ProgressPayload {\n return {\n trackedCredentials: params.trackedCredentialsCount,\n trackedRepositories: params.tracked.length,\n evidence: {\n proofFiles: params.proofFiles,\n provenCommits: params.provenCommits,\n provenRepositories: params.provenRepositories,\n },\n credentials: params.evaluated,\n }\n}\n\nfunction printJsonResult(payload: ProgressPayload) {\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n}\n\nfunction mapCredentials(index: CredentialIndexEntry[]): Map<string, CredentialIndexEntry> {\n return new Map(index.map((entry) => [entry.id, entry]))\n}\n\nfunction makeMissingDefinitionResult(\n credentialId: string,\n proofFiles: number,\n provenCommits: number,\n provenRepositories: number,\n): EvaluatedCredentialResult {\n return {\n credentialId,\n passed: false,\n status: 'blocked',\n reasons: ['credential definition is not available'],\n checks: [],\n requiredMinCommits: 0,\n requiredMinRepositories: 0,\n provenCommits,\n provenRepositories,\n proofFiles,\n }\n}\n\nfunction formatResult(\n credentialId: string,\n definition: CredentialIndexEntry,\n result: CredentialRequirementResult,\n proofFiles: number,\n provenCommits: number,\n provenRepositories: number,\n): EvaluatedCredentialResult {\n return {\n credentialId,\n name: definition.name,\n description: definition.description,\n passed: result.passed,\n status: result.passed ? 'eligible' : 'blocked',\n reasons: result.reasons,\n checks: result.checks,\n requiredMinCommits: definition.requirements.minCommits,\n requiredMinRepositories: definition.requirements.minRepositories,\n provenCommits,\n provenRepositories,\n proofFiles,\n }\n}\n","import path from 'node:path'\nimport fs from 'node:fs/promises'\nimport { getProvider } from '@/providers'\nimport { loadGlobalConfig } from '@/core/config'\nimport { assertNonEmpty, splitArgPair, splitSkillIdentifier, normalizeSkillId } from '@/core/validation'\nimport { isEnabled } from '@/core/state'\nimport { loadProofFromRepo } from '@/core/progress'\nimport { loadPending, normalizeSkillIds } from '@/core/proof'\nimport { pendingPath } from '@/core/paths'\nimport { writeJson } from '@/core/fs'\nimport { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport ora from 'ora'\n\nconst execPromise = promisify(execFile)\n\ntype SearchIndexEntry = {\n id: string\n name?: string\n path?: string\n url?: string\n owner?: string\n slug?: string\n runtime?: string[]\n tags?: string[]\n updatedAt?: string\n}\n\ntype SearchIndexOptions = {\n source?: string\n limit?: number\n outputMode?: 'text' | 'json'\n}\n\ntype SearchResult = {\n id: string\n name?: string\n path?: string\n url?: string\n owner?: string\n slug?: string\n runtime?: string[]\n tags?: string[]\n}\n\ntype SkillInspectOptions = {\n outputMode?: 'text' | 'json'\n}\n\ntype SkillManifestDetails = {\n url: string\n title?: string\n summary?: string\n error?: string\n}\n\nexport async function runSkillsPublish(slug: string): Promise<void> {\n const ref = assertNonEmpty(slug, 'skill id')\n const { owner, slug: slugPart } = splitArgPair(ref)\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const files = await Promise.all([\n fs.access(path.join(cwd, 'SKILL.md')).then(() => true).catch(() => false),\n fs.access(path.join(cwd, 'skill.yaml')).then(() => true).catch(() => false),\n ])\n if (!files[0] || !files[1]) {\n throw new Error('SKILL.md and skill.yaml are required for publishing')\n }\n\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n await provider.getUser()\n\n const destination = 'skillcraft-gg/skills-registry'\n const branch = `skillcraft-skill-${owner}-${slugPart}`\n const temp = path.join(process.cwd(), '.skillcraft-temp-skill-publish')\n\n try {\n await fs.rm(temp, { force: true, recursive: true })\n await provider.cloneRepo(destination, temp)\n await runGit(temp, ['checkout', '-B', branch])\n\n const target = path.join(temp, 'skills', owner, slugPart)\n await fs.rm(target, { force: true, recursive: true })\n await fs.mkdir(path.dirname(target), { recursive: true })\n await fs.cp(cwd, target, { recursive: true })\n\n await runGit(temp, ['add', `skills/${owner}/${slugPart}`])\n await runGit(temp, ['commit', '-m', `Publish skill ${ref}`]).catch(() => {\n throw new Error('nothing to commit; skill may already be published')\n })\n await runGit(temp, ['push', '-u', 'origin', branch]).catch(() => {\n throw new Error('unable to push skill publish branch')\n })\n await provider.createPullRequest(destination, branch, `Publish skill: ${ref}`).catch(() => {\n process.stdout.write('unable to create PR automatically. Please open one manually from your branch.\\n')\n })\n\n process.stdout.write(`published skill ${ref} from ${destination}\\n`)\n } finally {\n await fs.rm(temp, { force: true, recursive: true })\n }\n}\n\nexport async function runSkillsAdd(rawId: string): Promise<void> {\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const cleanInput = assertNonEmpty(rawId, 'skill id')\n const parsed = splitSkillIdentifier(cleanInput)\n if (!parsed.id) {\n throw new Error('invalid skill id format')\n }\n\n const index = await loadSearchIndex()\n if (!index.has(parsed.id)) {\n throw new Error(`skill ${parsed.id} is not listed in the search index`)\n }\n\n const normalized = normalizeSkillIds([`${parsed.id}${parsed.version ? `@${parsed.version}` : ''}`])\n const existing = await loadPending(cwd)\n const next = normalizeSkillIds([...existing, ...normalized])\n\n await writeJson(pendingPath(cwd), { skills: next })\n process.stdout.write(`queued skill: ${normalized[0]}\\n`)\n}\n\nexport async function runSkillsValidate(): Promise<void> {\n const cwd = process.cwd()\n const checks = [\n ['SKILL.md', await exists(path.join(cwd, 'SKILL.md'))],\n ['skill.yaml', await exists(path.join(cwd, 'skill.yaml'))],\n ]\n for (const [name, ok] of checks) {\n process.stdout.write(`${name}: ${ok ? 'ok' : 'missing'}\\n`)\n }\n}\n\nexport async function runSkillsList(): Promise<void> {\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const [proofs, pending] = await Promise.all([loadProofFromRepo(cwd), loadPending(cwd)])\n const skills = new Set<string>()\n for (const proof of proofs) {\n for (const item of proof.skills) {\n skills.add(item.id)\n }\n }\n for (const skill of pending) {\n skills.add(skill)\n }\n\n if (!skills.size) {\n process.stdout.write('no skills detected\\n')\n return\n }\n\n const list = Array.from(skills).sort().join('\\n')\n process.stdout.write(`skills detected (${skills.size}):\\n${list}\\n`)\n}\n\nexport async function runSkillsSearch(rawQuery?: string, options: SearchIndexOptions = {}): Promise<void> {\n const entries = await loadSearchIndexEntries(options.outputMode)\n if (!entries.length) {\n if (options.outputMode === 'json') {\n process.stdout.write(`${JSON.stringify({\n query: rawQuery?.trim(),\n source: options.source?.trim(),\n limit: getSearchLimit(options.limit),\n count: 0,\n results: [],\n message: 'no skills indexed',\n })}\\n`)\n } else {\n process.stdout.write('no skills indexed\\n')\n }\n return\n }\n\n const query = rawQuery?.trim().toLowerCase()\n const sourceFilter = options.source?.trim().toLowerCase()\n const limit = getSearchLimit(options.limit)\n\n const filtered = entries.filter((entry) => {\n if (sourceFilter) {\n const source = getSkillSource(entry.id)\n if (source !== sourceFilter) {\n return false\n }\n }\n\n if (!query) {\n return true\n }\n\n const fields = [\n entry.id,\n entry.name,\n entry.owner,\n entry.slug,\n entry.path,\n entry.url,\n ...(entry.runtime || []),\n ...(entry.tags || []),\n ].filter((value): value is string => !!value).map((value) => value.toLowerCase())\n\n return fields.some((value) => value.includes(query))\n })\n\n const sorted = [...filtered].sort((left, right) => {\n const leftName = (left.name || left.id).toLowerCase()\n const rightName = (right.name || right.id).toLowerCase()\n if (leftName === rightName) {\n return left.id.localeCompare(right.id)\n }\n return leftName.localeCompare(rightName)\n })\n\n const shown = sorted.slice(0, limit)\n if (!shown.length) {\n const message = query ? `no skills match \"${rawQuery?.trim()}\"` : 'no skills match current filters'\n if (options.outputMode === 'json') {\n process.stdout.write(`${JSON.stringify({\n query: rawQuery?.trim(),\n source: options.source?.trim(),\n limit,\n count: 0,\n results: [],\n message,\n })}\\n`)\n } else {\n process.stdout.write(`${message}\\n`)\n }\n return\n }\n\n const title = query ? `skills matching \"${rawQuery?.trim()}\"` : 'skills index'\n const lines = shown.map((entry) => {\n const runtime = (entry.runtime || []).length ? ` [${entry.runtime!.join(', ')}]` : ''\n const tags = (entry.tags || []).length ? ` {${entry.tags!.join(', ')}}` : ''\n const updatedLabel = formatUpdatedAt(entry.updatedAt)\n const name = formatSearchResultName(entry)\n return `${entry.id}${name ? ` — ${name}` : ''}${runtime}${tags}${updatedLabel}`\n })\n\n if (options.outputMode === 'json') {\n const payload = {\n query: rawQuery?.trim(),\n source: options.source?.trim(),\n limit,\n count: shown.length,\n total: sorted.length,\n results: shown.map((entry) => {\n const row: SearchResult = {\n id: entry.id,\n name: entry.name,\n path: entry.path,\n url: entry.url,\n owner: entry.owner,\n slug: entry.slug,\n runtime: entry.runtime,\n tags: entry.tags,\n }\n return row\n }),\n }\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n return\n }\n\n process.stdout.write(`${title} (${shown.length}):\\n${lines.join('\\n')}\\n`)\n}\n\nexport async function runSkillsInspect(rawId: string, options: SkillInspectOptions = {}): Promise<void> {\n const cleanId = assertNonEmpty(rawId, 'skill id')\n const parsed = splitSkillIdentifier(cleanId)\n if (!parsed.id) {\n throw new Error('invalid skill id format')\n }\n\n const entries = await loadSearchIndexEntries(options.outputMode)\n const match = entries.find((entry) => entry.id === parsed.id)\n if (!match) {\n throw new Error(`skill ${parsed.id} is not listed in the search index`)\n }\n\n const manifest = await loadSkillManifest(match)\n if (options.outputMode === 'json') {\n const payload = {\n id: match.id,\n name: match.name,\n source: getSkillSource(match.id),\n owner: match.owner,\n slug: match.slug,\n path: match.path,\n url: match.url,\n runtime: match.runtime,\n tags: match.tags,\n updatedAt: match.updatedAt,\n manifest,\n version: parsed.version,\n }\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n return\n }\n\n const lines = formatInspectOutput(match, manifest)\n process.stdout.write(`${lines}\\n`)\n}\n\nfunction formatInspectOutput(entry: SearchIndexEntry, manifest?: SkillManifestDetails): string {\n const lines: string[] = []\n lines.push(`skill: ${entry.id}`)\n\n if (entry.name) {\n lines.push(`name: ${entry.name}`)\n }\n\n const source = getSkillSource(entry.id)\n if (source) {\n lines.push(`source: ${source}`)\n }\n\n if (entry.owner) {\n lines.push(`owner: ${entry.owner}`)\n }\n\n if (entry.slug) {\n lines.push(`slug: ${entry.slug}`)\n }\n\n if (entry.runtime && entry.runtime.length) {\n lines.push(`runtime: ${entry.runtime.join(', ')}`)\n }\n\n if (entry.tags && entry.tags.length) {\n lines.push(`tags: ${entry.tags.join(', ')}`)\n }\n\n if (entry.updatedAt) {\n lines.push(`updated: ${entry.updatedAt}`)\n }\n\n if (entry.path) {\n lines.push(`path: ${entry.path}`)\n }\n\n if (entry.url) {\n lines.push(`url: ${entry.url}`)\n }\n\n if (manifest) {\n lines.push(`manifest: ${manifest.url}`)\n if (manifest.title) {\n lines.push(`manifest title: ${manifest.title}`)\n }\n if (manifest.summary) {\n lines.push(`manifest summary: ${manifest.summary}`)\n }\n if (manifest.error) {\n lines.push(`manifest fetch: ${manifest.error}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nasync function loadSkillManifest(entry: SearchIndexEntry): Promise<SkillManifestDetails | undefined> {\n const manifestUrl = buildSkillManifestUrl(entry.url)\n if (!manifestUrl) {\n return undefined\n }\n\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, 5000)\n\n try {\n const response = await fetch(manifestUrl, {\n headers: {\n 'user-agent': 'skillcraft-cli',\n },\n signal: controller.signal,\n })\n\n if (!response.ok) {\n return {\n url: manifestUrl,\n error: `unable to fetch manifest (${response.status})`,\n }\n }\n\n const text = await response.text()\n if (isHtmlDocument(text)) {\n return {\n url: manifestUrl,\n error: 'unable to parse manifest (not markdown)',\n }\n }\n const parsed = parseSkillManifest(text)\n return {\n url: manifestUrl,\n title: parsed.title,\n summary: parsed.summary,\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n url: manifestUrl,\n error: 'manifest fetch timed out',\n }\n }\n\n return {\n url: manifestUrl,\n error: error instanceof Error ? error.message : 'failed to fetch manifest',\n }\n } finally {\n clearTimeout(timeout)\n }\n}\n\nfunction buildSkillManifestUrl(rawUrl?: string): string | undefined {\n if (!rawUrl) {\n return undefined\n }\n\n const url = rawUrl.trim()\n if (!url) {\n return undefined\n }\n\n const manifestUrl = url.endsWith('/SKILL.md') ? url : url.endsWith('/') ? `${url}SKILL.md` : `${url}/SKILL.md`\n return toRawManifestUrl(manifestUrl)\n}\n\nfunction toRawManifestUrl(rawUrl: string): string {\n try {\n const parsed = new URL(rawUrl)\n if (parsed.hostname !== 'github.com') {\n return rawUrl\n }\n\n const parts = parsed.pathname.split('/').filter(Boolean)\n const blobIndex = parts.indexOf('blob')\n if (blobIndex !== 2 || parts.length < blobIndex + 2) {\n return rawUrl\n }\n\n const owner = parts[0]\n const repo = parts[1]\n const remainingPath = parts.slice(blobIndex + 1)\n if (!owner || !repo || !remainingPath.length) {\n return rawUrl\n }\n\n const rawParts = [owner, repo, 'raw', 'refs', 'heads', ...remainingPath]\n return `${parsed.protocol}//${parsed.host}/${rawParts.join('/')}`\n } catch {\n return rawUrl\n }\n}\n\nfunction isHtmlDocument(input: string): boolean {\n const text = input.replace(/^\\s+/, '').toLowerCase()\n return text.startsWith('<!doctype html') || text.startsWith('<html')\n}\n\nfunction parseSkillManifest(input: string): { title?: string; summary?: string } {\n const normalized = input.replace(/\\r\\n/g, '\\n')\n const lines = normalized.split('\\n')\n let index = 0\n\n if ((lines[0] || '').trim() === '---') {\n index = 1\n while (index < lines.length && lines[index].trim() !== '---') {\n index += 1\n }\n if (index < lines.length && lines[index].trim() === '---') {\n index += 1\n }\n }\n\n let title: string | undefined\n let summary: string | undefined\n\n for (let i = index; i < lines.length; i += 1) {\n const line = lines[i].trim()\n if (!line) {\n if (summary) {\n break\n }\n continue\n }\n\n if (!title && line.startsWith('#')) {\n title = line.replace(/^#+\\s*/, '').trim()\n continue\n }\n\n if (!summary && !line.startsWith('>')) {\n summary = line\n break\n }\n }\n\n return {\n title,\n summary,\n }\n}\n\nfunction isJson(value: unknown): value is SearchIndexEntry[] {\n return Array.isArray(value)\n}\n\nasync function loadSearchIndex(): Promise<Set<string>> {\n const entries = await loadSearchIndexEntries()\n return new Set(entries.map((entry) => entry.id))\n}\n\nasync function loadSearchIndexEntries(outputMode: SearchIndexOptions['outputMode'] = undefined): Promise<SearchIndexEntry[]> {\n const explicitPath = process.env.SKILLCRAFT_SEARCH_INDEX_PATH?.trim()\n const source = explicitPath || process.env.SKILLCRAFT_SEARCH_INDEX_URL || 'https://skillcraft.gg/skills-registry/search/index.json'\n const loadEntries = async () => {\n if (explicitPath) {\n const raw = await fs.readFile(explicitPath, 'utf8')\n const parsed = JSON.parse(raw)\n return normalizeSearchIndexEntries(isJson(parsed) ? parsed : [])\n }\n\n const url = process.env.SKILLCRAFT_SEARCH_INDEX_URL || 'https://skillcraft.gg/skills-registry/search/index.json'\n const response = await fetch(url, {\n headers: {\n 'user-agent': 'skillcraft-cli',\n },\n })\n if (!response.ok) {\n throw new Error(`failed to download search index from ${url}`)\n }\n\n const parsed = await response.json()\n return normalizeSearchIndexEntries(isJson(parsed) ? parsed : [])\n }\n\n if (!shouldShowSearchSpinner(outputMode)) {\n return loadEntries()\n }\n\n const action = explicitPath ? `reading local index from ${source}` : `downloading index from ${source}`\n const spinner = ora({\n text: `Loading ${action}...`,\n }).start()\n\n try {\n const entries = await loadEntries()\n spinner.succeed(`loaded ${entries.length} indexed entries`)\n return entries\n } catch (error) {\n spinner.fail('failed to load search index')\n throw error\n }\n}\n\nfunction shouldShowSearchSpinner(outputMode: SearchIndexOptions['outputMode']): boolean {\n if (outputMode !== 'text') {\n return false\n }\n\n return process.stdout.isTTY === true || process.stderr.isTTY === true\n}\n\nfunction normalizeSearchIndexEntries(entries: SearchIndexEntry[]): SearchIndexEntry[] {\n return entries\n .map((entry) => normalizeSearchIndexEntry(entry))\n .filter((entry): entry is SearchIndexEntry => !!entry)\n}\n\nfunction normalizeSearchIndexEntry(raw: SearchIndexEntry): SearchIndexEntry | undefined {\n const rawId = normalizeString(raw.id)\n const id = normalizeSkillId(rawId)\n if (!id) {\n return undefined\n }\n\n return {\n id,\n name: normalizeText(raw.name),\n path: normalizeText(raw.path),\n url: normalizeText(raw.url),\n owner: normalizeText(raw.owner),\n slug: normalizeText(raw.slug),\n runtime: normalizeStringArray(raw.runtime),\n tags: normalizeStringArray(raw.tags),\n updatedAt: normalizeText(raw.updatedAt),\n }\n}\n\nfunction normalizeString(value: unknown): string {\n return String(value || '').trim()\n}\n\nfunction normalizeText(value: unknown): string | undefined {\n const text = normalizeString(value)\n return text || undefined\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (value === undefined) {\n return []\n }\n\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean)\n }\n\n if (!Array.isArray(value)) {\n return []\n }\n\n const normalized: string[] = []\n for (const item of value) {\n if (typeof item !== 'string') {\n continue\n }\n const text = item.trim()\n if (text) {\n normalized.push(text)\n }\n }\n return normalized\n}\n\nfunction getSkillSource(id: string): string | undefined {\n const separatorIndex = id.indexOf(':')\n if (separatorIndex < 1) {\n return undefined\n }\n\n const source = id.slice(0, separatorIndex).trim()\n if (!source) {\n return undefined\n }\n\n return source.toLowerCase()\n}\n\nfunction getSearchLimit(raw: number | undefined): number {\n const requestedLimit = raw === undefined ? 20 : Math.floor(raw)\n return Number.isFinite(requestedLimit) && requestedLimit > 0 ? requestedLimit : 20\n}\n\nfunction formatSearchResultName(entry: SearchIndexEntry): string {\n const name = (entry.name || '').trim()\n if (!name) {\n return ''\n }\n\n const slug = deriveSearchResultSlug(entry)\n if (!slug) {\n return name\n }\n\n if (name.toLowerCase() === slug.toLowerCase()) {\n return ''\n }\n\n return name\n}\n\nfunction deriveSearchResultSlug(entry: SearchIndexEntry): string {\n if (entry.slug && entry.slug.trim()) {\n return entry.slug.trim()\n }\n\n const id = entry.id.trim()\n const separator = id.indexOf(':')\n const suffix = separator >= 0 ? id.slice(separator + 1) : id\n const parts = suffix.split('/').filter(Boolean)\n\n return parts.length ? parts[parts.length - 1] : suffix\n}\n\nfunction formatUpdatedAt(value?: string): string {\n if (!value) {\n return ''\n }\n\n const updatedAt = new Date(value)\n if (Number.isNaN(updatedAt.getTime())) {\n return ''\n }\n\n return ` (updated ${updatedAt.toISOString().slice(0, 10)})`\n}\n\nasync function exists(pathToCheck: string): Promise<boolean> {\n try {\n await fs.access(pathToCheck)\n return true\n } catch {\n return false\n }\n}\n\nasync function runGit(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execPromise('git', args, { cwd })\n return stdout.trim()\n}\n\nexport async function runSkillsValidateAndExit(): Promise<void> {\n await runSkillsValidate()\n}\n","import { mkdtemp, rm } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { git } from './git'\n\nexport type RemoteSourceEntry = {\n repo: string\n commits: string[]\n}\n\nexport type UnpushedCommit = {\n repo: string\n commit: string\n}\n\nexport type RepoRemote = {\n name: string\n url: string\n}\n\nexport function normalizeRemoteSource(rawRepo: string): string | undefined {\n const repo = rawRepo.trim()\n if (!repo) {\n return undefined\n }\n\n if (/^[a-zA-Z]:[\\\\/]/.test(repo) || repo.startsWith('/') || repo.startsWith('./') || repo.startsWith('../')) {\n return undefined\n }\n\n if (/^[a-z][a-z0-9+.-]*:/.test(repo)) {\n return repo\n }\n\n if (repo.startsWith('git@') || repo.startsWith('ssh://') || repo.startsWith('http://') || repo.startsWith('https://')) {\n return repo\n }\n\n if (repo.startsWith('file://')) {\n return repo\n }\n\n return undefined\n}\n\nexport async function listRemotes(repoPath: string): Promise<RepoRemote[]> {\n try {\n const raw = await git(['config', '--get-regexp', '^remote\\..*\\.url$'], repoPath)\n return raw\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const separator = line.indexOf(' ')\n if (separator === -1) {\n return undefined\n }\n\n const key = line.slice(0, separator)\n const url = line.slice(separator + 1).trim()\n const name = key.slice('remote.'.length, -'.url'.length)\n\n if (!url || !name) {\n return undefined\n }\n\n return { name, url }\n })\n .filter((value): value is RepoRemote => !!value)\n } catch {\n return []\n }\n}\n\nexport async function findUnpushedCommits(sources: ReadonlyArray<RemoteSourceEntry>): Promise<UnpushedCommit[]> {\n return findUnpushedCommitsWithOptions(sources, { normalize: true })\n}\n\nexport async function findUnpushedCommitsWithOptions(\n sources: ReadonlyArray<RemoteSourceEntry>,\n options: { normalize?: boolean } = {},\n): Promise<UnpushedCommit[]> {\n const normalize = options.normalize ?? true\n const unpushed: UnpushedCommit[] = []\n\n for (const source of sources) {\n const remote = normalize ? normalizeRemoteSource(source.repo) : source.repo\n if (!remote) {\n for (const commit of source.commits) {\n unpushed.push({ repo: source.repo, commit })\n }\n continue\n }\n\n const commitList = Array.from(new Set(source.commits.map((commit) => commit.trim()).filter(Boolean)))\n if (!commitList.length) {\n continue\n }\n\n const missing = await findMissingCommitsInRemote(remote, commitList)\n for (const commit of missing) {\n unpushed.push({ repo: remote, commit })\n }\n }\n\n return unpushed\n}\n\nexport async function findMissingCommitsInRemote(remoteUrl: string, commits: string[]): Promise<string[]> {\n const commitList = Array.from(new Set(commits.map((commit) => commit.trim()).filter(Boolean)))\n if (!commitList.length) {\n return []\n }\n\n const tempDir = await mkdtemp(path.join(os.tmpdir(), 'skillcraft-remote-check-'))\n try {\n try {\n await git(['clone', '--quiet', '--no-checkout', remoteUrl, tempDir], process.cwd())\n } catch {\n return commitList\n }\n\n const missing: string[] = []\n for (const commit of commitList) {\n const isPushed = await isCommitOnRemote(tempDir, commit)\n if (!isPushed) {\n missing.push(commit)\n }\n }\n\n return missing\n } finally {\n await rm(tempDir, { recursive: true, force: true })\n }\n}\n\nasync function isCommitOnRemote(repoDir: string, commit: string): Promise<boolean> {\n try {\n await git(['cat-file', '-e', `${commit}^{commit}`], repoDir)\n } catch {\n return false\n }\n\n try {\n const output = await git(['branch', '-r', '--contains', commit], repoDir)\n return !!output\n } catch {\n return false\n }\n}\n","import { isEnabled } from '@/core/state'\nimport { gitLogWithMessages } from '@/core/git'\nimport { readProof } from '@/core/proof'\nimport { findUnpushedCommitsWithOptions, listRemotes } from '@/core/remote'\n\nexport async function runVerify(): Promise<void> {\n const repoPath = process.cwd()\n if (!(await isEnabled(repoPath))) {\n throw new Error('Repository is not enabled')\n }\n\n const messages = await gitLogWithMessages(repoPath, 200)\n const referenced = messages\n .map((entry: { message: string }) => {\n const match = entry.message.match(/Skillcraft-Ref:\\s*(\\S+)/)\n return match?.[1]\n })\n .filter(Boolean) as string[]\n\n let missing = 0\n const proofCommits: string[] = []\n for (const id of referenced) {\n const proof = await readProof(repoPath, id)\n if (!proof) {\n missing += 1\n process.stdout.write(`missing proof object: ${id}\\n`)\n continue\n }\n if (!proof.commit || !proof.timestamp) {\n missing += 1\n process.stdout.write(`invalid proof object: ${id}\\n`)\n continue\n }\n\n proofCommits.push(proof.commit)\n }\n\n if (missing > 0) {\n process.stdout.write(`verify failed: ${missing} missing/invalid proofs\\n`)\n process.exitCode = 1\n return\n }\n\n process.stdout.write(`verify passed: ${referenced.length} commit proofs resolved\\n`)\n\n const remotes = await listRemotes(repoPath)\n if (!remotes.length) {\n process.stdout.write('⚠️ Warning: no git remotes configured for repository\\n')\n return\n }\n\n const sources = remotes.map((remote) => ({ repo: remote.url, commits: proofCommits }))\n const missingCommits = await findUnpushedCommitsWithOptions(sources, { normalize: false })\n\n const missingByRemote = new Map<string, string[]>()\n for (const { repo, commit } of missingCommits) {\n const missingForRemote = missingByRemote.get(repo)\n if (missingForRemote) {\n missingForRemote.push(commit)\n } else {\n missingByRemote.set(repo, [commit])\n }\n }\n\n const uniqueMissing = (remoteUrl: string): string[] => {\n const values = missingByRemote.get(remoteUrl)\n return values ? Array.from(new Set(values)) : []\n }\n\n for (const remote of remotes) {\n const missingHere = uniqueMissing(remote.url)\n if (missingHere.length > 0) {\n process.stdout.write(`⚠️ Warning: proof commits not pushed to ${remote.url}: ${missingHere.join(', ')}\\n`)\n } else {\n process.stdout.write(`remote status: ${remote.url} (all referenced proof commits present)\\n`)\n }\n }\n}\n","import { createHash } from 'node:crypto'\nimport yaml from 'yaml'\nimport { loadRepos } from '@/core/config'\nimport { hasSkillcraftDir } from '@/core/state'\nimport { loadProofFromRepo } from '@/core/progress'\nimport { getProvider } from '@/providers'\nimport { loadGlobalConfig } from '@/core/config'\nimport { gitRemote } from '@/core/git'\nimport { findUnpushedCommits } from '@/core/remote'\n\nexport async function runClaimList(): Promise<void> {\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n const claimant = await resolveClaimant(provider, config.githubUser)\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n\n const matching = issues.filter((issue) => {\n const parsed = parseClaimMetadataFromBody(issue.body)\n return (\n parsed?.claimant === normalizeText(claimant) &&\n !!parsed?.credential\n )\n })\n\n if (!matching.length) {\n process.stdout.write(`no claims found for ${claimant || 'user'}\\n`)\n return\n }\n\n for (const issue of matching) {\n process.stdout.write(`#${issue.number} ${issue.title} (${getClaimLifecycleStatus(issue.labels?.map((entry) => entry?.name) || [])})\\n`)\n }\n\n return\n}\n\nexport async function runClaimStatus(reference: string): Promise<void> {\n const credential = normalizeText(reference)\n if (!credential) {\n throw new Error('claim status requires a credential identifier')\n }\n\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n const claimant = await resolveClaimant(provider, config.githubUser)\n\n const issue = await findClaimIssue(provider, credential, claimant)\n if (!issue) {\n throw new Error(`No claim found for credential ${credential} for user ${claimant || 'unknown'}. Run \"skillcraft claim\" to see your claims.`)\n }\n\n const status = await provider.getIssueStatus('skillcraft-gg/credential-ledger', issue)\n const runs = await provider.listClaimProcessingRuns('skillcraft-gg/credential-ledger', issue)\n process.stdout.write(`issue #${issue}\\n`)\n process.stdout.write(`state: ${getClaimLifecycleStatus(status.labels)}\\n`)\n process.stdout.write(`labels: ${status.labels.join(', ') || 'none'}\\n`)\n process.stdout.write(`url: ${status.url}\\n`)\n\n if (!runs.length) {\n process.stdout.write('processing actions: none found\\n')\n return\n }\n\n const latest = runs[0]\n const conclusion = latest.conclusion ? ` (${latest.conclusion})` : ''\n process.stdout.write(`processing actions: ${latest.status}${conclusion}\\n`)\n process.stdout.write(`latest run: ${latest.url}\\n`)\n if (runs.length > 1) {\n process.stdout.write(`previous attempts: ${runs.length - 1}\\n`)\n }\n}\n\nasync function findClaimIssue(provider: ReturnType<typeof getProvider>, credential: string, claimant: string): Promise<number | undefined> {\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n const normalizedCredential = normalizeText(credential)\n const normalizedClaimant = normalizeText(claimant)\n\n const matches = issues\n .map((issue) => {\n const parsed = parseClaimMetadataFromBody(issue.body)\n if (!parsed || parsed.claimant !== normalizedClaimant || parsed.credential !== normalizedCredential) {\n return undefined\n }\n\n return issue.number\n })\n .filter((value): value is number => !!value)\n\n return matches.sort((a, b) => b - a)[0]\n}\n\nasync function findOpenClaimIssue(\n provider: ReturnType<typeof getProvider>,\n credential: string,\n claimant: string,\n): Promise<{\n number: number\n state: string\n url?: string\n labels?: Array<{ name: string }>\n} | undefined> {\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n const normalizedCredential = normalizeText(credential)\n const normalizedClaimant = normalizeText(claimant)\n\n const matches = issues.filter((issue) => {\n if (normalizeText(issue.state) !== 'open') {\n return false\n }\n\n const parsed = parseClaimMetadataFromBody(issue.body)\n return !!parsed && parsed.claimant === normalizedClaimant && parsed.credential === normalizedCredential\n })\n\n return matches.sort((a, b) => a.number - b.number)[0]\n}\n\nexport async function runClaim(credential: string, opts: { allRepos?: boolean; repo?: string[] }): Promise<void> {\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n\n const claimant = await resolveClaimant(provider, config.githubUser)\n\n const payload = await makeClaimPayload(credential, {\n allRepos: opts?.allRepos,\n repo: opts?.repo,\n }, claimant)\n\n const normalizedCredential = normalizeText(credential)\n const normalizedClaimant = normalizeText(claimant)\n\n const unpushed = await findUnpushedCommits(payload.sources)\n if (unpushed.length > 0) {\n process.stdout.write('⚠️ Warning: some claim commits may not be pushed yet. Please push recent commits before re-submitting the claim.\\n')\n for (const entry of unpushed) {\n process.stdout.write(`- ${entry.commit} in ${entry.repo}\\n`)\n }\n process.exitCode = 1\n return\n }\n\n if (normalizedCredential && normalizedClaimant) {\n const existing = await findOpenClaimIssue(provider, normalizedCredential, normalizedClaimant)\n if (existing) {\n const url = existing.url || await provider.getIssueUrl('skillcraft-gg/credential-ledger', existing.number)\n process.stdout.write('claim already submitted\\n')\n process.stdout.write(`issue: #${existing.number}\\n`)\n process.stdout.write(`state: ${getClaimLifecycleStatus(existing.labels?.map((entry) => entry?.name) || [])}\\n`)\n process.stdout.write(`url: ${url}\\n`)\n return\n }\n\n await ensureNotIssuedClaim(provider, normalizedCredential, normalizedClaimant)\n }\n\n const yamlPayload = yaml.stringify(payload)\n const issue = await provider.createIssue('skillcraft-gg/credential-ledger', `claim: ${credential}`, yamlPayload)\n process.stdout.write(`opened claim: #${issue}\\n`)\n process.stdout.write(`payload:\\n${yamlPayload}\\n`)\n}\n\nasync function resolveClaimant(provider: ReturnType<typeof getProvider>, configuredUser?: string): Promise<string> {\n const envUser = process.env.GITHUB_USER || process.env.USER || ''\n try {\n const user = await provider.getUser()\n if (user) {\n return user\n }\n } catch {\n }\n return configuredUser || envUser || 'unknown'\n}\n\nfunction normalizeText(value: string) {\n return (value || '').trim().toLowerCase()\n}\n\nasync function ensureNotIssuedClaim(provider: ReturnType<typeof getProvider>, credential: string, claimant: string): Promise<void> {\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n\n const alreadyIssued = issues.find((issue) => {\n if (!issueHasLabel(issue, 'skillcraft-issued')) {\n return false\n }\n\n const parsed = parseClaimMetadataFromBody(issue.body)\n if (!parsed) {\n return false\n }\n\n return parsed.credential === credential && parsed.claimant === claimant\n })\n\n if (!alreadyIssued) {\n return\n }\n\n const suffix = alreadyIssued.url ? ` (${alreadyIssued.url})` : ''\n throw new Error(`You already have an issued claim for ${credential}. Existing issue: #${alreadyIssued.number}${suffix}`)\n}\n\nfunction parseClaimMetadataFromBody(body?: string): { credential: string; claimant: string } | undefined {\n if (!body) {\n return undefined\n }\n\n try {\n const normalizedBody = String(body).replace(/\\\\n/g, '\\n')\n const parsed = yaml.parse(normalizedBody)\n if (!parsed || typeof parsed !== 'object') {\n return undefined\n }\n\n const rawCredential = parsed.credential && typeof parsed.credential === 'string' ? parsed.credential : parsed.credential?.id\n const rawClaimant = parsed.claimant?.github\n const credential = normalizeText(rawCredential)\n const claimant = normalizeText(rawClaimant)\n if (!credential || !claimant) {\n return undefined\n }\n return { credential, claimant }\n } catch {\n return undefined\n }\n}\n\nfunction issueHasLabel(issue: { labels?: Array<{ name: string }> }, expected: string): boolean {\n const normalized = expected.toLowerCase()\n return (issue.labels || []).some((entry) => normalizeText(entry?.name) === normalized)\n}\n\nfunction getClaimLifecycleStatus(labels: string[] | undefined): string {\n const normalized = new Set((labels || []).map((value) => normalizeText(value)))\n\n if (normalized.has('skillcraft-issued')) {\n return 'issued'\n }\n if (normalized.has('skillcraft-rejected')) {\n return 'rejected'\n }\n if (normalized.has('skillcraft-verified')) {\n return 'verified'\n }\n if (normalized.has('skillcraft-processing')) {\n return 'processing'\n }\n\n return 'pending'\n}\n\nasync function makeClaimPayload(\n credential: string,\n options: { allRepos?: boolean; repo?: string[] },\n claimant = 'unknown',\n): Promise<{\n claim_version: number\n claimant: { github: string }\n credential: { id: string }\n sources: Array<{ repo: string; commits: string[] }>\n claim_id: string\n}> {\n const repos = await resolveClaimRepos(options)\n const sources = [] as Array<{ repo: string; commits: string[] }>\n for (const repoPath of repos) {\n const proofs = await loadProofFromRepo(repoPath)\n const remote = (await gitRemote(repoPath)) || repoPath\n\n const commitIds = Array.from(new Set(proofs.map((proof) => proof?.commit).filter(Boolean) as string[]))\n sources.push({\n repo: remote,\n commits: commitIds,\n })\n }\n\n const username = claimant\n const claimSeed = `${username}:${credential}:${sources.map((s) => `${s.repo}:${s.commits.length}`).join('|')}:${Date.now()}`\n const claimId = createHash('sha256').update(claimSeed).digest('hex').slice(0, 8)\n\n return {\n claim_version: 1,\n claimant: {\n github: username,\n },\n credential: {\n id: credential,\n },\n sources,\n claim_id: `sha256:${claimId}`,\n }\n}\n\nasync function resolveClaimRepos(options: { allRepos?: boolean; repo?: string[] }): Promise<string[]> {\n const repoList = options.allRepos ? (await loadRepos()).repos.map((entry) => entry.path) : [process.cwd()]\n const selected = options.repo ? options.repo : repoList\n const valid = [] as string[]\n for (const repoPath of selected) {\n if (!(await hasSkillcraftDir(repoPath))) {\n continue\n }\n valid.push(repoPath)\n }\n return valid\n}\n","import path from 'node:path'\nimport fs from 'node:fs/promises'\nimport { isEnabled } from '@/core/state'\nimport { contextPath } from '@/core/paths'\nimport { readJson, writeJson } from '@/core/fs'\nimport { isValidIdentifier } from '@/core/validation'\nimport { assertNonEmpty } from '@/core/validation'\nimport { getProvider } from '@/providers'\nimport { loadGlobalConfig } from '@/core/config'\nimport { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { splitArgPair } from '@/core/validation'\n\nconst execPromise = promisify(execFile)\n\nexport async function runLoadoutUse(id: string): Promise<void> {\n if (!isValidIdentifier(id)) {\n throw new Error('loadout id must be <owner>/<slug>')\n }\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const current = (await readJson(contextPath(cwd))) as { activeLoadouts?: string[] } | null\n const active = Array.isArray(current?.activeLoadouts) ? current!.activeLoadouts.filter(Boolean) : []\n if (!active.includes(id)) {\n active.push(id)\n }\n await writeJson(contextPath(cwd), { activeLoadouts: active })\n process.stdout.write(`activated loadout: ${id}\\n`)\n}\n\nexport async function runLoadoutClear(): Promise<void> {\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n await writeJson(contextPath(cwd), { activeLoadouts: [] })\n process.stdout.write('cleared active loadouts\\n')\n}\n\nexport async function runLoadoutShare(id: string): Promise<void> {\n const cleanId = assertNonEmpty(id, 'loadout id')\n if (!isValidIdentifier(cleanId)) {\n throw new Error('loadout id must be <owner>/<slug>')\n }\n const { owner, slug: slugPart } = splitArgPair(cleanId)\n\n const cwd = process.cwd()\n const loadoutFile = path.join(cwd, 'loadout.yaml')\n await fs.access(loadoutFile)\n const stat = await fs.stat(loadoutFile)\n if (!stat.isFile()) {\n throw new Error('loadout.yaml not found in current directory')\n }\n\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n const remote = `skillcraft-gg/loadouts`\n const temp = path.join(process.cwd(), '.skillcraft-temp-loadout-share')\n const branch = `skillcraft-loadout-${owner}-${slugPart}`\n\n try {\n await fs.rm(temp, { force: true, recursive: true })\n await provider.cloneRepo(remote, temp)\n await runGit(temp, ['checkout', '-B', branch])\n\n const targetDir = path.join(temp, 'loadouts', owner, slugPart)\n await fs.rm(targetDir, { force: true, recursive: true }).catch(() => undefined)\n await fs.mkdir(path.dirname(targetDir), { recursive: true })\n await fs.copyFile(loadoutFile, path.join(targetDir, 'loadout.yaml'))\n\n await runGit(temp, ['add', targetDir])\n await runGit(temp, ['commit', '-m', `Loadout: publish ${cleanId}`]).catch(async () => {\n throw new Error('nothing to commit; loadout may already be published')\n })\n await runGit(temp, ['push', '-u', 'origin', branch]).catch(() => {\n throw new Error('unable to push loadout publish branch')\n })\n await provider.createPullRequest(\n remote,\n branch,\n `Loadout publish: ${cleanId}`,\n ).catch(() => {\n process.stdout.write('unable to create PR automatically. Please open one manually from your branch.\\n')\n })\n process.stdout.write(`loadout publish workflow completed for ${cleanId}\\n`)\n } finally {\n await fs.rm(temp, { force: true, recursive: true })\n }\n}\n\nasync function runGit(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execPromise('git', args, { cwd })\n return stdout.trim()\n}\n","import { buildProofFromPending, buildCommitMessageWithProof, pushProofBranch } from '@/core/proof'\nimport { isEnabled } from '@/core/state'\nimport { removeFile, writeJson } from '@/core/fs'\nimport { pendingPath, contextPath } from '@/core/paths'\nimport { amendCommitMessage, gitHeadCommit } from '@/core/git'\nimport { writeProof } from '@/core/proof'\n\nexport async function runHook(repoPath: string): Promise<void> {\n if (!(await isEnabled(repoPath))) {\n return\n }\n\n const commit = await gitHeadCommit(repoPath)\n const timestamp = new Date().toISOString()\n\n const result = await buildProofFromPending(repoPath, commit, timestamp)\n if (!result) {\n return\n }\n\n const message = await buildCommitMessageWithProof(repoPath, result.proofId)\n await amendCommitMessage(repoPath, message)\n\n const amendedCommit = await gitHeadCommit(repoPath)\n if (amendedCommit !== commit) {\n await writeProof(repoPath, {\n ...result.proof,\n commit: amendedCommit,\n })\n }\n\n await writeJson(pendingPath(repoPath), { skills: [] })\n}\n\nexport async function runHookPush(repoPath: string, remote = 'origin'): Promise<void> {\n await pushProofBranch(repoPath, remote)\n}\n\nexport async function runHookClear(repoPath: string): Promise<void> {\n await Promise.all([removeFile(pendingPath(repoPath)), removeFile(contextPath(repoPath)),])\n process.stdout.write(`cleared hook state in ${repoPath}\\n`)\n}\n"],"mappings":"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","names":["Command","package_default","execFileCb","promisify","path","execFile","git","args","cwd","options","stdout","error","message","isGitRepo","gitRoot","gitRemote","remote","gitCommitMessage","commit","gitHeadCommit","gitHasRef","ref","gitLsTreeNames","subPath","raw","gitShowText","filePath","gitLogWithMessages","maxCount","n","entry","messageParts","amendCommitMessage","env","tempFile","writeFile","fs","path","os","defaultUserDir","skillcraftGlobalDir","skillcraftConfigPath","skillcraftReposPath","trackedCredentialsPath","credentialIndexCachePath","localStateDir","repoPath","localGitDir","localSkillcraftConfig","localRepoHookPath","localRepoPrePushHookPath","localRepoPostPushHookPath","pendingPath","contextPath","pluginPath","managedPluginPath","aiModelContextPath","fs","path","ensureDir","dirPath","readText","filePath","writeText","content","fileExists","readJson","raw","writeJson","value","json","removeFile","fs","buildHookScript","body","rawCliPath","postCommitScript","postPushScript","prePushScript","installPostCommitHook","repoPath","writeText","localRepoHookPath","localRepoPostPushHookPath","localRepoPrePushHookPath","removePostCommitHook","z","ProofVersionSchema","DefaultProofRef","PendingSchema","ContextSchema","ProofAgentSchema","ProofModelSchema","ConfigSchema","RepoEntrySchema","ReposFileSchema","TrackedCredentialSchema","TrackedCredentialsFileSchema","loadGlobalConfig","raw","readJson","skillcraftConfigPath","parsed","ConfigSchema","loadLocalConfig","repoPath","localSkillcraftConfig","saveGlobalConfig","config","ensureDir","skillcraftGlobalDir","writeJson","loadRepos","skillcraftReposPath","ReposFileSchema","saveRepos","file","addRepo","entry","next","item","removeRepo","loadTrackedCredentials","trackedCredentialsPath","TrackedCredentialsFileSchema","saveTrackedCredentials","addTrackedCredential","id","current","sortTrackedCredentialEntries","removeTrackedCredential","before","a","b","runDisable","cwd","isGitRepo","root","gitRoot","removeFile","localSkillcraftConfig","pendingPath","contextPath","pluginPath","managedPluginPath","aiModelContextPath","localGitDir","removePostCommitHook","removeRepo","createHash","path","os","fs","localIdentifierPattern","localIdentifierPatternWithoutVersion","externalSourceIdWithoutVersion","normalizeSkillId","value","parsed","splitSkillIdentifier","isValidIdentifier","isValidSkillIdentifier","input","trimmed","splitIdentifierAndVersion","id","isLocalIdentifierWithoutVersion","owner","slug","match","source","firstPart","secondPart","assertNonEmpty","field","v","parts","version","splitArgPair","PROOFS_DIR","normalizeProofBranch","proofRef","DefaultProofRef","proofPathForId","proofId","proofBranch","repoPath","config","loadLocalConfig","proofSearchRefs","branch","normalized","localRef","remoteRef","refs","gitHasRef","ensureProofBranch","fullRef","git","withProofWorktree","action","removeProofWorktrees","worktree","fs","path","os","removeProofWorktree","worktreePath","targetRef","lines","currentWorktree","currentBranch","maybeRemove","line","loadProofsFromRepo","searchRefs","files","listed","gitLsTreeNames","file","proofs","proof","readProof","parseSkillFromRaw","value","parsed","splitSkillIdentifier","isValidSkillIdentifier","normalizeSkillIds","raw","item","entry","buildProofId","skills","timestamp","loadouts","createHash","loadPending","readJson","pendingPath","PendingSchema","loadContext","contextPath","ContextSchema","loadAiModelContext","aiModelContextPath","record","agentValue","modelValue","normalizeLowerCase","normalizeModelName","parseProof","payload","parseAgentValue","parseModelValue","provider","normalizedProvider","normalizedName","gitShowText","writeProof","skill","proofFile","ensureDir","writeJson","pushProofBranch","remoteName","gitRemote","currentProofIdForCommit","commit","buildProofFromPending","pending","aiModelContext","parsedSkills","stripDraftMessage","message","buildCommitMessageWithProof","existing","gitCommitMessage","cleaned","isEnabled","repoPath","configPath","localSkillcraftConfig","fileExists","raw","readJson","ConfigSchema","hasSkillcraftDir","localGitDir","fs","path","execFile","execSync","promisify","exec","hasGh","runGh","args","copyDirRecursively","source","target","entries","entry","from","to","link","GitHubProvider","repo","number","title","body","match","targetRepo","branch","sourceRepo","sourceBranch","issueNumber","raw","parsed","label","issueMarker","candidates","name","workflowName","runs","issue","hasClaimTitle","hasLabel","fullName","destination","temp","normalizeText","value","labels","expected","normalized","providers","GitHubProvider","getProvider","name","runStatus","cwd","git","isGitRepo","enabled","isEnabled","pending","loadPending","contextExists","fileExists","contextPath","hasHook","localRepoHookPath","head","gitHeadCommit","proofId","currentProofIdForCommit","withSkillcraft","gitLogWithMessages","entry","branch","loadLocalConfig","proofBranchExists","gitHasRef","runDoctor","checks","checkTool","name","ok","login","getProvider","tool","isToolAvailable","execSync","path","runEnable","cwd","isGitRepo","root","gitRoot","config","loadGlobalConfig","fallback","getProvider","saveGlobalConfig","ensureDir","localGitDir","path","managedPluginPath","writeText","getManagedPluginSource","writeJson","aiModelContextPath","branchRef","DefaultProofRef","gitHasRef","git","localSkillcraftConfig","skillcraftGlobalDir","pendingPath","contextPath","pluginPath","installPostCommitHook","remote","gitRemote","addRepo","runReposList","data","loadRepos","entry","index","runReposPrune","next","item","isGitRepo","gitRoot","saveRepos","loadProofFromRepo","repoPath","loadProofsFromRepo","path","DEFAULT_CREDENTIAL_INDEX_URL","CREDENTIAL_INDEX_CACHE_REFRESH_MS","CREDENTIAL_INDEX_CACHE_VERSION","CREDENTIAL_INDEX_CACHE_PATH","credentialIndexCachePath","getCredentialIndexUrl","readCredentialIndexCache","cachePath","raw","readJson","isObject","cachedAt","parseInteger","entries","normalizeCredentialIndexEntries","value","parsed","isCredentialIndexCacheFresh","cache","loadCredentialIndex","options","explicitPath","loadIndexFromPath","cached","loadIndexFromRemote","writeCredentialIndexCache","error","fileExists","url","response","filePath","ensureDir","path","payload","writeJson","normalizeRequirements","requirements","requirementTree","normalizeRequirementRoot","normalizeNonNegativeInteger","parseRequirementNode","hasExplicitAnd","hasExplicitOr","unexpected","key","normalizeRequirementList","buildImplicitAndFromShortcuts","location","entry","index","normalizeShortHandList","values","text","parseScalarText","normalized","known","skill","loadout","hasAgent","agent","normalizeAgentRequirement","hasModel","model","normalizeModelRequirement","nested","keys","valueForKey","childIndex","node","provider","name","evaluateRequirements","proofs","provenCommits","provenRepos","proofSkills","proofLoadouts","proofAgents","proofModels","dedupedCommits","dedupedRepos","proofEntry","proof","parseIdentifierWithVersion","modelProvider","modelName","requirementResult","evaluateRequirementTree","checks","resultReasons","failedRequirementReasons","context","childResults","noExplicitChecks","child","childResult","satisfied","proofSkillsMatch","parseTextRequirement","expectedProvider","normalizeRequirementText","expectedName","candidate","hasProvider","hasName","parts","matchesId","actualId","actualVersion","expected","trimmed","fallback","normalizedEntry","normalizeCredentialIndexEntry","left","right","id","getCredentialIndexEntries","printLines","lines","resolveTrackedRepos","data","loadRepos","repoPaths","repos","entry","isEnabled","runProgress","options","tracked","trackedCredList","loadTrackedCredentials","printJsonResult","buildPayload","indexById","mapCredentials","getCredentialIndexEntries","proofFiles","proofs","provenRepos","provenCommits","repoPath","proofsInRepo","loadProofFromRepo","remote","gitRemote","proof","provenCommitList","provenRepoList","payload","evaluated","definition","makeMissingDefinitionResult","result","evaluateRequirements","formatResult","lines","reason","printLines","runProgressTrack","rawId","id","assertNonEmpty","addTrackedCredential","runProgressUntrack","removeTrackedCredential","params","index","credentialId","provenRepositories","path","fs","execFile","promisify","ora","execPromise","runSkillsPublish","slug","ref","assertNonEmpty","owner","slugPart","splitArgPair","cwd","isEnabled","files","fs","path","config","loadGlobalConfig","provider","getProvider","destination","branch","temp","runGit","target","runSkillsAdd","rawId","cleanInput","parsed","splitSkillIdentifier","loadSearchIndex","normalized","normalizeSkillIds","existing","loadPending","next","writeJson","pendingPath","runSkillsValidate","checks","exists","name","ok","runSkillsList","proofs","pending","loadProofFromRepo","skills","proof","item","skill","list","runSkillsSearch","rawQuery","options","entries","loadSearchIndexEntries","getSearchLimit","query","sourceFilter","limit","sorted","entry","getSkillSource","value","left","right","leftName","rightName","shown","message","title","lines","runtime","tags","updatedLabel","formatUpdatedAt","formatSearchResultName","payload","runSkillsInspect","cleanId","match","manifest","loadSkillManifest","formatInspectOutput","source","manifestUrl","buildSkillManifestUrl","controller","timeout","response","text","isHtmlDocument","parseSkillManifest","error","rawUrl","url","toRawManifestUrl","parts","blobIndex","repo","remainingPath","rawParts","input","index","summary","i","line","isJson","outputMode","explicitPath","loadEntries","raw","normalizeSearchIndexEntries","shouldShowSearchSpinner","action","spinner","normalizeSearchIndexEntry","normalizeString","id","normalizeSkillId","normalizeText","normalizeStringArray","separatorIndex","requestedLimit","deriveSearchResultSlug","separator","suffix","updatedAt","pathToCheck","args","stdout","runSkillsValidateAndExit","mkdtemp","rm","os","path","normalizeRemoteSource","rawRepo","repo","listRemotes","repoPath","git","line","separator","key","url","name","value","findUnpushedCommits","sources","findUnpushedCommitsWithOptions","options","normalize","unpushed","source","remote","commit","commitList","missing","findMissingCommitsInRemote","remoteUrl","commits","tempDir","mkdtemp","path","os","isCommitOnRemote","rm","repoDir","runVerify","repoPath","isEnabled","referenced","gitLogWithMessages","entry","missing","proofCommits","id","proof","readProof","remotes","listRemotes","sources","remote","missingCommits","findUnpushedCommitsWithOptions","missingByRemote","repo","commit","missingForRemote","uniqueMissing","remoteUrl","values","missingHere","createHash","yaml","runClaimList","config","loadGlobalConfig","provider","getProvider","claimant","resolveClaimant","matching","issue","parsed","parseClaimMetadataFromBody","normalizeText","getClaimLifecycleStatus","entry","runClaimStatus","reference","credential","findClaimIssue","status","runs","latest","conclusion","issues","normalizedCredential","normalizedClaimant","value","a","b","findOpenClaimIssue","runClaim","opts","payload","makeClaimPayload","unpushed","findUnpushedCommits","existing","url","ensureNotIssuedClaim","yamlPayload","yaml","configuredUser","envUser","user","alreadyIssued","issueHasLabel","suffix","body","normalizedBody","rawCredential","rawClaimant","expected","normalized","labels","options","repos","resolveClaimRepos","sources","repoPath","proofs","loadProofFromRepo","remote","gitRemote","commitIds","proof","username","claimSeed","s","claimId","createHash","repoList","loadRepos","selected","valid","hasSkillcraftDir","path","fs","execFile","promisify","execPromise","promisify","execFile","runLoadoutUse","id","isValidIdentifier","cwd","isEnabled","current","readJson","contextPath","active","writeJson","runLoadoutClear","runLoadoutShare","cleanId","assertNonEmpty","owner","slugPart","splitArgPair","loadoutFile","path","fs","config","loadGlobalConfig","provider","getProvider","remote","temp","branch","runGit","targetDir","args","stdout","runHook","repoPath","isEnabled","commit","gitHeadCommit","timestamp","result","buildProofFromPending","message","buildCommitMessageWithProof","amendCommitMessage","amendedCommit","writeProof","writeJson","pendingPath","runHookPush","remote","pushProofBranch","program","Command","package_default","withCommand","runEnable","runDisable","runStatus","runDoctor","reposCommand","runReposList","runReposPrune","progressCommand","options","command","outputMode","runProgress","credentialId","runProgressTrack","runProgressUntrack","skillsCommand","id","runSkillsAdd","ownerSlug","runSkillsPublish","runSkillsValidateAndExit","runSkillsList","_options","runSkillsInspect","value","query","runSkillsSearch","runVerify","claimCommand","credential","runClaimList","runClaim","runClaimStatus","loadoutCommand","runLoadoutUse","runLoadoutClear","runLoadoutShare","name","repoPath","remote","runHook","runHookPush","fn","args","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json","../src/core/paths.ts","../src/core/types.ts","../src/core/fs.ts","../src/core/config.ts","../src/core/agents.ts","../src/core/codexSkills.ts","../src/core/installedSkills.ts","../src/core/validation.ts","../src/core/git.ts","../src/core/hooks.ts","../src/commands/disable.ts","../src/core/proof.ts","../src/core/state.ts","../src/providers/github.ts","../src/providers/index.ts","../src/commands/status.ts","../src/commands/enable.ts","../src/commands/repos.ts","../src/core/progress.ts","../src/core/credentials.ts","../src/lib/output.ts","../src/commands/progress.ts","../src/commands/skills.ts","../src/core/remote.ts","../src/commands/verify.ts","../src/commands/claim.ts","../src/commands/loadout.ts","../src/commands/internalHook.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander'\nimport packageJson from '../package.json'\nimport { runDisable } from './commands/disable.js'\nimport { runDoctor, runStatus } from './commands/status.js'\nimport { runEnable } from './commands/enable.js'\nimport { runReposList, runReposPrune } from './commands/repos.js'\nimport { runProgress, runProgressTrack, runProgressUntrack } from './commands/progress.js'\nimport {\n runSkillsAdd,\n runSkillsInspect,\n runSkillsList,\n runSkillsPublish,\n runSkillsSearch,\n runSkillUsed,\n runSkillsValidateAndExit,\n} from './commands/skills.js'\nimport { runVerify } from './commands/verify.js'\nimport { runClaim, runClaimList, runClaimStatus } from './commands/claim.js'\nimport { runLoadoutUse, runLoadoutClear, runLoadoutShare } from './commands/loadout.js'\nimport { runAgentHook, runHook, runHookPush } from './commands/internalHook.js'\n\nconst program = new Command()\n\nprogram.name('skillcraft').description('Skillcraft CLI').version(packageJson.version)\nprogram.option('--json', 'machine-readable JSON output')\n\nprogram\n .command('enable')\n .description('Enable Skillcraft in the current repository')\n .option('--agent <name>', 'enable a specific agent integration (repeatable or comma-separated)', collectStrings, [])\n .action((options) => withCommand(() => runEnable({ agents: options.agent }))())\n\nprogram\n .command('disable')\n .description('Disable Skillcraft in the current repository')\n .option('--agent <name>', 'disable a specific agent integration (repeatable or comma-separated)', collectStrings, [])\n .action((options) => withCommand(() => runDisable({ agents: options.agent }))())\n\nprogram\n .command('status')\n .description('Show repository Skillcraft status')\n .action(withCommand(runStatus))\n\nprogram\n .command('doctor')\n .description('Check environment and integration readiness')\n .action(withCommand(runDoctor))\n\nconst reposCommand = program.command('repos').description('Manage tracked repositories')\nreposCommand.command('list').description('List tracked repositories').action(withCommand(runReposList))\nreposCommand.command('prune').description('Remove unavailable repository entries').action(withCommand(runReposPrune))\n\nconst progressCommand = program.command('progress').description('Show progress for tracked credentials')\nprogressCommand\n.option('--refresh', 'refresh the local credential index cache before evaluating progress')\n.action((options, command) => {\n const outputMode = command.parent?.opts()?.json ? 'json' : 'text'\n withCommand(() => runProgress({ outputMode, refreshIndex: options.refresh }))()\n})\n\nprogressCommand\n .command('track <credential-id>')\n .description('Track a credential for local progress evaluation')\n .action((credentialId: string) => withCommand(() => runProgressTrack(credentialId))())\n\nprogressCommand\n .command('untrack <credential-id>')\n .description('Untrack a credential from local progress evaluation')\n .action((credentialId: string) => withCommand(() => runProgressUntrack(credentialId))())\n\nconst skillsCommand = program.command('skills').description('Manage local skill publishing')\nskillsCommand\n .command('add <id>')\n .description('Add a local or external skill from the registry index')\n .action((id) => withCommand(() => runSkillsAdd(id))())\n\nskillsCommand\n .command('publish <owner-slug>')\n .description('Publish a skill to the registry')\n .action((ownerSlug) => withCommand(() => runSkillsPublish(ownerSlug))())\n\nskillsCommand\n .command('validate')\n .description('Validate local skill layout')\n .action(withCommand(runSkillsValidateAndExit))\n\nskillsCommand\n .command('list')\n .description('List detected skills in the current repository')\n .action(withCommand(runSkillsList))\n\nskillsCommand\n .command('inspect <id>')\n .description('Show detailed information for a registry skill')\n .action((id, _options, command) => {\n const outputMode = command.parent?.parent?.opts()?.json ? 'json' : 'text'\n withCommand(() => runSkillsInspect(id, { outputMode }))()\n })\n\nskillsCommand\n .command('search [query]')\n .description('Search the published skill index')\n .option('--source <source>', 'filter to a registry source')\n .option('--limit <n>', 'limit number of results', (value) => Number.parseInt(value, 10))\n .action((query, options, command) => {\n const outputMode = command.parent?.parent?.opts()?.json ? 'json' : 'text'\n withCommand(() => runSkillsSearch(query, { source: options.source, limit: options.limit, outputMode }))()\n })\n\nprogram\n .command('verify')\n .description('Verify local Skillcraft proofs and trailers')\n .action(withCommand(runVerify))\n\nconst claimCommand = program.command('claim').description('Claim a credential or inspect your claims')\nclaimCommand\n .argument('[credential]', 'credential identifier')\n .option('--all-repos', 'include tracked repositories')\n .option('--repo <path...>', 'explicit repositories to include')\n .action((credential: string | undefined, options) => {\n if (!credential) {\n withCommand(() => runClaimList())()\n return\n }\n withCommand(() =>\n runClaim(credential, {\n allRepos: options.allRepos,\n repo: options.repo,\n }),\n )()\n })\n\nclaimCommand\n .command('list')\n .description('List your claims in the credentials repository')\n .action(withCommand(runClaimList))\n\nclaimCommand\n .command('status <credential>')\n .description('Show claim status by credential identifier')\n .action((credential) => withCommand(() => runClaimStatus(credential))())\n\nconst loadoutCommand = program.command('loadout').description('Manage active loadouts')\nloadoutCommand\n .command('use <id>')\n .description('Activate a loadout in local context')\n .action((id) => withCommand(() => runLoadoutUse(id))())\n\nloadoutCommand\n .command('clear')\n .description('Clear active loadouts')\n .action(withCommand(runLoadoutClear))\n\nloadoutCommand\n .command('share <id>')\n .description('Publish local loadout to registry')\n .action((id) => withCommand(() => runLoadoutShare(id))())\n\nprogram\n .command('_hook <name> [repoPath] [remote]', { hidden: true })\n .description('internal hook command')\n .action((name, repoPath, remote) => withCommand(async () => {\n if (name === 'post-commit') {\n await runHook(repoPath || process.cwd())\n }\n if (name === 'pre-push' || name === 'post-push') {\n await runHookPush(repoPath || process.cwd(), remote || 'origin')\n }\n })())\n\nprogram\n .command('_agent-hook <agent> [repoPath]', { hidden: true })\n .description('internal agent hook command')\n .action((agent, repoPath) => withCommand(() => runAgentHook(agent, repoPath || process.cwd()))())\n\nprogram\n .command('_skill-used <id> [repoPath]', { hidden: true })\n .description('internal skill evidence command')\n .action((id, repoPath) => withCommand(() => runSkillUsed(id, repoPath || process.cwd()))())\n\nfunction withCommand<T extends (...args: readonly unknown[]) => Promise<void> | void>(fn: T): (...args: Parameters<T>) => void {\n return (...args: Parameters<T>) => {\n void Promise.resolve(fn(...args)).catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exitCode = 1\n })\n }\n}\n\nfunction collectStrings(value: string, previous: string[]): string[] {\n return [...previous, value]\n}\n\nprogram.parse(process.argv)\n","{\n \"name\": \"skillcraft\",\n \"version\": \"0.1.9\",\n \"description\": \"Turn your work into verifiable AI credentials. Capture what you build, share your progress, and earn verifiable credentials that prove your AI coding skills.\",\n \"keywords\": [\n \"skillcraft\",\n \"cli\",\n \"ai\",\n \"evidence\",\n \"credentials\",\n \"skills\",\n \"loadout\",\n \"git\",\n \"verification\",\n \"developer-tools\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/skillcraft-gg/skillcraft.git\"\n },\n \"homepage\": \"https://skillcraft.gg\",\n \"bugs\": {\n \"url\": \"https://github.com/skillcraft-gg/skillcraft/issues\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"skillcraft\": \"dist/index.js\"\n },\n \"files\": [\n \"dist/index.js\",\n \"dist/index.js.map\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"clean\": \"rm -rf dist\",\n \"test\": \"npm run build && node --test tests/*.test.mjs\",\n \"smoke\": \"npm test\",\n \"format\": \"printf ''\",\n \"start\": \"node dist/index.js\",\n \"check\": \"tsc --noEmit\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"commander\": \"^13.1.0\",\n \"ora\": \"^8.2.0\",\n \"yaml\": \"^2.6.0\",\n \"zod\": \"^3.24.2\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.8.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.7.2\"\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport os from 'node:os'\n\nfunction defaultUserDir(): string {\n return path.resolve(process.env.HOME || os.homedir(), '.skillcraft')\n}\n\nexport function skillcraftGlobalDir(): string {\n return defaultUserDir()\n}\n\nexport function skillcraftConfigPath(): string {\n return path.join(skillcraftGlobalDir(), 'config.json')\n}\n\nexport function skillcraftReposPath(): string {\n return path.join(skillcraftGlobalDir(), 'repos.json')\n}\n\nexport function trackedCredentialsPath(): string {\n return path.join(skillcraftGlobalDir(), 'credentials.json')\n}\n\nexport function credentialIndexCachePath(): string {\n return path.join(skillcraftGlobalDir(), 'cache', 'credentials', 'index.json')\n}\n\nexport function localStateDir(repoPath: string): string {\n return path.join(repoPath, '.skillcraft')\n}\n\nexport function localGitDir(repoPath: string): string {\n return path.join(repoPath, '.git', 'skillcraft')\n}\n\nexport function localSkillcraftConfig(repoPath: string): string {\n return path.join(localStateDir(repoPath), '.skillcraft.json')\n}\n\nexport function localRepoHookPath(repoPath: string): string {\n return path.join(repoPath, '.git', 'hooks', 'post-commit')\n}\n\nexport function localRepoPrePushHookPath(repoPath: string): string {\n return path.join(repoPath, '.git', 'hooks', 'pre-push')\n}\n\nexport function localRepoPostPushHookPath(repoPath: string): string {\n return path.join(repoPath, '.git', 'hooks', 'post-push')\n}\n\nexport function pendingPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'pending.json')\n}\n\nexport function contextPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'context.json')\n}\n\nexport function pluginPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'agent.json')\n}\n\nexport function managedPluginPath(repoPath: string): string {\n return opencodePluginPath(repoPath)\n}\n\nexport function opencodePluginPath(repoPath: string): string {\n return path.join(repoPath, '.opencode', 'plugins', 'skillcraft.mjs')\n}\n\nexport function codexConfigPath(repoPath: string): string {\n return path.join(repoPath, '.codex', 'config.toml')\n}\n\nexport function codexHooksPath(repoPath: string): string {\n return path.join(repoPath, '.codex', 'hooks.json')\n}\n\nexport function codexMarketplacePath(repoPath: string): string {\n return path.join(repoPath, '.agents', 'plugins', 'marketplace.json')\n}\n\nexport function codexPluginRootPath(repoPath: string): string {\n return path.join(repoPath, 'plugins', 'skillcraft-codex')\n}\n\nexport function codexPluginManifestPath(repoPath: string): string {\n return path.join(codexPluginRootPath(repoPath), '.codex-plugin', 'plugin.json')\n}\n\nexport function codexPluginSkillPath(repoPath: string): string {\n return path.join(codexPluginRootPath(repoPath), 'skills', 'skillcraft', 'SKILL.md')\n}\n\nexport function projectSkillsRootPath(repoPath: string): string {\n return path.join(repoPath, '.agents', 'skills')\n}\n\nexport function installedSkillsIndexPath(repoPath: string): string {\n return path.join(projectSkillsRootPath(repoPath), '.skillcraft-index.json')\n}\n\nexport function aiModelContextPath(repoPath: string): string {\n return path.join(localGitDir(repoPath), 'ai-model-context.json')\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","import { z } from 'zod'\n\nexport const ProofVersionSchema = z.literal(1)\n\nexport const DefaultProofRef = 'skillcraft/proofs/v1'\n\nexport const PendingSchema = z.object({\n skills: z.array(z.string()).default([]),\n})\n\nexport const ContextSchema = z.object({\n activeLoadouts: z.array(z.string()).default([]),\n})\n\nexport const ProofAgentSchema = z.object({\n provider: z.string().optional(),\n})\n\nexport const ProofModelSchema = z.object({\n provider: z.string().optional(),\n name: z.string().optional(),\n})\n\nexport const AgentIntegrationSchema = z.enum(['opencode', 'codex'])\n\nexport const AgentStateSchema = z.object({\n version: z.number().int().default(1),\n providers: z.array(AgentIntegrationSchema).default([]),\n enabled: z.boolean().default(true),\n})\n\nexport const InstalledSkillInstallSchema = z.object({\n type: z.enum(['github-directory', 'local-directory']),\n repo: z.string().optional(),\n ref: z.string().optional(),\n path: z.string(),\n})\n\nexport const InstalledSkillRecordSchema = z.object({\n id: z.string(),\n name: z.string(),\n path: z.string(),\n install: InstalledSkillInstallSchema,\n installedAt: z.string(),\n})\n\nexport const InstalledSkillsFileSchema = z.object({\n version: z.number().int().default(1),\n skills: z.array(InstalledSkillRecordSchema).default([]),\n})\n\nexport const ConfigSchema = z.object({\n githubUser: z.string().optional(),\n provider: z.enum(['gh']).default('gh'),\n version: z.number().int().default(1),\n proofRef: z.string().default(DefaultProofRef),\n})\n\nexport const RepoEntrySchema = z.object({\n path: z.string(),\n remote: z.string().optional(),\n enabledAt: z.string().optional(),\n})\n\nexport const ReposFileSchema = z.object({\n repos: z.array(RepoEntrySchema).default([]),\n})\n\nexport const TrackedCredentialSchema = z.object({\n id: z.string(),\n trackedAt: z.string().optional(),\n})\n\nexport const TrackedCredentialsFileSchema = z.object({\n credentials: z.array(TrackedCredentialSchema).default([]),\n})\n\nexport type Proof = {\n version: number\n commit: string\n skills: Array<{ id: string; version?: string }>\n loadouts: string[]\n timestamp: string\n agent?: {\n provider?: string\n }\n model?: {\n provider?: string\n name?: string\n }\n}\n\nexport type RepoEntry = z.infer<typeof RepoEntrySchema>\nexport type ReposFile = z.infer<typeof ReposFileSchema>\nexport type TrackedCredentialEntry = z.infer<typeof TrackedCredentialSchema>\nexport type TrackedCredentialsFile = z.infer<typeof TrackedCredentialsFileSchema>\nexport type Config = z.infer<typeof ConfigSchema>\nexport type PendingFile = z.infer<typeof PendingSchema>\nexport type ContextFile = z.infer<typeof ContextSchema>\nexport type AgentIntegration = z.infer<typeof AgentIntegrationSchema>\nexport type AgentState = z.infer<typeof AgentStateSchema>\nexport type InstalledSkillInstall = z.infer<typeof InstalledSkillInstallSchema>\nexport type InstalledSkillRecord = z.infer<typeof InstalledSkillRecordSchema>\nexport type InstalledSkillsFile = z.infer<typeof InstalledSkillsFileSchema>\n\nexport type CliCommandResult = {\n ok: boolean\n message: string\n data?: unknown\n}\n","import fs from 'node:fs/promises'\nimport 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 readText(filePath: string): Promise<string> {\n const data = await fs.readFile(filePath, 'utf8')\n return data\n}\n\nexport async function writeText(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf8')\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 readJson<T>(filePath: string): Promise<T | null> {\n if (!(await fileExists(filePath))) {\n return null\n }\n const raw = await readText(filePath)\n return JSON.parse(raw) as T\n}\n\nexport async function writeJson(filePath: string, value: unknown): Promise<void> {\n const json = JSON.stringify(value, null, 2)\n await writeText(filePath, `${json}\\n`)\n}\n\nexport async function removeFile(filePath: string): Promise<void> {\n try {\n await fs.rm(filePath, { force: true })\n } catch {\n // best effort cleanup\n }\n}\n\nexport async function removePath(targetPath: string): Promise<void> {\n try {\n await fs.rm(targetPath, { force: true, recursive: true })\n } catch {\n // best effort cleanup\n }\n}\n","import { skillcraftGlobalDir, skillcraftConfigPath, skillcraftReposPath, trackedCredentialsPath, localSkillcraftConfig } from './paths.js'\nimport {\n ConfigSchema,\n ReposFileSchema,\n RepoEntry,\n TrackedCredentialsFileSchema,\n type Config,\n type ReposFile,\n type TrackedCredentialEntry,\n type TrackedCredentialsFile,\n} from './types.js'\nimport { ensureDir, readJson, writeJson } from './fs.js'\n\nexport async function loadGlobalConfig(): Promise<Config> {\n const raw = await readJson<unknown>(skillcraftConfigPath())\n const parsed = ConfigSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return ConfigSchema.parse({})\n }\n return parsed.data\n}\n\nexport async function loadLocalConfig(repoPath: string): Promise<Config> {\n const raw = await readJson<unknown>(localSkillcraftConfig(repoPath))\n const parsed = ConfigSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return ConfigSchema.parse({})\n }\n\n return parsed.data\n}\n\nexport async function saveGlobalConfig(config: Config): Promise<void> {\n await ensureDir(skillcraftGlobalDir())\n await writeJson(skillcraftConfigPath(), config)\n}\n\nexport async function loadRepos(): Promise<ReposFile> {\n const raw = await readJson<unknown>(skillcraftReposPath())\n const parsed = ReposFileSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return { repos: [] }\n }\n return parsed.data\n}\n\nexport async function saveRepos(file: ReposFile): Promise<void> {\n await ensureDir(skillcraftGlobalDir())\n await writeJson(skillcraftReposPath(), file)\n}\n\nexport async function addRepo(entry: RepoEntry): Promise<void> {\n const repos = await loadRepos()\n const next = repos.repos.filter((item) => item.path !== entry.path)\n next.push(entry)\n await saveRepos({ repos: next })\n}\n\nexport async function removeRepo(repoPath: string): Promise<void> {\n const repos = await loadRepos()\n const next = repos.repos.filter((item) => item.path !== repoPath)\n await saveRepos({ repos: next })\n}\n\nexport async function loadTrackedCredentials(): Promise<TrackedCredentialsFile> {\n const raw = await readJson<unknown>(trackedCredentialsPath())\n const parsed = TrackedCredentialsFileSchema.safeParse(raw ?? {})\n if (!parsed.success) {\n return { credentials: [] }\n }\n return parsed.data\n}\n\nexport async function saveTrackedCredentials(file: TrackedCredentialsFile): Promise<void> {\n await ensureDir(skillcraftGlobalDir())\n await writeJson(trackedCredentialsPath(), file)\n}\n\nexport async function addTrackedCredential(id: string): Promise<boolean> {\n const current = await loadTrackedCredentials()\n if (current.credentials.some((entry) => entry.id === id)) {\n return false\n }\n\n current.credentials.push({ id, trackedAt: new Date().toISOString() })\n current.credentials.sort(sortTrackedCredentialEntries)\n await saveTrackedCredentials(current)\n return true\n}\n\nexport async function removeTrackedCredential(id: string): Promise<boolean> {\n const current = await loadTrackedCredentials()\n const before = current.credentials.length\n const next = current.credentials.filter((entry) => entry.id !== id)\n if (next.length === before) {\n return false\n }\n await saveTrackedCredentials({ credentials: next })\n return true\n}\n\nexport function sortTrackedCredentialEntries(a: TrackedCredentialEntry, b: TrackedCredentialEntry): number {\n return a.id.localeCompare(b.id)\n}\n\nexport function reposByPath(repos: ReposFile, repoPath: string): RepoEntry | undefined {\n return repos.repos.find((r) => r.path === repoPath)\n}\n","import { execSync } from 'node:child_process'\nimport path from 'node:path'\nimport {\n aiModelContextPath,\n codexConfigPath,\n codexHooksPath,\n codexMarketplacePath,\n codexPluginManifestPath,\n codexPluginRootPath,\n codexPluginSkillPath,\n opencodePluginPath,\n pluginPath,\n} from './paths.js'\nimport { recordCodexSkillUsage } from './codexSkills.js'\nimport { AgentStateSchema, type AgentIntegration } from './types.js'\nimport { ensureDir, fileExists, readJson, readText, removeFile, removePath, writeJson, writeText } from './fs.js'\n\nconst supportedAgents = ['codex', 'opencode'] as const\nconst codexTomlStart = '# skillcraft:begin codex'\nconst codexTomlEnd = '# skillcraft:end codex'\nconst codexHookCommand = 'skillcraft _agent-hook codex'\n\ntype CodexHookCommand = {\n type: 'command'\n command: string\n statusMessage?: string\n timeout?: number\n}\n\ntype CodexHookGroup = {\n matcher?: string\n hooks: CodexHookCommand[]\n}\n\ntype CodexHooksFile = {\n hooks?: Record<string, CodexHookGroup[]>\n}\n\ntype CodexMarketplace = {\n name?: string\n interface?: {\n displayName?: string\n }\n plugins?: Array<Record<string, unknown>>\n}\n\nexport const SupportedAgents = [...supportedAgents]\n\nexport function normalizeAgentName(value: string): AgentIntegration | undefined {\n const normalized = value.trim().toLowerCase()\n return supportedAgents.find((agent) => agent === normalized)\n}\n\nexport function parseAgentOptions(values: readonly string[]): AgentIntegration[] {\n const normalized = values\n .flatMap((value) => value.split(','))\n .map((value) => normalizeAgentName(value))\n .filter((value): value is AgentIntegration => !!value)\n\n return Array.from(new Set(normalized)).sort()\n}\n\nexport function unsupportedAgentOptions(values: readonly string[]): string[] {\n return values\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n .filter((value) => !normalizeAgentName(value))\n}\n\nexport async function loadEnabledAgents(repoPath: string): Promise<AgentIntegration[]> {\n const raw = await readJson<unknown>(pluginPath(repoPath))\n const parsed = AgentStateSchema.safeParse(raw ?? {})\n if (parsed.success) {\n return parsed.data.providers\n }\n\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return []\n }\n\n const record = raw as Record<string, unknown>\n if (!Array.isArray(record.providers)) {\n return []\n }\n\n return record.providers\n .map((value) => (typeof value === 'string' ? normalizeAgentName(value) : undefined))\n .filter((value): value is AgentIntegration => !!value)\n}\n\nexport async function saveEnabledAgents(repoPath: string, agents: readonly AgentIntegration[]): Promise<void> {\n const providers = Array.from(new Set(agents)).sort()\n await writeJson(pluginPath(repoPath), {\n version: 1,\n providers,\n enabled: providers.length > 0,\n })\n}\n\nexport async function detectAvailableAgents(): Promise<AgentIntegration[]> {\n return supportedAgents.filter((agent) => isToolAvailable(agent))\n}\n\nexport async function enableAgentIntegration(repoPath: string, agent: AgentIntegration): Promise<void> {\n if (agent === 'opencode') {\n await ensureDir(path.dirname(opencodePluginPath(repoPath)))\n await writeText(opencodePluginPath(repoPath), getManagedOpencodePluginSource())\n return\n }\n\n await enableCodexIntegration(repoPath)\n}\n\nexport async function disableAgentIntegration(repoPath: string, agent: AgentIntegration): Promise<void> {\n if (agent === 'opencode') {\n await removeFile(opencodePluginPath(repoPath))\n return\n }\n\n await disableCodexIntegration(repoPath)\n}\n\nexport async function ensureAiModelContext(repoPath: string, agent: AgentIntegration): Promise<void> {\n const existing = await readJson<unknown>(aiModelContextPath(repoPath))\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n const record = existing as Record<string, unknown>\n const currentAgent = record.agent && typeof record.agent === 'object' && !Array.isArray(record.agent)\n ? (record.agent as Record<string, unknown>).provider\n : undefined\n if (typeof currentAgent === 'string' && currentAgent.trim()) {\n return\n }\n\n await updateAiModelContext(repoPath, { agent: { provider: agent } })\n return\n }\n\n await writeJson(aiModelContextPath(repoPath), {\n agent: { provider: agent },\n model: {},\n })\n}\n\nexport async function updateAiModelContext(repoPath: string, update: { agent?: { provider?: string }; model?: { provider?: string; name?: string } }): Promise<void> {\n const current = await readJson<unknown>(aiModelContextPath(repoPath))\n const existing = current && typeof current === 'object' && !Array.isArray(current)\n ? current as Record<string, unknown>\n : {}\n\n const existingAgent = existing.agent && typeof existing.agent === 'object' && !Array.isArray(existing.agent)\n ? existing.agent as Record<string, unknown>\n : {}\n const existingModel = existing.model && typeof existing.model === 'object' && !Array.isArray(existing.model)\n ? existing.model as Record<string, unknown>\n : {}\n\n const next = {\n ...existing,\n agent: {\n ...existingAgent,\n ...(update.agent?.provider ? { provider: update.agent.provider.trim().toLowerCase() } : {}),\n },\n model: {\n ...existingModel,\n ...(update.model?.provider ? { provider: update.model.provider.trim().toLowerCase() } : {}),\n ...(update.model?.name ? { name: update.model.name.trim() } : {}),\n },\n }\n\n await writeJson(aiModelContextPath(repoPath), next)\n}\n\nexport async function handleCodexAgentHook(repoPath: string, payload: unknown): Promise<void> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n await updateAiModelContext(repoPath, { agent: { provider: 'codex' } })\n return\n }\n\n const record = payload as Record<string, unknown>\n const modelName = typeof record.model === 'string' ? record.model.trim() : ''\n const modelProvider = typeof record.model_provider === 'string'\n ? record.model_provider.trim().toLowerCase()\n : typeof record.modelProvider === 'string'\n ? record.modelProvider.trim().toLowerCase()\n : ''\n\n await updateAiModelContext(repoPath, {\n agent: { provider: 'codex' },\n model: {\n ...(modelProvider ? { provider: modelProvider } : {}),\n ...(modelName ? { name: modelName } : {}),\n },\n })\n\n await recordCodexSkillUsage(repoPath, payload)\n}\n\nfunction isToolAvailable(tool: string): boolean {\n try {\n execSync(`command -v ${tool}`, { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n\nasync function enableCodexIntegration(repoPath: string): Promise<void> {\n await Promise.all([\n writeCodexConfig(repoPath),\n writeCodexHooks(repoPath),\n writeCodexMarketplace(repoPath),\n writeCodexPlugin(repoPath),\n ])\n}\n\nasync function disableCodexIntegration(repoPath: string): Promise<void> {\n await Promise.all([\n removeCodexManagedConfig(repoPath),\n removeCodexHooks(repoPath),\n removeCodexMarketplace(repoPath),\n removePath(codexPluginRootPath(repoPath)),\n ])\n}\n\nasync function writeCodexPlugin(repoPath: string): Promise<void> {\n await writeJson(codexPluginManifestPath(repoPath), {\n name: 'skillcraft-codex',\n version: '0.1.0',\n description: 'Repo-local Skillcraft workflow support for Codex CLI.',\n skills: './skills/',\n interface: {\n displayName: 'Skillcraft',\n shortDescription: 'Skillcraft-aware repository guidance for Codex.',\n longDescription: 'Adds Skillcraft repository guidance and pairs with repo-local hooks to record model provenance.',\n developerName: 'Skillcraft',\n category: 'Developer Tools',\n capabilities: ['Read', 'Write'],\n defaultPrompt: [\n 'Use Skillcraft guidance while working in this repository.',\n ],\n brandColor: '#0f766e',\n },\n })\n\n await writeText(codexPluginSkillPath(repoPath), `---\nname: skillcraft\ndescription: Use when working in a Skillcraft-enabled repository so Codex preserves normal git history and evidence-friendly commit workflows.\n---\n\nWhen Skillcraft is enabled in this repository:\n\n- Preserve normal git history unless the user explicitly asks for destructive history changes.\n- Prefer regular commits over rebases, squashes, or amends once Skillcraft evidence has been recorded.\n- Keep work in this repository so repo-local Skillcraft hooks can capture model provenance.\n- Let Skillcraft post-commit hooks attach proof references after meaningful commits.\n`)\n}\n\nasync function writeCodexMarketplace(repoPath: string): Promise<void> {\n const filePath = codexMarketplacePath(repoPath)\n const raw = await readJson<unknown>(filePath)\n if (raw && (typeof raw !== 'object' || Array.isArray(raw))) {\n throw new Error(`Invalid marketplace file: ${filePath}`)\n }\n\n const current = (raw ?? {}) as CodexMarketplace\n const plugins = Array.isArray(current.plugins) ? [...current.plugins] : []\n const entry = {\n name: 'skillcraft-codex',\n source: {\n source: 'local',\n path: './plugins/skillcraft-codex',\n },\n policy: {\n installation: 'AVAILABLE',\n authentication: 'ON_INSTALL',\n },\n category: 'Developer Tools',\n interface: {\n displayName: 'Skillcraft',\n },\n }\n\n const nextPlugins = plugins.filter((plugin) => plugin && typeof plugin === 'object' && (plugin as Record<string, unknown>).name !== entry.name)\n nextPlugins.push(entry)\n\n await writeJson(filePath, {\n name: current.name || 'skillcraft-local',\n interface: current.interface || { displayName: 'Skillcraft Local Plugins' },\n plugins: nextPlugins,\n })\n}\n\nasync function removeCodexMarketplace(repoPath: string): Promise<void> {\n const filePath = codexMarketplacePath(repoPath)\n const raw = await readJson<unknown>(filePath)\n if (!raw) {\n return\n }\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error(`Invalid marketplace file: ${filePath}`)\n }\n\n const current = raw as CodexMarketplace\n const plugins = Array.isArray(current.plugins) ? current.plugins.filter((plugin) => {\n return !(plugin && typeof plugin === 'object' && (plugin as Record<string, unknown>).name === 'skillcraft-codex')\n }) : []\n\n if (!plugins.length) {\n await removeFile(filePath)\n return\n }\n\n await writeJson(filePath, {\n ...current,\n plugins,\n })\n}\n\nasync function writeCodexHooks(repoPath: string): Promise<void> {\n const filePath = codexHooksPath(repoPath)\n const raw = await readJson<unknown>(filePath)\n if (raw && (typeof raw !== 'object' || Array.isArray(raw))) {\n throw new Error(`Invalid hooks file: ${filePath}`)\n }\n\n const current = (raw ?? {}) as CodexHooksFile\n const hooks = current.hooks && typeof current.hooks === 'object' && !Array.isArray(current.hooks)\n ? { ...current.hooks }\n : {}\n\n hooks.SessionStart = upsertCodexHookGroup(hooks.SessionStart, {\n matcher: 'startup|resume',\n hooks: [codexHookHandler('Updating Skillcraft session context')],\n })\n hooks.UserPromptSubmit = upsertCodexHookGroup(hooks.UserPromptSubmit, {\n hooks: [codexHookHandler('Updating Skillcraft prompt context')],\n })\n hooks.Stop = upsertCodexHookGroup(hooks.Stop, {\n hooks: [codexHookHandler('Recording Skillcraft turn evidence')],\n })\n\n await writeJson(filePath, { hooks })\n}\n\nasync function removeCodexHooks(repoPath: string): Promise<void> {\n const filePath = codexHooksPath(repoPath)\n const raw = await readJson<unknown>(filePath)\n if (!raw) {\n return\n }\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error(`Invalid hooks file: ${filePath}`)\n }\n\n const current = raw as CodexHooksFile\n const hooks = current.hooks && typeof current.hooks === 'object' && !Array.isArray(current.hooks)\n ? { ...current.hooks }\n : {}\n\n for (const eventName of Object.keys(hooks)) {\n const groups = Array.isArray(hooks[eventName]) ? hooks[eventName] : []\n const nextGroups = groups\n .map((group) => {\n const commands = Array.isArray(group.hooks) ? group.hooks.filter((hook) => hook.command !== codexHookCommand) : []\n return commands.length ? { ...group, hooks: commands } : undefined\n })\n .filter((group): group is CodexHookGroup => !!group)\n\n if (nextGroups.length) {\n hooks[eventName] = nextGroups\n } else {\n delete hooks[eventName]\n }\n }\n\n if (!Object.keys(hooks).length) {\n await removeFile(filePath)\n return\n }\n\n await writeJson(filePath, { hooks })\n}\n\nasync function writeCodexConfig(repoPath: string): Promise<void> {\n const filePath = codexConfigPath(repoPath)\n const current = await readText(filePath).catch(() => '')\n const next = enableCodexHooksInToml(current)\n if (next === current) {\n return\n }\n await writeText(filePath, next)\n}\n\nasync function removeCodexManagedConfig(repoPath: string): Promise<void> {\n const filePath = codexConfigPath(repoPath)\n if (!(await fileExists(filePath))) {\n return\n }\n const current = await readText(filePath)\n const next = removeManagedTomlBlock(current)\n if (!next.trim()) {\n await removeFile(filePath)\n return\n }\n if (next !== current) {\n await writeText(filePath, next)\n }\n}\n\nfunction codexHookHandler(statusMessage: string): CodexHookCommand {\n return {\n type: 'command',\n command: codexHookCommand,\n statusMessage,\n timeout: 30,\n }\n}\n\nfunction upsertCodexHookGroup(current: CodexHookGroup[] | undefined, nextGroup: CodexHookGroup): CodexHookGroup[] {\n const groups = Array.isArray(current) ? [...current] : []\n const index = groups.findIndex((group) => (group.matcher || '') === (nextGroup.matcher || ''))\n if (index === -1) {\n groups.push(nextGroup)\n return groups\n }\n\n const existing = groups[index]\n const hooks = Array.isArray(existing.hooks) ? [...existing.hooks] : []\n for (const hook of nextGroup.hooks) {\n if (!hooks.some((entry) => entry.command === hook.command)) {\n hooks.push(hook)\n }\n }\n\n groups[index] = {\n ...existing,\n matcher: nextGroup.matcher ?? existing.matcher,\n hooks,\n }\n return groups\n}\n\nfunction enableCodexHooksInToml(source: string): string {\n const withoutManaged = removeManagedTomlBlock(source)\n if (/^\\s*features\\.codex_hooks\\s*=\\s*false\\s*$/m.test(withoutManaged)) {\n return withoutManaged.replace(/^\\s*features\\.codex_hooks\\s*=\\s*false\\s*$/m, 'features.codex_hooks = true')\n }\n if (/^\\s*features\\.codex_hooks\\s*=\\s*true\\s*$/m.test(withoutManaged)) {\n return withoutManaged\n }\n\n const lines = withoutManaged.split(/\\r?\\n/)\n let inFeatures = false\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]\n if (/^\\s*\\[.*\\]\\s*$/.test(line)) {\n inFeatures = line.trim() === '[features]'\n continue\n }\n\n if (inFeatures && /^\\s*codex_hooks\\s*=\\s*false\\s*$/.test(line)) {\n lines[index] = 'codex_hooks = true'\n return ensureTrailingNewline(lines.join('\\n'))\n }\n if (inFeatures && /^\\s*codex_hooks\\s*=\\s*true\\s*$/.test(line)) {\n return ensureTrailingNewline(lines.join('\\n'))\n }\n }\n\n const featuresIndex = lines.findIndex((line) => line.trim() === '[features]')\n const managedBlock = [codexTomlStart, 'codex_hooks = true', codexTomlEnd]\n if (featuresIndex !== -1) {\n lines.splice(featuresIndex + 1, 0, ...managedBlock)\n return ensureTrailingNewline(lines.join('\\n'))\n }\n\n const prefix = withoutManaged.trim() ? `${withoutManaged.trimEnd()}\\n\\n` : ''\n return `${prefix}${codexTomlStart}\\n[features]\\ncodex_hooks = true\\n${codexTomlEnd}\\n`\n}\n\nfunction removeManagedTomlBlock(source: string): string {\n const escapedStart = codexTomlStart.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const escapedEnd = codexTomlEnd.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const matcher = new RegExp(`\\\\n?${escapedStart}[\\\\s\\\\S]*?${escapedEnd}\\\\n?`, 'g')\n return ensureTrailingNewline(source.replace(matcher, '\\n').replace(/\\n{3,}/g, '\\n\\n').trimEnd())\n}\n\nfunction ensureTrailingNewline(source: string): string {\n return source ? `${source.replace(/\\n+$/g, '')}\\n` : ''\n}\n\nfunction getManagedOpencodePluginSource(): string {\n return `import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\n\nconst exec = promisify(execFile)\n\nfunction normalizeProvider(value) {\n return typeof value === 'string' ? value.trim().toLowerCase() : ''\n}\n\nfunction normalizeModelName(value) {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeSkillName(value) {\n return typeof value === 'string'\n ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-+|-+$/g, '')\n : ''\n}\n\nfunction extractModelInfo(payload) {\n if (!payload || typeof payload !== 'object') {\n return {}\n }\n\n const direct = {\n modelProvider: normalizeProvider(payload.model_provider || payload.modelProvider || payload.model_provider_id),\n modelName: normalizeModelName(payload.model_name || payload.modelName || payload.model),\n agentProvider: normalizeProvider(payload.provider || payload.agent_provider || payload.agentProvider),\n }\n\n const msg = payload.message\n const request = payload.request\n const context = payload.context\n\n const nestedMessage = msg && typeof msg === 'object' ? {\n modelProvider: normalizeProvider(msg.model_provider || msg.modelProvider),\n modelName: normalizeModelName(msg.model_name || msg.modelName || msg.model),\n agentProvider: normalizeProvider(msg.provider || msg.agent_provider || msg.agentProvider),\n } : {}\n\n const nestedRequest = request && typeof request === 'object' ? {\n modelProvider: normalizeProvider(request.model_provider || request.modelProvider),\n modelName: normalizeModelName(request.model_name || request.modelName || request.model),\n agentProvider: normalizeProvider(request.provider || request.agent_provider || request.agentProvider),\n } : {}\n\n const nestedContext = context && typeof context === 'object' ? {\n modelProvider: normalizeProvider(context.model_provider || context.modelProvider),\n modelName: normalizeModelName(context.model_name || context.modelName || context.model),\n agentProvider: normalizeProvider(context.provider || context.agent_provider || context.agentProvider),\n } : {}\n\n const candidate = {\n agentProvider: direct.agentProvider || nestedMessage.agentProvider || nestedRequest.agentProvider || nestedContext.agentProvider || 'opencode',\n modelProvider: direct.modelProvider || nestedMessage.modelProvider || nestedRequest.modelProvider || nestedContext.modelProvider,\n modelName: direct.modelName || nestedMessage.modelName || nestedRequest.modelName || nestedContext.modelName,\n }\n\n if (!candidate.modelProvider && !candidate.modelName && !candidate.agentProvider) {\n return {}\n }\n\n return candidate\n}\n\nfunction resolveStateFile(root) {\n return path.join(root, '.git', 'skillcraft', 'ai-model-context.json')\n}\n\nfunction resolveInstalledSkillsIndex(root) {\n return path.join(root, '.agents', 'skills', '.skillcraft-index.json')\n}\n\nasync function updateState(root, update) {\n const stateFile = resolveStateFile(root)\n let current = {}\n\n try {\n const raw = await fs.readFile(stateFile, 'utf8')\n const parsed = JSON.parse(raw)\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n current = parsed\n }\n } catch {\n current = {}\n }\n\n const next = {\n ...(current || {}),\n ...(update || {}),\n }\n\n if (!next.agent || typeof next.agent !== 'object' || Array.isArray(next.agent)) {\n next.agent = { provider: 'opencode' }\n } else if (!next.agent.provider && update?.agent?.provider) {\n next.agent = { ...next.agent }\n }\n\n if (update?.agent?.provider) {\n next.agent.provider = update.agent.provider\n }\n\n if (update?.model) {\n next.model = {\n ...(next.model || {}),\n ...(update.model || {}),\n }\n }\n\n try {\n await fs.mkdir(path.join(root, '.git', 'skillcraft'), { recursive: true })\n await fs.writeFile(stateFile, JSON.stringify(next, null, 2) + '\\n', 'utf8')\n } catch {\n return\n }\n}\n\nasync function loadInstalledSkillId(root, skillName) {\n const normalized = normalizeSkillName(skillName)\n if (!normalized) {\n return undefined\n }\n\n try {\n const raw = await fs.readFile(resolveInstalledSkillsIndex(root), 'utf8')\n const parsed = JSON.parse(raw)\n const skills = Array.isArray(parsed?.skills) ? parsed.skills : []\n const match = skills.find((entry) => entry && typeof entry === 'object' && entry.name === normalized && typeof entry.id === 'string')\n return match?.id\n } catch {\n return undefined\n }\n}\n\nfunction extractSkillName(args) {\n if (!args) {\n return ''\n }\n if (typeof args === 'string') {\n return args.trim()\n }\n if (typeof args !== 'object') {\n return ''\n }\n\n const direct = [args.name, args.skill, args.id]\n for (const value of direct) {\n if (typeof value === 'string' && value.trim()) {\n return value.trim()\n }\n }\n\n for (const value of Object.values(args)) {\n if (typeof value === 'string' && value.trim()) {\n return value.trim()\n }\n }\n\n return ''\n}\n\nasync function markSkillUsed(root, skillId) {\n if (!skillId) {\n return\n }\n\n try {\n await exec('skillcraft', ['_skill-used', skillId, root], { cwd: root })\n } catch {\n return\n }\n}\n\nasync function handlePayload(root, payload) {\n if (!payload || typeof payload !== 'object') {\n return\n }\n\n const extracted = extractModelInfo(payload)\n if (!extracted || !extracted.agentProvider && !extracted.modelProvider && !extracted.modelName) {\n return\n }\n\n const update = {\n agent: {\n provider: extracted.agentProvider || 'opencode',\n },\n model: {\n ...(extracted.modelProvider ? { provider: extracted.modelProvider } : {}),\n ...(extracted.modelName ? { name: extracted.modelName } : {}),\n },\n }\n\n await updateState(root, update)\n}\n\nexport default async function Skillcraft(context) {\n const repoRoot = context?.worktree || context?.directory || process.cwd()\n const handler = async (event) => {\n try {\n await handlePayload(repoRoot, event)\n } catch {\n return\n }\n }\n\n return {\n 'chat.message': async (event) => {\n try {\n await handler(event)\n } catch {\n return\n }\n },\n 'tool.execute.after': async (input) => {\n try {\n if (input?.tool !== 'skill') {\n return\n }\n const skillName = extractSkillName(input?.args)\n const skillId = await loadInstalledSkillId(repoRoot, skillName)\n await markSkillUsed(repoRoot, skillId)\n } catch {\n return\n }\n },\n event: async (event) => {\n try {\n const payload = event?.type && typeof event.type === 'string' ? event : event?.payload\n await handler(payload)\n } catch {\n return\n }\n },\n }\n}\n`\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { loadInstalledSkills, queueSkillUsage } from './installedSkills.js'\nimport type { InstalledSkillRecord } from './types.js'\n\ntype CodexHookPayload = {\n hook_event_name?: string\n turn_id?: string\n cwd?: string\n transcript_path?: string\n tool_input?: {\n command?: string\n }\n}\n\nexport async function recordCodexSkillUsage(repoPath: string, payload: unknown): Promise<void> {\n const installed = await loadInstalledSkills(repoPath)\n if (!installed.length) {\n return\n }\n\n const parsed = normalizePayload(payload)\n if (!parsed.hook_event_name) {\n return\n }\n\n const usedSkillIds = new Set<string>()\n if (parsed.hook_event_name === 'Stop') {\n for (const skillId of await detectExplicitSkillUsage(repoPath, installed, parsed.transcript_path, parsed.turn_id)) {\n usedSkillIds.add(skillId)\n }\n }\n\n for (const skillId of usedSkillIds) {\n await queueSkillUsage(repoPath, skillId)\n }\n}\n\nfunction normalizePayload(payload: unknown): CodexHookPayload {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return {}\n }\n\n const record = payload as Record<string, unknown>\n const toolInput = record.tool_input\n return {\n hook_event_name: normalizeText(record.hook_event_name),\n turn_id: normalizeText(record.turn_id),\n cwd: normalizeText(record.cwd),\n transcript_path: normalizeText(record.transcript_path),\n tool_input:\n toolInput && typeof toolInput === 'object' && !Array.isArray(toolInput)\n ? { command: normalizeText((toolInput as Record<string, unknown>).command) }\n : undefined,\n }\n}\n\nasync function detectExplicitSkillUsage(\n repoPath: string,\n installed: readonly InstalledSkillRecord[],\n transcriptPath?: string,\n targetTurnId?: string,\n): Promise<string[]> {\n if (!transcriptPath || !targetTurnId) {\n return []\n }\n\n const raw = await fs.readFile(transcriptPath, 'utf8').catch(() => '')\n if (!raw.trim()) {\n return []\n }\n\n const installedByPath = new Map<string, string>()\n const installedByName = new Map<string, string>()\n for (const skill of installed) {\n installedByName.set(skill.name, skill.id)\n installedByPath.set(normalizeFsPath(path.join(repoPath, skill.path, 'SKILL.md')), skill.id)\n }\n\n const detected = new Set<string>()\n let activeTurnId: string | undefined\n for (const line of raw.split(/\\r?\\n/)) {\n if (!line.trim()) {\n continue\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch {\n continue\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n continue\n }\n\n const record = parsed as Record<string, unknown>\n if (record.type === 'turn_context') {\n activeTurnId = extractTurnContextTurnId(record.payload)\n continue\n }\n\n if (record.type !== 'response_item' || activeTurnId !== targetTurnId) {\n continue\n }\n\n for (const entry of extractExplicitSkillReferences(record.payload)) {\n const skillId =\n (entry.path ? installedByPath.get(normalizeFsPath(entry.path)) : undefined)\n || (entry.name ? installedByName.get(entry.name) : undefined)\n if (skillId) {\n detected.add(skillId)\n }\n }\n }\n\n return Array.from(detected).sort()\n}\n\nfunction extractTurnContextTurnId(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return undefined\n }\n return normalizeText((payload as Record<string, unknown>).turn_id)\n}\n\nfunction extractExplicitSkillReferences(payload: unknown): Array<{ name?: string; path?: string }> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return []\n }\n\n const record = payload as Record<string, unknown>\n if (record.type !== 'message' || normalizeText(record.role) !== 'user' || !Array.isArray(record.content)) {\n return []\n }\n\n const matches: Array<{ name?: string; path?: string }> = []\n for (const item of record.content) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n continue\n }\n\n const text = normalizeText((item as Record<string, unknown>).text)\n if (!text) {\n continue\n }\n\n const skillBlocks = text.matchAll(/<skill>\\s*<name>([^<]+)<\\/name>\\s*<path>([^<]+)<\\/path>[\\s\\S]*?<\\/skill>/g)\n for (const block of skillBlocks) {\n matches.push({\n name: normalizeInstalledSkillName(block[1] || ''),\n path: normalizeText(block[2]),\n })\n }\n }\n\n return matches\n}\n\nfunction normalizeInstalledSkillName(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nfunction normalizeFsPath(filePath: string): string {\n return path.resolve(filePath)\n}\n\nfunction normalizeText(value: unknown): string | undefined {\n const text = typeof value === 'string' ? value.trim() : ''\n return text || undefined\n}\n","import path from 'node:path'\nimport { readJson, writeJson } from './fs.js'\nimport { installedSkillsIndexPath, pendingPath } from './paths.js'\nimport { InstalledSkillsFileSchema, type InstalledSkillInstall, type InstalledSkillRecord } from './types.js'\nimport { normalizeSkillId } from './validation.js'\n\nexport async function loadInstalledSkills(repoPath: string): Promise<InstalledSkillRecord[]> {\n const raw = await readJson<unknown>(installedSkillsIndexPath(repoPath))\n const parsed = InstalledSkillsFileSchema.safeParse(raw ?? { version: 1, skills: [] })\n return parsed.success ? parsed.data.skills : []\n}\n\nexport async function saveInstalledSkills(repoPath: string, skills: readonly InstalledSkillRecord[]): Promise<void> {\n const normalized = [...skills].sort((left, right) => left.id.localeCompare(right.id))\n await writeJson(installedSkillsIndexPath(repoPath), {\n version: 1,\n skills: normalized,\n })\n}\n\nexport async function registerInstalledSkill(repoPath: string, skill: InstalledSkillRecord): Promise<void> {\n const existing = await loadInstalledSkills(repoPath)\n const filtered = existing.filter((entry) => entry.id !== skill.id && entry.name !== skill.name)\n filtered.push(skill)\n await saveInstalledSkills(repoPath, filtered)\n}\n\nexport async function resolveInstalledSkillId(repoPath: string, name: string): Promise<string | undefined> {\n const normalized = normalizeInstalledSkillName(name)\n if (!normalized) {\n return undefined\n }\n\n const skills = await loadInstalledSkills(repoPath)\n return skills.find((entry) => entry.name === normalized)?.id\n}\n\nexport async function queueSkillUsage(repoPath: string, rawId: string): Promise<void> {\n const normalized = normalizeSkillId(rawId)\n if (!normalized) {\n throw new Error(`invalid skill id format: ${rawId}`)\n }\n\n const current = await readJson<unknown>(pendingPath(repoPath))\n const pending = current && typeof current === 'object' && !Array.isArray(current) && Array.isArray((current as { skills?: unknown[] }).skills)\n ? (current as { skills: unknown[] }).skills\n : []\n\n const next = Array.from(new Set(pending\n .map((entry) => (typeof entry === 'string' ? normalizeSkillId(entry) : undefined))\n .filter((entry): entry is string => !!entry)\n .concat(normalized))).sort()\n\n await writeJson(pendingPath(repoPath), { skills: next })\n}\n\nexport function normalizeInstalledSkillName(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n\n return normalized || 'skillcraft-skill'\n}\n\nexport function buildInstalledSkillRecord(input: {\n id: string\n name: string\n install: InstalledSkillInstall\n installedAt: string\n}): InstalledSkillRecord {\n return {\n id: input.id,\n name: input.name,\n path: path.posix.join('.agents', 'skills', input.name),\n install: input.install,\n installedAt: input.installedAt,\n }\n}\n","const localIdentifierPattern = /^[a-zA-Z0-9][a-zA-Z0-9._-]*\\/[a-zA-Z0-9][a-zA-Z0-9._-]*(?:@[^\\s/]+)?$/\nconst localIdentifierPatternWithoutVersion = /^[a-zA-Z0-9][a-zA-Z0-9._-]*\\/[a-zA-Z0-9][a-zA-Z0-9._-]*$/\nconst externalSourceIdWithoutVersion = /^([a-zA-Z0-9][a-zA-Z0-9._-]*):([a-zA-Z0-9][a-zA-Z0-9._-]*)(?:\\/([a-zA-Z0-9][a-zA-Z0-9._-]*))?$/\n\nexport type ParsedSkillId = {\n id: string\n owner?: string\n slug: string\n source?: string\n version?: string\n}\n\nexport function normalizeSkillId(value: string): string | undefined {\n const parsed = splitSkillIdentifier(value)\n if (!parsed.id) {\n return undefined\n }\n return `${parsed.id}${parsed.version ? `@${parsed.version}` : ''}`\n}\n\nexport function isValidIdentifier(value: string): boolean {\n return localIdentifierPattern.test(value)\n}\n\nexport function isValidSkillIdentifier(value: string): boolean {\n return !!splitSkillIdentifier(value).id\n}\n\nexport function splitSkillIdentifier(input: string): ParsedSkillId {\n const trimmed = input.trim()\n const parsed = splitIdentifierAndVersion(trimmed)\n const id = parsed.id || ''\n\n if (isLocalIdentifierWithoutVersion(id)) {\n const [owner, slug] = id.split('/')\n return {\n id,\n owner,\n slug,\n version: parsed.version,\n }\n }\n\n const match = externalSourceIdWithoutVersion.exec(id)\n if (!match) {\n return {\n id: '',\n slug: '',\n version: parsed.version,\n }\n }\n\n const source = match[1]\n const firstPart = match[2]\n const secondPart = match[3]\n\n if (secondPart === undefined) {\n return {\n id: `${source}:${firstPart}`,\n source,\n slug: firstPart,\n version: parsed.version,\n }\n }\n\n return {\n id: `${source}:${firstPart}/${secondPart}`,\n source,\n owner: firstPart,\n slug: secondPart,\n version: parsed.version,\n }\n}\n\nfunction isLocalIdentifierWithoutVersion(value: string): boolean {\n return localIdentifierPatternWithoutVersion.test(value)\n}\n\nexport function assertNonEmpty(value: string, field: string): string {\n const v = value.trim()\n if (!v) {\n throw new Error(`Expected ${field} to be provided`)\n }\n return v\n}\n\nexport function splitIdentifierAndVersion(value: string): { id: string; version?: string } {\n const parts = value.split('@')\n const id = parts[0] || ''\n const version = parts.length > 1 ? parts.slice(1).join('@') : undefined\n return {\n id,\n version,\n }\n}\n\nexport function splitArgPair(input: string): { owner: string; slug: string } {\n const [owner, slug] = input.split('/')\n if (!owner || !slug) {\n throw new Error(`Expected <owner>/<slug>, received ${input}`)\n }\n return { owner, slug: slug.trim() }\n}\n","import { execFile as execFileCb, spawn } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport path from 'node:path'\n\nconst execFile = promisify(execFileCb)\n\ntype GitOptions = {\n env?: NodeJS.ProcessEnv\n}\n\nexport async function git(args: readonly string[], cwd: string, options: GitOptions = {}): Promise<string> {\n try {\n const { stdout } = await execFile('git', args, {\n cwd,\n encoding: 'utf8',\n maxBuffer: 10 * 1024 * 1024,\n env: options.env,\n })\n return stdout.trim()\n } catch (error) {\n const message = (error as { message?: string }).message ?? String(error)\n throw new Error(`git command failed in ${cwd}: ${message}`)\n }\n}\n\nasync function gitWithInput(args: readonly string[], cwd: string, input: string, options: GitOptions = {}): Promise<string> {\n return await new Promise((resolve, reject) => {\n const child = spawn('git', args, {\n cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout.setEncoding('utf8')\n child.stdout.on('data', (chunk) => {\n stdout += chunk\n })\n\n child.stderr.setEncoding('utf8')\n child.stderr.on('data', (chunk) => {\n stderr += chunk\n })\n\n child.on('error', (error) => {\n reject(new Error(`git command failed in ${cwd}: ${error.message}`))\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n\n const message = stderr.trim() || stdout.trim() || `process exited with code ${code ?? 'unknown'}`\n reject(new Error(`git command failed in ${cwd}: ${message}`))\n })\n\n child.stdin.end(input)\n })\n}\n\nexport async function isGitRepo(cwd: string): Promise<boolean> {\n try {\n await git(['rev-parse', '--git-dir'], cwd)\n return true\n } catch {\n return false\n }\n}\n\nexport async function gitRoot(cwd: string): Promise<string> {\n return path.resolve(await git(['rev-parse', '--show-toplevel'], cwd))\n}\n\nexport async function gitRemote(cwd: string, remote = 'origin'): Promise<string | undefined> {\n try {\n const value = await git(['config', '--get', `remote.${remote}.url`], cwd)\n return value || undefined\n } catch {\n return undefined\n }\n}\n\nexport async function gitHooksPath(cwd: string): Promise<string> {\n return git(['rev-parse', '--git-path', 'hooks'], cwd)\n}\n\nexport async function gitCommitMessage(cwd: string, commit = 'HEAD'): Promise<string> {\n return git(['log', '--format=%B', '-n', '1', commit], cwd)\n}\n\nexport async function gitHeadCommit(cwd: string): Promise<string> {\n return (await git(['rev-parse', 'HEAD'], cwd)).trim()\n}\n\nexport async function gitHasRef(cwd: string, ref: string): Promise<boolean> {\n try {\n await git(['show-ref', '--verify', '--quiet', ref], cwd)\n return true\n } catch {\n return false\n }\n}\n\nexport async function gitCreateUnrelatedBranch(cwd: string, branch: string, message: string): Promise<void> {\n const ref = `refs/heads/${branch}`\n if (await gitHasRef(cwd, ref)) {\n return\n }\n\n const emptyTree = await gitWithInput(['hash-object', '-t', 'tree', '--stdin'], cwd, '')\n const commit = await git(['commit-tree', emptyTree, '-m', message], cwd)\n await git(['update-ref', ref, commit], cwd)\n}\n\nexport async function gitIsAncestor(cwd: string, ancestor: string, descendant = 'HEAD'): Promise<boolean> {\n try {\n await git(['merge-base', '--is-ancestor', ancestor, descendant], cwd)\n return true\n } catch {\n return false\n }\n}\n\nexport async function gitLsTreeNames(cwd: string, ref: string, subPath?: string): Promise<string[]> {\n try {\n const raw = await git(['ls-tree', '-r', '--name-only', ref, '--', ...(subPath ? [subPath] : [])], cwd)\n return raw ? raw.split('\\n').filter(Boolean) : []\n } catch {\n return []\n }\n}\n\nexport async function gitShowText(cwd: string, ref: string, filePath: string): Promise<string | undefined> {\n try {\n return await git(['show', `${ref}:${filePath}`], cwd)\n } catch {\n return undefined\n }\n}\n\nexport async function gitLogWithMessages(cwd: string, maxCount?: number): Promise<Array<{ commit: string; message: string }>> {\n const n = maxCount ? String(maxCount) : '200'\n const raw = await git(['log', `--max-count=${n}`, '--pretty=%H%x00%B'], cwd)\n if (!raw) {\n return []\n }\n return raw\n .split('\\u0000')\n .filter(Boolean)\n .map((entry) => {\n const [commit, ...messageParts] = entry.split('\\n')\n const message = messageParts.join('\\n').trimEnd()\n return { commit, message }\n })\n}\n\nexport async function amendCommitMessage(cwd: string, message: string): Promise<string> {\n const env = { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' }\n const tempFile = path.join(cwd, '.git', 'SKILLCRAFT_COMMIT_MESSAGE')\n const { writeFile } = await import('node:fs/promises')\n await writeFile(tempFile, `${message}\\n`, 'utf8')\n await execFile('git', ['commit', '--amend', '--file', tempFile, '--no-gpg-sign'], {\n cwd,\n encoding: 'utf8',\n env,\n })\n return gitHeadCommit(cwd)\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { ensureDir, fileExists, readText, writeText } from './fs.js'\nimport { gitHooksPath } from './git.js'\n\nconst MANAGED_MARKER = '# skillcraft-managed-hook'\n\ntype ManagedHook = {\n hookPath: string\n backupPath: string\n}\n\nfunction buildHookScript(backupPath: string | undefined, body: string): string {\n const rawCliPath = process.argv[1] || 'skillcraft'\n const cliPath = JSON.stringify(rawCliPath)\n const backup = backupPath ? JSON.stringify(backupPath) : undefined\n const backupBlock = backup\n ? `if [ -x ${backup} ]; then\n ${backup} \"$@\"\n SKILLCRAFT_PREVIOUS_HOOK_EXIT=$?\n if [ \"$SKILLCRAFT_PREVIOUS_HOOK_EXIT\" -ne 0 ]; then\n exit \"$SKILLCRAFT_PREVIOUS_HOOK_EXIT\"\n fi\nfi\n\n`\n : ''\n\n return `#!/usr/bin/env sh\n${MANAGED_MARKER}\nif [ -n \"$SKILLCRAFT_HOOK_DISABLED\" ]; then\n exit 0\nfi\n\n${backupBlock}SKILLCRAFT_HOOK_DIR=\"$PWD\"\nSKILLCRAFT_HOOK_DIR=\"$(git -C \"$SKILLCRAFT_HOOK_DIR\" rev-parse --show-toplevel 2>/dev/null || printf \"%s\" \"$SKILLCRAFT_HOOK_DIR\")\"\nSKILLCRAFT_CLI=${cliPath}\nunset GIT_INDEX_FILE\n\n${body}\n`\n}\n\nconst postCommitScript = (backupPath?: string) => buildHookScript(backupPath, `\"$SKILLCRAFT_CLI\" _hook post-commit \"$SKILLCRAFT_HOOK_DIR\" || true`)\n\nconst postPushScript = (backupPath?: string) => buildHookScript(backupPath, `SKILLCRAFT_HOOK_REMOTE=\"$1\"\n\"$SKILLCRAFT_CLI\" _hook post-push \"$SKILLCRAFT_HOOK_DIR\" \"$SKILLCRAFT_HOOK_REMOTE\" || true`)\n\nconst prePushScript = (backupPath?: string) => buildHookScript(backupPath, `SKILLCRAFT_HOOK_REMOTE=\"$1\"\n\"$SKILLCRAFT_CLI\" _hook post-push \"$SKILLCRAFT_HOOK_DIR\" \"$SKILLCRAFT_HOOK_REMOTE\" || true`)\n\nexport async function installPostCommitHook(repoPath: string): Promise<void> {\n const hooksDir = await resolveManagedHooksDir(repoPath)\n await ensureDir(hooksDir)\n\n await installManagedHook(path.join(hooksDir, 'post-commit'), postCommitScript)\n await installManagedHook(path.join(hooksDir, 'post-push'), postPushScript)\n await installManagedHook(path.join(hooksDir, 'pre-push'), prePushScript)\n}\n\nexport async function removePostCommitHook(repoPath: string): Promise<void> {\n const hooksDir = await resolveManagedHooksDir(repoPath).catch(() => undefined)\n if (!hooksDir || hooksDir === '/dev/null') {\n return\n }\n\n await Promise.all([\n restoreManagedHook(path.join(hooksDir, 'post-commit')),\n restoreManagedHook(path.join(hooksDir, 'post-push')),\n restoreManagedHook(path.join(hooksDir, 'pre-push')),\n ])\n}\n\nexport async function hasInstalledPostCommitHook(repoPath: string): Promise<boolean> {\n const hooksDir = await resolveManagedHooksDir(repoPath).catch(() => undefined)\n if (!hooksDir || hooksDir === '/dev/null') {\n return false\n }\n\n const hookPath = path.join(hooksDir, 'post-commit')\n if (!(await fileExists(hookPath))) {\n return false\n }\n\n return isSkillcraftManagedHook(await readText(hookPath).catch(() => ''))\n}\n\nasync function resolveManagedHooksDir(repoPath: string): Promise<string> {\n const rawPath = await gitHooksPath(repoPath)\n if (rawPath === '/dev/null') {\n throw new Error('Git hooks are disabled for this repository (`core.hooksPath=/dev/null`). Re-enable hooks or unset `core.hooksPath` before running `skillcraft enable`.')\n }\n\n const resolved = path.isAbsolute(rawPath) ? path.normalize(rawPath) : path.resolve(repoPath, rawPath)\n const gitHooksDir = path.join(repoPath, '.git', 'hooks')\n if (resolved === gitHooksDir || isWithinPath(resolved, repoPath)) {\n return resolved\n }\n\n throw new Error(`Git hooks path points outside this repository: ${resolved}. Skillcraft currently supports the default hooks directory or repo-local hooks paths such as .husky.`)\n}\n\nasync function installManagedHook(hookPath: string, buildScript: (backupPath?: string) => string): Promise<void> {\n const managed = await readManagedHook(hookPath)\n if (managed.exists && managed.isManaged) {\n await writeText(hookPath, `${buildScript(managed.backupExists ? managed.backupPath : undefined)}\\n`)\n await fs.chmod(hookPath, 0o755)\n return\n }\n\n let backupPath: string | undefined\n if (managed.exists) {\n backupPath = managed.backupPath\n if (!(await fileExists(backupPath))) {\n await fs.rename(hookPath, backupPath)\n } else {\n await fs.rm(hookPath, { force: true })\n }\n }\n\n await writeText(hookPath, `${buildScript(backupPath)}\\n`)\n await fs.chmod(hookPath, 0o755)\n}\n\nasync function restoreManagedHook(hookPath: string): Promise<void> {\n const managed = await readManagedHook(hookPath)\n if (!managed.exists || !managed.isManaged) {\n return\n }\n\n if (managed.backupExists) {\n await fs.rename(managed.backupPath, hookPath)\n return\n }\n\n await fs.rm(hookPath, { force: true })\n}\n\nasync function readManagedHook(hookPath: string): Promise<ManagedHook & { exists: boolean; isManaged: boolean; backupExists: boolean }> {\n const backupPath = `${hookPath}.skillcraft.orig`\n const exists = await fileExists(hookPath)\n if (!exists) {\n return { hookPath, backupPath, exists: false, isManaged: false, backupExists: await fileExists(backupPath) }\n }\n\n const contents = await readText(hookPath).catch(() => '')\n return {\n hookPath,\n backupPath,\n exists: true,\n isManaged: isSkillcraftManagedHook(contents),\n backupExists: await fileExists(backupPath),\n }\n}\n\nfunction isSkillcraftManagedHook(contents: string): boolean {\n return contents.includes(MANAGED_MARKER)\n || (contents.includes('SKILLCRAFT_CLI=') && (contents.includes('_hook post-commit') || contents.includes('_hook post-push')))\n}\n\nfunction isWithinPath(targetPath: string, rootPath: string): boolean {\n const relative = path.relative(rootPath, targetPath)\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))\n}\n","import { removeRepo } from '@/core/config'\nimport {\n disableAgentIntegration,\n loadEnabledAgents,\n parseAgentOptions,\n saveEnabledAgents,\n unsupportedAgentOptions,\n} from '@/core/agents'\nimport { removeFile, removePath } from '@/core/fs'\nimport { gitRoot, isGitRepo } from '@/core/git'\nimport { removePostCommitHook } from '@/core/hooks'\nimport { aiModelContextPath, localGitDir, localSkillcraftConfig, pendingPath, contextPath, pluginPath } from '@/core/paths'\nimport { type AgentIntegration } from '@/core/types'\n\ntype DisableOptions = {\n agents?: string[]\n}\n\nexport async function runDisable(options: DisableOptions = {}): Promise<void> {\n const cwd = process.cwd()\n if (!(await isGitRepo(cwd))) {\n throw new Error('Current directory is not a git repository')\n }\n const root = await gitRoot(cwd)\n const currentAgents = await loadEnabledAgents(root)\n const targetAgents = resolveDisableAgents(options.agents || [], currentAgents)\n\n for (const agent of targetAgents) {\n await disableAgentIntegration(root, agent)\n }\n\n const remainingAgents = currentAgents.filter((agent) => !targetAgents.includes(agent))\n if (remainingAgents.length) {\n await saveEnabledAgents(root, remainingAgents)\n process.stdout.write(`disabled skillcraft agents for ${root} (remaining: ${remainingAgents.join(', ')})\\n`)\n return\n }\n\n await removeGenericSkillcraftState(root)\n process.stdout.write(`disabled skillcraft for ${root}\\n`)\n}\n\nfunction resolveDisableAgents(rawAgents: readonly string[], currentAgents: AgentIntegration[]): AgentIntegration[] {\n const invalid = unsupportedAgentOptions(rawAgents)\n if (invalid.length) {\n throw new Error(`Unsupported agent value: ${invalid.join(', ')}`)\n }\n\n if (!currentAgents.length) {\n return []\n }\n\n const requested = parseAgentOptions(rawAgents)\n if (!requested.length) {\n return currentAgents\n }\n\n const active = requested.filter((agent) => currentAgents.includes(agent))\n if (!active.length) {\n throw new Error(`None of the requested agents are enabled in this repository: ${requested.join(', ')}`)\n }\n\n return active\n}\n\nasync function removeGenericSkillcraftState(root: string): Promise<void> {\n await Promise.all([\n removeFile(localSkillcraftConfig(root)),\n removeFile(pendingPath(root)),\n removeFile(contextPath(root)),\n removeFile(pluginPath(root)),\n removeFile(aiModelContextPath(root)),\n removePath(localGitDir(root)),\n ])\n await removePostCommitHook(root)\n await removeRepo(root)\n}\n","import { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport os from 'node:os'\nimport fs from 'node:fs/promises'\nimport { ensureDir, readJson, writeJson } from './fs.js'\nimport { pendingPath, contextPath, aiModelContextPath } from './paths.js'\nimport { DefaultProofRef, PendingSchema, ContextSchema, type Proof } from './types.js'\nimport { git, gitCommitMessage, gitCreateUnrelatedBranch, gitHasRef, gitLsTreeNames, gitRemote, gitShowText } from './git.js'\nimport { isValidSkillIdentifier, splitSkillIdentifier } from './validation.js'\nimport { loadLocalConfig } from './config.js'\n\nconst PROOFS_DIR = 'proofs'\n\nfunction normalizeProofBranch(proofRef?: string): string {\n const clean = proofRef?.trim() || DefaultProofRef\n return clean.replace(/^refs\\/heads\\//, '')\n}\n\nfunction proofPathForId(proofId: string): string {\n return `${PROOFS_DIR}/${proofId}.json`\n}\n\nasync function proofBranch(repoPath: string): Promise<string> {\n const config = await loadLocalConfig(repoPath)\n return normalizeProofBranch(config.proofRef)\n}\n\nasync function proofSearchRefs(repoPath: string, branch: string): Promise<string[]> {\n const normalized = normalizeProofBranch(branch)\n const localRef = `refs/heads/${normalized}`\n const remoteRef = `refs/remotes/origin/${normalized}`\n const refs = [] as string[]\n\n if (await gitHasRef(repoPath, localRef)) {\n refs.push(normalized)\n }\n if (await gitHasRef(repoPath, remoteRef)) {\n refs.push(`origin/${normalized}`)\n }\n\n if (!refs.length) {\n refs.push(normalized)\n }\n\n return refs\n}\n\nasync function ensureProofBranch(repoPath: string, branch: string): Promise<void> {\n const fullRef = `refs/heads/${branch}`\n if (await gitHasRef(repoPath, fullRef)) {\n return\n }\n\n await gitCreateUnrelatedBranch(repoPath, branch, 'Initialize Skillcraft proofs branch')\n}\n\nasync function withProofWorktree<T>(repoPath: string, branch: string, action: (worktree: string) => Promise<T>): Promise<T> {\n await removeProofWorktrees(repoPath, branch)\n const worktree = await fs.mkdtemp(path.join(os.tmpdir(), 'skillcraft-proof-'))\n\n try {\n await git(['worktree', 'add', '--quiet', worktree, branch], repoPath)\n return await action(worktree)\n } finally {\n await removeProofWorktree(repoPath, worktree)\n }\n}\n\nasync function removeProofWorktree(repoPath: string, worktreePath: string): Promise<void> {\n try {\n await git(['worktree', 'remove', '--force', worktreePath], repoPath)\n } catch {\n await fs.rm(worktreePath, { force: true, recursive: true })\n }\n}\n\nasync function removeProofWorktrees(repoPath: string, branch: string): Promise<void> {\n const targetRef = `refs/heads/${branch}`\n\n try {\n const raw = await git(['worktree', 'list', '--porcelain'], repoPath)\n const lines = raw.split('\\n')\n let currentWorktree: string | undefined\n let currentBranch: string | undefined\n\n const maybeRemove = async () => {\n if (!currentWorktree || currentBranch !== targetRef) {\n return\n }\n await removeProofWorktree(repoPath, currentWorktree)\n }\n\n for (const line of lines) {\n if (!line) {\n currentWorktree = undefined\n currentBranch = undefined\n continue\n }\n\n if (line.startsWith('worktree ')) {\n await maybeRemove()\n currentWorktree = line.slice(9)\n currentBranch = undefined\n continue\n }\n\n if (line.startsWith('branch ')) {\n currentBranch = line.slice(7)\n }\n }\n\n await maybeRemove()\n } catch {\n return\n }\n}\n\nexport async function loadProofsFromRepo(repoPath: string): Promise<Proof[]> {\n const branch = await proofBranch(repoPath)\n const searchRefs = await proofSearchRefs(repoPath, branch)\n const files = new Set<string>()\n\n for (const proofRef of searchRefs) {\n const listed = await gitLsTreeNames(repoPath, proofRef, PROOFS_DIR)\n for (const file of listed) {\n files.add(file)\n }\n }\n\n const proofs: Proof[] = []\n\n for (const file of files) {\n if (!file.endsWith('.json')) {\n continue\n }\n\n const proofId = path.basename(file, '.json')\n const proof = await readProof(repoPath, proofId)\n if (proof) {\n proofs.push(proof)\n }\n }\n\n return proofs\n}\n\nfunction parseSkillFromRaw(value: string): { id: string; version?: string } | undefined {\n const parsed = splitSkillIdentifier(value)\n if (!parsed.id) {\n return undefined\n }\n\n if (!isValidSkillIdentifier(parsed.id)) {\n return undefined\n }\n\n return {\n id: parsed.id,\n version: parsed.version,\n }\n}\n\nexport function normalizeSkillIds(raw: string[]): string[] {\n const normalized = raw\n .filter(Boolean)\n .map((item) => splitSkillIdentifier(item))\n .filter((entry): entry is { id: string; version?: string; slug: string } => !!entry.id)\n .map((entry) => `${entry.id}${entry.version ? `@${entry.version}` : ''}`)\n\n return Array.from(new Set(normalized)).filter(isValidSkillIdentifier).sort()\n}\n\nexport function buildProofId(skills: string[], timestamp: string, loadouts: string[]): string {\n const normalized = {\n skills,\n loadouts,\n timestamp,\n }\n const digest = createHash('sha256').update(JSON.stringify(normalized)).digest('hex')\n return digest.slice(0, 8)\n}\n\nexport async function loadPending(repoPath: string): Promise<string[]> {\n const raw = await readJson<unknown>(pendingPath(repoPath))\n const parsed = PendingSchema.safeParse(raw ?? { skills: [] })\n return parsed.success ? normalizeSkillIds(parsed.data.skills) : []\n}\n\nexport async function loadContext(repoPath: string): Promise<string[]> {\n const raw = await readJson<unknown>(contextPath(repoPath))\n const parsed = ContextSchema.safeParse(raw ?? { activeLoadouts: [] })\n return parsed.success ? parsed.data.activeLoadouts : []\n}\n\nexport async function loadAiModelContext(repoPath: string): Promise<{ agent?: { provider?: string }; model?: { provider?: string; name?: string } }> {\n const raw = await readJson<unknown>(aiModelContextPath(repoPath))\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return {}\n }\n\n const record = raw as Record<string, unknown>\n const agentValue = record.agent && typeof record.agent === 'object' && !Array.isArray(record.agent)\n ? (record.agent as Record<string, unknown>)\n : undefined\n\n const modelValue = record.model && typeof record.model === 'object' && !Array.isArray(record.model)\n ? (record.model as Record<string, unknown>)\n : undefined\n\n return {\n agent: typeof agentValue?.provider === 'string' ? { provider: normalizeLowerCase(agentValue.provider) } : undefined,\n model:\n typeof modelValue?.provider === 'string' || typeof modelValue?.name === 'string'\n ? {\n provider: typeof modelValue.provider === 'string' ? normalizeLowerCase(modelValue.provider) : undefined,\n name: typeof modelValue.name === 'string' ? normalizeModelName(modelValue.name) : undefined,\n }\n : undefined,\n }\n}\n\nfunction normalizeLowerCase(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction normalizeModelName(value: string): string {\n return value.trim()\n}\n\nexport function parseProof(payload: unknown): Proof | undefined {\n if (!payload || typeof payload !== 'object') {\n return undefined\n }\n const record = payload as Record<string, unknown>\n if (typeof record.version !== 'number' || typeof record.commit !== 'string' || !Array.isArray(record.skills)) {\n return undefined\n }\n if (!record.timestamp || typeof record.timestamp !== 'string') {\n return undefined\n }\n const loadouts = Array.isArray(record.loadouts) ? record.loadouts.map(String) : []\n const skills = record.skills\n .map((entry) => {\n if (typeof entry === 'string') {\n return { id: entry }\n }\n if (entry && typeof entry === 'object' && 'id' in entry && typeof entry.id === 'string') {\n return { id: entry.id, version: typeof entry.version === 'string' ? entry.version : undefined }\n }\n return undefined\n })\n .filter((entry): entry is { id: string; version?: string } => !!entry)\n return {\n version: record.version,\n commit: record.commit,\n skills,\n loadouts,\n timestamp: record.timestamp,\n agent: parseAgentValue(record.agent),\n model: parseModelValue(record.model),\n }\n}\n\nfunction parseAgentValue(value: unknown): { provider?: string } | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n const provider = (value as Record<string, unknown>).provider\n if (typeof provider !== 'string') {\n return undefined\n }\n\n const normalized = provider.trim().toLowerCase()\n return normalized ? { provider: normalized } : undefined\n}\n\nfunction parseModelValue(value: unknown): { provider?: string; name?: string } | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n const raw = value as Record<string, unknown>\n const normalizedProvider = typeof raw.provider === 'string' ? raw.provider.trim().toLowerCase() : undefined\n const normalizedName = typeof raw.name === 'string' ? raw.name.trim() : undefined\n\n if (!normalizedProvider && !normalizedName) {\n return undefined\n }\n\n return {\n provider: normalizedProvider,\n name: normalizedName,\n }\n}\n\nexport async function readProof(repoPath: string, proofId: string): Promise<Proof | undefined> {\n const branch = await proofBranch(repoPath)\n const file = proofPathForId(proofId)\n const searchRefs = await proofSearchRefs(repoPath, branch)\n\n for (const proofRef of searchRefs) {\n const payload = await gitShowText(repoPath, proofRef, file)\n if (!payload) {\n continue\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(payload)\n } catch {\n continue\n }\n\n const proof = parseProof(parsed)\n if (proof) {\n return proof\n }\n }\n\n return undefined\n}\n\nexport async function writeProof(repoPath: string, proof: Proof): Promise<string> {\n const proofId = buildProofId(proof.skills.map((skill) => skill.id), proof.timestamp, proof.loadouts)\n const branch = await proofBranch(repoPath)\n await ensureProofBranch(repoPath, branch)\n\n const proofFile = proofPathForId(proofId)\n await withProofWorktree(repoPath, branch, async (worktree) => {\n await ensureDir(path.join(worktree, PROOFS_DIR))\n await writeJson(path.join(worktree, proofFile), proof)\n await git(['add', proofFile], worktree, { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } })\n\n const status = await git(\n ['status', '--porcelain', '--', proofFile],\n worktree,\n { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } },\n )\n if (!status) {\n return\n }\n\n await git(\n ['commit', '--no-gpg-sign', '-m', `add Skillcraft proof ${proofId}`],\n worktree,\n { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } },\n )\n })\n\n return proofId\n}\n\nexport async function pushProofBranch(repoPath: string, remoteName = 'origin'): Promise<void> {\n const branch = await proofBranch(repoPath)\n const remote = await gitRemote(repoPath, remoteName)\n if (!remote || !remoteName) {\n return\n }\n\n try {\n await git(['push', remoteName, `${branch}:${branch}`], repoPath, { env: { ...process.env, SKILLCRAFT_HOOK_DISABLED: '1' } })\n } catch {\n return\n }\n}\n\nexport async function currentProofIdForCommit(repoPath: string, commit: string): Promise<string | undefined> {\n const proofs = await loadProofsFromRepo(repoPath)\n\n for (const proof of proofs) {\n if (proof.commit === commit) {\n return buildProofId(\n proof.skills.map((skill) => skill.id),\n proof.timestamp,\n proof.loadouts,\n )\n }\n }\n return undefined\n}\n\nexport async function buildProofFromPending(\n repoPath: string,\n commit: string,\n timestamp: string = new Date().toISOString(),\n): Promise<{ proofId: string; proof: Proof } | undefined> {\n const pending = await loadPending(repoPath)\n const loadouts = await loadContext(repoPath)\n const aiModelContext = await loadAiModelContext(repoPath)\n const parsedSkills = pending\n .map((skill) => parseSkillFromRaw(skill))\n .filter((entry): entry is { id: string; version?: string } => !!entry)\n\n const proof: Proof = {\n version: 1,\n commit,\n skills: parsedSkills,\n loadouts,\n timestamp,\n ...aiModelContext,\n }\n\n const proofId = await writeProof(repoPath, proof)\n return { proofId, proof }\n}\n\nexport async function stripDraftMessage(message: string): Promise<string> {\n return message\n .replace(/\\nSkillcraft-Ref: .*$/gm, '')\n .trimEnd()\n}\n\nexport async function buildCommitMessageWithProof(repoPath: string, proofId: string): Promise<string> {\n const existing = await gitCommitMessage(repoPath)\n const cleaned = await stripDraftMessage(existing)\n if (cleaned.includes('Skillcraft-Ref:')) {\n return cleaned\n }\n return `${cleaned}\\n\\nSkillcraft-Ref: ${proofId}\\n`\n}\n","import { fileExists, readJson } from './fs.js'\nimport { localSkillcraftConfig, localGitDir } from './paths.js'\nimport { ConfigSchema } from './types.js'\n\nexport async function isEnabled(repoPath: string): Promise<boolean> {\n const configPath = localSkillcraftConfig(repoPath)\n if (!(await fileExists(configPath))) {\n return false\n }\n const raw = await readJson<unknown>(configPath)\n const parsed = ConfigSchema.safeParse(raw ?? {})\n return parsed.success\n}\n\nexport async function hasSkillcraftDir(repoPath: string): Promise<boolean> {\n return fileExists(localGitDir(repoPath))\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { execFile, execSync } from 'node:child_process'\nimport { promisify } from 'node:util'\n\nconst exec = promisify(execFile)\n\nexport type ClaimInputs = {\n credential: string\n claimant: string\n sources: Array<{ repo: string; commits: string[] }>\n claimId: string\n}\n\nexport type PublishInputs = {\n targetRepo: string\n sourceDir: string\n destinationPath: string\n branch: string\n commitMessage: string\n}\n\nexport interface ForgeProvider {\n providerName(): string\n getUser(): Promise<string>\n getIssueUrl(repo: string, number: number): Promise<string>\n createIssue(repo: string, title: string, body: string): Promise<number>\n createPullRequest(repo: string, branch: string, title: string): Promise<number>\n openPullRequestForBranch(\n targetRepo: string,\n sourceRepo: string,\n sourceBranch: string,\n title: string,\n body: string,\n ): Promise<number>\n getIssueStatus(repo: string, issueNumber: number): Promise<{ state: string; labels: string[]; url: string }>\n listClaimProcessingRuns(repo: string, issueNumber: number): Promise<\n Array<{\n status: string\n conclusion?: string | null\n url: string\n name?: string\n createdAt?: string\n workflowName?: string\n }>\n >\n listClaimIssues(repo: string): Promise<\n Array<{\n number: number\n title: string\n state: string\n body?: string\n url?: string\n labels?: Array<{ name: string }>\n }>\n >\n cloneRepo(fullName: string, destination: string): Promise<void>\n copyDirectory(source: string, destination: string): Promise<void>\n}\n\nfunction hasGh(): boolean {\n try {\n execSync('which gh', { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n\nasync function runGh(args: readonly string[]): Promise<string> {\n if (!hasGh()) {\n throw new Error('gh CLI is required for this workflow')\n }\n const result = await exec('gh', args, { encoding: 'utf8' })\n return result.stdout.trim()\n}\n\nasync function copyDirRecursively(source: string, target: string): Promise<void> {\n await fs.mkdir(target, { recursive: true })\n const entries = await fs.readdir(source, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.name === '.git') {\n continue\n }\n const from = path.join(source, entry.name)\n const to = path.join(target, entry.name)\n if (entry.isDirectory()) {\n await copyDirRecursively(from, to)\n continue\n }\n if (entry.isSymbolicLink()) {\n const link = await fs.readlink(from)\n await fs.symlink(link, to)\n continue\n }\n if (entry.isFile()) {\n await fs.copyFile(from, to)\n }\n }\n}\n\nexport class GitHubProvider implements ForgeProvider {\n providerName(): string {\n return 'gh'\n }\n\n async getUser(): Promise<string> {\n return await runGh(['api', 'user', '--jq', '.login'])\n }\n\n async getIssueUrl(repo: string, number: number): Promise<string> {\n return `https://github.com/${repo}/issues/${number}`\n }\n\n async createIssue(repo: string, title: string, body: string): Promise<number> {\n const raw = await runGh([\n 'issue',\n 'create',\n '-R',\n repo,\n '--title',\n title,\n '--body',\n body,\n ])\n const match = raw.match(/\\b(\\d+)$/)\n if (!match) {\n return 0\n }\n return Number(match[1])\n }\n\n async createPullRequest(targetRepo: string, branch: string, title: string): Promise<number> {\n const raw = await runGh([\n 'pr',\n 'create',\n '--repo',\n targetRepo,\n '--head',\n branch,\n '--base',\n 'main',\n '--title',\n title,\n '--body',\n `Generated by skillcraft for ${title}`,\n '--fill-first',\n ])\n const match = raw.match(/\\b(\\d+)$/)\n if (!match) {\n return 0\n }\n return Number(match[1])\n }\n\n async openPullRequestForBranch(\n targetRepo: string,\n sourceRepo: string,\n sourceBranch: string,\n title: string,\n body: string,\n ): Promise<number> {\n const raw = await runGh([\n 'pr',\n 'create',\n '--repo',\n targetRepo,\n '--head',\n `${sourceRepo}:${sourceBranch}`,\n '--base',\n 'main',\n '--title',\n title,\n '--body',\n body,\n ])\n const match = raw.match(/\\b(\\d+)$/)\n if (!match) {\n return 0\n }\n return Number(match[1])\n }\n\n async getIssueStatus(repo: string, issueNumber: number): Promise<{ state: string; labels: string[]; url: string }> {\n const raw = await runGh(['issue', 'view', String(issueNumber), '--repo', repo, '--json', 'state,labels,url'])\n const parsed = JSON.parse(raw) as { state: string; labels: Array<{ name: string }>; url: string }\n return {\n state: parsed.state,\n labels: parsed.labels?.map((label) => label.name) ?? [],\n url: parsed.url,\n }\n }\n\n async listClaimProcessingRuns(repo: string, issueNumber: number): Promise<\n Array<{\n status: string\n conclusion?: string | null\n url: string\n name?: string\n createdAt?: string\n workflowName?: string\n }>\n > {\n const raw = await runGh([\n 'run',\n 'list',\n '--repo',\n repo,\n '--workflow',\n 'Process credential claims',\n '--json',\n 'name,status,conclusion,url,createdAt,workflowName',\n ])\n const parsed = JSON.parse(raw) as Array<{\n status?: string\n conclusion?: string | null\n url?: string\n name?: string\n createdAt?: string\n workflowName?: string\n }>\n const issueMarker = `#${issueNumber}`\n\n const candidates = parsed.filter((entry) => {\n const name = entry.name || ''\n const workflowName = entry.workflowName || ''\n return name.includes(issueMarker) || workflowName.includes(issueMarker)\n })\n\n const runs = candidates.length > 0\n ? candidates\n : parsed.filter((entry) => entry.status && ['in_progress', 'queued', 'waiting', 'action_required', 'canceling'].includes(entry.status))\n if (!runs.length) {\n return []\n }\n\n return runs\n .filter((entry) => entry.url)\n .map((entry) => ({\n status: entry.status || 'unknown',\n conclusion: entry.conclusion ?? undefined,\n url: entry.url!,\n name: entry.name,\n createdAt: entry.createdAt,\n workflowName: entry.workflowName,\n }))\n }\n\n async listClaimIssues(repo: string): Promise<\n Array<{\n number: number\n title: string\n state: string\n body?: string\n url?: string\n labels?: Array<{ name: string }>\n }>\n > {\n const raw = await runGh([\n 'issue',\n 'list',\n '--repo',\n repo,\n '--state',\n 'all',\n '--json',\n 'number,title,state,body,labels,url',\n '--limit',\n '100',\n ])\n const parsed = JSON.parse(raw) as Array<{\n number: number\n title: string\n state: string\n body?: string\n labels?: Array<{ name: string }>\n url?: string\n }>\n return parsed.filter((issue) => hasClaimTitle(issue.title) || hasLabel(issue.labels, 'skillcraft-claim'))\n }\n\n async cloneRepo(fullName: string, destination: string): Promise<void> {\n const temp = path.resolve(destination)\n await runGh(['repo', 'clone', fullName, temp])\n }\n\n async copyDirectory(source: string, destination: string): Promise<void> {\n const info = await fs.readdir(destination).catch(() => undefined)\n if (info) {\n await fs.rm(destination, { recursive: true, force: true })\n }\n await fs.mkdir(destination, { recursive: true })\n await copyDirRecursively(source, destination)\n }\n}\n\nfunction normalizeText(value?: string): string {\n return String(value || '').trim().toLowerCase()\n}\n\nfunction hasClaimTitle(title?: string): boolean {\n return normalizeText(title).startsWith('claim:')\n}\n\nfunction hasLabel(labels: Array<{ name: string }> | undefined, expected: string): boolean {\n const normalized = normalizeText(expected)\n return (labels || []).some((entry) => normalizeText(entry?.name) === normalized)\n}\n","import { GitHubProvider } from './github.js'\n\nexport type ProviderName = 'gh'\n\nexport const providers = {\n gh: () => new GitHubProvider(),\n}\n\nexport function getProvider(name: 'gh'): GitHubProvider {\n return providers[name]()\n}\n","import { detectAvailableAgents, loadEnabledAgents } from '@/core/agents'\nimport { loadLocalConfig } from '@/core/config'\nimport { fileExists } from '@/core/fs'\nimport { gitHasRef, gitHeadCommit, gitLogWithMessages, gitRoot, isGitRepo } from '@/core/git'\nimport { hasInstalledPostCommitHook } from '@/core/hooks'\nimport { contextPath } from '@/core/paths'\nimport { currentProofIdForCommit, loadPending } from '@/core/proof'\nimport { isEnabled } from '@/core/state'\nimport { getProvider } from '@/providers'\n\nexport async function runStatus(): Promise<void> {\n const cwd = process.cwd()\n const git = await isGitRepo(cwd)\n process.stdout.write(`git: ${git ? 'enabled' : 'not a repository'}\\n`)\n const repoPath = git ? await gitRoot(cwd) : cwd\n\n const enabled = await isEnabled(repoPath)\n process.stdout.write(`skillcraft: ${enabled ? 'enabled' : 'disabled'}\\n`)\n\n if (!git || !enabled) {\n return\n }\n\n const pending = await loadPending(repoPath)\n const agents = await loadEnabledAgents(repoPath)\n process.stdout.write(`pending skills: ${pending.length}\\n`)\n process.stdout.write(`agents: ${agents.length ? agents.join(', ') : 'none'}\\n`)\n const contextExists = await fileExists(contextPath(repoPath))\n const hasHook = await hasInstalledPostCommitHook(repoPath)\n process.stdout.write(`context file: ${contextExists ? 'present' : 'missing'}\\n`)\n process.stdout.write(`post-commit hook: ${hasHook ? 'installed' : 'missing'}\\n`)\n\n const head = await gitHeadCommit(repoPath)\n const proofId = await currentProofIdForCommit(repoPath, head)\n process.stdout.write(`head: ${head}\\n`)\n process.stdout.write(`latest proof: ${proofId ?? 'none'}\\n`)\n\n const logs = await gitLogWithMessages(repoPath, 20)\n const withSkillcraft = logs.filter((entry) => entry.message.includes('Skillcraft-Ref:'))\n process.stdout.write(`recent commits with evidence: ${withSkillcraft.length}\\n`)\n\n const config = await loadLocalConfig(repoPath)\n const branch = config.proofRef?.replace(/^refs\\/heads\\//, '') || 'skillcraft/proofs/v1'\n const proofBranchExists = await gitHasRef(repoPath, `refs/heads/${branch}`)\n process.stdout.write(`proof branch: ${proofBranchExists ? 'present' : 'missing'}\\n`)\n\n if (pending.length > 0) {\n process.stdout.write(`pending evidence queued: ${pending.join(', ')}\\n`)\n }\n}\n\nexport async function runDoctor(): Promise<void> {\n const checks = await Promise.all([\n checkTool('node'),\n checkTool('npm'),\n checkTool('git'),\n checkTool('gh'),\n checkTool('codex'),\n checkTool('opencode'),\n ])\n\n for (const [name, ok] of checks) {\n process.stdout.write(`${name}: ${ok ? 'ok' : 'missing'}\\n`)\n }\n\n const detectedAgents = await detectAvailableAgents()\n process.stdout.write(`detected agents: ${detectedAgents.length ? detectedAgents.join(', ') : 'none'}\\n`)\n\n const ghAvailable = checks.find(([name]) => name === 'gh')?.[1] ?? false\n if (!ghAvailable) {\n process.stdout.write('gh auth: missing\\n')\n process.stdout.write('github user: unknown\\n')\n return\n }\n\n const login = await getProvider('gh').getUser().catch(() => '')\n process.stdout.write(`gh auth: ${login ? 'ok' : 'missing'}\\n`)\n process.stdout.write(`github user: ${login || 'unknown'}\\n`)\n}\n\nasync function checkTool(tool: string): Promise<[string, boolean]> {\n return [tool, await isToolAvailable(tool)]\n}\n\nasync function isToolAvailable(tool: string): Promise<boolean> {\n try {\n const { execSync } = await import('node:child_process')\n execSync(`command -v ${tool}`, { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { addRepo, loadGlobalConfig, saveGlobalConfig } from '@/core/config'\nimport {\n detectAvailableAgents,\n enableAgentIntegration,\n ensureAiModelContext,\n loadEnabledAgents,\n parseAgentOptions,\n saveEnabledAgents,\n unsupportedAgentOptions,\n} from '@/core/agents'\nimport { ensureDir, writeJson } from '@/core/fs'\nimport { gitCreateUnrelatedBranch, gitHasRef, gitRemote, gitRoot, isGitRepo } from '@/core/git'\nimport { installPostCommitHook } from '@/core/hooks'\nimport { contextPath, localGitDir, localSkillcraftConfig, pendingPath, skillcraftGlobalDir } from '@/core/paths'\nimport { DefaultProofRef, type AgentIntegration } from '@/core/types'\nimport { getProvider } from '@/providers'\n\ntype EnableOptions = {\n agents?: string[]\n}\n\nexport async function runEnable(options: EnableOptions = {}): Promise<void> {\n const cwd = process.cwd()\n if (!(await isGitRepo(cwd))) {\n throw new Error('Current directory is not a git repository')\n }\n const root = await gitRoot(cwd)\n const requestedAgents = await resolveRequestedAgents(options.agents || [])\n\n const config = await loadGlobalConfig()\n if (!config.githubUser) {\n const provider = getProvider(config.provider ?? 'gh')\n const fallback = await provider.getUser().catch(() => process.env.GITHUB_USER || process.env.USER || 'developer')\n await saveGlobalConfig({ ...config, githubUser: fallback })\n }\n\n await ensureDir(localGitDir(root))\n\n const branchRef = `refs/heads/${DefaultProofRef}`\n if (!(await gitHasRef(root, branchRef))) {\n await gitCreateUnrelatedBranch(root, DefaultProofRef, 'Initialize Skillcraft proofs branch')\n }\n\n await writeJson(localSkillcraftConfig(root), {\n version: 1,\n proofRef: DefaultProofRef,\n })\n await ensureDir(skillcraftGlobalDir())\n await writeJson(pendingPath(root), { skills: [] })\n await writeJson(contextPath(root), { activeLoadouts: [] })\n\n const existingAgents = await loadEnabledAgents(root)\n const nextAgents = sortAgents([...existingAgents, ...requestedAgents])\n for (const agent of requestedAgents) {\n await enableAgentIntegration(root, agent)\n }\n await ensureAiModelContext(root, nextAgents[0] || 'opencode')\n await saveEnabledAgents(root, nextAgents)\n await installPostCommitHook(root)\n\n const remote = await gitRemote(root)\n await addRepo({ path: root, remote, enabledAt: new Date().toISOString() })\n process.stdout.write(`enabled skillcraft for ${root} (agents: ${nextAgents.join(', ')})\\n`)\n}\n\nasync function resolveRequestedAgents(rawAgents: readonly string[]): Promise<AgentIntegration[]> {\n const invalid = unsupportedAgentOptions(rawAgents)\n if (invalid.length) {\n throw new Error(`Unsupported agent value: ${invalid.join(', ')}`)\n }\n\n const requested = parseAgentOptions(rawAgents)\n if (requested.length) {\n return requested\n }\n\n const available = await detectAvailableAgents()\n if (!available.length) {\n throw new Error('No supported AI coding agents detected. Install opencode or codex, or pass --agent explicitly.')\n }\n if (available.length === 1) {\n return available\n }\n\n if (!input.isTTY || !output.isTTY) {\n throw new Error('Multiple supported agents detected (codex, opencode). Re-run with --agent codex, --agent opencode, or both.')\n }\n\n return promptForAgents(available)\n}\n\nasync function promptForAgents(available: AgentIntegration[]): Promise<AgentIntegration[]> {\n const rl = createInterface({ input, output })\n try {\n output.write(`Multiple supported agents detected: ${available.join(', ')}\\n`)\n output.write('Select one or more agents to enable (comma-separated, e.g. 1,2):\\n')\n available.forEach((agent, index) => {\n output.write(`${index + 1}. ${agent}\\n`)\n })\n\n const answer = await rl.question('Agents: ')\n const selected = sortAgents(answer.split(',').map((value) => {\n const trimmed = value.trim()\n const index = Number.parseInt(trimmed, 10)\n if (Number.isFinite(index) && index >= 1 && index <= available.length) {\n return available[index - 1]\n }\n return parseAgentOptions([trimmed])[0]\n }).filter((value): value is AgentIntegration => !!value))\n\n if (!selected.length) {\n throw new Error('No valid agent selection provided.')\n }\n return selected\n } finally {\n rl.close()\n }\n}\n\nfunction sortAgents(agents: readonly AgentIntegration[]): AgentIntegration[] {\n return Array.from(new Set(agents)).sort() as AgentIntegration[]\n}\n","import { loadRepos, saveRepos } from '@/core/config'\nimport { isGitRepo, gitRoot } from '@/core/git'\n\nexport async function runReposList(): Promise<void> {\n const data = await loadRepos()\n if (!data.repos.length) {\n process.stdout.write('no repositories tracked\\n')\n return\n }\n data.repos.forEach((entry, index) => {\n process.stdout.write(`${index + 1}. ${entry.path}`)\n if (entry.remote) {\n process.stdout.write(` (${entry.remote})`)\n }\n process.stdout.write('\\n')\n })\n}\n\nexport async function runReposPrune(): Promise<void> {\n const data = await loadRepos()\n const next = [] as typeof data.repos\n for (const item of data.repos) {\n if (await isGitRepo(item.path)) {\n await gitRoot(item.path)\n next.push(item)\n }\n }\n await saveRepos({ repos: next })\n process.stdout.write(`pruned repo list: ${data.repos.length} -> ${next.length}\\n`)\n}\n","import { loadProofsFromRepo } from './proof.js'\nimport type { Proof } from './types.js'\n\nexport async function loadProofFromRepo(repoPath: string): Promise<Proof[]> {\n return loadProofsFromRepo(repoPath)\n}\n","import path from 'node:path'\nimport { ensureDir, fileExists, readJson, writeJson } from './fs.js'\nimport { credentialIndexCachePath } from './paths.js'\nimport type { Proof } from './types.js'\n\nexport type NormalizedRequirements = {\n minCommits: number\n minRepositories: number\n tree: RequirementNode\n}\n\nexport type RequirementNode =\n | { and: RequirementNode[] }\n | { or: RequirementNode[] }\n | { skill: string }\n | { loadout: string }\n | { agent: { provider: string } }\n | { model: { provider?: string; name?: string } }\n\nexport type CredentialIndexEntry = {\n id: string\n name?: string\n description?: string\n requirements: NormalizedRequirements\n}\n\nexport type RequirementCheck = {\n type: 'skill' | 'loadout' | 'agent' | 'model'\n requirement: string\n satisfied: boolean\n}\n\nexport type EvaluationProof = {\n proof: Proof\n}\n\nexport type CredentialRequirementResult = {\n passed: boolean\n proofs: EvaluationProof[]\n provenCommits: string[]\n provenRepos: string[]\n checks: RequirementCheck[]\n reasons: string[]\n noExplicitChecks: boolean\n}\n\ntype RawRequirementNode = Record<string, unknown>\n\nconst DEFAULT_CREDENTIAL_INDEX_URL = 'https://skillcraft.gg/credential-ledger/credentials/index.json'\nconst CREDENTIAL_INDEX_CACHE_REFRESH_MS = 6 * 60 * 60 * 1000\nconst CREDENTIAL_INDEX_CACHE_VERSION = 1\n\nconst CREDENTIAL_INDEX_CACHE_PATH = credentialIndexCachePath()\n\ntype CachedCredentialIndexFile = {\n cachedAt: number\n version: number\n entries: CredentialIndexEntry[]\n}\n\ntype CredentialIndexLoadOptions = {\n refresh?: boolean\n}\n\nfunction getCredentialIndexUrl(): string {\n return process.env.SKILLCRAFT_CREDENTIAL_INDEX_URL?.trim() || DEFAULT_CREDENTIAL_INDEX_URL\n}\n\nasync function readCredentialIndexCache(cachePath: string): Promise<CachedCredentialIndexFile | null> {\n try {\n const raw = await readJson<unknown>(cachePath)\n if (!raw || !isObject(raw)) {\n return null\n }\n\n const cachedAt = parseInteger(raw.cachedAt)\n if (cachedAt === undefined || cachedAt <= 0) {\n return null\n }\n\n if (raw.version !== CREDENTIAL_INDEX_CACHE_VERSION) {\n return null\n }\n\n if (!('entries' in raw)) {\n return null\n }\n\n const entries = normalizeCredentialIndexEntries(raw.entries)\n return {\n cachedAt,\n version: CREDENTIAL_INDEX_CACHE_VERSION,\n entries,\n }\n } catch {\n return null\n }\n}\n\nfunction parseInteger(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed)) {\n return parsed\n }\n }\n return undefined\n}\n\nfunction isCredentialIndexCacheFresh(cache: CachedCredentialIndexFile): boolean {\n const ageMs = Date.now() - cache.cachedAt\n return ageMs < CREDENTIAL_INDEX_CACHE_REFRESH_MS\n}\n\nexport async function loadCredentialIndex(options: CredentialIndexLoadOptions = {}): Promise<CredentialIndexEntry[]> {\n const explicitPath = process.env.SKILLCRAFT_CREDENTIAL_INDEX_PATH?.trim()\n if (explicitPath) {\n return loadIndexFromPath(explicitPath)\n }\n\n const cached = !options.refresh ? await readCredentialIndexCache(CREDENTIAL_INDEX_CACHE_PATH) : null\n if (cached && isCredentialIndexCacheFresh(cached)) {\n return cached.entries\n }\n\n try {\n const entries = await loadIndexFromRemote(getCredentialIndexUrl())\n await writeCredentialIndexCache(entries)\n return entries\n } catch (error) {\n if (await fileExists(CREDENTIAL_INDEX_CACHE_PATH)) {\n const cached = await readCredentialIndexCache(CREDENTIAL_INDEX_CACHE_PATH)\n if (cached) {\n return cached.entries\n }\n return loadIndexFromPath(CREDENTIAL_INDEX_CACHE_PATH)\n }\n if (error instanceof Error) {\n throw error\n }\n throw new Error('failed to load credential index')\n }\n}\n\nasync function loadIndexFromRemote(url: string): Promise<CredentialIndexEntry[]> {\n const response = await fetch(url, {\n headers: {\n 'user-agent': 'skillcraft-cli',\n },\n })\n\n if (!response.ok) {\n throw new Error(`failed to download credential index from ${url}`)\n }\n\n const raw = await response.json()\n const entries = normalizeCredentialIndexEntries(raw)\n return entries\n}\n\nasync function loadIndexFromPath(filePath: string): Promise<CredentialIndexEntry[]> {\n const raw = await readJson<unknown>(filePath)\n if (!raw) {\n return []\n }\n\n if (isObject(raw) && Array.isArray((raw as { entries?: unknown }).entries)) {\n return normalizeCredentialIndexEntries((raw as { entries: unknown }).entries)\n }\n\n return normalizeCredentialIndexEntries(raw)\n}\n\nasync function writeCredentialIndexCache(entries: CredentialIndexEntry[]): Promise<void> {\n await ensureDir(path.dirname(CREDENTIAL_INDEX_CACHE_PATH))\n const payload = {\n cachedAt: Date.now(),\n version: CREDENTIAL_INDEX_CACHE_VERSION,\n entries,\n }\n await writeJson(CREDENTIAL_INDEX_CACHE_PATH, payload)\n}\n\nexport function normalizeRequirements(value: unknown): NormalizedRequirements {\n const requirements = isObject(value) ? value : {}\n\n if (requirements.mode !== undefined) {\n throw new Error('requirements.mode is not supported. Use nested and/or expressions instead.')\n }\n\n const requirementTree = normalizeRequirementRoot(requirements)\n\n return {\n minCommits: normalizeNonNegativeInteger(requirements.min_commits ?? requirements.minCommits, 0),\n minRepositories: normalizeNonNegativeInteger(requirements.min_repositories ?? requirements.minRepositories, 0),\n tree: requirementTree,\n }\n}\n\nfunction normalizeRequirementRoot(value: RawRequirementNode): RequirementNode {\n if (Object.prototype.hasOwnProperty.call(value, 'tree')) {\n return parseRequirementNode(value.tree, 'requirements.tree')\n }\n\n const hasExplicitAnd = Object.prototype.hasOwnProperty.call(value, 'and')\n const hasExplicitOr = Object.prototype.hasOwnProperty.call(value, 'or')\n\n if (hasExplicitAnd && hasExplicitOr) {\n throw new Error('requirements cannot include both and and or at the same level')\n }\n\n if (hasExplicitAnd) {\n const unexpected = Object.keys(value).filter((key) =>\n !['and', 'min_commits', 'min_repositories', 'minRepositories', 'minCommits', 'tree'].includes(key),\n )\n if (unexpected.length) {\n throw new Error(`Unexpected requirement fields: ${unexpected.join(', ')}`)\n }\n\n return {\n and: normalizeRequirementList((value as RawRequirementNode).and, 'requirements.and'),\n }\n }\n\n if (hasExplicitOr) {\n const unexpected = Object.keys(value).filter((key) =>\n !['or', 'min_commits', 'min_repositories', 'minRepositories', 'minCommits', 'tree'].includes(key),\n )\n if (unexpected.length) {\n throw new Error(`Unexpected requirement fields: ${unexpected.join(', ')}`)\n }\n\n return {\n or: normalizeRequirementList((value as RawRequirementNode).or, 'requirements.or'),\n }\n }\n\n return { and: buildImplicitAndFromShortcuts(value) }\n}\n\nfunction normalizeRequirementList(value: unknown, location: string): RequirementNode[] {\n if (!Array.isArray(value)) {\n throw new Error(`Expected array at ${location}`)\n }\n\n return value.map((entry, index) => parseRequirementNode(entry, `${location}[${index}]`))\n}\n\nfunction normalizeShortHandList(values: unknown, location: string): string[] {\n if (values === undefined) {\n return []\n }\n\n if (Array.isArray(values)) {\n return values.map((entry) => {\n const text = parseScalarText(entry)\n if (text === undefined) {\n throw new Error(`Expected text values for ${location}`)\n }\n return text\n })\n }\n\n const text = parseScalarText(values)\n if (!text) {\n return []\n }\n\n return [text]\n}\n\nfunction buildImplicitAndFromShortcuts(requirements: RawRequirementNode): RequirementNode[] {\n const normalized: RequirementNode[] = []\n const known = ['and', 'or', 'min_commits', 'min_repositories', 'minRepositories', 'minCommits', 'tree', 'skill', 'loadout', 'agent', 'model']\n\n for (const skill of normalizeShortHandList(requirements.skill, 'requirements.skill')) {\n normalized.push({ skill })\n }\n\n for (const loadout of normalizeShortHandList(requirements.loadout, 'requirements.loadout')) {\n normalized.push({ loadout })\n }\n\n const hasAgent = Object.prototype.hasOwnProperty.call(requirements, 'agent')\n const agent = normalizeAgentRequirement(requirements.agent)\n if (agent) {\n normalized.push(agent)\n } else if (hasAgent) {\n throw new Error('requirements.agent must be an object with a provider')\n }\n\n const hasModel = Object.prototype.hasOwnProperty.call(requirements, 'model')\n const model = normalizeModelRequirement(requirements.model)\n if (model) {\n normalized.push(model)\n } else if (hasModel) {\n throw new Error('requirements.model must be an object with optional provider and/or name')\n }\n\n const nested = Object.keys(requirements).filter((key) => !known.includes(key) && !key.startsWith('$'))\n if (nested.length) {\n throw new Error(`Unexpected requirement fields: ${nested.join(', ')}`)\n }\n\n return normalized\n}\n\nfunction parseRequirementNode(value: unknown, location: string): RequirementNode {\n if (!isObject(value)) {\n throw new Error(`Invalid requirement node at ${location}`)\n }\n\n const keys = Object.keys(value)\n if (!keys.length) {\n throw new Error(`Empty requirement node at ${location}`)\n }\n\n if (keys.length > 1) {\n throw new Error(`Requirement node has multiple keys at ${location}`)\n }\n\n const [key] = keys\n\n if (key === 'and' || key === 'or') {\n const valueForKey = (value as RawRequirementNode)[key]\n if (!Array.isArray(valueForKey)) {\n throw new Error(`Requirement node ${location} expected array for ${key}`)\n }\n\n return {\n [key]: valueForKey.map((entry, childIndex) => parseRequirementNode(entry, `${location}.${key}[${childIndex}]`)),\n } as RequirementNode\n }\n\n if (key === 'skill') {\n const text = parseScalarText((value as RawRequirementNode)[key])\n if (!text) {\n throw new Error(`Requirement node ${location} has empty skill`)\n }\n return { skill: text }\n }\n\n if (key === 'loadout') {\n const text = parseScalarText((value as RawRequirementNode)[key])\n if (!text) {\n throw new Error(`Requirement node ${location} has empty loadout`)\n }\n return { loadout: text }\n }\n\n if (key === 'agent') {\n const node = normalizeAgentRequirement((value as RawRequirementNode)[key])\n if (!node) {\n throw new Error(`Requirement node ${location} has invalid agent requirement`)\n }\n return node\n }\n\n if (key === 'model') {\n const node = normalizeModelRequirement((value as RawRequirementNode)[key])\n if (!node) {\n throw new Error(`Requirement node ${location} has invalid model requirement`)\n }\n return node\n }\n\n throw new Error(`Unexpected requirement key ${key} at ${location}`)\n}\n\nfunction normalizeAgentRequirement(value: unknown): { agent: { provider: string } } | undefined {\n if (!isObject(value)) {\n return undefined\n }\n\n const provider = parseScalarText(value.provider)\n if (!provider) {\n return undefined\n }\n\n return {\n agent: {\n provider: provider.toLowerCase(),\n },\n }\n}\n\nfunction normalizeModelRequirement(value: unknown): { model: { provider?: string; name?: string } } | undefined {\n if (!isObject(value)) {\n return undefined\n }\n\n const provider = parseScalarText(value.provider)\n const name = parseScalarText(value.name)\n\n if (!provider && !name) {\n return undefined\n }\n\n return {\n model: {\n ...(provider ? { provider: provider.toLowerCase() } : {}),\n ...(name ? { name } : {}),\n },\n }\n}\n\nexport function evaluateRequirements(\n proofs: EvaluationProof[],\n provenCommits: string[],\n provenRepos: string[],\n requirements: NormalizedRequirements,\n): CredentialRequirementResult {\n const proofSkills = [] as Array<{ id: string; version?: string }>\n const proofLoadouts = [] as string[]\n const proofAgents = [] as string[]\n const proofModels = [] as Array<{ provider?: string; name?: string }>\n\n const dedupedCommits = Array.from(new Set((provenCommits || []).filter(Boolean)))\n const dedupedRepos = Array.from(new Set((provenRepos || []).filter(Boolean)))\n\n for (const proofEntry of proofs) {\n const proof = proofEntry.proof\n for (const skill of proof.skills) {\n const parsed = parseIdentifierWithVersion(skill.id)\n if (parsed.id) {\n proofSkills.push({ id: parsed.id, version: parsed.version })\n }\n }\n\n for (const loadout of proof.loadouts) {\n const normalized = parseScalarText(loadout)\n if (normalized) {\n proofLoadouts.push(normalized)\n }\n }\n\n if (proof.agent?.provider && typeof proof.agent.provider === 'string') {\n proofAgents.push(proof.agent.provider)\n }\n\n const modelProvider = proof.model?.provider\n const modelName = proof.model?.name\n if (typeof modelProvider === 'string' || typeof modelName === 'string') {\n proofModels.push({ provider: modelProvider, name: modelName })\n }\n }\n\n const requirementResult = evaluateRequirementTree(requirements.tree, {\n skills: proofSkills,\n loadouts: proofLoadouts,\n agents: proofAgents,\n models: proofModels,\n })\n\n const checks = requirementResult.checks\n const resultReasons = [...failedRequirementReasons(checks)]\n\n if (requirements.minCommits > dedupedCommits.length) {\n resultReasons.push(`minimum required commits not met: have ${dedupedCommits.length}, need ${requirements.minCommits}`)\n requirementResult.passed = false\n }\n\n if (requirements.minRepositories > dedupedRepos.length) {\n resultReasons.push(`minimum required repositories not met: have ${dedupedRepos.length}, need ${requirements.minRepositories}`)\n requirementResult.passed = false\n }\n\n return {\n passed: requirementResult.passed,\n proofs,\n provenCommits: dedupedCommits,\n provenRepos: dedupedRepos,\n checks,\n reasons: resultReasons,\n noExplicitChecks: requirementResult.noExplicitChecks,\n }\n}\n\nfunction evaluateRequirementTree(\n node: RequirementNode,\n context: { skills: Array<{ id: string; version?: string }>; loadouts: string[]; agents: string[]; models: Array<{ provider?: string; name?: string }> },\n): { passed: boolean; checks: RequirementCheck[]; noExplicitChecks: boolean } {\n if ('and' in node) {\n const checks: RequirementCheck[] = []\n const childResults = [] as { passed: boolean; checks: RequirementCheck[]; noExplicitChecks: boolean }[]\n let noExplicitChecks = true\n\n for (const child of node.and) {\n const childResult = evaluateRequirementTree(child, context)\n checks.push(...childResult.checks)\n childResults.push(childResult)\n if (!childResult.noExplicitChecks) {\n noExplicitChecks = false\n }\n }\n\n return {\n passed: childResults.every((entry) => entry.passed),\n checks,\n noExplicitChecks,\n }\n }\n\n if ('or' in node) {\n const checks: RequirementCheck[] = []\n const childResults = [] as { passed: boolean; checks: RequirementCheck[]; noExplicitChecks: boolean }[]\n let noExplicitChecks = true\n\n for (const child of node.or) {\n const childResult = evaluateRequirementTree(child, context)\n checks.push(...childResult.checks)\n childResults.push(childResult)\n if (!childResult.noExplicitChecks) {\n noExplicitChecks = false\n }\n }\n\n return {\n passed: childResults.some((entry) => entry.passed),\n checks,\n noExplicitChecks,\n }\n }\n\n if ('skill' in node) {\n const parsed = parseIdentifierWithVersion(node.skill)\n const satisfied = proofSkillsMatch(context.skills, parsed)\n return {\n passed: satisfied,\n checks: [{ type: 'skill', requirement: node.skill, satisfied }],\n noExplicitChecks: false,\n }\n }\n\n if ('loadout' in node) {\n const parsed = parseTextRequirement(node.loadout)\n const satisfied = context.loadouts.includes(node.loadout) || (parsed && parsed.id !== '' && context.loadouts.includes(parsed.id))\n\n return {\n passed: satisfied,\n checks: [{ type: 'loadout', requirement: node.loadout, satisfied }],\n noExplicitChecks: false,\n }\n }\n\n if ('agent' in node) {\n const expectedProvider = normalizeRequirementText(node.agent.provider)\n const satisfied = context.agents.some((provider) => provider === expectedProvider)\n return {\n passed: satisfied,\n checks: [{ type: 'agent', requirement: `provider=${expectedProvider}`, satisfied }],\n noExplicitChecks: false,\n }\n }\n\n if ('model' in node) {\n const expectedProvider = normalizeRequirementText(node.model.provider)\n const expectedName = normalizeRequirementText(node.model.name)\n const satisfied = context.models.some((candidate) => {\n const hasProvider = !expectedProvider || candidate.provider === expectedProvider\n const hasName = !expectedName || (candidate.name && candidate.name === expectedName)\n return hasProvider && hasName\n })\n\n const parts = [] as string[]\n if (expectedProvider) {\n parts.push(`provider=${expectedProvider}`)\n }\n if (expectedName) {\n parts.push(`name=${expectedName}`)\n }\n\n return {\n passed: satisfied,\n checks: [{ type: 'model', requirement: parts.join(',') || 'model', satisfied }],\n noExplicitChecks: false,\n }\n }\n\n throw new Error('Unknown requirement node encountered during evaluation')\n}\n\nfunction failedRequirementReasons(checks: RequirementCheck[]): string[] {\n return checks.filter((entry) => !entry.satisfied).map((entry) => `${entry.type} ${entry.requirement} not met`)\n}\n\nfunction proofSkillsMatch(proofSkills: Array<{ id: string; version?: string }>, parsed: { id: string; version?: string }): boolean {\n return proofSkills.some((skill) => matchesId(skill.id, skill.version, parsed))\n}\n\nfunction matchesId(actualId: string, actualVersion: string | undefined, expected: { id: string; version?: string }): boolean {\n if (actualId !== expected.id) {\n return false\n }\n\n if (!expected.version) {\n return true\n }\n\n return actualVersion === expected.version\n}\n\nfunction parseTextRequirement(value: unknown): { id: string; version?: string } {\n return parseIdentifierWithVersion(value)\n}\n\nfunction parseIdentifierWithVersion(value: unknown): { id: string; version?: string } {\n const trimmed = parseScalarText(value)\n if (!trimmed) {\n return { id: '' }\n }\n\n const parts = trimmed.split('@')\n return {\n id: parts[0],\n version: parts.length > 1 ? parts.slice(1).join('@') : undefined,\n }\n}\n\nfunction normalizeRequirementText(value: unknown): string {\n return typeof value === 'string' ? value.trim().toLowerCase() : ''\n}\n\nfunction parseScalarText(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined\n }\n const text = value.trim()\n return text || undefined\n}\n\nfunction normalizeNonNegativeInteger(value: unknown, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n return fallback\n }\n\n return Math.floor(value)\n}\n\nfunction isObject(value: unknown): value is RawRequirementNode {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeCredentialIndexEntries(entries: unknown): CredentialIndexEntry[] {\n if (!Array.isArray(entries)) {\n return []\n }\n\n const normalized = [] as CredentialIndexEntry[]\n for (const entry of entries) {\n const normalizedEntry = normalizeCredentialIndexEntry(entry)\n if (normalizedEntry) {\n normalized.push(normalizedEntry)\n }\n }\n\n return normalized.sort((left, right) => left.id.localeCompare(right.id))\n}\n\nfunction normalizeCredentialIndexEntry(raw: unknown): CredentialIndexEntry | undefined {\n if (!isObject(raw)) {\n return undefined\n }\n\n const id = parseScalarText(raw.id)\n if (!id) {\n return undefined\n }\n\n try {\n return {\n id,\n name: parseScalarText(raw.name),\n description: parseScalarText(raw.description),\n requirements: normalizeRequirements(raw.requirements),\n }\n } catch {\n return undefined\n }\n}\n\nexport async function getCredentialIndexEntries(options: CredentialIndexLoadOptions = {}): Promise<CredentialIndexEntry[]> {\n return loadCredentialIndex(options)\n}\n","import { Command } from 'commander'\n\ntype OutputMode = 'text' | 'json'\n\nexport function getOutputMode(program: Command): OutputMode {\n const raw = program.opts<{ json?: boolean }>().json\n return raw ? 'json' : 'text'\n}\n\nexport function printResult<T>(mode: OutputMode, label: string, data: T): void {\n if (mode === 'json') {\n process.stdout.write(`${JSON.stringify({ label, data })}\\n`)\n return\n }\n process.stdout.write(`${label}: ${JSON.stringify(data)}\\n`)\n}\n\nexport function printLines(lines: string[]): void {\n process.stdout.write(`${lines.join('\\n')}\\n`)\n}\n\nexport function printError(message: string): void {\n process.stderr.write(`${message}\\n`)\n}\n","import { isEnabled } from '@/core/state'\nimport { gitRemote } from '@/core/git'\nimport { loadProofFromRepo } from '@/core/progress'\nimport { addTrackedCredential, loadRepos, loadTrackedCredentials, removeTrackedCredential } from '@/core/config'\nimport { assertNonEmpty } from '@/core/validation'\nimport { evaluateRequirements, getCredentialIndexEntries, type CredentialIndexEntry, type CredentialRequirementResult, type RequirementCheck } from '@/core/credentials'\nimport { printLines } from '@/lib/output'\n\ntype ProgressOutputMode = {\n outputMode?: 'text' | 'json'\n refreshIndex?: boolean\n}\n\ntype EvaluatedCredentialResult = {\n credentialId: string\n name?: string\n description?: string\n passed: boolean\n status: 'eligible' | 'blocked'\n reasons: string[]\n checks: RequirementCheck[]\n requiredMinCommits: number\n requiredMinRepositories: number\n provenCommits: number\n provenRepositories: number\n proofFiles: number\n}\n\ntype ProgressPayload = {\n trackedCredentials: number\n trackedRepositories: number\n evidence: {\n proofFiles: number\n provenCommits: number\n provenRepositories: number\n }\n credentials: EvaluatedCredentialResult[]\n}\n\ntype ProofEntry = {\n proof: {\n commit: string\n loadouts: string[]\n skills: Array<{ id: string; version?: string }>\n agent?: { provider?: string }\n model?: { provider?: string; name?: string }\n version: number\n timestamp: string\n }\n}\n\nasync function resolveTrackedRepos(): Promise<string[]> {\n const data = await loadRepos()\n const repoPaths = new Set<string>()\n const repos: string[] = []\n\n for (const entry of data.repos) {\n if (repoPaths.has(entry.path)) {\n continue\n }\n repoPaths.add(entry.path)\n\n if (await isEnabled(entry.path)) {\n repos.push(entry.path)\n }\n }\n\n return repos\n}\n\nexport async function runProgress(options: ProgressOutputMode = {}): Promise<void> {\n const tracked = await resolveTrackedRepos()\n const trackedCredentials = await loadTrackedCredentials()\n\n const trackedCredList = trackedCredentials.credentials\n if (!trackedCredList.length) {\n if (options.outputMode === 'json') {\n printJsonResult(\n buildPayload({\n tracked,\n trackedCredentialsCount: 0,\n proofFiles: 0,\n provenCommits: 0,\n provenRepositories: 0,\n evaluated: [],\n }),\n )\n return\n }\n process.stdout.write('no credentials tracked\\n')\n return\n }\n\n const indexById = mapCredentials(await getCredentialIndexEntries({ refresh: options.refreshIndex }))\n\n let proofFiles = 0\n const proofs: ProofEntry[] = []\n const provenRepos = new Set<string>()\n const provenCommits = new Set<string>()\n\n for (const repoPath of tracked) {\n const proofsInRepo = await loadProofFromRepo(repoPath)\n proofFiles += proofsInRepo.length\n\n if (!proofsInRepo.length) {\n continue\n }\n\n const remote = (await gitRemote(repoPath)) || repoPath\n provenRepos.add(remote)\n\n for (const proof of proofsInRepo) {\n if (proof?.commit) {\n provenCommits.add(proof.commit)\n }\n proofs.push({ proof })\n }\n }\n\n const provenCommitList = Array.from(provenCommits)\n const provenRepoList = Array.from(provenRepos)\n\n const payload = buildPayload({\n tracked,\n trackedCredentialsCount: trackedCredList.length,\n proofFiles,\n provenCommits: provenCommitList.length,\n provenRepositories: provenRepoList.length,\n evaluated: [],\n })\n\n const evaluated = [] as EvaluatedCredentialResult[]\n for (const entry of trackedCredList) {\n const definition = indexById.get(entry.id)\n if (!definition) {\n evaluated.push(makeMissingDefinitionResult(entry.id, proofs.length, provenCommitList.length, provenRepoList.length))\n continue\n }\n\n const result = evaluateRequirements(proofs, provenCommitList, provenRepoList, definition.requirements)\n evaluated.push(formatResult(entry.id, definition, result, proofs.length, provenCommitList.length, provenRepoList.length))\n }\n\n payload.credentials = evaluated\n\n if (options.outputMode === 'json') {\n printJsonResult(payload)\n return\n }\n\n const lines = [] as string[]\n lines.push(`tracked credentials: ${trackedCredList.length}`)\n lines.push(`tracked repositories: ${tracked.length}`)\n lines.push(`proof files: ${proofFiles}`)\n lines.push(`proof commits: ${provenCommitList.length}`)\n lines.push(`proof repositories: ${provenRepoList.length}`)\n lines.push('')\n\n for (const entry of evaluated) {\n lines.push(`${entry.credentialId}: ${entry.status}`)\n lines.push(` checks: ${entry.passed ? 'passed' : 'blocked'}`)\n lines.push(` proof scope: ${entry.proofFiles} proofs, ${entry.provenCommits}/${entry.requiredMinCommits} commits, ${entry.provenRepositories}/${entry.requiredMinRepositories} repositories`)\n if (entry.reasons.length) {\n lines.push(' reasons:')\n for (const reason of entry.reasons) {\n lines.push(` - ${reason}`)\n }\n }\n lines.push('')\n }\n\n printLines(lines)\n}\n\nexport async function runProgressTrack(rawId: string): Promise<void> {\n const id = assertNonEmpty(rawId, 'credential id')\n const indexById = mapCredentials(await getCredentialIndexEntries())\n if (!indexById.has(id)) {\n throw new Error(`credential not found in credential index: ${id}`)\n }\n\n const added = await addTrackedCredential(id)\n if (!added) {\n process.stdout.write(`credential already tracked: ${id}\\n`)\n return\n }\n process.stdout.write(`tracking credential: ${id}\\n`)\n}\n\nexport async function runProgressUntrack(rawId: string): Promise<void> {\n const id = assertNonEmpty(rawId, 'credential id')\n const removed = await removeTrackedCredential(id)\n if (!removed) {\n process.stdout.write(`credential not tracked: ${id}\\n`)\n return\n }\n process.stdout.write(`untracked credential: ${id}\\n`)\n}\n\nfunction buildPayload(params: {\n tracked: string[]\n trackedCredentialsCount: number\n proofFiles: number\n provenCommits: number\n provenRepositories: number\n evaluated: EvaluatedCredentialResult[]\n}): ProgressPayload {\n return {\n trackedCredentials: params.trackedCredentialsCount,\n trackedRepositories: params.tracked.length,\n evidence: {\n proofFiles: params.proofFiles,\n provenCommits: params.provenCommits,\n provenRepositories: params.provenRepositories,\n },\n credentials: params.evaluated,\n }\n}\n\nfunction printJsonResult(payload: ProgressPayload) {\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n}\n\nfunction mapCredentials(index: CredentialIndexEntry[]): Map<string, CredentialIndexEntry> {\n return new Map(index.map((entry) => [entry.id, entry]))\n}\n\nfunction makeMissingDefinitionResult(\n credentialId: string,\n proofFiles: number,\n provenCommits: number,\n provenRepositories: number,\n): EvaluatedCredentialResult {\n return {\n credentialId,\n passed: false,\n status: 'blocked',\n reasons: ['credential definition is not available'],\n checks: [],\n requiredMinCommits: 0,\n requiredMinRepositories: 0,\n provenCommits,\n provenRepositories,\n proofFiles,\n }\n}\n\nfunction formatResult(\n credentialId: string,\n definition: CredentialIndexEntry,\n result: CredentialRequirementResult,\n proofFiles: number,\n provenCommits: number,\n provenRepositories: number,\n): EvaluatedCredentialResult {\n return {\n credentialId,\n name: definition.name,\n description: definition.description,\n passed: result.passed,\n status: result.passed ? 'eligible' : 'blocked',\n reasons: result.reasons,\n checks: result.checks,\n requiredMinCommits: definition.requirements.minCommits,\n requiredMinRepositories: definition.requirements.minRepositories,\n provenCommits,\n provenRepositories,\n proofFiles,\n }\n}\n","import path from 'node:path'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport { getProvider } from '@/providers'\nimport { loadGlobalConfig } from '@/core/config'\nimport { assertNonEmpty, splitArgPair, splitSkillIdentifier, normalizeSkillId } from '@/core/validation'\nimport { isEnabled } from '@/core/state'\nimport { loadProofFromRepo } from '@/core/progress'\nimport { loadPending } from '@/core/proof'\nimport { projectSkillsRootPath } from '@/core/paths'\nimport { ensureDir } from '@/core/fs'\nimport { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport ora from 'ora'\nimport {\n buildInstalledSkillRecord,\n loadInstalledSkills,\n normalizeInstalledSkillName,\n queueSkillUsage,\n registerInstalledSkill,\n} from '@/core/installedSkills'\nimport type { InstalledSkillInstall } from '@/core/types'\n\nconst execPromise = promisify(execFile)\n\ntype SearchIndexEntry = {\n id: string\n name?: string\n path?: string\n url?: string\n owner?: string\n slug?: string\n runtime?: string[]\n tags?: string[]\n install?: SearchIndexInstall\n updatedAt?: string\n}\n\ntype SearchIndexInstall = {\n type?: 'github-directory' | 'local-directory'\n repo?: string\n ref?: string\n path?: string\n}\n\ntype SearchIndexOptions = {\n source?: string\n limit?: number\n outputMode?: 'text' | 'json'\n}\n\ntype SearchResult = {\n id: string\n name?: string\n path?: string\n url?: string\n owner?: string\n slug?: string\n runtime?: string[]\n tags?: string[]\n}\n\ntype SkillInspectOptions = {\n outputMode?: 'text' | 'json'\n}\n\ntype SkillManifestDetails = {\n url: string\n title?: string\n summary?: string\n error?: string\n}\n\nexport async function runSkillsPublish(slug: string): Promise<void> {\n const ref = assertNonEmpty(slug, 'skill id')\n const { owner, slug: slugPart } = splitArgPair(ref)\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const files = await Promise.all([\n fs.access(path.join(cwd, 'SKILL.md')).then(() => true).catch(() => false),\n fs.access(path.join(cwd, 'skill.yaml')).then(() => true).catch(() => false),\n ])\n if (!files[0] || !files[1]) {\n throw new Error('SKILL.md and skill.yaml are required for publishing')\n }\n\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n await provider.getUser()\n\n const destination = 'skillcraft-gg/skills-registry'\n const branch = `skillcraft-skill-${owner}-${slugPart}`\n const temp = path.join(process.cwd(), '.skillcraft-temp-skill-publish')\n\n try {\n await fs.rm(temp, { force: true, recursive: true })\n await provider.cloneRepo(destination, temp)\n await runGit(temp, ['checkout', '-B', branch])\n\n const target = path.join(temp, 'skills', owner, slugPart)\n await fs.rm(target, { force: true, recursive: true })\n await fs.mkdir(path.dirname(target), { recursive: true })\n await fs.cp(cwd, target, { recursive: true })\n\n await runGit(temp, ['add', `skills/${owner}/${slugPart}`])\n await runGit(temp, ['commit', '-m', `Publish skill ${ref}`]).catch(() => {\n throw new Error('nothing to commit; skill may already be published')\n })\n await runGit(temp, ['push', '-u', 'origin', branch]).catch(() => {\n throw new Error('unable to push skill publish branch')\n })\n await provider.createPullRequest(destination, branch, `Publish skill: ${ref}`).catch(() => {\n process.stdout.write('unable to create PR automatically. Please open one manually from your branch.\\n')\n })\n\n process.stdout.write(`published skill ${ref} from ${destination}\\n`)\n } finally {\n await fs.rm(temp, { force: true, recursive: true })\n }\n}\n\nexport async function runSkillsAdd(rawId: string): Promise<void> {\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const cleanInput = assertNonEmpty(rawId, 'skill id')\n const parsed = splitSkillIdentifier(cleanInput)\n if (!parsed.id) {\n throw new Error('invalid skill id format')\n }\n if (parsed.version) {\n throw new Error('skill versions are not supported for installation yet')\n }\n\n const entries = await loadSearchIndexEntries('text')\n const entry = entries.find((candidate) => candidate.id === parsed.id)\n if (!entry) {\n throw new Error(`skill ${parsed.id} is not listed in the search index`)\n }\n\n const install = requireInstallMetadata(entry)\n const installedName = normalizeInstalledSkillName(entry.id)\n const targetDir = path.join(projectSkillsRootPath(cwd), installedName)\n if (await exists(targetDir)) {\n throw new Error(`skill ${entry.id} is already installed at ${path.posix.join('.agents', 'skills', installedName)}`)\n }\n\n const temp = await fs.mkdtemp(path.join(os.tmpdir(), 'skillcraft-skill-'))\n try {\n const sourceDir = await materializeSkillSource(entry, temp)\n await ensureDir(projectSkillsRootPath(cwd))\n await fs.cp(sourceDir, targetDir, { recursive: true })\n await rewriteInstalledSkillManifest(path.join(targetDir, 'SKILL.md'), installedName)\n\n await registerInstalledSkill(cwd, buildInstalledSkillRecord({\n id: entry.id,\n name: installedName,\n install,\n installedAt: new Date().toISOString(),\n }))\n } finally {\n await fs.rm(temp, { force: true, recursive: true })\n }\n\n process.stdout.write(`installed skill: ${entry.id} -> ${path.posix.join('.agents', 'skills', installedName)}\\n`)\n}\n\nexport async function runSkillsValidate(): Promise<void> {\n const cwd = process.cwd()\n const checks = [\n ['SKILL.md', await exists(path.join(cwd, 'SKILL.md'))],\n ['skill.yaml', await exists(path.join(cwd, 'skill.yaml'))],\n ]\n for (const [name, ok] of checks) {\n process.stdout.write(`${name}: ${ok ? 'ok' : 'missing'}\\n`)\n }\n}\n\nexport async function runSkillsList(): Promise<void> {\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const [proofs, pending, installed] = await Promise.all([loadProofFromRepo(cwd), loadPending(cwd), loadInstalledSkills(cwd)])\n const skills = new Set<string>()\n for (const proof of proofs) {\n for (const item of proof.skills) {\n skills.add(item.id)\n }\n }\n for (const skill of pending) {\n skills.add(skill)\n }\n for (const skill of installed) {\n skills.add(skill.id)\n }\n\n if (!skills.size) {\n process.stdout.write('no skills detected\\n')\n return\n }\n\n const list = Array.from(skills).sort().join('\\n')\n process.stdout.write(`skills detected (${skills.size}):\\n${list}\\n`)\n}\n\nexport async function runSkillsSearch(rawQuery?: string, options: SearchIndexOptions = {}): Promise<void> {\n const entries = await loadSearchIndexEntries(options.outputMode)\n if (!entries.length) {\n if (options.outputMode === 'json') {\n process.stdout.write(`${JSON.stringify({\n query: rawQuery?.trim(),\n source: options.source?.trim(),\n limit: getSearchLimit(options.limit),\n count: 0,\n results: [],\n message: 'no skills indexed',\n })}\\n`)\n } else {\n process.stdout.write('no skills indexed\\n')\n }\n return\n }\n\n const query = rawQuery?.trim().toLowerCase()\n const sourceFilter = options.source?.trim().toLowerCase()\n const limit = getSearchLimit(options.limit)\n\n const filtered = entries.filter((entry) => {\n if (sourceFilter) {\n const source = getSkillSource(entry.id)\n if (source !== sourceFilter) {\n return false\n }\n }\n\n if (!query) {\n return true\n }\n\n const fields = [\n entry.id,\n entry.name,\n entry.owner,\n entry.slug,\n entry.path,\n entry.url,\n ...(entry.runtime || []),\n ...(entry.tags || []),\n ].filter((value): value is string => !!value).map((value) => value.toLowerCase())\n\n return fields.some((value) => value.includes(query))\n })\n\n const sorted = [...filtered].sort((left, right) => {\n const leftName = (left.name || left.id).toLowerCase()\n const rightName = (right.name || right.id).toLowerCase()\n if (leftName === rightName) {\n return left.id.localeCompare(right.id)\n }\n return leftName.localeCompare(rightName)\n })\n\n const shown = sorted.slice(0, limit)\n if (!shown.length) {\n const message = query ? `no skills match \"${rawQuery?.trim()}\"` : 'no skills match current filters'\n if (options.outputMode === 'json') {\n process.stdout.write(`${JSON.stringify({\n query: rawQuery?.trim(),\n source: options.source?.trim(),\n limit,\n count: 0,\n results: [],\n message,\n })}\\n`)\n } else {\n process.stdout.write(`${message}\\n`)\n }\n return\n }\n\n const title = query ? `skills matching \"${rawQuery?.trim()}\"` : 'skills index'\n const lines = shown.map((entry) => {\n const runtime = (entry.runtime || []).length ? ` [${entry.runtime!.join(', ')}]` : ''\n const tags = (entry.tags || []).length ? ` {${entry.tags!.join(', ')}}` : ''\n const updatedLabel = formatUpdatedAt(entry.updatedAt)\n const name = formatSearchResultName(entry)\n return `${entry.id}${name ? ` — ${name}` : ''}${runtime}${tags}${updatedLabel}`\n })\n\n if (options.outputMode === 'json') {\n const payload = {\n query: rawQuery?.trim(),\n source: options.source?.trim(),\n limit,\n count: shown.length,\n total: sorted.length,\n results: shown.map((entry) => {\n const row: SearchResult = {\n id: entry.id,\n name: entry.name,\n path: entry.path,\n url: entry.url,\n owner: entry.owner,\n slug: entry.slug,\n runtime: entry.runtime,\n tags: entry.tags,\n }\n return row\n }),\n }\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n return\n }\n\n process.stdout.write(`${title} (${shown.length}):\\n${lines.join('\\n')}\\n`)\n}\n\nexport async function runSkillsInspect(rawId: string, options: SkillInspectOptions = {}): Promise<void> {\n const cleanId = assertNonEmpty(rawId, 'skill id')\n const parsed = splitSkillIdentifier(cleanId)\n if (!parsed.id) {\n throw new Error('invalid skill id format')\n }\n\n const entries = await loadSearchIndexEntries(options.outputMode)\n const match = entries.find((entry) => entry.id === parsed.id)\n if (!match) {\n throw new Error(`skill ${parsed.id} is not listed in the search index`)\n }\n\n const manifest = await loadSkillManifest(match)\n if (options.outputMode === 'json') {\n const payload = {\n id: match.id,\n name: match.name,\n source: getSkillSource(match.id),\n owner: match.owner,\n slug: match.slug,\n path: match.path,\n url: match.url,\n runtime: match.runtime,\n tags: match.tags,\n install: match.install,\n updatedAt: match.updatedAt,\n manifest,\n version: parsed.version,\n }\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n return\n }\n\n const lines = formatInspectOutput(match, manifest)\n process.stdout.write(`${lines}\\n`)\n}\n\nfunction formatInspectOutput(entry: SearchIndexEntry, manifest?: SkillManifestDetails): string {\n const lines: string[] = []\n lines.push(`skill: ${entry.id}`)\n\n if (entry.name) {\n lines.push(`name: ${entry.name}`)\n }\n\n const source = getSkillSource(entry.id)\n if (source) {\n lines.push(`source: ${source}`)\n }\n\n if (entry.owner) {\n lines.push(`owner: ${entry.owner}`)\n }\n\n if (entry.slug) {\n lines.push(`slug: ${entry.slug}`)\n }\n\n if (entry.runtime && entry.runtime.length) {\n lines.push(`runtime: ${entry.runtime.join(', ')}`)\n }\n\n if (entry.tags && entry.tags.length) {\n lines.push(`tags: ${entry.tags.join(', ')}`)\n }\n\n if (entry.updatedAt) {\n lines.push(`updated: ${entry.updatedAt}`)\n }\n\n if (entry.path) {\n lines.push(`path: ${entry.path}`)\n }\n\n if (entry.url) {\n lines.push(`url: ${entry.url}`)\n }\n\n if (entry.install?.type) {\n lines.push(`install type: ${entry.install.type}`)\n }\n\n if (entry.install?.repo) {\n lines.push(`install repo: ${entry.install.repo}`)\n }\n\n if (entry.install?.path) {\n lines.push(`install path: ${entry.install.path}`)\n }\n\n if (manifest) {\n lines.push(`manifest: ${manifest.url}`)\n if (manifest.title) {\n lines.push(`manifest title: ${manifest.title}`)\n }\n if (manifest.summary) {\n lines.push(`manifest summary: ${manifest.summary}`)\n }\n if (manifest.error) {\n lines.push(`manifest fetch: ${manifest.error}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nasync function loadSkillManifest(entry: SearchIndexEntry): Promise<SkillManifestDetails | undefined> {\n const manifestUrl = buildSkillManifestUrl(entry.url)\n if (!manifestUrl) {\n return undefined\n }\n\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, 5000)\n\n try {\n const response = await fetch(manifestUrl, {\n headers: {\n 'user-agent': 'skillcraft-cli',\n },\n signal: controller.signal,\n })\n\n if (!response.ok) {\n return {\n url: manifestUrl,\n error: `unable to fetch manifest (${response.status})`,\n }\n }\n\n const text = await response.text()\n if (isHtmlDocument(text)) {\n return {\n url: manifestUrl,\n error: 'unable to parse manifest (not markdown)',\n }\n }\n const parsed = parseSkillManifest(text)\n return {\n url: manifestUrl,\n title: parsed.title,\n summary: parsed.summary,\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n url: manifestUrl,\n error: 'manifest fetch timed out',\n }\n }\n\n return {\n url: manifestUrl,\n error: error instanceof Error ? error.message : 'failed to fetch manifest',\n }\n } finally {\n clearTimeout(timeout)\n }\n}\n\nfunction buildSkillManifestUrl(rawUrl?: string): string | undefined {\n if (!rawUrl) {\n return undefined\n }\n\n const url = rawUrl.trim()\n if (!url) {\n return undefined\n }\n\n const manifestUrl = url.endsWith('/SKILL.md') ? url : url.endsWith('/') ? `${url}SKILL.md` : `${url}/SKILL.md`\n return toRawManifestUrl(manifestUrl)\n}\n\nfunction toRawManifestUrl(rawUrl: string): string {\n try {\n const parsed = new URL(rawUrl)\n if (parsed.hostname !== 'github.com') {\n return rawUrl\n }\n\n const parts = parsed.pathname.split('/').filter(Boolean)\n const blobIndex = parts.indexOf('blob')\n if (blobIndex !== 2 || parts.length < blobIndex + 2) {\n return rawUrl\n }\n\n const owner = parts[0]\n const repo = parts[1]\n const remainingPath = parts.slice(blobIndex + 1)\n if (!owner || !repo || !remainingPath.length) {\n return rawUrl\n }\n\n const rawParts = [owner, repo, 'raw', 'refs', 'heads', ...remainingPath]\n return `${parsed.protocol}//${parsed.host}/${rawParts.join('/')}`\n } catch {\n return rawUrl\n }\n}\n\nfunction isHtmlDocument(input: string): boolean {\n const text = input.replace(/^\\s+/, '').toLowerCase()\n return text.startsWith('<!doctype html') || text.startsWith('<html')\n}\n\nfunction parseSkillManifest(input: string): { title?: string; summary?: string } {\n const normalized = input.replace(/\\r\\n/g, '\\n')\n const lines = normalized.split('\\n')\n let index = 0\n\n if ((lines[0] || '').trim() === '---') {\n index = 1\n while (index < lines.length && lines[index].trim() !== '---') {\n index += 1\n }\n if (index < lines.length && lines[index].trim() === '---') {\n index += 1\n }\n }\n\n let title: string | undefined\n let summary: string | undefined\n\n for (let i = index; i < lines.length; i += 1) {\n const line = lines[i].trim()\n if (!line) {\n if (summary) {\n break\n }\n continue\n }\n\n if (!title && line.startsWith('#')) {\n title = line.replace(/^#+\\s*/, '').trim()\n continue\n }\n\n if (!summary && !line.startsWith('>')) {\n summary = line\n break\n }\n }\n\n return {\n title,\n summary,\n }\n}\n\nfunction requireInstallMetadata(entry: SearchIndexEntry): InstalledSkillInstall {\n const install = entry.install\n if (!install?.type || !install.path) {\n throw new Error(`skill ${entry.id} does not include install metadata in the search index`)\n }\n if (install.type === 'github-directory' && (!install.repo || !install.ref)) {\n throw new Error(`skill ${entry.id} has incomplete github install metadata`)\n }\n\n return {\n type: install.type,\n ...(install.repo ? { repo: install.repo } : {}),\n ...(install.ref ? { ref: install.ref } : {}),\n path: install.path,\n }\n}\n\nasync function materializeSkillSource(entry: SearchIndexEntry, tempDir: string): Promise<string> {\n const install = requireInstallMetadata(entry)\n if (install.type === 'local-directory') {\n const sourceDir = resolveLocalInstallPath(install.path)\n if (!(await exists(sourceDir))) {\n throw new Error(`local skill source does not exist: ${sourceDir}`)\n }\n return sourceDir\n }\n\n const checkoutDir = path.join(tempDir, 'source')\n await runGit(tempDir, ['clone', '--depth', '1', '--branch', install.ref!, `https://github.com/${install.repo}.git`, checkoutDir])\n const sourceDir = path.join(checkoutDir, install.path)\n if (!(await exists(sourceDir))) {\n throw new Error(`skill source path does not exist in ${install.repo}@${install.ref}: ${install.path}`)\n }\n return sourceDir\n}\n\nfunction resolveLocalInstallPath(rawPath: string): string {\n if (path.isAbsolute(rawPath)) {\n return rawPath\n }\n\n const explicitIndexPath = process.env.SKILLCRAFT_SEARCH_INDEX_PATH?.trim()\n if (explicitIndexPath) {\n return path.resolve(path.dirname(explicitIndexPath), rawPath)\n }\n\n return path.resolve(rawPath)\n}\n\nasync function rewriteInstalledSkillManifest(filePath: string, installedName: string): Promise<void> {\n const raw = await fs.readFile(filePath, 'utf8').catch(() => {\n throw new Error(`installed skill is missing SKILL.md: ${filePath}`)\n })\n const normalized = raw.replace(/\\r\\n/g, '\\n')\n const lines = normalized.split('\\n')\n if ((lines[0] || '').trim() !== '---') {\n throw new Error(`skill manifest is missing YAML frontmatter: ${filePath}`)\n }\n\n let end = -1\n for (let index = 1; index < lines.length; index += 1) {\n if (lines[index].trim() === '---') {\n end = index\n break\n }\n }\n if (end === -1) {\n throw new Error(`skill manifest frontmatter is not closed: ${filePath}`)\n }\n\n let replaced = false\n const nextFrontmatter = lines.slice(1, end).map((line) => {\n if (/^\\s*name\\s*:/.test(line)) {\n replaced = true\n return `name: ${installedName}`\n }\n return line\n })\n\n if (!replaced) {\n nextFrontmatter.unshift(`name: ${installedName}`)\n }\n\n const next = ['---', ...nextFrontmatter, '---', ...lines.slice(end + 1)].join('\\n')\n await fs.writeFile(filePath, next.endsWith('\\n') ? next : `${next}\\n`, 'utf8')\n}\n\nfunction isJson(value: unknown): value is SearchIndexEntry[] {\n return Array.isArray(value)\n}\n\nasync function loadSearchIndexEntries(outputMode: SearchIndexOptions['outputMode'] = undefined): Promise<SearchIndexEntry[]> {\n const explicitPath = process.env.SKILLCRAFT_SEARCH_INDEX_PATH?.trim()\n const source = explicitPath || process.env.SKILLCRAFT_SEARCH_INDEX_URL || 'https://skillcraft.gg/skills-registry/search/index.json'\n const loadEntries = async () => {\n if (explicitPath) {\n const raw = await fs.readFile(explicitPath, 'utf8')\n const parsed = JSON.parse(raw)\n return normalizeSearchIndexEntries(isJson(parsed) ? parsed : [])\n }\n\n const url = process.env.SKILLCRAFT_SEARCH_INDEX_URL || 'https://skillcraft.gg/skills-registry/search/index.json'\n const response = await fetch(url, {\n headers: {\n 'user-agent': 'skillcraft-cli',\n },\n })\n if (!response.ok) {\n throw new Error(`failed to download search index from ${url}`)\n }\n\n const parsed = await response.json()\n return normalizeSearchIndexEntries(isJson(parsed) ? parsed : [])\n }\n\n if (!shouldShowSearchSpinner(outputMode)) {\n return loadEntries()\n }\n\n const action = explicitPath ? `reading local index from ${source}` : `downloading index from ${source}`\n const spinner = ora({\n text: `Loading ${action}...`,\n }).start()\n\n try {\n const entries = await loadEntries()\n spinner.succeed(`loaded ${entries.length} indexed entries`)\n return entries\n } catch (error) {\n spinner.fail('failed to load search index')\n throw error\n }\n}\n\nfunction shouldShowSearchSpinner(outputMode: SearchIndexOptions['outputMode']): boolean {\n if (outputMode !== 'text') {\n return false\n }\n\n return process.stdout.isTTY === true || process.stderr.isTTY === true\n}\n\nfunction normalizeSearchIndexEntries(entries: SearchIndexEntry[]): SearchIndexEntry[] {\n return entries\n .map((entry) => normalizeSearchIndexEntry(entry))\n .filter((entry): entry is SearchIndexEntry => !!entry)\n}\n\nfunction normalizeSearchIndexEntry(raw: SearchIndexEntry): SearchIndexEntry | undefined {\n const rawId = normalizeString(raw.id)\n const id = normalizeSkillId(rawId)\n if (!id) {\n return undefined\n }\n\n return {\n id,\n name: normalizeText(raw.name),\n path: normalizeText(raw.path),\n url: normalizeText(raw.url),\n owner: normalizeText(raw.owner),\n slug: normalizeText(raw.slug),\n runtime: normalizeStringArray(raw.runtime),\n tags: normalizeStringArray(raw.tags),\n install: normalizeSearchInstall(raw.install),\n updatedAt: normalizeText(raw.updatedAt),\n }\n}\n\nfunction normalizeSearchInstall(value: unknown): SearchIndexInstall | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n const record = value as Record<string, unknown>\n const type = normalizeText(record.type)\n const installPath = normalizeText(record.path)\n if (!type || !installPath) {\n return undefined\n }\n if (type !== 'github-directory' && type !== 'local-directory') {\n return undefined\n }\n\n return {\n type,\n repo: normalizeText(record.repo),\n ref: normalizeText(record.ref),\n path: installPath,\n }\n}\n\nfunction normalizeString(value: unknown): string {\n return String(value || '').trim()\n}\n\nfunction normalizeText(value: unknown): string | undefined {\n const text = normalizeString(value)\n return text || undefined\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (value === undefined) {\n return []\n }\n\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean)\n }\n\n if (!Array.isArray(value)) {\n return []\n }\n\n const normalized: string[] = []\n for (const item of value) {\n if (typeof item !== 'string') {\n continue\n }\n const text = item.trim()\n if (text) {\n normalized.push(text)\n }\n }\n return normalized\n}\n\nfunction getSkillSource(id: string): string | undefined {\n const separatorIndex = id.indexOf(':')\n if (separatorIndex < 1) {\n return undefined\n }\n\n const source = id.slice(0, separatorIndex).trim()\n if (!source) {\n return undefined\n }\n\n return source.toLowerCase()\n}\n\nfunction getSearchLimit(raw: number | undefined): number {\n const requestedLimit = raw === undefined ? 20 : Math.floor(raw)\n return Number.isFinite(requestedLimit) && requestedLimit > 0 ? requestedLimit : 20\n}\n\nfunction formatSearchResultName(entry: SearchIndexEntry): string {\n const name = (entry.name || '').trim()\n if (!name) {\n return ''\n }\n\n const slug = deriveSearchResultSlug(entry)\n if (!slug) {\n return name\n }\n\n if (name.toLowerCase() === slug.toLowerCase()) {\n return ''\n }\n\n return name\n}\n\nfunction deriveSearchResultSlug(entry: SearchIndexEntry): string {\n if (entry.slug && entry.slug.trim()) {\n return entry.slug.trim()\n }\n\n const id = entry.id.trim()\n const separator = id.indexOf(':')\n const suffix = separator >= 0 ? id.slice(separator + 1) : id\n const parts = suffix.split('/').filter(Boolean)\n\n return parts.length ? parts[parts.length - 1] : suffix\n}\n\nfunction formatUpdatedAt(value?: string): string {\n if (!value) {\n return ''\n }\n\n const updatedAt = new Date(value)\n if (Number.isNaN(updatedAt.getTime())) {\n return ''\n }\n\n return ` (updated ${updatedAt.toISOString().slice(0, 10)})`\n}\n\nasync function exists(pathToCheck: string): Promise<boolean> {\n try {\n await fs.access(pathToCheck)\n return true\n } catch {\n return false\n }\n}\n\nexport async function runSkillUsed(rawId: string, repoPath = process.cwd()): Promise<void> {\n const normalized = normalizeSkillId(assertNonEmpty(rawId, 'skill id'))\n if (!normalized) {\n throw new Error('invalid skill id format')\n }\n\n await queueSkillUsage(repoPath, normalized)\n}\n\nasync function runGit(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execPromise('git', args, { cwd })\n return stdout.trim()\n}\n\nexport async function runSkillsValidateAndExit(): Promise<void> {\n await runSkillsValidate()\n}\n","import { mkdtemp, rm } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { git } from './git'\n\nexport type RemoteSourceEntry = {\n repo: string\n commits: string[]\n}\n\nexport type UnpushedCommit = {\n repo: string\n commit: string\n}\n\nexport type RepoRemote = {\n name: string\n url: string\n}\n\nexport function normalizeRemoteSource(rawRepo: string): string | undefined {\n const repo = rawRepo.trim()\n if (!repo) {\n return undefined\n }\n\n if (/^[a-zA-Z]:[\\\\/]/.test(repo) || repo.startsWith('/') || repo.startsWith('./') || repo.startsWith('../')) {\n return undefined\n }\n\n if (/^[a-z][a-z0-9+.-]*:/.test(repo)) {\n return repo\n }\n\n if (repo.startsWith('git@') || repo.startsWith('ssh://') || repo.startsWith('http://') || repo.startsWith('https://')) {\n return repo\n }\n\n if (repo.startsWith('file://')) {\n return repo\n }\n\n return undefined\n}\n\nexport async function listRemotes(repoPath: string): Promise<RepoRemote[]> {\n try {\n const raw = await git(['config', '--get-regexp', '^remote\\..*\\.url$'], repoPath)\n return raw\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const separator = line.indexOf(' ')\n if (separator === -1) {\n return undefined\n }\n\n const key = line.slice(0, separator)\n const url = line.slice(separator + 1).trim()\n const name = key.slice('remote.'.length, -'.url'.length)\n\n if (!url || !name) {\n return undefined\n }\n\n return { name, url }\n })\n .filter((value): value is RepoRemote => !!value)\n } catch {\n return []\n }\n}\n\nexport async function findUnpushedCommits(sources: ReadonlyArray<RemoteSourceEntry>): Promise<UnpushedCommit[]> {\n return findUnpushedCommitsWithOptions(sources, { normalize: true })\n}\n\nexport async function findUnpushedCommitsWithOptions(\n sources: ReadonlyArray<RemoteSourceEntry>,\n options: { normalize?: boolean } = {},\n): Promise<UnpushedCommit[]> {\n const normalize = options.normalize ?? true\n const unpushed: UnpushedCommit[] = []\n\n for (const source of sources) {\n const remote = normalize ? normalizeRemoteSource(source.repo) : source.repo\n if (!remote) {\n for (const commit of source.commits) {\n unpushed.push({ repo: source.repo, commit })\n }\n continue\n }\n\n const commitList = Array.from(new Set(source.commits.map((commit) => commit.trim()).filter(Boolean)))\n if (!commitList.length) {\n continue\n }\n\n const missing = await findMissingCommitsInRemote(remote, commitList)\n for (const commit of missing) {\n unpushed.push({ repo: remote, commit })\n }\n }\n\n return unpushed\n}\n\nexport async function findMissingCommitsInRemote(remoteUrl: string, commits: string[]): Promise<string[]> {\n const commitList = Array.from(new Set(commits.map((commit) => commit.trim()).filter(Boolean)))\n if (!commitList.length) {\n return []\n }\n\n const tempDir = await mkdtemp(path.join(os.tmpdir(), 'skillcraft-remote-check-'))\n try {\n try {\n await git(['clone', '--quiet', '--no-checkout', remoteUrl, tempDir], process.cwd())\n } catch {\n return commitList\n }\n\n const missing: string[] = []\n for (const commit of commitList) {\n const isPushed = await isCommitOnRemote(tempDir, commit)\n if (!isPushed) {\n missing.push(commit)\n }\n }\n\n return missing\n } finally {\n await rm(tempDir, { recursive: true, force: true })\n }\n}\n\nasync function isCommitOnRemote(repoDir: string, commit: string): Promise<boolean> {\n try {\n await git(['cat-file', '-e', `${commit}^{commit}`], repoDir)\n } catch {\n return false\n }\n\n try {\n const output = await git(['branch', '-r', '--contains', commit], repoDir)\n return !!output\n } catch {\n return false\n }\n}\n","import { isEnabled } from '@/core/state'\nimport { gitLogWithMessages } from '@/core/git'\nimport { readProof } from '@/core/proof'\nimport { findUnpushedCommitsWithOptions, listRemotes } from '@/core/remote'\n\nexport async function runVerify(): Promise<void> {\n const repoPath = process.cwd()\n if (!(await isEnabled(repoPath))) {\n throw new Error('Repository is not enabled')\n }\n\n const messages = await gitLogWithMessages(repoPath, 200)\n const referenced = messages\n .map((entry: { message: string }) => {\n const match = entry.message.match(/Skillcraft-Ref:\\s*(\\S+)/)\n return match?.[1]\n })\n .filter(Boolean) as string[]\n\n let missing = 0\n const proofCommits: string[] = []\n for (const id of referenced) {\n const proof = await readProof(repoPath, id)\n if (!proof) {\n missing += 1\n process.stdout.write(`missing proof object: ${id}\\n`)\n continue\n }\n if (!proof.commit || !proof.timestamp) {\n missing += 1\n process.stdout.write(`invalid proof object: ${id}\\n`)\n continue\n }\n\n proofCommits.push(proof.commit)\n }\n\n if (missing > 0) {\n process.stdout.write(`verify failed: ${missing} missing/invalid proofs\\n`)\n process.exitCode = 1\n return\n }\n\n process.stdout.write(`verify passed: ${referenced.length} commit proofs resolved\\n`)\n\n const remotes = await listRemotes(repoPath)\n if (!remotes.length) {\n process.stdout.write('⚠️ Warning: no git remotes configured for repository\\n')\n return\n }\n\n const sources = remotes.map((remote) => ({ repo: remote.url, commits: proofCommits }))\n const missingCommits = await findUnpushedCommitsWithOptions(sources, { normalize: false })\n\n const missingByRemote = new Map<string, string[]>()\n for (const { repo, commit } of missingCommits) {\n const missingForRemote = missingByRemote.get(repo)\n if (missingForRemote) {\n missingForRemote.push(commit)\n } else {\n missingByRemote.set(repo, [commit])\n }\n }\n\n const uniqueMissing = (remoteUrl: string): string[] => {\n const values = missingByRemote.get(remoteUrl)\n return values ? Array.from(new Set(values)) : []\n }\n\n for (const remote of remotes) {\n const missingHere = uniqueMissing(remote.url)\n if (missingHere.length > 0) {\n process.stdout.write(`⚠️ Warning: proof commits not pushed to ${remote.url}: ${missingHere.join(', ')}\\n`)\n } else {\n process.stdout.write(`remote status: ${remote.url} (all referenced proof commits present)\\n`)\n }\n }\n}\n","import { createHash } from 'node:crypto'\nimport yaml from 'yaml'\nimport { loadRepos } from '@/core/config'\nimport { hasSkillcraftDir } from '@/core/state'\nimport { loadProofFromRepo } from '@/core/progress'\nimport { getProvider } from '@/providers'\nimport { loadGlobalConfig } from '@/core/config'\nimport { gitIsAncestor, gitRemote } from '@/core/git'\nimport { findUnpushedCommits } from '@/core/remote'\n\nexport async function runClaimList(): Promise<void> {\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n const claimant = await resolveClaimant(provider, config.githubUser)\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n\n const matching = issues.filter((issue) => {\n const parsed = parseClaimMetadataFromBody(issue.body)\n return (\n parsed?.claimant === normalizeText(claimant) &&\n !!parsed?.credential\n )\n })\n\n if (!matching.length) {\n process.stdout.write(`no claims found for ${claimant || 'user'}\\n`)\n return\n }\n\n for (const issue of matching) {\n process.stdout.write(`#${issue.number} ${issue.title} (${getClaimLifecycleStatus(issue.labels?.map((entry) => entry?.name) || [])})\\n`)\n }\n\n return\n}\n\nexport async function runClaimStatus(reference: string): Promise<void> {\n const credential = normalizeText(reference)\n if (!credential) {\n throw new Error('claim status requires a credential identifier')\n }\n\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n const claimant = await resolveClaimant(provider, config.githubUser)\n\n const issue = await findClaimIssue(provider, credential, claimant)\n if (!issue) {\n throw new Error(`No claim found for credential ${credential} for user ${claimant || 'unknown'}. Run \"skillcraft claim\" to see your claims.`)\n }\n\n const status = await provider.getIssueStatus('skillcraft-gg/credential-ledger', issue)\n const runs = await provider.listClaimProcessingRuns('skillcraft-gg/credential-ledger', issue)\n process.stdout.write(`issue #${issue}\\n`)\n process.stdout.write(`state: ${getClaimLifecycleStatus(status.labels)}\\n`)\n process.stdout.write(`labels: ${status.labels.join(', ') || 'none'}\\n`)\n process.stdout.write(`url: ${status.url}\\n`)\n\n if (!runs.length) {\n process.stdout.write('processing actions: none found\\n')\n return\n }\n\n const latest = runs[0]\n const conclusion = latest.conclusion ? ` (${latest.conclusion})` : ''\n process.stdout.write(`processing actions: ${latest.status}${conclusion}\\n`)\n process.stdout.write(`latest run: ${latest.url}\\n`)\n if (runs.length > 1) {\n process.stdout.write(`previous attempts: ${runs.length - 1}\\n`)\n }\n}\n\nasync function findClaimIssue(provider: ReturnType<typeof getProvider>, credential: string, claimant: string): Promise<number | undefined> {\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n const normalizedCredential = normalizeText(credential)\n const normalizedClaimant = normalizeText(claimant)\n\n const matches = issues\n .map((issue) => {\n const parsed = parseClaimMetadataFromBody(issue.body)\n if (!parsed || parsed.claimant !== normalizedClaimant || parsed.credential !== normalizedCredential) {\n return undefined\n }\n\n return issue.number\n })\n .filter((value): value is number => !!value)\n\n return matches.sort((a, b) => b - a)[0]\n}\n\nasync function findOpenClaimIssue(\n provider: ReturnType<typeof getProvider>,\n credential: string,\n claimant: string,\n): Promise<{\n number: number\n state: string\n url?: string\n labels?: Array<{ name: string }>\n} | undefined> {\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n const normalizedCredential = normalizeText(credential)\n const normalizedClaimant = normalizeText(claimant)\n\n const matches = issues.filter((issue) => {\n if (normalizeText(issue.state) !== 'open') {\n return false\n }\n\n const parsed = parseClaimMetadataFromBody(issue.body)\n return !!parsed && parsed.claimant === normalizedClaimant && parsed.credential === normalizedCredential\n })\n\n return matches.sort((a, b) => a.number - b.number)[0]\n}\n\nexport async function runClaim(credential: string, opts: { allRepos?: boolean; repo?: string[] }): Promise<void> {\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n\n const claimant = await resolveClaimant(provider, config.githubUser)\n\n const payload = await makeClaimPayload(credential, {\n allRepos: opts?.allRepos,\n repo: opts?.repo,\n }, claimant)\n\n const normalizedCredential = normalizeText(credential)\n const normalizedClaimant = normalizeText(claimant)\n\n const unpushed = await findUnpushedCommits(payload.sources)\n if (unpushed.length > 0) {\n process.stdout.write('⚠️ Warning: some claim commits may not be pushed yet. Please push recent commits before re-submitting the claim.\\n')\n for (const entry of unpushed) {\n process.stdout.write(`- ${entry.commit} in ${entry.repo}\\n`)\n }\n process.exitCode = 1\n return\n }\n\n if (normalizedCredential && normalizedClaimant) {\n const existing = await findOpenClaimIssue(provider, normalizedCredential, normalizedClaimant)\n if (existing) {\n const url = existing.url || await provider.getIssueUrl('skillcraft-gg/credential-ledger', existing.number)\n process.stdout.write('claim already submitted\\n')\n process.stdout.write(`issue: #${existing.number}\\n`)\n process.stdout.write(`state: ${getClaimLifecycleStatus(existing.labels?.map((entry) => entry?.name) || [])}\\n`)\n process.stdout.write(`url: ${url}\\n`)\n return\n }\n\n await ensureNotIssuedClaim(provider, normalizedCredential, normalizedClaimant)\n }\n\n const yamlPayload = yaml.stringify(payload)\n const issue = await provider.createIssue('skillcraft-gg/credential-ledger', `claim: ${credential}`, yamlPayload)\n process.stdout.write(`opened claim: #${issue}\\n`)\n process.stdout.write(`payload:\\n${yamlPayload}\\n`)\n}\n\nasync function resolveClaimant(provider: ReturnType<typeof getProvider>, configuredUser?: string): Promise<string> {\n const envUser = process.env.GITHUB_USER || process.env.USER || ''\n try {\n const user = await provider.getUser()\n if (user) {\n return user\n }\n } catch {\n }\n return configuredUser || envUser || 'unknown'\n}\n\nfunction normalizeText(value: string) {\n return (value || '').trim().toLowerCase()\n}\n\nasync function ensureNotIssuedClaim(provider: ReturnType<typeof getProvider>, credential: string, claimant: string): Promise<void> {\n const issues = await provider.listClaimIssues('skillcraft-gg/credential-ledger')\n\n const alreadyIssued = issues.find((issue) => {\n if (!issueHasLabel(issue, 'skillcraft-issued')) {\n return false\n }\n\n const parsed = parseClaimMetadataFromBody(issue.body)\n if (!parsed) {\n return false\n }\n\n return parsed.credential === credential && parsed.claimant === claimant\n })\n\n if (!alreadyIssued) {\n return\n }\n\n const suffix = alreadyIssued.url ? ` (${alreadyIssued.url})` : ''\n throw new Error(`You already have an issued claim for ${credential}. Existing issue: #${alreadyIssued.number}${suffix}`)\n}\n\nfunction parseClaimMetadataFromBody(body?: string): { credential: string; claimant: string } | undefined {\n if (!body) {\n return undefined\n }\n\n try {\n const normalizedBody = String(body).replace(/\\\\n/g, '\\n')\n const parsed = yaml.parse(normalizedBody)\n if (!parsed || typeof parsed !== 'object') {\n return undefined\n }\n\n const rawCredential = parsed.credential && typeof parsed.credential === 'string' ? parsed.credential : parsed.credential?.id\n const rawClaimant = parsed.claimant?.github\n const credential = normalizeText(rawCredential)\n const claimant = normalizeText(rawClaimant)\n if (!credential || !claimant) {\n return undefined\n }\n return { credential, claimant }\n } catch {\n return undefined\n }\n}\n\nfunction issueHasLabel(issue: { labels?: Array<{ name: string }> }, expected: string): boolean {\n const normalized = expected.toLowerCase()\n return (issue.labels || []).some((entry) => normalizeText(entry?.name) === normalized)\n}\n\nfunction getClaimLifecycleStatus(labels: string[] | undefined): string {\n const normalized = new Set((labels || []).map((value) => normalizeText(value)))\n\n if (normalized.has('skillcraft-issued')) {\n return 'issued'\n }\n if (normalized.has('skillcraft-rejected')) {\n return 'rejected'\n }\n if (normalized.has('skillcraft-verified')) {\n return 'verified'\n }\n if (normalized.has('skillcraft-processing')) {\n return 'processing'\n }\n\n return 'pending'\n}\n\nasync function makeClaimPayload(\n credential: string,\n options: { allRepos?: boolean; repo?: string[] },\n claimant = 'unknown',\n): Promise<{\n claim_version: number\n claimant: { github: string }\n credential: { id: string }\n sources: Array<{ repo: string; commits: string[] }>\n claim_id: string\n}> {\n const repos = await resolveClaimRepos(options)\n const sources = [] as Array<{ repo: string; commits: string[] }>\n for (const repoPath of repos) {\n const proofs = await loadProofFromRepo(repoPath)\n const remote = (await gitRemote(repoPath)) || repoPath\n\n const reachableProofs = await Promise.all(\n proofs.map(async (proof) => ((await gitIsAncestor(repoPath, proof.commit)) ? proof : undefined)),\n )\n\n const commitIds = Array.from(\n new Set(reachableProofs.map((proof) => proof?.commit).filter(Boolean) as string[]),\n )\n\n sources.push({\n repo: remote,\n commits: commitIds,\n })\n }\n\n const username = claimant\n const claimSeed = `${username}:${credential}:${sources.map((s) => `${s.repo}:${s.commits.length}`).join('|')}:${Date.now()}`\n const claimId = createHash('sha256').update(claimSeed).digest('hex').slice(0, 8)\n\n return {\n claim_version: 1,\n claimant: {\n github: username,\n },\n credential: {\n id: credential,\n },\n sources,\n claim_id: `sha256:${claimId}`,\n }\n}\n\nasync function resolveClaimRepos(options: { allRepos?: boolean; repo?: string[] }): Promise<string[]> {\n const repoList = options.allRepos ? (await loadRepos()).repos.map((entry) => entry.path) : [process.cwd()]\n const selected = options.repo ? options.repo : repoList\n const valid = [] as string[]\n for (const repoPath of selected) {\n if (!(await hasSkillcraftDir(repoPath))) {\n continue\n }\n valid.push(repoPath)\n }\n return valid\n}\n","import path from 'node:path'\nimport fs from 'node:fs/promises'\nimport { isEnabled } from '@/core/state'\nimport { contextPath } from '@/core/paths'\nimport { readJson, writeJson } from '@/core/fs'\nimport { isValidIdentifier } from '@/core/validation'\nimport { assertNonEmpty } from '@/core/validation'\nimport { getProvider } from '@/providers'\nimport { loadGlobalConfig } from '@/core/config'\nimport { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { splitArgPair } from '@/core/validation'\n\nconst execPromise = promisify(execFile)\n\nexport async function runLoadoutUse(id: string): Promise<void> {\n if (!isValidIdentifier(id)) {\n throw new Error('loadout id must be <owner>/<slug>')\n }\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n\n const current = (await readJson(contextPath(cwd))) as { activeLoadouts?: string[] } | null\n const active = Array.isArray(current?.activeLoadouts) ? current!.activeLoadouts.filter(Boolean) : []\n if (!active.includes(id)) {\n active.push(id)\n }\n await writeJson(contextPath(cwd), { activeLoadouts: active })\n process.stdout.write(`activated loadout: ${id}\\n`)\n}\n\nexport async function runLoadoutClear(): Promise<void> {\n const cwd = process.cwd()\n if (!(await isEnabled(cwd))) {\n throw new Error('Repository is not enabled')\n }\n await writeJson(contextPath(cwd), { activeLoadouts: [] })\n process.stdout.write('cleared active loadouts\\n')\n}\n\nexport async function runLoadoutShare(id: string): Promise<void> {\n const cleanId = assertNonEmpty(id, 'loadout id')\n if (!isValidIdentifier(cleanId)) {\n throw new Error('loadout id must be <owner>/<slug>')\n }\n const { owner, slug: slugPart } = splitArgPair(cleanId)\n\n const cwd = process.cwd()\n const loadoutFile = path.join(cwd, 'loadout.yaml')\n await fs.access(loadoutFile)\n const stat = await fs.stat(loadoutFile)\n if (!stat.isFile()) {\n throw new Error('loadout.yaml not found in current directory')\n }\n\n const config = await loadGlobalConfig()\n const provider = getProvider(config.provider ?? 'gh')\n const remote = `skillcraft-gg/loadouts`\n const temp = path.join(process.cwd(), '.skillcraft-temp-loadout-share')\n const branch = `skillcraft-loadout-${owner}-${slugPart}`\n\n try {\n await fs.rm(temp, { force: true, recursive: true })\n await provider.cloneRepo(remote, temp)\n await runGit(temp, ['checkout', '-B', branch])\n\n const targetDir = path.join(temp, 'loadouts', owner, slugPart)\n await fs.rm(targetDir, { force: true, recursive: true }).catch(() => undefined)\n await fs.mkdir(path.dirname(targetDir), { recursive: true })\n await fs.copyFile(loadoutFile, path.join(targetDir, 'loadout.yaml'))\n\n await runGit(temp, ['add', targetDir])\n await runGit(temp, ['commit', '-m', `Loadout: publish ${cleanId}`]).catch(async () => {\n throw new Error('nothing to commit; loadout may already be published')\n })\n await runGit(temp, ['push', '-u', 'origin', branch]).catch(() => {\n throw new Error('unable to push loadout publish branch')\n })\n await provider.createPullRequest(\n remote,\n branch,\n `Loadout publish: ${cleanId}`,\n ).catch(() => {\n process.stdout.write('unable to create PR automatically. Please open one manually from your branch.\\n')\n })\n process.stdout.write(`loadout publish workflow completed for ${cleanId}\\n`)\n } finally {\n await fs.rm(temp, { force: true, recursive: true })\n }\n}\n\nasync function runGit(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execPromise('git', args, { cwd })\n return stdout.trim()\n}\n","import { removeFile, writeJson } from '@/core/fs'\nimport { amendCommitMessage, gitHeadCommit, gitRoot, isGitRepo } from '@/core/git'\nimport { handleCodexAgentHook, normalizeAgentName } from '@/core/agents'\nimport { contextPath, pendingPath } from '@/core/paths'\nimport { buildCommitMessageWithProof, buildProofFromPending, pushProofBranch, writeProof } from '@/core/proof'\nimport { isEnabled } from '@/core/state'\n\nexport async function runHook(repoPath: string): Promise<void> {\n if (!(await isEnabled(repoPath))) {\n return\n }\n\n const commit = await gitHeadCommit(repoPath)\n const timestamp = new Date().toISOString()\n\n const result = await buildProofFromPending(repoPath, commit, timestamp)\n if (!result) {\n return\n }\n\n const message = await buildCommitMessageWithProof(repoPath, result.proofId)\n await amendCommitMessage(repoPath, message)\n\n const amendedCommit = await gitHeadCommit(repoPath)\n if (amendedCommit !== commit) {\n await writeProof(repoPath, {\n ...result.proof,\n commit: amendedCommit,\n })\n }\n\n await writeJson(pendingPath(repoPath), { skills: [] })\n}\n\nexport async function runHookPush(repoPath: string, remote = 'origin'): Promise<void> {\n await pushProofBranch(repoPath, remote)\n}\n\nexport async function runHookClear(repoPath: string): Promise<void> {\n await Promise.all([removeFile(pendingPath(repoPath)), removeFile(contextPath(repoPath))])\n process.stdout.write(`cleared hook state in ${repoPath}\\n`)\n}\n\nexport async function runAgentHook(agentName: string, repoPath?: string): Promise<void> {\n const agent = normalizeAgentName(agentName)\n if (!agent) {\n throw new Error(`Unsupported agent hook: ${agentName}`)\n }\n\n const payload = await readJsonFromStdin()\n const payloadCwd = payload && typeof payload === 'object' && !Array.isArray(payload) && typeof (payload as Record<string, unknown>).cwd === 'string'\n ? String((payload as Record<string, unknown>).cwd)\n : undefined\n const targetRepo = await resolveHookRepoPath(payloadCwd || repoPath || process.cwd())\n\n if (agent === 'codex') {\n await handleCodexAgentHook(targetRepo, payload)\n }\n}\n\nasync function readJsonFromStdin(): Promise<unknown> {\n const chunks: Buffer[] = []\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)))\n }\n const raw = Buffer.concat(chunks).toString('utf8').trim()\n if (!raw) {\n return {}\n }\n return JSON.parse(raw)\n}\n\nasync function resolveHookRepoPath(candidate: string): Promise<string> {\n if (await isGitRepo(candidate)) {\n return gitRoot(candidate)\n }\n return candidate\n}\n"],"mappings":"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","names":["Command","package_default","fs","path","os","defaultUserDir","skillcraftGlobalDir","skillcraftConfigPath","skillcraftReposPath","trackedCredentialsPath","credentialIndexCachePath","localStateDir","repoPath","localGitDir","localSkillcraftConfig","pendingPath","repoPath","path","localGitDir","contextPath","pluginPath","opencodePluginPath","repoPath","path","codexConfigPath","codexHooksPath","codexMarketplacePath","codexPluginRootPath","codexPluginManifestPath","codexPluginSkillPath","projectSkillsRootPath","installedSkillsIndexPath","aiModelContextPath","localGitDir","z","ProofVersionSchema","DefaultProofRef","PendingSchema","ContextSchema","ProofAgentSchema","ProofModelSchema","AgentIntegrationSchema","AgentStateSchema","InstalledSkillInstallSchema","InstalledSkillRecordSchema","InstalledSkillsFileSchema","ConfigSchema","RepoEntrySchema","ReposFileSchema","TrackedCredentialSchema","TrackedCredentialsFileSchema","fs","path","ensureDir","dirPath","readText","filePath","writeText","content","fileExists","readJson","raw","writeJson","value","json","removeFile","removePath","targetPath","loadGlobalConfig","raw","readJson","skillcraftConfigPath","parsed","ConfigSchema","loadLocalConfig","repoPath","localSkillcraftConfig","saveGlobalConfig","config","ensureDir","skillcraftGlobalDir","writeJson","loadRepos","skillcraftReposPath","ReposFileSchema","saveRepos","file","addRepo","entry","next","item","removeRepo","loadTrackedCredentials","trackedCredentialsPath","TrackedCredentialsFileSchema","saveTrackedCredentials","addTrackedCredential","id","current","sortTrackedCredentialEntries","removeTrackedCredential","before","a","b","execSync","path","fs","path","path","localIdentifierPattern","localIdentifierPatternWithoutVersion","externalSourceIdWithoutVersion","normalizeSkillId","value","parsed","splitSkillIdentifier","isValidIdentifier","isValidSkillIdentifier","input","trimmed","splitIdentifierAndVersion","id","isLocalIdentifierWithoutVersion","owner","slug","match","source","firstPart","secondPart","assertNonEmpty","field","v","parts","version","splitArgPair","loadInstalledSkills","repoPath","raw","readJson","installedSkillsIndexPath","parsed","InstalledSkillsFileSchema","saveInstalledSkills","skills","normalized","left","right","writeJson","registerInstalledSkill","skill","filtered","entry","queueSkillUsage","repoPath","rawId","normalized","normalizeSkillId","current","readJson","pendingPath","pending","next","entry","writeJson","normalizeInstalledSkillName","value","buildInstalledSkillRecord","input","path","recordCodexSkillUsage","repoPath","payload","installed","loadInstalledSkills","parsed","normalizePayload","usedSkillIds","skillId","detectExplicitSkillUsage","queueSkillUsage","record","toolInput","normalizeText","transcriptPath","targetTurnId","raw","fs","installedByPath","installedByName","skill","normalizeFsPath","path","detected","activeTurnId","line","extractTurnContextTurnId","entry","extractExplicitSkillReferences","matches","item","text","skillBlocks","block","normalizeInstalledSkillName","value","filePath","supportedAgents","codexTomlStart","codexTomlEnd","codexHookCommand","SupportedAgents","normalizeAgentName","value","normalized","agent","parseAgentOptions","values","unsupportedAgentOptions","loadEnabledAgents","repoPath","raw","readJson","pluginPath","parsed","AgentStateSchema","record","saveEnabledAgents","agents","providers","writeJson","detectAvailableAgents","isToolAvailable","enableAgentIntegration","ensureDir","path","opencodePluginPath","writeText","getManagedOpencodePluginSource","enableCodexIntegration","disableAgentIntegration","removeFile","disableCodexIntegration","ensureAiModelContext","existing","aiModelContextPath","currentAgent","updateAiModelContext","update","current","existingAgent","existingModel","next","handleCodexAgentHook","payload","modelName","modelProvider","recordCodexSkillUsage","tool","execSync","writeCodexConfig","writeCodexHooks","writeCodexMarketplace","writeCodexPlugin","removeCodexManagedConfig","removeCodexHooks","removeCodexMarketplace","removePath","codexPluginRootPath","codexPluginManifestPath","codexPluginSkillPath","filePath","codexMarketplacePath","plugins","entry","nextPlugins","plugin","codexHooksPath","hooks","upsertCodexHookGroup","codexHookHandler","eventName","nextGroups","group","commands","hook","codexConfigPath","readText","enableCodexHooksInToml","fileExists","removeManagedTomlBlock","statusMessage","nextGroup","groups","index","source","withoutManaged","lines","inFeatures","line","ensureTrailingNewline","featuresIndex","managedBlock","escapedStart","escapedEnd","matcher","execFileCb","spawn","promisify","path","execFile","git","args","cwd","options","stdout","error","message","gitWithInput","input","resolve","reject","child","stderr","chunk","code","isGitRepo","gitRoot","gitRemote","remote","gitHooksPath","gitCommitMessage","commit","gitHeadCommit","gitHasRef","ref","gitCreateUnrelatedBranch","branch","emptyTree","gitIsAncestor","ancestor","descendant","gitLsTreeNames","subPath","raw","gitShowText","filePath","gitLogWithMessages","maxCount","n","entry","messageParts","amendCommitMessage","env","tempFile","writeFile","fs","path","MANAGED_MARKER","buildHookScript","backupPath","body","rawCliPath","cliPath","backup","backupBlock","postCommitScript","postPushScript","prePushScript","installPostCommitHook","repoPath","hooksDir","resolveManagedHooksDir","ensureDir","installManagedHook","path","removePostCommitHook","restoreManagedHook","hasInstalledPostCommitHook","hookPath","fileExists","isSkillcraftManagedHook","readText","rawPath","gitHooksPath","resolved","gitHooksDir","isWithinPath","buildScript","managed","readManagedHook","writeText","fs","contents","targetPath","rootPath","relative","runDisable","options","cwd","isGitRepo","root","gitRoot","currentAgents","loadEnabledAgents","targetAgents","resolveDisableAgents","agent","disableAgentIntegration","remainingAgents","saveEnabledAgents","removeGenericSkillcraftState","rawAgents","invalid","unsupportedAgentOptions","requested","parseAgentOptions","active","removeFile","localSkillcraftConfig","pendingPath","contextPath","pluginPath","aiModelContextPath","removePath","localGitDir","removePostCommitHook","removeRepo","createHash","path","os","fs","PROOFS_DIR","normalizeProofBranch","proofRef","DefaultProofRef","proofPathForId","proofId","proofBranch","repoPath","config","loadLocalConfig","proofSearchRefs","branch","normalized","localRef","remoteRef","refs","gitHasRef","ensureProofBranch","fullRef","gitCreateUnrelatedBranch","withProofWorktree","action","removeProofWorktrees","worktree","fs","path","os","git","removeProofWorktree","worktreePath","targetRef","lines","currentWorktree","currentBranch","maybeRemove","line","loadProofsFromRepo","searchRefs","files","listed","gitLsTreeNames","file","proofs","proof","readProof","parseSkillFromRaw","value","parsed","splitSkillIdentifier","isValidSkillIdentifier","normalizeSkillIds","raw","item","entry","buildProofId","skills","timestamp","loadouts","createHash","loadPending","readJson","pendingPath","PendingSchema","loadContext","contextPath","ContextSchema","loadAiModelContext","aiModelContextPath","record","agentValue","modelValue","normalizeLowerCase","normalizeModelName","parseProof","payload","parseAgentValue","parseModelValue","provider","normalizedProvider","normalizedName","gitShowText","writeProof","skill","proofFile","ensureDir","writeJson","pushProofBranch","remoteName","gitRemote","currentProofIdForCommit","commit","buildProofFromPending","pending","aiModelContext","parsedSkills","stripDraftMessage","message","buildCommitMessageWithProof","existing","gitCommitMessage","cleaned","isEnabled","repoPath","configPath","localSkillcraftConfig","fileExists","raw","readJson","ConfigSchema","hasSkillcraftDir","localGitDir","fs","path","execFile","execSync","promisify","exec","hasGh","runGh","args","copyDirRecursively","source","target","entries","entry","from","to","link","GitHubProvider","repo","number","title","body","match","targetRepo","branch","sourceRepo","sourceBranch","issueNumber","raw","parsed","label","issueMarker","candidates","name","workflowName","runs","issue","hasClaimTitle","hasLabel","fullName","destination","temp","normalizeText","value","labels","expected","normalized","providers","GitHubProvider","getProvider","name","runStatus","cwd","git","isGitRepo","repoPath","gitRoot","enabled","isEnabled","pending","loadPending","agents","loadEnabledAgents","contextExists","fileExists","contextPath","hasHook","hasInstalledPostCommitHook","head","gitHeadCommit","proofId","currentProofIdForCommit","withSkillcraft","gitLogWithMessages","entry","branch","loadLocalConfig","proofBranchExists","gitHasRef","runDoctor","checks","checkTool","name","ok","detectedAgents","detectAvailableAgents","login","getProvider","tool","isToolAvailable","execSync","createInterface","input","output","runEnable","options","cwd","isGitRepo","root","gitRoot","requestedAgents","resolveRequestedAgents","config","loadGlobalConfig","fallback","getProvider","saveGlobalConfig","ensureDir","localGitDir","branchRef","DefaultProofRef","gitHasRef","gitCreateUnrelatedBranch","writeJson","localSkillcraftConfig","skillcraftGlobalDir","pendingPath","contextPath","existingAgents","loadEnabledAgents","nextAgents","sortAgents","agent","enableAgentIntegration","ensureAiModelContext","saveEnabledAgents","installPostCommitHook","remote","gitRemote","addRepo","rawAgents","invalid","unsupportedAgentOptions","requested","parseAgentOptions","available","detectAvailableAgents","input","output","promptForAgents","rl","createInterface","index","answer","selected","value","trimmed","agents","runReposList","data","loadRepos","entry","index","runReposPrune","next","item","isGitRepo","gitRoot","saveRepos","loadProofFromRepo","repoPath","loadProofsFromRepo","path","DEFAULT_CREDENTIAL_INDEX_URL","CREDENTIAL_INDEX_CACHE_REFRESH_MS","CREDENTIAL_INDEX_CACHE_VERSION","CREDENTIAL_INDEX_CACHE_PATH","credentialIndexCachePath","getCredentialIndexUrl","readCredentialIndexCache","cachePath","raw","readJson","isObject","cachedAt","parseInteger","entries","normalizeCredentialIndexEntries","value","parsed","isCredentialIndexCacheFresh","cache","loadCredentialIndex","options","explicitPath","loadIndexFromPath","cached","loadIndexFromRemote","writeCredentialIndexCache","error","fileExists","url","response","filePath","ensureDir","path","payload","writeJson","normalizeRequirements","requirements","requirementTree","normalizeRequirementRoot","normalizeNonNegativeInteger","parseRequirementNode","hasExplicitAnd","hasExplicitOr","unexpected","key","normalizeRequirementList","buildImplicitAndFromShortcuts","location","entry","index","normalizeShortHandList","values","text","parseScalarText","normalized","known","skill","loadout","hasAgent","agent","normalizeAgentRequirement","hasModel","model","normalizeModelRequirement","nested","keys","valueForKey","childIndex","node","provider","name","evaluateRequirements","proofs","provenCommits","provenRepos","proofSkills","proofLoadouts","proofAgents","proofModels","dedupedCommits","dedupedRepos","proofEntry","proof","parseIdentifierWithVersion","modelProvider","modelName","requirementResult","evaluateRequirementTree","checks","resultReasons","failedRequirementReasons","context","childResults","noExplicitChecks","child","childResult","satisfied","proofSkillsMatch","parseTextRequirement","expectedProvider","normalizeRequirementText","expectedName","candidate","hasProvider","hasName","parts","matchesId","actualId","actualVersion","expected","trimmed","fallback","normalizedEntry","normalizeCredentialIndexEntry","left","right","id","getCredentialIndexEntries","printLines","lines","resolveTrackedRepos","data","loadRepos","repoPaths","repos","entry","isEnabled","runProgress","options","tracked","trackedCredList","loadTrackedCredentials","printJsonResult","buildPayload","indexById","mapCredentials","getCredentialIndexEntries","proofFiles","proofs","provenRepos","provenCommits","repoPath","proofsInRepo","loadProofFromRepo","remote","gitRemote","proof","provenCommitList","provenRepoList","payload","evaluated","definition","makeMissingDefinitionResult","result","evaluateRequirements","formatResult","lines","reason","printLines","runProgressTrack","rawId","id","assertNonEmpty","addTrackedCredential","runProgressUntrack","removeTrackedCredential","params","index","credentialId","provenRepositories","path","fs","os","execFile","promisify","ora","execPromise","promisify","execFile","runSkillsPublish","slug","ref","assertNonEmpty","owner","slugPart","splitArgPair","cwd","isEnabled","files","fs","path","config","loadGlobalConfig","provider","getProvider","destination","branch","temp","runGit","target","runSkillsAdd","rawId","cleanInput","parsed","splitSkillIdentifier","entry","loadSearchIndexEntries","candidate","install","requireInstallMetadata","installedName","normalizeInstalledSkillName","targetDir","projectSkillsRootPath","exists","os","sourceDir","materializeSkillSource","ensureDir","rewriteInstalledSkillManifest","registerInstalledSkill","buildInstalledSkillRecord","runSkillsValidate","checks","name","ok","runSkillsList","proofs","pending","installed","loadProofFromRepo","loadPending","loadInstalledSkills","skills","proof","item","skill","list","runSkillsSearch","rawQuery","options","entries","getSearchLimit","query","sourceFilter","limit","sorted","getSkillSource","value","left","right","leftName","rightName","shown","message","title","lines","runtime","tags","updatedLabel","formatUpdatedAt","formatSearchResultName","payload","runSkillsInspect","cleanId","match","manifest","loadSkillManifest","formatInspectOutput","source","manifestUrl","buildSkillManifestUrl","controller","timeout","response","text","isHtmlDocument","parseSkillManifest","error","rawUrl","url","toRawManifestUrl","parts","blobIndex","repo","remainingPath","rawParts","input","index","summary","i","line","tempDir","resolveLocalInstallPath","checkoutDir","rawPath","explicitIndexPath","filePath","end","replaced","nextFrontmatter","next","isJson","outputMode","explicitPath","loadEntries","raw","normalizeSearchIndexEntries","shouldShowSearchSpinner","action","spinner","ora","normalizeSearchIndexEntry","normalizeString","id","normalizeSkillId","normalizeText","normalizeStringArray","normalizeSearchInstall","record","type","installPath","normalized","separatorIndex","requestedLimit","deriveSearchResultSlug","separator","suffix","updatedAt","pathToCheck","runSkillUsed","repoPath","queueSkillUsage","args","stdout","runSkillsValidateAndExit","mkdtemp","rm","os","path","normalizeRemoteSource","rawRepo","repo","listRemotes","repoPath","git","line","separator","key","url","name","value","findUnpushedCommits","sources","findUnpushedCommitsWithOptions","options","normalize","unpushed","source","remote","commit","commitList","missing","findMissingCommitsInRemote","remoteUrl","commits","tempDir","mkdtemp","path","os","isCommitOnRemote","rm","repoDir","runVerify","repoPath","isEnabled","referenced","gitLogWithMessages","entry","missing","proofCommits","id","proof","readProof","remotes","listRemotes","sources","remote","missingCommits","findUnpushedCommitsWithOptions","missingByRemote","repo","commit","missingForRemote","uniqueMissing","remoteUrl","values","missingHere","createHash","yaml","runClaimList","config","loadGlobalConfig","provider","getProvider","claimant","resolveClaimant","matching","issue","parsed","parseClaimMetadataFromBody","normalizeText","getClaimLifecycleStatus","entry","runClaimStatus","reference","credential","findClaimIssue","status","runs","latest","conclusion","issues","normalizedCredential","normalizedClaimant","value","a","b","findOpenClaimIssue","runClaim","opts","payload","makeClaimPayload","unpushed","findUnpushedCommits","existing","url","ensureNotIssuedClaim","yamlPayload","yaml","configuredUser","envUser","user","alreadyIssued","issueHasLabel","suffix","body","normalizedBody","rawCredential","rawClaimant","expected","normalized","labels","options","repos","resolveClaimRepos","sources","repoPath","proofs","loadProofFromRepo","remote","gitRemote","reachableProofs","proof","gitIsAncestor","commitIds","username","claimSeed","s","claimId","createHash","repoList","loadRepos","selected","valid","hasSkillcraftDir","path","fs","execFile","promisify","execPromise","promisify","execFile","runLoadoutUse","id","isValidIdentifier","cwd","isEnabled","current","readJson","contextPath","active","writeJson","runLoadoutClear","runLoadoutShare","cleanId","assertNonEmpty","owner","slugPart","splitArgPair","loadoutFile","path","fs","config","loadGlobalConfig","provider","getProvider","remote","temp","branch","runGit","targetDir","args","stdout","runHook","repoPath","isEnabled","commit","gitHeadCommit","timestamp","result","buildProofFromPending","message","buildCommitMessageWithProof","amendCommitMessage","amendedCommit","writeProof","writeJson","pendingPath","runHookPush","remote","pushProofBranch","runAgentHook","agentName","repoPath","agent","normalizeAgentName","payload","readJsonFromStdin","payloadCwd","targetRepo","resolveHookRepoPath","handleCodexAgentHook","chunks","chunk","raw","candidate","isGitRepo","gitRoot","program","Command","package_default","collectStrings","options","withCommand","runEnable","runDisable","runStatus","runDoctor","reposCommand","runReposList","runReposPrune","progressCommand","command","outputMode","runProgress","credentialId","runProgressTrack","runProgressUntrack","skillsCommand","id","runSkillsAdd","ownerSlug","runSkillsPublish","runSkillsValidateAndExit","runSkillsList","_options","runSkillsInspect","value","query","runSkillsSearch","runVerify","claimCommand","credential","runClaimList","runClaim","runClaimStatus","loadoutCommand","runLoadoutUse","runLoadoutClear","runLoadoutShare","name","repoPath","remote","runHook","runHookPush","agent","runAgentHook","runSkillUsed","fn","args","error","previous"]}
|