ReferenceSpecs

CLI Contracts Specification

Technical specification for pair-cli command contracts, TypeScript types, validation rules, and error handling.

Technical specification for pair-cli command contracts including TypeScript types, validation rules, error handling, and exit codes.

Command Option Types

Base Types

export interface CommandOptions {
  datasetRoot?: string
  customConfigPath?: string
  baseTarget?: string // Target resolution: INIT_CWD (pnpm) > [target] arg > CWD
  useDefaults?: boolean
  minLogLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error'
}
 
export interface CliOptions {
  url?: string // --source <url|path>
  kb: boolean // --no-kb flag (true=download, false=offline)
}

Install Command

export interface InstallOptions extends CommandOptions, CliOptions {
  listTargets?: boolean
  config?: string
  source?: string
  offline?: boolean // derived from kb: false
}

Update Command

export interface UpdateOptions extends CommandOptions, CliOptions {
  config?: string
  source?: string
  offline?: boolean
}
export interface UpdateLinkOptions extends CommandOptions {
  url?: string
  dryRun?: boolean
  verbose?: boolean
}

Package Command

export interface PackageOptions {
  output?: string
  sourceDir?: string
  config?: string
  verbose?: boolean
  name?: string
  version?: string
  description?: string
  author?: string
  skipRegistries?: string[]
  root?: string // default: .pair/
  interactive: boolean // default: false
  tags: string[] // default: []
  license: string // default: MIT
  org?: boolean
  orgName?: string
  team?: string
  department?: string
  approver?: string
  compliance?: string[]
  distribution?: 'open' | 'private' | 'restricted'
}
 
export interface OrganizationMetadata {
  name: string
  team?: string
  department?: string
  approver?: string
  compliance: string[]
  distribution: 'open' | 'private' | 'restricted'
}
 
export interface ManifestMetadata {
  name: string
  version: string
  description: string
  author: string
  tags: string[]
  license: string
  created_at: string
  registries: string[]
  contentChecksum?: string
  organization?: OrganizationMetadata
}

KB Verify Command

export interface KbVerifyCommandConfig {
  packagePath: string
  json?: boolean
  minLogLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error'
}
 
export interface VerificationReport {
  valid: boolean
  checks: {
    checksum: ChecksumCheck
    structure: StructureCheck
    manifest: ManifestCheck
  }
  size: number
  timestamp: string
}

Validation Error Catalog

Error Categories

CategoryExit CodeDescription
Option Validation1Invalid option combination or missing required option
File System1Path not found, permission denied, not writable
Network2Download failure, connection timeout, DNS error
Checksum2SHA256 validation failure
Configuration1Invalid config.json structure or values
KB Structure1Invalid KB directory structure

Option Validation Errors

CodeErrorTriggerResolution
V001Conflicting options--list-targets with target argsUse separately
V002Offline requires source--offline without --sourceProvide --source
V003Offline cannot use URL--offline with HTTP URLUse local path
V004Invalid config file--config points to missing fileFix path
V005Malformed JSONInvalid JSON in configFix syntax

File System Errors

CodeErrorTriggerResolution
FS001Path not foundTarget path missingCreate dir or fix path
FS002Permission deniedInsufficient permissionsFix permissions
FS003Not writableRead-only targetFix write permissions
FS004Disk fullInsufficient spaceFree space

Package Verification Errors

CodeErrorTriggerResolution
VER001Package not foundFile missingCheck path
VER002Invalid formatNot valid ZIPUse valid package
VER003Checksum mismatchContent tamperedRe-download
VER004Missing manifestNo manifest.jsonUse valid package
VER005Missing registryStructure mismatchRebuild package

Validation Logic

Install/Update Option Validation

function validateInstallUpdateOptions(options: InstallOptions | UpdateOptions): void {
  const offline = options.kb === false
 
  if (offline && !options.source) {
    throw new ValidationError('V002', '--offline requires --source with local filesystem path')
  }
 
  if (offline && options.source && isUrl(options.source)) {
    throw new ValidationError('V003', 'Cannot use --offline with remote URL')
  }
 
  if (options.config && !fileExists(options.config)) {
    throw new ValidationError('V004', `Config file not found: ${options.config}`)
  }
}

Exit Code Contract

CodeMeaningExamples
0SuccessCommand completed successfully
1Validation ErrorInvalid options, config errors, KB structure errors
2Download/Network ErrorNetwork timeout, checksum mismatch, packaging error
3File System ErrorDisk full, permission denied during operation

Test Matrices

Install/Update Option Validation Matrix

--source--offlineMonorepoExpected ResultExit Code
--YesUse monorepo dataset0
--NoAuto-download0 or 2
https://...--Download from URL0 or 2
./local--Use local path0 or 1
./localYes-Use local (offline)0 or 1
-Yes-ERROR1
https://...Yes-ERROR1