@attest-it/cli 0.9.0 → 0.9.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/output.ts","../../src/components/theme.ts","../../src/utils/prompts.ts","../../src/utils/exit-codes.ts","../../src/utils/completion-offer.ts","../../src/utils/version.ts","../../src/commands/init.ts","../../src/commands/status.ts","../../src/components/Header.tsx","../../src/components/StatusBadge.tsx","../../src/components/SuiteTable.tsx","../../src/components/SelectionPrompt.tsx","../../src/components/SuiteSelector.tsx","../../src/components/ProgressSummary.tsx","../../src/components/TestRunner.tsx","../../src/components/InteractiveRun.tsx","../../src/commands/run-utils.ts","../../src/session/session.ts","../../src/commands/run-interactive.tsx","../../src/commands/run.ts","../../src/commands/prune.ts","../../src/commands/verify.ts","../../src/commands/seal.ts","../../src/commands/identity/list.ts","../../src/commands/identity/validation.ts","../../src/commands/identity/create.ts","../../src/commands/identity/use.ts","../../src/commands/identity/show.ts","../../src/utils/format-key-location.ts","../../src/commands/identity/remove.ts","../../src/commands/identity/export.ts","../../src/commands/identity/index.ts","../../src/commands/whoami.ts","../../src/commands/team/list.ts","../../src/commands/team/utils.ts","../../src/commands/team/add.ts","../../src/commands/team/join.ts","../../src/commands/team/remove.ts","../../src/commands/team/index.ts","../../src/commands/completion.ts","../../src/index.ts","../../bin/attest-it.ts"],"names":["theme","getTheme","confirm","tabtab","error","fileURLToPath","dirname","join","Command","jsx","Text","Box","input","jsxs","React5","useInput","createAttestation","currentSuite","saveSession","React8","loadConfig","computeFingerprint","readAttestations","resolve","parseShellCommand","executeCommand","spawn","checkDirtyWorkingTree","os2","upsertAttestation","KeyProviderRegistry","getDefaultPrivateKeyPath","FilesystemKeyProvider","writeSignedAttestations","toAttestItConfig","computeFingerprintSync","fs","readSealsSync","fs2","verifyGateSeal","verifyAllSeals","colorizeState","formatAge","loadLocalConfigSync","getActiveIdentity","writeSealsSync","isAuthorizedSigner","createKeyProviderFromIdentity","getKeyRefFromIdentity","createSeal","loadLocalConfig","mkdir","writeFile","name","execFile","promisify","execFileAsync","saveLocalConfig","unlink","stringifyYaml","listCommand","runList","findConfigPath","removeCommand","runRemove","PROGRAM_NAME","PROGRAM_ALIAS","globalOptions","detectCurrentShell","getSourceCommand"],"mappings":"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","file":"attest-it.js","sourcesContent":["import { detectTheme, type Theme } from 'chromaterm'\n\nexport interface OutputOptions {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n}\n\n// Singleton for global output options\nlet globalOptions: OutputOptions = {}\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required mock theme for testing/fallback when async init not called\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOptions = options\n}\n\nexport function getOutputOptions(): OutputOptions {\n return globalOptions\n}\n\n// Logging functions\nexport function log(message: string): void {\n if (!globalOptions.quiet) {\n console.log(message)\n }\n}\n\nexport function verbose(message: string): void {\n if (globalOptions.verbose && !globalOptions.quiet) {\n console.log(getTheme().muted(message))\n }\n}\n\nexport function success(message: string): void {\n log(getTheme().success('✓ ' + message))\n}\n\nexport function error(message: string): void {\n console.error(getTheme().error('✗ ' + message))\n}\n\nexport function warn(message: string): void {\n if (!globalOptions.quiet) {\n console.warn(getTheme().warning('⚠ ' + message))\n }\n}\n\nexport function info(message: string): void {\n log(getTheme().info('ℹ ' + message))\n}\n\n// Table formatting for status display\nexport interface TableRow {\n suite: string\n status: string\n fingerprint: string\n age: string\n}\n\nexport function formatTable(rows: TableRow[]): string {\n // Calculate column widths\n const headers = ['Suite', 'Status', 'Fingerprint', 'Age']\n\n // Helper to get row values in consistent order\n const getRowValues = (row: TableRow): string[] => [\n row.suite,\n row.status,\n row.fingerprint,\n row.age,\n ]\n\n const widths = headers.map((h, i) => {\n const columnValues = rows.map((r) => {\n const values = getRowValues(r)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n return values[i] ?? ''\n })\n const maxValueLength = Math.max(...columnValues.map((v) => v.length), 0)\n return Math.max(h.length, maxValueLength)\n })\n\n // Build table\n const separator = '─'\n const lines: string[] = []\n\n // Header\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(headers.map((h, i) => h.padEnd(widths[i] ?? 0)).join(' │ '))\n lines.push(widths.map((w) => separator.repeat(w)).join('─┼─'))\n\n // Rows\n for (const row of rows) {\n const values = getRowValues(row)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(values.map((v, i) => v.padEnd(widths[i] ?? 0)).join(' │ '))\n }\n\n return lines.join('\\n')\n}\n\n// Status colorization\nexport function colorizeStatus(status: string): string {\n const t = getTheme()\n switch (status) {\n case 'VALID':\n return t.green(status)\n case 'NEEDS_ATTESTATION':\n case 'FINGERPRINT_CHANGED':\n return t.yellow(status)\n case 'EXPIRED':\n case 'INVALIDATED_BY_PARENT':\n return t.red(status)\n case 'SIGNATURE_INVALID':\n return t.red.bold()(status)\n default:\n return status\n }\n}\n\n// JSON output\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n","/**\n * Theme utilities for ink components.\n * Provides access to chromaterm theme and shared styling constants.\n */\n\nimport { detectTheme, type Theme } from 'chromaterm'\n\n/**\n * Status display configuration.\n */\nexport interface StatusDisplay {\n /** Text to display */\n label: string\n /** Ink color name */\n color: string\n /** Whether to apply bold */\n bold?: boolean\n /** Symbol to show before label */\n symbol?: string\n}\n\n/**\n * Map verification status to display configuration.\n */\nexport const STATUS_DISPLAY: Record<string, StatusDisplay> = {\n VALID: {\n label: 'VALID',\n color: 'green',\n symbol: '✓',\n },\n NEEDS_ATTESTATION: {\n label: 'MISSING',\n color: 'yellow',\n symbol: '○',\n },\n FINGERPRINT_CHANGED: {\n label: 'CHANGED',\n color: 'yellow',\n symbol: '⚠',\n },\n EXPIRED: {\n label: 'STALE',\n color: 'red',\n symbol: '⚠',\n },\n SIGNATURE_INVALID: {\n label: 'INVALID',\n color: 'red',\n bold: true,\n symbol: '✗',\n },\n INVALIDATED_BY_PARENT: {\n label: 'PARENT_INVALID',\n color: 'red',\n symbol: '✗',\n },\n}\n\n/**\n * Box drawing characters for consistent UI.\n */\nexport const BOX_CHARS = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n cross: '┼',\n} as const\n\n/**\n * Common column widths for table display.\n */\nexport const COLUMN_WIDTHS = {\n checkbox: 3, // [ ] or [x]\n status: 14, // MISSING, CHANGED, PARENT_INVALID, etc.\n suite: 25, // Suite name\n reason: 30, // Reason text\n} as const\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // Type assertion is required here because we're creating a mock Theme object\n // for testing/fallback purposes. The chromaterm Theme type has complex\n // chainable methods that we're approximating with simple functions.\n // This is safe because all methods accept and return strings.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required to create mock theme for testing\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\n/**\n * Get display configuration for a verification status.\n * Returns a default for unknown statuses.\n */\nexport function getStatusDisplay(status: string): StatusDisplay {\n return (\n // eslint-disable-next-line security/detect-object-injection -- status is a user-controlled string, but we provide a safe default for unknown values\n STATUS_DISPLAY[status] ?? {\n label: status,\n color: 'white',\n symbol: '?',\n }\n )\n}\n","import { confirm } from '@inquirer/prompts'\nimport { getTheme, BOX_CHARS } from '../components/theme.js'\n\nexport interface ConfirmOptions {\n message: string\n default?: boolean\n}\n\n/**\n * Display a visually distinctive confirmation prompt.\n *\n * Creates a styled box with yellow border to make the attestation prompt\n * stand out from test output.\n */\nexport async function confirmAction(options: ConfirmOptions): Promise<boolean> {\n const theme = getTheme()\n\n // Build the styled prompt box\n const defaultIndicator = options.default ? '(Y/n)' : '(y/N)'\n const message = `${options.message}? ${defaultIndicator}`\n const boxWidth = Math.max(message.length + 2, 40)\n const contentPadding = ' '.repeat(boxWidth - message.length - 1)\n\n // Box drawing with yellow border\n const topBorder = theme.yellow(\n `${BOX_CHARS.topLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.topRight}`,\n )\n const bottomBorder = theme.yellow(\n `${BOX_CHARS.bottomLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.bottomRight}`,\n )\n\n // Content line with yellow border and normal text\n const contentLine =\n theme.yellow(BOX_CHARS.vertical) +\n ` ${message}${contentPadding}` +\n theme.yellow(BOX_CHARS.vertical)\n\n // Display the styled box\n console.log('')\n console.log(topBorder)\n console.log(contentLine)\n console.log(bottomBorder)\n console.log('')\n\n // Get the actual confirmation\n return confirm({\n message: '', // Empty message since we displayed it above\n default: options.default ?? false,\n theme: {\n prefix: '', // Remove default prefix\n },\n })\n}\n","/**\n * Standard exit codes for the attest-it CLI.\n *\n * These codes follow Unix conventions and provide consistent error reporting\n * across all CLI commands.\n *\n * @packageDocumentation\n */\n\n/**\n * Standard exit codes for the attest-it CLI.\n * @public\n */\nexport const ExitCode = {\n /** Operation completed successfully */\n SUCCESS: 0,\n /** Tests failed or attestation invalid */\n FAILURE: 1,\n /** Nothing needed attestation */\n NO_WORK: 2,\n /** Configuration or validation error */\n CONFIG_ERROR: 3,\n /** User cancelled the operation */\n CANCELLED: 4,\n /** Missing required key file */\n MISSING_KEY: 5,\n} as const\n\n/**\n * Type representing all possible exit codes.\n * @public\n */\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode]\n","/**\n * Utility to offer shell completion installation to users.\n * @packageDocumentation\n */\n\nimport { confirm } from '@inquirer/prompts'\nimport { loadPreferences, savePreferences } from '@attest-it/core'\nimport { log, info, success, error } from './output.js'\nimport tabtab from '@pnpm/tabtab'\n\n/** Primary program name */\nconst PROGRAM_NAME = 'attest-it'\n/** Short alias for the program */\nconst PROGRAM_ALIAS = 'attest'\n\ntype SupportedShell = 'bash' | 'zsh' | 'fish'\n\n/**\n * Detect the user's current shell from the SHELL environment variable.\n */\nfunction detectCurrentShell(): SupportedShell | null {\n const shellPath = process.env.SHELL ?? ''\n if (shellPath.endsWith('/bash') || shellPath.endsWith('/bash.exe')) {\n return 'bash'\n }\n if (shellPath.endsWith('/zsh') || shellPath.endsWith('/zsh.exe')) {\n return 'zsh'\n }\n if (shellPath.endsWith('/fish') || shellPath.endsWith('/fish.exe')) {\n return 'fish'\n }\n return null\n}\n\n/**\n * Get the source command for reloading a shell's config.\n */\nfunction getSourceCommand(shell: SupportedShell): string {\n switch (shell) {\n case 'bash':\n return 'source ~/.bashrc'\n case 'zsh':\n return 'source ~/.zshrc'\n case 'fish':\n return 'source ~/.config/fish/config.fish'\n }\n}\n\n/**\n * Offer to install shell completions if the user hasn't declined before.\n * Should be called at the end of init and identity create commands.\n *\n * @returns true if completions were installed, false otherwise\n */\nexport async function offerCompletionInstall(): Promise<boolean> {\n try {\n // Check if user has already declined\n const prefs = await loadPreferences()\n if (prefs.cliExperience?.declinedCompletionInstall) {\n return false\n }\n\n // Detect shell\n const shell = detectCurrentShell()\n if (!shell) {\n // Can't detect shell, skip the offer\n return false\n }\n\n // Ask user if they want to install completions\n log('')\n const shouldInstall = await confirm({\n message: `Would you like to enable shell completions for ${shell}?`,\n default: true,\n })\n\n if (!shouldInstall) {\n // Save preference that user declined\n await savePreferences({\n ...prefs,\n cliExperience: {\n ...prefs.cliExperience,\n declinedCompletionInstall: true,\n },\n })\n\n log('')\n info('No problem! If you change your mind, you can run:')\n log(' attest-it completion install')\n log('')\n return false\n }\n\n // Install completions for both program names (attest-it and attest)\n await tabtab.install({\n name: PROGRAM_NAME,\n completer: PROGRAM_NAME,\n shell,\n })\n await tabtab.install({\n name: PROGRAM_ALIAS,\n completer: PROGRAM_ALIAS,\n shell,\n })\n\n log('')\n success(`Shell completions installed for ${shell}!`)\n info(`Completions enabled for both \"${PROGRAM_NAME}\" and \"${PROGRAM_ALIAS}\" commands.`)\n log('')\n info('Restart your shell or run:')\n log(` ${getSourceCommand(shell)}`)\n log('')\n\n return true\n } catch (err) {\n // Don't let completion errors fail the main command\n error(`Failed to install completions: ${err instanceof Error ? err.message : String(err)}`)\n log('')\n info('You can try again later with:')\n log(' attest-it completion install')\n log('')\n return false\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\n\n/**\n * Type guard for package.json structure with version field.\n */\nfunction hasVersion(data: unknown): data is { version: string } {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { version: unknown }).version === 'string'\n )\n}\n\n/**\n * Cached version to avoid repeated file reads.\n */\nlet cachedVersion: string | undefined\n\n/**\n * Get the current version of the attest-it CLI package.\n *\n * This function reads the version from package.json at runtime, handling\n * different bundle output locations created by tsup. The version is cached\n * after the first read for performance.\n *\n * @returns The version string from package.json\n * @throws {Error} If package.json cannot be found or is missing version field\n * @public\n */\nexport function getPackageVersion(): string {\n if (cachedVersion !== undefined) {\n return cachedVersion\n }\n\n // Read version from package.json at runtime\n const __filename = fileURLToPath(import.meta.url)\n const __dirname = dirname(__filename)\n\n // Try multiple paths since tsup creates separate bundles for each entry point:\n // - dist/index.js (library entry) needs ../package.json\n // - dist/bin/attest-it.js (CLI entry) needs ../../package.json\n const possiblePaths = [join(__dirname, '../package.json'), join(__dirname, '../../package.json')]\n\n for (const packageJsonPath of possiblePaths) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8')\n const packageJsonData: unknown = JSON.parse(content)\n\n if (!hasVersion(packageJsonData)) {\n throw new Error(`Invalid package.json at ${packageJsonPath}: missing version field`)\n }\n\n cachedVersion = packageJsonData.version\n return cachedVersion\n } catch (error) {\n // Only suppress \"file not found\" errors; rethrow anything else\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n // Try next path\n continue\n }\n throw error\n }\n }\n\n throw new Error('Could not find package.json')\n}\n","import { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\nimport { log, success, error } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { offerCompletionInstall } from '../utils/completion-offer.js'\nimport { getPackageVersion } from '../utils/version.js'\n\nexport const initCommand = new Command('init')\n .description('Initialize attest-it configuration')\n .option('-p, --path <path>', 'Config file path', '.attest-it/config.yaml')\n .option('-f, --force', 'Overwrite existing config')\n .action(async (options: InitOptions) => {\n await runInit(options)\n })\n\ninterface InitOptions {\n path: string\n force?: boolean\n}\n\n/**\n * Load the configuration template from the templates directory.\n *\n * This function reads the config.yaml template at build time from the templates directory.\n * It handles different bundle output locations created by tsup.\n */\nfunction loadConfigTemplate(): string {\n const __filename = fileURLToPath(import.meta.url)\n const __dirname = dirname(__filename)\n\n // Try multiple paths since tsup creates separate bundles:\n // - dist/commands/init.js needs ../../templates/config.yaml\n // - dist/bin/attest-it.js (when bundled) needs ../templates/config.yaml\n const possiblePaths = [\n join(__dirname, '../../templates/config.yaml'),\n join(__dirname, '../templates/config.yaml'),\n ]\n\n for (const templatePath of possiblePaths) {\n try {\n return fs.readFileSync(templatePath, 'utf-8')\n } catch (error) {\n // Only suppress \"file not found\" errors; rethrow anything else\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n // Try next path\n continue\n }\n throw error\n }\n }\n\n throw new Error('Could not find config.yaml template')\n}\n\n/**\n * Represents a package.json structure with the fields we need to interact with.\n */\ninterface PackageJson {\n name: string\n version: string\n devDependencies?: Record<string, string>\n [key: string]: unknown\n}\n\n/**\n * Type guard for package.json structure.\n */\nfunction isPackageJson(data: unknown): data is PackageJson {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'name' in data &&\n 'version' in data &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { name: unknown }).name === 'string' &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { version: unknown }).version === 'string'\n )\n}\n\n/**\n * Detect the package manager being used in the project.\n */\nfunction detectPackageManager(): 'pnpm' | 'yarn' | 'bun' | 'npm' {\n if (fs.existsSync('pnpm-lock.yaml')) return 'pnpm'\n if (fs.existsSync('yarn.lock')) return 'yarn'\n if (fs.existsSync('bun.lockb')) return 'bun'\n return 'npm'\n}\n\n/**\n * Ensure attest-it is added as a devDependency.\n * Creates or updates package.json in the current directory.\n *\n * @returns Information about the package manager and whether package.json was created\n */\nasync function ensureDevDependency(): Promise<{ packageManager: string; created: boolean }> {\n const packageJsonPath = 'package.json'\n const packageManager = detectPackageManager()\n let created = false\n\n let packageJson: PackageJson\n if (fs.existsSync(packageJsonPath)) {\n const content = await fs.promises.readFile(packageJsonPath, 'utf8')\n const parsed: unknown = JSON.parse(content)\n\n if (!isPackageJson(parsed)) {\n throw new Error('Invalid package.json: missing required name or version field')\n }\n\n packageJson = parsed\n } else {\n packageJson = { name: path.basename(process.cwd()), version: '1.0.0' }\n created = true\n }\n\n // Add devDependency\n const devDeps = packageJson.devDependencies ?? {}\n devDeps['attest-it'] = '^' + getPackageVersion()\n packageJson.devDependencies = devDeps\n\n await fs.promises.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n')\n\n return { packageManager, created }\n}\n\n/**\n * Run the init command to create a new attest-it configuration.\n *\n * Creates a configuration file with sensible defaults and commented\n * examples showing how to define test suites. Also ensures attest-it\n * is added as a devDependency to package.json.\n *\n * @param options - Command options\n * @param options.path - Config file path (default: .attest-it/config.yaml)\n * @param options.force - Overwrite existing config without prompting\n * @public\n */\nasync function runInit(options: InitOptions): Promise<void> {\n try {\n const configPath = path.resolve(options.path)\n const configDir = path.dirname(configPath)\n\n if (fs.existsSync(configPath) && !options.force) {\n const overwrite = await confirmAction({\n message: `Config already exists at ${configPath}. Overwrite?`,\n default: false,\n })\n if (!overwrite) {\n error('Init cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Ensure attest-it is in devDependencies\n const { packageManager, created } = await ensureDevDependency()\n if (created) {\n success('Created package.json')\n } else {\n success('Updated package.json with attest-it devDependency')\n }\n\n // Create directory and write config\n await fs.promises.mkdir(configDir, { recursive: true })\n const configTemplate = loadConfigTemplate()\n await fs.promises.writeFile(configPath, configTemplate, 'utf-8')\n\n success(`Configuration created at ${configPath}`)\n log('')\n log('Next steps:')\n log(` 1. Run: ${packageManager} install`)\n log(\" 2. Run: attest-it identity create (if you haven't already)\")\n log(' 3. Run: attest-it team join')\n log(' 4. Edit .attest-it/config.yaml to define your gates and suites')\n\n // Offer to install shell completions\n await offerCompletionInstall()\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\nexport { runInit }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyGateSeal,\n verifyAllSeals,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const statusCommand = new Command('status')\n .description('Show seal status for all gates')\n .argument('[gates...]', 'Show status for specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: StatusOptions) => {\n await runStatus(gates, options)\n })\n\ninterface StatusOptions {\n json?: boolean\n}\n\ninterface GateStatus {\n gateId: string\n state: VerificationState\n currentFingerprint: string\n sealedFingerprint?: string\n sealedBy?: string\n sealedAt?: string\n age?: number\n message?: string | undefined\n}\n\n/**\n * Run the status command to show seal status.\n *\n * Displays the current status of seals for all gates or specific gates,\n * including validation status, fingerprints, and age information.\n *\n * @param gates - Array of gate IDs to show status for, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runStatus(gates: string[], options: StatusOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Determine which gates to check\n const gatesToCheck = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const verificationResults =\n gates.length > 0\n ? gatesToCheck.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Build status results\n const results: GateStatus[] = verificationResults.map((result: SealVerificationResult) => {\n const status: GateStatus = {\n gateId: result.gateId,\n state: result.state,\n currentFingerprint: fingerprints[result.gateId] ?? '',\n message: result.message,\n }\n\n if (result.seal) {\n status.sealedFingerprint = result.seal.fingerprint\n status.sealedBy = result.seal.sealedBy\n status.sealedAt = result.seal.timestamp\n\n // Calculate age\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n status.age = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n }\n\n return status\n })\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayStatusTable(results)\n }\n\n // Exit with appropriate code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER' ||\n r.state === 'STALE',\n )\n\n process.exit(hasInvalid ? ExitCode.FAILURE : ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display status results in a formatted table.\n *\n * @param results - Status results for gates\n */\nfunction displayStatusTable(results: GateStatus[]): void {\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: r.currentFingerprint.slice(0, 16) + '...',\n age: formatAge(r),\n }))\n\n log('')\n log(formatTable(tableRows))\n log('')\n\n // Show seal metadata for each gate (who sealed, when)\n const sealed = results.filter((r) => r.sealedBy && r.sealedAt)\n if (sealed.length > 0) {\n log('Seal metadata:')\n for (const result of sealed) {\n log(` ${result.gateId}:`)\n log(` Sealed by: ${result.sealedBy ?? 'unknown'}`)\n if (result.sealedAt) {\n const date = new Date(result.sealedAt)\n log(` Sealed at: ${date.toLocaleString()}`)\n }\n }\n log('')\n }\n\n // Show messages for any gates with issues\n const withIssues = results.filter((r) => r.state !== 'VALID' && r.message)\n if (withIssues.length > 0) {\n log('Issues:')\n for (const result of withIssues) {\n log(` ${result.gateId}: ${result.message ?? 'Unknown issue'}`)\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const invalidCount = results.length - validCount\n\n if (invalidCount === 0) {\n success('All gate seals valid')\n } else {\n log(`Run 'attest-it seal' to create or update seals`)\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format age for display.\n *\n * @param result - Status result\n * @returns Formatted age string\n */\nfunction formatAge(result: GateStatus): string {\n if (result.state === 'VALID' || result.state === 'STALE') {\n return `${String(result.age ?? 0)} days${result.state === 'STALE' ? ' (stale)' : ''}`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runStatus }\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface HeaderProps {\n /** Number of suites needing attestation */\n pendingCount: number\n}\n\n/**\n * Displays a header box with pending suite count.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ 4 suites need attestation │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function Header({ pendingCount }: HeaderProps): React.ReactElement {\n const message = `${pendingCount.toString()} suite${pendingCount === 1 ? '' : 's'} need${pendingCount === 1 ? 's' : ''} attestation`\n\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>{message}</Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Props for the StatusBadge component.\n * @public\n */\nexport interface StatusBadgeProps {\n /** The verification status to display */\n status: VerificationStatus\n}\n\n/**\n * Displays a colored badge for suite verification status.\n *\n * Status colors:\n * - VALID: green\n * - NEEDS_ATTESTATION: yellow (display as \"MISSING\")\n * - FINGERPRINT_CHANGED: yellow (display as \"CHANGED\")\n * - EXPIRED: red (display as \"STALE\")\n * - SIGNATURE_INVALID: red bold\n * - INVALIDATED_BY_PARENT: red (display as \"INVALIDATED\")\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function StatusBadge({ status }: StatusBadgeProps): React.ReactElement {\n // Map status to display text and color\n const statusConfig = getStatusConfig(status)\n\n // Only pass bold prop if it's true to avoid exactOptionalPropertyTypes issues\n if (statusConfig.bold) {\n return (\n <Text color={statusConfig.color} bold>\n {statusConfig.text}\n </Text>\n )\n }\n\n return <Text color={statusConfig.color}>{statusConfig.text}</Text>\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\ninterface StatusConfig {\n text: string\n color: 'green' | 'yellow' | 'red'\n bold?: boolean\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\nfunction getStatusConfig(status: VerificationStatus): StatusConfig {\n switch (status) {\n case 'VALID':\n return { text: '✓ VALID', color: 'green' }\n case 'NEEDS_ATTESTATION':\n return { text: 'MISSING', color: 'yellow' }\n case 'FINGERPRINT_CHANGED':\n return { text: 'CHANGED', color: 'yellow' }\n case 'EXPIRED':\n return { text: 'STALE', color: 'red' }\n case 'SIGNATURE_INVALID':\n return { text: 'INVALID', color: 'red', bold: true }\n case 'INVALIDATED_BY_PARENT':\n return { text: 'INVALIDATED', color: 'red' }\n default: {\n // Exhaustive check\n const _exhaustive: never = status\n return { text: String(_exhaustive), color: 'yellow' }\n }\n }\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { StatusBadge } from './StatusBadge.js'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Information about a single suite for display in the table.\n * @public\n */\nexport interface SuiteInfo {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason (e.g., \"32 days old (max: 30)\") */\n reason: string\n /** Days since attestation (if exists) */\n age?: number | undefined\n}\n\n/**\n * Props for the SuiteTable component.\n * @public\n */\nexport interface SuiteTableProps {\n /** List of suites to display */\n suites: SuiteInfo[]\n /** Show checkbox column for selection */\n selectable?: boolean | undefined\n /** Currently selected suite names */\n selected?: Set<string> | undefined\n}\n\n/**\n * Displays suites in a table format with status badges.\n *\n * Example output:\n * ```\n * Status Suite Reason\n * ──────────────────────────────────────────────────────────\n * [ ] STALE visual-effects 32 days old (max: 30)\n * [ ] MISSING focus-detection No attestation found\n * ```\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function SuiteTable({\n suites,\n selectable = false,\n selected = new Set(),\n}: SuiteTableProps): React.ReactElement {\n // Calculate column widths\n const columnWidths = calculateColumnWidths(suites, selectable)\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box>\n {selectable && <Text>{' '.repeat(4)}</Text>}\n <Text bold>{padEnd('Status', columnWidths.status)}</Text>\n <Text> </Text>\n <Text bold>{padEnd('Suite', columnWidths.suite)}</Text>\n <Text> </Text>\n <Text bold>Reason</Text>\n </Box>\n\n {/* Separator */}\n <Box>\n <Text color=\"gray\">\n {'─'.repeat(\n (selectable ? 4 : 0) + columnWidths.status + columnWidths.suite + columnWidths.reason,\n )}\n </Text>\n </Box>\n\n {/* Rows */}\n {suites.map((suite) => (\n <Box key={suite.name}>\n {selectable && <Text>{selected.has(suite.name) ? '[✓] ' : '[ ] '}</Text>}\n <Box width={columnWidths.status}>\n <StatusBadge status={suite.status} />\n </Box>\n <Text> </Text>\n <Text>{padEnd(suite.name, columnWidths.suite)}</Text>\n <Text> </Text>\n <Text color=\"gray\">{suite.reason}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n\n/**\n * Column width information.\n * @internal\n */\ninterface ColumnWidths {\n status: number\n suite: number\n reason: number\n}\n\n/**\n * Calculate column widths based on content.\n * @internal\n */\nfunction calculateColumnWidths(suites: SuiteInfo[], _selectable: boolean): ColumnWidths {\n const statusHeader = 'Status'\n const suiteHeader = 'Suite'\n const reasonHeader = 'Reason'\n\n // Status column - fixed width for badges\n // Maximum status badge length is \"INVALIDATED\" (11 chars) + \"✓ \" (2 chars) = 13\n const statusWidth = Math.max(statusHeader.length, 13)\n\n // Suite column - max of header and all suite names\n const suiteWidth = Math.max(suiteHeader.length, ...suites.map((s) => s.name.length))\n\n // Reason column - max of header and all reasons\n const reasonWidth = Math.max(reasonHeader.length, ...suites.map((s) => s.reason.length))\n\n return {\n status: statusWidth,\n suite: suiteWidth,\n reason: reasonWidth,\n }\n}\n\n/**\n * Pad a string to the right with spaces.\n * @internal\n */\nfunction padEnd(str: string, width: number): string {\n return str.padEnd(width, ' ')\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\n\ninterface SelectionOption {\n /** Display label */\n label: string\n /** Value returned when selected */\n value: string\n /** Optional keyboard shortcut hint */\n hint?: string\n}\n\nexport interface SelectionPromptProps {\n /** Question to display */\n message: string\n /** Available options */\n options: SelectionOption[]\n /** Callback when option selected */\n onSelect: (value: string) => void\n /** Show group options if available */\n groups?: { name: string; label: string }[] | undefined\n}\n\n/**\n * Displays a selection prompt with keyboard hints.\n *\n * Example output:\n * Select suites to run:\n * [a] All pending [1-4] By number [n] None/exit\n * [g1] ui-tests [g2] behavior-tests\n */\nexport function SelectionPrompt({\n message,\n options,\n onSelect,\n groups,\n}: SelectionPromptProps): React.ReactElement {\n useInput((input) => {\n // Check if input matches any option's hint\n const matchedOption = options.find((opt) => opt.hint === input)\n if (matchedOption) {\n onSelect(matchedOption.value)\n return\n }\n\n // Check if input matches a group name\n if (groups) {\n const matchedGroup = groups.find((group) => group.name === input)\n if (matchedGroup) {\n onSelect(matchedGroup.name)\n }\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{message}</Text>\n <Box marginTop={1} gap={2}>\n {options.map((option) => (\n <Text key={option.value}>\n {option.hint && (\n <>\n <Text color=\"cyan\">[{option.hint}]</Text>{' '}\n </>\n )}\n {option.label}\n </Text>\n ))}\n </Box>\n {groups && groups.length > 0 && (\n <Box marginTop={1} gap={2}>\n {groups.map((group) => (\n <Text key={group.name}>\n <Text color=\"cyan\">[{group.name}]</Text> {group.label}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Header } from './Header.js'\nimport { SuiteTable } from './SuiteTable.js'\nimport { SelectionPrompt } from './SelectionPrompt.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\n\ninterface SuiteSelectorProps {\n /** All suites needing attestation */\n pendingSuites: SuiteStatus[]\n /** Valid suites (for \"Already valid\" display) */\n validSuites: SuiteStatus[]\n /** Available groups from config */\n groups?: Record<string, string[]> | undefined\n /** Called when user confirms selection */\n onSelect: (selectedSuites: string[]) => void\n /** Called when user exits */\n onExit: () => void\n}\n\n/**\n * Main suite selection UI component.\n *\n * Displays:\n * 1. Header with pending count\n * 2. Table of pending suites with checkboxes\n * 3. List of already valid suites\n * 4. Selection prompt with keyboard shortcuts\n *\n * Keyboard controls:\n * - a: Select all pending\n * - n: None/exit\n * - 1-9: Toggle individual suite by number\n * - g1, g2, etc: Select group (if groups available)\n * - Enter: Confirm selection\n * - Space: Toggle current suite\n * - Up/Down: Navigate\n */\nexport function SuiteSelector({\n pendingSuites,\n validSuites,\n groups,\n onSelect,\n onExit,\n}: SuiteSelectorProps): React.ReactElement {\n const [selectedSuites, setSelectedSuites] = React.useState<Set<string>>(new Set())\n const [cursorIndex, setCursorIndex] = React.useState(0)\n\n /**\n * Toggle suite selection state\n */\n const toggleSuite = React.useCallback((suiteName: string) => {\n setSelectedSuites((prev) => {\n const next = new Set(prev)\n if (next.has(suiteName)) {\n next.delete(suiteName)\n } else {\n next.add(suiteName)\n }\n return next\n })\n }, [])\n\n useInput((input, key) => {\n // 'a' - select all pending\n if (input === 'a') {\n setSelectedSuites(new Set(pendingSuites.map((s) => s.name)))\n return\n }\n\n // 'n' - none/exit\n if (input === 'n') {\n onExit()\n return\n }\n\n // Numbers 1-9 - toggle by number\n if (/^[1-9]$/.test(input)) {\n const idx = parseInt(input, 10) - 1\n if (idx < pendingSuites.length) {\n // eslint-disable-next-line security/detect-object-injection -- idx is bounds-checked against pendingSuites.length\n const suite = pendingSuites[idx]\n if (suite) {\n toggleSuite(suite.name)\n }\n }\n return\n }\n\n // Handle group shortcuts like 'g1', 'g2'\n if (input.startsWith('g') && groups) {\n const groupIdx = parseInt(input.slice(1), 10) - 1\n const groupNames = Object.keys(groups)\n if (groupIdx >= 0 && groupIdx < groupNames.length) {\n // eslint-disable-next-line security/detect-object-injection -- groupIdx is bounds-checked against groupNames.length\n const groupName = groupNames[groupIdx]\n if (groupName) {\n // eslint-disable-next-line security/detect-object-injection -- groupName is from Object.keys, so it's safe\n const groupSuites: string[] = groups[groupName] ?? []\n // Add all suites in this group to selection\n const newSelected = new Set(selectedSuites)\n groupSuites.forEach((s: string) => newSelected.add(s))\n setSelectedSuites(newSelected)\n }\n }\n return\n }\n\n // Enter - confirm selection\n if (key.return) {\n onSelect(Array.from(selectedSuites))\n return\n }\n\n // Space - toggle current\n if (input === ' ') {\n // eslint-disable-next-line security/detect-object-injection -- cursorIndex is bounds-checked via Math.min/Math.max\n const currentSuite = pendingSuites[cursorIndex]\n if (currentSuite) {\n toggleSuite(currentSuite.name)\n }\n return\n }\n\n // Arrow navigation\n if (key.upArrow) {\n setCursorIndex(Math.max(0, cursorIndex - 1))\n return\n }\n if (key.downArrow) {\n setCursorIndex(Math.min(pendingSuites.length - 1, cursorIndex + 1))\n return\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n {/* Header showing pending count */}\n <Header pendingCount={pendingSuites.length} />\n\n <Box marginY={1}>\n {/* Table of pending suites with numbers and checkboxes */}\n <SuiteTable suites={pendingSuites} selectable={true} selected={selectedSuites} />\n </Box>\n\n {/* Show valid suites if any */}\n {validSuites.length > 0 && (\n <Box marginY={1} flexDirection=\"column\">\n <Text dimColor>Already valid:</Text>\n {validSuites.map((s) => (\n <Text key={s.name} dimColor>\n {' '}✓ {s.name} (attested {String(s.age ?? 0)} days ago)\n </Text>\n ))}\n </Box>\n )}\n\n {/* Selection prompt */}\n <SelectionPrompt\n message=\"Select suites to run:\"\n options={[\n { label: 'All pending', value: 'all', hint: 'a' },\n { label: 'By number', value: 'number', hint: '1-9' },\n { label: 'None/exit', value: 'none', hint: 'n' },\n ]}\n groups={\n groups\n ? Object.keys(groups).map((name, i) => ({\n name: `g${String(i + 1)}`,\n label: name,\n }))\n : undefined\n }\n onSelect={() => {\n /* Handled by useInput */\n }}\n />\n\n {/* Current selection count */}\n <Text color=\"cyan\">{selectedSuites.size} selected. Press Enter to confirm.</Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ProgressSummaryProps {\n /** Number of suites completed successfully */\n completed: number\n /** Number of suites remaining to run */\n remaining: number\n /** Number of suites that failed */\n failed: number\n /** Number of suites skipped by user */\n skipped: number\n}\n\n/**\n * Displays a summary box showing test run progress.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ Completed: 2 Remaining: 2 Failed: 0 Skipped: 0 │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function ProgressSummary({\n completed,\n remaining,\n failed,\n skipped,\n}: ProgressSummaryProps): React.ReactElement {\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>\n <Text color=\"green\">Completed: {completed}</Text>\n {' '}\n <Text color=\"yellow\">Remaining: {remaining}</Text>\n {' '}\n <Text color=\"red\">Failed: {failed}</Text>\n {' '}\n <Text color=\"gray\">Skipped: {skipped}</Text>\n </Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ProgressSummary } from './ProgressSummary.js'\n\ntype RunPhase = 'running' | 'confirming' | 'complete'\n\nexport interface TestRunnerProps {\n /** Suites to run in order */\n suites: string[]\n /** Execute a test command and return success/failure */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Called when all suites complete */\n onComplete: (results: RunResults) => void\n}\n\nexport interface RunResults {\n completed: string[]\n failed: string[]\n skipped: string[]\n}\n\n/**\n * Test runner component that executes suites and manages attestations.\n *\n * Flow for each suite:\n * 1. Show \"Running suite-name...\"\n * 2. Execute test command\n * 3. If passed, prompt \"Create attestation? [Y/n]\"\n * 4. If user confirms, create attestation\n * 5. Move to next suite\n *\n * If a test fails, it moves to the next suite without prompting for attestation.\n */\nexport function TestRunner({\n suites,\n executeTest,\n createAttestation,\n onComplete,\n}: TestRunnerProps): React.ReactElement {\n const [currentIndex, setCurrentIndex] = React.useState(0)\n const [phase, setPhase] = React.useState<RunPhase>('running')\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n const [_testPassed, setTestPassed] = React.useState(false)\n\n // Use a ref to store the latest results for the completion callback\n const resultsRef = React.useRef(results)\n React.useEffect(() => {\n resultsRef.current = results\n }, [results])\n\n // Effect to run tests\n React.useEffect(() => {\n if (phase !== 'running') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) {\n // All done - use ref to avoid stale closure\n onComplete(resultsRef.current)\n setPhase('complete')\n return\n }\n\n // Execute the test\n let cancelled = false\n executeTest(currentSuite)\n .then((passed) => {\n if (cancelled) return\n\n setTestPassed(passed)\n if (passed) {\n setPhase('confirming')\n } else {\n // Test failed, move to next\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n }\n })\n .catch(() => {\n if (cancelled) return\n\n // Execution error, treat as failed\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n })\n\n return () => {\n cancelled = true\n }\n }, [currentIndex, phase, suites, executeTest, onComplete])\n\n // Handle attestation confirmation\n useInput(\n (input, key) => {\n if (phase !== 'confirming') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) return\n\n // Y or Enter = create attestation\n if (input.toLowerCase() === 'y' || key.return) {\n createAttestation(currentSuite)\n .then(() => {\n setResults((prev) => ({\n ...prev,\n completed: [...prev.completed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n .catch(() => {\n // If attestation fails, still move on but mark as skipped\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n }\n\n // N = skip attestation\n if (input.toLowerCase() === 'n') {\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n }\n },\n { isActive: phase === 'confirming' },\n )\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n\n return (\n <Box flexDirection=\"column\">\n {/* Progress summary */}\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={suites.length - currentIndex}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {phase === 'running' && currentSuite && (\n <Box>\n <SimpleSpinner />\n <Text> Running {currentSuite}...</Text>\n </Box>\n )}\n\n {phase === 'confirming' && currentSuite && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ Tests passed!</Text>\n <Text>Create attestation for {currentSuite}? [Y/n]: </Text>\n </Box>\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites processed</Text>\n <Text>\n Completed: {results.completed.length}, Failed: {results.failed.length}, Skipped:{' '}\n {results.skipped.length}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Simple spinner component using ASCII animation frames.\n * Fallback for when no dedicated spinner library is available.\n */\nfunction SimpleSpinner(): React.ReactElement {\n const [frame, setFrame] = React.useState(0)\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setFrame((f) => (f + 1) % frames.length)\n }, 80)\n return () => {\n clearInterval(timer)\n }\n }, [])\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n return <Text color=\"cyan\">{frames[frame]}</Text>\n}\n","import * as React from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport { SuiteSelector } from './SuiteSelector.js'\nimport { TestRunner } from './TestRunner.js'\nimport { ProgressSummary } from './ProgressSummary.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\nimport type { Config } from '@attest-it/core'\n\n/**\n * Current phase of the interactive run.\n */\ntype Phase = 'selecting' | 'running' | 'complete'\n\n/**\n * Props for the InteractiveRun component.\n */\nexport interface InteractiveRunProps {\n /** All suite statuses */\n allSuites: SuiteStatus[]\n /** Config for groups and settings */\n config: Config\n /** Execute test for a suite */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Save session state */\n saveSession: (completed: string[], failed: string[], remaining: string[]) => Promise<void>\n /** Optional: pre-selected suites from --continue */\n preSelected?: string[]\n}\n\n/**\n * Results from a test run.\n */\nexport interface RunResults {\n /** Suite names that completed successfully */\n completed: string[]\n /** Suite names that failed */\n failed: string[]\n /** Suite names that were skipped */\n skipped: string[]\n}\n\n/**\n * Main interactive run orchestrator.\n *\n * Phases:\n * 1. selecting - User selects which suites to run\n * 2. running - Tests executing, attestations being created\n * 3. complete - All done, show summary\n */\nexport function InteractiveRun({\n allSuites,\n config,\n executeTest,\n createAttestation,\n saveSession,\n preSelected,\n}: InteractiveRunProps): React.ReactElement {\n const { exit } = useApp()\n\n const [phase, setPhase] = React.useState<Phase>(preSelected ? 'running' : 'selecting')\n const [selectedSuites, setSelectedSuites] = React.useState<string[]>(preSelected ?? [])\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n\n // Compute pending suites (not VALID)\n const pendingSuites = React.useMemo(\n () => allSuites.filter((s) => s.status !== 'VALID'),\n [allSuites],\n )\n\n // Compute valid suites (already attested)\n const validSuites = React.useMemo(\n () => allSuites.filter((s) => s.status === 'VALID'),\n [allSuites],\n )\n\n // Handle selection completion\n const handleSelect = React.useCallback(\n (selected: string[]) => {\n if (selected.length === 0) {\n exit()\n return\n }\n setSelectedSuites(selected)\n setPhase('running')\n },\n [exit],\n )\n\n // Handle run completion (wrapped to avoid promise return in void context)\n const handleRunComplete = React.useCallback(\n (runResults: RunResults) => {\n void (async () => {\n setResults(runResults)\n\n // Save final session state (clear if all done successfully)\n if (runResults.failed.length === 0 && runResults.skipped.length === 0) {\n // All completed - clear session\n await saveSession([], [], [])\n } else {\n // Some remaining - save for --continue\n await saveSession(runResults.completed, runResults.failed, [])\n }\n\n setPhase('complete')\n })()\n },\n [saveSession],\n )\n\n // Handle case where there are no pending suites\n if (pendingSuites.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites are valid. Nothing to run.</Text>\n {validSuites.length > 0 && (\n <Text dimColor>{validSuites.length} suite(s) already attested.</Text>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {phase === 'selecting' && (\n <SuiteSelector\n pendingSuites={pendingSuites}\n validSuites={validSuites}\n groups={config.groups}\n onSelect={handleSelect}\n onExit={() => {\n exit()\n }}\n />\n )}\n\n {phase === 'running' && (\n <TestRunner\n suites={selectedSuites}\n executeTest={executeTest}\n createAttestation={createAttestation}\n onComplete={handleRunComplete}\n />\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={0}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {results.failed.length === 0 && results.skipped.length === 0 ? (\n <Text color=\"green\">✓ All suites attested successfully!</Text>\n ) : (\n <Box flexDirection=\"column\">\n {results.failed.length > 0 && (\n <Text color=\"red\">\n ✗ {results.failed.length} suite(s) failed: {results.failed.join(', ')}\n </Text>\n )}\n <Text>Run `attest-it run` again to continue with remaining suites.</Text>\n </Box>\n )}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n","/**\n * Shared utilities for the run command.\n *\n * Provides functions for checking suite status, filtering suites,\n * and formatting status information.\n *\n * @packageDocumentation\n */\n\nimport type { Config, VerificationStatus, Attestation, AttestationsFile } from '@attest-it/core'\nimport { computeFingerprint, readAttestations, findAttestation } from '@attest-it/core'\n\n/**\n * Information about a suite's current status.\n * @public\n */\nexport interface SuiteStatus {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason for the status */\n reason: string\n /** Current fingerprint of source files */\n currentFingerprint: string\n /** Fingerprint from existing attestation (if any) */\n attestedFingerprint?: string | undefined\n /** ISO timestamp of attestation (if any) */\n attestedAt?: string | undefined\n /** Days since attestation (if any) */\n age?: number | undefined\n}\n\n/**\n * Determine the verification status for a suite.\n *\n * @param attestation - Existing attestation, if any\n * @param currentFingerprint - Current computed fingerprint\n * @param maxAgeDays - Maximum allowed age in days\n * @returns Verification status\n * @internal\n */\nfunction determineStatus(\n attestation: Attestation | null | undefined,\n currentFingerprint: string,\n maxAgeDays: number,\n): VerificationStatus {\n if (!attestation) {\n return 'NEEDS_ATTESTATION'\n }\n\n if (attestation.fingerprint !== currentFingerprint) {\n return 'FINGERPRINT_CHANGED'\n }\n\n const attestedAt = new Date(attestation.attestedAt)\n const ageInDays = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n\n if (ageInDays > maxAgeDays) {\n return 'EXPIRED'\n }\n\n return 'VALID'\n}\n\n/**\n * Get status information for all suites.\n *\n * @param config - Configuration object\n * @returns Array of suite statuses\n * @public\n */\nexport async function getAllSuiteStatuses(config: Config): Promise<SuiteStatus[]> {\n // Load attestations (may not exist)\n let attestationsFile: AttestationsFile | null = null\n try {\n attestationsFile = await readAttestations(config.settings.attestationsPath)\n } catch (err) {\n // Attestations file may not exist yet - that's okay\n if (err instanceof Error && !err.message.includes('ENOENT')) {\n throw err\n }\n }\n const attestations = attestationsFile?.attestations ?? []\n\n const results: SuiteStatus[] = []\n\n for (const [suiteName, suiteConfig] of Object.entries(config.suites)) {\n // Determine fingerprint paths - either from suite's packages or from referenced gate\n let packages: string[] | undefined\n let ignore: string[] | undefined\n\n if (suiteConfig.gate && config.gates) {\n // Suite references a gate - use gate's fingerprint config\n const gateConfig = config.gates[suiteConfig.gate]\n if (gateConfig) {\n packages = gateConfig.fingerprint.paths\n ignore = gateConfig.fingerprint.exclude\n }\n } else if (suiteConfig.packages) {\n // Legacy: suite defines packages directly\n packages = suiteConfig.packages\n ignore = suiteConfig.ignore\n }\n\n // Skip if we couldn't resolve fingerprint paths\n if (!packages || packages.length === 0) {\n continue\n }\n\n // Compute current fingerprint\n const fingerprintResult = await computeFingerprint({\n packages,\n ...(ignore && { ignore }),\n })\n\n // Find existing attestation\n const attestation = findAttestation(\n { schemaVersion: '1', attestations, signature: '' },\n suiteName,\n )\n\n // Determine status\n const status = determineStatus(\n attestation,\n fingerprintResult.fingerprint,\n config.settings.maxAgeDays,\n )\n\n // Calculate age\n let age: number | undefined\n if (attestation) {\n const attestedAt = new Date(attestation.attestedAt)\n age = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n }\n\n results.push({\n name: suiteName,\n status,\n reason: formatStatusReason(status, age, config.settings.maxAgeDays),\n currentFingerprint: fingerprintResult.fingerprint,\n attestedFingerprint: attestation?.fingerprint,\n attestedAt: attestation?.attestedAt,\n age,\n })\n }\n\n return results\n}\n\n/**\n * Get suites that need attestation (not VALID).\n *\n * @param config - Configuration object\n * @returns Array of suite statuses that are not valid\n * @public\n */\nexport async function getSuitesNeedingAttestation(config: Config): Promise<SuiteStatus[]> {\n const allStatuses = await getAllSuiteStatuses(config)\n return allStatuses.filter((s) => s.status !== 'VALID')\n}\n\n/**\n * Filter suites by a glob/regex pattern.\n * Matches against suite name.\n *\n * @param suites - Array of suite statuses to filter\n * @param pattern - Pattern to match (supports * wildcard)\n * @returns Filtered array of suite statuses\n * @public\n */\nexport function filterByPattern(suites: SuiteStatus[], pattern: string): SuiteStatus[] {\n // Support simple glob patterns: * matches anything\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$', 'i')\n return suites.filter((s) => regex.test(s.name))\n}\n\n/**\n * Get suites belonging to a group.\n *\n * @param groupName - Name of the group\n * @param config - Configuration object\n * @returns Array of suite names in the group\n * @public\n */\nexport function getSuitesInGroup(groupName: string, config: Config): string[] {\n // eslint-disable-next-line security/detect-object-injection -- groupName is a user parameter, but we safely return empty array if not found\n return config.groups?.[groupName] ?? []\n}\n\n/**\n * Format a human-readable reason for a suite's status.\n *\n * @param status - Verification status\n * @param age - Age in days (if available)\n * @param maxAgeDays - Maximum allowed age in days (if available)\n * @returns Human-readable status reason\n * @public\n */\nexport function formatStatusReason(\n status: VerificationStatus,\n age?: number,\n maxAgeDays?: number,\n): string {\n switch (status) {\n case 'VALID':\n return `Attested ${String(age ?? 0)} days ago`\n case 'NEEDS_ATTESTATION':\n return 'No attestation found'\n case 'FINGERPRINT_CHANGED':\n return 'Source files modified'\n case 'EXPIRED':\n return `${String(age ?? 0)} days old (max: ${String(maxAgeDays ?? 30)})`\n case 'SIGNATURE_INVALID':\n return 'Signature verification failed'\n case 'INVALIDATED_BY_PARENT':\n return 'Invalidated by parent suite'\n default:\n return status\n }\n}\n","import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'\nimport { join, dirname } from 'node:path'\n\n/**\n * Session state for interrupted run recovery.\n */\nexport interface Session {\n /** ISO timestamp when session started */\n started: string\n /** Suites selected by user for this session */\n selected: string[]\n /** Suites that completed successfully */\n completed: string[]\n /** Suites that failed */\n failed: string[]\n /** Suites not yet run (selected - completed - failed) */\n remaining: string[]\n}\n\n/**\n * Get the path to the session file.\n * Returns `.attest-it/session.json` relative to current working directory.\n */\nexport function getSessionPath(): string {\n return join(process.cwd(), '.attest-it', 'session.json')\n}\n\n/**\n * Load an existing session from disk.\n * Returns null if no session exists or session is invalid.\n */\nexport async function loadSession(): Promise<Session | null> {\n try {\n const content = await readFile(getSessionPath(), 'utf-8')\n const data: unknown = JSON.parse(content)\n\n // Validate session structure\n if (!isValidSession(data)) {\n return null\n }\n\n return data\n } catch {\n // File doesn't exist or is unreadable\n return null\n }\n}\n\n/**\n * Save session state to disk.\n * Creates .attest-it directory if it doesn't exist.\n */\nexport async function saveSession(session: Session): Promise<void> {\n const sessionPath = getSessionPath()\n const dir = dirname(sessionPath)\n\n // Create directory if it doesn't exist\n await mkdir(dir, { recursive: true })\n\n // Write session file\n await writeFile(sessionPath, JSON.stringify(session, null, 2), 'utf-8')\n}\n\n/**\n * Delete the session file.\n * Call this when a session completes successfully.\n */\nexport async function clearSession(): Promise<void> {\n try {\n await unlink(getSessionPath())\n } catch {\n // File doesn't exist - that's fine\n }\n}\n\n/**\n * Create a new session with the given selected suites.\n */\nexport function createSession(selected: string[]): Session {\n return {\n started: new Date().toISOString(),\n selected: [...selected],\n completed: [],\n failed: [],\n remaining: [...selected],\n }\n}\n\n/**\n * Update session after a suite completes.\n */\nexport function updateSessionAfterSuite(\n session: Session,\n suite: string,\n success: boolean,\n): Session {\n const remaining = session.remaining.filter((s) => s !== suite)\n return {\n ...session,\n completed: success ? [...session.completed, suite] : session.completed,\n failed: success ? session.failed : [...session.failed, suite],\n remaining,\n }\n}\n\n/**\n * Type guard to validate session structure.\n */\nfunction isValidSession(data: unknown): data is Session {\n if (typeof data !== 'object' || data === null) {\n return false\n }\n\n // We need to access properties of unknown object, so we check each property\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const obj = data as Record<string, unknown>\n\n return (\n typeof obj.started === 'string' &&\n Array.isArray(obj.selected) &&\n obj.selected.every((item) => typeof item === 'string') &&\n Array.isArray(obj.completed) &&\n obj.completed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.failed) &&\n obj.failed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.remaining) &&\n obj.remaining.every((item) => typeof item === 'string')\n )\n}\n","/**\n * Entry point for interactive run mode.\n *\n * This module bridges the Commander.js CLI and the React-based interactive UI.\n * It handles:\n * - Loading configuration and suite statuses\n * - Checking for session resumption (--continue)\n * - Dry run mode (just show what would run)\n * - Rendering the InteractiveRun component with ink\n * - Providing test execution and attestation creation callbacks\n *\n * @packageDocumentation\n */\n\nimport * as React from 'react'\nimport { render } from 'ink'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n computeFingerprint,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n type Config,\n type KeyProvider,\n} from '@attest-it/core'\nimport { InteractiveRun } from '../components/InteractiveRun.js'\nimport { getAllSuiteStatuses, type SuiteStatus } from './run-utils.js'\nimport { loadSession, saveSession as persistSession, clearSession } from '../session/session.js'\nimport { error, log } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\n/**\n * Options for interactive mode.\n * @public\n */\nexport interface InteractiveOptions {\n /** Show what would run without executing */\n dryRun?: boolean | undefined\n /** Resume from saved session */\n continue?: boolean | undefined\n /** Filter pattern for suite names */\n filter?: string | undefined\n}\n\n/**\n * Run the interactive mode UI.\n *\n * @param options - Interactive mode options\n * @public\n */\nexport async function runInteractive(options: InteractiveOptions): Promise<void> {\n // Load config\n const config = await loadConfig()\n\n // Get all suite statuses\n const allSuites = await getAllSuiteStatuses(config)\n\n // Check if resuming from session\n let preSelected: string[] | undefined\n if (options.continue) {\n const session = await loadSession()\n if (session && session.remaining.length > 0) {\n preSelected = session.remaining\n log(`Resuming session with ${String(preSelected.length)} remaining suite(s)`)\n }\n }\n\n // Dry run mode - just show what would run\n if (options.dryRun) {\n handleDryRun(allSuites, config, options.filter)\n return\n }\n\n // Check for pending suites\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Create test executor\n const executeTest = createTestExecutor(config)\n\n // Create attestation creator\n const createAttestationFn = createAttestationCreator(config)\n\n // Create session saver\n const saveSessionFn = createSessionSaver()\n\n // Render the interactive UI\n const interactiveRunProps = {\n allSuites,\n config,\n executeTest,\n createAttestation: createAttestationFn,\n saveSession: saveSessionFn,\n ...(preSelected !== undefined && { preSelected }),\n }\n\n const { waitUntilExit } = render(<InteractiveRun {...interactiveRunProps} />)\n\n // Wait for UI to exit\n await waitUntilExit()\n}\n\n/**\n * Handle dry run mode.\n * Shows what would run without actually executing.\n *\n * @param allSuites - All suite statuses\n * @param config - Configuration object\n * @param filterPattern - Optional filter pattern\n * @internal\n */\nfunction handleDryRun(allSuites: SuiteStatus[], config: Config, filterPattern?: string): void {\n let pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (filterPattern) {\n const regex = new RegExp('^' + filterPattern.replace(/\\*/g, '.*') + '$', 'i')\n pendingSuites = pendingSuites.filter((s) => regex.test(s.name))\n }\n\n if (pendingSuites.length === 0) {\n log('No suites would run (all valid or filtered out).')\n process.exit(ExitCode.NO_WORK)\n }\n\n log(`Would run ${String(pendingSuites.length)} suite(s):`)\n pendingSuites.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n log('')\n log('Use `attest-it run` to execute.')\n process.exit(ExitCode.SUCCESS)\n}\n\n/**\n * Create a test executor function for a suite.\n *\n * @param config - Configuration object\n * @returns Function that executes a suite's test command\n * @internal\n */\nfunction createTestExecutor(config: Config): (suite: string) => Promise<boolean> {\n return async (suiteName: string): Promise<boolean> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n return false\n }\n\n // Build command\n let command = suiteConfig.command ?? config.settings.defaultCommand\n if (!command) {\n error(`No command specified for suite \"${suiteName}\"`)\n return false\n }\n\n // Substitute ${files} if present\n if (command.includes('${files}') && suiteConfig.files) {\n command = command.replaceAll('${files}', suiteConfig.files.join(' '))\n }\n\n log(`Running: ${command}`)\n\n // Execute command\n const exitCode = await executeCommand(command)\n return exitCode === 0\n }\n}\n\n/**\n * Create an attestation creator function.\n *\n * @param config - Configuration object\n * @returns Function that creates and saves an attestation for a suite\n * @internal\n */\nfunction createAttestationCreator(config: Config): (suite: string) => Promise<void> {\n return async (suiteName: string): Promise<void> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n throw new Error(`Suite \"${suiteName}\" not found`)\n }\n\n if (!suiteConfig.packages) {\n throw new Error(`Suite \"${suiteName}\" has no packages defined`)\n }\n\n // Compute fingerprint\n const fingerprintResult = await computeFingerprint({\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n })\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command: suiteConfig.command ?? config.settings.defaultCommand ?? '',\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath).catch(() => null)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n const providerName = keyProvider.displayName\n const keygenMessage =\n keyProvider.type === 'filesystem'\n ? 'Run \"attest-it keygen\" first to generate a keypair.'\n : 'Run \"attest-it keygen\" to generate and store a key.'\n throw new Error(`Private key not found in ${providerName}. ${keygenMessage}`)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n log(`✓ Attestation created for ${suiteName}`)\n }\n}\n\n/**\n * Create session saver function.\n *\n * @returns Function that saves or clears session state\n * @internal\n */\nfunction createSessionSaver(): (\n completed: string[],\n failed: string[],\n remaining: string[],\n) => Promise<void> {\n return async (completed: string[], failed: string[], remaining: string[]): Promise<void> => {\n if (completed.length === 0 && failed.length === 0 && remaining.length === 0) {\n // All done - clear session\n await clearSession()\n } else {\n // Save session for --continue\n await persistSession({\n started: new Date().toISOString(),\n selected: [...completed, ...failed, ...remaining],\n completed,\n failed,\n remaining,\n })\n }\n }\n}\n\n/**\n * Execute a shell command and return exit code.\n *\n * @param command - Shell command to execute\n * @returns Promise resolving to exit code\n * @internal\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n const parsed = parseShellCommand(command)\n const stringArgs = parsed.filter((t): t is string => typeof t === 'string')\n\n if (stringArgs.length === 0) {\n error('Empty command')\n resolve(1)\n return\n }\n\n const [executable, ...args] = stringArgs\n if (!executable) {\n resolve(1)\n return\n }\n\n const child = spawn(executable, args, { stdio: 'inherit' })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n child.on('error', (err) => {\n error(`Command failed: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check for uncommitted changes in the working tree.\n *\n * @returns Promise resolving to true if there are uncommitted changes\n * @internal\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n resolve(output.trim().length > 0)\n })\n child.on('error', () => {\n resolve(false)\n })\n })\n}\n","/**\n * Run command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprint,\n computeFingerprintSync,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n loadLocalConfigSync,\n getActiveIdentity,\n isAuthorizedSigner,\n createSeal,\n readSealsSync,\n writeSealsSync,\n type Config,\n type KeyProvider,\n type Identity,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { runInteractive } from './run-interactive.js'\nimport { getAllSuiteStatuses } from './run-utils.js'\n\nexport const runCommand = new Command('run')\n .description('Execute tests and create attestation')\n .option('-s, --suite <name>', 'Run specific suite (required unless --all or interactive mode)')\n .option('-a, --all', 'Run all suites needing attestation')\n .option('--no-attest', 'Run tests without creating attestation')\n .option('--dry-run', 'Show what would run without executing')\n .option('-c, --continue', 'Resume interrupted session')\n .option('--filter <pattern>', 'Filter suites by pattern (glob-style)')\n .action(async (options: RunOptions) => {\n await runTests(options)\n })\n\ninterface RunOptions {\n suite?: string\n all?: boolean\n attest?: boolean // Note: --no-attest sets this to false\n dryRun?: boolean\n continue?: boolean\n filter?: string\n}\n\n/**\n * Run tests and create attestations.\n *\n * Routes to the appropriate execution mode based on options:\n * - Direct mode: --suite specified\n * - All pending mode: --all specified\n * - Interactive mode: no --suite and no --all\n *\n * @param options - Command options\n * @param options.suite - Run specific suite\n * @param options.all - Run all suites needing attestation\n * @param options.attest - Create attestation after tests (default: true)\n * @param options.dryRun - Show what would run without executing\n * @param options.continue - Resume interrupted session\n * @param options.filter - Filter suites by pattern\n * @public\n */\nasync function runTests(options: RunOptions): Promise<void> {\n try {\n // If --suite provided, use existing direct mode\n if (options.suite) {\n await runDirectMode(options)\n return\n }\n\n // If --all with no --suite, run all pending non-interactively\n if (options.all) {\n await runAllPending(options)\n return\n }\n\n // No --suite and no --all means interactive mode\n // This includes: no args, --dry-run, --continue, --filter\n await runInteractive({\n dryRun: options.dryRun,\n continue: options.continue,\n filter: options.filter,\n })\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Build the test command to execute.\n *\n * Uses suite-specific command if provided, otherwise falls back to\n * default command from settings. Substitutes ${files} placeholder\n * with suite file patterns.\n *\n * @param config - Configuration object\n * @param suiteCommand - Suite-specific command (optional)\n * @param suiteFiles - File patterns for suite (optional)\n * @returns Constructed command string\n * @public\n */\nfunction buildCommand(config: Config, suiteCommand?: string, suiteFiles?: string[]): string {\n // Use suite command if specified, otherwise default\n let command = suiteCommand ?? config.settings.defaultCommand\n\n if (!command) {\n error('No command specified for suite and no defaultCommand in settings')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Substitute ${files} if present (replace all occurrences)\n if (command.includes('${files}') && suiteFiles) {\n const files = suiteFiles.join(' ')\n command = command.replaceAll('${files}', files)\n }\n\n return command\n}\n\n/**\n * Parsed command result.\n */\ninterface ParsedCommand {\n executable: string\n args: string[]\n}\n\n/**\n * Parse a command string into executable and arguments.\n *\n * Uses shell-quote to safely parse shell syntax without using shell: true.\n *\n * @param command - Command string to parse\n * @returns Parsed command with executable and arguments\n * @throws Error if command is empty or contains only control operators\n * @public\n */\nfunction parseCommand(command: string): ParsedCommand {\n const parsed = parseShellCommand(command)\n\n // shell-quote returns an array of strings and special control operators\n // We only want the string arguments\n const stringArgs = parsed.filter((token): token is string => {\n return typeof token === 'string'\n })\n\n if (stringArgs.length === 0) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n const [executable, ...args] = stringArgs\n // TypeScript doesn't know that stringArgs.length > 0 guarantees executable is defined\n // The check above ensures stringArgs[0] exists, but we assert it for type safety\n if (executable === undefined) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n return { executable, args }\n}\n\n/**\n * Execute a command and return its exit code.\n *\n * Spawns a child process and streams output to the terminal.\n *\n * @param command - Command string to execute\n * @returns Exit code from the command (0 for success)\n * @public\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n let parsed: ParsedCommand\n try {\n parsed = parseCommand(command)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to parse command: ${err.message}`)\n } else {\n error('Failed to parse command: Unknown error')\n }\n resolve(1)\n return\n }\n\n const child = spawn(parsed.executable, parsed.args, {\n stdio: 'inherit', // Stream output to terminal\n })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n\n child.on('error', (err) => {\n error(`Failed to execute command: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check if the git working tree has uncommitted changes.\n *\n * @returns True if there are uncommitted changes, false otherwise\n * @public\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n // If output is non-empty, there are uncommitted changes\n resolve(output.trim().length > 0)\n })\n\n child.on('error', () => {\n // If git not available, assume not dirty\n resolve(false)\n })\n })\n}\n\n/**\n * Run tests for a specific suite (direct mode with --suite).\n *\n * @param options - Run options with suite specified\n * @public\n */\nasync function runDirectMode(options: RunOptions): Promise<void> {\n if (!options.suite) {\n error('Suite name is required for direct mode')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load config\n const config = await loadConfig()\n\n // Validate suite exists\n if (!config.suites[options.suite]) {\n error(`Suite \"${options.suite}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run the suite\n await runSingleSuite(options.suite, config, options)\n\n log('')\n success('Suite completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run all suites that need attestation (--all mode).\n *\n * @param options - Run options\n * @public\n */\nasync function runAllPending(options: RunOptions): Promise<void> {\n const config = await loadConfig()\n const allSuites = await getAllSuiteStatuses(config)\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Apply filter if specified\n let suitesToRun = pendingSuites\n if (options.filter) {\n const regex = new RegExp('^' + options.filter.replace(/\\*/g, '.*') + '$', 'i')\n suitesToRun = pendingSuites.filter((s) => regex.test(s.name))\n\n if (suitesToRun.length === 0) {\n log(`No suites match filter: ${options.filter}`)\n process.exit(ExitCode.NO_WORK)\n }\n }\n\n // Dry run - just show and exit\n if (options.dryRun) {\n log(`Would run ${String(suitesToRun.length)} suite(s):`)\n suitesToRun.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n process.exit(ExitCode.SUCCESS)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run each suite using existing direct mode logic\n for (const suite of suitesToRun) {\n await runSingleSuite(suite.name, config, options)\n }\n\n log('')\n success('All suites completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run a single suite's tests and optionally create an attestation.\n *\n * @param suiteName - Name of the suite to run\n * @param config - Configuration object\n * @param options - Run options\n * @public\n */\nasync function runSingleSuite(\n suiteName: string,\n config: Config,\n options: RunOptions,\n): Promise<void> {\n // eslint-disable-next-line security/detect-object-injection -- suiteName is from validated config keys\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n if (!suiteConfig.packages) {\n error(`Suite \"${suiteName}\" has no packages defined`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log(`\\n=== Running suite: ${suiteName} ===\\n`)\n\n // Compute fingerprint before running\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const fingerprintResult = await computeFingerprint(fingerprintOptions)\n verbose(`Fingerprint: ${fingerprintResult.fingerprint}`)\n verbose(`Files: ${String(fingerprintResult.fileCount)}`)\n\n // Build the test command\n const command = buildCommand(config, suiteConfig.command, suiteConfig.files)\n log(`Running: ${command}`)\n log('')\n\n // Execute tests\n const exitCode = await executeCommand(command)\n\n if (exitCode !== 0) {\n error(`Tests failed with exit code ${String(exitCode)}`)\n process.exit(ExitCode.FAILURE)\n }\n\n success('Tests passed!')\n\n // Skip attestation if --no-attest\n if (options.attest === false) {\n log('Skipping attestation (--no-attest)')\n return\n }\n\n // Confirm attestation\n const shouldAttest = await confirmAction({\n message: 'Create attestation',\n default: false,\n })\n\n if (!shouldAttest) {\n warn('Attestation cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command,\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n error(`Private key not found in ${keyProvider.displayName}`)\n if (keyProvider.type === 'filesystem') {\n error('Run \"attest-it identity create\" first to generate a keypair.')\n } else {\n error('Run \"attest-it identity create\" to generate and store a key.')\n }\n process.exit(ExitCode.MISSING_KEY)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n success(`Attestation created for ${suiteName}`)\n log(` Fingerprint: ${fingerprintResult.fingerprint}`)\n log(` Attested by: ${attestation.attestedBy}`)\n log(` Attested at: ${attestation.attestedAt}`)\n\n // Check if this suite has a linked gate, and if so, prompt for seal\n if (suiteConfig.gate) {\n await promptForSeal(suiteName, suiteConfig.gate, config)\n }\n}\n\n/**\n * Prompt for seal creation after successful suite execution.\n *\n * @param suiteName - Name of the suite that was executed\n * @param gateId - ID of the gate linked to the suite\n * @param config - Configuration object\n */\nasync function promptForSeal(suiteName: string, gateId: string, config: Config): Promise<void> {\n log('')\n log(`Suite '${suiteName}' is linked to gate '${gateId}'`)\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n warn('No local identity configuration found - cannot create seal')\n warn('Run \"attest-it identity create\" to set up your identity')\n return\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n warn(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n return\n }\n\n // Convert to AttestItConfig\n const attestItConfig = toAttestItConfig(config)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(attestItConfig, gateId, identity.publicKey)\n if (!authorized) {\n warn(`You are not authorized to seal gate '${gateId}'`)\n return\n }\n\n // Prompt for seal confirmation\n const shouldSeal = await confirmAction({\n message: `Create seal for gate '${gateId}'`,\n default: true,\n })\n\n if (!shouldSeal) {\n log('Seal creation skipped')\n return\n }\n\n try {\n // Get gate config\n if (!attestItConfig.gates?.[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n return\n }\n\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n\n // Compute fingerprint for the gate\n const gateFingerprint = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n const keyRef = getKeyRefFromIdentity(identity)\n\n // Get private key from provider\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal using identity slug (not display name) for verification lookup\n const identitySlug = localConfig.activeIdentity\n const seal = createSeal({\n gateId,\n fingerprint: gateFingerprint.fingerprint,\n sealedBy: identitySlug,\n privateKey: privateKeyPem,\n })\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n // Write seals file\n writeSealsSync(projectRoot, sealsFile, attestItConfig.settings.sealsPath)\n\n success(`Seal created for gate '${gateId}'`)\n log(` Sealed by: ${identitySlug} (${identity.name})`)\n log(` Timestamp: ${seal.timestamp}`)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to create seal: ${err.message}`)\n } else {\n error('Failed to create seal: Unknown error')\n }\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n service: privateKey.service,\n account: privateKey.account,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n case 'yubikey':\n return KeyProviderRegistry.create({\n type: 'yubikey',\n options: {\n encryptedKeyPath: privateKey.encryptedKeyPath,\n slot: privateKey.slot,\n serial: privateKey.serial,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n return `${privateKey.service}:${privateKey.account}`\n case '1password':\n return privateKey.item\n case 'yubikey':\n return privateKey.encryptedKeyPath\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n// Export for testing\nexport { buildCommand, parseCommand, executeCommand, checkDirtyWorkingTree }\n","/**\n * Prune command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport {\n loadConfig,\n readAttestations,\n writeSignedAttestations,\n computeFingerprint,\n getDefaultPrivateKeyPath,\n type Attestation,\n} from '@attest-it/core'\nimport { log, success, error, info, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const pruneCommand = new Command('prune')\n .description('Remove stale attestations')\n .option('-n, --dry-run', 'Show what would be removed without removing')\n .option('-k, --keep-days <n>', 'Keep attestations newer than n days', '30')\n .action(async (options: PruneOptions) => {\n await runPrune(options)\n })\n\ninterface PruneOptions {\n dryRun?: boolean\n keepDays: string\n}\n\n/**\n * Run the prune command to remove stale attestations.\n *\n * Removes attestations that are outdated (older than keepDays and\n * fingerprint doesn't match current code) or orphaned (suite no\n * longer exists in config). Re-signs the attestations file.\n *\n * @param options - Command options\n * @param options.dryRun - Show what would be removed without removing\n * @param options.keepDays - Keep attestations newer than n days\n * @public\n */\nasync function runPrune(options: PruneOptions): Promise<void> {\n try {\n const keepDays = parseInt(options.keepDays, 10)\n if (isNaN(keepDays) || keepDays < 1) {\n error('--keep-days must be a positive integer')\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n\n // Load config\n const config = await loadConfig()\n\n // Load attestations\n const attestationsPath = config.settings.attestationsPath\n const file = await readAttestations(attestationsPath)\n\n if (!file || file.attestations.length === 0) {\n info('No attestations to prune')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n const now = Date.now()\n const keepMs = keepDays * 24 * 60 * 60 * 1000\n\n // Identify stale attestations\n const stale: Attestation[] = []\n const keep: Attestation[] = []\n\n for (const attestation of file.attestations) {\n const attestedAt = new Date(attestation.attestedAt).getTime()\n const ageMs = now - attestedAt\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n // Check if suite still exists in config\n const suiteExists = attestation.suite in config.suites\n\n // Check if fingerprint still matches current code\n let fingerprintMatches = false\n if (suiteExists) {\n const suiteConfig = config.suites[attestation.suite]\n if (suiteConfig?.packages) {\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const result = await computeFingerprint(fingerprintOptions)\n fingerprintMatches = result.fingerprint === attestation.fingerprint\n }\n }\n\n // Keep if:\n // 1. Age is within keepDays AND fingerprint matches, OR\n // 2. Fingerprint matches current code (regardless of age)\n const isStale = !fingerprintMatches && ageMs > keepMs\n const orphaned = !suiteExists\n\n if (isStale || orphaned) {\n stale.push(attestation)\n const reason = orphaned\n ? 'suite removed'\n : !fingerprintMatches\n ? 'fingerprint changed'\n : 'expired'\n verbose(`Stale: ${attestation.suite} (${reason}, ${String(ageDays)} days old)`)\n } else {\n keep.push(attestation)\n }\n }\n\n // Report what will be pruned\n if (stale.length === 0) {\n success('No stale attestations found')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n log(`Found ${String(stale.length)} stale attestation(s):`)\n for (const attestation of stale) {\n const ageDays = Math.floor(\n (now - new Date(attestation.attestedAt).getTime()) / (1000 * 60 * 60 * 24),\n )\n log(` - ${attestation.suite} (${String(ageDays)} days old)`)\n }\n\n if (options.dryRun) {\n info('Dry run - no changes made')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n // Check for private key\n const privateKeyPath = getDefaultPrivateKeyPath()\n if (!fs.existsSync(privateKeyPath)) {\n error(`Private key not found: ${privateKeyPath}`)\n error('Cannot re-sign attestations file.')\n process.exit(ExitCode.MISSING_KEY)\n return\n }\n\n // Write updated attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: keep,\n privateKeyPath,\n })\n\n success(`Pruned ${String(stale.length)} stale attestation(s)`)\n log(`Remaining: ${String(keep.length)} attestation(s)`)\n process.exit(ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n}\n\nexport { runPrune }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyAllSeals,\n verifyGateSeal,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n warn,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const verifyCommand = new Command('verify')\n .description('Verify all gate seals (for CI)')\n .argument('[gates...]', 'Verify specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: VerifyOptions) => {\n await runVerify(gates, options)\n })\n\ninterface VerifyOptions {\n json?: boolean\n}\n\n/**\n * Run the verify command to validate gate seals.\n *\n * Verifies signature validity and checks seal status for all gates\n * or specific gates. Intended for CI/CD pipelines.\n *\n * @param gates - Array of gate IDs to verify, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runVerify(gates: string[], options: VerifyOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Determine which gates to verify\n const gatesToVerify = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const results =\n gates.length > 0\n ? gatesToVerify.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayResults(results)\n }\n\n // Determine exit code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER',\n )\n\n const hasStale = results.some((r) => r.state === 'STALE')\n\n if (hasInvalid) {\n process.exit(ExitCode.FAILURE)\n } else if (hasStale) {\n // Stale seals are warnings but not failures\n process.exit(ExitCode.SUCCESS)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display verification results in a formatted table.\n *\n * Shows verification state, seal metadata, and remediation steps.\n *\n * @param results - Verification results from verifyAllSeals or verifyGateSeal\n * @public\n */\nfunction displayResults(results: SealVerificationResult[]): void {\n log('')\n\n // Build table rows\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: formatFingerprint(r),\n age: formatAge(r),\n }))\n\n log(formatTable(tableRows))\n log('')\n\n // Show messages for any gates with issues\n const withIssues = results.filter(\n (r) =>\n r.state !== 'VALID' &&\n r.state !== 'STALE' && // STALE gets its own warning below\n r.message,\n )\n\n if (withIssues.length > 0) {\n for (const result of withIssues) {\n if (result.message) {\n log(`${result.gateId}: ${result.message}`)\n }\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const staleCount = results.filter((r) => r.state === 'STALE').length\n const invalidCount = results.length - validCount - staleCount\n\n if (invalidCount === 0 && staleCount === 0) {\n success('All gate seals valid')\n } else {\n if (invalidCount > 0) {\n error(`${String(invalidCount)} gate(s) have invalid or missing seals`)\n log('Run `attest-it seal` to create seals for these gates')\n }\n if (staleCount > 0) {\n warn(`${String(staleCount)} gate(s) have stale seals (exceeds maxAge)`)\n log('Run `attest-it seal --force <gate>` to update stale seals')\n }\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format fingerprint for display.\n *\n * @param result - Verification result\n * @returns Formatted fingerprint string\n */\nfunction formatFingerprint(result: SealVerificationResult): string {\n if (result.seal?.fingerprint) {\n const fp = result.seal.fingerprint\n if (fp.length > 16) {\n return fp.slice(0, 16) + '...'\n }\n return fp\n }\n return result.state === 'MISSING' ? '(none)' : '-'\n}\n\n/**\n * Format age for display.\n *\n * @param result - Verification result\n * @returns Formatted age string\n */\nfunction formatAge(result: SealVerificationResult): string {\n if (result.seal?.timestamp) {\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n if (result.state === 'STALE') {\n return `${String(ageDays)} days (stale)`\n }\n return `${String(ageDays)} days`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runVerify, displayResults }\n","/**\n * Seal command implementation for attest-it CLI.\n * Creates cryptographic seals for gates.\n */\n\nimport { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n loadLocalConfigSync,\n getActiveIdentity,\n computeFingerprintSync,\n isAuthorizedSigner,\n getGate,\n createSeal,\n readSealsSync,\n writeSealsSync,\n KeyProviderRegistry,\n type AttestItConfig,\n type Identity,\n type SealsFile,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const sealCommand = new Command('seal')\n .description('Create seals for gates')\n .argument('[gates...]', 'Gate IDs to seal (defaults to all gates without valid seals)')\n .option('--force', 'Force seal creation even if gate already has a valid seal')\n .option('--dry-run', 'Show what would be sealed without creating seals')\n .action(async (gates: string[], options: SealOptions) => {\n await runSeal(gates, options)\n })\n\ninterface SealOptions {\n force?: boolean\n dryRun?: boolean\n}\n\ninterface SealSummary {\n sealed: string[]\n skipped: {\n gate: string\n reason: string\n }[]\n failed: {\n gate: string\n error: string\n }[]\n}\n\n/**\n * Run the seal command to create seals for gates.\n *\n * @param gates - Array of gate IDs to seal, or empty for all gates\n * @param options - Command options\n * @public\n */\nasync function runSeal(gates: string[], options: SealOptions): Promise<void> {\n try {\n // Load project config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n error('No local identity configuration found')\n error('Run \"attest-it identity create\" first to set up your identity')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n error(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Determine which gates to seal\n const gatesToSeal = gates.length > 0 ? gates : getAllGateIds(attestItConfig)\n\n // Validate that specified gates exist\n for (const gateId of gatesToSeal) {\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Process each gate\n const summary: SealSummary = {\n sealed: [],\n skipped: [],\n failed: [],\n }\n\n // Get the identity slug for sealedBy field\n const identitySlug = localConfig.activeIdentity\n\n for (const gateId of gatesToSeal) {\n try {\n const result = await processSingleGate(\n gateId,\n attestItConfig,\n identity,\n identitySlug,\n sealsFile,\n options,\n )\n\n if (result.sealed) {\n summary.sealed.push(gateId)\n } else if (result.skipped) {\n summary.skipped.push({ gate: gateId, reason: result.reason ?? 'Unknown' })\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error'\n summary.failed.push({ gate: gateId, error: errorMsg })\n }\n }\n\n // Write seals file if not dry run and we sealed anything\n if (!options.dryRun && summary.sealed.length > 0) {\n writeSealsSync(projectRoot, sealsFile, attestItConfig.settings.sealsPath)\n }\n\n // Display summary\n displaySummary(summary, options.dryRun)\n\n // Exit with appropriate code\n if (summary.failed.length > 0) {\n process.exit(ExitCode.FAILURE)\n } else if (summary.sealed.length === 0 && summary.skipped.length === 0) {\n process.exit(ExitCode.NO_WORK)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\ninterface ProcessGateResult {\n sealed: boolean\n skipped: boolean\n reason?: string\n}\n\n/**\n * Process a single gate for sealing.\n *\n * @param gateId - Gate identifier\n * @param config - The attest-it configuration\n * @param identity - Active identity for signing\n * @param identitySlug - The identity slug (used for sealedBy field)\n * @param sealsFile - The seals file to update\n * @param options - Command options\n * @returns Result indicating whether gate was sealed or skipped\n */\nasync function processSingleGate(\n gateId: string,\n config: AttestItConfig,\n identity: Identity,\n identitySlug: string,\n sealsFile: SealsFile,\n options: SealOptions,\n): Promise<ProcessGateResult> {\n verbose(`Processing gate: ${gateId}`)\n\n // Get gate config\n const gate = getGate(config, gateId)\n if (!gate) {\n return { sealed: false, skipped: true, reason: 'Gate not found in configuration' }\n }\n\n // Check if gate already has a valid seal and --force not specified\n // eslint-disable-next-line security/detect-object-injection\n const existingSeal = sealsFile.seals[gateId]\n if (existingSeal && !options.force) {\n return {\n sealed: false,\n skipped: true,\n reason: 'Gate already has a seal (use --force to override)',\n }\n }\n\n // Compute current fingerprint\n const fingerprintResult = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n verbose(` Fingerprint: ${fingerprintResult.fingerprint}`)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(config, gateId, identity.publicKey)\n if (!authorized) {\n return {\n sealed: false,\n skipped: true,\n reason: `Not authorized to seal this gate (authorized signers: ${gate.authorizedSigners.join(', ')})`,\n }\n }\n\n // If dry-run, stop here\n if (options.dryRun) {\n log(` Would seal gate: ${gateId}`)\n return { sealed: true, skipped: false }\n }\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n\n // Get private key from provider\n const keyRef = getKeyRefFromIdentity(identity)\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal using identity slug (not display name) for verification lookup\n const seal = createSeal({\n gateId,\n fingerprint: fingerprintResult.fingerprint,\n sealedBy: identitySlug,\n privateKey: privateKeyPem,\n })\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n log(` Sealed gate: ${gateId}`)\n verbose(` Sealed by: ${identitySlug} (${identity.name})`)\n verbose(` Timestamp: ${seal.timestamp}`)\n\n return { sealed: true, skipped: false }\n}\n\n/**\n * Get all gate IDs from configuration.\n *\n * @param config - The attest-it configuration\n * @returns Array of gate IDs\n */\nfunction getAllGateIds(config: AttestItConfig): string[] {\n return Object.keys(config.gates ?? {})\n}\n\n/**\n * Display summary of seal operations.\n *\n * @param summary - Summary of operations\n * @param dryRun - Whether this was a dry run\n */\nfunction displaySummary(summary: SealSummary, dryRun?: boolean): void {\n log('')\n\n const prefix = dryRun ? 'Would seal' : 'Sealed'\n\n if (summary.sealed.length > 0) {\n success(`${prefix} ${String(summary.sealed.length)} gate(s): ${summary.sealed.join(', ')}`)\n }\n\n if (summary.skipped.length > 0) {\n log('')\n warn(`Skipped ${String(summary.skipped.length)} gate(s):`)\n for (const skip of summary.skipped) {\n log(` ${skip.gate}: ${skip.reason}`)\n }\n }\n\n if (summary.failed.length > 0) {\n log('')\n error(`Failed to seal ${String(summary.failed.length)} gate(s):`)\n for (const fail of summary.failed) {\n log(` ${fail.gate}: ${fail.error}`)\n }\n }\n\n if (summary.sealed.length === 0 && summary.skipped.length === 0 && summary.failed.length === 0) {\n log('No gates to seal')\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n // MacOSKeychainKeyProvider uses 'itemName' which becomes the service name\n // The account is hardcoded to 'attest-it' in the provider\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n itemName: privateKey.service,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n case 'yubikey':\n return KeyProviderRegistry.create({\n type: 'yubikey',\n options: {\n encryptedKeyPath: privateKey.encryptedKeyPath,\n slot: privateKey.slot,\n serial: privateKey.serial,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n // The provider uses the service name as the keyRef\n // Account is hardcoded to 'attest-it' in MacOSKeychainKeyProvider\n return privateKey.service\n case '1password':\n return privateKey.item\n case 'yubikey':\n return privateKey.encryptedKeyPath\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List all local identities')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all configured identities.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const identities = Object.entries(config.identities)\n\n log('')\n log(theme.blue.bold()('Local Identities:'))\n log('')\n\n for (const [slug, identity] of identities) {\n const isActive = slug === config.activeIdentity\n const marker = isActive ? theme.green('★') : ' '\n const nameDisplay = isActive ? theme.green.bold()(identity.name) : identity.name\n\n // Truncate public key for display\n const keyPreview = identity.publicKey.slice(0, 12) + '...'\n\n // Determine key storage type\n let keyType: string\n switch (identity.privateKey.type) {\n case 'file':\n keyType = 'file'\n break\n case 'keychain':\n keyType = 'keychain'\n break\n case '1password':\n keyType = '1password'\n break\n case 'yubikey':\n keyType = 'yubikey'\n break\n }\n\n log(`${marker} ${theme.blue(slug)}`)\n log(` Name: ${nameDisplay}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n log(` Key Type: ${keyType}`)\n log('')\n }\n\n if (identities.length === 1) {\n log(`1 identity configured`)\n } else {\n log(`${identities.length.toString()} identities configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","/**\n * Validation utilities for identity commands.\n */\n\n/**\n * Validate an identity slug.\n *\n * @param value - The slug value to validate\n * @param existingIdentities - Optional record of existing identity slugs\n * @returns true if valid, or an error message string if invalid\n */\nexport function validateSlug(\n value: string,\n existingIdentities?: Record<string, unknown>,\n): true | string {\n const trimmed = value.trim()\n\n if (!trimmed) {\n return 'Slug cannot be empty'\n }\n\n if (!/^[a-z0-9-]+$/.test(trimmed)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n\n if (existingIdentities?.[trimmed]) {\n return `Identity \"${trimmed}\" already exists`\n }\n\n return true\n}\n\n/**\n * Email validation regex pattern.\n * Validates basic email format: local@domain.tld\n */\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\n/**\n * Validate an email address.\n *\n * @param value - The email value to validate\n * @param required - Whether the email is required (default: false)\n * @returns true if valid, or an error message string if invalid\n */\nexport function validateEmail(value: string, required = false): true | string {\n const trimmed = value.trim()\n\n // If not required and empty, that's fine\n if (!trimmed) {\n return required ? 'Email cannot be empty' : true\n }\n\n if (!EMAIL_REGEX.test(trimmed)) {\n return 'Please enter a valid email address'\n }\n\n return true\n}\n","import { Command } from 'commander'\nimport { input, select } from '@inquirer/prompts'\nimport {\n generateEd25519KeyPair,\n loadLocalConfig,\n saveLocalConfig,\n getAttestItConfigDir,\n OnePasswordKeyProvider,\n MacOSKeychainKeyProvider,\n YubiKeyProvider,\n savePublicKey,\n} from '@attest-it/core'\nimport type { Identity, LocalConfig, PrivateKeyRef } from '@attest-it/core'\nimport { log, success, error, info, getTheme } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { validateSlug, validateEmail } from './validation.js'\nimport { offerCompletionInstall } from '../../utils/completion-offer.js'\nimport { join } from 'node:path'\nimport { writeFile, mkdir } from 'node:fs/promises'\n\nexport const createCommand = new Command('create')\n .description('Create a new identity with Ed25519 keypair')\n .action(async () => {\n await runCreate()\n })\n\n/**\n * Run the create command to interactively create a new identity.\n */\nasync function runCreate(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Create New Identity'))\n log('')\n\n // Load existing config if it exists\n const existingConfig = await loadLocalConfig()\n\n // Prompt for identity details\n const slug = (\n await input({\n message: 'Identity slug (unique identifier):',\n validate: (value) => validateSlug(value, existingConfig?.identities),\n })\n ).trim()\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = (\n await input({\n message: 'Email (optional):',\n default: '',\n validate: validateEmail,\n })\n ).trim()\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n // Check provider availability\n info('Checking available key storage providers...')\n const opAvailable = await OnePasswordKeyProvider.isInstalled()\n const keychainAvailable = MacOSKeychainKeyProvider.isAvailable()\n const yubikeyInstalled = await YubiKeyProvider.isInstalled()\n const yubikeyConnected = yubikeyInstalled ? await YubiKeyProvider.isConnected() : false\n\n // Build choices based on availability\n const configDir = getAttestItConfigDir()\n const storageChoices: { name: string; value: string }[] = [\n { name: `File system (${join(configDir, 'keys')})`, value: 'file' },\n ]\n\n if (keychainAvailable) {\n storageChoices.push({ name: 'macOS Keychain', value: 'keychain' })\n }\n\n if (opAvailable) {\n storageChoices.push({ name: '1Password', value: '1password' })\n }\n\n if (yubikeyInstalled) {\n const yubikeyLabel = yubikeyConnected\n ? 'YubiKey (encrypted with challenge-response)'\n : 'YubiKey (not connected - insert YubiKey first)'\n storageChoices.push({ name: yubikeyLabel, value: 'yubikey' })\n }\n\n // Prompt for key storage type\n const keyStorageType = await select({\n message: 'Where should the private key be stored?',\n choices: storageChoices,\n })\n\n log('')\n log('Generating Ed25519 keypair...')\n\n // Generate keypair (this is synchronous, returns KeyPair not Promise)\n const keyPair = generateEd25519KeyPair()\n\n // Build private key reference based on storage type\n let privateKeyRef: PrivateKeyRef\n let keyStorageDescription: string\n\n switch (keyStorageType) {\n case 'file': {\n // Save to filesystem (respects --home-dir override)\n const keysDir = join(getAttestItConfigDir(), 'keys')\n await mkdir(keysDir, { recursive: true })\n const keyPath = join(keysDir, `${slug}.pem`)\n await writeFile(keyPath, keyPair.privateKey, { mode: 0o600 })\n\n privateKeyRef = { type: 'file', path: keyPath }\n keyStorageDescription = keyPath\n break\n }\n case 'keychain': {\n // Check if available (using static method)\n if (!MacOSKeychainKeyProvider.isAvailable()) {\n error('macOS Keychain is not available on this system')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // List available keychains\n const keychains = await MacOSKeychainKeyProvider.listKeychains()\n\n if (keychains.length === 0) {\n throw new Error('No keychains found on this system')\n }\n\n // Format keychain display with bold name and dim path\n const formatKeychainChoice = (kc: { name: string; path: string }): string => {\n return `${theme.blue.bold()(kc.name)} ${theme.muted(`(${kc.path})`)}`\n }\n\n // Select keychain (auto-select if only one, typically \"login\")\n let selectedKeychain: { name: string; path: string }\n if (keychains.length === 1 && keychains[0]) {\n selectedKeychain = keychains[0]\n info(`Using keychain: ${formatKeychainChoice(selectedKeychain)}`)\n } else {\n const selectedPath = await select({\n message: 'Select keychain:',\n choices: keychains.map((kc) => ({\n name: formatKeychainChoice(kc),\n value: kc.path,\n })),\n })\n const foundKeychain = keychains.find((kc) => kc.path === selectedPath)\n if (!foundKeychain) {\n throw new Error('Selected keychain not found')\n }\n selectedKeychain = foundKeychain\n }\n\n // Prompt for item name\n const keychainItemName = await input({\n message: 'Keychain item name:',\n default: `attest-it-${slug}`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Item name cannot be empty'\n }\n return true\n },\n })\n\n // Store the private key in keychain using security command\n // Keys are stored as base64-encoded PEM strings\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n // Encode the private key as base64 for storage\n const encodedKey = Buffer.from(keyPair.privateKey).toString('base64')\n\n try {\n const addArgs = [\n 'add-generic-password',\n '-a',\n 'attest-it',\n '-s',\n keychainItemName,\n '-w',\n encodedKey,\n '-U',\n selectedKeychain.path,\n ]\n await execFileAsync('security', addArgs)\n } catch (err) {\n throw new Error(\n `Failed to store key in macOS Keychain: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n // In the keychain, -s is the service name (item) and -a is the account (\"attest-it\")\n privateKeyRef = {\n type: 'keychain',\n service: keychainItemName,\n account: 'attest-it',\n keychain: selectedKeychain.path,\n }\n keyStorageDescription = `macOS Keychain: ${selectedKeychain.name}/${keychainItemName}`\n break\n }\n case '1password': {\n // List available 1Password accounts\n const accounts = await OnePasswordKeyProvider.listAccounts()\n\n if (accounts.length === 0) {\n throw new Error(\n '1Password CLI is installed but no accounts are signed in. Run \"op signin\" first.',\n )\n }\n\n // Fetch detailed account info (including friendly name) for each account\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n interface AccountDetails {\n url: string\n email: string\n name: string // Friendly name from `op account get`\n }\n\n const accountDetails: AccountDetails[] = await Promise.all(\n accounts.map(async (acc) => {\n try {\n // Use user_uuid for unique lookup (URL can be shared by multiple accounts)\n const { stdout } = await execFileAsync('op', [\n 'account',\n 'get',\n '--account',\n acc.user_uuid,\n '--format=json',\n ])\n const details: unknown = JSON.parse(stdout)\n // Extract name if it exists and is a string\n const name =\n details !== null &&\n typeof details === 'object' &&\n 'name' in details &&\n typeof details.name === 'string'\n ? details.name\n : acc.url\n return {\n url: acc.url,\n email: acc.email,\n name,\n }\n } catch {\n // Fallback to URL if we can't get account details\n return {\n url: acc.url,\n email: acc.email,\n name: acc.url,\n }\n }\n }),\n )\n\n // Format account display with bold name and dim domain (matching `op signin` style)\n const formatAccountChoice = (acc: AccountDetails): string => {\n return `${theme.blue.bold()(acc.name)} ${theme.muted(`(${acc.url})`)}`\n }\n\n // Select account (auto-select if only one)\n // Use URL as the account identifier (required by `op` CLI)\n let selectedAccount: string | undefined\n if (accountDetails.length === 1 && accountDetails[0]) {\n selectedAccount = accountDetails[0].url\n info(`Using 1Password account: ${formatAccountChoice(accountDetails[0])}`)\n } else {\n selectedAccount = await select({\n message: 'Select 1Password account:',\n choices: accountDetails.map((acc) => ({\n name: formatAccountChoice(acc),\n value: acc.url,\n })),\n })\n }\n\n // List vaults for selected account\n const vaults = await OnePasswordKeyProvider.listVaults(selectedAccount)\n\n if (vaults.length === 0) {\n throw new Error(`No vaults found in 1Password account: ${selectedAccount}`)\n }\n\n // Select vault\n const selectedVault = await select({\n message: 'Select vault for private key storage:',\n choices: vaults.map((v) => ({\n name: v.name,\n value: v.name,\n })),\n })\n\n // Prompt for item name\n const item = await input({\n message: '1Password item name:',\n default: `attest-it-${slug}`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Item name cannot be empty'\n }\n return true\n },\n })\n\n // Write the private key to a temp file, then upload to 1Password\n const { tmpdir } = await import('node:os')\n const tempDir = join(tmpdir(), `attest-it-${String(Date.now())}`)\n await mkdir(tempDir, { recursive: true })\n const tempPrivatePath = join(tempDir, 'private.pem')\n\n try {\n // Write private key to temp file for upload\n await writeFile(tempPrivatePath, keyPair.privateKey, { mode: 0o600 })\n\n // Upload to 1Password using op document create\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n const opArgs = [\n 'document',\n 'create',\n tempPrivatePath,\n '--title',\n item,\n '--vault',\n selectedVault,\n ]\n if (selectedAccount) {\n opArgs.push('--account', selectedAccount)\n }\n\n await execFileAsync('op', opArgs)\n } finally {\n // Clean up temp files\n const { rm } = await import('node:fs/promises')\n await rm(tempDir, { recursive: true, force: true }).catch(() => {\n // Ignore cleanup errors\n })\n }\n\n privateKeyRef = {\n type: '1password',\n vault: selectedVault,\n item,\n ...(selectedAccount && { account: selectedAccount }),\n }\n keyStorageDescription = `1Password (${selectedVault}/${item})`\n break\n }\n case 'yubikey': {\n // Check if YubiKey is connected\n if (!(await YubiKeyProvider.isConnected())) {\n error('No YubiKey detected. Please insert your YubiKey and try again.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // List connected YubiKeys\n const yubikeys = await YubiKeyProvider.listDevices()\n\n if (yubikeys.length === 0) {\n throw new Error('No YubiKeys detected. Please insert a YubiKey and try again.')\n }\n\n // Format YubiKey display\n const formatYubiKeyChoice = (yk: {\n serial: string\n type: string\n firmware: string\n }): string => {\n return `${theme.blue.bold()(yk.type)} ${theme.muted(`(Serial: ${yk.serial}, FW: ${yk.firmware})`)}`\n }\n\n // Select YubiKey (auto-select if only one)\n let selectedSerial: string | undefined\n if (yubikeys.length === 1 && yubikeys[0]) {\n selectedSerial = yubikeys[0].serial\n info(`Using YubiKey: ${formatYubiKeyChoice(yubikeys[0])}`)\n } else {\n selectedSerial = await select({\n message: 'Select YubiKey:',\n choices: yubikeys.map((yk) => ({\n name: formatYubiKeyChoice(yk),\n value: yk.serial,\n })),\n })\n }\n\n // Check if challenge-response is configured on slot 2\n const slot: 1 | 2 = 2 // Default to slot 2 for challenge-response\n const isChallengeResponseConfigured = await YubiKeyProvider.isChallengeResponseConfigured(\n slot,\n selectedSerial,\n )\n\n if (!isChallengeResponseConfigured) {\n log('')\n error(`YubiKey slot ${String(slot)} is not configured for HMAC challenge-response.`)\n log('')\n log('To configure it, run:')\n log(theme.blue(` ykman otp chalresp --generate ${String(slot)}`))\n log('')\n log('This will configure slot 2 with a randomly generated secret.')\n log(theme.muted('Note: Make sure to back up the secret if needed for recovery.'))\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Prompt for encrypted key file name\n const encryptedKeyName = await input({\n message: 'Encrypted key file name:',\n default: `${slug}.enc`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'File name cannot be empty'\n }\n return true\n },\n })\n\n // Determine encrypted key path\n const keysDir = join(getAttestItConfigDir(), 'keys')\n await mkdir(keysDir, { recursive: true })\n const encryptedKeyPath = join(keysDir, encryptedKeyName)\n\n // Encrypt the private key with YubiKey challenge-response\n const result = await YubiKeyProvider.encryptPrivateKey({\n privateKey: keyPair.privateKey,\n encryptedKeyPath,\n slot,\n serial: selectedSerial,\n })\n\n privateKeyRef = {\n type: 'yubikey',\n encryptedKeyPath: result.encryptedKeyPath,\n slot,\n serial: selectedSerial,\n }\n keyStorageDescription = result.storageDescription\n break\n }\n default:\n throw new Error(`Unknown key storage type: ${keyStorageType}`)\n }\n\n // Build identity object\n const identity: Identity = {\n name,\n publicKey: keyPair.publicKey,\n privateKey: privateKeyRef,\n ...(email && { email }),\n ...(github && { github }),\n }\n\n // Create or update config\n let newConfig: LocalConfig\n if (existingConfig) {\n // Add to existing config\n newConfig = {\n ...existingConfig,\n identities: {\n ...existingConfig.identities,\n [slug]: identity,\n },\n }\n } else {\n // Create new config with this identity as active\n newConfig = {\n activeIdentity: slug,\n identities: {\n [slug]: identity,\n },\n }\n }\n\n // Save config\n await saveLocalConfig(newConfig)\n\n // Save public key to home and project directories\n const publicKeyResult = await savePublicKey(slug, keyPair.publicKey)\n\n log('')\n success('Identity created successfully')\n log('')\n log(` Slug: ${slug}`)\n log(` Name: ${name}`)\n if (email) {\n log(` Email: ${email}`)\n }\n if (github) {\n log(` GitHub: ${github}`)\n }\n log(` Public Key: ${keyPair.publicKey.slice(0, 32)}...`)\n log(` Private Key: ${keyStorageDescription}`)\n log('')\n log(theme.blue.bold()('Public key saved to:'))\n log(` ${publicKeyResult.homePath}`)\n log('')\n log('To add yourself to a project, run:')\n log(theme.blue(' attest-it team join'))\n log('')\n\n if (!existingConfig) {\n success(`Set as active identity`)\n log('')\n } else {\n log(`To use this identity, run: attest-it identity use ${slug}`)\n log('')\n }\n\n // Offer to install shell completions\n await offerCompletionInstall()\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\n\nexport const useCommand = new Command('use')\n .description('Set the active identity')\n .argument('<slug>', 'Identity slug to activate')\n .action(async (slug: string) => {\n await runUse(slug)\n })\n\n/**\n * Run the use command to set the active identity.\n */\nasync function runUse(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if identity exists\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Update active identity\n const newConfig = {\n ...config,\n activeIdentity: slug,\n }\n\n await saveLocalConfig(newConfig)\n\n success(`Active identity set to: ${identity.name} (${slug})`)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const showCommand = new Command('show')\n .description('Show identity details')\n .argument('[slug]', 'Identity slug (defaults to active identity)')\n .action(async (slug?: string) => {\n await runShow(slug)\n })\n\n/**\n * Run the show command to display identity details.\n */\nasync function runShow(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to show\n let targetSlug: string\n let isActive: boolean\n\n if (slug) {\n targetSlug = slug\n isActive = slug === config.activeIdentity\n } else {\n targetSlug = config.activeIdentity\n isActive = true\n }\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Identity Details:'))\n log('')\n log(` Slug: ${theme.blue(targetSlug)}${isActive ? theme.green(' (active)') : ''}`)\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log('')\n log(` Public Key: ${identity.publicKey}`)\n log('')\n\n // Show private key reference details\n log(' Private Key Storage:')\n switch (identity.privateKey.type) {\n case 'file':\n log(` Type: File`)\n log(` Path: ${identity.privateKey.path}`)\n break\n case 'keychain':\n log(` Type: macOS Keychain`)\n log(` Service: ${identity.privateKey.service}`)\n log(` Account: ${identity.privateKey.account}`)\n break\n case '1password':\n log(` Type: 1Password`)\n if (identity.privateKey.account) {\n log(` Account: ${identity.privateKey.account}`)\n }\n log(` Vault: ${identity.privateKey.vault}`)\n log(` Item: ${identity.privateKey.item}`)\n if (identity.privateKey.field) {\n log(` Field: ${identity.privateKey.field}`)\n }\n break\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","/**\n * Shared utility for formatting key storage locations.\n */\nimport type { PrivateKeyRef } from '@attest-it/core'\nimport { getTheme } from './output.js'\n\n/**\n * Format the private key storage location for display.\n */\nexport function formatKeyLocation(privateKey: PrivateKeyRef): string {\n const theme = getTheme()\n\n switch (privateKey.type) {\n case 'file':\n return `${theme.blue.bold()('File')}: ${theme.muted(privateKey.path)}`\n case 'keychain': {\n let keychainName = 'default'\n if (privateKey.keychain) {\n const filename = privateKey.keychain.split('/').pop() ?? privateKey.keychain\n keychainName = filename.replace(/\\.keychain(-db)?$/, '')\n }\n return `${theme.blue.bold()('macOS Keychain')}: ${theme.muted(`${keychainName}/${privateKey.service}`)}`\n }\n case '1password': {\n const parts = [privateKey.vault, privateKey.item]\n if (privateKey.account) {\n parts.unshift(privateKey.account)\n }\n return `${theme.blue.bold()('1Password')}: ${theme.muted(parts.join('/'))}`\n }\n case 'yubikey': {\n const slotInfo = privateKey.slot ? ` (slot ${String(privateKey.slot)})` : ''\n const serialInfo = privateKey.serial ? ` [${privateKey.serial}]` : ''\n return `${theme.blue.bold()('YubiKey')}${serialInfo}${slotInfo}: ${theme.muted(privateKey.encryptedKeyPath)}`\n }\n default:\n return 'Unknown storage'\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { log, success, error, getTheme } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { formatKeyLocation } from '../../utils/format-key-location.js'\nimport { unlink } from 'node:fs/promises'\n\nexport const removeCommand = new Command('remove')\n .description('Delete identity and optionally delete private key')\n .argument('<slug>', 'Identity slug to remove')\n .action(async (slug: string) => {\n await runRemove(slug)\n })\n\n/**\n * Run the remove command to delete an identity.\n */\nasync function runRemove(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()(`Remove Identity: ${slug}`))\n log('')\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n log('')\n\n // Confirm deletion\n const confirmDelete = await confirm({\n message: 'Are you sure you want to delete this identity?',\n default: false,\n })\n\n if (!confirmDelete) {\n log('Cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Ask about deleting private key, showing where it's stored\n const keyLocation = formatKeyLocation(identity.privateKey)\n log(` Private key: ${keyLocation}`)\n log('')\n\n const deletePrivateKey = await confirm({\n message: 'Also delete the private key from storage?',\n default: false,\n })\n\n // Delete private key if requested\n if (deletePrivateKey) {\n switch (identity.privateKey.type) {\n case 'file': {\n try {\n await unlink(identity.privateKey.path)\n log(` Deleted private key file: ${identity.privateKey.path}`)\n } catch (err) {\n // Ignore file not found errors\n if (err && typeof err === 'object' && 'code' in err && err.code !== 'ENOENT') {\n throw err\n }\n }\n break\n }\n case 'keychain': {\n // Delete from macOS Keychain\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n const deleteArgs = [\n 'delete-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n ]\n if (identity.privateKey.keychain) {\n deleteArgs.push(identity.privateKey.keychain)\n }\n await execFileAsync('security', deleteArgs)\n log(` Deleted private key from macOS Keychain`)\n } catch (err) {\n // Ignore if key doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('could not be found') &&\n !err.message.includes('does not exist')\n ) {\n throw err\n }\n }\n break\n }\n case '1password': {\n // Delete from 1Password\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n const opArgs = [\n 'item',\n 'delete',\n identity.privateKey.item,\n '--vault',\n identity.privateKey.vault,\n ]\n\n if (identity.privateKey.account) {\n opArgs.push('--account', identity.privateKey.account)\n }\n\n await execFileAsync('op', opArgs)\n log(` Deleted private key from 1Password`)\n } catch (err) {\n // Ignore if item doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('not found') &&\n !err.message.includes(\"doesn't exist\")\n ) {\n throw err\n }\n }\n break\n }\n }\n }\n\n // Remove from config\n const { [slug]: _removed, ...remainingIdentities } = config.identities\n\n // Check if this was the last identity\n if (Object.keys(remainingIdentities).length === 0) {\n error('Cannot remove last identity')\n log('')\n log('At least one identity must exist')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if this was the active identity\n let newActiveIdentity = config.activeIdentity\n if (slug === config.activeIdentity) {\n // Set first remaining identity as active\n const firstKey = Object.keys(remainingIdentities)[0]\n if (!firstKey) {\n throw new Error('No remaining identities after removal')\n }\n newActiveIdentity = firstKey\n log('')\n log(theme.yellow(` Removed active identity. New active identity: ${newActiveIdentity}`))\n }\n\n const newConfig = {\n activeIdentity: newActiveIdentity,\n identities: remainingIdentities,\n }\n\n await saveLocalConfig(newConfig)\n\n log('')\n success(`Identity \"${slug}\" removed`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const exportCommand = new Command('export')\n .description('Export identity for team onboarding (YAML snippet)')\n .argument('[slug]', 'Identity slug to export (defaults to active identity)')\n .action(async (slug?: string) => {\n await runExport(slug)\n })\n\n/**\n * Run the export command to output a YAML snippet for team config.\n */\nasync function runExport(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to export\n const targetSlug = slug ?? config.activeIdentity\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Team Configuration YAML:'))\n log('')\n log(theme.muted('# Add this to your team config file (.attest-it/team-config.yaml)'))\n log('')\n\n // Build export object (only include fields that are present)\n const exportData: Record<string, unknown> = {\n name: identity.name,\n publicKey: identity.publicKey,\n }\n\n if (identity.email) {\n exportData.email = identity.email\n }\n\n if (identity.github) {\n exportData.github = identity.github\n }\n\n // Create YAML with slug as key\n const yamlData = {\n [targetSlug]: exportData,\n }\n\n const yamlString = stringifyYaml(yamlData)\n\n log(yamlString)\n log('')\n log(theme.muted('# The team owner can add this to the \"members:\" section'))\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { createCommand } from './create.js'\nimport { useCommand } from './use.js'\nimport { showCommand } from './show.js'\nimport { removeCommand } from './remove.js'\nimport { exportCommand } from './export.js'\n\nexport const identityCommand = new Command('identity')\n .description('Manage local identities and keypairs')\n .addCommand(listCommand)\n .addCommand(createCommand)\n .addCommand(useCommand)\n .addCommand(showCommand)\n .addCommand(removeCommand)\n .addCommand(exportCommand)\n","import { Command } from 'commander'\nimport { loadLocalConfig, getActiveIdentity } from '@attest-it/core'\nimport { log, error, getTheme } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { formatKeyLocation } from '../utils/format-key-location.js'\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show the current active identity')\n .action(async () => {\n await runWhoami()\n })\n\n/**\n * Run the whoami command to display the current active identity.\n */\nasync function runWhoami(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = getActiveIdentity(config)\n\n if (!identity) {\n error('Active identity not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Active Identity'))\n log('')\n log(` Slug: ${theme.green.bold()(config.activeIdentity)}`)\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${theme.muted(identity.email)}`)\n }\n if (identity.github) {\n log(` GitHub: ${theme.muted('@' + identity.github)}`)\n }\n log(` Public Key: ${theme.muted(identity.publicKey.slice(0, 24) + '...')}`)\n log(` Key Store: ${formatKeyLocation(identity.privateKey)}`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadConfig, toAttestItConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List team members and their authorizations')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all team members.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n if (!attestItConfig.team || Object.keys(attestItConfig.team).length === 0) {\n error('No team members configured')\n log('')\n log('Run: attest-it team add')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const teamMembers = Object.entries(attestItConfig.team)\n\n log('')\n log(theme.blue.bold()('Team Members:'))\n log('')\n\n for (const [slug, member] of teamMembers) {\n // Truncate public key for display\n const keyPreview = member.publicKey.slice(0, 12) + '...'\n\n log(theme.blue(slug))\n log(` Name: ${member.name}`)\n if (member.email) {\n log(` Email: ${member.email}`)\n }\n if (member.github) {\n log(` GitHub: ${member.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n\n // Show gate authorizations\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log(` Gates: ${authorizedGates.join(', ')}`)\n } else {\n log(` Gates: ${theme.muted('(none)')}`)\n }\n\n log('')\n }\n\n if (teamMembers.length === 1) {\n log(`1 team member configured`)\n } else {\n log(`${teamMembers.length.toString()} team members configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { checkbox } from '@inquirer/prompts'\nimport type { Config, GateConfig } from '@attest-it/core'\n\n/**\n * Prompt the user to select which gates they want to authorize for a team member.\n *\n * @param gates - The gates configuration from the config file\n * @returns Array of gate IDs that were selected\n * @public\n */\nexport async function promptForGateAuthorization(\n gates: Record<string, GateConfig> | undefined,\n): Promise<string[]> {\n // If no gates exist, return empty array\n if (!gates || Object.keys(gates).length === 0) {\n return []\n }\n\n const gateChoices = Object.entries(gates).map(([gateId, gate]: [string, GateConfig]) => ({\n name: `${gateId} - ${gate.name}`,\n value: gateId,\n }))\n\n const authorizedGates = await checkbox({\n message: 'Select gates to authorize (use space to select):',\n choices: gateChoices,\n })\n\n return authorizedGates\n}\n\n/**\n * Add a team member to the config and update gate authorizations.\n *\n * @param config - The existing config\n * @param memberSlug - The slug/identifier for the team member\n * @param memberData - The team member data to add\n * @param authorizedGates - Array of gate IDs to authorize the member for\n * @returns Updated config with the team member added and gates updated\n * @public\n */\nexport function addTeamMemberToConfig(\n config: Config,\n memberSlug: string,\n memberData: {\n name: string\n email?: string\n github?: string\n publicKey: string\n publicKeyAlgorithm?: 'ed25519'\n },\n authorizedGates: string[],\n): Config {\n const existingTeam = config.team ?? {}\n\n // Build the updated config with the new team member\n const updatedConfig: Config = {\n ...config,\n team: {\n ...existingTeam,\n [memberSlug]: {\n name: memberData.name,\n publicKey: memberData.publicKey,\n publicKeyAlgorithm: memberData.publicKeyAlgorithm ?? 'ed25519',\n ...(memberData.email ? { email: memberData.email } : {}),\n ...(memberData.github ? { github: memberData.github } : {}),\n },\n },\n }\n\n // Update gate authorizations\n if (authorizedGates.length > 0 && updatedConfig.gates) {\n for (const gateId of authorizedGates) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = updatedConfig.gates[gateId]\n if (gate) {\n // Add to authorizedSigners if not already present\n if (!gate.authorizedSigners.includes(memberSlug)) {\n gate.authorizedSigners.push(memberSlug)\n }\n }\n }\n }\n\n return updatedConfig\n}\n","import { Command } from 'commander'\nimport { input } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\nimport { promptForGateAuthorization, addTeamMemberToConfig } from './utils.js'\n\nexport const addCommand = new Command('add')\n .description('Add a new team member')\n .action(async () => {\n await runAdd()\n })\n\n/**\n * Validate Base64 encoded Ed25519 public key.\n * Ed25519 public keys are 32 bytes, which is 44 characters in Base64.\n */\nfunction validatePublicKey(value: string): boolean | string {\n if (!value || value.trim().length === 0) {\n return 'Public key cannot be empty'\n }\n\n // Check if it's valid Base64\n const base64Regex = /^[A-Za-z0-9+/]+=*$/\n if (!base64Regex.test(value)) {\n return 'Public key must be valid Base64'\n }\n\n // Check length - Ed25519 public keys are 32 bytes = 44 chars in base64 (with padding)\n if (value.length !== 44) {\n return 'Public key must be 44 characters (32 bytes in Base64)'\n }\n\n // Try to decode to verify it's valid Base64\n try {\n const decoded = Buffer.from(value, 'base64')\n if (decoded.length !== 32) {\n return 'Public key must decode to 32 bytes'\n }\n } catch {\n return 'Invalid Base64 encoding'\n }\n\n return true\n}\n\n/**\n * Run the add command to interactively add a team member.\n */\nasync function runAdd(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Add Team Member'))\n log('')\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n const existingTeam = attestItConfig.team ?? {}\n\n // Prompt for member details\n const slug = await input({\n message: 'Member slug (unique identifier):',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Slug cannot be empty'\n }\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n // eslint-disable-next-line security/detect-object-injection\n if (existingTeam[value]) {\n return `Team member \"${value}\" already exists`\n }\n return true\n },\n })\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n log('')\n log('Paste the public key (from \"attest-it identity export\"):')\n const publicKey = await input({\n message: 'Public key:',\n validate: validatePublicKey,\n })\n\n // Prompt for gate authorizations\n log('')\n const authorizedGates = await promptForGateAuthorization(attestItConfig.gates)\n\n // Update config with new team member\n const memberData: Parameters<typeof addTeamMemberToConfig>[2] = {\n name,\n publicKey: publicKey.trim(),\n publicKeyAlgorithm: 'ed25519',\n }\n const trimmedEmail = email.trim()\n const trimmedGithub = github.trim()\n if (trimmedEmail && trimmedEmail.length > 0) {\n memberData.email = trimmedEmail\n }\n if (trimmedGithub && trimmedGithub.length > 0) {\n memberData.github = trimmedGithub\n }\n const updatedConfig = addTeamMemberToConfig(config, slug, memberData, authorizedGates)\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" added successfully`)\n\n if (authorizedGates.length > 0) {\n log(`Authorized for gates: ${authorizedGates.join(', ')}`)\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input } from '@inquirer/prompts'\nimport {\n loadConfig,\n toAttestItConfig,\n findConfigPath,\n loadLocalConfig,\n getActiveIdentity,\n} from '@attest-it/core'\nimport { log, success, error, info } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\nimport { promptForGateAuthorization, addTeamMemberToConfig } from './utils.js'\n\nexport const joinCommand = new Command('join')\n .description('Add yourself to the project team using your active identity')\n .action(async () => {\n await runJoin()\n })\n\n/**\n * Run the join command to add the user's active identity to the project team.\n * @public\n */\nexport async function runJoin(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Join Project Team'))\n log('')\n\n // Load user's local config and active identity\n const localConfig = await loadLocalConfig()\n if (!localConfig) {\n error('No identity found. Run \"attest-it identity create\" first.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const activeIdentity = getActiveIdentity(localConfig)\n if (!activeIdentity) {\n error('No active identity. Run \"attest-it identity use <slug>\" to select one.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const activeSlug = localConfig.activeIdentity\n\n info(`Using identity: ${activeSlug}`)\n log(` Name: ${activeIdentity.name}`)\n log(` Public Key: ${activeIdentity.publicKey.slice(0, 32)}...`)\n log('')\n\n // Load project config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n const existingTeam = attestItConfig.team ?? {}\n\n // Check if public key already exists\n const existingMemberWithKey = Object.entries(existingTeam).find(\n ([, member]) => member.publicKey === activeIdentity.publicKey,\n )\n if (existingMemberWithKey) {\n error(`You're already a team member as \"${existingMemberWithKey[0]}\"`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Determine slug - use identity slug if available, prompt if taken\n let slug = activeSlug\n // eslint-disable-next-line security/detect-object-injection -- slug comes from validated config\n if (existingTeam[slug]) {\n log(`Slug \"${slug}\" is already taken by another team member.`)\n slug = await input({\n message: 'Choose a different slug:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Slug cannot be empty'\n }\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n // eslint-disable-next-line security/detect-object-injection -- value is user input being validated\n if (existingTeam[value]) {\n return `Slug \"${value}\" is already taken`\n }\n return true\n },\n })\n }\n\n // Prompt for gate authorizations\n log('')\n const authorizedGates = await promptForGateAuthorization(attestItConfig.gates)\n\n // Update config with new team member\n const memberData: Parameters<typeof addTeamMemberToConfig>[2] = {\n name: activeIdentity.name,\n publicKey: activeIdentity.publicKey,\n publicKeyAlgorithm: 'ed25519',\n }\n if (activeIdentity.email) {\n memberData.email = activeIdentity.email\n }\n if (activeIdentity.github) {\n memberData.github = activeIdentity.github\n }\n const updatedConfig = addTeamMemberToConfig(config, slug, memberData, authorizedGates)\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" added successfully`)\n\n if (authorizedGates.length > 0) {\n log(`Authorized for gates: ${authorizedGates.join(', ')}`)\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath, readSealsSync } from '@attest-it/core'\nimport type { Config } from '@attest-it/core'\nimport { log, success, error, warn } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const removeCommand = new Command('remove')\n .description('Remove a team member')\n .argument('<slug>', 'Team member slug to remove')\n .option('-f, --force', 'Skip confirmation prompt')\n .action(async (slug: string, options: { force?: boolean }) => {\n await runRemove(slug, options)\n })\n\n/**\n * Run the remove command to delete a team member.\n */\nasync function runRemove(slug: string, options: { force?: boolean }): Promise<void> {\n try {\n const theme = getTheme()\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if member exists\n // eslint-disable-next-line security/detect-object-injection\n const existingMember = attestItConfig.team?.[slug]\n if (!existingMember) {\n error(`Team member \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()(`Remove Team Member: ${slug}`))\n log('')\n log(`Name: ${existingMember.name}`)\n if (existingMember.email) {\n log(`Email: ${existingMember.email}`)\n }\n if (existingMember.github) {\n log(`GitHub: ${existingMember.github}`)\n }\n log('')\n\n // Check for existing seals by this member\n const projectRoot = process.cwd()\n let sealsFile\n try {\n sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n } catch {\n // No seals file exists yet\n sealsFile = { version: 1, seals: {} }\n }\n\n const sealsCreatedByMember: string[] = []\n for (const [gateId, seal] of Object.entries(sealsFile.seals)) {\n if (seal.sealedBy === slug) {\n sealsCreatedByMember.push(gateId)\n }\n }\n\n if (sealsCreatedByMember.length > 0) {\n warn('This member has created seals for the following gates:')\n for (const gateId of sealsCreatedByMember) {\n warn(` - ${gateId}`)\n }\n log('')\n warn('These seals will still be valid but attributed to a removed member.')\n log('')\n }\n\n // Get gates this member is authorized for\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log('This member is authorized for the following gates:')\n for (const gateId of authorizedGates) {\n log(` - ${gateId}`)\n }\n log('')\n }\n\n // Confirm removal\n if (!options.force) {\n const confirmed = await confirm({\n message: `Are you sure you want to remove \"${slug}\"?`,\n default: false,\n })\n\n if (!confirmed) {\n error('Removal cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Remove from team\n const updatedTeam = { ...attestItConfig.team }\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete, security/detect-object-injection\n delete updatedTeam[slug]\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: updatedTeam,\n }\n\n // Remove from all gate authorizations\n if (updatedConfig.gates) {\n for (const gate of Object.values(updatedConfig.gates)) {\n gate.authorizedSigners = gate.authorizedSigners.filter((s) => s !== slug)\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" removed successfully`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { addCommand } from './add.js'\nimport { joinCommand } from './join.js'\nimport { removeCommand } from './remove.js'\n\nexport const teamCommand = new Command('team')\n .description('Manage team members and authorizations')\n .addCommand(listCommand)\n .addCommand(addCommand)\n .addCommand(joinCommand)\n .addCommand(removeCommand)\n","import { Command } from 'commander'\nimport tabtab from '@pnpm/tabtab'\nimport { loadLocalConfig, loadConfig } from '@attest-it/core'\nimport { success, error, log, info } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\n/** Primary program name */\nconst PROGRAM_NAME = 'attest-it'\n/** Short alias for the program */\nconst PROGRAM_ALIAS = 'attest'\n/** All valid program names for completion context detection */\nconst PROGRAM_NAMES = [PROGRAM_NAME, PROGRAM_ALIAS]\n\ntype SupportedShell = 'bash' | 'zsh' | 'fish'\n\nfunction isSupportedShell(value: string): value is SupportedShell {\n return value === 'bash' || value === 'zsh' || value === 'fish'\n}\n\n/**\n * Get completions based on the current completion context.\n */\nasync function getCompletions(env: tabtab.ParseEnvResult): Promise<void> {\n let shell: SupportedShell\n try {\n const detectedShell = tabtab.getShellFromEnv(process.env)\n // Only use bash, zsh, fish (not pwsh)\n shell = detectedShell === 'pwsh' ? 'bash' : detectedShell\n } catch {\n // If SHELL isn't set properly, default to bash-compatible output\n shell = 'bash'\n }\n\n // Top-level commands\n const commands: tabtab.CompletionItem[] = [\n { name: 'init', description: 'Initialize a new config file' },\n { name: 'status', description: 'Show status of all gates' },\n { name: 'run', description: 'Run test suites interactively' },\n { name: 'verify', description: 'Verify all seals are valid' },\n { name: 'seal', description: 'Create a seal for a gate' },\n { name: 'prune', description: 'Remove stale attestations' },\n { name: 'identity', description: 'Manage identities' },\n { name: 'team', description: 'Manage team members' },\n { name: 'whoami', description: 'Show active identity' },\n { name: 'completion', description: 'Shell completion commands' },\n ]\n\n // Global options\n const globalOptions: tabtab.CompletionItem[] = [\n { name: '--help', description: 'Show help' },\n { name: '--version', description: 'Show version' },\n { name: '--verbose', description: 'Verbose output' },\n { name: '--quiet', description: 'Minimal output' },\n { name: '--config', description: 'Path to config file' },\n ]\n\n // Identity subcommands\n const identitySubcommands: tabtab.CompletionItem[] = [\n { name: 'create', description: 'Create a new identity' },\n { name: 'list', description: 'List all identities' },\n { name: 'use', description: 'Switch active identity' },\n { name: 'remove', description: 'Remove an identity' },\n ]\n\n // Team subcommands\n const teamSubcommands: tabtab.CompletionItem[] = [\n { name: 'add', description: 'Add yourself to the team' },\n { name: 'list', description: 'List team members' },\n { name: 'remove', description: 'Remove a team member' },\n ]\n\n // Completion subcommands\n const completionSubcommands: tabtab.CompletionItem[] = [\n { name: 'install', description: 'Install shell completion' },\n { name: 'uninstall', description: 'Uninstall shell completion' },\n ]\n\n // Parse the command line to understand context\n const words: string[] = env.line.split(/\\s+/).filter(Boolean)\n const lastWord: string = env.last\n const prevWord: string = env.prev\n\n // If completing an option value\n if (prevWord === '--config' || prevWord === '-c') {\n // Let shell handle file completion\n tabtab.logFiles()\n return\n }\n\n // If typing an option\n if (lastWord.startsWith('-')) {\n tabtab.log(globalOptions, shell, console.log)\n return\n }\n\n // Determine which command we're in\n // Skip program names (attest-it, attest) and npx\n const commandIndex = words.findIndex(\n (w: string) => !w.startsWith('-') && !PROGRAM_NAMES.includes(w) && w !== 'npx',\n )\n const currentCommand: string | null = commandIndex >= 0 ? (words[commandIndex] ?? null) : null\n\n // Handle subcommand completions\n if (currentCommand === 'identity') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (subcommand === 'use' || subcommand === 'remove') {\n // Complete with identity slugs\n const identities = await getIdentitySlugs()\n if (identities.length > 0) {\n tabtab.log(identities, shell, console.log)\n return\n }\n }\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(identitySubcommands, shell, console.log)\n return\n }\n }\n\n if (currentCommand === 'team') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(teamSubcommands, shell, console.log)\n return\n }\n }\n\n if (currentCommand === 'completion') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (subcommand === 'install') {\n // Complete with shell names\n tabtab.log(['bash', 'zsh', 'fish'], shell, console.log)\n return\n }\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(completionSubcommands, shell, console.log)\n return\n }\n }\n\n // Commands that take a gate name as argument\n if (currentCommand === 'status' || currentCommand === 'verify' || currentCommand === 'seal') {\n const gates = await getGateNames()\n if (gates.length > 0) {\n tabtab.log(gates, shell, console.log)\n return\n }\n }\n\n // Commands that take a suite name as argument\n if (currentCommand === 'run') {\n const suites = await getSuiteNames()\n if (suites.length > 0) {\n tabtab.log(suites, shell, console.log)\n return\n }\n }\n\n // Default: show top-level commands\n // This handles both:\n // 1. No command typed yet (e.g., \"attest-it \")\n // 2. Partial/unknown command being typed (e.g., \"attest-it ini\")\n // The shell will filter by prefix for partial matches\n const knownCommands = [\n 'init',\n 'status',\n 'run',\n 'verify',\n 'seal',\n 'prune',\n 'identity',\n 'team',\n 'whoami',\n 'completion',\n ]\n if (!currentCommand || !knownCommands.includes(currentCommand)) {\n tabtab.log([...commands, ...globalOptions], shell, console.log)\n }\n}\n\n/**\n * Get identity slugs from local config.\n */\nasync function getIdentitySlugs(): Promise<string[]> {\n try {\n const config = await loadLocalConfig()\n if (config?.identities) {\n return Object.keys(config.identities)\n }\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\n/**\n * Get gate names from project config.\n */\nasync function getGateNames(): Promise<string[]> {\n try {\n const config = await loadConfig()\n if (config.gates) {\n return Object.keys(config.gates)\n }\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\n/**\n * Get suite names from project config.\n */\nasync function getSuiteNames(): Promise<string[]> {\n try {\n const config = await loadConfig()\n return Object.keys(config.suites)\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\nexport const completionCommand = new Command('completion').description('Shell completion commands')\n\n/**\n * Detect the user's current shell from the SHELL environment variable.\n */\nfunction detectCurrentShell(): SupportedShell | null {\n const shellPath = process.env.SHELL ?? ''\n if (shellPath.endsWith('/bash') || shellPath.endsWith('/bash.exe')) {\n return 'bash'\n }\n if (shellPath.endsWith('/zsh') || shellPath.endsWith('/zsh.exe')) {\n return 'zsh'\n }\n if (shellPath.endsWith('/fish') || shellPath.endsWith('/fish.exe')) {\n return 'fish'\n }\n return null\n}\n\n/**\n * Get the source command for reloading a shell's config.\n */\nfunction getSourceCommand(shell: SupportedShell): string {\n switch (shell) {\n case 'bash':\n return 'source ~/.bashrc'\n case 'zsh':\n return 'source ~/.zshrc'\n case 'fish':\n return 'source ~/.config/fish/config.fish'\n }\n}\n\n// Install subcommand\ncompletionCommand\n .command('install [shell]')\n .description('Install shell completion (auto-detects shell, or specify bash/zsh/fish)')\n .action(async (shellArg?: string) => {\n try {\n let shell: SupportedShell\n\n if (shellArg !== undefined) {\n // User explicitly specified a shell\n if (!isSupportedShell(shellArg)) {\n error(`Shell \"${shellArg}\" is not supported. Use bash, zsh, or fish.`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n shell = shellArg\n } else {\n // Auto-detect from SHELL environment variable\n const detected = detectCurrentShell()\n if (!detected) {\n error(\n 'Could not detect your shell. Please specify: attest-it completion install <bash|zsh|fish>',\n )\n process.exit(ExitCode.CONFIG_ERROR)\n }\n shell = detected\n info(`Detected shell: ${shell}`)\n }\n\n // Install completions for both program names (attest-it and attest)\n await tabtab.install({\n name: PROGRAM_NAME,\n completer: PROGRAM_NAME,\n shell,\n })\n await tabtab.install({\n name: PROGRAM_ALIAS,\n completer: PROGRAM_ALIAS,\n shell,\n })\n\n log('')\n success(`Shell completion installed for ${shell}!`)\n info(`Completions enabled for both \"${PROGRAM_NAME}\" and \"${PROGRAM_ALIAS}\" commands.`)\n log('')\n info('Restart your shell or run:')\n log(` ${getSourceCommand(shell)}`)\n log('')\n } catch (err) {\n error(`Failed to install completion: ${err instanceof Error ? err.message : String(err)}`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n })\n\n// Uninstall subcommand\ncompletionCommand\n .command('uninstall')\n .description('Uninstall shell completion')\n .action(async () => {\n try {\n // Uninstall completions for both program names\n await tabtab.uninstall({\n name: PROGRAM_NAME,\n })\n await tabtab.uninstall({\n name: PROGRAM_ALIAS,\n })\n\n log('')\n success('Shell completion uninstalled!')\n log('')\n } catch (err) {\n error(`Failed to uninstall completion: ${err instanceof Error ? err.message : String(err)}`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n })\n\n// Hidden server subcommand (called by shell for completions)\n// Note: This is kept for backwards compatibility, but tabtab actually\n// calls `attest-it completion-server` (with hyphen) at the top level.\ncompletionCommand\n .command('server', { hidden: true })\n .description('Completion server (internal)')\n .action(async () => {\n const env = tabtab.parseEnv(process.env)\n if (env.complete) {\n await getCompletions(env)\n }\n })\n\n/**\n * Hidden top-level command called by tabtab for shell completions.\n * tabtab expects `<program> completion-server` (with hyphen) at the root.\n *\n * We create this dynamically as a function so it can be added with { hidden: true }\n * option when registering with the parent command.\n */\nexport function createCompletionServerCommand(): Command {\n return new Command('completion-server')\n .allowUnknownOption()\n .allowExcessArguments(true)\n .action(async () => {\n const env = tabtab.parseEnv(process.env)\n if (env.complete) {\n await getCompletions(env)\n }\n })\n}\n","import { Command } from 'commander'\nimport { initCommand } from './commands/init.js'\nimport { statusCommand } from './commands/status.js'\nimport { runCommand } from './commands/run.js'\nimport { pruneCommand } from './commands/prune.js'\nimport { verifyCommand } from './commands/verify.js'\nimport { sealCommand } from './commands/seal.js'\nimport { identityCommand } from './commands/identity/index.js'\nimport { whoamiCommand } from './commands/whoami.js'\nimport { teamCommand } from './commands/team/index.js'\nimport { completionCommand, createCompletionServerCommand } from './commands/completion.js'\nimport { setOutputOptions, initTheme } from './utils/output.js'\nimport { setAttestItHomeDir } from '@attest-it/core'\nimport { getPackageVersion } from './utils/version.js'\n\nconst program = new Command()\n\nprogram\n .name('attest-it')\n .description('Human-gated test attestation system')\n .option('-c, --config <path>', 'Path to config file')\n .option('-v, --verbose', 'Verbose output')\n .option('-q, --quiet', 'Minimal output')\n\n// Handle --version manually to avoid loading package.json on every invocation\nprogram.option('-V, --version', 'output the version number')\n\n// Register commands\nprogram.addCommand(initCommand)\nprogram.addCommand(statusCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(pruneCommand)\nprogram.addCommand(verifyCommand)\nprogram.addCommand(sealCommand)\nprogram.addCommand(identityCommand)\nprogram.addCommand(teamCommand)\nprogram.addCommand(whoamiCommand)\nprogram.addCommand(completionCommand)\nprogram.addCommand(createCompletionServerCommand(), { hidden: true })\n\n/**\n * Process the hidden --home-dir option before any other processing.\n * This must be done early so config loading uses the correct path.\n */\nfunction processHomeDirOption(): void {\n const homeDirIndex = process.argv.indexOf('--home-dir')\n if (homeDirIndex !== -1 && homeDirIndex + 1 < process.argv.length) {\n const homeDir = process.argv[homeDirIndex + 1]\n if (homeDir && !homeDir.startsWith('-')) {\n setAttestItHomeDir(homeDir)\n // Remove the option from argv so Commander doesn't complain\n process.argv.splice(homeDirIndex, 2)\n }\n }\n}\n\nexport async function run(): Promise<void> {\n // Process --home-dir before anything else (hidden option for testing)\n processHomeDirOption()\n\n // Check for --version flag before initializing theme or doing other work\n if (process.argv.includes('--version') || process.argv.includes('-V')) {\n console.log(getPackageVersion())\n process.exit(0)\n }\n\n // Skip theme initialization for completion-server (outputs escape sequences that corrupt completions)\n const isCompletionServer = process.argv.includes('completion-server')\n if (!isCompletionServer) {\n // Initialize theme before any output\n await initTheme()\n }\n\n // Parse options and set global output options\n program.parse()\n const options = program.opts<{ verbose?: boolean; quiet?: boolean }>()\n\n const outputOptions: { verbose?: boolean; quiet?: boolean } = {}\n if (options.verbose !== undefined) {\n outputOptions.verbose = options.verbose\n }\n if (options.quiet !== undefined) {\n outputOptions.quiet = options.quiet\n }\n\n setOutputOptions(outputOptions)\n}\n\nexport { program }\n","import { run } from '../src/index.js'\n\nvoid run()\n"]}
1
+ {"version":3,"sources":["../../src/local-resolver.ts","../../src/utils/output.ts","../../src/components/theme.ts","../../src/utils/prompts.ts","../../src/utils/exit-codes.ts","../../src/utils/completion-offer.ts","../../src/utils/version.ts","../../src/commands/init.ts","../../src/commands/status.ts","../../src/components/Header.tsx","../../src/components/StatusBadge.tsx","../../src/components/SuiteTable.tsx","../../src/components/SelectionPrompt.tsx","../../src/components/SuiteSelector.tsx","../../src/components/ProgressSummary.tsx","../../src/components/TestRunner.tsx","../../src/components/InteractiveRun.tsx","../../src/commands/run-utils.ts","../../src/session/session.ts","../../src/commands/run-interactive.tsx","../../src/commands/run.ts","../../src/commands/prune.ts","../../src/commands/verify.ts","../../src/commands/seal.ts","../../src/commands/identity/list.ts","../../src/commands/identity/validation.ts","../../src/commands/identity/create.ts","../../src/commands/identity/use.ts","../../src/commands/identity/show.ts","../../src/utils/format-key-location.ts","../../src/commands/identity/remove.ts","../../src/commands/identity/export.ts","../../src/commands/identity/index.ts","../../src/commands/whoami.ts","../../src/commands/team/list.ts","../../src/commands/team/utils.ts","../../src/commands/team/add.ts","../../src/commands/team/join.ts","../../src/commands/team/remove.ts","../../src/commands/team/index.ts","../../src/commands/completion.ts","../../src/index.ts","../../bin/attest-it.ts"],"names":["__filename","theme","getTheme","confirm","tabtab","fileURLToPath","dirname","join","error","Command","jsx","Text","Box","input","jsxs","React5","useInput","createAttestation","currentSuite","saveSession","React8","loadConfig","computeFingerprint","readAttestations","resolve","parseShellCommand","executeCommand","spawn","checkDirtyWorkingTree","os2","upsertAttestation","KeyProviderRegistry","getDefaultPrivateKeyPath","FilesystemKeyProvider","writeSignedAttestations","toAttestItConfig","computeFingerprintSync","fs","readSealsSync","fs2","verifyGateSeal","verifyAllSeals","colorizeState","formatAge","loadLocalConfigSync","getActiveIdentity","writeSealsSync","isAuthorizedSigner","createKeyProviderFromIdentity","getKeyRefFromIdentity","createSeal","loadLocalConfig","name","mkdir","writeFile","saveLocalConfig","unlink","stringifyYaml","listCommand","runList","findConfigPath","removeCommand","runRemove","PROGRAM_NAME","PROGRAM_ALIAS","globalOptions","detectCurrentShell","getSourceCommand"],"mappings":"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","file":"attest-it.js","sourcesContent":["/**\n * Local CLI resolution for attest-it.\n *\n * When a global installation of attest-it is invoked, this module\n * searches for a local (project-specific) installation and delegates\n * execution to it. This ensures projects use their pinned version,\n * which is critical for configs with `minVersion` requirements.\n *\n * The resolution process:\n * 1. Search upward from cwd for `node_modules/.bin/attest-it`\n * 2. If found and different from current CLI, spawn the local version\n * 3. If not found or same as current, continue with current CLI\n *\n * Set `ATTEST_IT_SKIP_LOCAL_RESOLUTION=1` to disable this behavior.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, realpathSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\n\nconst __filename = fileURLToPath(import.meta.url)\n\n/**\n * Gets the list of executable extensions to check based on the platform.\n * On Windows, npm creates .cmd and .ps1 shims in addition to the base executable.\n *\n * @returns Array of extensions to check (empty string for base name, then platform-specific)\n */\nfunction getExecutableExtensions(): string[] {\n if (process.platform === 'win32') {\n // On Windows, check for .cmd (batch) and .ps1 (PowerShell) shims\n // The .cmd shim is created by npm and is the primary way to run CLI tools\n return ['.cmd', '.ps1', '']\n }\n // On Unix-like systems, the executable has no extension\n return ['']\n}\n\n/**\n * Walks up the directory tree looking for a local installation of attest-it CLI.\n * Starts from the current working directory and checks each parent directory\n * for node_modules/.bin/attest-it (with platform-appropriate extensions).\n *\n * @returns The path to the local CLI binary, or null if not found\n */\nfunction findLocalCli(): string | null {\n let dir = process.cwd()\n const extensions = getExecutableExtensions()\n\n while (dir !== dirname(dir)) {\n const binDir = join(dir, 'node_modules', '.bin')\n for (const ext of extensions) {\n const localBin = join(binDir, `attest-it${ext}`)\n if (existsSync(localBin)) {\n return localBin\n }\n }\n dir = dirname(dir)\n }\n\n return null\n}\n\n/**\n * Extracts the package root path from a resolved file path.\n * Looks for the pattern 'node_modules/@attest-it/cli' in the path.\n * Handles both POSIX (/) and Windows (\\) path separators.\n *\n * @param filePath - The resolved file path\n * @returns The package root directory path, or null if not found\n */\nfunction getPackageRoot(filePath: string): string | null {\n // Normalize path separators to forward slashes for consistent matching\n // This handles both POSIX (/) and Windows (\\) paths\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Look for node_modules/@attest-it/cli in the normalized path\n const regex = /(.*node_modules\\/@attest-it\\/cli)/\n const match = regex.exec(normalizedPath)\n\n if (!match?.[1]) {\n return null\n }\n\n // Return the matched portion using original path separators\n // by taking the same length substring from the original path\n return filePath.slice(0, match[1].length)\n}\n\n/**\n * Compares the resolved path of the local CLI with the current CLI to determine\n * if they are the same installation. Uses realpathSync to resolve symlinks.\n *\n * @param localCliPath - Path to the local CLI binary to check\n * @returns true if the local CLI is the same as the currently executing CLI\n */\nfunction isSameAsCurrentCli(localCliPath: string): boolean {\n try {\n const localReal = realpathSync(localCliPath)\n const currentReal = realpathSync(__filename)\n\n // Compare the resolved paths directly\n if (localReal === currentReal) {\n return true\n }\n\n // Extract and compare package roots\n const localPkgRoot = getPackageRoot(localReal)\n const currentPkgRoot = getPackageRoot(currentReal)\n\n // If both are from the same package installation, they're the same\n return localPkgRoot !== null && localPkgRoot === currentPkgRoot\n } catch (err) {\n // Log the error to help with debugging filesystem issues\n console.warn(\n `Warning: Could not resolve CLI paths for comparison: ${err instanceof Error ? err.message : String(err)}`,\n )\n // If we can't resolve paths, assume they're different\n return false\n }\n}\n\n/**\n * Attempts to delegate execution to a locally installed version of attest-it CLI.\n * This ensures that projects use their pinned version rather than a global installation.\n *\n * The function:\n * 1. Checks if local resolution should be skipped (via environment variable)\n * 2. Searches for a local installation in node_modules/.bin\n * 3. Verifies the local installation is different from the current one\n * 4. Spawns the local CLI with the same arguments and environment\n * 5. Exits with the same status code as the delegated process\n *\n * @returns false if no delegation was needed or possible. If delegation occurs,\n * this function does not return - it exits the process.\n * @public\n */\nexport function tryDelegateToLocal(): false {\n // Prevent infinite loops if a local CLI tries to delegate to itself\n if (process.env.ATTEST_IT_SKIP_LOCAL_RESOLUTION === '1') {\n return false\n }\n\n const localCli = findLocalCli()\n\n if (!localCli || isSameAsCurrentCli(localCli)) {\n return false\n }\n\n // Delegate to local CLI with the same arguments (skip node and script name)\n const result = spawnSync(localCli, process.argv.slice(2), {\n stdio: 'inherit',\n env: { ...process.env, ATTEST_IT_SKIP_LOCAL_RESOLUTION: '1' },\n })\n\n // Exit with the same status code as the delegated process\n process.exit(result.status ?? 1)\n}\n","import { detectTheme, type Theme } from 'chromaterm'\n\nexport interface OutputOptions {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n}\n\n// Singleton for global output options\nlet globalOptions: OutputOptions = {}\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required mock theme for testing/fallback when async init not called\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOptions = options\n}\n\nexport function getOutputOptions(): OutputOptions {\n return globalOptions\n}\n\n// Logging functions\nexport function log(message: string): void {\n if (!globalOptions.quiet) {\n console.log(message)\n }\n}\n\nexport function verbose(message: string): void {\n if (globalOptions.verbose && !globalOptions.quiet) {\n console.log(getTheme().muted(message))\n }\n}\n\nexport function success(message: string): void {\n log(getTheme().success('✓ ' + message))\n}\n\nexport function error(message: string): void {\n console.error(getTheme().error('✗ ' + message))\n}\n\nexport function warn(message: string): void {\n if (!globalOptions.quiet) {\n console.warn(getTheme().warning('⚠ ' + message))\n }\n}\n\nexport function info(message: string): void {\n log(getTheme().info('ℹ ' + message))\n}\n\n// Table formatting for status display\nexport interface TableRow {\n suite: string\n status: string\n fingerprint: string\n age: string\n}\n\nexport function formatTable(rows: TableRow[]): string {\n // Calculate column widths\n const headers = ['Suite', 'Status', 'Fingerprint', 'Age']\n\n // Helper to get row values in consistent order\n const getRowValues = (row: TableRow): string[] => [\n row.suite,\n row.status,\n row.fingerprint,\n row.age,\n ]\n\n const widths = headers.map((h, i) => {\n const columnValues = rows.map((r) => {\n const values = getRowValues(r)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n return values[i] ?? ''\n })\n const maxValueLength = Math.max(...columnValues.map((v) => v.length), 0)\n return Math.max(h.length, maxValueLength)\n })\n\n // Build table\n const separator = '─'\n const lines: string[] = []\n\n // Header\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(headers.map((h, i) => h.padEnd(widths[i] ?? 0)).join(' │ '))\n lines.push(widths.map((w) => separator.repeat(w)).join('─┼─'))\n\n // Rows\n for (const row of rows) {\n const values = getRowValues(row)\n // eslint-disable-next-line security/detect-object-injection -- i is from .map() index\n lines.push(values.map((v, i) => v.padEnd(widths[i] ?? 0)).join(' │ '))\n }\n\n return lines.join('\\n')\n}\n\n// Status colorization\nexport function colorizeStatus(status: string): string {\n const t = getTheme()\n switch (status) {\n case 'VALID':\n return t.green(status)\n case 'NEEDS_ATTESTATION':\n case 'FINGERPRINT_CHANGED':\n return t.yellow(status)\n case 'EXPIRED':\n case 'INVALIDATED_BY_PARENT':\n return t.red(status)\n case 'SIGNATURE_INVALID':\n return t.red.bold()(status)\n default:\n return status\n }\n}\n\n// JSON output\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n","/**\n * Theme utilities for ink components.\n * Provides access to chromaterm theme and shared styling constants.\n */\n\nimport { detectTheme, type Theme } from 'chromaterm'\n\n/**\n * Status display configuration.\n */\nexport interface StatusDisplay {\n /** Text to display */\n label: string\n /** Ink color name */\n color: string\n /** Whether to apply bold */\n bold?: boolean\n /** Symbol to show before label */\n symbol?: string\n}\n\n/**\n * Map verification status to display configuration.\n */\nexport const STATUS_DISPLAY: Record<string, StatusDisplay> = {\n VALID: {\n label: 'VALID',\n color: 'green',\n symbol: '✓',\n },\n NEEDS_ATTESTATION: {\n label: 'MISSING',\n color: 'yellow',\n symbol: '○',\n },\n FINGERPRINT_CHANGED: {\n label: 'CHANGED',\n color: 'yellow',\n symbol: '⚠',\n },\n EXPIRED: {\n label: 'STALE',\n color: 'red',\n symbol: '⚠',\n },\n SIGNATURE_INVALID: {\n label: 'INVALID',\n color: 'red',\n bold: true,\n symbol: '✗',\n },\n INVALIDATED_BY_PARENT: {\n label: 'PARENT_INVALID',\n color: 'red',\n symbol: '✗',\n },\n}\n\n/**\n * Box drawing characters for consistent UI.\n */\nexport const BOX_CHARS = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n cross: '┼',\n} as const\n\n/**\n * Common column widths for table display.\n */\nexport const COLUMN_WIDTHS = {\n checkbox: 3, // [ ] or [x]\n status: 14, // MISSING, CHANGED, PARENT_INVALID, etc.\n suite: 25, // Suite name\n reason: 30, // Reason text\n} as const\n\n// Theme singleton - will be initialized lazily if not explicitly initialized\nlet theme: Theme | undefined\n\n/**\n * Initialize the color theme by detecting the terminal theme.\n * Must be called before using any color functions.\n */\nexport async function initTheme(): Promise<void> {\n theme = await detectTheme()\n}\n\n/**\n * Get the theme, initializing it synchronously if needed (for tests).\n * Uses a fallback no-op theme if async initialization hasn't been called.\n */\nexport function getTheme(): Theme {\n if (!theme) {\n // Fallback for tests or when initTheme() wasn't called\n // This creates a simple pass-through theme that returns strings unchanged\n const noopFn = (str: string) => str\n const chainable = () => noopFn\n // Type assertion is required here because we're creating a mock Theme object\n // for testing/fallback purposes. The chromaterm Theme type has complex\n // chainable methods that we're approximating with simple functions.\n // This is safe because all methods accept and return strings.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required to create mock theme for testing\n theme = {\n red: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n green: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n yellow: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n blue: Object.assign(noopFn, { bold: chainable, dim: chainable }),\n success: noopFn,\n error: noopFn,\n warning: noopFn,\n info: noopFn,\n muted: noopFn,\n } as unknown as Theme\n }\n return theme\n}\n\n/**\n * Get display configuration for a verification status.\n * Returns a default for unknown statuses.\n */\nexport function getStatusDisplay(status: string): StatusDisplay {\n return (\n // eslint-disable-next-line security/detect-object-injection -- status is a user-controlled string, but we provide a safe default for unknown values\n STATUS_DISPLAY[status] ?? {\n label: status,\n color: 'white',\n symbol: '?',\n }\n )\n}\n","import { confirm } from '@inquirer/prompts'\nimport { getTheme, BOX_CHARS } from '../components/theme.js'\n\nexport interface ConfirmOptions {\n message: string\n default?: boolean\n}\n\n/**\n * Display a visually distinctive confirmation prompt.\n *\n * Creates a styled box with yellow border to make the attestation prompt\n * stand out from test output.\n */\nexport async function confirmAction(options: ConfirmOptions): Promise<boolean> {\n const theme = getTheme()\n\n // Build the styled prompt box\n const defaultIndicator = options.default ? '(Y/n)' : '(y/N)'\n const message = `${options.message}? ${defaultIndicator}`\n const boxWidth = Math.max(message.length + 2, 40)\n const contentPadding = ' '.repeat(boxWidth - message.length - 1)\n\n // Box drawing with yellow border\n const topBorder = theme.yellow(\n `${BOX_CHARS.topLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.topRight}`,\n )\n const bottomBorder = theme.yellow(\n `${BOX_CHARS.bottomLeft}${BOX_CHARS.horizontal.repeat(boxWidth)}${BOX_CHARS.bottomRight}`,\n )\n\n // Content line with yellow border and normal text\n const contentLine =\n theme.yellow(BOX_CHARS.vertical) +\n ` ${message}${contentPadding}` +\n theme.yellow(BOX_CHARS.vertical)\n\n // Display the styled box\n console.log('')\n console.log(topBorder)\n console.log(contentLine)\n console.log(bottomBorder)\n console.log('')\n\n // Get the actual confirmation\n return confirm({\n message: '', // Empty message since we displayed it above\n default: options.default ?? false,\n theme: {\n prefix: '', // Remove default prefix\n },\n })\n}\n","/**\n * Standard exit codes for the attest-it CLI.\n *\n * These codes follow Unix conventions and provide consistent error reporting\n * across all CLI commands.\n *\n * @packageDocumentation\n */\n\n/**\n * Standard exit codes for the attest-it CLI.\n * @public\n */\nexport const ExitCode = {\n /** Operation completed successfully */\n SUCCESS: 0,\n /** Tests failed or attestation invalid */\n FAILURE: 1,\n /** Nothing needed attestation */\n NO_WORK: 2,\n /** Configuration or validation error */\n CONFIG_ERROR: 3,\n /** User cancelled the operation */\n CANCELLED: 4,\n /** Missing required key file */\n MISSING_KEY: 5,\n} as const\n\n/**\n * Type representing all possible exit codes.\n * @public\n */\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode]\n","/**\n * Utility to offer shell completion installation to users.\n * @packageDocumentation\n */\n\nimport { confirm } from '@inquirer/prompts'\nimport { loadPreferences, savePreferences } from '@attest-it/core'\nimport { log, info, success, error } from './output.js'\nimport tabtab from '@pnpm/tabtab'\n\n/** Primary program name */\nconst PROGRAM_NAME = 'attest-it'\n/** Short alias for the program */\nconst PROGRAM_ALIAS = 'attest'\n\ntype SupportedShell = 'bash' | 'zsh' | 'fish'\n\n/**\n * Detect the user's current shell from the SHELL environment variable.\n */\nfunction detectCurrentShell(): SupportedShell | null {\n const shellPath = process.env.SHELL ?? ''\n if (shellPath.endsWith('/bash') || shellPath.endsWith('/bash.exe')) {\n return 'bash'\n }\n if (shellPath.endsWith('/zsh') || shellPath.endsWith('/zsh.exe')) {\n return 'zsh'\n }\n if (shellPath.endsWith('/fish') || shellPath.endsWith('/fish.exe')) {\n return 'fish'\n }\n return null\n}\n\n/**\n * Get the source command for reloading a shell's config.\n */\nfunction getSourceCommand(shell: SupportedShell): string {\n switch (shell) {\n case 'bash':\n return 'source ~/.bashrc'\n case 'zsh':\n return 'source ~/.zshrc'\n case 'fish':\n return 'source ~/.config/fish/config.fish'\n }\n}\n\n/**\n * Offer to install shell completions if the user hasn't declined before.\n * Should be called at the end of init and identity create commands.\n *\n * @returns true if completions were installed, false otherwise\n */\nexport async function offerCompletionInstall(): Promise<boolean> {\n try {\n // Check if user has already declined\n const prefs = await loadPreferences()\n if (prefs.cliExperience?.declinedCompletionInstall) {\n return false\n }\n\n // Detect shell\n const shell = detectCurrentShell()\n if (!shell) {\n // Can't detect shell, skip the offer\n return false\n }\n\n // Ask user if they want to install completions\n log('')\n const shouldInstall = await confirm({\n message: `Would you like to enable shell completions for ${shell}?`,\n default: true,\n })\n\n if (!shouldInstall) {\n // Save preference that user declined\n await savePreferences({\n ...prefs,\n cliExperience: {\n ...prefs.cliExperience,\n declinedCompletionInstall: true,\n },\n })\n\n log('')\n info('No problem! If you change your mind, you can run:')\n log(' attest-it completion install')\n log('')\n return false\n }\n\n // Install completions for both program names (attest-it and attest)\n await tabtab.install({\n name: PROGRAM_NAME,\n completer: PROGRAM_NAME,\n shell,\n })\n await tabtab.install({\n name: PROGRAM_ALIAS,\n completer: PROGRAM_ALIAS,\n shell,\n })\n\n log('')\n success(`Shell completions installed for ${shell}!`)\n info(`Completions enabled for both \"${PROGRAM_NAME}\" and \"${PROGRAM_ALIAS}\" commands.`)\n log('')\n info('Restart your shell or run:')\n log(` ${getSourceCommand(shell)}`)\n log('')\n\n return true\n } catch (err) {\n // Don't let completion errors fail the main command\n error(`Failed to install completions: ${err instanceof Error ? err.message : String(err)}`)\n log('')\n info('You can try again later with:')\n log(' attest-it completion install')\n log('')\n return false\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\n\n/**\n * Type guard for package.json structure with version field.\n */\nfunction hasVersion(data: unknown): data is { version: string } {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'version' in data &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { version: unknown }).version === 'string'\n )\n}\n\n/**\n * Cached version to avoid repeated file reads.\n */\nlet cachedVersion: string | undefined\n\n/**\n * Get the current version of the attest-it CLI package.\n *\n * This function reads the version from package.json at runtime, handling\n * different bundle output locations created by tsup. The version is cached\n * after the first read for performance.\n *\n * @returns The version string from package.json\n * @throws {Error} If package.json cannot be found or is missing version field\n * @public\n */\nexport function getPackageVersion(): string {\n if (cachedVersion !== undefined) {\n return cachedVersion\n }\n\n // Read version from package.json at runtime\n const __filename = fileURLToPath(import.meta.url)\n const __dirname = dirname(__filename)\n\n // Try multiple paths since tsup creates separate bundles for each entry point:\n // - dist/index.js (library entry) needs ../package.json\n // - dist/bin/attest-it.js (CLI entry) needs ../../package.json\n const possiblePaths = [join(__dirname, '../package.json'), join(__dirname, '../../package.json')]\n\n for (const packageJsonPath of possiblePaths) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8')\n const packageJsonData: unknown = JSON.parse(content)\n\n if (!hasVersion(packageJsonData)) {\n throw new Error(`Invalid package.json at ${packageJsonPath}: missing version field`)\n }\n\n cachedVersion = packageJsonData.version\n return cachedVersion\n } catch (error) {\n // Only suppress \"file not found\" errors; rethrow anything else\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n // Try next path\n continue\n }\n throw error\n }\n }\n\n throw new Error('Could not find package.json')\n}\n","import { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\nimport { log, success, error } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { offerCompletionInstall } from '../utils/completion-offer.js'\nimport { getPackageVersion } from '../utils/version.js'\n\nexport const initCommand = new Command('init')\n .description('Initialize attest-it configuration')\n .option('-p, --path <path>', 'Config file path', '.attest-it/config.yaml')\n .option('-f, --force', 'Overwrite existing config')\n .action(async (options: InitOptions) => {\n await runInit(options)\n })\n\ninterface InitOptions {\n path: string\n force?: boolean\n}\n\n/**\n * Load the configuration template from the templates directory.\n *\n * This function reads the config.yaml template at build time from the templates directory.\n * It handles different bundle output locations created by tsup.\n */\nfunction loadConfigTemplate(): string {\n const __filename = fileURLToPath(import.meta.url)\n const __dirname = dirname(__filename)\n\n // Try multiple paths since tsup creates separate bundles:\n // - dist/commands/init.js needs ../../templates/config.yaml\n // - dist/bin/attest-it.js (when bundled) needs ../templates/config.yaml\n const possiblePaths = [\n join(__dirname, '../../templates/config.yaml'),\n join(__dirname, '../templates/config.yaml'),\n ]\n\n for (const templatePath of possiblePaths) {\n try {\n return fs.readFileSync(templatePath, 'utf-8')\n } catch (error) {\n // Only suppress \"file not found\" errors; rethrow anything else\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n // Try next path\n continue\n }\n throw error\n }\n }\n\n throw new Error('Could not find config.yaml template')\n}\n\n/**\n * Represents a package.json structure with the fields we need to interact with.\n */\ninterface PackageJson {\n name: string\n version: string\n devDependencies?: Record<string, string>\n [key: string]: unknown\n}\n\n/**\n * Type guard for package.json structure.\n */\nfunction isPackageJson(data: unknown): data is PackageJson {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'name' in data &&\n 'version' in data &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { name: unknown }).name === 'string' &&\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n typeof (data as { version: unknown }).version === 'string'\n )\n}\n\n/**\n * Detect the package manager being used in the project.\n */\nfunction detectPackageManager(): 'pnpm' | 'yarn' | 'bun' | 'npm' {\n if (fs.existsSync('pnpm-lock.yaml')) return 'pnpm'\n if (fs.existsSync('yarn.lock')) return 'yarn'\n if (fs.existsSync('bun.lockb')) return 'bun'\n return 'npm'\n}\n\n/**\n * Ensure attest-it is added as a devDependency.\n * Creates or updates package.json in the current directory.\n *\n * @returns Information about the package manager and whether package.json was created\n */\nasync function ensureDevDependency(): Promise<{ packageManager: string; created: boolean }> {\n const packageJsonPath = 'package.json'\n const packageManager = detectPackageManager()\n let created = false\n\n let packageJson: PackageJson\n if (fs.existsSync(packageJsonPath)) {\n const content = await fs.promises.readFile(packageJsonPath, 'utf8')\n const parsed: unknown = JSON.parse(content)\n\n if (!isPackageJson(parsed)) {\n throw new Error('Invalid package.json: missing required name or version field')\n }\n\n packageJson = parsed\n } else {\n packageJson = { name: path.basename(process.cwd()), version: '1.0.0' }\n created = true\n }\n\n // Add devDependency\n const devDeps = packageJson.devDependencies ?? {}\n devDeps['attest-it'] = '^' + getPackageVersion()\n packageJson.devDependencies = devDeps\n\n await fs.promises.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n')\n\n return { packageManager, created }\n}\n\n/**\n * Run the init command to create a new attest-it configuration.\n *\n * Creates a configuration file with sensible defaults and commented\n * examples showing how to define test suites. Also ensures attest-it\n * is added as a devDependency to package.json.\n *\n * @param options - Command options\n * @param options.path - Config file path (default: .attest-it/config.yaml)\n * @param options.force - Overwrite existing config without prompting\n * @public\n */\nasync function runInit(options: InitOptions): Promise<void> {\n try {\n const configPath = path.resolve(options.path)\n const configDir = path.dirname(configPath)\n\n if (fs.existsSync(configPath) && !options.force) {\n const overwrite = await confirmAction({\n message: `Config already exists at ${configPath}. Overwrite?`,\n default: false,\n })\n if (!overwrite) {\n error('Init cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Ensure attest-it is in devDependencies\n const { packageManager, created } = await ensureDevDependency()\n if (created) {\n success('Created package.json')\n } else {\n success('Updated package.json with attest-it devDependency')\n }\n\n // Create directory and write config\n await fs.promises.mkdir(configDir, { recursive: true })\n const configTemplate = loadConfigTemplate()\n await fs.promises.writeFile(configPath, configTemplate, 'utf-8')\n\n success(`Configuration created at ${configPath}`)\n log('')\n log('Next steps:')\n log(` 1. Run: ${packageManager} install`)\n log(\" 2. Run: attest-it identity create (if you haven't already)\")\n log(' 3. Run: attest-it team join')\n log(' 4. Edit .attest-it/config.yaml to define your gates and suites')\n\n // Offer to install shell completions\n await offerCompletionInstall()\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\nexport { runInit }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyGateSeal,\n verifyAllSeals,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const statusCommand = new Command('status')\n .description('Show seal status for all gates')\n .argument('[gates...]', 'Show status for specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: StatusOptions) => {\n await runStatus(gates, options)\n })\n\ninterface StatusOptions {\n json?: boolean\n}\n\ninterface GateStatus {\n gateId: string\n state: VerificationState\n currentFingerprint: string\n sealedFingerprint?: string\n sealedBy?: string\n sealedAt?: string\n age?: number\n message?: string | undefined\n}\n\n/**\n * Run the status command to show seal status.\n *\n * Displays the current status of seals for all gates or specific gates,\n * including validation status, fingerprints, and age information.\n *\n * @param gates - Array of gate IDs to show status for, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runStatus(gates: string[], options: StatusOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Determine which gates to check\n const gatesToCheck = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToCheck) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const verificationResults =\n gates.length > 0\n ? gatesToCheck.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Build status results\n const results: GateStatus[] = verificationResults.map((result: SealVerificationResult) => {\n const status: GateStatus = {\n gateId: result.gateId,\n state: result.state,\n currentFingerprint: fingerprints[result.gateId] ?? '',\n message: result.message,\n }\n\n if (result.seal) {\n status.sealedFingerprint = result.seal.fingerprint\n status.sealedBy = result.seal.sealedBy\n status.sealedAt = result.seal.timestamp\n\n // Calculate age\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n status.age = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n }\n\n return status\n })\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayStatusTable(results)\n }\n\n // Exit with appropriate code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER' ||\n r.state === 'STALE',\n )\n\n process.exit(hasInvalid ? ExitCode.FAILURE : ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display status results in a formatted table.\n *\n * @param results - Status results for gates\n */\nfunction displayStatusTable(results: GateStatus[]): void {\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: r.currentFingerprint.slice(0, 16) + '...',\n age: formatAge(r),\n }))\n\n log('')\n log(formatTable(tableRows))\n log('')\n\n // Show seal metadata for each gate (who sealed, when)\n const sealed = results.filter((r) => r.sealedBy && r.sealedAt)\n if (sealed.length > 0) {\n log('Seal metadata:')\n for (const result of sealed) {\n log(` ${result.gateId}:`)\n log(` Sealed by: ${result.sealedBy ?? 'unknown'}`)\n if (result.sealedAt) {\n const date = new Date(result.sealedAt)\n log(` Sealed at: ${date.toLocaleString()}`)\n }\n }\n log('')\n }\n\n // Show messages for any gates with issues\n const withIssues = results.filter((r) => r.state !== 'VALID' && r.message)\n if (withIssues.length > 0) {\n log('Issues:')\n for (const result of withIssues) {\n log(` ${result.gateId}: ${result.message ?? 'Unknown issue'}`)\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const invalidCount = results.length - validCount\n\n if (invalidCount === 0) {\n success('All gate seals valid')\n } else {\n log(`Run 'attest-it seal' to create or update seals`)\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format age for display.\n *\n * @param result - Status result\n * @returns Formatted age string\n */\nfunction formatAge(result: GateStatus): string {\n if (result.state === 'VALID' || result.state === 'STALE') {\n return `${String(result.age ?? 0)} days${result.state === 'STALE' ? ' (stale)' : ''}`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runStatus }\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface HeaderProps {\n /** Number of suites needing attestation */\n pendingCount: number\n}\n\n/**\n * Displays a header box with pending suite count.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ 4 suites need attestation │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function Header({ pendingCount }: HeaderProps): React.ReactElement {\n const message = `${pendingCount.toString()} suite${pendingCount === 1 ? '' : 's'} need${pendingCount === 1 ? 's' : ''} attestation`\n\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>{message}</Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Props for the StatusBadge component.\n * @public\n */\nexport interface StatusBadgeProps {\n /** The verification status to display */\n status: VerificationStatus\n}\n\n/**\n * Displays a colored badge for suite verification status.\n *\n * Status colors:\n * - VALID: green\n * - NEEDS_ATTESTATION: yellow (display as \"MISSING\")\n * - FINGERPRINT_CHANGED: yellow (display as \"CHANGED\")\n * - EXPIRED: red (display as \"STALE\")\n * - SIGNATURE_INVALID: red bold\n * - INVALIDATED_BY_PARENT: red (display as \"INVALIDATED\")\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function StatusBadge({ status }: StatusBadgeProps): React.ReactElement {\n // Map status to display text and color\n const statusConfig = getStatusConfig(status)\n\n // Only pass bold prop if it's true to avoid exactOptionalPropertyTypes issues\n if (statusConfig.bold) {\n return (\n <Text color={statusConfig.color} bold>\n {statusConfig.text}\n </Text>\n )\n }\n\n return <Text color={statusConfig.color}>{statusConfig.text}</Text>\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\ninterface StatusConfig {\n text: string\n color: 'green' | 'yellow' | 'red'\n bold?: boolean\n}\n\n/**\n * Get display configuration for a verification status.\n * @internal\n */\nfunction getStatusConfig(status: VerificationStatus): StatusConfig {\n switch (status) {\n case 'VALID':\n return { text: '✓ VALID', color: 'green' }\n case 'NEEDS_ATTESTATION':\n return { text: 'MISSING', color: 'yellow' }\n case 'FINGERPRINT_CHANGED':\n return { text: 'CHANGED', color: 'yellow' }\n case 'EXPIRED':\n return { text: 'STALE', color: 'red' }\n case 'SIGNATURE_INVALID':\n return { text: 'INVALID', color: 'red', bold: true }\n case 'INVALIDATED_BY_PARENT':\n return { text: 'INVALIDATED', color: 'red' }\n default: {\n // Exhaustive check\n const _exhaustive: never = status\n return { text: String(_exhaustive), color: 'yellow' }\n }\n }\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { StatusBadge } from './StatusBadge.js'\nimport type { VerificationStatus } from '@attest-it/core'\n\n/**\n * Information about a single suite for display in the table.\n * @public\n */\nexport interface SuiteInfo {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason (e.g., \"32 days old (max: 30)\") */\n reason: string\n /** Days since attestation (if exists) */\n age?: number | undefined\n}\n\n/**\n * Props for the SuiteTable component.\n * @public\n */\nexport interface SuiteTableProps {\n /** List of suites to display */\n suites: SuiteInfo[]\n /** Show checkbox column for selection */\n selectable?: boolean | undefined\n /** Currently selected suite names */\n selected?: Set<string> | undefined\n}\n\n/**\n * Displays suites in a table format with status badges.\n *\n * Example output:\n * ```\n * Status Suite Reason\n * ──────────────────────────────────────────────────────────\n * [ ] STALE visual-effects 32 days old (max: 30)\n * [ ] MISSING focus-detection No attestation found\n * ```\n *\n * @param props - Component props\n * @returns React element\n * @public\n */\nexport function SuiteTable({\n suites,\n selectable = false,\n selected = new Set(),\n}: SuiteTableProps): React.ReactElement {\n // Calculate column widths\n const columnWidths = calculateColumnWidths(suites, selectable)\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box>\n {selectable && <Text>{' '.repeat(4)}</Text>}\n <Text bold>{padEnd('Status', columnWidths.status)}</Text>\n <Text> </Text>\n <Text bold>{padEnd('Suite', columnWidths.suite)}</Text>\n <Text> </Text>\n <Text bold>Reason</Text>\n </Box>\n\n {/* Separator */}\n <Box>\n <Text color=\"gray\">\n {'─'.repeat(\n (selectable ? 4 : 0) + columnWidths.status + columnWidths.suite + columnWidths.reason,\n )}\n </Text>\n </Box>\n\n {/* Rows */}\n {suites.map((suite) => (\n <Box key={suite.name}>\n {selectable && <Text>{selected.has(suite.name) ? '[✓] ' : '[ ] '}</Text>}\n <Box width={columnWidths.status}>\n <StatusBadge status={suite.status} />\n </Box>\n <Text> </Text>\n <Text>{padEnd(suite.name, columnWidths.suite)}</Text>\n <Text> </Text>\n <Text color=\"gray\">{suite.reason}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n\n/**\n * Column width information.\n * @internal\n */\ninterface ColumnWidths {\n status: number\n suite: number\n reason: number\n}\n\n/**\n * Calculate column widths based on content.\n * @internal\n */\nfunction calculateColumnWidths(suites: SuiteInfo[], _selectable: boolean): ColumnWidths {\n const statusHeader = 'Status'\n const suiteHeader = 'Suite'\n const reasonHeader = 'Reason'\n\n // Status column - fixed width for badges\n // Maximum status badge length is \"INVALIDATED\" (11 chars) + \"✓ \" (2 chars) = 13\n const statusWidth = Math.max(statusHeader.length, 13)\n\n // Suite column - max of header and all suite names\n const suiteWidth = Math.max(suiteHeader.length, ...suites.map((s) => s.name.length))\n\n // Reason column - max of header and all reasons\n const reasonWidth = Math.max(reasonHeader.length, ...suites.map((s) => s.reason.length))\n\n return {\n status: statusWidth,\n suite: suiteWidth,\n reason: reasonWidth,\n }\n}\n\n/**\n * Pad a string to the right with spaces.\n * @internal\n */\nfunction padEnd(str: string, width: number): string {\n return str.padEnd(width, ' ')\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\n\ninterface SelectionOption {\n /** Display label */\n label: string\n /** Value returned when selected */\n value: string\n /** Optional keyboard shortcut hint */\n hint?: string\n}\n\nexport interface SelectionPromptProps {\n /** Question to display */\n message: string\n /** Available options */\n options: SelectionOption[]\n /** Callback when option selected */\n onSelect: (value: string) => void\n /** Show group options if available */\n groups?: { name: string; label: string }[] | undefined\n}\n\n/**\n * Displays a selection prompt with keyboard hints.\n *\n * Example output:\n * Select suites to run:\n * [a] All pending [1-4] By number [n] None/exit\n * [g1] ui-tests [g2] behavior-tests\n */\nexport function SelectionPrompt({\n message,\n options,\n onSelect,\n groups,\n}: SelectionPromptProps): React.ReactElement {\n useInput((input) => {\n // Check if input matches any option's hint\n const matchedOption = options.find((opt) => opt.hint === input)\n if (matchedOption) {\n onSelect(matchedOption.value)\n return\n }\n\n // Check if input matches a group name\n if (groups) {\n const matchedGroup = groups.find((group) => group.name === input)\n if (matchedGroup) {\n onSelect(matchedGroup.name)\n }\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{message}</Text>\n <Box marginTop={1} gap={2}>\n {options.map((option) => (\n <Text key={option.value}>\n {option.hint && (\n <>\n <Text color=\"cyan\">[{option.hint}]</Text>{' '}\n </>\n )}\n {option.label}\n </Text>\n ))}\n </Box>\n {groups && groups.length > 0 && (\n <Box marginTop={1} gap={2}>\n {groups.map((group) => (\n <Text key={group.name}>\n <Text color=\"cyan\">[{group.name}]</Text> {group.label}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Header } from './Header.js'\nimport { SuiteTable } from './SuiteTable.js'\nimport { SelectionPrompt } from './SelectionPrompt.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\n\ninterface SuiteSelectorProps {\n /** All suites needing attestation */\n pendingSuites: SuiteStatus[]\n /** Valid suites (for \"Already valid\" display) */\n validSuites: SuiteStatus[]\n /** Available groups from config */\n groups?: Record<string, string[]> | undefined\n /** Called when user confirms selection */\n onSelect: (selectedSuites: string[]) => void\n /** Called when user exits */\n onExit: () => void\n}\n\n/**\n * Main suite selection UI component.\n *\n * Displays:\n * 1. Header with pending count\n * 2. Table of pending suites with checkboxes\n * 3. List of already valid suites\n * 4. Selection prompt with keyboard shortcuts\n *\n * Keyboard controls:\n * - a: Select all pending\n * - n: None/exit\n * - 1-9: Toggle individual suite by number\n * - g1, g2, etc: Select group (if groups available)\n * - Enter: Confirm selection\n * - Space: Toggle current suite\n * - Up/Down: Navigate\n */\nexport function SuiteSelector({\n pendingSuites,\n validSuites,\n groups,\n onSelect,\n onExit,\n}: SuiteSelectorProps): React.ReactElement {\n const [selectedSuites, setSelectedSuites] = React.useState<Set<string>>(new Set())\n const [cursorIndex, setCursorIndex] = React.useState(0)\n\n /**\n * Toggle suite selection state\n */\n const toggleSuite = React.useCallback((suiteName: string) => {\n setSelectedSuites((prev) => {\n const next = new Set(prev)\n if (next.has(suiteName)) {\n next.delete(suiteName)\n } else {\n next.add(suiteName)\n }\n return next\n })\n }, [])\n\n useInput((input, key) => {\n // 'a' - select all pending\n if (input === 'a') {\n setSelectedSuites(new Set(pendingSuites.map((s) => s.name)))\n return\n }\n\n // 'n' - none/exit\n if (input === 'n') {\n onExit()\n return\n }\n\n // Numbers 1-9 - toggle by number\n if (/^[1-9]$/.test(input)) {\n const idx = parseInt(input, 10) - 1\n if (idx < pendingSuites.length) {\n // eslint-disable-next-line security/detect-object-injection -- idx is bounds-checked against pendingSuites.length\n const suite = pendingSuites[idx]\n if (suite) {\n toggleSuite(suite.name)\n }\n }\n return\n }\n\n // Handle group shortcuts like 'g1', 'g2'\n if (input.startsWith('g') && groups) {\n const groupIdx = parseInt(input.slice(1), 10) - 1\n const groupNames = Object.keys(groups)\n if (groupIdx >= 0 && groupIdx < groupNames.length) {\n // eslint-disable-next-line security/detect-object-injection -- groupIdx is bounds-checked against groupNames.length\n const groupName = groupNames[groupIdx]\n if (groupName) {\n // eslint-disable-next-line security/detect-object-injection -- groupName is from Object.keys, so it's safe\n const groupSuites: string[] = groups[groupName] ?? []\n // Add all suites in this group to selection\n const newSelected = new Set(selectedSuites)\n groupSuites.forEach((s: string) => newSelected.add(s))\n setSelectedSuites(newSelected)\n }\n }\n return\n }\n\n // Enter - confirm selection\n if (key.return) {\n onSelect(Array.from(selectedSuites))\n return\n }\n\n // Space - toggle current\n if (input === ' ') {\n // eslint-disable-next-line security/detect-object-injection -- cursorIndex is bounds-checked via Math.min/Math.max\n const currentSuite = pendingSuites[cursorIndex]\n if (currentSuite) {\n toggleSuite(currentSuite.name)\n }\n return\n }\n\n // Arrow navigation\n if (key.upArrow) {\n setCursorIndex(Math.max(0, cursorIndex - 1))\n return\n }\n if (key.downArrow) {\n setCursorIndex(Math.min(pendingSuites.length - 1, cursorIndex + 1))\n return\n }\n })\n\n return (\n <Box flexDirection=\"column\">\n {/* Header showing pending count */}\n <Header pendingCount={pendingSuites.length} />\n\n <Box marginY={1}>\n {/* Table of pending suites with numbers and checkboxes */}\n <SuiteTable suites={pendingSuites} selectable={true} selected={selectedSuites} />\n </Box>\n\n {/* Show valid suites if any */}\n {validSuites.length > 0 && (\n <Box marginY={1} flexDirection=\"column\">\n <Text dimColor>Already valid:</Text>\n {validSuites.map((s) => (\n <Text key={s.name} dimColor>\n {' '}✓ {s.name} (attested {String(s.age ?? 0)} days ago)\n </Text>\n ))}\n </Box>\n )}\n\n {/* Selection prompt */}\n <SelectionPrompt\n message=\"Select suites to run:\"\n options={[\n { label: 'All pending', value: 'all', hint: 'a' },\n { label: 'By number', value: 'number', hint: '1-9' },\n { label: 'None/exit', value: 'none', hint: 'n' },\n ]}\n groups={\n groups\n ? Object.keys(groups).map((name, i) => ({\n name: `g${String(i + 1)}`,\n label: name,\n }))\n : undefined\n }\n onSelect={() => {\n /* Handled by useInput */\n }}\n />\n\n {/* Current selection count */}\n <Text color=\"cyan\">{selectedSuites.size} selected. Press Enter to confirm.</Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text } from 'ink'\n\nexport interface ProgressSummaryProps {\n /** Number of suites completed successfully */\n completed: number\n /** Number of suites remaining to run */\n remaining: number\n /** Number of suites that failed */\n failed: number\n /** Number of suites skipped by user */\n skipped: number\n}\n\n/**\n * Displays a summary box showing test run progress.\n *\n * Example output:\n * ┌─────────────────────────────────────────────────────────────┐\n * │ Completed: 2 Remaining: 2 Failed: 0 Skipped: 0 │\n * └─────────────────────────────────────────────────────────────┘\n */\nexport function ProgressSummary({\n completed,\n remaining,\n failed,\n skipped,\n}: ProgressSummaryProps): React.ReactElement {\n return (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text>\n <Text color=\"green\">Completed: {completed}</Text>\n {' '}\n <Text color=\"yellow\">Remaining: {remaining}</Text>\n {' '}\n <Text color=\"red\">Failed: {failed}</Text>\n {' '}\n <Text color=\"gray\">Skipped: {skipped}</Text>\n </Text>\n </Box>\n )\n}\n","import * as React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ProgressSummary } from './ProgressSummary.js'\n\ntype RunPhase = 'running' | 'confirming' | 'complete'\n\nexport interface TestRunnerProps {\n /** Suites to run in order */\n suites: string[]\n /** Execute a test command and return success/failure */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Called when all suites complete */\n onComplete: (results: RunResults) => void\n}\n\nexport interface RunResults {\n completed: string[]\n failed: string[]\n skipped: string[]\n}\n\n/**\n * Test runner component that executes suites and manages attestations.\n *\n * Flow for each suite:\n * 1. Show \"Running suite-name...\"\n * 2. Execute test command\n * 3. If passed, prompt \"Create attestation? [Y/n]\"\n * 4. If user confirms, create attestation\n * 5. Move to next suite\n *\n * If a test fails, it moves to the next suite without prompting for attestation.\n */\nexport function TestRunner({\n suites,\n executeTest,\n createAttestation,\n onComplete,\n}: TestRunnerProps): React.ReactElement {\n const [currentIndex, setCurrentIndex] = React.useState(0)\n const [phase, setPhase] = React.useState<RunPhase>('running')\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n const [_testPassed, setTestPassed] = React.useState(false)\n\n // Use a ref to store the latest results for the completion callback\n const resultsRef = React.useRef(results)\n React.useEffect(() => {\n resultsRef.current = results\n }, [results])\n\n // Effect to run tests\n React.useEffect(() => {\n if (phase !== 'running') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) {\n // All done - use ref to avoid stale closure\n onComplete(resultsRef.current)\n setPhase('complete')\n return\n }\n\n // Execute the test\n let cancelled = false\n executeTest(currentSuite)\n .then((passed) => {\n if (cancelled) return\n\n setTestPassed(passed)\n if (passed) {\n setPhase('confirming')\n } else {\n // Test failed, move to next\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n }\n })\n .catch(() => {\n if (cancelled) return\n\n // Execution error, treat as failed\n setResults((prev) => ({\n ...prev,\n failed: [...prev.failed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n })\n\n return () => {\n cancelled = true\n }\n }, [currentIndex, phase, suites, executeTest, onComplete])\n\n // Handle attestation confirmation\n useInput(\n (input, key) => {\n if (phase !== 'confirming') return\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n if (!currentSuite) return\n\n // Y or Enter = create attestation\n if (input.toLowerCase() === 'y' || key.return) {\n createAttestation(currentSuite)\n .then(() => {\n setResults((prev) => ({\n ...prev,\n completed: [...prev.completed, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n .catch(() => {\n // If attestation fails, still move on but mark as skipped\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n })\n }\n\n // N = skip attestation\n if (input.toLowerCase() === 'n') {\n setResults((prev) => ({\n ...prev,\n skipped: [...prev.skipped, currentSuite],\n }))\n setCurrentIndex((prev) => prev + 1)\n setPhase('running')\n }\n },\n { isActive: phase === 'confirming' },\n )\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n const currentSuite = suites[currentIndex]\n\n return (\n <Box flexDirection=\"column\">\n {/* Progress summary */}\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={suites.length - currentIndex}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {phase === 'running' && currentSuite && (\n <Box>\n <SimpleSpinner />\n <Text> Running {currentSuite}...</Text>\n </Box>\n )}\n\n {phase === 'confirming' && currentSuite && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ Tests passed!</Text>\n <Text>Create attestation for {currentSuite}? [Y/n]: </Text>\n </Box>\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites processed</Text>\n <Text>\n Completed: {results.completed.length}, Failed: {results.failed.length}, Skipped:{' '}\n {results.skipped.length}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Simple spinner component using ASCII animation frames.\n * Fallback for when no dedicated spinner library is available.\n */\nfunction SimpleSpinner(): React.ReactElement {\n const [frame, setFrame] = React.useState(0)\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setFrame((f) => (f + 1) % frames.length)\n }, 80)\n return () => {\n clearInterval(timer)\n }\n }, [])\n\n // eslint-disable-next-line security/detect-object-injection -- Safe array access with numeric index\n return <Text color=\"cyan\">{frames[frame]}</Text>\n}\n","import * as React from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport { SuiteSelector } from './SuiteSelector.js'\nimport { TestRunner } from './TestRunner.js'\nimport { ProgressSummary } from './ProgressSummary.js'\nimport type { SuiteStatus } from '../commands/run-utils.js'\nimport type { Config } from '@attest-it/core'\n\n/**\n * Current phase of the interactive run.\n */\ntype Phase = 'selecting' | 'running' | 'complete'\n\n/**\n * Props for the InteractiveRun component.\n */\nexport interface InteractiveRunProps {\n /** All suite statuses */\n allSuites: SuiteStatus[]\n /** Config for groups and settings */\n config: Config\n /** Execute test for a suite */\n executeTest: (suite: string) => Promise<boolean>\n /** Create attestation for a suite */\n createAttestation: (suite: string) => Promise<void>\n /** Save session state */\n saveSession: (completed: string[], failed: string[], remaining: string[]) => Promise<void>\n /** Optional: pre-selected suites from --continue */\n preSelected?: string[]\n}\n\n/**\n * Results from a test run.\n */\nexport interface RunResults {\n /** Suite names that completed successfully */\n completed: string[]\n /** Suite names that failed */\n failed: string[]\n /** Suite names that were skipped */\n skipped: string[]\n}\n\n/**\n * Main interactive run orchestrator.\n *\n * Phases:\n * 1. selecting - User selects which suites to run\n * 2. running - Tests executing, attestations being created\n * 3. complete - All done, show summary\n */\nexport function InteractiveRun({\n allSuites,\n config,\n executeTest,\n createAttestation,\n saveSession,\n preSelected,\n}: InteractiveRunProps): React.ReactElement {\n const { exit } = useApp()\n\n const [phase, setPhase] = React.useState<Phase>(preSelected ? 'running' : 'selecting')\n const [selectedSuites, setSelectedSuites] = React.useState<string[]>(preSelected ?? [])\n const [results, setResults] = React.useState<RunResults>({\n completed: [],\n failed: [],\n skipped: [],\n })\n\n // Compute pending suites (not VALID)\n const pendingSuites = React.useMemo(\n () => allSuites.filter((s) => s.status !== 'VALID'),\n [allSuites],\n )\n\n // Compute valid suites (already attested)\n const validSuites = React.useMemo(\n () => allSuites.filter((s) => s.status === 'VALID'),\n [allSuites],\n )\n\n // Handle selection completion\n const handleSelect = React.useCallback(\n (selected: string[]) => {\n if (selected.length === 0) {\n exit()\n return\n }\n setSelectedSuites(selected)\n setPhase('running')\n },\n [exit],\n )\n\n // Handle run completion (wrapped to avoid promise return in void context)\n const handleRunComplete = React.useCallback(\n (runResults: RunResults) => {\n void (async () => {\n setResults(runResults)\n\n // Save final session state (clear if all done successfully)\n if (runResults.failed.length === 0 && runResults.skipped.length === 0) {\n // All completed - clear session\n await saveSession([], [], [])\n } else {\n // Some remaining - save for --continue\n await saveSession(runResults.completed, runResults.failed, [])\n }\n\n setPhase('complete')\n })()\n },\n [saveSession],\n )\n\n // Handle case where there are no pending suites\n if (pendingSuites.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">✓ All suites are valid. Nothing to run.</Text>\n {validSuites.length > 0 && (\n <Text dimColor>{validSuites.length} suite(s) already attested.</Text>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {phase === 'selecting' && (\n <SuiteSelector\n pendingSuites={pendingSuites}\n validSuites={validSuites}\n groups={config.groups}\n onSelect={handleSelect}\n onExit={() => {\n exit()\n }}\n />\n )}\n\n {phase === 'running' && (\n <TestRunner\n suites={selectedSuites}\n executeTest={executeTest}\n createAttestation={createAttestation}\n onComplete={handleRunComplete}\n />\n )}\n\n {phase === 'complete' && (\n <Box flexDirection=\"column\">\n <ProgressSummary\n completed={results.completed.length}\n failed={results.failed.length}\n remaining={0}\n skipped={results.skipped.length}\n />\n\n <Box marginY={1}>\n {results.failed.length === 0 && results.skipped.length === 0 ? (\n <Text color=\"green\">✓ All suites attested successfully!</Text>\n ) : (\n <Box flexDirection=\"column\">\n {results.failed.length > 0 && (\n <Text color=\"red\">\n ✗ {results.failed.length} suite(s) failed: {results.failed.join(', ')}\n </Text>\n )}\n <Text>Run `attest-it run` again to continue with remaining suites.</Text>\n </Box>\n )}\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n","/**\n * Shared utilities for the run command.\n *\n * Provides functions for checking suite status, filtering suites,\n * and formatting status information.\n *\n * @packageDocumentation\n */\n\nimport type { Config, VerificationStatus, Attestation, AttestationsFile } from '@attest-it/core'\nimport { computeFingerprint, readAttestations, findAttestation } from '@attest-it/core'\n\n/**\n * Information about a suite's current status.\n * @public\n */\nexport interface SuiteStatus {\n /** Suite name */\n name: string\n /** Current verification status */\n status: VerificationStatus\n /** Human-readable reason for the status */\n reason: string\n /** Current fingerprint of source files */\n currentFingerprint: string\n /** Fingerprint from existing attestation (if any) */\n attestedFingerprint?: string | undefined\n /** ISO timestamp of attestation (if any) */\n attestedAt?: string | undefined\n /** Days since attestation (if any) */\n age?: number | undefined\n}\n\n/**\n * Determine the verification status for a suite.\n *\n * @param attestation - Existing attestation, if any\n * @param currentFingerprint - Current computed fingerprint\n * @param maxAgeDays - Maximum allowed age in days\n * @returns Verification status\n * @internal\n */\nfunction determineStatus(\n attestation: Attestation | null | undefined,\n currentFingerprint: string,\n maxAgeDays: number,\n): VerificationStatus {\n if (!attestation) {\n return 'NEEDS_ATTESTATION'\n }\n\n if (attestation.fingerprint !== currentFingerprint) {\n return 'FINGERPRINT_CHANGED'\n }\n\n const attestedAt = new Date(attestation.attestedAt)\n const ageInDays = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n\n if (ageInDays > maxAgeDays) {\n return 'EXPIRED'\n }\n\n return 'VALID'\n}\n\n/**\n * Get status information for all suites.\n *\n * @param config - Configuration object\n * @returns Array of suite statuses\n * @public\n */\nexport async function getAllSuiteStatuses(config: Config): Promise<SuiteStatus[]> {\n // Load attestations (may not exist)\n let attestationsFile: AttestationsFile | null = null\n try {\n attestationsFile = await readAttestations(config.settings.attestationsPath)\n } catch (err) {\n // Attestations file may not exist yet - that's okay\n if (err instanceof Error && !err.message.includes('ENOENT')) {\n throw err\n }\n }\n const attestations = attestationsFile?.attestations ?? []\n\n const results: SuiteStatus[] = []\n\n for (const [suiteName, suiteConfig] of Object.entries(config.suites)) {\n // Determine fingerprint paths - either from suite's packages or from referenced gate\n let packages: string[] | undefined\n let ignore: string[] | undefined\n\n if (suiteConfig.gate && config.gates) {\n // Suite references a gate - use gate's fingerprint config\n const gateConfig = config.gates[suiteConfig.gate]\n if (gateConfig) {\n packages = gateConfig.fingerprint.paths\n ignore = gateConfig.fingerprint.exclude\n }\n } else if (suiteConfig.packages) {\n // Legacy: suite defines packages directly\n packages = suiteConfig.packages\n ignore = suiteConfig.ignore\n }\n\n // Skip if we couldn't resolve fingerprint paths\n if (!packages || packages.length === 0) {\n continue\n }\n\n // Compute current fingerprint\n const fingerprintResult = await computeFingerprint({\n packages,\n ...(ignore && { ignore }),\n })\n\n // Find existing attestation\n const attestation = findAttestation(\n { schemaVersion: '1', attestations, signature: '' },\n suiteName,\n )\n\n // Determine status\n const status = determineStatus(\n attestation,\n fingerprintResult.fingerprint,\n config.settings.maxAgeDays,\n )\n\n // Calculate age\n let age: number | undefined\n if (attestation) {\n const attestedAt = new Date(attestation.attestedAt)\n age = Math.floor((Date.now() - attestedAt.getTime()) / (1000 * 60 * 60 * 24))\n }\n\n results.push({\n name: suiteName,\n status,\n reason: formatStatusReason(status, age, config.settings.maxAgeDays),\n currentFingerprint: fingerprintResult.fingerprint,\n attestedFingerprint: attestation?.fingerprint,\n attestedAt: attestation?.attestedAt,\n age,\n })\n }\n\n return results\n}\n\n/**\n * Get suites that need attestation (not VALID).\n *\n * @param config - Configuration object\n * @returns Array of suite statuses that are not valid\n * @public\n */\nexport async function getSuitesNeedingAttestation(config: Config): Promise<SuiteStatus[]> {\n const allStatuses = await getAllSuiteStatuses(config)\n return allStatuses.filter((s) => s.status !== 'VALID')\n}\n\n/**\n * Filter suites by a glob/regex pattern.\n * Matches against suite name.\n *\n * @param suites - Array of suite statuses to filter\n * @param pattern - Pattern to match (supports * wildcard)\n * @returns Filtered array of suite statuses\n * @public\n */\nexport function filterByPattern(suites: SuiteStatus[], pattern: string): SuiteStatus[] {\n // Support simple glob patterns: * matches anything\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$', 'i')\n return suites.filter((s) => regex.test(s.name))\n}\n\n/**\n * Get suites belonging to a group.\n *\n * @param groupName - Name of the group\n * @param config - Configuration object\n * @returns Array of suite names in the group\n * @public\n */\nexport function getSuitesInGroup(groupName: string, config: Config): string[] {\n // eslint-disable-next-line security/detect-object-injection -- groupName is a user parameter, but we safely return empty array if not found\n return config.groups?.[groupName] ?? []\n}\n\n/**\n * Format a human-readable reason for a suite's status.\n *\n * @param status - Verification status\n * @param age - Age in days (if available)\n * @param maxAgeDays - Maximum allowed age in days (if available)\n * @returns Human-readable status reason\n * @public\n */\nexport function formatStatusReason(\n status: VerificationStatus,\n age?: number,\n maxAgeDays?: number,\n): string {\n switch (status) {\n case 'VALID':\n return `Attested ${String(age ?? 0)} days ago`\n case 'NEEDS_ATTESTATION':\n return 'No attestation found'\n case 'FINGERPRINT_CHANGED':\n return 'Source files modified'\n case 'EXPIRED':\n return `${String(age ?? 0)} days old (max: ${String(maxAgeDays ?? 30)})`\n case 'SIGNATURE_INVALID':\n return 'Signature verification failed'\n case 'INVALIDATED_BY_PARENT':\n return 'Invalidated by parent suite'\n default:\n return status\n }\n}\n","import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'\nimport { join, dirname } from 'node:path'\n\n/**\n * Session state for interrupted run recovery.\n */\nexport interface Session {\n /** ISO timestamp when session started */\n started: string\n /** Suites selected by user for this session */\n selected: string[]\n /** Suites that completed successfully */\n completed: string[]\n /** Suites that failed */\n failed: string[]\n /** Suites not yet run (selected - completed - failed) */\n remaining: string[]\n}\n\n/**\n * Get the path to the session file.\n * Returns `.attest-it/session.json` relative to current working directory.\n */\nexport function getSessionPath(): string {\n return join(process.cwd(), '.attest-it', 'session.json')\n}\n\n/**\n * Load an existing session from disk.\n * Returns null if no session exists or session is invalid.\n */\nexport async function loadSession(): Promise<Session | null> {\n try {\n const content = await readFile(getSessionPath(), 'utf-8')\n const data: unknown = JSON.parse(content)\n\n // Validate session structure\n if (!isValidSession(data)) {\n return null\n }\n\n return data\n } catch {\n // File doesn't exist or is unreadable\n return null\n }\n}\n\n/**\n * Save session state to disk.\n * Creates .attest-it directory if it doesn't exist.\n */\nexport async function saveSession(session: Session): Promise<void> {\n const sessionPath = getSessionPath()\n const dir = dirname(sessionPath)\n\n // Create directory if it doesn't exist\n await mkdir(dir, { recursive: true })\n\n // Write session file\n await writeFile(sessionPath, JSON.stringify(session, null, 2), 'utf-8')\n}\n\n/**\n * Delete the session file.\n * Call this when a session completes successfully.\n */\nexport async function clearSession(): Promise<void> {\n try {\n await unlink(getSessionPath())\n } catch {\n // File doesn't exist - that's fine\n }\n}\n\n/**\n * Create a new session with the given selected suites.\n */\nexport function createSession(selected: string[]): Session {\n return {\n started: new Date().toISOString(),\n selected: [...selected],\n completed: [],\n failed: [],\n remaining: [...selected],\n }\n}\n\n/**\n * Update session after a suite completes.\n */\nexport function updateSessionAfterSuite(\n session: Session,\n suite: string,\n success: boolean,\n): Session {\n const remaining = session.remaining.filter((s) => s !== suite)\n return {\n ...session,\n completed: success ? [...session.completed, suite] : session.completed,\n failed: success ? session.failed : [...session.failed, suite],\n remaining,\n }\n}\n\n/**\n * Type guard to validate session structure.\n */\nfunction isValidSession(data: unknown): data is Session {\n if (typeof data !== 'object' || data === null) {\n return false\n }\n\n // We need to access properties of unknown object, so we check each property\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const obj = data as Record<string, unknown>\n\n return (\n typeof obj.started === 'string' &&\n Array.isArray(obj.selected) &&\n obj.selected.every((item) => typeof item === 'string') &&\n Array.isArray(obj.completed) &&\n obj.completed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.failed) &&\n obj.failed.every((item) => typeof item === 'string') &&\n Array.isArray(obj.remaining) &&\n obj.remaining.every((item) => typeof item === 'string')\n )\n}\n","/**\n * Entry point for interactive run mode.\n *\n * This module bridges the Commander.js CLI and the React-based interactive UI.\n * It handles:\n * - Loading configuration and suite statuses\n * - Checking for session resumption (--continue)\n * - Dry run mode (just show what would run)\n * - Rendering the InteractiveRun component with ink\n * - Providing test execution and attestation creation callbacks\n *\n * @packageDocumentation\n */\n\nimport * as React from 'react'\nimport { render } from 'ink'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n computeFingerprint,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n type Config,\n type KeyProvider,\n} from '@attest-it/core'\nimport { InteractiveRun } from '../components/InteractiveRun.js'\nimport { getAllSuiteStatuses, type SuiteStatus } from './run-utils.js'\nimport { loadSession, saveSession as persistSession, clearSession } from '../session/session.js'\nimport { error, log } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\n/**\n * Options for interactive mode.\n * @public\n */\nexport interface InteractiveOptions {\n /** Show what would run without executing */\n dryRun?: boolean | undefined\n /** Resume from saved session */\n continue?: boolean | undefined\n /** Filter pattern for suite names */\n filter?: string | undefined\n}\n\n/**\n * Run the interactive mode UI.\n *\n * @param options - Interactive mode options\n * @public\n */\nexport async function runInteractive(options: InteractiveOptions): Promise<void> {\n // Load config\n const config = await loadConfig()\n\n // Get all suite statuses\n const allSuites = await getAllSuiteStatuses(config)\n\n // Check if resuming from session\n let preSelected: string[] | undefined\n if (options.continue) {\n const session = await loadSession()\n if (session && session.remaining.length > 0) {\n preSelected = session.remaining\n log(`Resuming session with ${String(preSelected.length)} remaining suite(s)`)\n }\n }\n\n // Dry run mode - just show what would run\n if (options.dryRun) {\n handleDryRun(allSuites, config, options.filter)\n return\n }\n\n // Check for pending suites\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Create test executor\n const executeTest = createTestExecutor(config)\n\n // Create attestation creator\n const createAttestationFn = createAttestationCreator(config)\n\n // Create session saver\n const saveSessionFn = createSessionSaver()\n\n // Render the interactive UI\n const interactiveRunProps = {\n allSuites,\n config,\n executeTest,\n createAttestation: createAttestationFn,\n saveSession: saveSessionFn,\n ...(preSelected !== undefined && { preSelected }),\n }\n\n const { waitUntilExit } = render(<InteractiveRun {...interactiveRunProps} />)\n\n // Wait for UI to exit\n await waitUntilExit()\n}\n\n/**\n * Handle dry run mode.\n * Shows what would run without actually executing.\n *\n * @param allSuites - All suite statuses\n * @param config - Configuration object\n * @param filterPattern - Optional filter pattern\n * @internal\n */\nfunction handleDryRun(allSuites: SuiteStatus[], config: Config, filterPattern?: string): void {\n let pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (filterPattern) {\n const regex = new RegExp('^' + filterPattern.replace(/\\*/g, '.*') + '$', 'i')\n pendingSuites = pendingSuites.filter((s) => regex.test(s.name))\n }\n\n if (pendingSuites.length === 0) {\n log('No suites would run (all valid or filtered out).')\n process.exit(ExitCode.NO_WORK)\n }\n\n log(`Would run ${String(pendingSuites.length)} suite(s):`)\n pendingSuites.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n log('')\n log('Use `attest-it run` to execute.')\n process.exit(ExitCode.SUCCESS)\n}\n\n/**\n * Create a test executor function for a suite.\n *\n * @param config - Configuration object\n * @returns Function that executes a suite's test command\n * @internal\n */\nfunction createTestExecutor(config: Config): (suite: string) => Promise<boolean> {\n return async (suiteName: string): Promise<boolean> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n return false\n }\n\n // Build command\n let command = suiteConfig.command ?? config.settings.defaultCommand\n if (!command) {\n error(`No command specified for suite \"${suiteName}\"`)\n return false\n }\n\n // Substitute ${files} if present\n if (command.includes('${files}') && suiteConfig.files) {\n command = command.replaceAll('${files}', suiteConfig.files.join(' '))\n }\n\n log(`Running: ${command}`)\n\n // Execute command\n const exitCode = await executeCommand(command)\n return exitCode === 0\n }\n}\n\n/**\n * Create an attestation creator function.\n *\n * @param config - Configuration object\n * @returns Function that creates and saves an attestation for a suite\n * @internal\n */\nfunction createAttestationCreator(config: Config): (suite: string) => Promise<void> {\n return async (suiteName: string): Promise<void> => {\n // eslint-disable-next-line security/detect-object-injection -- Safe access with validated suite name\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n throw new Error(`Suite \"${suiteName}\" not found`)\n }\n\n if (!suiteConfig.packages) {\n throw new Error(`Suite \"${suiteName}\" has no packages defined`)\n }\n\n // Compute fingerprint\n const fingerprintResult = await computeFingerprint({\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n })\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command: suiteConfig.command ?? config.settings.defaultCommand ?? '',\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath).catch(() => null)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n const providerName = keyProvider.displayName\n const keygenMessage =\n keyProvider.type === 'filesystem'\n ? 'Run \"attest-it keygen\" first to generate a keypair.'\n : 'Run \"attest-it keygen\" to generate and store a key.'\n throw new Error(`Private key not found in ${providerName}. ${keygenMessage}`)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n log(`✓ Attestation created for ${suiteName}`)\n }\n}\n\n/**\n * Create session saver function.\n *\n * @returns Function that saves or clears session state\n * @internal\n */\nfunction createSessionSaver(): (\n completed: string[],\n failed: string[],\n remaining: string[],\n) => Promise<void> {\n return async (completed: string[], failed: string[], remaining: string[]): Promise<void> => {\n if (completed.length === 0 && failed.length === 0 && remaining.length === 0) {\n // All done - clear session\n await clearSession()\n } else {\n // Save session for --continue\n await persistSession({\n started: new Date().toISOString(),\n selected: [...completed, ...failed, ...remaining],\n completed,\n failed,\n remaining,\n })\n }\n }\n}\n\n/**\n * Execute a shell command and return exit code.\n *\n * @param command - Shell command to execute\n * @returns Promise resolving to exit code\n * @internal\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n const parsed = parseShellCommand(command)\n const stringArgs = parsed.filter((t): t is string => typeof t === 'string')\n\n if (stringArgs.length === 0) {\n error('Empty command')\n resolve(1)\n return\n }\n\n const [executable, ...args] = stringArgs\n if (!executable) {\n resolve(1)\n return\n }\n\n const child = spawn(executable, args, { stdio: 'inherit' })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n child.on('error', (err) => {\n error(`Command failed: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check for uncommitted changes in the working tree.\n *\n * @returns Promise resolving to true if there are uncommitted changes\n * @internal\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n resolve(output.trim().length > 0)\n })\n child.on('error', () => {\n resolve(false)\n })\n })\n}\n","/**\n * Run command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport * as os from 'node:os'\nimport { parse as parseShellCommand } from 'shell-quote'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprint,\n computeFingerprintSync,\n readAttestations,\n writeSignedAttestations,\n upsertAttestation,\n createAttestation,\n getDefaultPrivateKeyPath,\n FilesystemKeyProvider,\n KeyProviderRegistry,\n loadLocalConfigSync,\n getActiveIdentity,\n isAuthorizedSigner,\n createSeal,\n readSealsSync,\n writeSealsSync,\n type Config,\n type KeyProvider,\n type Identity,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { confirmAction } from '../utils/prompts.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { runInteractive } from './run-interactive.js'\nimport { getAllSuiteStatuses } from './run-utils.js'\n\nexport const runCommand = new Command('run')\n .description('Execute tests and create attestation')\n .option('-s, --suite <name>', 'Run specific suite (required unless --all or interactive mode)')\n .option('-a, --all', 'Run all suites needing attestation')\n .option('--no-attest', 'Run tests without creating attestation')\n .option('--dry-run', 'Show what would run without executing')\n .option('-c, --continue', 'Resume interrupted session')\n .option('--filter <pattern>', 'Filter suites by pattern (glob-style)')\n .action(async (options: RunOptions) => {\n await runTests(options)\n })\n\ninterface RunOptions {\n suite?: string\n all?: boolean\n attest?: boolean // Note: --no-attest sets this to false\n dryRun?: boolean\n continue?: boolean\n filter?: string\n}\n\n/**\n * Run tests and create attestations.\n *\n * Routes to the appropriate execution mode based on options:\n * - Direct mode: --suite specified\n * - All pending mode: --all specified\n * - Interactive mode: no --suite and no --all\n *\n * @param options - Command options\n * @param options.suite - Run specific suite\n * @param options.all - Run all suites needing attestation\n * @param options.attest - Create attestation after tests (default: true)\n * @param options.dryRun - Show what would run without executing\n * @param options.continue - Resume interrupted session\n * @param options.filter - Filter suites by pattern\n * @public\n */\nasync function runTests(options: RunOptions): Promise<void> {\n try {\n // If --suite provided, use existing direct mode\n if (options.suite) {\n await runDirectMode(options)\n return\n }\n\n // If --all with no --suite, run all pending non-interactively\n if (options.all) {\n await runAllPending(options)\n return\n }\n\n // No --suite and no --all means interactive mode\n // This includes: no args, --dry-run, --continue, --filter\n await runInteractive({\n dryRun: options.dryRun,\n continue: options.continue,\n filter: options.filter,\n })\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Build the test command to execute.\n *\n * Uses suite-specific command if provided, otherwise falls back to\n * default command from settings. Substitutes ${files} placeholder\n * with suite file patterns.\n *\n * @param config - Configuration object\n * @param suiteCommand - Suite-specific command (optional)\n * @param suiteFiles - File patterns for suite (optional)\n * @returns Constructed command string\n * @public\n */\nfunction buildCommand(config: Config, suiteCommand?: string, suiteFiles?: string[]): string {\n // Use suite command if specified, otherwise default\n let command = suiteCommand ?? config.settings.defaultCommand\n\n if (!command) {\n error('No command specified for suite and no defaultCommand in settings')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Substitute ${files} if present (replace all occurrences)\n if (command.includes('${files}') && suiteFiles) {\n const files = suiteFiles.join(' ')\n command = command.replaceAll('${files}', files)\n }\n\n return command\n}\n\n/**\n * Parsed command result.\n */\ninterface ParsedCommand {\n executable: string\n args: string[]\n}\n\n/**\n * Parse a command string into executable and arguments.\n *\n * Uses shell-quote to safely parse shell syntax without using shell: true.\n *\n * @param command - Command string to parse\n * @returns Parsed command with executable and arguments\n * @throws Error if command is empty or contains only control operators\n * @public\n */\nfunction parseCommand(command: string): ParsedCommand {\n const parsed = parseShellCommand(command)\n\n // shell-quote returns an array of strings and special control operators\n // We only want the string arguments\n const stringArgs = parsed.filter((token): token is string => {\n return typeof token === 'string'\n })\n\n if (stringArgs.length === 0) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n const [executable, ...args] = stringArgs\n // TypeScript doesn't know that stringArgs.length > 0 guarantees executable is defined\n // The check above ensures stringArgs[0] exists, but we assert it for type safety\n if (executable === undefined) {\n throw new Error('Command string is empty or contains only control operators')\n }\n\n return { executable, args }\n}\n\n/**\n * Execute a command and return its exit code.\n *\n * Spawns a child process and streams output to the terminal.\n *\n * @param command - Command string to execute\n * @returns Exit code from the command (0 for success)\n * @public\n */\nasync function executeCommand(command: string): Promise<number> {\n return new Promise((resolve) => {\n let parsed: ParsedCommand\n try {\n parsed = parseCommand(command)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to parse command: ${err.message}`)\n } else {\n error('Failed to parse command: Unknown error')\n }\n resolve(1)\n return\n }\n\n const child = spawn(parsed.executable, parsed.args, {\n stdio: 'inherit', // Stream output to terminal\n })\n\n child.on('close', (code) => {\n resolve(code ?? 1)\n })\n\n child.on('error', (err) => {\n error(`Failed to execute command: ${err.message}`)\n resolve(1)\n })\n })\n}\n\n/**\n * Check if the git working tree has uncommitted changes.\n *\n * @returns True if there are uncommitted changes, false otherwise\n * @public\n */\nasync function checkDirtyWorkingTree(): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('git', ['status', '--porcelain'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let output = ''\n child.stdout.on('data', (data: Buffer) => {\n output += data.toString()\n })\n\n child.on('close', () => {\n // If output is non-empty, there are uncommitted changes\n resolve(output.trim().length > 0)\n })\n\n child.on('error', () => {\n // If git not available, assume not dirty\n resolve(false)\n })\n })\n}\n\n/**\n * Run tests for a specific suite (direct mode with --suite).\n *\n * @param options - Run options with suite specified\n * @public\n */\nasync function runDirectMode(options: RunOptions): Promise<void> {\n if (!options.suite) {\n error('Suite name is required for direct mode')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load config\n const config = await loadConfig()\n\n // Validate suite exists\n if (!config.suites[options.suite]) {\n error(`Suite \"${options.suite}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run the suite\n await runSingleSuite(options.suite, config, options)\n\n log('')\n success('Suite completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run all suites that need attestation (--all mode).\n *\n * @param options - Run options\n * @public\n */\nasync function runAllPending(options: RunOptions): Promise<void> {\n const config = await loadConfig()\n const allSuites = await getAllSuiteStatuses(config)\n const pendingSuites = allSuites.filter((s) => s.status !== 'VALID')\n\n if (pendingSuites.length === 0) {\n log('All suites are valid. Nothing to run.')\n process.exit(ExitCode.NO_WORK)\n }\n\n // Apply filter if specified\n let suitesToRun = pendingSuites\n if (options.filter) {\n const regex = new RegExp('^' + options.filter.replace(/\\*/g, '.*') + '$', 'i')\n suitesToRun = pendingSuites.filter((s) => regex.test(s.name))\n\n if (suitesToRun.length === 0) {\n log(`No suites match filter: ${options.filter}`)\n process.exit(ExitCode.NO_WORK)\n }\n }\n\n // Dry run - just show and exit\n if (options.dryRun) {\n log(`Would run ${String(suitesToRun.length)} suite(s):`)\n suitesToRun.forEach((s, i) => {\n log(` ${String(i + 1)}. ${s.name} (${s.status})`)\n })\n process.exit(ExitCode.SUCCESS)\n }\n\n // Check for dirty working tree\n const isDirty = await checkDirtyWorkingTree()\n if (isDirty) {\n error('Working tree has uncommitted changes. Please commit or stash before attesting.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Run each suite using existing direct mode logic\n for (const suite of suitesToRun) {\n await runSingleSuite(suite.name, config, options)\n }\n\n log('')\n success('All suites completed!')\n log(\n `\\nTo commit: git add ${config.settings.attestationsPath} && git commit -m \"Update attestations\"`,\n )\n}\n\n/**\n * Run a single suite's tests and optionally create an attestation.\n *\n * @param suiteName - Name of the suite to run\n * @param config - Configuration object\n * @param options - Run options\n * @public\n */\nasync function runSingleSuite(\n suiteName: string,\n config: Config,\n options: RunOptions,\n): Promise<void> {\n // eslint-disable-next-line security/detect-object-injection -- suiteName is from validated config keys\n const suiteConfig = config.suites[suiteName]\n if (!suiteConfig) {\n error(`Suite \"${suiteName}\" not found in config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n if (!suiteConfig.packages) {\n error(`Suite \"${suiteName}\" has no packages defined`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log(`\\n=== Running suite: ${suiteName} ===\\n`)\n\n // Compute fingerprint before running\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const fingerprintResult = await computeFingerprint(fingerprintOptions)\n verbose(`Fingerprint: ${fingerprintResult.fingerprint}`)\n verbose(`Files: ${String(fingerprintResult.fileCount)}`)\n\n // Build the test command\n const command = buildCommand(config, suiteConfig.command, suiteConfig.files)\n log(`Running: ${command}`)\n log('')\n\n // Execute tests\n const exitCode = await executeCommand(command)\n\n if (exitCode !== 0) {\n error(`Tests failed with exit code ${String(exitCode)}`)\n process.exit(ExitCode.FAILURE)\n }\n\n success('Tests passed!')\n\n // Skip attestation if --no-attest\n if (options.attest === false) {\n log('Skipping attestation (--no-attest)')\n return\n }\n\n // Confirm attestation\n const shouldAttest = await confirmAction({\n message: 'Create attestation',\n default: false,\n })\n\n if (!shouldAttest) {\n warn('Attestation cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Create attestation\n const attestation = createAttestation({\n suite: suiteName,\n fingerprint: fingerprintResult.fingerprint,\n command,\n attestedBy: os.userInfo().username,\n })\n\n // Load existing attestations\n const attestationsPath = config.settings.attestationsPath\n const existingFile = await readAttestations(attestationsPath)\n const existingAttestations = existingFile?.attestations ?? []\n\n // Upsert the new attestation\n const newAttestations = upsertAttestation(existingAttestations, attestation)\n\n // Set up key provider from config or use default\n let keyProvider: KeyProvider\n let keyRef: string\n\n if (config.settings.keyProvider) {\n keyProvider = KeyProviderRegistry.create({\n type: config.settings.keyProvider.type,\n options: config.settings.keyProvider.options ?? {},\n })\n if (config.settings.keyProvider.type === 'filesystem') {\n keyRef = config.settings.keyProvider.options?.privateKeyPath ?? getDefaultPrivateKeyPath()\n } else if (config.settings.keyProvider.type === '1password') {\n keyRef = config.settings.keyProvider.options?.itemName ?? 'attest-it-private-key'\n } else {\n throw new Error(`Unsupported key provider type: ${config.settings.keyProvider.type}`)\n }\n } else {\n // Default to filesystem provider with default path\n keyProvider = new FilesystemKeyProvider()\n keyRef = getDefaultPrivateKeyPath()\n }\n\n // Check if key exists\n if (!(await keyProvider.keyExists(keyRef))) {\n error(`Private key not found in ${keyProvider.displayName}`)\n if (keyProvider.type === 'filesystem') {\n error('Run \"attest-it identity create\" first to generate a keypair.')\n } else {\n error('Run \"attest-it identity create\" to generate and store a key.')\n }\n process.exit(ExitCode.MISSING_KEY)\n }\n\n // Write signed attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: newAttestations,\n keyProvider,\n keyRef,\n })\n\n success(`Attestation created for ${suiteName}`)\n log(` Fingerprint: ${fingerprintResult.fingerprint}`)\n log(` Attested by: ${attestation.attestedBy}`)\n log(` Attested at: ${attestation.attestedAt}`)\n\n // Check if this suite has a linked gate, and if so, prompt for seal\n if (suiteConfig.gate) {\n await promptForSeal(suiteName, suiteConfig.gate, config)\n }\n}\n\n/**\n * Prompt for seal creation after successful suite execution.\n *\n * @param suiteName - Name of the suite that was executed\n * @param gateId - ID of the gate linked to the suite\n * @param config - Configuration object\n */\nasync function promptForSeal(suiteName: string, gateId: string, config: Config): Promise<void> {\n log('')\n log(`Suite '${suiteName}' is linked to gate '${gateId}'`)\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n warn('No local identity configuration found - cannot create seal')\n warn('Run \"attest-it identity create\" to set up your identity')\n return\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n warn(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n return\n }\n\n // Convert to AttestItConfig\n const attestItConfig = toAttestItConfig(config)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(attestItConfig, gateId, identity.publicKey)\n if (!authorized) {\n warn(`You are not authorized to seal gate '${gateId}'`)\n return\n }\n\n // Prompt for seal confirmation\n const shouldSeal = await confirmAction({\n message: `Create seal for gate '${gateId}'`,\n default: true,\n })\n\n if (!shouldSeal) {\n log('Seal creation skipped')\n return\n }\n\n try {\n // Get gate config\n if (!attestItConfig.gates?.[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n return\n }\n\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n\n // Compute fingerprint for the gate\n const gateFingerprint = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n const keyRef = getKeyRefFromIdentity(identity)\n\n // Get private key from provider\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal using identity slug (not display name) for verification lookup\n const identitySlug = localConfig.activeIdentity\n const seal = createSeal({\n gateId,\n fingerprint: gateFingerprint.fingerprint,\n sealedBy: identitySlug,\n privateKey: privateKeyPem,\n })\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n // Write seals file\n writeSealsSync(projectRoot, sealsFile, attestItConfig.settings.sealsPath)\n\n success(`Seal created for gate '${gateId}'`)\n log(` Sealed by: ${identitySlug} (${identity.name})`)\n log(` Timestamp: ${seal.timestamp}`)\n } catch (err) {\n if (err instanceof Error) {\n error(`Failed to create seal: ${err.message}`)\n } else {\n error('Failed to create seal: Unknown error')\n }\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n service: privateKey.service,\n account: privateKey.account,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n case 'yubikey':\n return KeyProviderRegistry.create({\n type: 'yubikey',\n options: {\n encryptedKeyPath: privateKey.encryptedKeyPath,\n slot: privateKey.slot,\n serial: privateKey.serial,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n return `${privateKey.service}:${privateKey.account}`\n case '1password':\n return privateKey.item\n case 'yubikey':\n return privateKey.encryptedKeyPath\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n// Export for testing\nexport { buildCommand, parseCommand, executeCommand, checkDirtyWorkingTree }\n","/**\n * Prune command implementation for attest-it CLI.\n */\n\nimport { Command } from 'commander'\nimport * as fs from 'node:fs'\nimport {\n loadConfig,\n readAttestations,\n writeSignedAttestations,\n computeFingerprint,\n getDefaultPrivateKeyPath,\n type Attestation,\n} from '@attest-it/core'\nimport { log, success, error, info, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const pruneCommand = new Command('prune')\n .description('Remove stale attestations')\n .option('-n, --dry-run', 'Show what would be removed without removing')\n .option('-k, --keep-days <n>', 'Keep attestations newer than n days', '30')\n .action(async (options: PruneOptions) => {\n await runPrune(options)\n })\n\ninterface PruneOptions {\n dryRun?: boolean\n keepDays: string\n}\n\n/**\n * Run the prune command to remove stale attestations.\n *\n * Removes attestations that are outdated (older than keepDays and\n * fingerprint doesn't match current code) or orphaned (suite no\n * longer exists in config). Re-signs the attestations file.\n *\n * @param options - Command options\n * @param options.dryRun - Show what would be removed without removing\n * @param options.keepDays - Keep attestations newer than n days\n * @public\n */\nasync function runPrune(options: PruneOptions): Promise<void> {\n try {\n const keepDays = parseInt(options.keepDays, 10)\n if (isNaN(keepDays) || keepDays < 1) {\n error('--keep-days must be a positive integer')\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n\n // Load config\n const config = await loadConfig()\n\n // Load attestations\n const attestationsPath = config.settings.attestationsPath\n const file = await readAttestations(attestationsPath)\n\n if (!file || file.attestations.length === 0) {\n info('No attestations to prune')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n const now = Date.now()\n const keepMs = keepDays * 24 * 60 * 60 * 1000\n\n // Identify stale attestations\n const stale: Attestation[] = []\n const keep: Attestation[] = []\n\n for (const attestation of file.attestations) {\n const attestedAt = new Date(attestation.attestedAt).getTime()\n const ageMs = now - attestedAt\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n // Check if suite still exists in config\n const suiteExists = attestation.suite in config.suites\n\n // Check if fingerprint still matches current code\n let fingerprintMatches = false\n if (suiteExists) {\n const suiteConfig = config.suites[attestation.suite]\n if (suiteConfig?.packages) {\n const fingerprintOptions = {\n packages: suiteConfig.packages,\n ...(suiteConfig.ignore && { ignore: suiteConfig.ignore }),\n }\n const result = await computeFingerprint(fingerprintOptions)\n fingerprintMatches = result.fingerprint === attestation.fingerprint\n }\n }\n\n // Keep if:\n // 1. Age is within keepDays AND fingerprint matches, OR\n // 2. Fingerprint matches current code (regardless of age)\n const isStale = !fingerprintMatches && ageMs > keepMs\n const orphaned = !suiteExists\n\n if (isStale || orphaned) {\n stale.push(attestation)\n const reason = orphaned\n ? 'suite removed'\n : !fingerprintMatches\n ? 'fingerprint changed'\n : 'expired'\n verbose(`Stale: ${attestation.suite} (${reason}, ${String(ageDays)} days old)`)\n } else {\n keep.push(attestation)\n }\n }\n\n // Report what will be pruned\n if (stale.length === 0) {\n success('No stale attestations found')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n log(`Found ${String(stale.length)} stale attestation(s):`)\n for (const attestation of stale) {\n const ageDays = Math.floor(\n (now - new Date(attestation.attestedAt).getTime()) / (1000 * 60 * 60 * 24),\n )\n log(` - ${attestation.suite} (${String(ageDays)} days old)`)\n }\n\n if (options.dryRun) {\n info('Dry run - no changes made')\n process.exit(ExitCode.SUCCESS)\n return\n }\n\n // Check for private key\n const privateKeyPath = getDefaultPrivateKeyPath()\n if (!fs.existsSync(privateKeyPath)) {\n error(`Private key not found: ${privateKeyPath}`)\n error('Cannot re-sign attestations file.')\n process.exit(ExitCode.MISSING_KEY)\n return\n }\n\n // Write updated attestations\n await writeSignedAttestations({\n filePath: attestationsPath,\n attestations: keep,\n privateKeyPath,\n })\n\n success(`Pruned ${String(stale.length)} stale attestation(s)`)\n log(`Remaining: ${String(keep.length)} attestation(s)`)\n process.exit(ExitCode.SUCCESS)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n return\n }\n}\n\nexport { runPrune }\n","import { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n computeFingerprintSync,\n readSealsSync,\n verifyAllSeals,\n verifyGateSeal,\n type VerificationState,\n type SealVerificationResult,\n} from '@attest-it/core'\nimport {\n log,\n success,\n error,\n warn,\n formatTable,\n outputJson,\n getTheme,\n type TableRow,\n} from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const verifyCommand = new Command('verify')\n .description('Verify all gate seals (for CI)')\n .argument('[gates...]', 'Verify specific gates only')\n .option('--json', 'Output JSON for machine parsing')\n .action(async (gates: string[], options: VerifyOptions) => {\n await runVerify(gates, options)\n })\n\ninterface VerifyOptions {\n json?: boolean\n}\n\n/**\n * Run the verify command to validate gate seals.\n *\n * Verifies signature validity and checks seal status for all gates\n * or specific gates. Intended for CI/CD pipelines.\n *\n * @param gates - Array of gate IDs to verify, or empty for all gates\n * @param options - Command options\n * @param options.json - Output JSON for machine parsing\n * @public\n */\nasync function runVerify(gates: string[], options: VerifyOptions): Promise<void> {\n try {\n // Load config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Determine which gates to verify\n const gatesToVerify = gates.length > 0 ? gates : Object.keys(attestItConfig.gates)\n\n // Validate that specified gates exist\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Compute fingerprints for all gates\n const fingerprints: Record<string, string> = {}\n for (const gateId of gatesToVerify) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = attestItConfig.gates[gateId]\n if (!gate) continue\n\n const result = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n // eslint-disable-next-line security/detect-object-injection\n fingerprints[gateId] = result.fingerprint\n }\n\n // Verify seals\n const results =\n gates.length > 0\n ? gatesToVerify.map((gateId) =>\n // eslint-disable-next-line security/detect-object-injection\n verifyGateSeal(attestItConfig, gateId, sealsFile, fingerprints[gateId] ?? ''),\n )\n : verifyAllSeals(attestItConfig, sealsFile, fingerprints)\n\n // Output results\n if (options.json) {\n outputJson(results)\n } else {\n displayResults(results)\n }\n\n // Determine exit code\n const hasInvalid = results.some(\n (r) =>\n r.state === 'MISSING' ||\n r.state === 'FINGERPRINT_MISMATCH' ||\n r.state === 'INVALID_SIGNATURE' ||\n r.state === 'UNKNOWN_SIGNER',\n )\n\n const hasStale = results.some((r) => r.state === 'STALE')\n\n if (hasInvalid) {\n process.exit(ExitCode.FAILURE)\n } else if (hasStale) {\n // Stale seals are warnings but not failures\n process.exit(ExitCode.SUCCESS)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\n/**\n * Display verification results in a formatted table.\n *\n * Shows verification state, seal metadata, and remediation steps.\n *\n * @param results - Verification results from verifyAllSeals or verifyGateSeal\n * @public\n */\nfunction displayResults(results: SealVerificationResult[]): void {\n log('')\n\n // Build table rows\n const tableRows: TableRow[] = results.map((r) => ({\n suite: r.gateId,\n status: colorizeState(r.state),\n fingerprint: formatFingerprint(r),\n age: formatAge(r),\n }))\n\n log(formatTable(tableRows))\n log('')\n\n // Show messages for any gates with issues\n const withIssues = results.filter(\n (r) =>\n r.state !== 'VALID' &&\n r.state !== 'STALE' && // STALE gets its own warning below\n r.message,\n )\n\n if (withIssues.length > 0) {\n for (const result of withIssues) {\n if (result.message) {\n log(`${result.gateId}: ${result.message}`)\n }\n }\n log('')\n }\n\n // Summary\n const validCount = results.filter((r) => r.state === 'VALID').length\n const staleCount = results.filter((r) => r.state === 'STALE').length\n const invalidCount = results.length - validCount - staleCount\n\n if (invalidCount === 0 && staleCount === 0) {\n success('All gate seals valid')\n } else {\n if (invalidCount > 0) {\n error(`${String(invalidCount)} gate(s) have invalid or missing seals`)\n log('Run `attest-it seal` to create seals for these gates')\n }\n if (staleCount > 0) {\n warn(`${String(staleCount)} gate(s) have stale seals (exceeds maxAge)`)\n log('Run `attest-it seal --force <gate>` to update stale seals')\n }\n }\n}\n\n/**\n * Colorize verification state for display.\n *\n * @param state - Verification state\n * @returns Colorized state string\n */\nfunction colorizeState(state: VerificationState): string {\n const theme = getTheme()\n\n switch (state) {\n case 'VALID':\n return theme.green(state)\n case 'MISSING':\n case 'STALE':\n return theme.yellow(state)\n case 'FINGERPRINT_MISMATCH':\n case 'INVALID_SIGNATURE':\n case 'UNKNOWN_SIGNER':\n return theme.red(state)\n default:\n return state\n }\n}\n\n/**\n * Format fingerprint for display.\n *\n * @param result - Verification result\n * @returns Formatted fingerprint string\n */\nfunction formatFingerprint(result: SealVerificationResult): string {\n if (result.seal?.fingerprint) {\n const fp = result.seal.fingerprint\n if (fp.length > 16) {\n return fp.slice(0, 16) + '...'\n }\n return fp\n }\n return result.state === 'MISSING' ? '(none)' : '-'\n}\n\n/**\n * Format age for display.\n *\n * @param result - Verification result\n * @returns Formatted age string\n */\nfunction formatAge(result: SealVerificationResult): string {\n if (result.seal?.timestamp) {\n const timestamp = new Date(result.seal.timestamp)\n const now = Date.now()\n const ageMs = now - timestamp.getTime()\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24))\n\n if (result.state === 'STALE') {\n return `${String(ageDays)} days (stale)`\n }\n return `${String(ageDays)} days`\n }\n\n switch (result.state) {\n case 'MISSING':\n return '(none)'\n case 'FINGERPRINT_MISMATCH':\n return '(changed)'\n default:\n return '-'\n }\n}\n\nexport { runVerify, displayResults }\n","/**\n * Seal command implementation for attest-it CLI.\n * Creates cryptographic seals for gates.\n */\n\nimport { Command } from 'commander'\nimport {\n loadConfig,\n toAttestItConfig,\n loadLocalConfigSync,\n getActiveIdentity,\n computeFingerprintSync,\n isAuthorizedSigner,\n getGate,\n createSeal,\n readSealsSync,\n writeSealsSync,\n KeyProviderRegistry,\n type AttestItConfig,\n type Identity,\n type SealsFile,\n} from '@attest-it/core'\nimport { log, success, error, warn, verbose } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\nexport const sealCommand = new Command('seal')\n .description('Create seals for gates')\n .argument('[gates...]', 'Gate IDs to seal (defaults to all gates without valid seals)')\n .option('--force', 'Force seal creation even if gate already has a valid seal')\n .option('--dry-run', 'Show what would be sealed without creating seals')\n .action(async (gates: string[], options: SealOptions) => {\n await runSeal(gates, options)\n })\n\ninterface SealOptions {\n force?: boolean\n dryRun?: boolean\n}\n\ninterface SealSummary {\n sealed: string[]\n skipped: {\n gate: string\n reason: string\n }[]\n failed: {\n gate: string\n error: string\n }[]\n}\n\n/**\n * Run the seal command to create seals for gates.\n *\n * @param gates - Array of gate IDs to seal, or empty for all gates\n * @param options - Command options\n * @public\n */\nasync function runSeal(gates: string[], options: SealOptions): Promise<void> {\n try {\n // Load project config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if gates are defined\n if (!attestItConfig.gates || Object.keys(attestItConfig.gates).length === 0) {\n error('No gates defined in configuration')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Load local identity config\n const localConfig = loadLocalConfigSync()\n if (!localConfig) {\n error('No local identity configuration found')\n error('Run \"attest-it identity create\" first to set up your identity')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Get active identity\n const identity = getActiveIdentity(localConfig)\n if (!identity) {\n error(`Active identity '${localConfig.activeIdentity}' not found in local config`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Read existing seals\n const projectRoot = process.cwd()\n const sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n\n // Determine which gates to seal\n const gatesToSeal = gates.length > 0 ? gates : getAllGateIds(attestItConfig)\n\n // Validate that specified gates exist\n for (const gateId of gatesToSeal) {\n if (!attestItConfig.gates[gateId]) {\n error(`Gate '${gateId}' not found in configuration`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n }\n\n // Process each gate\n const summary: SealSummary = {\n sealed: [],\n skipped: [],\n failed: [],\n }\n\n // Get the identity slug for sealedBy field\n const identitySlug = localConfig.activeIdentity\n\n for (const gateId of gatesToSeal) {\n try {\n const result = await processSingleGate(\n gateId,\n attestItConfig,\n identity,\n identitySlug,\n sealsFile,\n options,\n )\n\n if (result.sealed) {\n summary.sealed.push(gateId)\n } else if (result.skipped) {\n summary.skipped.push({ gate: gateId, reason: result.reason ?? 'Unknown' })\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error'\n summary.failed.push({ gate: gateId, error: errorMsg })\n }\n }\n\n // Write seals file if not dry run and we sealed anything\n if (!options.dryRun && summary.sealed.length > 0) {\n writeSealsSync(projectRoot, sealsFile, attestItConfig.settings.sealsPath)\n }\n\n // Display summary\n displaySummary(summary, options.dryRun)\n\n // Exit with appropriate code\n if (summary.failed.length > 0) {\n process.exit(ExitCode.FAILURE)\n } else if (summary.sealed.length === 0 && summary.skipped.length === 0) {\n process.exit(ExitCode.NO_WORK)\n } else {\n process.exit(ExitCode.SUCCESS)\n }\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n\ninterface ProcessGateResult {\n sealed: boolean\n skipped: boolean\n reason?: string\n}\n\n/**\n * Process a single gate for sealing.\n *\n * @param gateId - Gate identifier\n * @param config - The attest-it configuration\n * @param identity - Active identity for signing\n * @param identitySlug - The identity slug (used for sealedBy field)\n * @param sealsFile - The seals file to update\n * @param options - Command options\n * @returns Result indicating whether gate was sealed or skipped\n */\nasync function processSingleGate(\n gateId: string,\n config: AttestItConfig,\n identity: Identity,\n identitySlug: string,\n sealsFile: SealsFile,\n options: SealOptions,\n): Promise<ProcessGateResult> {\n verbose(`Processing gate: ${gateId}`)\n\n // Get gate config\n const gate = getGate(config, gateId)\n if (!gate) {\n return { sealed: false, skipped: true, reason: 'Gate not found in configuration' }\n }\n\n // Check if gate already has a valid seal and --force not specified\n // eslint-disable-next-line security/detect-object-injection\n const existingSeal = sealsFile.seals[gateId]\n if (existingSeal && !options.force) {\n return {\n sealed: false,\n skipped: true,\n reason: 'Gate already has a seal (use --force to override)',\n }\n }\n\n // Compute current fingerprint\n const fingerprintResult = computeFingerprintSync({\n packages: gate.fingerprint.paths,\n ...(gate.fingerprint.exclude && { ignore: gate.fingerprint.exclude }),\n })\n verbose(` Fingerprint: ${fingerprintResult.fingerprint}`)\n\n // Check if user is authorized to seal this gate\n const authorized = isAuthorizedSigner(config, gateId, identity.publicKey)\n if (!authorized) {\n return {\n sealed: false,\n skipped: true,\n reason: `Not authorized to seal this gate (authorized signers: ${gate.authorizedSigners.join(', ')})`,\n }\n }\n\n // If dry-run, stop here\n if (options.dryRun) {\n log(` Would seal gate: ${gateId}`)\n return { sealed: true, skipped: false }\n }\n\n // Create key provider from identity's private key reference\n const keyProvider = createKeyProviderFromIdentity(identity)\n\n // Get private key from provider\n const keyRef = getKeyRefFromIdentity(identity)\n const keyResult = await keyProvider.getPrivateKey(keyRef)\n\n // Read the key file content\n const fs = await import('node:fs/promises')\n const privateKeyPem = await fs.readFile(keyResult.keyPath, 'utf8')\n\n // Clean up after reading\n await keyResult.cleanup()\n\n // Create seal using identity slug (not display name) for verification lookup\n const seal = createSeal({\n gateId,\n fingerprint: fingerprintResult.fingerprint,\n sealedBy: identitySlug,\n privateKey: privateKeyPem,\n })\n\n // Add seal to seals file\n // eslint-disable-next-line security/detect-object-injection\n sealsFile.seals[gateId] = seal\n\n log(` Sealed gate: ${gateId}`)\n verbose(` Sealed by: ${identitySlug} (${identity.name})`)\n verbose(` Timestamp: ${seal.timestamp}`)\n\n return { sealed: true, skipped: false }\n}\n\n/**\n * Get all gate IDs from configuration.\n *\n * @param config - The attest-it configuration\n * @returns Array of gate IDs\n */\nfunction getAllGateIds(config: AttestItConfig): string[] {\n return Object.keys(config.gates ?? {})\n}\n\n/**\n * Display summary of seal operations.\n *\n * @param summary - Summary of operations\n * @param dryRun - Whether this was a dry run\n */\nfunction displaySummary(summary: SealSummary, dryRun?: boolean): void {\n log('')\n\n const prefix = dryRun ? 'Would seal' : 'Sealed'\n\n if (summary.sealed.length > 0) {\n success(`${prefix} ${String(summary.sealed.length)} gate(s): ${summary.sealed.join(', ')}`)\n }\n\n if (summary.skipped.length > 0) {\n log('')\n warn(`Skipped ${String(summary.skipped.length)} gate(s):`)\n for (const skip of summary.skipped) {\n log(` ${skip.gate}: ${skip.reason}`)\n }\n }\n\n if (summary.failed.length > 0) {\n log('')\n error(`Failed to seal ${String(summary.failed.length)} gate(s):`)\n for (const fail of summary.failed) {\n log(` ${fail.gate}: ${fail.error}`)\n }\n }\n\n if (summary.sealed.length === 0 && summary.skipped.length === 0 && summary.failed.length === 0) {\n log('No gates to seal')\n }\n}\n\n/**\n * Create a key provider from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns A key provider instance\n */\nfunction createKeyProviderFromIdentity(\n identity: Identity,\n): ReturnType<typeof KeyProviderRegistry.create> {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return KeyProviderRegistry.create({\n type: 'filesystem',\n options: { privateKeyPath: privateKey.path },\n })\n case 'keychain':\n // MacOSKeychainKeyProvider uses 'itemName' which becomes the service name\n // The account is hardcoded to 'attest-it' in the provider\n return KeyProviderRegistry.create({\n type: 'macos-keychain',\n options: {\n itemName: privateKey.service,\n },\n })\n case '1password':\n return KeyProviderRegistry.create({\n type: '1password',\n options: {\n account: privateKey.account,\n vault: privateKey.vault,\n itemName: privateKey.item,\n field: privateKey.field,\n },\n })\n case 'yubikey':\n return KeyProviderRegistry.create({\n type: 'yubikey',\n options: {\n encryptedKeyPath: privateKey.encryptedKeyPath,\n slot: privateKey.slot,\n serial: privateKey.serial,\n },\n })\n default: {\n // This should never happen due to TypeScript's discriminated union\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n\n/**\n * Get the key reference string from an identity's private key reference.\n *\n * @param identity - The identity containing the private key reference\n * @returns The key reference string\n */\nfunction getKeyRefFromIdentity(identity: Identity): string {\n const { privateKey } = identity\n\n switch (privateKey.type) {\n case 'file':\n return privateKey.path\n case 'keychain':\n // The provider uses the service name as the keyRef\n // Account is hardcoded to 'attest-it' in MacOSKeychainKeyProvider\n return privateKey.service\n case '1password':\n return privateKey.item\n case 'yubikey':\n return privateKey.encryptedKeyPath\n default: {\n const _exhaustiveCheck: never = privateKey\n throw new Error(`Unsupported private key type: ${String(_exhaustiveCheck)}`)\n }\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List all local identities')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all configured identities.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const identities = Object.entries(config.identities)\n\n log('')\n log(theme.blue.bold()('Local Identities:'))\n log('')\n\n for (const [slug, identity] of identities) {\n const isActive = slug === config.activeIdentity\n const marker = isActive ? theme.green('★') : ' '\n const nameDisplay = isActive ? theme.green.bold()(identity.name) : identity.name\n\n // Truncate public key for display\n const keyPreview = identity.publicKey.slice(0, 12) + '...'\n\n // Determine key storage type\n let keyType: string\n switch (identity.privateKey.type) {\n case 'file':\n keyType = 'file'\n break\n case 'keychain':\n keyType = 'keychain'\n break\n case '1password':\n keyType = '1password'\n break\n case 'yubikey':\n keyType = 'yubikey'\n break\n }\n\n log(`${marker} ${theme.blue(slug)}`)\n log(` Name: ${nameDisplay}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n log(` Key Type: ${keyType}`)\n log('')\n }\n\n if (identities.length === 1) {\n log(`1 identity configured`)\n } else {\n log(`${identities.length.toString()} identities configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","/**\n * Validation utilities for identity commands.\n */\n\n/**\n * Validate an identity slug.\n *\n * @param value - The slug value to validate\n * @param existingIdentities - Optional record of existing identity slugs\n * @returns true if valid, or an error message string if invalid\n */\nexport function validateSlug(\n value: string,\n existingIdentities?: Record<string, unknown>,\n): true | string {\n const trimmed = value.trim()\n\n if (!trimmed) {\n return 'Slug cannot be empty'\n }\n\n if (!/^[a-z0-9-]+$/.test(trimmed)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n\n if (existingIdentities?.[trimmed]) {\n return `Identity \"${trimmed}\" already exists`\n }\n\n return true\n}\n\n/**\n * Email validation regex pattern.\n * Validates basic email format: local@domain.tld\n */\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\n/**\n * Validate an email address.\n *\n * @param value - The email value to validate\n * @param required - Whether the email is required (default: false)\n * @returns true if valid, or an error message string if invalid\n */\nexport function validateEmail(value: string, required = false): true | string {\n const trimmed = value.trim()\n\n // If not required and empty, that's fine\n if (!trimmed) {\n return required ? 'Email cannot be empty' : true\n }\n\n if (!EMAIL_REGEX.test(trimmed)) {\n return 'Please enter a valid email address'\n }\n\n return true\n}\n","import { Command } from 'commander'\nimport { input, select } from '@inquirer/prompts'\nimport {\n generateEd25519KeyPair,\n loadLocalConfig,\n saveLocalConfig,\n getAttestItConfigDir,\n OnePasswordKeyProvider,\n MacOSKeychainKeyProvider,\n YubiKeyProvider,\n savePublicKey,\n} from '@attest-it/core'\nimport type { Identity, LocalConfig, PrivateKeyRef } from '@attest-it/core'\nimport { log, success, error, info, verbose, getTheme } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { validateSlug, validateEmail } from './validation.js'\nimport { offerCompletionInstall } from '../../utils/completion-offer.js'\nimport { join } from 'node:path'\nimport { writeFile, mkdir } from 'node:fs/promises'\n\nexport const createCommand = new Command('create')\n .description('Create a new identity with Ed25519 keypair')\n .action(async () => {\n await runCreate()\n })\n\n/**\n * Run the create command to interactively create a new identity.\n */\nasync function runCreate(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Create New Identity'))\n log('')\n\n // Load existing config if it exists\n const existingConfig = await loadLocalConfig()\n\n // Prompt for identity details\n const slug = (\n await input({\n message: 'Identity slug (unique identifier):',\n validate: (value) => validateSlug(value, existingConfig?.identities),\n })\n ).trim()\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = (\n await input({\n message: 'Email (optional):',\n default: '',\n validate: validateEmail,\n })\n ).trim()\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n // Check provider availability\n // Note: Checking 1Password/YubiKey may trigger authentication prompts\n info('Checking available key storage providers...')\n info(\n 'You may see authentication prompts from 1Password, macOS Keychain, or other security tools.',\n )\n\n const opAvailable = await OnePasswordKeyProvider.isInstalled()\n verbose(` 1Password CLI (op): ${opAvailable ? 'found' : 'not found'}`)\n\n const keychainAvailable = MacOSKeychainKeyProvider.isAvailable()\n verbose(` macOS Keychain: ${keychainAvailable ? 'available' : 'not available (not macOS)'}`)\n\n const yubikeyInstalled = await YubiKeyProvider.isInstalled()\n verbose(` YubiKey CLI (ykman): ${yubikeyInstalled ? 'found' : 'not found'}`)\n\n const yubikeyConnected = yubikeyInstalled ? await YubiKeyProvider.isConnected() : false\n if (yubikeyInstalled) {\n verbose(` YubiKey device: ${yubikeyConnected ? 'connected' : 'not connected'}`)\n }\n\n // Build choices based on availability\n const configDir = getAttestItConfigDir()\n const storageChoices: { name: string; value: string }[] = [\n { name: `File system (${join(configDir, 'keys')})`, value: 'file' },\n ]\n\n if (keychainAvailable) {\n storageChoices.push({ name: 'macOS Keychain', value: 'keychain' })\n }\n\n if (opAvailable) {\n storageChoices.push({ name: '1Password', value: '1password' })\n }\n\n if (yubikeyInstalled) {\n const yubikeyLabel = yubikeyConnected\n ? 'YubiKey (encrypted with challenge-response)'\n : 'YubiKey (not connected - insert YubiKey first)'\n storageChoices.push({ name: yubikeyLabel, value: 'yubikey' })\n } else {\n // Show YubiKey as disabled option so users know it exists\n storageChoices.push({\n name: theme.muted('YubiKey (install ykman CLI to enable)'),\n value: 'yubikey-disabled',\n // @ts-expect-error -- @inquirer/prompts supports disabled property but types may not reflect it\n disabled: true,\n })\n }\n\n // Prompt for key storage type\n const keyStorageType = await select({\n message: 'Where should the private key be stored?',\n choices: storageChoices,\n })\n\n // ============================================================\n // PHASE 1: Collect all provider-specific configuration\n // (before generating key to avoid holding key material during prompts)\n // ============================================================\n\n // Storage configuration interfaces\n interface FileStorageConfig {\n type: 'file'\n keyPath: string\n }\n interface KeychainStorageConfig {\n type: 'keychain'\n selectedKeychain: { name: string; path: string }\n keychainItemName: string\n }\n interface OnePasswordStorageConfig {\n type: '1password'\n selectedAccount: string\n accountDisplayName: string\n selectedVault: string\n item: string\n }\n interface YubiKeyStorageConfig {\n type: 'yubikey'\n selectedSerial: string\n slot: 1 | 2\n encryptedKeyPath: string\n }\n type StorageConfig =\n | FileStorageConfig\n | KeychainStorageConfig\n | OnePasswordStorageConfig\n | YubiKeyStorageConfig\n\n let storageConfig: StorageConfig\n\n switch (keyStorageType) {\n case 'file': {\n // Determine file path (respects --home-dir override)\n const keysDir = join(getAttestItConfigDir(), 'keys')\n const keyPath = join(keysDir, `${slug}.pem`)\n storageConfig = { type: 'file', keyPath }\n break\n }\n case 'keychain': {\n // Check if available (using static method)\n if (!MacOSKeychainKeyProvider.isAvailable()) {\n error('macOS Keychain is not available on this system')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Notify user about keychain access\n log('')\n info('Accessing macOS Keychain to list available keychains...')\n info('You may be prompted to allow access or enter your password.')\n\n // List available keychains\n const keychains = await MacOSKeychainKeyProvider.listKeychains()\n\n if (keychains.length === 0) {\n throw new Error('No keychains found on this system')\n }\n\n // Format keychain display with bold name and dim path\n const formatKeychainChoice = (kc: { name: string; path: string }): string => {\n return `${theme.blue.bold()(kc.name)} ${theme.muted(`(${kc.path})`)}`\n }\n\n // Select keychain (auto-select if only one, typically \"login\")\n let selectedKeychain: { name: string; path: string }\n if (keychains.length === 1 && keychains[0]) {\n selectedKeychain = keychains[0]\n info(`Using keychain: ${formatKeychainChoice(selectedKeychain)}`)\n } else {\n const selectedPath = await select({\n message: 'Select keychain:',\n choices: keychains.map((kc) => ({\n name: formatKeychainChoice(kc),\n value: kc.path,\n })),\n })\n const foundKeychain = keychains.find((kc) => kc.path === selectedPath)\n if (!foundKeychain) {\n throw new Error('Selected keychain not found')\n }\n selectedKeychain = foundKeychain\n }\n\n // Prompt for item name\n const keychainItemName = await input({\n message: 'Keychain item name:',\n default: `attest-it-${slug}`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Item name cannot be empty'\n }\n return true\n },\n })\n\n storageConfig = { type: 'keychain', selectedKeychain, keychainItemName }\n break\n }\n case '1password': {\n // Notify user about 1Password access\n log('')\n info('Accessing 1Password to list your accounts and vaults...')\n info(\n 'You may see biometric prompts or be asked to unlock 1Password for each configured account.',\n )\n\n // List available 1Password accounts\n const accounts = await OnePasswordKeyProvider.listAccounts()\n\n if (accounts.length === 0) {\n throw new Error(\n '1Password CLI is installed but no accounts are signed in. Run \"op signin\" first.',\n )\n }\n\n // Fetch detailed account info (including friendly name) for each account\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n interface AccountDetails {\n url: string\n email: string\n name: string // Friendly name from `op account get`\n }\n\n const accountDetails: AccountDetails[] = await Promise.all(\n accounts.map(async (acc) => {\n try {\n // Use user_uuid for unique lookup (URL can be shared by multiple accounts)\n const { stdout } = await execFileAsync('op', [\n 'account',\n 'get',\n '--account',\n acc.user_uuid,\n '--format=json',\n ])\n const details: unknown = JSON.parse(stdout)\n // Extract name if it exists and is a string\n const name =\n details !== null &&\n typeof details === 'object' &&\n 'name' in details &&\n typeof details.name === 'string'\n ? details.name\n : '[Could not read account name]'\n return {\n url: acc.url,\n email: acc.email,\n name,\n }\n } catch {\n // Fallback if we can't get account details (e.g., vault locked)\n return {\n url: acc.url,\n email: acc.email,\n name: '[Could not read account name]',\n }\n }\n }),\n )\n\n // Format account display with bold name and dim domain (matching `op signin` style)\n const formatAccountChoice = (acc: AccountDetails): string => {\n return `${theme.blue.bold()(acc.name)} ${theme.muted(`(${acc.url})`)}`\n }\n\n // Select account (auto-select if only one)\n // Use URL as the account identifier (required by `op` CLI)\n let selectedAccount: string\n if (accountDetails.length === 1 && accountDetails[0]) {\n selectedAccount = accountDetails[0].url\n info(`Using 1Password account: ${formatAccountChoice(accountDetails[0])}`)\n } else {\n selectedAccount = await select({\n message: 'Select 1Password account:',\n choices: accountDetails.map((acc) => ({\n name: formatAccountChoice(acc),\n value: acc.url,\n })),\n })\n }\n\n // List vaults for selected account\n const vaults = await OnePasswordKeyProvider.listVaults(selectedAccount)\n\n if (vaults.length === 0) {\n throw new Error(`No vaults found in 1Password account: ${selectedAccount}`)\n }\n\n // Select vault\n const selectedVault = await select({\n message: 'Select vault for private key storage:',\n choices: vaults.map((v) => ({\n name: v.name,\n value: v.name,\n })),\n })\n\n // Prompt for item name\n const item = await input({\n message: '1Password item name:',\n default: `attest-it-${slug}`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Item name cannot be empty'\n }\n return true\n },\n })\n\n // Get account display name for description\n const selectedAccountDetails = accountDetails.find((acc) => acc.url === selectedAccount)\n const accountDisplayName = selectedAccountDetails?.name ?? selectedAccount\n\n storageConfig = {\n type: '1password',\n selectedAccount,\n accountDisplayName,\n selectedVault,\n item,\n }\n break\n }\n case 'yubikey': {\n // Notify user about YubiKey access\n log('')\n info('Accessing YubiKey to detect connected devices...')\n info('Your private key will be encrypted using HMAC challenge-response from the YubiKey.')\n\n // Check if YubiKey is connected\n if (!(await YubiKeyProvider.isConnected())) {\n error('No YubiKey detected. Please insert your YubiKey and try again.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // List connected YubiKeys\n const yubikeys = await YubiKeyProvider.listDevices()\n\n if (yubikeys.length === 0) {\n throw new Error('No YubiKeys detected. Please insert a YubiKey and try again.')\n }\n\n // Format YubiKey display\n const formatYubiKeyChoice = (yk: {\n serial: string\n type: string\n firmware: string\n }): string => {\n return `${theme.blue.bold()(yk.type)} ${theme.muted(`(Serial: ${yk.serial}, FW: ${yk.firmware})`)}`\n }\n\n // Select YubiKey (auto-select if only one)\n let selectedSerial: string\n if (yubikeys.length === 1 && yubikeys[0]) {\n selectedSerial = yubikeys[0].serial\n info(`Using YubiKey: ${formatYubiKeyChoice(yubikeys[0])}`)\n } else {\n selectedSerial = await select({\n message: 'Select YubiKey:',\n choices: yubikeys.map((yk) => ({\n name: formatYubiKeyChoice(yk),\n value: yk.serial,\n })),\n })\n }\n\n // Check if challenge-response is configured on slot 2\n const slot: 1 | 2 = 2 // Default to slot 2 for challenge-response\n const isChallengeResponseConfigured = await YubiKeyProvider.isChallengeResponseConfigured(\n slot,\n selectedSerial,\n )\n\n if (!isChallengeResponseConfigured) {\n log('')\n error(`YubiKey slot ${String(slot)} is not configured for HMAC challenge-response.`)\n log('')\n log('To configure it, run:')\n log(theme.blue(` ykman otp chalresp --generate ${String(slot)}`))\n log('')\n log('This will configure slot 2 with a randomly generated secret.')\n log(theme.muted('Note: Make sure to back up the secret if needed for recovery.'))\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Prompt for encrypted key file name\n const encryptedKeyName = await input({\n message: 'Encrypted key file name:',\n default: `${slug}.enc`,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'File name cannot be empty'\n }\n return true\n },\n })\n\n // Determine encrypted key path\n const keysDir = join(getAttestItConfigDir(), 'keys')\n const encryptedKeyPath = join(keysDir, encryptedKeyName)\n\n storageConfig = { type: 'yubikey', selectedSerial, slot, encryptedKeyPath }\n break\n }\n default:\n throw new Error(`Unknown key storage type: ${keyStorageType}`)\n }\n\n // ============================================================\n // PHASE 2: Generate key pair (now that we have all user input)\n // ============================================================\n log('')\n log('Generating Ed25519 keypair...')\n\n // Generate keypair (this is synchronous, returns KeyPair not Promise)\n const keyPair = generateEd25519KeyPair()\n\n // ============================================================\n // PHASE 3: Store the key using collected configuration\n // ============================================================\n\n // Build private key reference based on storage type\n let privateKeyRef: PrivateKeyRef\n let keyStorageDescription: string\n\n switch (storageConfig.type) {\n case 'file': {\n // Notify user about file creation\n log('')\n info('Creating private key file on disk...')\n\n // Save to filesystem (respects --home-dir override)\n const keysDir = join(getAttestItConfigDir(), 'keys')\n await mkdir(keysDir, { recursive: true })\n await writeFile(storageConfig.keyPath, keyPair.privateKey, { mode: 0o600 })\n\n privateKeyRef = { type: 'file', path: storageConfig.keyPath }\n keyStorageDescription = storageConfig.keyPath\n break\n }\n case 'keychain': {\n // Store the private key in keychain using security command\n // Keys are stored as base64-encoded PEM strings\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n // Encode the private key as base64 for storage\n const encodedKey = Buffer.from(keyPair.privateKey).toString('base64')\n\n try {\n const addArgs = [\n 'add-generic-password',\n '-a',\n 'attest-it',\n '-s',\n storageConfig.keychainItemName,\n '-w',\n encodedKey,\n '-U',\n storageConfig.selectedKeychain.path,\n ]\n await execFileAsync('security', addArgs)\n } catch (err) {\n throw new Error(\n `Failed to store key in macOS Keychain: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n // In the keychain, -s is the service name (item) and -a is the account (\"attest-it\")\n privateKeyRef = {\n type: 'keychain',\n service: storageConfig.keychainItemName,\n account: 'attest-it',\n keychain: storageConfig.selectedKeychain.path,\n }\n keyStorageDescription = `macOS Keychain: ${storageConfig.selectedKeychain.name}/${storageConfig.keychainItemName}`\n break\n }\n case '1password': {\n // Write the private key to a temp file, then upload to 1Password\n const { tmpdir } = await import('node:os')\n const tempDir = join(tmpdir(), `attest-it-${String(Date.now())}`)\n await mkdir(tempDir, { recursive: true })\n const tempPrivatePath = join(tempDir, 'private.pem')\n\n try {\n // Write private key to temp file for upload\n await writeFile(tempPrivatePath, keyPair.privateKey, { mode: 0o600 })\n\n // Upload to 1Password using op document create\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n const opArgs = [\n 'document',\n 'create',\n tempPrivatePath,\n '--title',\n storageConfig.item,\n '--vault',\n storageConfig.selectedVault,\n '--account',\n storageConfig.selectedAccount,\n ]\n\n await execFileAsync('op', opArgs)\n } finally {\n // Clean up temp files\n const { rm } = await import('node:fs/promises')\n await rm(tempDir, { recursive: true, force: true }).catch(() => {\n // Ignore cleanup errors\n })\n }\n\n privateKeyRef = {\n type: '1password',\n vault: storageConfig.selectedVault,\n item: storageConfig.item,\n account: storageConfig.selectedAccount,\n }\n\n keyStorageDescription = `1Password (${storageConfig.accountDisplayName}/${storageConfig.selectedVault}/${storageConfig.item})`\n break\n }\n case 'yubikey': {\n // Create keys directory if needed\n const keysDir = join(getAttestItConfigDir(), 'keys')\n await mkdir(keysDir, { recursive: true })\n\n // Encrypt the private key with YubiKey challenge-response\n const result = await YubiKeyProvider.encryptPrivateKey({\n privateKey: keyPair.privateKey,\n encryptedKeyPath: storageConfig.encryptedKeyPath,\n slot: storageConfig.slot,\n serial: storageConfig.selectedSerial,\n })\n\n privateKeyRef = {\n type: 'yubikey',\n encryptedKeyPath: result.encryptedKeyPath,\n slot: storageConfig.slot,\n serial: storageConfig.selectedSerial,\n }\n keyStorageDescription = result.storageDescription\n break\n }\n }\n\n // Build identity object\n const identity: Identity = {\n name,\n publicKey: keyPair.publicKey,\n privateKey: privateKeyRef,\n ...(email && { email }),\n ...(github && { github }),\n }\n\n // Create or update config\n let newConfig: LocalConfig\n if (existingConfig) {\n // Add to existing config\n newConfig = {\n ...existingConfig,\n identities: {\n ...existingConfig.identities,\n [slug]: identity,\n },\n }\n } else {\n // Create new config with this identity as active\n newConfig = {\n activeIdentity: slug,\n identities: {\n [slug]: identity,\n },\n }\n }\n\n // Save config\n await saveLocalConfig(newConfig)\n\n // Save public key to home and project directories\n const publicKeyResult = await savePublicKey(slug, keyPair.publicKey)\n\n log('')\n success('Identity created successfully')\n log('')\n log(` Slug: ${slug}`)\n log(` Name: ${name}`)\n if (email) {\n log(` Email: ${email}`)\n }\n if (github) {\n log(` GitHub: ${github}`)\n }\n log(` Public Key: ${keyPair.publicKey.slice(0, 32)}...`)\n log(` Private Key: ${keyStorageDescription}`)\n log('')\n log(theme.blue.bold()('Public key saved to:'))\n log(` ${publicKeyResult.homePath}`)\n log('')\n log('To add yourself to a project, run:')\n log(theme.blue(' attest-it team join'))\n log('')\n\n if (!existingConfig) {\n success(`Set as active identity`)\n log('')\n } else {\n log(`To use this identity, run: attest-it identity use ${slug}`)\n log('')\n }\n\n // Offer to install shell completions\n await offerCompletionInstall()\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\n\nexport const useCommand = new Command('use')\n .description('Set the active identity')\n .argument('<slug>', 'Identity slug to activate')\n .action(async (slug: string) => {\n await runUse(slug)\n })\n\n/**\n * Run the use command to set the active identity.\n */\nasync function runUse(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if identity exists\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Update active identity\n const newConfig = {\n ...config,\n activeIdentity: slug,\n }\n\n await saveLocalConfig(newConfig)\n\n success(`Active identity set to: ${identity.name} (${slug})`)\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const showCommand = new Command('show')\n .description('Show identity details')\n .argument('[slug]', 'Identity slug (defaults to active identity)')\n .action(async (slug?: string) => {\n await runShow(slug)\n })\n\n/**\n * Run the show command to display identity details.\n */\nasync function runShow(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to show\n let targetSlug: string\n let isActive: boolean\n\n if (slug) {\n targetSlug = slug\n isActive = slug === config.activeIdentity\n } else {\n targetSlug = config.activeIdentity\n isActive = true\n }\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Identity Details:'))\n log('')\n log(` Slug: ${theme.blue(targetSlug)}${isActive ? theme.green(' (active)') : ''}`)\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n if (identity.github) {\n log(` GitHub: ${identity.github}`)\n }\n log('')\n log(` Public Key: ${identity.publicKey}`)\n log('')\n\n // Show private key reference details\n log(' Private Key Storage:')\n switch (identity.privateKey.type) {\n case 'file':\n log(` Type: File`)\n log(` Path: ${identity.privateKey.path}`)\n break\n case 'keychain':\n log(` Type: macOS Keychain`)\n log(` Service: ${identity.privateKey.service}`)\n log(` Account: ${identity.privateKey.account}`)\n break\n case '1password':\n log(` Type: 1Password`)\n if (identity.privateKey.account) {\n log(` Account: ${identity.privateKey.account}`)\n }\n log(` Vault: ${identity.privateKey.vault}`)\n log(` Item: ${identity.privateKey.item}`)\n if (identity.privateKey.field) {\n log(` Field: ${identity.privateKey.field}`)\n }\n break\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","/**\n * Shared utility for formatting key storage locations.\n */\nimport type { PrivateKeyRef } from '@attest-it/core'\nimport { getTheme } from './output.js'\n\n/**\n * Format the private key storage location for display.\n */\nexport function formatKeyLocation(privateKey: PrivateKeyRef): string {\n const theme = getTheme()\n\n switch (privateKey.type) {\n case 'file':\n return `${theme.blue.bold()('File')}: ${theme.muted(privateKey.path)}`\n case 'keychain': {\n let keychainName = 'default'\n if (privateKey.keychain) {\n const filename = privateKey.keychain.split('/').pop() ?? privateKey.keychain\n keychainName = filename.replace(/\\.keychain(-db)?$/, '')\n }\n return `${theme.blue.bold()('macOS Keychain')}: ${theme.muted(`${keychainName}/${privateKey.service}`)}`\n }\n case '1password': {\n const parts = [privateKey.vault, privateKey.item]\n if (privateKey.account) {\n parts.unshift(privateKey.account)\n }\n return `${theme.blue.bold()('1Password')}: ${theme.muted(parts.join('/'))}`\n }\n case 'yubikey': {\n const slotInfo = privateKey.slot ? ` (slot ${String(privateKey.slot)})` : ''\n const serialInfo = privateKey.serial ? ` [${privateKey.serial}]` : ''\n return `${theme.blue.bold()('YubiKey')}${serialInfo}${slotInfo}: ${theme.muted(privateKey.encryptedKeyPath)}`\n }\n default:\n return 'Unknown storage'\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadLocalConfig, saveLocalConfig } from '@attest-it/core'\nimport { log, success, error, getTheme } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { formatKeyLocation } from '../../utils/format-key-location.js'\nimport { unlink } from 'node:fs/promises'\n\nexport const removeCommand = new Command('remove')\n .description('Delete identity and optionally delete private key')\n .argument('<slug>', 'Identity slug to remove')\n .action(async (slug: string) => {\n await runRemove(slug)\n })\n\n/**\n * Run the remove command to delete an identity.\n */\nasync function runRemove(slug: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = config.identities[slug]\n if (!identity) {\n error(`Identity \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()(`Remove Identity: ${slug}`))\n log('')\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${identity.email}`)\n }\n log('')\n\n // Confirm deletion\n const confirmDelete = await confirm({\n message: 'Are you sure you want to delete this identity?',\n default: false,\n })\n\n if (!confirmDelete) {\n log('Cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n\n // Ask about deleting private key, showing where it's stored\n const keyLocation = formatKeyLocation(identity.privateKey)\n log(` Private key: ${keyLocation}`)\n log('')\n\n const deletePrivateKey = await confirm({\n message: 'Also delete the private key from storage?',\n default: false,\n })\n\n // Delete private key if requested\n if (deletePrivateKey) {\n switch (identity.privateKey.type) {\n case 'file': {\n try {\n await unlink(identity.privateKey.path)\n log(` Deleted private key file: ${identity.privateKey.path}`)\n } catch (err) {\n // Ignore file not found errors\n if (err && typeof err === 'object' && 'code' in err && err.code !== 'ENOENT') {\n throw err\n }\n }\n break\n }\n case 'keychain': {\n // Delete from macOS Keychain\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n const deleteArgs = [\n 'delete-generic-password',\n '-s',\n identity.privateKey.service,\n '-a',\n identity.privateKey.account,\n ]\n if (identity.privateKey.keychain) {\n deleteArgs.push(identity.privateKey.keychain)\n }\n await execFileAsync('security', deleteArgs)\n log(` Deleted private key from macOS Keychain`)\n } catch (err) {\n // Ignore if key doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('could not be found') &&\n !err.message.includes('does not exist')\n ) {\n throw err\n }\n }\n break\n }\n case '1password': {\n // Delete from 1Password\n const { execFile } = await import('node:child_process')\n const { promisify } = await import('node:util')\n const execFileAsync = promisify(execFile)\n\n try {\n const opArgs = [\n 'item',\n 'delete',\n identity.privateKey.item,\n '--vault',\n identity.privateKey.vault,\n ]\n\n if (identity.privateKey.account) {\n opArgs.push('--account', identity.privateKey.account)\n }\n\n await execFileAsync('op', opArgs)\n log(` Deleted private key from 1Password`)\n } catch (err) {\n // Ignore if item doesn't exist\n if (\n err instanceof Error &&\n !err.message.includes('not found') &&\n !err.message.includes(\"doesn't exist\")\n ) {\n throw err\n }\n }\n break\n }\n }\n }\n\n // Remove from config\n const { [slug]: _removed, ...remainingIdentities } = config.identities\n\n // Check if this was the last identity\n if (Object.keys(remainingIdentities).length === 0) {\n error('Cannot remove last identity')\n log('')\n log('At least one identity must exist')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Check if this was the active identity\n let newActiveIdentity = config.activeIdentity\n if (slug === config.activeIdentity) {\n // Set first remaining identity as active\n const firstKey = Object.keys(remainingIdentities)[0]\n if (!firstKey) {\n throw new Error('No remaining identities after removal')\n }\n newActiveIdentity = firstKey\n log('')\n log(theme.yellow(` Removed active identity. New active identity: ${newActiveIdentity}`))\n }\n\n const newConfig = {\n activeIdentity: newActiveIdentity,\n identities: remainingIdentities,\n }\n\n await saveLocalConfig(newConfig)\n\n log('')\n success(`Identity \"${slug}\" removed`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadLocalConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const exportCommand = new Command('export')\n .description('Export identity for team onboarding (YAML snippet)')\n .argument('[slug]', 'Identity slug to export (defaults to active identity)')\n .action(async (slug?: string) => {\n await runExport(slug)\n })\n\n/**\n * Run the export command to output a YAML snippet for team config.\n */\nasync function runExport(slug?: string): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n // Determine which identity to export\n const targetSlug = slug ?? config.activeIdentity\n\n const identity = config.identities[targetSlug]\n if (!identity) {\n error(`Identity \"${targetSlug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()('Team Configuration YAML:'))\n log('')\n log(theme.muted('# Add this to your team config file (.attest-it/team-config.yaml)'))\n log('')\n\n // Build export object (only include fields that are present)\n const exportData: Record<string, unknown> = {\n name: identity.name,\n publicKey: identity.publicKey,\n }\n\n if (identity.email) {\n exportData.email = identity.email\n }\n\n if (identity.github) {\n exportData.github = identity.github\n }\n\n // Create YAML with slug as key\n const yamlData = {\n [targetSlug]: exportData,\n }\n\n const yamlString = stringifyYaml(yamlData)\n\n log(yamlString)\n log('')\n log(theme.muted('# The team owner can add this to the \"members:\" section'))\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { createCommand } from './create.js'\nimport { useCommand } from './use.js'\nimport { showCommand } from './show.js'\nimport { removeCommand } from './remove.js'\nimport { exportCommand } from './export.js'\n\nexport const identityCommand = new Command('identity')\n .description('Manage local identities and keypairs')\n .addCommand(listCommand)\n .addCommand(createCommand)\n .addCommand(useCommand)\n .addCommand(showCommand)\n .addCommand(removeCommand)\n .addCommand(exportCommand)\n","import { Command } from 'commander'\nimport { loadLocalConfig, getActiveIdentity } from '@attest-it/core'\nimport { log, error, getTheme } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\nimport { formatKeyLocation } from '../utils/format-key-location.js'\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show the current active identity')\n .action(async () => {\n await runWhoami()\n })\n\n/**\n * Run the whoami command to display the current active identity.\n */\nasync function runWhoami(): Promise<void> {\n try {\n const config = await loadLocalConfig()\n\n if (!config) {\n error('No identities configured')\n log('')\n log('Run: attest-it identity create')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const identity = getActiveIdentity(config)\n\n if (!identity) {\n error('Active identity not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Active Identity'))\n log('')\n log(` Slug: ${theme.green.bold()(config.activeIdentity)}`)\n log(` Name: ${identity.name}`)\n if (identity.email) {\n log(` Email: ${theme.muted(identity.email)}`)\n }\n if (identity.github) {\n log(` GitHub: ${theme.muted('@' + identity.github)}`)\n }\n log(` Public Key: ${theme.muted(identity.publicKey.slice(0, 24) + '...')}`)\n log(` Key Store: ${formatKeyLocation(identity.privateKey)}`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { loadConfig, toAttestItConfig } from '@attest-it/core'\nimport { log, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\n\nexport const listCommand = new Command('list')\n .description('List team members and their authorizations')\n .action(async () => {\n await runList()\n })\n\n/**\n * Run the list command to display all team members.\n */\nasync function runList(): Promise<void> {\n try {\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n if (!attestItConfig.team || Object.keys(attestItConfig.team).length === 0) {\n error('No team members configured')\n log('')\n log('Run: attest-it team add')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const theme = getTheme()\n const teamMembers = Object.entries(attestItConfig.team)\n\n log('')\n log(theme.blue.bold()('Team Members:'))\n log('')\n\n for (const [slug, member] of teamMembers) {\n // Truncate public key for display\n const keyPreview = member.publicKey.slice(0, 12) + '...'\n\n log(theme.blue(slug))\n log(` Name: ${member.name}`)\n if (member.email) {\n log(` Email: ${member.email}`)\n }\n if (member.github) {\n log(` GitHub: ${member.github}`)\n }\n log(` Public Key: ${keyPreview}`)\n\n // Show gate authorizations\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log(` Gates: ${authorizedGates.join(', ')}`)\n } else {\n log(` Gates: ${theme.muted('(none)')}`)\n }\n\n log('')\n }\n\n if (teamMembers.length === 1) {\n log(`1 team member configured`)\n } else {\n log(`${teamMembers.length.toString()} team members configured`)\n }\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { checkbox } from '@inquirer/prompts'\nimport type { Config, GateConfig } from '@attest-it/core'\n\n/**\n * Prompt the user to select which gates they want to authorize for a team member.\n *\n * @param gates - The gates configuration from the config file\n * @returns Array of gate IDs that were selected\n * @public\n */\nexport async function promptForGateAuthorization(\n gates: Record<string, GateConfig> | undefined,\n): Promise<string[]> {\n // If no gates exist, return empty array\n if (!gates || Object.keys(gates).length === 0) {\n return []\n }\n\n const gateChoices = Object.entries(gates).map(([gateId, gate]: [string, GateConfig]) => ({\n name: `${gateId} - ${gate.name}`,\n value: gateId,\n }))\n\n const authorizedGates = await checkbox({\n message: 'Select gates to authorize (use space to select):',\n choices: gateChoices,\n })\n\n return authorizedGates\n}\n\n/**\n * Add a team member to the config and update gate authorizations.\n *\n * @param config - The existing config\n * @param memberSlug - The slug/identifier for the team member\n * @param memberData - The team member data to add\n * @param authorizedGates - Array of gate IDs to authorize the member for\n * @returns Updated config with the team member added and gates updated\n * @public\n */\nexport function addTeamMemberToConfig(\n config: Config,\n memberSlug: string,\n memberData: {\n name: string\n email?: string\n github?: string\n publicKey: string\n publicKeyAlgorithm?: 'ed25519'\n },\n authorizedGates: string[],\n): Config {\n const existingTeam = config.team ?? {}\n\n // Build the updated config with the new team member\n const updatedConfig: Config = {\n ...config,\n team: {\n ...existingTeam,\n [memberSlug]: {\n name: memberData.name,\n publicKey: memberData.publicKey,\n publicKeyAlgorithm: memberData.publicKeyAlgorithm ?? 'ed25519',\n ...(memberData.email ? { email: memberData.email } : {}),\n ...(memberData.github ? { github: memberData.github } : {}),\n },\n },\n }\n\n // Update gate authorizations\n if (authorizedGates.length > 0 && updatedConfig.gates) {\n for (const gateId of authorizedGates) {\n // eslint-disable-next-line security/detect-object-injection\n const gate = updatedConfig.gates[gateId]\n if (gate) {\n // Add to authorizedSigners if not already present\n if (!gate.authorizedSigners.includes(memberSlug)) {\n gate.authorizedSigners.push(memberSlug)\n }\n }\n }\n }\n\n return updatedConfig\n}\n","import { Command } from 'commander'\nimport { input } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath } from '@attest-it/core'\nimport { log, success, error } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\nimport { promptForGateAuthorization, addTeamMemberToConfig } from './utils.js'\n\nexport const addCommand = new Command('add')\n .description('Add a new team member')\n .action(async () => {\n await runAdd()\n })\n\n/**\n * Validate Base64 encoded Ed25519 public key.\n * Ed25519 public keys are 32 bytes, which is 44 characters in Base64.\n */\nfunction validatePublicKey(value: string): boolean | string {\n if (!value || value.trim().length === 0) {\n return 'Public key cannot be empty'\n }\n\n // Check if it's valid Base64\n const base64Regex = /^[A-Za-z0-9+/]+=*$/\n if (!base64Regex.test(value)) {\n return 'Public key must be valid Base64'\n }\n\n // Check length - Ed25519 public keys are 32 bytes = 44 chars in base64 (with padding)\n if (value.length !== 44) {\n return 'Public key must be 44 characters (32 bytes in Base64)'\n }\n\n // Try to decode to verify it's valid Base64\n try {\n const decoded = Buffer.from(value, 'base64')\n if (decoded.length !== 32) {\n return 'Public key must decode to 32 bytes'\n }\n } catch {\n return 'Invalid Base64 encoding'\n }\n\n return true\n}\n\n/**\n * Run the add command to interactively add a team member.\n */\nasync function runAdd(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Add Team Member'))\n log('')\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n const existingTeam = attestItConfig.team ?? {}\n\n // Prompt for member details\n const slug = await input({\n message: 'Member slug (unique identifier):',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Slug cannot be empty'\n }\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n // eslint-disable-next-line security/detect-object-injection\n if (existingTeam[value]) {\n return `Team member \"${value}\" already exists`\n }\n return true\n },\n })\n\n const name = await input({\n message: 'Display name:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Name cannot be empty'\n }\n return true\n },\n })\n\n const email = await input({\n message: 'Email (optional):',\n default: '',\n })\n\n const github = await input({\n message: 'GitHub username (optional):',\n default: '',\n })\n\n log('')\n log('Paste the public key (from \"attest-it identity export\"):')\n const publicKey = await input({\n message: 'Public key:',\n validate: validatePublicKey,\n })\n\n // Prompt for gate authorizations\n log('')\n const authorizedGates = await promptForGateAuthorization(attestItConfig.gates)\n\n // Update config with new team member\n const memberData: Parameters<typeof addTeamMemberToConfig>[2] = {\n name,\n publicKey: publicKey.trim(),\n publicKeyAlgorithm: 'ed25519',\n }\n const trimmedEmail = email.trim()\n const trimmedGithub = github.trim()\n if (trimmedEmail && trimmedEmail.length > 0) {\n memberData.email = trimmedEmail\n }\n if (trimmedGithub && trimmedGithub.length > 0) {\n memberData.github = trimmedGithub\n }\n const updatedConfig = addTeamMemberToConfig(config, slug, memberData, authorizedGates)\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" added successfully`)\n\n if (authorizedGates.length > 0) {\n log(`Authorized for gates: ${authorizedGates.join(', ')}`)\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { input } from '@inquirer/prompts'\nimport {\n loadConfig,\n toAttestItConfig,\n findConfigPath,\n loadLocalConfig,\n getActiveIdentity,\n} from '@attest-it/core'\nimport { log, success, error, info } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\nimport { promptForGateAuthorization, addTeamMemberToConfig } from './utils.js'\n\nexport const joinCommand = new Command('join')\n .description('Add yourself to the project team using your active identity')\n .action(async () => {\n await runJoin()\n })\n\n/**\n * Run the join command to add the user's active identity to the project team.\n * @public\n */\nexport async function runJoin(): Promise<void> {\n try {\n const theme = getTheme()\n\n log('')\n log(theme.blue.bold()('Join Project Team'))\n log('')\n\n // Load user's local config and active identity\n const localConfig = await loadLocalConfig()\n if (!localConfig) {\n error('No identity found. Run \"attest-it identity create\" first.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const activeIdentity = getActiveIdentity(localConfig)\n if (!activeIdentity) {\n error('No active identity. Run \"attest-it identity use <slug>\" to select one.')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const activeSlug = localConfig.activeIdentity\n\n info(`Using identity: ${activeSlug}`)\n log(` Name: ${activeIdentity.name}`)\n log(` Public Key: ${activeIdentity.publicKey.slice(0, 32)}...`)\n log('')\n\n // Load project config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n const existingTeam = attestItConfig.team ?? {}\n\n // Check if public key already exists\n const existingMemberWithKey = Object.entries(existingTeam).find(\n ([, member]) => member.publicKey === activeIdentity.publicKey,\n )\n if (existingMemberWithKey) {\n error(`You're already a team member as \"${existingMemberWithKey[0]}\"`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n // Determine slug - use identity slug if available, prompt if taken\n let slug = activeSlug\n // eslint-disable-next-line security/detect-object-injection -- slug comes from validated config\n if (existingTeam[slug]) {\n log(`Slug \"${slug}\" is already taken by another team member.`)\n slug = await input({\n message: 'Choose a different slug:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Slug cannot be empty'\n }\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Slug must contain only lowercase letters, numbers, and hyphens'\n }\n // eslint-disable-next-line security/detect-object-injection -- value is user input being validated\n if (existingTeam[value]) {\n return `Slug \"${value}\" is already taken`\n }\n return true\n },\n })\n }\n\n // Prompt for gate authorizations\n log('')\n const authorizedGates = await promptForGateAuthorization(attestItConfig.gates)\n\n // Update config with new team member\n const memberData: Parameters<typeof addTeamMemberToConfig>[2] = {\n name: activeIdentity.name,\n publicKey: activeIdentity.publicKey,\n publicKeyAlgorithm: 'ed25519',\n }\n if (activeIdentity.email) {\n memberData.email = activeIdentity.email\n }\n if (activeIdentity.github) {\n memberData.github = activeIdentity.github\n }\n const updatedConfig = addTeamMemberToConfig(config, slug, memberData, authorizedGates)\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" added successfully`)\n\n if (authorizedGates.length > 0) {\n log(`Authorized for gates: ${authorizedGates.join(', ')}`)\n }\n\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { confirm } from '@inquirer/prompts'\nimport { loadConfig, toAttestItConfig, findConfigPath, readSealsSync } from '@attest-it/core'\nimport type { Config } from '@attest-it/core'\nimport { log, success, error, warn } from '../../utils/output.js'\nimport { ExitCode } from '../../utils/exit-codes.js'\nimport { getTheme } from '../../components/theme.js'\nimport { writeFile } from 'node:fs/promises'\nimport { stringify as stringifyYaml } from 'yaml'\n\nexport const removeCommand = new Command('remove')\n .description('Remove a team member')\n .argument('<slug>', 'Team member slug to remove')\n .option('-f, --force', 'Skip confirmation prompt')\n .action(async (slug: string, options: { force?: boolean }) => {\n await runRemove(slug, options)\n })\n\n/**\n * Run the remove command to delete a team member.\n */\nasync function runRemove(slug: string, options: { force?: boolean }): Promise<void> {\n try {\n const theme = getTheme()\n\n // Load existing config\n const config = await loadConfig()\n const attestItConfig = toAttestItConfig(config)\n\n // Check if member exists\n // eslint-disable-next-line security/detect-object-injection\n const existingMember = attestItConfig.team?.[slug]\n if (!existingMember) {\n error(`Team member \"${slug}\" not found`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n log('')\n log(theme.blue.bold()(`Remove Team Member: ${slug}`))\n log('')\n log(`Name: ${existingMember.name}`)\n if (existingMember.email) {\n log(`Email: ${existingMember.email}`)\n }\n if (existingMember.github) {\n log(`GitHub: ${existingMember.github}`)\n }\n log('')\n\n // Check for existing seals by this member\n const projectRoot = process.cwd()\n let sealsFile\n try {\n sealsFile = readSealsSync(projectRoot, attestItConfig.settings.sealsPath)\n } catch {\n // No seals file exists yet\n sealsFile = { version: 1, seals: {} }\n }\n\n const sealsCreatedByMember: string[] = []\n for (const [gateId, seal] of Object.entries(sealsFile.seals)) {\n if (seal.sealedBy === slug) {\n sealsCreatedByMember.push(gateId)\n }\n }\n\n if (sealsCreatedByMember.length > 0) {\n warn('This member has created seals for the following gates:')\n for (const gateId of sealsCreatedByMember) {\n warn(` - ${gateId}`)\n }\n log('')\n warn('These seals will still be valid but attributed to a removed member.')\n log('')\n }\n\n // Get gates this member is authorized for\n const authorizedGates: string[] = []\n if (attestItConfig.gates) {\n for (const [gateId, gate] of Object.entries(attestItConfig.gates)) {\n if (gate.authorizedSigners.includes(slug)) {\n authorizedGates.push(gateId)\n }\n }\n }\n\n if (authorizedGates.length > 0) {\n log('This member is authorized for the following gates:')\n for (const gateId of authorizedGates) {\n log(` - ${gateId}`)\n }\n log('')\n }\n\n // Confirm removal\n if (!options.force) {\n const confirmed = await confirm({\n message: `Are you sure you want to remove \"${slug}\"?`,\n default: false,\n })\n\n if (!confirmed) {\n error('Removal cancelled')\n process.exit(ExitCode.CANCELLED)\n }\n }\n\n // Remove from team\n const updatedTeam = { ...attestItConfig.team }\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete, security/detect-object-injection\n delete updatedTeam[slug]\n\n // Update config\n const updatedConfig: Config = {\n ...config,\n team: updatedTeam,\n }\n\n // Remove from all gate authorizations\n if (updatedConfig.gates) {\n for (const gate of Object.values(updatedConfig.gates)) {\n gate.authorizedSigners = gate.authorizedSigners.filter((s) => s !== slug)\n }\n }\n\n // Write config back to file\n const configPath = findConfigPath()\n if (!configPath) {\n error('Configuration file not found')\n process.exit(ExitCode.CONFIG_ERROR)\n }\n\n const yamlContent = stringifyYaml(updatedConfig)\n await writeFile(configPath, yamlContent, 'utf8')\n\n log('')\n success(`Team member \"${slug}\" removed successfully`)\n log('')\n } catch (err) {\n if (err instanceof Error) {\n error(err.message)\n } else {\n error('Unknown error occurred')\n }\n process.exit(ExitCode.CONFIG_ERROR)\n }\n}\n","import { Command } from 'commander'\nimport { listCommand } from './list.js'\nimport { addCommand } from './add.js'\nimport { joinCommand } from './join.js'\nimport { removeCommand } from './remove.js'\n\nexport const teamCommand = new Command('team')\n .description('Manage team members and authorizations')\n .addCommand(listCommand)\n .addCommand(addCommand)\n .addCommand(joinCommand)\n .addCommand(removeCommand)\n","import { Command } from 'commander'\nimport tabtab from '@pnpm/tabtab'\nimport { loadLocalConfig, loadConfig } from '@attest-it/core'\nimport { success, error, log, info } from '../utils/output.js'\nimport { ExitCode } from '../utils/exit-codes.js'\n\n/** Primary program name */\nconst PROGRAM_NAME = 'attest-it'\n/** Short alias for the program */\nconst PROGRAM_ALIAS = 'attest'\n/** All valid program names for completion context detection */\nconst PROGRAM_NAMES = [PROGRAM_NAME, PROGRAM_ALIAS]\n\ntype SupportedShell = 'bash' | 'zsh' | 'fish'\n\nfunction isSupportedShell(value: string): value is SupportedShell {\n return value === 'bash' || value === 'zsh' || value === 'fish'\n}\n\n/**\n * Get completions based on the current completion context.\n */\nasync function getCompletions(env: tabtab.ParseEnvResult): Promise<void> {\n let shell: SupportedShell\n try {\n const detectedShell = tabtab.getShellFromEnv(process.env)\n // Only use bash, zsh, fish (not pwsh)\n shell = detectedShell === 'pwsh' ? 'bash' : detectedShell\n } catch {\n // If SHELL isn't set properly, default to bash-compatible output\n shell = 'bash'\n }\n\n // Top-level commands\n const commands: tabtab.CompletionItem[] = [\n { name: 'init', description: 'Initialize a new config file' },\n { name: 'status', description: 'Show status of all gates' },\n { name: 'run', description: 'Run test suites interactively' },\n { name: 'verify', description: 'Verify all seals are valid' },\n { name: 'seal', description: 'Create a seal for a gate' },\n { name: 'prune', description: 'Remove stale attestations' },\n { name: 'identity', description: 'Manage identities' },\n { name: 'team', description: 'Manage team members' },\n { name: 'whoami', description: 'Show active identity' },\n { name: 'completion', description: 'Shell completion commands' },\n ]\n\n // Global options\n const globalOptions: tabtab.CompletionItem[] = [\n { name: '--help', description: 'Show help' },\n { name: '--version', description: 'Show version' },\n { name: '--verbose', description: 'Verbose output' },\n { name: '--quiet', description: 'Minimal output' },\n { name: '--config', description: 'Path to config file' },\n ]\n\n // Identity subcommands\n const identitySubcommands: tabtab.CompletionItem[] = [\n { name: 'create', description: 'Create a new identity' },\n { name: 'list', description: 'List all identities' },\n { name: 'use', description: 'Switch active identity' },\n { name: 'remove', description: 'Remove an identity' },\n ]\n\n // Team subcommands\n const teamSubcommands: tabtab.CompletionItem[] = [\n { name: 'add', description: 'Add yourself to the team' },\n { name: 'list', description: 'List team members' },\n { name: 'remove', description: 'Remove a team member' },\n ]\n\n // Completion subcommands\n const completionSubcommands: tabtab.CompletionItem[] = [\n { name: 'install', description: 'Install shell completion' },\n { name: 'uninstall', description: 'Uninstall shell completion' },\n ]\n\n // Parse the command line to understand context\n const words: string[] = env.line.split(/\\s+/).filter(Boolean)\n const lastWord: string = env.last\n const prevWord: string = env.prev\n\n // If completing an option value\n if (prevWord === '--config' || prevWord === '-c') {\n // Let shell handle file completion\n tabtab.logFiles()\n return\n }\n\n // If typing an option\n if (lastWord.startsWith('-')) {\n tabtab.log(globalOptions, shell, console.log)\n return\n }\n\n // Determine which command we're in\n // Skip program names (attest-it, attest) and npx\n const commandIndex = words.findIndex(\n (w: string) => !w.startsWith('-') && !PROGRAM_NAMES.includes(w) && w !== 'npx',\n )\n const currentCommand: string | null = commandIndex >= 0 ? (words[commandIndex] ?? null) : null\n\n // Handle subcommand completions\n if (currentCommand === 'identity') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (subcommand === 'use' || subcommand === 'remove') {\n // Complete with identity slugs\n const identities = await getIdentitySlugs()\n if (identities.length > 0) {\n tabtab.log(identities, shell, console.log)\n return\n }\n }\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(identitySubcommands, shell, console.log)\n return\n }\n }\n\n if (currentCommand === 'team') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(teamSubcommands, shell, console.log)\n return\n }\n }\n\n if (currentCommand === 'completion') {\n const subcommandIndex = words.findIndex(\n (w: string, i: number) => i > commandIndex && !w.startsWith('-'),\n )\n const subcommand: string | null = subcommandIndex >= 0 ? (words[subcommandIndex] ?? null) : null\n\n if (subcommand === 'install') {\n // Complete with shell names\n tabtab.log(['bash', 'zsh', 'fish'], shell, console.log)\n return\n }\n\n if (!subcommand || subcommandIndex < 0) {\n tabtab.log(completionSubcommands, shell, console.log)\n return\n }\n }\n\n // Commands that take a gate name as argument\n if (currentCommand === 'status' || currentCommand === 'verify' || currentCommand === 'seal') {\n const gates = await getGateNames()\n if (gates.length > 0) {\n tabtab.log(gates, shell, console.log)\n return\n }\n }\n\n // Commands that take a suite name as argument\n if (currentCommand === 'run') {\n const suites = await getSuiteNames()\n if (suites.length > 0) {\n tabtab.log(suites, shell, console.log)\n return\n }\n }\n\n // Default: show top-level commands\n // This handles both:\n // 1. No command typed yet (e.g., \"attest-it \")\n // 2. Partial/unknown command being typed (e.g., \"attest-it ini\")\n // The shell will filter by prefix for partial matches\n const knownCommands = [\n 'init',\n 'status',\n 'run',\n 'verify',\n 'seal',\n 'prune',\n 'identity',\n 'team',\n 'whoami',\n 'completion',\n ]\n if (!currentCommand || !knownCommands.includes(currentCommand)) {\n tabtab.log([...commands, ...globalOptions], shell, console.log)\n }\n}\n\n/**\n * Get identity slugs from local config.\n */\nasync function getIdentitySlugs(): Promise<string[]> {\n try {\n const config = await loadLocalConfig()\n if (config?.identities) {\n return Object.keys(config.identities)\n }\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\n/**\n * Get gate names from project config.\n */\nasync function getGateNames(): Promise<string[]> {\n try {\n const config = await loadConfig()\n if (config.gates) {\n return Object.keys(config.gates)\n }\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\n/**\n * Get suite names from project config.\n */\nasync function getSuiteNames(): Promise<string[]> {\n try {\n const config = await loadConfig()\n return Object.keys(config.suites)\n } catch {\n // Ignore errors - completions should fail silently\n }\n return []\n}\n\nexport const completionCommand = new Command('completion').description('Shell completion commands')\n\n/**\n * Detect the user's current shell from the SHELL environment variable.\n */\nfunction detectCurrentShell(): SupportedShell | null {\n const shellPath = process.env.SHELL ?? ''\n if (shellPath.endsWith('/bash') || shellPath.endsWith('/bash.exe')) {\n return 'bash'\n }\n if (shellPath.endsWith('/zsh') || shellPath.endsWith('/zsh.exe')) {\n return 'zsh'\n }\n if (shellPath.endsWith('/fish') || shellPath.endsWith('/fish.exe')) {\n return 'fish'\n }\n return null\n}\n\n/**\n * Get the source command for reloading a shell's config.\n */\nfunction getSourceCommand(shell: SupportedShell): string {\n switch (shell) {\n case 'bash':\n return 'source ~/.bashrc'\n case 'zsh':\n return 'source ~/.zshrc'\n case 'fish':\n return 'source ~/.config/fish/config.fish'\n }\n}\n\n// Install subcommand\ncompletionCommand\n .command('install [shell]')\n .description('Install shell completion (auto-detects shell, or specify bash/zsh/fish)')\n .action(async (shellArg?: string) => {\n try {\n let shell: SupportedShell\n\n if (shellArg !== undefined) {\n // User explicitly specified a shell\n if (!isSupportedShell(shellArg)) {\n error(`Shell \"${shellArg}\" is not supported. Use bash, zsh, or fish.`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n shell = shellArg\n } else {\n // Auto-detect from SHELL environment variable\n const detected = detectCurrentShell()\n if (!detected) {\n error(\n 'Could not detect your shell. Please specify: attest-it completion install <bash|zsh|fish>',\n )\n process.exit(ExitCode.CONFIG_ERROR)\n }\n shell = detected\n info(`Detected shell: ${shell}`)\n }\n\n // Install completions for both program names (attest-it and attest)\n await tabtab.install({\n name: PROGRAM_NAME,\n completer: PROGRAM_NAME,\n shell,\n })\n await tabtab.install({\n name: PROGRAM_ALIAS,\n completer: PROGRAM_ALIAS,\n shell,\n })\n\n log('')\n success(`Shell completion installed for ${shell}!`)\n info(`Completions enabled for both \"${PROGRAM_NAME}\" and \"${PROGRAM_ALIAS}\" commands.`)\n log('')\n info('Restart your shell or run:')\n log(` ${getSourceCommand(shell)}`)\n log('')\n } catch (err) {\n error(`Failed to install completion: ${err instanceof Error ? err.message : String(err)}`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n })\n\n// Uninstall subcommand\ncompletionCommand\n .command('uninstall')\n .description('Uninstall shell completion')\n .action(async () => {\n try {\n // Uninstall completions for both program names\n await tabtab.uninstall({\n name: PROGRAM_NAME,\n })\n await tabtab.uninstall({\n name: PROGRAM_ALIAS,\n })\n\n log('')\n success('Shell completion uninstalled!')\n log('')\n } catch (err) {\n error(`Failed to uninstall completion: ${err instanceof Error ? err.message : String(err)}`)\n process.exit(ExitCode.CONFIG_ERROR)\n }\n })\n\n// Hidden server subcommand (called by shell for completions)\n// Note: This is kept for backwards compatibility, but tabtab actually\n// calls `attest-it completion-server` (with hyphen) at the top level.\ncompletionCommand\n .command('server', { hidden: true })\n .description('Completion server (internal)')\n .action(async () => {\n const env = tabtab.parseEnv(process.env)\n if (env.complete) {\n await getCompletions(env)\n }\n })\n\n/**\n * Hidden top-level command called by tabtab for shell completions.\n * tabtab expects `<program> completion-server` (with hyphen) at the root.\n *\n * We create this dynamically as a function so it can be added with { hidden: true }\n * option when registering with the parent command.\n */\nexport function createCompletionServerCommand(): Command {\n return new Command('completion-server')\n .allowUnknownOption()\n .allowExcessArguments(true)\n .action(async () => {\n const env = tabtab.parseEnv(process.env)\n if (env.complete) {\n await getCompletions(env)\n }\n })\n}\n","import { Command } from 'commander'\nimport { initCommand } from './commands/init.js'\nimport { statusCommand } from './commands/status.js'\nimport { runCommand } from './commands/run.js'\nimport { pruneCommand } from './commands/prune.js'\nimport { verifyCommand } from './commands/verify.js'\nimport { sealCommand } from './commands/seal.js'\nimport { identityCommand } from './commands/identity/index.js'\nimport { whoamiCommand } from './commands/whoami.js'\nimport { teamCommand } from './commands/team/index.js'\nimport { completionCommand, createCompletionServerCommand } from './commands/completion.js'\nimport { setOutputOptions, initTheme } from './utils/output.js'\nimport { setAttestItHomeDir } from '@attest-it/core'\nimport { getPackageVersion } from './utils/version.js'\n\nconst program = new Command()\n\nprogram\n .name('attest-it')\n .description('Human-gated test attestation system')\n .option('-c, --config <path>', 'Path to config file')\n .option('-v, --verbose', 'Verbose output')\n .option('-q, --quiet', 'Minimal output')\n\n// Handle --version manually to avoid loading package.json on every invocation\nprogram.option('-V, --version', 'output the version number')\n\n// Register commands\nprogram.addCommand(initCommand)\nprogram.addCommand(statusCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(pruneCommand)\nprogram.addCommand(verifyCommand)\nprogram.addCommand(sealCommand)\nprogram.addCommand(identityCommand)\nprogram.addCommand(teamCommand)\nprogram.addCommand(whoamiCommand)\nprogram.addCommand(completionCommand)\nprogram.addCommand(createCompletionServerCommand(), { hidden: true })\n\n/**\n * Process the hidden --home-dir option before any other processing.\n * This must be done early so config loading uses the correct path.\n */\nfunction processHomeDirOption(): void {\n const homeDirIndex = process.argv.indexOf('--home-dir')\n if (homeDirIndex !== -1 && homeDirIndex + 1 < process.argv.length) {\n const homeDir = process.argv[homeDirIndex + 1]\n if (homeDir && !homeDir.startsWith('-')) {\n setAttestItHomeDir(homeDir)\n // Remove the option from argv so Commander doesn't complain\n process.argv.splice(homeDirIndex, 2)\n }\n }\n}\n\nexport async function run(): Promise<void> {\n // Process --home-dir before anything else (hidden option for testing)\n processHomeDirOption()\n\n // Check for --version flag before initializing theme or doing other work\n if (process.argv.includes('--version') || process.argv.includes('-V')) {\n console.log(getPackageVersion())\n process.exit(0)\n }\n\n // Skip theme initialization for completion-server (outputs escape sequences that corrupt completions)\n const isCompletionServer = process.argv.includes('completion-server')\n if (!isCompletionServer) {\n // Initialize theme before any output\n await initTheme()\n }\n\n // Parse options and set global output options\n program.parse()\n const options = program.opts<{ verbose?: boolean; quiet?: boolean }>()\n\n const outputOptions: { verbose?: boolean; quiet?: boolean } = {}\n if (options.verbose !== undefined) {\n outputOptions.verbose = options.verbose\n }\n if (options.quiet !== undefined) {\n outputOptions.quiet = options.quiet\n }\n\n setOutputOptions(outputOptions)\n}\n\nexport { program }\n","import { tryDelegateToLocal } from '../src/local-resolver.js'\n\n// Try local resolution BEFORE any other initialization\n// This ensures projects use their pinned version rather than a global installation\ntryDelegateToLocal()\n\nimport { run } from '../src/index.js'\n\nvoid run()\n"]}