@kolatts/pncli 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/copilot-instructions.md +34 -2
- package/dist/cli.js +1441 -41
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/lib/output.ts","../src/lib/errors.ts","../src/lib/config.ts","../src/services/git/client.ts","../src/lib/git-context.ts","../src/lib/http.ts","../src/services/bitbucket/client.ts","../src/services/git/commands.ts","../src/services/jira/client.ts","../src/services/jira/custom-fields.ts","../src/services/jira/commands.ts","../src/services/bitbucket/commands.ts","../src/services/confluence/commands.ts","../src/services/sonar/commands.ts","../src/services/artifactory/commands.ts","../src/services/config/commands.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'module';\nimport { setGlobalOptions, setGlobalUser } from './lib/output.js';\nimport { loadConfig } from './lib/config.js';\nimport { registerGitCommands } from './services/git/commands.js';\nimport { registerJiraCommands } from './services/jira/commands.js';\nimport { registerBitbucketCommands } from './services/bitbucket/commands.js';\nimport { registerConfluenceCommands } from './services/confluence/commands.js';\nimport { registerSonarCommands } from './services/sonar/commands.js';\nimport { registerArtifactoryCommands } from './services/artifactory/commands.js';\nimport { registerConfigCommands } from './services/config/commands.js';\n\nconst require = createRequire(import.meta.url);\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst pkg = require('../package.json') as any;\n\nconst TAGLINE = 'One command does what three meetings couldn\\'t.';\n\nconst program = new Command();\n\nprogram\n .name('pncli')\n .description(`The Paperwork Nightmare CLI — ${TAGLINE}`)\n .version(`${pkg.version as string} — ${TAGLINE}`, '-v, --version')\n .option('--pretty', 'Human-readable formatted output', false)\n .option('--verbose', 'Include full response metadata', false)\n .option('--dry-run', 'Print API requests without executing', false)\n .option('--config <path>', 'Override global config file location');\n\n// Propagate global options and user identity before any command runs\nprogram.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setGlobalOptions({\n pretty: Boolean(opts.pretty),\n verbose: Boolean(opts.verbose)\n });\n try {\n const config = loadConfig({ configPath: opts.config as string | undefined });\n setGlobalUser(config.user);\n } catch {\n // config may not exist yet (e.g. during `config init`) — silently skip\n }\n});\n\nregisterGitCommands(program);\nregisterJiraCommands(program);\nregisterBitbucketCommands(program);\nregisterConfluenceCommands(program);\nregisterSonarCommands(program);\nregisterArtifactoryCommands(program);\nregisterConfigCommands(program);\n\nprogram.addHelpText('after', `\nServices:\n git Local git operations (status, diff, log, branch)\n jira Jira Data Cloud (coming soon)\n bitbucket Bitbucket Server (coming soon)\n confluence Confluence (coming soon)\n sonar SonarQube (coming soon)\n artifactory Artifactory (coming soon)\n config Manage pncli configuration\n`);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n","import chalk from 'chalk';\nimport type { Meta, SuccessEnvelope, ErrorEnvelope, ErrorDetail } from '../types/common.js';\nimport { PncliError } from './errors.js';\n\nlet globalOptions = { pretty: false, verbose: false };\nlet globalUser: { email: string | undefined; userId: string | undefined } = { email: undefined, userId: undefined };\n\nexport function setGlobalOptions(opts: { pretty: boolean; verbose: boolean }): void {\n globalOptions = opts;\n}\n\nexport function setGlobalUser(user: { email: string | undefined; userId: string | undefined }): void {\n globalUser = user;\n}\n\nfunction buildMeta(service: string, action: string, startTime: number): Meta {\n return {\n service,\n action,\n timestamp: new Date().toISOString(),\n duration_ms: Date.now() - startTime,\n user: (globalUser.email ?? globalUser.userId) ? globalUser : undefined\n };\n}\n\nexport function success<T>(data: T, service: string, action: string, startTime: number): void {\n const envelope: SuccessEnvelope<T> = {\n ok: true,\n data,\n meta: buildMeta(service, action, startTime)\n };\n process.stdout.write(\n (globalOptions.pretty ? JSON.stringify(envelope, null, 2) : JSON.stringify(envelope)) + '\\n'\n );\n}\n\nexport function fail(\n err: unknown,\n service: string,\n action: string,\n startTime: number\n): never {\n const errorDetail: ErrorDetail = {\n status: err instanceof PncliError ? err.status : 1,\n message: err instanceof Error ? err.message : String(err),\n url: err instanceof PncliError ? (err.url ?? null) : null\n };\n\n const envelope: ErrorEnvelope = {\n ok: false,\n error: errorDetail,\n meta: buildMeta(service, action, startTime)\n };\n\n const msg = globalOptions.pretty\n ? chalk.red('✗ Error: ') + errorDetail.message\n : null;\n\n if (msg) process.stderr.write(msg + '\\n');\n\n process.stdout.write(\n (globalOptions.pretty ? JSON.stringify(envelope, null, 2) : JSON.stringify(envelope)) + '\\n'\n );\n\n process.exit(1);\n}\n\nexport function log(message: string): void {\n if (globalOptions.verbose) {\n process.stderr.write(\n (globalOptions.pretty ? chalk.gray('▸ ') : '') + message + '\\n'\n );\n }\n}\n\nexport function warn(message: string): void {\n process.stderr.write(\n (globalOptions.pretty ? chalk.yellow('⚠ ') : '') + message + '\\n'\n );\n}\n","export class PncliError extends Error {\n status: number;\n url?: string;\n\n constructor(message: string, status: number = 1, url?: string) {\n super(message);\n this.name = 'PncliError';\n this.status = status;\n this.url = url;\n }\n}\n","import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport type { GlobalConfig, RepoConfig, ResolvedConfig, JiraDefaults, BitbucketDefaults } from '../types/config.js';\nimport type { CustomFieldDefinition } from '../types/jira.js';\n\nconst ENV_KEYS = {\n EMAIL: 'PNCLI_EMAIL',\n USERID: 'PNCLI_USERID',\n JIRA_BASE_URL: 'PNCLI_JIRA_BASE_URL',\n JIRA_API_TOKEN: 'PNCLI_JIRA_API_TOKEN',\n BITBUCKET_BASE_URL: 'PNCLI_BITBUCKET_BASE_URL',\n BITBUCKET_PAT: 'PNCLI_BITBUCKET_PAT',\n CONFIG_PATH: 'PNCLI_CONFIG_PATH'\n} as const;\n\nfunction getGlobalConfigPath(overridePath?: string): string {\n if (overridePath) return overridePath;\n const envPath = process.env[ENV_KEYS.CONFIG_PATH];\n if (envPath) return envPath;\n return path.join(os.homedir(), '.pncli', 'config.json');\n}\n\nfunction loadJsonFile<T>(filePath: string): T | null {\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nfunction getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n } catch {\n return null;\n }\n}\n\nfunction mergeCustomFields(\n global: CustomFieldDefinition[] | undefined,\n repo: CustomFieldDefinition[] | undefined\n): CustomFieldDefinition[] {\n const map = new Map<string, CustomFieldDefinition>();\n for (const f of global ?? []) map.set(f.id, f);\n for (const f of repo ?? []) map.set(f.id, f); // repo wins\n return Array.from(map.values());\n}\n\nfunction mergeDefaults(\n global: GlobalConfig['defaults'],\n repo: RepoConfig['defaults']\n): { jira: JiraDefaults; bitbucket: BitbucketDefaults } {\n return {\n jira: { ...global?.jira, ...repo?.jira },\n bitbucket: { ...global?.bitbucket, ...repo?.bitbucket }\n };\n}\n\nexport interface LoadConfigOptions {\n configPath?: string;\n}\n\nexport function loadConfig(opts: LoadConfigOptions = {}): ResolvedConfig {\n const globalConfigPath = getGlobalConfigPath(opts.configPath);\n const globalConfig = loadJsonFile<GlobalConfig>(globalConfigPath) ?? {};\n\n const repoRoot = getRepoRoot();\n let repoConfig: RepoConfig = {};\n if (repoRoot) {\n repoConfig = loadJsonFile<RepoConfig>(path.join(repoRoot, '.pncli.json')) ?? {};\n }\n\n const mergedDefaults = mergeDefaults(globalConfig.defaults, repoConfig.defaults);\n\n return {\n user: {\n email: process.env[ENV_KEYS.EMAIL] ?? globalConfig.user?.email,\n userId: process.env[ENV_KEYS.USERID] ?? globalConfig.user?.userId\n },\n jira: {\n baseUrl: process.env[ENV_KEYS.JIRA_BASE_URL] ?? globalConfig.jira?.baseUrl,\n apiToken: process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken,\n customFields: mergeCustomFields(globalConfig.jira?.customFields, repoConfig.jira?.customFields)\n },\n bitbucket: {\n baseUrl: process.env[ENV_KEYS.BITBUCKET_BASE_URL] ?? globalConfig.bitbucket?.baseUrl,\n pat: process.env[ENV_KEYS.BITBUCKET_PAT] ?? globalConfig.bitbucket?.pat\n },\n defaults: mergedDefaults\n };\n}\n\nexport function writeGlobalConfig(config: GlobalConfig, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function writeRepoConfig(config: RepoConfig): void {\n const repoRoot = getRepoRoot();\n const targetDir = repoRoot ?? process.cwd();\n fs.writeFileSync(path.join(targetDir, '.pncli.json'), JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function setConfigValue(key: string, value: string, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const existing = loadJsonFile<GlobalConfig>(filePath) ?? {};\n\n const parts = key.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = existing;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part];\n }\n current[parts[parts.length - 1]!] = value;\n\n writeGlobalConfig(existing, configPath);\n}\n\nexport function maskConfig(config: ResolvedConfig): unknown {\n return {\n ...config,\n jira: {\n ...config.jira,\n apiToken: config.jira.apiToken ? '***' : undefined,\n customFields: config.jira.customFields\n },\n bitbucket: {\n ...config.bitbucket,\n pat: config.bitbucket.pat ? '***' : undefined\n }\n };\n}\n\nexport { getGlobalConfigPath };\n","import { execSync, execFileSync } from 'child_process';\n\nconst DIFF_LINE_LIMIT = 5000;\n\nexport interface GitStatusResult {\n staged: string[];\n unstaged: string[];\n untracked: string[];\n}\n\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n lines: string[];\n}\n\nexport interface DiffFile {\n path: string;\n binary: boolean;\n truncated: boolean;\n hunks: DiffHunk[];\n}\n\nexport interface DiffResult {\n files: DiffFile[];\n truncated: boolean;\n}\n\nexport interface CommitEntry {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\nexport interface BranchResult {\n current: string;\n local: string[];\n remote: string[];\n}\n\nfunction exec(cmd: string, cwd: string): string {\n return execSync(cmd, { encoding: 'utf8', cwd }).trim();\n}\n\nexport function getStatus(root: string): GitStatusResult {\n const output = exec('git status --porcelain', root);\n const staged: string[] = [];\n const unstaged: string[] = [];\n const untracked: string[] = [];\n\n if (!output) return { staged, unstaged, untracked };\n\n for (const line of output.split('\\n')) {\n if (!line) continue;\n const x = line[0]!;\n const y = line[1]!;\n const file = line.slice(3);\n\n if (x === '?' && y === '?') {\n untracked.push(file);\n } else {\n if (x !== ' ' && x !== '?') staged.push(file);\n if (y !== ' ' && y !== '?') unstaged.push(file);\n }\n }\n\n return { staged, unstaged, untracked };\n}\n\nfunction parseHunkHeader(header: string): { oldStart: number; oldCount: number; newStart: number; newCount: number } {\n const match = header.match(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (!match) return { oldStart: 0, oldCount: 0, newStart: 0, newCount: 0 };\n return {\n oldStart: parseInt(match[1]!, 10),\n oldCount: parseInt(match[2] ?? '1', 10),\n newStart: parseInt(match[3]!, 10),\n newCount: parseInt(match[4] ?? '1', 10)\n };\n}\n\nfunction parseDiff(rawDiff: string): DiffResult {\n const lines = rawDiff.split('\\n');\n const files: DiffFile[] = [];\n let globalTruncated = false;\n let lineCount = 0;\n\n let currentFile: DiffFile | null = null;\n let currentHunk: DiffHunk | null = null;\n\n for (const line of lines) {\n lineCount++;\n if (lineCount > DIFF_LINE_LIMIT) {\n globalTruncated = true;\n if (currentFile) currentFile.truncated = true;\n break;\n }\n\n if (line.startsWith('diff --git ')) {\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n currentHunk = null;\n if (currentFile) files.push(currentFile);\n\n const pathMatch = line.match(/diff --git a\\/(.+) b\\/.+$/);\n currentFile = {\n path: pathMatch ? pathMatch[1]! : line,\n binary: false,\n truncated: false,\n hunks: []\n };\n continue;\n }\n\n if (!currentFile) continue;\n\n if (line.startsWith('Binary files')) {\n currentFile.binary = true;\n continue;\n }\n\n if (line.startsWith('@@ ')) {\n if (currentHunk) currentFile.hunks.push(currentHunk);\n const { oldStart, oldCount, newStart, newCount } = parseHunkHeader(line);\n currentHunk = { oldStart, oldCount, newStart, newCount, lines: [] };\n continue;\n }\n\n if (currentHunk && (line.startsWith('+') || line.startsWith('-') || line.startsWith(' '))) {\n currentHunk.lines.push(line);\n }\n }\n\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n if (currentFile) files.push(currentFile);\n\n return { files, truncated: globalTruncated };\n}\n\nexport function getDiff(root: string, opts: { staged?: boolean; file?: string }): DiffResult {\n const args = ['git', 'diff'];\n if (opts.staged) args.push('--staged');\n if (opts.file) args.push('--', opts.file);\n\n try {\n const raw = exec(args.join(' '), root);\n if (!raw) return { files: [], truncated: false };\n return parseDiff(raw);\n } catch {\n return { files: [], truncated: false };\n }\n}\n\nexport function getLog(root: string, opts: { count?: number; since?: string }): CommitEntry[] {\n const sep = '\\x1F'; // ASCII unit separator — safe in git format strings\n const fmt = `%H${sep}%an${sep}%aI${sep}%s`;\n const args = [`log`, `--format=${fmt}`];\n if (opts.count) args.push(`-n`, String(opts.count));\n if (opts.since) args.push(`--since=${opts.since}`);\n\n try {\n const output = execFileSync('git', args, { encoding: 'utf8', cwd: root }).trim();\n if (!output) return [];\n return output.split('\\n').filter(Boolean).map(line => {\n const parts = line.split(sep);\n return {\n hash: parts[0] ?? '',\n author: parts[1] ?? '',\n date: parts[2] ?? '',\n message: parts[3] ?? ''\n };\n });\n } catch {\n return [];\n }\n}\n\nexport function getBranches(root: string): BranchResult {\n const output = exec('git branch -a', root);\n const local: string[] = [];\n const remote: string[] = [];\n let current = '';\n\n for (const line of output.split('\\n')) {\n if (!line.trim()) continue;\n const isCurrent = line.startsWith('*');\n const name = line.replace(/^\\*?\\s+/, '').trim();\n\n if (name.startsWith('remotes/')) {\n remote.push(name.replace('remotes/', ''));\n } else {\n if (isCurrent) current = name;\n local.push(name);\n }\n }\n\n return { current, local, remote };\n}\n","import { execSync } from 'child_process';\nimport type { ResolvedConfig } from '../types/config.js';\n\nexport interface GitContext {\n root: string;\n branch: string;\n project: string | null;\n repo: string | null;\n}\n\nexport function getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n } catch {\n return null;\n }\n}\n\nexport function getCurrentBranch(repoRoot: string): string | null {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n cwd: repoRoot\n }).trim();\n } catch {\n return null;\n }\n}\n\nexport function parseRemote(\n remoteUrl: string,\n bitbucketBaseUrl: string | undefined\n): { project: string; repo: string } | null {\n if (!bitbucketBaseUrl) return null;\n\n // Normalize base URL for comparison\n const base = bitbucketBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '');\n\n // SSH format: git@bitbucket.company.com:7999/PROJ/repo.git\n const sshMatch = remoteUrl.match(/^git@([^:]+)(?::\\d+)?[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n const [, host, project, repo] = sshMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n // HTTPS format: https://bitbucket.company.com/scm/PROJ/repo.git\n const httpsMatch = remoteUrl.match(/^https?:\\/\\/([^/]+)\\/scm\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (httpsMatch) {\n const [, host, project, repo] = httpsMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n return null;\n}\n\nfunction getRemoteUrls(repoRoot: string): string[] {\n try {\n const output = execSync('git remote -v', { encoding: 'utf8', cwd: repoRoot });\n return output\n .split('\\n')\n .filter(line => line.includes('(fetch)'))\n .map(line => line.split('\\t')[1]?.split(' ')[0] ?? '')\n .filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getGitContext(config: ResolvedConfig): GitContext | null {\n const root = getRepoRoot();\n if (!root) return null;\n\n const branch = getCurrentBranch(root) ?? 'unknown';\n const remoteUrls = getRemoteUrls(root);\n\n let project: string | null = null;\n let repo: string | null = null;\n\n for (const url of remoteUrls) {\n const parsed = parseRemote(url, config.bitbucket.baseUrl);\n if (parsed) {\n project = parsed.project;\n repo = parsed.repo;\n break;\n }\n }\n\n return { root, branch, project, repo };\n}\n","import type { ResolvedConfig } from '../types/config.js';\nimport { PncliError } from './errors.js';\nimport { log } from './output.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface HttpRequestOptions {\n method?: HttpMethod;\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n timeoutMs?: number;\n}\n\nexport interface HttpError {\n error: true;\n status: number;\n message: string;\n url: string;\n}\n\nfunction buildUrl(base: string, path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(path, base.endsWith('/') ? base : base + '/');\n if (params) {\n for (const [key, val] of Object.entries(params)) {\n if (val !== undefined) {\n url.searchParams.set(key, String(val));\n }\n }\n }\n return url.toString();\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function request<T>(\n url: string,\n init: RequestInit,\n timeoutMs: number\n): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n let response: Response;\n try {\n response = await fetchWithTimeout(url, init, timeoutMs);\n } catch (err) {\n throw new PncliError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n url\n );\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : (attempt + 1) * 1000;\n log(`Rate limited. Retrying after ${waitMs}ms...`);\n await new Promise(resolve => setTimeout(resolve, waitMs));\n lastError = new PncliError('Rate limited', 429, url);\n continue;\n }\n\n if (!response.ok) {\n let message = `HTTP ${response.status} ${response.statusText}`;\n try {\n const body = await response.text();\n const parsed = JSON.parse(body);\n if (parsed.message) message = parsed.message;\n else if (parsed.errors?.[0]?.message) message = parsed.errors[0].message;\n } catch {\n // ignore parse errors\n }\n throw new PncliError(message, response.status, url);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n throw lastError ?? new PncliError('Request failed after retries', 1, url);\n}\n\nexport class HttpClient {\n private config: ResolvedConfig;\n private dryRun: boolean;\n\n constructor(config: ResolvedConfig, dryRun = false) {\n this.config = config;\n this.dryRun = dryRun;\n }\n\n private jiraHeaders(): Record<string, string> {\n const { apiToken } = this.config.jira;\n if (!apiToken) throw new PncliError('Jira credentials not configured. Run: pncli config init');\n return {\n 'Authorization': `Bearer ${apiToken}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n };\n }\n\n private bitbucketHeaders(): Record<string, string> {\n const { pat } = this.config.bitbucket;\n if (!pat) throw new PncliError('Bitbucket credentials not configured. Run: pncli config init');\n return {\n 'Authorization': `Bearer ${pat}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n };\n }\n\n async jira<T>(\n path: string,\n opts: HttpRequestOptions = {}\n ): Promise<T> {\n const baseUrl = this.config.jira.baseUrl;\n if (!baseUrl) throw new PncliError('Jira baseUrl not configured. Run: pncli config init');\n\n const url = buildUrl(baseUrl, path, opts.params);\n const headers = this.jiraHeaders();\n const init: RequestInit = {\n method: opts.method ?? 'GET',\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined\n };\n\n if (this.dryRun) {\n const safeHeaders = { ...headers, Authorization: '[REDACTED]' };\n process.stderr.write(`DRY RUN: ${init.method} ${url}\\nHeaders: ${JSON.stringify(safeHeaders, null, 2)}\\n`);\n if (opts.body) process.stderr.write(`Body: ${JSON.stringify(opts.body, null, 2)}\\n`);\n process.exit(0);\n }\n\n return request<T>(url, init, opts.timeoutMs ?? 30000);\n }\n\n async bitbucket<T>(\n path: string,\n opts: HttpRequestOptions = {}\n ): Promise<T> {\n const baseUrl = this.config.bitbucket.baseUrl;\n if (!baseUrl) throw new PncliError('Bitbucket baseUrl not configured. Run: pncli config init');\n\n const url = buildUrl(baseUrl, path, opts.params);\n const headers = this.bitbucketHeaders();\n const init: RequestInit = {\n method: opts.method ?? 'GET',\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined\n };\n\n if (this.dryRun) {\n const safeHeaders = { ...headers, Authorization: '[REDACTED]' };\n process.stderr.write(`DRY RUN: ${init.method} ${url}\\nHeaders: ${JSON.stringify(safeHeaders, null, 2)}\\n`);\n if (opts.body) process.stderr.write(`Body: ${JSON.stringify(opts.body, null, 2)}\\n`);\n process.exit(0);\n }\n\n return request<T>(url, init, opts.timeoutMs ?? 30000);\n }\n\n async paginate<T>(\n fetchPage: (start: number, limit: number) => Promise<{ values: T[]; isLastPage: boolean; nextPageStart?: number }>\n ): Promise<T[]> {\n const results: T[] = [];\n let start = 0;\n const limit = 100;\n\n while (true) {\n const page = await fetchPage(start, limit);\n results.push(...page.values);\n if (page.isLastPage) break;\n start = page.nextPageStart ?? start + limit;\n }\n\n return results;\n }\n\n async jiraPaginate<T>(\n fetchPage: (startAt: number, maxResults: number) => Promise<{ issues?: T[]; values?: T[]; total: number; startAt: number; maxResults: number }>\n ): Promise<T[]> {\n const results: T[] = [];\n let startAt = 0;\n const maxResults = 100;\n\n while (true) {\n const page = await fetchPage(startAt, maxResults);\n const items = (page.issues ?? page.values ?? []) as T[];\n results.push(...items);\n startAt += items.length;\n if (startAt >= page.total || items.length === 0) break;\n }\n\n return results;\n }\n}\n\nexport function createHttpClient(config: ResolvedConfig, dryRun = false): HttpClient {\n return new HttpClient(config, dryRun);\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n BitbucketPR,\n BitbucketComment,\n BitbucketPageResponse,\n BitbucketBuildStatus\n} from '../../types/bitbucket.js';\n\nconst API = '/rest/api/1.0';\n\nexport interface ListPRsOpts {\n project: string;\n repo: string;\n state?: string;\n author?: string;\n reviewer?: string;\n}\n\nexport interface CreatePROpts {\n project: string;\n repo: string;\n title: string;\n source: string;\n target: string;\n description?: string;\n reviewers?: string[];\n}\n\nexport interface UpdatePROpts {\n project: string;\n repo: string;\n id: number;\n title?: string;\n description?: string;\n reviewers?: string[];\n version: number;\n}\n\nexport interface MergePROpts {\n project: string;\n repo: string;\n id: number;\n version: number;\n strategy?: 'merge' | 'squash' | 'ff';\n deleteBranch?: boolean;\n}\n\nexport interface InlineCommentOpts {\n project: string;\n repo: string;\n prId: number;\n text: string;\n filePath: string;\n line: number;\n lineType?: 'ADDED' | 'REMOVED' | 'CONTEXT';\n}\n\nexport class BitbucketClient {\n constructor(private http: HttpClient) {}\n\n async listPRs(opts: ListPRsOpts): Promise<BitbucketPR[]> {\n return this.http.paginate<BitbucketPR>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<BitbucketPR>>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n params: {\n state: opts.state ?? 'OPEN',\n ...(opts.author ? { 'author.username': opts.author } : {}),\n start,\n limit\n }\n }\n )\n );\n }\n\n async getPR(project: string, repo: string, id: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}`\n );\n }\n\n async createPR(opts: CreatePROpts): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n description: opts.description,\n fromRef: {\n id: `refs/heads/${opts.source}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n toRef: {\n id: `refs/heads/${opts.target}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n reviewers: (opts.reviewers ?? []).map(slug => ({ user: { slug } }))\n }\n }\n );\n }\n\n async updatePR(opts: UpdatePROpts): Promise<BitbucketPR> {\n const body: Record<string, unknown> = { version: opts.version };\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (opts.reviewers) body.reviewers = opts.reviewers.map(slug => ({ user: { slug } }));\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}`,\n { method: 'PUT', body }\n );\n }\n\n async mergePR(opts: MergePROpts): Promise<BitbucketPR> {\n const params: Record<string, string | number | boolean | undefined> = {\n version: opts.version\n };\n const body: Record<string, unknown> = {};\n if (opts.strategy) body.strategyId = opts.strategy;\n if (opts.deleteBranch) body.autoSubject = true;\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}/merge`,\n { method: 'POST', params, body }\n );\n }\n\n async declinePR(project: string, repo: string, id: number, version: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}/decline`,\n { method: 'POST', params: { version } }\n );\n }\n\n async listComments(project: string, repo: string, prId: number): Promise<BitbucketComment[]> {\n interface Activity { action: string; comment?: BitbucketComment }\n const activities = await this.http.paginate<Activity>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<Activity>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/activities`,\n { params: { start, limit } }\n )\n );\n return activities\n .filter(a => a.action === 'COMMENTED' && a.comment)\n .map(a => a.comment!);\n }\n\n async addComment(project: string, repo: string, prId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text } }\n );\n }\n\n async addInlineComment(opts: InlineCommentOpts): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.prId}/comments`,\n {\n method: 'POST',\n body: {\n text: opts.text,\n anchor: {\n line: opts.line,\n lineType: opts.lineType ?? 'ADDED',\n fileType: 'TO',\n path: opts.filePath\n }\n }\n }\n );\n }\n\n async replyComment(project: string, repo: string, prId: number, commentId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text, parent: { id: commentId } } }\n );\n }\n\n async resolveComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}/resolve`,\n { method: 'PUT', params: { version } }\n );\n }\n\n async deleteComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}`,\n { method: 'DELETE', params: { version } }\n );\n }\n\n async getDiff(project: string, repo: string, prId: number, file?: string, contextLines?: number): Promise<string> {\n const params: Record<string, string | number | boolean | undefined> = {};\n if (contextLines !== undefined) params.contextLines = contextLines;\n if (file) params.path = file;\n\n const result = await this.http.bitbucket<{ diffs?: unknown[] } | string>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/diff`,\n { params }\n );\n // Return raw diff as string\n return typeof result === 'string' ? result : JSON.stringify(result);\n }\n\n async listFiles(project: string, repo: string, prId: number): Promise<string[]> {\n const result = await this.http.bitbucket<{ values?: Array<{ path: { toString: string } }> }>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/changes`,\n { params: { limit: 1000 } }\n );\n return (result.values ?? []).map(v => (typeof v.path === 'string' ? v.path : JSON.stringify(v.path)));\n }\n\n async approvePR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/~`,\n { method: 'PUT', body: { status: 'APPROVED' } }\n );\n }\n\n async unapprovePR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/~`,\n { method: 'DELETE' }\n );\n }\n\n async needsWorkPR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/~`,\n { method: 'PUT', body: { status: 'NEEDS_WORK' } }\n );\n }\n\n async listReviewers(project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(project, repo, prId);\n return pr.reviewers;\n }\n\n async listBuilds(project: string, repo: string, prId: number): Promise<BitbucketBuildStatus[]> {\n // Get the latest commit on the source branch\n const commits = await this.http.bitbucket<BitbucketPageResponse<{ id: string }>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/commits`,\n { params: { limit: 1 } }\n );\n const sha = commits.values[0]?.id;\n if (!sha) return [];\n return this.getBuildStatus(sha);\n }\n\n async getBuildStatus(commit: string): Promise<BitbucketBuildStatus[]> {\n const result = await this.http.bitbucket<BitbucketPageResponse<BitbucketBuildStatus>>(\n `/rest/build-status/1.0/commits/${commit}`\n );\n return result.values ?? [];\n }\n}\n","import { Command } from 'commander';\nimport { getStatus, getDiff, getLog, getBranches } from './client.js';\nimport { getRepoRoot, getCurrentBranch } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { BitbucketClient } from '../bitbucket/client.js';\nimport { getGitContext } from '../../lib/git-context.js';\n\nfunction requireRepoRoot(): string {\n const root = getRepoRoot();\n if (!root) throw new PncliError('Not a git repository', 1);\n return root;\n}\n\nexport function registerGitCommands(program: Command): void {\n const git = program.command('git').description('Local git operations');\n\n git\n .command('status')\n .description('Show staged, unstaged, and untracked files as JSON')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getStatus(root);\n success(data, 'git', 'status', start);\n } catch (err) {\n fail(err, 'git', 'status', start);\n }\n });\n\n git\n .command('diff')\n .description('Show diff as structured JSON')\n .option('--staged', 'Show staged changes only')\n .option('--file <path>', 'Limit diff to a specific file')\n .action((opts: { staged?: boolean; file?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getDiff(root, { staged: opts.staged, file: opts.file });\n success(data, 'git', 'diff', start);\n } catch (err) {\n fail(err, 'git', 'diff', start);\n }\n });\n\n git\n .command('log')\n .description('Show recent commits as JSON')\n .option('--count <n>', 'Number of commits to show', '10')\n .option('--since <date>', 'Show commits since date (e.g. \"2 weeks ago\")')\n .action((opts: { count?: string; since?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const count = opts.count ? parseInt(opts.count, 10) : undefined;\n const data = getLog(root, { count, since: opts.since });\n success(data, 'git', 'log', start);\n } catch (err) {\n fail(err, 'git', 'log', start);\n }\n });\n\n git\n .command('branch')\n .description('Show current branch and all local/remote branches')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getBranches(root);\n success(data, 'git', 'branch', start);\n } catch (err) {\n fail(err, 'git', 'branch', start);\n }\n });\n\n git\n .command('current-pr')\n .description('Find the open PR for the current branch')\n .action(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n\n if (!config.bitbucket.baseUrl || !config.bitbucket.pat) {\n success(\n { message: 'Requires Bitbucket config. Available after pncli config init.' },\n 'git',\n 'current-pr',\n start\n );\n return;\n }\n\n const root = requireRepoRoot();\n const branch = getCurrentBranch(root);\n if (!branch) throw new PncliError('Could not determine current branch', 1);\n\n const ctx = getGitContext(config);\n const project = ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo = ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n if (!project || !repo) throw new PncliError('Could not determine Bitbucket project/repo', 1);\n\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const prs = await client.listPRs({ project, repo, state: 'OPEN' });\n const match = prs.find(pr => pr.fromRef.displayId === branch) ?? null;\n success(match, 'git', 'current-pr', start);\n } catch (err) {\n fail(err, 'git', 'current-pr', start);\n }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n JiraIssue,\n JiraTransition,\n JiraComment,\n JiraSearchResult,\n JiraFieldInfo,\n CustomFieldDefinition\n} from '../../types/jira.js';\n\nconst API = '/rest/api/2';\n\nexport interface CreateIssueOpts {\n project: string;\n issueType: string;\n summary: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface UpdateIssueOpts {\n summary?: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface LinkIssueOpts {\n key: string;\n linkType: string;\n target: string;\n}\n\nexport class JiraClient {\n constructor(private http: HttpClient) {}\n\n async getIssue(key: string): Promise<JiraIssue> {\n return this.http.jira<JiraIssue>(`${API}/issue/${key}`);\n }\n\n async createIssue(opts: CreateIssueOpts): Promise<JiraIssue> {\n const body: Record<string, unknown> = {\n fields: {\n project: { key: opts.project },\n issuetype: { name: opts.issueType },\n summary: opts.summary,\n ...(opts.description ? { description: opts.description } : {}),\n ...(opts.priority ? { priority: { name: opts.priority } } : {}),\n ...(opts.assignee ? { assignee: { name: opts.assignee } } : {}),\n ...(opts.labels?.length ? { labels: opts.labels } : {}),\n ...(opts.customFieldValues ?? {})\n }\n };\n\n const created = await this.http.jira<{ id: string; key: string }>(`${API}/issue`, {\n method: 'POST',\n body\n });\n\n return this.getIssue(created.key);\n }\n\n async updateIssue(key: string, opts: UpdateIssueOpts): Promise<void> {\n const fields: Record<string, unknown> = {};\n if (opts.summary) fields.summary = opts.summary;\n if (opts.description) fields.description = opts.description;\n if (opts.priority) fields.priority = { name: opts.priority };\n if (opts.assignee) fields.assignee = { name: opts.assignee };\n if (opts.labels) fields.labels = opts.labels;\n Object.assign(fields, opts.customFieldValues ?? {});\n\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { fields }\n });\n }\n\n async listTransitions(key: string): Promise<JiraTransition[]> {\n const result = await this.http.jira<{ transitions: JiraTransition[] }>(\n `${API}/issue/${key}/transitions`\n );\n return result.transitions;\n }\n\n async transitionIssue(key: string, transitionId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/transitions`, {\n method: 'POST',\n body: { transition: { id: transitionId } }\n });\n }\n\n async addComment(key: string, text: string): Promise<JiraComment> {\n return this.http.jira<JiraComment>(`${API}/issue/${key}/comment`, {\n method: 'POST',\n body: { body: text }\n });\n }\n\n async listComments(key: string): Promise<JiraComment[]> {\n return this.http.jiraPaginate<JiraComment>(async (startAt, maxResults) => {\n const result = await this.http.jira<{ comments: JiraComment[]; total: number; startAt: number; maxResults: number }>(\n `${API}/issue/${key}/comment`,\n { params: { startAt, maxResults } }\n );\n return { ...result, values: result.comments };\n });\n }\n\n async search(jql: string, maxResults?: number, customFields?: CustomFieldDefinition[]): Promise<JiraSearchResult> {\n const standardFields = ['summary', 'status', 'priority', 'assignee', 'issuetype', 'project', 'created', 'updated', 'labels', 'reporter'];\n const fields = customFields?.length\n ? [...standardFields, ...customFields.map(f => f.id)]\n : standardFields;\n\n if (maxResults !== undefined) {\n return this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, maxResults, fields }\n });\n }\n\n // Paginate all results\n const allIssues = await this.http.jiraPaginate<JiraIssue>(async (startAt, max) => {\n const result = await this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, startAt, maxResults: max, fields }\n });\n return { ...result, values: result.issues };\n });\n\n return { issues: allIssues, total: allIssues.length, startAt: 0, maxResults: allIssues.length };\n }\n\n async fetchFields(): Promise<JiraFieldInfo[]> {\n return this.http.jira<JiraFieldInfo[]>(`${API}/field`);\n }\n\n async assignIssue(key: string, accountId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/assignee`, {\n method: 'PUT',\n body: { accountId }\n });\n }\n\n async linkIssue(opts: LinkIssueOpts): Promise<void> {\n // First, find the link type ID if a name was given\n let linkTypeId = opts.linkType;\n if (isNaN(parseInt(opts.linkType, 10))) {\n const types = await this.http.jira<{ issueLinkTypes: Array<{ id: string; name: string; inward: string; outward: string }> }>(\n `${API}/issueLinkType`\n );\n const found = types.issueLinkTypes.find(\n t => t.name.toLowerCase() === opts.linkType.toLowerCase() ||\n t.inward.toLowerCase() === opts.linkType.toLowerCase() ||\n t.outward.toLowerCase() === opts.linkType.toLowerCase()\n );\n if (!found) throw new Error(`Link type not found: ${opts.linkType}`);\n linkTypeId = found.id;\n }\n\n await this.http.jira<void>(`${API}/issueLink`, {\n method: 'POST',\n body: {\n type: { id: linkTypeId },\n inwardIssue: { key: opts.key },\n outwardIssue: { key: opts.target }\n }\n });\n }\n}\n","import type { CustomFieldDefinition, CustomFieldMap, CustomFieldType } from '../../types/jira.js';\n\nexport function buildFieldMap(fields: CustomFieldDefinition[]): CustomFieldMap {\n const byName = new Map<string, CustomFieldDefinition>();\n const byId = new Map<string, CustomFieldDefinition>();\n for (const f of fields) {\n byName.set(f.name.toLowerCase(), f);\n byId.set(f.id, f);\n }\n return { byName, byId };\n}\n\n/**\n * Replace friendly field names with customfield_* IDs in a JQL string.\n * Splits on quoted segments to avoid replacing inside string literals.\n * Sorts field names by length descending so \"Story Points\" matches before \"Story\".\n */\nexport function translateJql(jql: string, fieldMap: CustomFieldMap): string {\n if (fieldMap.byName.size === 0) return jql;\n\n // Sort names by length descending to avoid partial matches\n const sortedNames = Array.from(fieldMap.byName.keys()).sort((a, b) => b.length - a.length);\n\n // Split on quoted segments, only translate unquoted parts\n const parts = jql.split(/([\"'][^\"']*[\"'])/);\n return parts.map((part, i) => {\n if (i % 2 === 1) return part; // inside quotes — leave as-is\n let out = part;\n for (const name of sortedNames) {\n const def = fieldMap.byName.get(name)!;\n // Match the field name as a whole word (case-insensitive), optionally quoted\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n out = out.replace(new RegExp(`(?<![\\\\w\"'])${escaped}(?![\\\\w\"'])`, 'gi'), def.id);\n }\n return out;\n }).join('');\n}\n\n/**\n * Replace customfield_* keys with friendly names in an issue fields object.\n * Returns a new object; does not mutate the original.\n */\nexport function translateFieldsInOutput(\n fields: Record<string, unknown>,\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n if (fieldMap.byId.size === 0) return fields;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n const def = fieldMap.byId.get(key);\n result[def ? def.name : key] = value;\n }\n return result;\n}\n\n/**\n * Format a CLI string value into the shape Jira's API expects for a given field type.\n */\nexport function formatFieldValue(value: string, type: CustomFieldType): unknown {\n switch (type) {\n case 'number':\n return Number(value);\n case 'select':\n return { value };\n case 'multi-select':\n return value.split(',').map(v => ({ value: v.trim() }));\n case 'labels':\n return value.split(',').map(v => v.trim());\n case 'user':\n return { accountId: value };\n default:\n return value;\n }\n}\n","import { Command } from 'commander';\nimport { JiraClient } from './client.js';\nimport { buildFieldMap, translateJql, translateFieldsInOutput, formatFieldValue } from './custom-fields.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { CustomFieldMap } from '../../types/jira.js';\n\nfunction getClient(program: Command): JiraClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JiraClient(http);\n}\n\nfunction getClientAndFields(program: Command): { client: JiraClient; fieldMap: CustomFieldMap; customFields: import('../../types/jira.js').CustomFieldDefinition[] } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new JiraClient(http);\n const customFields = config.jira.customFields;\n const fieldMap = buildFieldMap(customFields);\n return { client, fieldMap, customFields };\n}\n\nfunction getDefaults(program: Command): { project?: string; issueType?: string; priority?: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n return {\n project: config.defaults.jira?.project,\n issueType: config.defaults.jira?.issueType,\n priority: config.defaults.jira?.priority\n };\n}\n\nexport function registerJiraCommands(program: Command): void {\n const jira = program.command('jira').description('Jira Data Cloud operations');\n\n jira.command('get-issue')\n .description('Get a Jira issue by key')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const data = await client.getIssue(opts.key);\n const translated = { ...data, fields: translateFieldsInOutput(data.fields as Record<string, unknown>, fieldMap) };\n success(translated, 'jira', 'get-issue', start);\n } catch (err) { fail(err, 'jira', 'get-issue', start); }\n });\n\n jira.command('create-issue')\n .description('Create a Jira issue')\n .option('--project <key>', 'Project key')\n .option('--type <type>', 'Issue type (Bug, Story, Task, ...)')\n .requiredOption('--summary <text>', 'Issue summary')\n .option('--description <text>', 'Issue description')\n .option('--priority <name>', 'Priority name')\n .option('--assignee <accountId>', 'Assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { project?: string; type?: string; summary: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const defaults = getDefaults(program);\n const project = opts.project ?? defaults.project;\n const issueType = opts.type ?? defaults.issueType ?? 'Task';\n const priority = opts.priority ?? defaults.priority;\n if (!project) throw new PncliError('--project required (or set defaults.jira.project in config)', 1);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n const data = await client.createIssue({ project, issueType, summary: opts.summary, description: opts.description, priority, assignee: opts.assignee, labels, customFieldValues });\n success(data, 'jira', 'create-issue', start);\n } catch (err) { fail(err, 'jira', 'create-issue', start); }\n });\n\n jira.command('update-issue')\n .description('Update a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .option('--summary <text>', 'New summary')\n .option('--description <text>', 'New description')\n .option('--priority <name>', 'New priority')\n .option('--assignee <accountId>', 'New assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { key: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n await client.updateIssue(opts.key, { summary: opts.summary, description: opts.description, priority: opts.priority, assignee: opts.assignee, labels, customFieldValues });\n success({ updated: opts.key }, 'jira', 'update-issue', start);\n } catch (err) { fail(err, 'jira', 'update-issue', start); }\n });\n\n jira.command('transition-issue')\n .description('Transition a Jira issue to a new status')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--transition <name-or-id>', 'Transition name or ID')\n .action(async (opts: { key: string; transition: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n // Resolve transition name to ID if needed\n let transitionId = opts.transition;\n if (isNaN(parseInt(opts.transition, 10))) {\n const transitions = await client.listTransitions(opts.key);\n const found = transitions.find(t => t.name.toLowerCase() === opts.transition.toLowerCase());\n if (!found) throw new PncliError(`Transition not found: ${opts.transition}`, 1);\n transitionId = found.id;\n }\n await client.transitionIssue(opts.key, transitionId);\n success({ transitioned: opts.key, transition: opts.transition }, 'jira', 'transition-issue', start);\n } catch (err) { fail(err, 'jira', 'transition-issue', start); }\n });\n\n jira.command('list-transitions')\n .description('List available transitions for an issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listTransitions(opts.key);\n success(data, 'jira', 'list-transitions', start);\n } catch (err) { fail(err, 'jira', 'list-transitions', start); }\n });\n\n jira.command('add-comment')\n .description('Add a comment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { key: string; body: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.key, opts.body);\n success(data, 'jira', 'add-comment', start);\n } catch (err) { fail(err, 'jira', 'add-comment', start); }\n });\n\n jira.command('list-comments')\n .description('List comments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.key);\n success(data, 'jira', 'list-comments', start);\n } catch (err) { fail(err, 'jira', 'list-comments', start); }\n });\n\n jira.command('search')\n .description('Search Jira issues with JQL')\n .requiredOption('--jql <query>', 'JQL query string')\n .option('--max-results <n>', 'Maximum number of results')\n .action(async (opts: { jql: string; maxResults?: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap, customFields } = getClientAndFields(program);\n const maxResults = opts.maxResults ? parseInt(opts.maxResults, 10) : undefined;\n const translatedJql = translateJql(opts.jql, fieldMap);\n const data = await client.search(translatedJql, maxResults, customFields);\n const translatedIssues = data.issues.map(issue => ({\n ...issue,\n fields: translateFieldsInOutput(issue.fields as Record<string, unknown>, fieldMap)\n }));\n success({ ...data, issues: translatedIssues }, 'jira', 'search', start);\n } catch (err) { fail(err, 'jira', 'search', start); }\n });\n\n jira.command('assign')\n .description('Assign a Jira issue to a user')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--assignee <accountId>', 'Assignee account ID')\n .action(async (opts: { key: string; assignee: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.assignIssue(opts.key, opts.assignee);\n success({ assigned: opts.key, assignee: opts.assignee }, 'jira', 'assign', start);\n } catch (err) { fail(err, 'jira', 'assign', start); }\n });\n\n jira.command('link-issue')\n .description('Link two Jira issues together')\n .requiredOption('--key <issue-key>', 'Source issue key')\n .requiredOption('--link-type <type>', 'Link type name or ID')\n .requiredOption('--target <issue-key>', 'Target issue key')\n .action(async (opts: { key: string; linkType: string; target: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.linkIssue({ key: opts.key, linkType: opts.linkType, target: opts.target });\n success({ linked: opts.key, to: opts.target, type: opts.linkType }, 'jira', 'link-issue', start);\n } catch (err) { fail(err, 'jira', 'link-issue', start); }\n });\n\n jira.command('fields')\n .description('List custom fields (configured or discovered from Jira API)')\n .option('--discover', 'Fetch field metadata from Jira API')\n .option('--custom-only', 'Show only custom fields (requires --discover)')\n .action(async (opts: { discover?: boolean; customOnly?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.discover) {\n const client = getClient(program);\n const fields = await client.fetchFields();\n const result = opts.customOnly ? fields.filter(f => f.custom) : fields;\n success(result, 'jira', 'fields', start);\n } else {\n const { customFields } = getClientAndFields(program);\n success(customFields, 'jira', 'fields', start);\n }\n } catch (err) { fail(err, 'jira', 'fields', start); }\n });\n}\n\nfunction parseFieldArgs(\n fieldArgs: string[],\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const arg of fieldArgs) {\n const eq = arg.indexOf('=');\n if (eq === -1) throw new PncliError(`Invalid --field format (expected Name=value): ${arg}`, 1);\n const name = arg.slice(0, eq).trim();\n const value = arg.slice(eq + 1);\n const def = fieldMap.byName.get(name.toLowerCase());\n if (!def) throw new PncliError(`Unknown custom field: \"${name}\". Run: pncli jira fields`, 1);\n result[def.id] = formatFieldValue(value, def.type);\n }\n return result;\n}\n","import { Command } from 'commander';\nimport { BitbucketClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): { client: BitbucketClient; project: string; repo: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n\n const project: string = opts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo: string = opts.repo ?? ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n\n if (!project || !repo) {\n throw new PncliError(\n 'Could not determine Bitbucket project/repo. Pass --project and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, project, repo };\n}\n\nexport function registerBitbucketCommands(program: Command): void {\n const bb = program\n .command('bitbucket')\n .description('Bitbucket Server operations')\n .option('--project <key>', 'Bitbucket project key')\n .option('--repo <slug>', 'Bitbucket repository slug');\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n bb.command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: OPEN|MERGED|DECLINED|ALL', 'OPEN')\n .option('--author <username>', 'Filter by author username')\n .option('--reviewer <username>', 'Filter by reviewer username')\n .action(async (opts: { state?: string; author?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listPRs({ project, repo, state: opts.state, author: opts.author, reviewer: opts.reviewer });\n success(data, 'bitbucket', 'list-prs', start);\n } catch (err) { fail(err, 'bitbucket', 'list-prs', start); }\n });\n\n bb.command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.getPR(project, repo, parseInt(opts.id, 10));\n success(data, 'bitbucket', 'get-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'get-pr', start); }\n });\n\n bb.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (defaults to config)')\n .option('--description <desc>', 'PR description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { title: string; source: string; target?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const config = loadConfig({ configPath: program.optsWithGlobals().config });\n const target = opts.target ?? config.defaults.bitbucket?.targetBranch ?? 'main';\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : [];\n const data = await client.createPR({ project, repo, title: opts.title, source: opts.source, target, description: opts.description, reviewers });\n success(data, 'bitbucket', 'create-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'create-pr', start); }\n });\n\n bb.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <desc>', 'New description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : undefined;\n const data = await client.updatePR({ project, repo, id: prId, title: opts.title, description: opts.description, reviewers, version: pr.version });\n success(data, 'bitbucket', 'update-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'update-pr', start); }\n });\n\n bb.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--strategy <strategy>', 'Merge strategy: merge|squash|ff')\n .option('--delete-branch', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy?: string; deleteBranch?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.mergePR({ project, repo, id: prId, version: pr.version, strategy: opts.strategy as 'merge' | 'squash' | 'ff', deleteBranch: opts.deleteBranch });\n success(data, 'bitbucket', 'merge-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'merge-pr', start); }\n });\n\n bb.command('decline-pr')\n .description('Decline a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.declinePR(project, repo, prId, pr.version);\n success(data, 'bitbucket', 'decline-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'decline-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n bb.command('list-comments')\n .description('List comments on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listComments(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-comments', start);\n } catch (err) { fail(err, 'bitbucket', 'list-comments', start); }\n });\n\n bb.command('add-comment')\n .description('Add a comment to a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { pr: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.addComment(project, repo, parseInt(opts.pr, 10), opts.body);\n success(data, 'bitbucket', 'add-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-comment', start); }\n });\n\n bb.command('add-inline-comment')\n .description('Add an inline comment to a file in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <type>', 'Line type: ADDED|REMOVED|CONTEXT', 'ADDED')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.addInlineComment({\n project, repo,\n prId: parseInt(opts.pr, 10),\n text: opts.body,\n filePath: opts.file,\n line: parseInt(opts.line, 10),\n lineType: opts.lineType as 'ADDED' | 'REMOVED' | 'CONTEXT'\n });\n success(data, 'bitbucket', 'add-inline-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-inline-comment', start); }\n });\n\n bb.command('reply-comment')\n .description('Reply to a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.replyComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'bitbucket', 'reply-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'reply-comment', start); }\n });\n\n bb.command('resolve-comment')\n .description('Resolve a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.resolveComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ resolved: true }, 'bitbucket', 'resolve-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'resolve-comment', start); }\n });\n\n bb.command('delete-comment')\n .description('Delete a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.deleteComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ deleted: true }, 'bitbucket', 'delete-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'delete-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n bb.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--file <path>', 'Limit diff to a specific file')\n .option('--context-lines <n>', 'Lines of context around changes')\n .action(async (opts: { pr: string; file?: string; contextLines?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const contextLines = opts.contextLines ? parseInt(opts.contextLines, 10) : undefined;\n const diff = await client.getDiff(project, repo, parseInt(opts.pr, 10), opts.file, contextLines);\n success({ diff }, 'bitbucket', 'diff', start);\n } catch (err) { fail(err, 'bitbucket', 'diff', start); }\n });\n\n bb.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listFiles(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-files', start);\n } catch (err) { fail(err, 'bitbucket', 'list-files', start); }\n });\n\n // ── Approvals ──────────────────────────────────────────────────────\n\n bb.command('approve')\n .description('Approve a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.approvePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'approve', start);\n } catch (err) { fail(err, 'bitbucket', 'approve', start); }\n });\n\n bb.command('unapprove')\n .description('Remove approval from a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.unapprovePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'unapprove', start);\n } catch (err) { fail(err, 'bitbucket', 'unapprove', start); }\n });\n\n bb.command('needs-work')\n .description('Mark a pull request as needs-work')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.needsWorkPR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'needs-work', start);\n } catch (err) { fail(err, 'bitbucket', 'needs-work', start); }\n });\n\n bb.command('list-reviewers')\n .description('List reviewers of a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listReviewers(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-reviewers', start);\n } catch (err) { fail(err, 'bitbucket', 'list-reviewers', start); }\n });\n\n // ── Build Status ───────────────────────────────────────────────────\n\n bb.command('list-builds')\n .description('List build statuses for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listBuilds(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-builds', start);\n } catch (err) { fail(err, 'bitbucket', 'list-builds', start); }\n });\n\n bb.command('get-build-status')\n .description('Get build status for a commit SHA')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getBuildStatus(opts.commit);\n success(data, 'bitbucket', 'get-build-status', start);\n } catch (err) { fail(err, 'bitbucket', 'get-build-status', start); }\n });\n}\n","import { Command } from 'commander';\nimport { success } from '../../lib/output.js';\n\nexport function registerConfluenceCommands(program: Command): void {\n program\n .command('confluence')\n .description('Confluence operations')\n .action(() => {\n success(\n { message: 'Coming soon — the nightmare never ends.' },\n 'confluence',\n 'stub',\n Date.now()\n );\n });\n}\n","import { Command } from 'commander';\nimport { success } from '../../lib/output.js';\n\nexport function registerSonarCommands(program: Command): void {\n program\n .command('sonar')\n .description('SonarQube operations')\n .action(() => {\n success(\n { message: 'Coming soon — the nightmare never ends.' },\n 'sonar',\n 'stub',\n Date.now()\n );\n });\n}\n","import { Command } from 'commander';\nimport { success } from '../../lib/output.js';\n\nexport function registerArtifactoryCommands(program: Command): void {\n program\n .command('artifactory')\n .description('Artifactory operations')\n .action(() => {\n success(\n { message: 'Coming soon — the nightmare never ends.' },\n 'artifactory',\n 'stub',\n Date.now()\n );\n });\n}\n","import { Command } from 'commander';\nimport { input, password, confirm } from '@inquirer/prompts';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n maskConfig,\n getGlobalConfigPath\n} from '../../lib/config.js';\nimport { success, fail, warn } from '../../lib/output.js';\nimport fs from 'fs';\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command('config').description('Manage pncli configuration');\n\n config\n .command('init')\n .description('Interactive setup wizard')\n .option('--repo', 'Write repo config (.pncli.json) instead of global config')\n .action(async (opts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.repo) {\n await initRepoConfig(start);\n } else {\n await initGlobalConfig(start);\n }\n } catch (err) {\n // Handle prompt cancellation (Ctrl+C) gracefully\n if (err instanceof Error && err.message.includes('User force closed')) {\n process.stderr.write('\\nSetup cancelled.\\n');\n process.exit(1);\n }\n fail(err, 'config', 'init', start);\n }\n });\n\n config\n .command('show')\n .description('Print fully resolved config (PATs masked)')\n .action(() => {\n const start = Date.now();\n try {\n const resolved = loadConfig();\n success(maskConfig(resolved), 'config', 'show', start);\n } catch (err) {\n fail(err, 'config', 'show', start);\n }\n });\n\n config\n .command('set')\n .description('Set a config value by dot-notation key (e.g. jira.baseUrl https://...)')\n .argument('<key>', 'Config key in dot notation')\n .argument('<value>', 'Value to set')\n .action((key: string, value: string) => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n setConfigValue(key, value, opts.config);\n success({ key, value }, 'config', 'set', start);\n } catch (err) {\n fail(err, 'config', 'set', start);\n }\n });\n\n config\n .command('test')\n .description('Test connectivity to configured services')\n .action(() => {\n const start = Date.now();\n success(\n { message: 'Service connectivity test available after Phase 2.' },\n 'config',\n 'test',\n start\n );\n });\n}\n\nasync function initGlobalConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init — Global configuration\\n\\n');\n\n process.stderr.write('── Identity ──────────────────────────────────────\\n');\n const userEmail = await input({\n message: 'Your email address (used across Jira, Bitbucket, etc.):',\n default: ''\n });\n\n const userId = await input({\n message: 'Your username / user ID:',\n default: ''\n });\n\n process.stderr.write('\\n── Jira ──────────────────────────────────────────\\n');\n const jiraBaseUrl = await input({\n message: 'Jira base URL (e.g. https://jira.your-company.com):',\n default: ''\n });\n\n const jiraApiToken = await password({\n message: 'Jira personal access token:'\n });\n\n process.stderr.write('\\n── Bitbucket ─────────────────────────────────────\\n');\n const bitbucketBaseUrl = await input({\n message: 'Bitbucket Server base URL (e.g. https://bitbucket.your-company.com):',\n default: ''\n });\n\n const bitbucketPat = await password({\n message: 'Bitbucket personal access token:'\n });\n\n process.stderr.write('\\n── Defaults ──────────────────────────────────────\\n');\n const jiraProject = await input({\n message: 'Default Jira project key (optional):',\n default: ''\n });\n\n process.stderr.write('\\n');\n const confirmed = await confirm({\n message: 'Write config to ~/.pncli/config.json?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exit(0);\n }\n\n writeGlobalConfig({\n user: {\n email: userEmail || undefined,\n userId: userId || undefined\n },\n jira: {\n baseUrl: jiraBaseUrl || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: bitbucketBaseUrl || undefined,\n pat: bitbucketPat || undefined\n },\n defaults: {\n jira: {\n project: jiraProject || undefined\n }\n }\n });\n\n const configPath = getGlobalConfigPath();\n warn(`Config written to ${configPath}`);\n success({ written: configPath }, 'config', 'init', start);\n}\n\nasync function initRepoConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init --repo — Repo configuration\\n\\n');\n\n const jiraProject = await input({\n message: 'Jira project key (e.g. ACME):',\n default: ''\n });\n\n const jiraIssueType = await input({\n message: 'Default issue type:',\n default: 'Story'\n });\n\n const jiraPriority = await input({\n message: 'Default priority:',\n default: 'Medium'\n });\n\n const targetBranch = await input({\n message: 'Default target branch for PRs:',\n default: 'main'\n });\n\n const confirmed = await confirm({\n message: 'Write config to .pncli.json in repo root?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exit(0);\n }\n\n // Warn if .pncli.json already exists\n if (fs.existsSync('.pncli.json')) {\n const overwrite = await confirm({\n message: '.pncli.json already exists. Overwrite?',\n default: false\n });\n if (!overwrite) {\n process.stderr.write('Aborted.\\n');\n process.exit(0);\n }\n }\n\n writeRepoConfig({\n defaults: {\n jira: {\n project: jiraProject || undefined,\n issueType: jiraIssueType || undefined,\n priority: jiraPriority || undefined\n },\n bitbucket: {\n targetBranch: targetBranch || undefined\n }\n }\n });\n\n success({ written: '.pncli.json' }, 'config', 'init', start);\n}\n"],"mappings":"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","names":["execSync","execSync","getRepoRoot","path","getRepoRoot","program","API","program","getClient","program","program","program","program","fs","program","require"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/lib/output.ts","../src/lib/errors.ts","../src/lib/exitCodes.ts","../src/lib/config.ts","../src/services/git/client.ts","../src/lib/git-context.ts","../src/lib/http.ts","../src/services/bitbucket/client.ts","../src/services/git/commands.ts","../src/services/jira/client.ts","../src/services/jira/custom-fields.ts","../src/services/jira/commands.ts","../src/services/bitbucket/commands.ts","../src/services/confluence/commands.ts","../src/services/sonar/commands.ts","../src/services/deps/parsers/index.ts","../src/services/deps/parsers/npm.ts","../src/services/deps/parsers/nuget.ts","../src/services/deps/parsers/maven.ts","../src/services/deps/scan.ts","../src/services/deps/semver.ts","../src/services/deps/diff.ts","../src/services/deps/clients/osv.ts","../src/services/deps/clients/artifactory.ts","../src/services/deps/connectivity.ts","../src/services/deps/frisk.ts","../src/services/deps/outdated.ts","../src/services/deps/license-check.ts","../src/services/deps/commands.ts","../src/services/config/commands.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'module';\nimport { setGlobalOptions, setGlobalUser } from './lib/output.js';\nimport { ExitCode } from './lib/exitCodes.js';\nimport { loadConfig } from './lib/config.js';\nimport { registerGitCommands } from './services/git/commands.js';\nimport { registerJiraCommands } from './services/jira/commands.js';\nimport { registerBitbucketCommands } from './services/bitbucket/commands.js';\nimport { registerConfluenceCommands } from './services/confluence/commands.js';\nimport { registerSonarCommands } from './services/sonar/commands.js';\nimport { registerDepsCommands } from './services/deps/commands.js';\nimport { registerConfigCommands } from './services/config/commands.js';\n\nconst require = createRequire(import.meta.url);\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst pkg = require('../package.json') as any;\n\nconst TAGLINE = 'One command does what three meetings couldn\\'t.';\n\nconst program = new Command();\n\nprogram\n .name('pncli')\n .description(`The Paperwork Nightmare CLI — ${TAGLINE}`)\n .version(`${pkg.version as string} — ${TAGLINE}`, '-v, --version')\n .option('--pretty', 'Human-readable formatted output', false)\n .option('--verbose', 'Include full response metadata', false)\n .option('--dry-run', 'Print API requests without executing', false)\n .option('--config <path>', 'Override global config file location');\n\n// Propagate global options and user identity before any command runs\nprogram.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setGlobalOptions({\n pretty: Boolean(opts.pretty),\n verbose: Boolean(opts.verbose)\n });\n try {\n const config = loadConfig({ configPath: opts.config as string | undefined });\n setGlobalUser(config.user);\n } catch {\n // config may not exist yet (e.g. during `config init`) — silently skip\n }\n});\n\nregisterGitCommands(program);\nregisterJiraCommands(program);\nregisterBitbucketCommands(program);\nregisterConfluenceCommands(program);\nregisterSonarCommands(program);\nregisterDepsCommands(program);\nregisterConfigCommands(program);\n\nprogram.addHelpText('after', `\nServices:\n git Local git operations (status, diff, log, branch)\n deps Dependency scanning, CVE detection, license auditing\n jira Jira Data Cloud (coming soon)\n bitbucket Bitbucket Server (coming soon)\n confluence Confluence (coming soon)\n sonar SonarQube (coming soon)\n config Manage pncli configuration\n`);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(ExitCode.GENERAL_ERROR);\n});\n","import chalk from 'chalk';\nimport type { Meta, SuccessEnvelope, ErrorEnvelope, ErrorDetail } from '../types/common.js';\nimport { PncliError } from './errors.js';\nimport { ExitCode, exitCodeFromStatus } from './exitCodes.js';\n\nlet globalOptions = { pretty: false, verbose: false };\nlet globalUser: { email: string | undefined; userId: string | undefined } = { email: undefined, userId: undefined };\n\nexport function setGlobalOptions(opts: { pretty: boolean; verbose: boolean }): void {\n globalOptions = opts;\n}\n\nexport function setGlobalUser(user: { email: string | undefined; userId: string | undefined }): void {\n globalUser = user;\n}\n\nfunction buildMeta(service: string, action: string, startTime: number): Meta {\n return {\n service,\n action,\n timestamp: new Date().toISOString(),\n duration_ms: Date.now() - startTime,\n user: (globalUser.email ?? globalUser.userId) ? globalUser : undefined\n };\n}\n\nexport function success<T>(data: T, service: string, action: string, startTime: number): void {\n const envelope: SuccessEnvelope<T> = {\n ok: true,\n data,\n meta: buildMeta(service, action, startTime)\n };\n process.stdout.write(\n (globalOptions.pretty ? JSON.stringify(envelope, null, 2) : JSON.stringify(envelope)) + '\\n'\n );\n}\n\nexport function fail(\n err: unknown,\n service: string,\n action: string,\n startTime: number\n): never {\n const errorDetail: ErrorDetail = {\n status: err instanceof PncliError ? err.status : 1,\n message: err instanceof Error ? err.message : String(err),\n url: err instanceof PncliError ? (err.url ?? null) : null\n };\n\n const envelope: ErrorEnvelope = {\n ok: false,\n error: errorDetail,\n meta: buildMeta(service, action, startTime)\n };\n\n const msg = globalOptions.pretty\n ? chalk.red('✗ Error: ') + errorDetail.message\n : null;\n\n if (msg) process.stderr.write(msg + '\\n');\n\n const output = (globalOptions.pretty ? JSON.stringify(envelope, null, 2) : JSON.stringify(envelope)) + '\\n';\n const exitCode = err instanceof PncliError ? exitCodeFromStatus(err.status) : ExitCode.GENERAL_ERROR;\n process.stdout.write(output, () => process.exit(exitCode));\n throw new PncliError(errorDetail.message, errorDetail.status);\n}\n\nexport function log(message: string): void {\n if (globalOptions.verbose) {\n process.stderr.write(\n (globalOptions.pretty ? chalk.gray('▸ ') : '') + message + '\\n'\n );\n }\n}\n\nexport function warn(message: string): void {\n process.stderr.write(\n (globalOptions.pretty ? chalk.yellow('⚠ ') : '') + message + '\\n'\n );\n}\n","export class PncliError extends Error {\n status: number;\n url?: string;\n\n constructor(message: string, status: number = 1, url?: string) {\n super(message);\n this.name = 'PncliError';\n this.status = status;\n this.url = url;\n }\n}\n","export const ExitCode = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n USAGE_ERROR: 2,\n NETWORK_ERROR: 69, // EX_UNAVAILABLE from sysexits.h\n AUTH_ERROR: 77, // EX_NOPERM from sysexits.h\n CONFIG_ERROR: 78, // EX_CONFIG from sysexits.h\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\nexport function exitCodeFromStatus(httpStatus: number): ExitCode {\n if (httpStatus === 401 || httpStatus === 403) return ExitCode.AUTH_ERROR;\n if (httpStatus === 0) return ExitCode.NETWORK_ERROR;\n return ExitCode.GENERAL_ERROR;\n}\n","import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport type { GlobalConfig, RepoConfig, ResolvedConfig, JiraDefaults, BitbucketDefaults } from '../types/config.js';\nimport type { CustomFieldDefinition } from '../types/jira.js';\n\nconst ENV_KEYS = {\n EMAIL: 'PNCLI_EMAIL',\n USERID: 'PNCLI_USERID',\n JIRA_BASE_URL: 'PNCLI_JIRA_BASE_URL',\n JIRA_API_TOKEN: 'PNCLI_JIRA_API_TOKEN',\n BITBUCKET_BASE_URL: 'PNCLI_BITBUCKET_BASE_URL',\n BITBUCKET_PAT: 'PNCLI_BITBUCKET_PAT',\n ARTIFACTORY_BASE_URL: 'PNCLI_ARTIFACTORY_BASE_URL',\n ARTIFACTORY_TOKEN: 'PNCLI_ARTIFACTORY_TOKEN',\n ARTIFACTORY_REPO_NPM: 'PNCLI_ARTIFACTORY_REPO_NPM',\n ARTIFACTORY_REPO_NUGET: 'PNCLI_ARTIFACTORY_REPO_NUGET',\n ARTIFACTORY_REPO_MAVEN: 'PNCLI_ARTIFACTORY_REPO_MAVEN',\n CONFIG_PATH: 'PNCLI_CONFIG_PATH'\n} as const;\n\nfunction getGlobalConfigPath(overridePath?: string): string {\n if (overridePath) return overridePath;\n const envPath = process.env[ENV_KEYS.CONFIG_PATH];\n if (envPath) return envPath;\n return path.join(os.homedir(), '.pncli', 'config.json');\n}\n\nfunction loadJsonFile<T>(filePath: string): T | null {\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nfunction getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n } catch {\n return null;\n }\n}\n\nfunction mergeCustomFields(\n global: CustomFieldDefinition[] | undefined,\n repo: CustomFieldDefinition[] | undefined\n): CustomFieldDefinition[] {\n const map = new Map<string, CustomFieldDefinition>();\n for (const f of global ?? []) map.set(f.id, f);\n for (const f of repo ?? []) map.set(f.id, f); // repo wins\n return Array.from(map.values());\n}\n\nfunction mergeDefaults(\n global: GlobalConfig['defaults'],\n repo: RepoConfig['defaults']\n): { jira: JiraDefaults; bitbucket: BitbucketDefaults } {\n return {\n jira: { ...global?.jira, ...repo?.jira },\n bitbucket: { ...global?.bitbucket, ...repo?.bitbucket }\n };\n}\n\nexport interface LoadConfigOptions {\n configPath?: string;\n}\n\nexport function loadConfig(opts: LoadConfigOptions = {}): ResolvedConfig {\n const globalConfigPath = getGlobalConfigPath(opts.configPath);\n const globalConfig = loadJsonFile<GlobalConfig>(globalConfigPath) ?? {};\n\n const repoRoot = getRepoRoot();\n let repoConfig: RepoConfig = {};\n if (repoRoot) {\n repoConfig = loadJsonFile<RepoConfig>(path.join(repoRoot, '.pncli.json')) ?? {};\n }\n\n const mergedDefaults = mergeDefaults(globalConfig.defaults, repoConfig.defaults);\n\n return {\n user: {\n email: process.env[ENV_KEYS.EMAIL] ?? globalConfig.user?.email,\n userId: process.env[ENV_KEYS.USERID] ?? globalConfig.user?.userId\n },\n jira: {\n baseUrl: process.env[ENV_KEYS.JIRA_BASE_URL] ?? globalConfig.jira?.baseUrl,\n apiToken: process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken,\n customFields: mergeCustomFields(globalConfig.jira?.customFields, repoConfig.jira?.customFields)\n },\n bitbucket: {\n baseUrl: process.env[ENV_KEYS.BITBUCKET_BASE_URL] ?? globalConfig.bitbucket?.baseUrl,\n pat: process.env[ENV_KEYS.BITBUCKET_PAT] ?? globalConfig.bitbucket?.pat\n },\n artifactory: {\n baseUrl: process.env[ENV_KEYS.ARTIFACTORY_BASE_URL] ?? globalConfig.artifactory?.baseUrl,\n token: process.env[ENV_KEYS.ARTIFACTORY_TOKEN] ?? globalConfig.artifactory?.token,\n npmRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NPM] ?? globalConfig.artifactory?.npmRepo,\n nugetRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NUGET] ?? globalConfig.artifactory?.nugetRepo,\n mavenRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_MAVEN] ?? globalConfig.artifactory?.mavenRepo\n },\n defaults: mergedDefaults\n };\n}\n\nexport function writeGlobalConfig(config: GlobalConfig, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function writeRepoConfig(config: RepoConfig): void {\n const repoRoot = getRepoRoot();\n const targetDir = repoRoot ?? process.cwd();\n fs.writeFileSync(path.join(targetDir, '.pncli.json'), JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function setConfigValue(key: string, value: string, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const existing = loadJsonFile<GlobalConfig>(filePath) ?? {};\n\n const parts = key.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = existing;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part];\n }\n current[parts[parts.length - 1]!] = value;\n\n writeGlobalConfig(existing, configPath);\n}\n\nexport function maskConfig(config: ResolvedConfig): unknown {\n return {\n ...config,\n jira: {\n ...config.jira,\n apiToken: config.jira.apiToken ? '***' : undefined,\n customFields: config.jira.customFields\n },\n bitbucket: {\n ...config.bitbucket,\n pat: config.bitbucket.pat ? '***' : undefined\n },\n artifactory: {\n ...config.artifactory,\n token: config.artifactory.token ? '***' : undefined\n }\n };\n}\n\nexport { getGlobalConfigPath };\n","import { execSync, execFileSync } from 'child_process';\n\nconst DIFF_LINE_LIMIT = 5000;\n\nexport interface GitStatusResult {\n staged: string[];\n unstaged: string[];\n untracked: string[];\n}\n\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n lines: string[];\n}\n\nexport interface DiffFile {\n path: string;\n binary: boolean;\n truncated: boolean;\n hunks: DiffHunk[];\n}\n\nexport interface DiffResult {\n files: DiffFile[];\n truncated: boolean;\n}\n\nexport interface CommitEntry {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\nexport interface BranchResult {\n current: string;\n local: string[];\n remote: string[];\n}\n\nfunction exec(cmd: string, cwd: string): string {\n return execSync(cmd, { encoding: 'utf8', cwd }).trim();\n}\n\nexport function getStatus(root: string): GitStatusResult {\n const output = exec('git status --porcelain', root);\n const staged: string[] = [];\n const unstaged: string[] = [];\n const untracked: string[] = [];\n\n if (!output) return { staged, unstaged, untracked };\n\n for (const line of output.split('\\n')) {\n if (!line) continue;\n const x = line[0]!;\n const y = line[1]!;\n const file = line.slice(3);\n\n if (x === '?' && y === '?') {\n untracked.push(file);\n } else {\n if (x !== ' ' && x !== '?') staged.push(file);\n if (y !== ' ' && y !== '?') unstaged.push(file);\n }\n }\n\n return { staged, unstaged, untracked };\n}\n\nfunction parseHunkHeader(header: string): { oldStart: number; oldCount: number; newStart: number; newCount: number } {\n const match = header.match(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (!match) return { oldStart: 0, oldCount: 0, newStart: 0, newCount: 0 };\n return {\n oldStart: parseInt(match[1]!, 10),\n oldCount: parseInt(match[2] ?? '1', 10),\n newStart: parseInt(match[3]!, 10),\n newCount: parseInt(match[4] ?? '1', 10)\n };\n}\n\nfunction parseDiff(rawDiff: string): DiffResult {\n const lines = rawDiff.split('\\n');\n const files: DiffFile[] = [];\n let globalTruncated = false;\n let lineCount = 0;\n\n let currentFile: DiffFile | null = null;\n let currentHunk: DiffHunk | null = null;\n\n for (const line of lines) {\n lineCount++;\n if (lineCount > DIFF_LINE_LIMIT) {\n globalTruncated = true;\n if (currentFile) currentFile.truncated = true;\n break;\n }\n\n if (line.startsWith('diff --git ')) {\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n currentHunk = null;\n if (currentFile) files.push(currentFile);\n\n const pathMatch = line.match(/diff --git a\\/(.+) b\\/.+$/);\n currentFile = {\n path: pathMatch ? pathMatch[1]! : line,\n binary: false,\n truncated: false,\n hunks: []\n };\n continue;\n }\n\n if (!currentFile) continue;\n\n if (line.startsWith('Binary files')) {\n currentFile.binary = true;\n continue;\n }\n\n if (line.startsWith('@@ ')) {\n if (currentHunk) currentFile.hunks.push(currentHunk);\n const { oldStart, oldCount, newStart, newCount } = parseHunkHeader(line);\n currentHunk = { oldStart, oldCount, newStart, newCount, lines: [] };\n continue;\n }\n\n if (currentHunk && (line.startsWith('+') || line.startsWith('-') || line.startsWith(' '))) {\n currentHunk.lines.push(line);\n }\n }\n\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n if (currentFile) files.push(currentFile);\n\n return { files, truncated: globalTruncated };\n}\n\nexport function getDiff(root: string, opts: { staged?: boolean; file?: string }): DiffResult {\n const args = ['git', 'diff'];\n if (opts.staged) args.push('--staged');\n if (opts.file) args.push('--', opts.file);\n\n try {\n const raw = exec(args.join(' '), root);\n if (!raw) return { files: [], truncated: false };\n return parseDiff(raw);\n } catch {\n return { files: [], truncated: false };\n }\n}\n\nexport function getLog(root: string, opts: { count?: number; since?: string }): CommitEntry[] {\n const sep = '\\x1F'; // ASCII unit separator — safe in git format strings\n const fmt = `%H${sep}%an${sep}%aI${sep}%s`;\n const args = [`log`, `--format=${fmt}`];\n if (opts.count) args.push(`-n`, String(opts.count));\n if (opts.since) args.push(`--since=${opts.since}`);\n\n try {\n const output = execFileSync('git', args, { encoding: 'utf8', cwd: root }).trim();\n if (!output) return [];\n return output.split('\\n').filter(Boolean).map(line => {\n const parts = line.split(sep);\n return {\n hash: parts[0] ?? '',\n author: parts[1] ?? '',\n date: parts[2] ?? '',\n message: parts[3] ?? ''\n };\n });\n } catch {\n return [];\n }\n}\n\nexport function getBranches(root: string): BranchResult {\n const output = exec('git branch -a', root);\n const local: string[] = [];\n const remote: string[] = [];\n let current = '';\n\n for (const line of output.split('\\n')) {\n if (!line.trim()) continue;\n const isCurrent = line.startsWith('*');\n const name = line.replace(/^\\*?\\s+/, '').trim();\n\n if (name.startsWith('remotes/')) {\n remote.push(name.replace('remotes/', ''));\n } else {\n if (isCurrent) current = name;\n local.push(name);\n }\n }\n\n return { current, local, remote };\n}\n","import { execSync } from 'child_process';\nimport type { ResolvedConfig } from '../types/config.js';\n\nexport interface GitContext {\n root: string;\n branch: string;\n project: string | null;\n repo: string | null;\n}\n\nexport function getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n } catch {\n return null;\n }\n}\n\nexport function getCurrentBranch(repoRoot: string): string | null {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n cwd: repoRoot\n }).trim();\n } catch {\n return null;\n }\n}\n\nexport function parseRemote(\n remoteUrl: string,\n bitbucketBaseUrl: string | undefined\n): { project: string; repo: string } | null {\n if (!bitbucketBaseUrl) return null;\n\n // Normalize base URL for comparison\n const base = bitbucketBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '');\n\n // SSH format: git@bitbucket.company.com:7999/PROJ/repo.git\n const sshMatch = remoteUrl.match(/^git@([^:]+)(?::\\d+)?[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n const [, host, project, repo] = sshMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n // HTTPS format: https://bitbucket.company.com/scm/PROJ/repo.git\n const httpsMatch = remoteUrl.match(/^https?:\\/\\/([^/]+)\\/scm\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (httpsMatch) {\n const [, host, project, repo] = httpsMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n return null;\n}\n\nfunction getRemoteUrls(repoRoot: string): string[] {\n try {\n const output = execSync('git remote -v', { encoding: 'utf8', cwd: repoRoot });\n return output\n .split('\\n')\n .filter(line => line.includes('(fetch)'))\n .map(line => line.split('\\t')[1]?.split(' ')[0] ?? '')\n .filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getGitContext(config: ResolvedConfig): GitContext | null {\n const root = getRepoRoot();\n if (!root) return null;\n\n const branch = getCurrentBranch(root) ?? 'unknown';\n const remoteUrls = getRemoteUrls(root);\n\n let project: string | null = null;\n let repo: string | null = null;\n\n for (const url of remoteUrls) {\n const parsed = parseRemote(url, config.bitbucket.baseUrl);\n if (parsed) {\n project = parsed.project;\n repo = parsed.repo;\n break;\n }\n }\n\n return { root, branch, project, repo };\n}\n","import type { ResolvedConfig } from '../types/config.js';\nimport { PncliError } from './errors.js';\nimport { ExitCode } from './exitCodes.js';\nimport { log } from './output.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface HttpRequestOptions {\n method?: HttpMethod;\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n timeoutMs?: number;\n}\n\nexport interface HttpError {\n error: true;\n status: number;\n message: string;\n url: string;\n}\n\nfunction buildUrl(base: string, path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(path, base.endsWith('/') ? base : base + '/');\n if (params) {\n for (const [key, val] of Object.entries(params)) {\n if (val !== undefined) {\n url.searchParams.set(key, String(val));\n }\n }\n }\n return url.toString();\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function request<T>(\n url: string,\n init: RequestInit,\n timeoutMs: number\n): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n let response: Response;\n try {\n response = await fetchWithTimeout(url, init, timeoutMs);\n } catch (err) {\n throw new PncliError(\n `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n url\n );\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : (attempt + 1) * 1000;\n log(`Rate limited. Retrying after ${waitMs}ms...`);\n await new Promise(resolve => setTimeout(resolve, waitMs));\n lastError = new PncliError('Rate limited', 429, url);\n continue;\n }\n\n if (!response.ok) {\n let message = `HTTP ${response.status} ${response.statusText}`;\n try {\n const body = await response.text();\n const parsed = JSON.parse(body);\n const parts: string[] = [];\n // Jira: errorMessages is string[]\n if (Array.isArray(parsed.errorMessages)) {\n parts.push(...(parsed.errorMessages as string[]).filter(Boolean));\n }\n // errors as object map (Jira: Record<string, string>)\n if (parsed.errors && typeof parsed.errors === 'object' && !Array.isArray(parsed.errors)) {\n for (const [field, msg] of Object.entries(parsed.errors as Record<string, string>)) {\n parts.push(`${field}: ${msg}`);\n }\n }\n // errors as array of objects with message field (other APIs)\n if (Array.isArray(parsed.errors)) {\n for (const e of parsed.errors as Array<{ message?: string }>) {\n if (e?.message) parts.push(e.message);\n }\n }\n // Generic APIs: { message: \"...\" }\n if (parts.length === 0 && parsed.message) {\n parts.push(String(parsed.message));\n }\n if (parts.length > 0) message = parts.join('; ');\n } catch {\n // ignore parse errors\n }\n throw new PncliError(message, response.status, url);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n throw lastError ?? new PncliError('Request failed after retries', 1, url);\n}\n\nexport class HttpClient {\n private config: ResolvedConfig;\n private dryRun: boolean;\n\n constructor(config: ResolvedConfig, dryRun = false) {\n this.config = config;\n this.dryRun = dryRun;\n }\n\n private jiraHeaders(): Record<string, string> {\n const { apiToken } = this.config.jira;\n if (!apiToken) throw new PncliError('Jira credentials not configured. Run: pncli config init');\n return {\n 'Authorization': `Bearer ${apiToken}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Connection': 'close'\n };\n }\n\n private bitbucketHeaders(): Record<string, string> {\n const { pat } = this.config.bitbucket;\n if (!pat) throw new PncliError('Bitbucket credentials not configured. Run: pncli config init');\n return {\n 'Authorization': `Bearer ${pat}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Connection': 'close'\n };\n }\n\n async jira<T>(\n path: string,\n opts: HttpRequestOptions = {}\n ): Promise<T> {\n const baseUrl = this.config.jira.baseUrl;\n if (!baseUrl) throw new PncliError('Jira baseUrl not configured. Run: pncli config init');\n\n const url = buildUrl(baseUrl, path, opts.params);\n const headers = this.jiraHeaders();\n const init: RequestInit = {\n method: opts.method ?? 'GET',\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined\n };\n\n if (this.dryRun) {\n const safeHeaders = { ...headers, Authorization: '[REDACTED]' };\n const msg = `DRY RUN: ${init.method} ${url}\\nHeaders: ${JSON.stringify(safeHeaders, null, 2)}\\n`\n + (opts.body ? `Body: ${JSON.stringify(opts.body, null, 2)}\\n` : '');\n process.stderr.write(msg, () => process.exit(ExitCode.SUCCESS));\n return new Promise<never>(() => { /* exit pending */ });\n }\n\n return request<T>(url, init, opts.timeoutMs ?? 30000);\n }\n\n async bitbucket<T>(\n path: string,\n opts: HttpRequestOptions = {}\n ): Promise<T> {\n const baseUrl = this.config.bitbucket.baseUrl;\n if (!baseUrl) throw new PncliError('Bitbucket baseUrl not configured. Run: pncli config init');\n\n const url = buildUrl(baseUrl, path, opts.params);\n const headers = this.bitbucketHeaders();\n const init: RequestInit = {\n method: opts.method ?? 'GET',\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined\n };\n\n if (this.dryRun) {\n const safeHeaders = { ...headers, Authorization: '[REDACTED]' };\n const msg = `DRY RUN: ${init.method} ${url}\\nHeaders: ${JSON.stringify(safeHeaders, null, 2)}\\n`\n + (opts.body ? `Body: ${JSON.stringify(opts.body, null, 2)}\\n` : '');\n process.stderr.write(msg, () => process.exit(ExitCode.SUCCESS));\n return new Promise<never>(() => { /* exit pending */ });\n }\n\n return request<T>(url, init, opts.timeoutMs ?? 30000);\n }\n\n async paginate<T>(\n fetchPage: (start: number, limit: number) => Promise<{ values: T[]; isLastPage: boolean; nextPageStart?: number }>\n ): Promise<T[]> {\n const results: T[] = [];\n let start = 0;\n const limit = 100;\n\n while (true) {\n const page = await fetchPage(start, limit);\n results.push(...page.values);\n if (page.isLastPage) break;\n start = page.nextPageStart ?? start + limit;\n }\n\n return results;\n }\n\n async jiraPaginate<T>(\n fetchPage: (startAt: number, maxResults: number) => Promise<{ issues?: T[]; values?: T[]; total: number; startAt: number; maxResults: number }>\n ): Promise<T[]> {\n const results: T[] = [];\n let startAt = 0;\n const maxResults = 100;\n\n while (true) {\n const page = await fetchPage(startAt, maxResults);\n const items = (page.issues ?? page.values ?? []) as T[];\n results.push(...items);\n startAt += items.length;\n if (startAt >= page.total || items.length === 0) break;\n }\n\n return results;\n }\n}\n\nexport function createHttpClient(config: ResolvedConfig, dryRun = false): HttpClient {\n return new HttpClient(config, dryRun);\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n BitbucketPR,\n BitbucketComment,\n BitbucketPageResponse,\n BitbucketBuildStatus\n} from '../../types/bitbucket.js';\n\nconst API = '/rest/api/1.0';\n\nexport interface ListPRsOpts {\n project: string;\n repo: string;\n state?: string;\n author?: string;\n reviewer?: string;\n}\n\nexport interface CreatePROpts {\n project: string;\n repo: string;\n title: string;\n source: string;\n target: string;\n description?: string;\n reviewers?: string[];\n}\n\nexport interface UpdatePROpts {\n project: string;\n repo: string;\n id: number;\n title?: string;\n description?: string;\n reviewers?: string[];\n version: number;\n}\n\nexport interface MergePROpts {\n project: string;\n repo: string;\n id: number;\n version: number;\n strategy?: 'merge' | 'squash' | 'ff';\n deleteBranch?: boolean;\n}\n\nexport interface InlineCommentOpts {\n project: string;\n repo: string;\n prId: number;\n text: string;\n filePath: string;\n line: number;\n lineType?: 'ADDED' | 'REMOVED' | 'CONTEXT';\n}\n\nexport class BitbucketClient {\n constructor(private http: HttpClient) {}\n\n async listPRs(opts: ListPRsOpts): Promise<BitbucketPR[]> {\n return this.http.paginate<BitbucketPR>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<BitbucketPR>>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n params: {\n state: opts.state ?? 'OPEN',\n ...(opts.author ? { 'author.username': opts.author } : {}),\n start,\n limit\n }\n }\n )\n );\n }\n\n async getPR(project: string, repo: string, id: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}`\n );\n }\n\n async createPR(opts: CreatePROpts): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n description: opts.description,\n fromRef: {\n id: `refs/heads/${opts.source}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n toRef: {\n id: `refs/heads/${opts.target}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n reviewers: (opts.reviewers ?? []).map(slug => ({ user: { slug } }))\n }\n }\n );\n }\n\n async updatePR(opts: UpdatePROpts): Promise<BitbucketPR> {\n const body: Record<string, unknown> = { version: opts.version };\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (opts.reviewers) body.reviewers = opts.reviewers.map(slug => ({ user: { slug } }));\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}`,\n { method: 'PUT', body }\n );\n }\n\n async mergePR(opts: MergePROpts): Promise<BitbucketPR> {\n const params: Record<string, string | number | boolean | undefined> = {\n version: opts.version\n };\n const body: Record<string, unknown> = {};\n if (opts.strategy) body.strategyId = opts.strategy;\n if (opts.deleteBranch) body.autoSubject = true;\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}/merge`,\n { method: 'POST', params, body }\n );\n }\n\n async declinePR(project: string, repo: string, id: number, version: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}/decline`,\n { method: 'POST', params: { version } }\n );\n }\n\n async listComments(project: string, repo: string, prId: number): Promise<BitbucketComment[]> {\n interface Activity { action: string; comment?: BitbucketComment }\n const activities = await this.http.paginate<Activity>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<Activity>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/activities`,\n { params: { start, limit } }\n )\n );\n return activities\n .filter(a => a.action === 'COMMENTED' && a.comment)\n .map(a => a.comment!);\n }\n\n async addComment(project: string, repo: string, prId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text } }\n );\n }\n\n async addInlineComment(opts: InlineCommentOpts): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.prId}/comments`,\n {\n method: 'POST',\n body: {\n text: opts.text,\n anchor: {\n line: opts.line,\n lineType: opts.lineType ?? 'ADDED',\n fileType: 'TO',\n path: opts.filePath\n }\n }\n }\n );\n }\n\n async replyComment(project: string, repo: string, prId: number, commentId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text, parent: { id: commentId } } }\n );\n }\n\n async resolveComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}/resolve`,\n { method: 'PUT', params: { version } }\n );\n }\n\n async deleteComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}`,\n { method: 'DELETE', params: { version } }\n );\n }\n\n async getDiff(project: string, repo: string, prId: number, file?: string, contextLines?: number): Promise<string> {\n const params: Record<string, string | number | boolean | undefined> = {};\n if (contextLines !== undefined) params.contextLines = contextLines;\n if (file) params.path = file;\n\n const result = await this.http.bitbucket<{ diffs?: unknown[] } | string>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/diff`,\n { params }\n );\n // Return raw diff as string\n return typeof result === 'string' ? result : JSON.stringify(result);\n }\n\n async listFiles(project: string, repo: string, prId: number): Promise<string[]> {\n const result = await this.http.bitbucket<{ values?: Array<{ path: { toString: string } }> }>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/changes`,\n { params: { limit: 1000 } }\n );\n return (result.values ?? []).map(v => (typeof v.path === 'string' ? v.path : JSON.stringify(v.path)));\n }\n\n async approvePR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/~`,\n { method: 'PUT', body: { status: 'APPROVED' } }\n );\n }\n\n async unapprovePR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/~`,\n { method: 'DELETE' }\n );\n }\n\n async needsWorkPR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/~`,\n { method: 'PUT', body: { status: 'NEEDS_WORK' } }\n );\n }\n\n async listReviewers(project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(project, repo, prId);\n return pr.reviewers;\n }\n\n async listBuilds(project: string, repo: string, prId: number): Promise<BitbucketBuildStatus[]> {\n // Get the latest commit on the source branch\n const commits = await this.http.bitbucket<BitbucketPageResponse<{ id: string }>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/commits`,\n { params: { limit: 1 } }\n );\n const sha = commits.values[0]?.id;\n if (!sha) return [];\n return this.getBuildStatus(sha);\n }\n\n async getBuildStatus(commit: string): Promise<BitbucketBuildStatus[]> {\n const result = await this.http.bitbucket<BitbucketPageResponse<BitbucketBuildStatus>>(\n `/rest/build-status/1.0/commits/${commit}`\n );\n return result.values ?? [];\n }\n}\n","import { Command } from 'commander';\nimport { getStatus, getDiff, getLog, getBranches } from './client.js';\nimport { getRepoRoot, getCurrentBranch } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { BitbucketClient } from '../bitbucket/client.js';\nimport { getGitContext } from '../../lib/git-context.js';\n\nfunction requireRepoRoot(): string {\n const root = getRepoRoot();\n if (!root) throw new PncliError('Not a git repository', 1);\n return root;\n}\n\nexport function registerGitCommands(program: Command): void {\n const git = program.command('git').description('Local git operations');\n\n git\n .command('status')\n .description('Show staged, unstaged, and untracked files as JSON')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getStatus(root);\n success(data, 'git', 'status', start);\n } catch (err) {\n fail(err, 'git', 'status', start);\n }\n });\n\n git\n .command('diff')\n .description('Show diff as structured JSON')\n .option('--staged', 'Show staged changes only')\n .option('--file <path>', 'Limit diff to a specific file')\n .action((opts: { staged?: boolean; file?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getDiff(root, { staged: opts.staged, file: opts.file });\n success(data, 'git', 'diff', start);\n } catch (err) {\n fail(err, 'git', 'diff', start);\n }\n });\n\n git\n .command('log')\n .description('Show recent commits as JSON')\n .option('--count <n>', 'Number of commits to show', '10')\n .option('--since <date>', 'Show commits since date (e.g. \"2 weeks ago\")')\n .action((opts: { count?: string; since?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const count = opts.count ? parseInt(opts.count, 10) : undefined;\n const data = getLog(root, { count, since: opts.since });\n success(data, 'git', 'log', start);\n } catch (err) {\n fail(err, 'git', 'log', start);\n }\n });\n\n git\n .command('branch')\n .description('Show current branch and all local/remote branches')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getBranches(root);\n success(data, 'git', 'branch', start);\n } catch (err) {\n fail(err, 'git', 'branch', start);\n }\n });\n\n git\n .command('current-pr')\n .description('Find the open PR for the current branch')\n .action(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n\n if (!config.bitbucket.baseUrl || !config.bitbucket.pat) {\n success(\n { message: 'Requires Bitbucket config. Available after pncli config init.' },\n 'git',\n 'current-pr',\n start\n );\n return;\n }\n\n const root = requireRepoRoot();\n const branch = getCurrentBranch(root);\n if (!branch) throw new PncliError('Could not determine current branch', 1);\n\n const ctx = getGitContext(config);\n const project = ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo = ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n if (!project || !repo) throw new PncliError('Could not determine Bitbucket project/repo', 1);\n\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const prs = await client.listPRs({ project, repo, state: 'OPEN' });\n const match = prs.find(pr => pr.fromRef.displayId === branch) ?? null;\n success(match, 'git', 'current-pr', start);\n } catch (err) {\n fail(err, 'git', 'current-pr', start);\n }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n JiraIssue,\n JiraTransition,\n JiraComment,\n JiraSearchResult,\n JiraFieldInfo,\n CustomFieldDefinition\n} from '../../types/jira.js';\n\nconst API = '/rest/api/2';\n\nexport interface CreateIssueOpts {\n project: string;\n issueType: string;\n summary: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface UpdateIssueOpts {\n summary?: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface LinkIssueOpts {\n key: string;\n linkType: string;\n target: string;\n}\n\nexport class JiraClient {\n constructor(private http: HttpClient) {}\n\n async getIssue(key: string): Promise<JiraIssue> {\n return this.http.jira<JiraIssue>(`${API}/issue/${key}`);\n }\n\n async createIssue(opts: CreateIssueOpts): Promise<JiraIssue> {\n const body: Record<string, unknown> = {\n fields: {\n project: { key: opts.project },\n issuetype: { name: opts.issueType },\n summary: opts.summary,\n ...(opts.description ? { description: opts.description } : {}),\n ...(opts.priority ? { priority: { name: opts.priority } } : {}),\n ...(opts.assignee ? { assignee: { name: opts.assignee } } : {}),\n ...(opts.labels?.length ? { labels: opts.labels } : {}),\n ...(opts.customFieldValues ?? {})\n }\n };\n\n const created = await this.http.jira<{ id: string; key: string }>(`${API}/issue`, {\n method: 'POST',\n body\n });\n\n return this.getIssue(created.key);\n }\n\n async updateIssue(key: string, opts: UpdateIssueOpts): Promise<void> {\n const fields: Record<string, unknown> = {};\n if (opts.summary) fields.summary = opts.summary;\n if (opts.description) fields.description = opts.description;\n if (opts.priority) fields.priority = { name: opts.priority };\n if (opts.assignee) fields.assignee = { name: opts.assignee };\n if (opts.labels) fields.labels = opts.labels;\n Object.assign(fields, opts.customFieldValues ?? {});\n\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { fields }\n });\n }\n\n async listTransitions(key: string): Promise<JiraTransition[]> {\n const result = await this.http.jira<{ transitions: JiraTransition[] }>(\n `${API}/issue/${key}/transitions`\n );\n return result.transitions;\n }\n\n async transitionIssue(key: string, transitionId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/transitions`, {\n method: 'POST',\n body: { transition: { id: transitionId } }\n });\n }\n\n async addComment(key: string, text: string): Promise<JiraComment> {\n return this.http.jira<JiraComment>(`${API}/issue/${key}/comment`, {\n method: 'POST',\n body: { body: text }\n });\n }\n\n async listComments(key: string): Promise<JiraComment[]> {\n return this.http.jiraPaginate<JiraComment>(async (startAt, maxResults) => {\n const result = await this.http.jira<{ comments: JiraComment[]; total: number; startAt: number; maxResults: number }>(\n `${API}/issue/${key}/comment`,\n { params: { startAt, maxResults } }\n );\n return { ...result, values: result.comments };\n });\n }\n\n async search(jql: string, maxResults?: number, customFields?: CustomFieldDefinition[]): Promise<JiraSearchResult> {\n const standardFields = ['summary', 'status', 'priority', 'assignee', 'issuetype', 'project', 'created', 'updated', 'labels', 'reporter'];\n const fields = customFields?.length\n ? [...standardFields, ...customFields.map(f => f.id)]\n : standardFields;\n\n if (maxResults !== undefined) {\n return this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, maxResults, fields }\n });\n }\n\n // Paginate all results\n const allIssues = await this.http.jiraPaginate<JiraIssue>(async (startAt, max) => {\n const result = await this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, startAt, maxResults: max, fields }\n });\n return { ...result, values: result.issues };\n });\n\n return { issues: allIssues, total: allIssues.length, startAt: 0, maxResults: allIssues.length };\n }\n\n async fetchFields(): Promise<JiraFieldInfo[]> {\n return this.http.jira<JiraFieldInfo[]>(`${API}/field`);\n }\n\n async assignIssue(key: string, accountId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/assignee`, {\n method: 'PUT',\n body: { accountId }\n });\n }\n\n async linkIssue(opts: LinkIssueOpts): Promise<void> {\n // First, find the link type ID if a name was given\n let linkTypeId = opts.linkType;\n if (isNaN(parseInt(opts.linkType, 10))) {\n const types = await this.http.jira<{ issueLinkTypes: Array<{ id: string; name: string; inward: string; outward: string }> }>(\n `${API}/issueLinkType`\n );\n const found = types.issueLinkTypes.find(\n t => t.name.toLowerCase() === opts.linkType.toLowerCase() ||\n t.inward.toLowerCase() === opts.linkType.toLowerCase() ||\n t.outward.toLowerCase() === opts.linkType.toLowerCase()\n );\n if (!found) throw new Error(`Link type not found: ${opts.linkType}`);\n linkTypeId = found.id;\n }\n\n await this.http.jira<void>(`${API}/issueLink`, {\n method: 'POST',\n body: {\n type: { id: linkTypeId },\n inwardIssue: { key: opts.key },\n outwardIssue: { key: opts.target }\n }\n });\n }\n}\n","import type { CustomFieldDefinition, CustomFieldMap, CustomFieldType } from '../../types/jira.js';\n\nexport function buildFieldMap(fields: CustomFieldDefinition[]): CustomFieldMap {\n const byName = new Map<string, CustomFieldDefinition>();\n const byId = new Map<string, CustomFieldDefinition>();\n for (const f of fields) {\n byName.set(f.name.toLowerCase(), f);\n byId.set(f.id, f);\n }\n return { byName, byId };\n}\n\n/**\n * Replace friendly field names with customfield_* IDs in a JQL string.\n * Splits on quoted segments to avoid replacing inside string literals.\n * Sorts field names by length descending so \"Story Points\" matches before \"Story\".\n */\nexport function translateJql(jql: string, fieldMap: CustomFieldMap): string {\n if (fieldMap.byName.size === 0) return jql;\n\n // Sort names by length descending to avoid partial matches\n const sortedNames = Array.from(fieldMap.byName.keys()).sort((a, b) => b.length - a.length);\n\n // Split on quoted segments, only translate unquoted parts\n const parts = jql.split(/([\"'][^\"']*[\"'])/);\n return parts.map((part, i) => {\n if (i % 2 === 1) return part; // inside quotes — leave as-is\n let out = part;\n for (const name of sortedNames) {\n const def = fieldMap.byName.get(name)!;\n // Match the field name as a whole word (case-insensitive), optionally quoted\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n out = out.replace(new RegExp(`(?<![\\\\w\"'])${escaped}(?![\\\\w\"'])`, 'gi'), def.id);\n }\n return out;\n }).join('');\n}\n\n/**\n * Replace customfield_* keys with friendly names in an issue fields object.\n * Returns a new object; does not mutate the original.\n */\nexport function translateFieldsInOutput(\n fields: Record<string, unknown>,\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n if (fieldMap.byId.size === 0) return fields;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n const def = fieldMap.byId.get(key);\n result[def ? def.name : key] = value;\n }\n return result;\n}\n\n/**\n * Format a CLI string value into the shape Jira's API expects for a given field type.\n */\nexport function formatFieldValue(value: string, type: CustomFieldType): unknown {\n switch (type) {\n case 'number':\n return Number(value);\n case 'select':\n return { value };\n case 'multi-select':\n return value.split(',').map(v => ({ value: v.trim() }));\n case 'labels':\n return value.split(',').map(v => v.trim());\n case 'user':\n return { accountId: value };\n default:\n return value;\n }\n}\n","import { Command } from 'commander';\nimport { JiraClient } from './client.js';\nimport { buildFieldMap, translateJql, translateFieldsInOutput, formatFieldValue } from './custom-fields.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { CustomFieldMap } from '../../types/jira.js';\n\nfunction getClient(program: Command): JiraClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JiraClient(http);\n}\n\nfunction getClientAndFields(program: Command): { client: JiraClient; fieldMap: CustomFieldMap; customFields: import('../../types/jira.js').CustomFieldDefinition[] } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new JiraClient(http);\n const customFields = config.jira.customFields;\n const fieldMap = buildFieldMap(customFields);\n return { client, fieldMap, customFields };\n}\n\nfunction getDefaults(program: Command): { project?: string; issueType?: string; priority?: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n return {\n project: config.defaults.jira?.project,\n issueType: config.defaults.jira?.issueType,\n priority: config.defaults.jira?.priority\n };\n}\n\nexport function registerJiraCommands(program: Command): void {\n const jira = program.command('jira').description('Jira Data Cloud operations');\n\n jira.command('get-issue')\n .description('Get a Jira issue by key')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const data = await client.getIssue(opts.key);\n const translated = { ...data, fields: translateFieldsInOutput(data.fields as Record<string, unknown>, fieldMap) };\n success(translated, 'jira', 'get-issue', start);\n } catch (err) { fail(err, 'jira', 'get-issue', start); }\n });\n\n jira.command('create-issue')\n .description('Create a Jira issue')\n .option('--project <key>', 'Project key')\n .option('--type <type>', 'Issue type (Bug, Story, Task, ...)')\n .requiredOption('--summary <text>', 'Issue summary')\n .option('--description <text>', 'Issue description')\n .option('--priority <name>', 'Priority name')\n .option('--assignee <accountId>', 'Assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { project?: string; type?: string; summary: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const defaults = getDefaults(program);\n const project = opts.project ?? defaults.project;\n const issueType = opts.type ?? defaults.issueType ?? 'Task';\n const priority = opts.priority ?? defaults.priority;\n if (!project) throw new PncliError('--project required (or set defaults.jira.project in config)', 1);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n const data = await client.createIssue({ project, issueType, summary: opts.summary, description: opts.description, priority, assignee: opts.assignee, labels, customFieldValues });\n success(data, 'jira', 'create-issue', start);\n } catch (err) { fail(err, 'jira', 'create-issue', start); }\n });\n\n jira.command('update-issue')\n .description('Update a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .option('--summary <text>', 'New summary')\n .option('--description <text>', 'New description')\n .option('--priority <name>', 'New priority')\n .option('--assignee <accountId>', 'New assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { key: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n await client.updateIssue(opts.key, { summary: opts.summary, description: opts.description, priority: opts.priority, assignee: opts.assignee, labels, customFieldValues });\n success({ updated: opts.key }, 'jira', 'update-issue', start);\n } catch (err) { fail(err, 'jira', 'update-issue', start); }\n });\n\n jira.command('transition-issue')\n .description('Transition a Jira issue to a new status')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--transition <name-or-id>', 'Transition name or ID')\n .action(async (opts: { key: string; transition: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n // Resolve transition name to ID if needed\n let transitionId = opts.transition;\n if (isNaN(parseInt(opts.transition, 10))) {\n const transitions = await client.listTransitions(opts.key);\n const found = transitions.find(t => t.name.toLowerCase() === opts.transition.toLowerCase());\n if (!found) throw new PncliError(`Transition not found: ${opts.transition}`, 1);\n transitionId = found.id;\n }\n await client.transitionIssue(opts.key, transitionId);\n success({ transitioned: opts.key, transition: opts.transition }, 'jira', 'transition-issue', start);\n } catch (err) { fail(err, 'jira', 'transition-issue', start); }\n });\n\n jira.command('list-transitions')\n .description('List available transitions for an issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listTransitions(opts.key);\n success(data, 'jira', 'list-transitions', start);\n } catch (err) { fail(err, 'jira', 'list-transitions', start); }\n });\n\n jira.command('add-comment')\n .description('Add a comment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { key: string; body: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.key, opts.body);\n success(data, 'jira', 'add-comment', start);\n } catch (err) { fail(err, 'jira', 'add-comment', start); }\n });\n\n jira.command('list-comments')\n .description('List comments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.key);\n success(data, 'jira', 'list-comments', start);\n } catch (err) { fail(err, 'jira', 'list-comments', start); }\n });\n\n jira.command('search')\n .description('Search Jira issues with JQL')\n .requiredOption('--jql <query>', 'JQL query string')\n .option('--max-results <n>', 'Maximum number of results')\n .action(async (opts: { jql: string; maxResults?: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap, customFields } = getClientAndFields(program);\n const maxResults = opts.maxResults ? parseInt(opts.maxResults, 10) : undefined;\n const translatedJql = translateJql(opts.jql, fieldMap);\n const data = await client.search(translatedJql, maxResults, customFields);\n const translatedIssues = data.issues.map(issue => ({\n ...issue,\n fields: translateFieldsInOutput(issue.fields as Record<string, unknown>, fieldMap)\n }));\n success({ ...data, issues: translatedIssues }, 'jira', 'search', start);\n } catch (err) { fail(err, 'jira', 'search', start); }\n });\n\n jira.command('assign')\n .description('Assign a Jira issue to a user')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--assignee <accountId>', 'Assignee account ID')\n .action(async (opts: { key: string; assignee: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.assignIssue(opts.key, opts.assignee);\n success({ assigned: opts.key, assignee: opts.assignee }, 'jira', 'assign', start);\n } catch (err) { fail(err, 'jira', 'assign', start); }\n });\n\n jira.command('link-issue')\n .description('Link two Jira issues together')\n .requiredOption('--key <issue-key>', 'Source issue key')\n .requiredOption('--link-type <type>', 'Link type name or ID')\n .requiredOption('--target <issue-key>', 'Target issue key')\n .action(async (opts: { key: string; linkType: string; target: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.linkIssue({ key: opts.key, linkType: opts.linkType, target: opts.target });\n success({ linked: opts.key, to: opts.target, type: opts.linkType }, 'jira', 'link-issue', start);\n } catch (err) { fail(err, 'jira', 'link-issue', start); }\n });\n\n jira.command('fields')\n .description('List custom fields (configured or discovered from Jira API)')\n .option('--discover', 'Fetch field metadata from Jira API')\n .option('--custom-only', 'Show only custom fields (requires --discover)')\n .action(async (opts: { discover?: boolean; customOnly?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.discover) {\n const client = getClient(program);\n const fields = await client.fetchFields();\n const result = opts.customOnly ? fields.filter(f => f.custom) : fields;\n success(result, 'jira', 'fields', start);\n } else {\n const { customFields } = getClientAndFields(program);\n success(customFields, 'jira', 'fields', start);\n }\n } catch (err) { fail(err, 'jira', 'fields', start); }\n });\n}\n\nfunction parseFieldArgs(\n fieldArgs: string[],\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const arg of fieldArgs) {\n const eq = arg.indexOf('=');\n if (eq === -1) throw new PncliError(`Invalid --field format (expected Name=value): ${arg}`, 1);\n const name = arg.slice(0, eq).trim();\n const value = arg.slice(eq + 1);\n const def = fieldMap.byName.get(name.toLowerCase());\n if (!def) throw new PncliError(`Unknown custom field: \"${name}\". Run: pncli jira fields`, 1);\n result[def.id] = formatFieldValue(value, def.type);\n }\n return result;\n}\n","import { Command } from 'commander';\nimport { BitbucketClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): { client: BitbucketClient; project: string; repo: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n\n const project: string = opts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo: string = opts.repo ?? ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n\n if (!project || !repo) {\n throw new PncliError(\n 'Could not determine Bitbucket project/repo. Pass --project and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, project, repo };\n}\n\nexport function registerBitbucketCommands(program: Command): void {\n const bb = program\n .command('bitbucket')\n .description('Bitbucket Server operations')\n .option('--project <key>', 'Bitbucket project key')\n .option('--repo <slug>', 'Bitbucket repository slug');\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n bb.command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: OPEN|MERGED|DECLINED|ALL', 'OPEN')\n .option('--author <username>', 'Filter by author username')\n .option('--reviewer <username>', 'Filter by reviewer username')\n .action(async (opts: { state?: string; author?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listPRs({ project, repo, state: opts.state, author: opts.author, reviewer: opts.reviewer });\n success(data, 'bitbucket', 'list-prs', start);\n } catch (err) { fail(err, 'bitbucket', 'list-prs', start); }\n });\n\n bb.command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.getPR(project, repo, parseInt(opts.id, 10));\n success(data, 'bitbucket', 'get-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'get-pr', start); }\n });\n\n bb.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (defaults to config)')\n .option('--description <desc>', 'PR description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { title: string; source: string; target?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const config = loadConfig({ configPath: program.optsWithGlobals().config });\n const target = opts.target ?? config.defaults.bitbucket?.targetBranch ?? 'main';\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : [];\n const data = await client.createPR({ project, repo, title: opts.title, source: opts.source, target, description: opts.description, reviewers });\n success(data, 'bitbucket', 'create-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'create-pr', start); }\n });\n\n bb.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <desc>', 'New description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : undefined;\n const data = await client.updatePR({ project, repo, id: prId, title: opts.title, description: opts.description, reviewers, version: pr.version });\n success(data, 'bitbucket', 'update-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'update-pr', start); }\n });\n\n bb.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--strategy <strategy>', 'Merge strategy: merge|squash|ff')\n .option('--delete-branch', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy?: string; deleteBranch?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.mergePR({ project, repo, id: prId, version: pr.version, strategy: opts.strategy as 'merge' | 'squash' | 'ff', deleteBranch: opts.deleteBranch });\n success(data, 'bitbucket', 'merge-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'merge-pr', start); }\n });\n\n bb.command('decline-pr')\n .description('Decline a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.declinePR(project, repo, prId, pr.version);\n success(data, 'bitbucket', 'decline-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'decline-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n bb.command('list-comments')\n .description('List comments on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listComments(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-comments', start);\n } catch (err) { fail(err, 'bitbucket', 'list-comments', start); }\n });\n\n bb.command('add-comment')\n .description('Add a comment to a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { pr: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.addComment(project, repo, parseInt(opts.pr, 10), opts.body);\n success(data, 'bitbucket', 'add-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-comment', start); }\n });\n\n bb.command('add-inline-comment')\n .description('Add an inline comment to a file in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <type>', 'Line type: ADDED|REMOVED|CONTEXT', 'ADDED')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.addInlineComment({\n project, repo,\n prId: parseInt(opts.pr, 10),\n text: opts.body,\n filePath: opts.file,\n line: parseInt(opts.line, 10),\n lineType: opts.lineType as 'ADDED' | 'REMOVED' | 'CONTEXT'\n });\n success(data, 'bitbucket', 'add-inline-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-inline-comment', start); }\n });\n\n bb.command('reply-comment')\n .description('Reply to a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.replyComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'bitbucket', 'reply-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'reply-comment', start); }\n });\n\n bb.command('resolve-comment')\n .description('Resolve a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.resolveComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ resolved: true }, 'bitbucket', 'resolve-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'resolve-comment', start); }\n });\n\n bb.command('delete-comment')\n .description('Delete a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.deleteComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ deleted: true }, 'bitbucket', 'delete-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'delete-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n bb.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--file <path>', 'Limit diff to a specific file')\n .option('--context-lines <n>', 'Lines of context around changes')\n .action(async (opts: { pr: string; file?: string; contextLines?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const contextLines = opts.contextLines ? parseInt(opts.contextLines, 10) : undefined;\n const diff = await client.getDiff(project, repo, parseInt(opts.pr, 10), opts.file, contextLines);\n success({ diff }, 'bitbucket', 'diff', start);\n } catch (err) { fail(err, 'bitbucket', 'diff', start); }\n });\n\n bb.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listFiles(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-files', start);\n } catch (err) { fail(err, 'bitbucket', 'list-files', start); }\n });\n\n // ── Approvals ──────────────────────────────────────────────────────\n\n bb.command('approve')\n .description('Approve a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.approvePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'approve', start);\n } catch (err) { fail(err, 'bitbucket', 'approve', start); }\n });\n\n bb.command('unapprove')\n .description('Remove approval from a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.unapprovePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'unapprove', start);\n } catch (err) { fail(err, 'bitbucket', 'unapprove', start); }\n });\n\n bb.command('needs-work')\n .description('Mark a pull request as needs-work')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.needsWorkPR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'needs-work', start);\n } catch (err) { fail(err, 'bitbucket', 'needs-work', start); }\n });\n\n bb.command('list-reviewers')\n .description('List reviewers of a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listReviewers(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-reviewers', start);\n } catch (err) { fail(err, 'bitbucket', 'list-reviewers', start); }\n });\n\n // ── Build Status ───────────────────────────────────────────────────\n\n bb.command('list-builds')\n .description('List build statuses for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listBuilds(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-builds', start);\n } catch (err) { fail(err, 'bitbucket', 'list-builds', start); }\n });\n\n bb.command('get-build-status')\n .description('Get build status for a commit SHA')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getBuildStatus(opts.commit);\n success(data, 'bitbucket', 'get-build-status', start);\n } catch (err) { fail(err, 'bitbucket', 'get-build-status', start); }\n });\n}\n","import { Command } from 'commander';\nimport { success } from '../../lib/output.js';\n\nexport function registerConfluenceCommands(program: Command): void {\n program\n .command('confluence')\n .description('Confluence operations')\n .action(() => {\n success(\n { message: 'Coming soon — the nightmare never ends.' },\n 'confluence',\n 'stub',\n Date.now()\n );\n });\n}\n","import { Command } from 'commander';\nimport { success } from '../../lib/output.js';\n\nexport function registerSonarCommands(program: Command): void {\n program\n .command('sonar')\n .description('SonarQube operations')\n .action(() => {\n success(\n { message: 'Coming soon — the nightmare never ends.' },\n 'sonar',\n 'stub',\n Date.now()\n );\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execSync, execFileSync } from 'child_process';\nimport type { Package, ManifestInfo, ScanOptions, ScanData, Ecosystem } from '../types.js';\nimport { findNpmManifests, parseNpmPackages } from './npm.js';\nimport { findNugetManifests, parseNugetPackages } from './nuget.js';\nimport { findMavenManifests, parseMavenPackages } from './maven.js';\n\nfunction getRepoFiles(repoRoot: string): string[] {\n try {\n const out = execSync('git ls-files --cached --others --exclude-standard', {\n encoding: 'utf8',\n cwd: repoRoot\n });\n return out.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction readFile(repoRoot: string, relPath: string): string | null {\n try {\n return fs.readFileSync(path.join(repoRoot, relPath), 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction readFileAtRef(repoRoot: string, ref: string, relPath: string): string | null {\n try {\n return execFileSync('git', ['show', `${ref}:${relPath}`], {\n encoding: 'utf8',\n cwd: repoRoot,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n } catch {\n return null;\n }\n}\n\nfunction findPropsContent(\n manifestFile: string,\n readFn: (relPath: string) => string | null\n): string | null {\n // Walk up from the manifest directory to the repo root looking for Directory.Packages.props\n let dir = path.dirname(manifestFile);\n for (let depth = 0; depth < 10; depth++) {\n const candidate = dir === '.' ? 'Directory.Packages.props' : `${dir}/Directory.Packages.props`;\n const content = readFn(candidate);\n if (content) return content;\n if (dir === '.') break;\n dir = path.dirname(dir);\n }\n return null;\n}\n\nfunction parseManifests(\n manifests: ManifestInfo[],\n opts: ScanOptions,\n readFn: (relPath: string) => string | null\n): Package[] {\n const allPackages: Package[] = [];\n const seen = new Set<string>();\n\n for (const manifest of manifests) {\n const content = readFn(manifest.file);\n if (!content) continue;\n\n const lockContent = manifest.lockFile ? readFn(manifest.lockFile) ?? undefined : undefined;\n\n let pkgs: Package[] = [];\n\n if (manifest.ecosystem === 'npm') {\n pkgs = parseNpmPackages(content, manifest, opts, lockContent);\n } else if (manifest.ecosystem === 'nuget') {\n // Walk up from the manifest's directory to find the nearest Directory.Packages.props\n const propsContent = findPropsContent(manifest.file, readFn) ?? undefined;\n pkgs = parseNugetPackages(content, manifest, opts, lockContent, propsContent);\n } else if (manifest.ecosystem === 'maven') {\n pkgs = parseMavenPackages(content, manifest, opts, lockContent);\n }\n\n for (const pkg of pkgs) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}:${pkg.source}`;\n if (!seen.has(key)) {\n seen.add(key);\n allPackages.push(pkg);\n }\n }\n }\n\n return allPackages;\n}\n\nexport function scanRepo(repoRoot: string, opts: ScanOptions = {}): ScanData {\n const files = getRepoFiles(repoRoot);\n const eco = opts.ecosystem ?? 'all';\n\n const npmManifests = eco === 'all' || eco === 'npm' ? findNpmManifests(files) : [];\n const nugetManifests = eco === 'all' || eco === 'nuget' ? findNugetManifests(files) : [];\n const mavenManifests = eco === 'all' || eco === 'maven' ? findMavenManifests(files) : [];\n\n const manifests = [...npmManifests, ...nugetManifests, ...mavenManifests];\n const packages = parseManifests(manifests, opts, rel => readFile(repoRoot, rel));\n\n return buildScanData(manifests, packages);\n}\n\nexport function scanRepoAtRef(repoRoot: string, ref: string, opts: ScanOptions = {}): ScanData {\n const eco = opts.ecosystem ?? 'all';\n\n // Get file list at that ref\n let files: string[] = [];\n try {\n const out = execFileSync('git', ['ls-tree', '-r', '--name-only', ref], {\n encoding: 'utf8',\n cwd: repoRoot,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n files = out.trim().split('\\n').filter(Boolean);\n } catch {\n return buildScanData([], []);\n }\n\n const npmManifests = eco === 'all' || eco === 'npm' ? findNpmManifests(files) : [];\n const nugetManifests = eco === 'all' || eco === 'nuget' ? findNugetManifests(files) : [];\n const mavenManifests = eco === 'all' || eco === 'maven' ? findMavenManifests(files) : [];\n\n const manifests = [...npmManifests, ...nugetManifests, ...mavenManifests];\n const packages = parseManifests(manifests, opts, rel => readFileAtRef(repoRoot, ref, rel));\n\n return buildScanData(manifests, packages);\n}\n\nfunction buildScanData(manifests: ManifestInfo[], packages: Package[]): ScanData {\n const ecosystemSet = new Set<Ecosystem>(manifests.map(m => m.ecosystem));\n const byEcosystem: Record<string, number> = {};\n const byType: Record<string, number> = { direct: 0, transitive: 0 };\n const byScope: Record<string, number> = { production: 0, dev: 0 };\n\n for (const pkg of packages) {\n byEcosystem[pkg.ecosystem] = (byEcosystem[pkg.ecosystem] ?? 0) + 1;\n byType[pkg.type] = (byType[pkg.type] ?? 0) + 1;\n byScope[pkg.scope] = (byScope[pkg.scope] ?? 0) + 1;\n }\n\n return {\n ecosystems: Array.from(ecosystemSet),\n manifests,\n packages,\n summary: {\n totalPackages: packages.length,\n byEcosystem,\n byType,\n byScope\n }\n };\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\ninterface PackageLockV2Meta {\n version?: string;\n dev?: boolean;\n devOptional?: boolean;\n}\n\ninterface PackageLockV2 {\n lockfileVersion?: number;\n packages?: Record<string, PackageLockV2Meta>;\n}\n\nexport function findNpmManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Set(\n files.filter(f => {\n const base = path.basename(f);\n return base === 'package-lock.json' || base === 'yarn.lock' || base === 'pnpm-lock.yaml';\n })\n );\n\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n if (path.basename(file) !== 'package.json') continue;\n if (file.split('/').includes('node_modules')) continue;\n\n const dir = path.dirname(file);\n let lockFile: string | undefined;\n\n for (const lf of ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml']) {\n const candidate = dir === '.' ? lf : `${dir}/${lf}`;\n if (lockFiles.has(candidate)) {\n lockFile = candidate;\n break;\n }\n }\n\n manifests.push({ file, ecosystem: 'npm', lockFile });\n }\n\n return manifests;\n}\n\nexport function parseNpmPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string\n): Package[] {\n if (lockContent && manifest.lockFile) {\n const base = path.basename(manifest.lockFile);\n if (base === 'package-lock.json') {\n const pkgs = parsePackageLock(lockContent, manifest.lockFile, opts);\n if (pkgs.length > 0) return pkgs;\n } else if (base === 'yarn.lock') {\n return parseYarnLock(lockContent, manifest.lockFile, opts, content);\n } else if (base === 'pnpm-lock.yaml') {\n return parsePnpmLock(lockContent, manifest.lockFile, opts, content);\n }\n }\n return parsePackageJson(content, manifest.file, opts);\n}\n\nfunction stripVersionPrefix(v: string): string {\n return v.replace(/^[\\^~>=<* ]+/, '').split(/\\s/)[0] ?? v;\n}\n\nfunction parsePackageJson(content: string, filePath: string, opts: ScanOptions): Package[] {\n let pkg: PackageJson;\n try {\n pkg = JSON.parse(content) as PackageJson;\n } catch {\n return [];\n }\n\n const packages: Package[] = [];\n\n for (const [name, version] of Object.entries(pkg.dependencies ?? {})) {\n packages.push({\n name,\n version: stripVersionPrefix(version),\n ecosystem: 'npm',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n\n if (opts.includeDev) {\n for (const [name, version] of Object.entries(pkg.devDependencies ?? {})) {\n packages.push({\n name,\n version: stripVersionPrefix(version),\n ecosystem: 'npm',\n source: filePath,\n type: 'direct',\n scope: 'dev'\n });\n }\n }\n\n return packages;\n}\n\nfunction parsePackageLock(content: string, lockFilePath: string, opts: ScanOptions): Package[] {\n let lock: PackageLockV2;\n try {\n lock = JSON.parse(content) as PackageLockV2;\n } catch {\n return [];\n }\n\n if ((lock.lockfileVersion ?? 1) < 2 || !lock.packages) return [];\n\n const packages: Package[] = [];\n\n for (const [pkgPath, meta] of Object.entries(lock.packages)) {\n if (pkgPath === '') continue;\n if (!meta.version) continue;\n\n const isDev = meta.dev === true || meta.devOptional === true;\n if (isDev && !opts.includeDev) continue;\n\n // node_modules/express → direct\n // node_modules/express/node_modules/qs → transitive\n const withoutRoot = pkgPath.startsWith('node_modules/')\n ? pkgPath.slice('node_modules/'.length)\n : pkgPath;\n const segments = withoutRoot.split('/node_modules/');\n const isTransitive = segments.length > 1;\n if (isTransitive && !opts.includeTransitive) continue;\n\n const name = segments[segments.length - 1] ?? pkgPath;\n\n packages.push({\n name,\n version: meta.version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parseYarnLock(\n content: string,\n lockFilePath: string,\n opts: ScanOptions,\n packageJsonContent: string\n): Package[] {\n let pkgJson: PackageJson;\n try {\n pkgJson = JSON.parse(packageJsonContent) as PackageJson;\n } catch {\n pkgJson = {};\n }\n\n const directDeps = new Set(Object.keys(pkgJson.dependencies ?? {}));\n const devDeps = new Set(Object.keys(pkgJson.devDependencies ?? {}));\n const allDirectDeps = new Set([...directDeps, ...devDeps]);\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // Matches both plain and scoped packages:\n // express@^4.21.0: → express\n // \"@types/node@^18.0.0\": → @types/node\n // version \"4.21.0\"\n const blockRegex = /^\"?(@?[^@\"\\n][^\"\\n]*)@[^:]+:?\\n\\s+version \"([^\"]+)\"/gm;\n\n for (const match of content.matchAll(blockRegex)) {\n const name = match[1].trim().replace(/^\"|\"$/g, '');\n const version = match[2];\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const isDev = devDeps.has(name) && !directDeps.has(name);\n if (isDev && !opts.includeDev) continue;\n\n const isTransitive = !allDirectDeps.has(name);\n if (isTransitive && !opts.includeTransitive) continue;\n\n packages.push({\n name,\n version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parsePnpmLock(\n content: string,\n lockFilePath: string,\n opts: ScanOptions,\n packageJsonContent: string\n): Package[] {\n let pkgJson: PackageJson;\n try {\n pkgJson = JSON.parse(packageJsonContent) as PackageJson;\n } catch {\n pkgJson = {};\n }\n\n const directDeps = new Set(Object.keys(pkgJson.dependencies ?? {}));\n const devDeps = new Set(Object.keys(pkgJson.devDependencies ?? {}));\n const allDirectDeps = new Set([...directDeps, ...devDeps]);\n\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // pnpm-lock.yaml v6+ format:\n // packages:\n // /express@4.21.0: or /@types/node@18.0.0:\n // dev: false\n const blockRegex = /^\\s{2}(\\/?@?[^@\\s/][^@\\s]*)@(\\d[^:\\s]*):\\s*\\n((?:\\s{4}[^\\n]+\\n)*)/gm;\n\n for (const match of content.matchAll(blockRegex)) {\n const name = match[1].replace(/^\\//, '');\n const version = match[2];\n const attrs = match[3] ?? '';\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const isDev = devDeps.has(name) && !directDeps.has(name)\n || /^\\s+dev:\\s*true/m.test(attrs);\n if (isDev && !opts.includeDev) continue;\n\n const isTransitive = !allDirectDeps.has(name);\n if (isTransitive && !opts.includeTransitive) continue;\n\n packages.push({\n name,\n version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\nconst PROJ_EXTENSIONS = new Set(['.csproj', '.fsproj', '.vbproj']);\n\nexport function findNugetManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Map<string, string>(); // dir → lock path\n\n for (const f of files) {\n if (path.basename(f) === 'packages.lock.json') {\n lockFiles.set(path.dirname(f), f);\n }\n }\n\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n const base = path.basename(file);\n const ext = path.extname(file);\n\n if (PROJ_EXTENSIONS.has(ext) || base === 'packages.config') {\n const dir = path.dirname(file);\n const lockFile = lockFiles.get(dir);\n manifests.push({ file, ecosystem: 'nuget', lockFile });\n }\n\n if (base === 'Directory.Packages.props') {\n const dir = path.dirname(file);\n manifests.push({ file, ecosystem: 'nuget', lockFile: lockFiles.get(dir) });\n }\n }\n\n // Deduplicate: when multiple project files share the same packages.lock.json,\n // keep only one representative manifest per lock file to avoid parsing the same\n // lock multiple times and inflating package counts.\n const deduped: ManifestInfo[] = [];\n const seenLocks = new Set<string>();\n\n for (const manifest of manifests) {\n if (!manifest.lockFile) {\n deduped.push(manifest);\n continue;\n }\n if (!seenLocks.has(manifest.lockFile)) {\n seenLocks.add(manifest.lockFile);\n deduped.push(manifest);\n }\n }\n\n return deduped;\n}\n\nexport function parseNugetPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string,\n propsContent?: string\n): Package[] {\n const base = path.basename(manifest.file);\n\n if (lockContent) {\n return parsePackagesLock(lockContent, manifest.lockFile ?? manifest.file, opts);\n }\n\n if (base === 'packages.config') {\n return parsePackagesConfig(content, manifest.file);\n }\n\n if (base === 'Directory.Packages.props') {\n return parseDirectoryPackagesProps(content, manifest.file);\n }\n\n // .csproj / .fsproj / .vbproj\n return parseCsproj(content, manifest.file, propsContent);\n}\n\nfunction parseCsproj(content: string, filePath: string, propsContent?: string): Package[] {\n // Build version map from Directory.Packages.props if provided\n const centralVersions = propsContent ? extractCentralVersions(propsContent) : new Map<string, string>();\n\n const packages: Package[] = [];\n\n // Match <PackageReference Include=\"X\" Version=\"Y\" /> or multiline form\n const singleLine = /<PackageReference\\s+([^>]+?)\\/>/gi;\n const multiLine = /<PackageReference\\s+([^>]+?)>([\\s\\S]*?)<\\/PackageReference>/gi;\n\n const extractFromAttrsAndInner = (attrs: string, inner: string): void => {\n const nameMatch = /\\bInclude=\"([^\"]+)\"/i.exec(attrs);\n if (!nameMatch) return;\n const name = nameMatch[1];\n\n let version: string | undefined;\n const attrVersion = /\\bVersion=\"([^\"]+)\"/i.exec(attrs);\n if (attrVersion) {\n version = attrVersion[1];\n } else if (inner) {\n const innerVersion = /<Version>([^<]+)<\\/Version>/i.exec(inner);\n if (innerVersion) version = innerVersion[1];\n }\n\n // Fall back to central package management\n if (!version || version.startsWith('$(')) {\n version = centralVersions.get(name) ?? centralVersions.get(name.toLowerCase());\n }\n\n if (!version) return;\n\n packages.push({\n name,\n version,\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n };\n\n for (const m of content.matchAll(singleLine)) {\n extractFromAttrsAndInner(m[1], '');\n }\n for (const m of content.matchAll(multiLine)) {\n extractFromAttrsAndInner(m[1], m[2] ?? '');\n }\n\n return packages;\n}\n\nfunction extractCentralVersions(propsContent: string): Map<string, string> {\n const map = new Map<string, string>();\n const regex = /<PackageVersion\\s+Include=\"([^\"]+)\"\\s+Version=\"([^\"]+)\"/gi;\n for (const m of propsContent.matchAll(regex)) {\n map.set(m[1], m[2]);\n map.set(m[1].toLowerCase(), m[2]);\n }\n return map;\n}\n\nfunction parseDirectoryPackagesProps(content: string, filePath: string): Package[] {\n const packages: Package[] = [];\n const regex = /<PackageVersion\\s+Include=\"([^\"]+)\"\\s+Version=\"([^\"]+)\"/gi;\n for (const m of content.matchAll(regex)) {\n packages.push({\n name: m[1],\n version: m[2],\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n return packages;\n}\n\nfunction parsePackagesConfig(content: string, filePath: string): Package[] {\n const packages: Package[] = [];\n const regex = /<package\\s+id=\"([^\"]+)\"\\s+version=\"([^\"]+)\"/gi;\n for (const m of content.matchAll(regex)) {\n packages.push({\n name: m[1],\n version: m[2],\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n return packages;\n}\n\ninterface PackagesLockDep {\n resolved?: string;\n type?: string;\n dependencies?: Record<string, PackagesLockDep>;\n}\n\ninterface PackagesLockJson {\n dependencies?: Record<string, Record<string, PackagesLockDep>>;\n}\n\nfunction parsePackagesLock(content: string, filePath: string, opts: ScanOptions): Package[] {\n let lock: PackagesLockJson;\n try {\n lock = JSON.parse(content) as PackagesLockJson;\n } catch {\n return [];\n }\n\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n for (const frameworkDeps of Object.values(lock.dependencies ?? {})) {\n for (const [name, meta] of Object.entries(frameworkDeps)) {\n const version = meta.resolved ?? '';\n if (!version) continue;\n\n const isTransitive = meta.type === 'Transitive';\n if (isTransitive && !opts.includeTransitive) continue;\n\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'nuget',\n source: filePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: 'production'\n });\n }\n }\n\n return packages;\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\nexport function findMavenManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Set(files.filter(f => path.basename(f) === 'gradle.lockfile'));\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n const base = path.basename(file);\n if (base === 'pom.xml' || base === 'build.gradle' || base === 'build.gradle.kts') {\n const dir = path.dirname(file);\n const lockCandidate = dir === '.' ? 'gradle.lockfile' : `${dir}/gradle.lockfile`;\n const lockFile = lockFiles.has(lockCandidate) ? lockCandidate : undefined;\n manifests.push({ file, ecosystem: 'maven', lockFile });\n }\n }\n\n return manifests;\n}\n\nexport function parseMavenPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string\n): Package[] {\n const base = path.basename(manifest.file);\n\n if (lockContent && manifest.lockFile) {\n return parseGradleLock(lockContent, manifest.lockFile, opts);\n }\n\n if (base === 'pom.xml') {\n return parsePomXml(content, manifest.file, opts);\n }\n\n if (base === 'build.gradle' || base === 'build.gradle.kts') {\n return parseBuildGradle(content, manifest.file, opts);\n }\n\n return [];\n}\n\nfunction parsePomXml(content: string, filePath: string, opts: ScanOptions): Package[] {\n // Extract properties for variable substitution\n const props = extractPomProperties(content);\n\n // Extract dependency management versions\n const managedVersions = extractDependencyManagement(content, props);\n\n // Extract actual dependencies (skip dependencyManagement block)\n const withoutMgmt = content.replace(/<dependencyManagement>[\\s\\S]*?<\\/dependencyManagement>/gi, '');\n\n const packages: Package[] = [];\n const depRegex = /<dependency>([\\s\\S]*?)<\\/dependency>/gi;\n\n for (const match of withoutMgmt.matchAll(depRegex)) {\n const inner = match[1];\n const groupId = /<groupId>\\s*([^<\\s]+)\\s*<\\/groupId>/i.exec(inner)?.[1];\n const artifactId = /<artifactId>\\s*([^<\\s]+)\\s*<\\/artifactId>/i.exec(inner)?.[1];\n if (!groupId || !artifactId) continue;\n\n const rawVersion = /<version>\\s*([^<\\s]+)\\s*<\\/version>/i.exec(inner)?.[1];\n const resolvedVersion = resolveProperty(rawVersion ?? null, props)\n ?? managedVersions.get(`${groupId}:${artifactId}`);\n if (!resolvedVersion) continue;\n\n const scope = /<scope>\\s*([^<\\s]+)\\s*<\\/scope>/i.exec(inner)?.[1] ?? 'compile';\n const isDev = scope === 'test' || scope === 'provided';\n if (isDev && !opts.includeDev) continue;\n\n packages.push({\n name: `${groupId}:${artifactId}`,\n version: resolvedVersion,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction extractPomProperties(content: string): Map<string, string> {\n const props = new Map<string, string>();\n const propsMatch = /<properties>([\\s\\S]*?)<\\/properties>/i.exec(content);\n if (!propsMatch) return props;\n\n const propRegex = /<([a-zA-Z0-9._-]+)>\\s*([^<]+)\\s*<\\/\\1>/g;\n for (const m of propsMatch[1].matchAll(propRegex)) {\n props.set(m[1], m[2].trim());\n }\n return props;\n}\n\nfunction extractDependencyManagement(content: string, props: Map<string, string>): Map<string, string> {\n const versions = new Map<string, string>();\n const mgmtMatch = /<dependencyManagement>([\\s\\S]*?)<\\/dependencyManagement>/i.exec(content);\n if (!mgmtMatch) return versions;\n\n const depRegex = /<dependency>([\\s\\S]*?)<\\/dependency>/gi;\n for (const m of mgmtMatch[1].matchAll(depRegex)) {\n const inner = m[1];\n const groupId = /<groupId>\\s*([^<\\s]+)\\s*<\\/groupId>/i.exec(inner)?.[1];\n const artifactId = /<artifactId>\\s*([^<\\s]+)\\s*<\\/artifactId>/i.exec(inner)?.[1];\n const rawVersion = /<version>\\s*([^<\\s]+)\\s*<\\/version>/i.exec(inner)?.[1];\n if (!groupId || !artifactId || !rawVersion) continue;\n const resolved = resolveProperty(rawVersion, props);\n if (resolved) versions.set(`${groupId}:${artifactId}`, resolved);\n }\n\n return versions;\n}\n\nfunction resolveProperty(value: string | null, props: Map<string, string>): string | null {\n if (!value) return null;\n const resolved = value.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => props.get(key) ?? `\\${${key}}`);\n // If any placeholder remains unresolved, return null so callers fall through to managed versions\n return /\\$\\{[^}]+\\}/.test(resolved) ? null : resolved;\n}\n\nconst GRADLE_DEV_CONFIGS = new Set(['testImplementation', 'testCompileOnly', 'testRuntimeOnly', 'testApi']);\n\nfunction parseBuildGradle(content: string, filePath: string, opts: ScanOptions): Package[] {\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // String notation — Groovy: implementation 'g:a:v' / Kotlin DSL: implementation(\"g:a:v\")\n const stringNotation = /\\b(\\w+)\\s*\\(?\\s*['\"]([^:'\"]+):([^:'\"]+):([^'\"]+)['\"]\\s*\\)?/g;\n for (const m of content.matchAll(stringNotation)) {\n const config = m[1];\n const groupId = m[2];\n const artifactId = m[3];\n const version = m[4].split('@')[0]; // strip classifier\n\n const isDev = GRADLE_DEV_CONFIGS.has(config);\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n // Map notation: implementation group: 'x', name: 'y', version: 'z'\n const mapNotation = /\\b(\\w+)\\s+group:\\s*['\"]([^'\"]+)['\"]\\s*,\\s*name:\\s*['\"]([^'\"]+)['\"]\\s*,\\s*version:\\s*['\"]([^'\"]+)['\"]/g;\n for (const m of content.matchAll(mapNotation)) {\n const config = m[1];\n const groupId = m[2];\n const artifactId = m[3];\n const version = m[4];\n\n const isDev = GRADLE_DEV_CONFIGS.has(config);\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parseGradleLock(content: string, filePath: string, opts: ScanOptions): Package[] {\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // Format: group:artifact:version=config1,config2\n const lineRegex = /^([^:#\\s]+):([^:#\\s]+):([^=\\s]+)=(.+)$/gm;\n\n for (const m of content.matchAll(lineRegex)) {\n const groupId = m[1];\n const artifactId = m[2];\n const version = m[3];\n const configs = m[4].split(',').map(s => s.trim());\n\n const isDev = configs.every(c => GRADLE_DEV_CONFIGS.has(c));\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, ScanData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport function runScan(config: ResolvedConfig, opts: ScanOptions): ScanData {\n void config; // scan is local-only, no network\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository. deps commands require a git repo root.', 1);\n }\n return scanRepo(repoRoot, opts);\n}\n","interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n preRelease: string;\n}\n\nfunction parse(v: string): ParsedVersion {\n // Strip leading non-numeric (e.g. 'v1.0.0')\n const clean = v.replace(/^[^0-9]*/, '');\n // Split off pre-release/build metadata\n const dashIdx = clean.indexOf('-');\n const plusIdx = clean.indexOf('+');\n const metaStart = plusIdx > -1 ? plusIdx : Infinity;\n const preStart = dashIdx > -1 && dashIdx < metaStart ? dashIdx : Infinity;\n const numeric = clean.slice(0, Math.min(preStart, metaStart));\n const preRelease = preStart < Infinity\n ? clean.slice(preStart + 1, metaStart < Infinity ? metaStart : undefined)\n : '';\n const parts = numeric.split('.').map(n => parseInt(n, 10) || 0);\n return { major: parts[0] ?? 0, minor: parts[1] ?? 0, patch: parts[2] ?? 0, preRelease };\n}\n\n/** Returns negative / zero / positive like Array.sort comparators. */\nexport function compareSemver(a: string, b: string): number {\n const av = parse(a);\n const bv = parse(b);\n if (av.major !== bv.major) return av.major - bv.major;\n if (av.minor !== bv.minor) return av.minor - bv.minor;\n if (av.patch !== bv.patch) return av.patch - bv.patch;\n // A release (no pre-release) is greater than any pre-release of the same version\n if (!av.preRelease && bv.preRelease) return 1;\n if (av.preRelease && !bv.preRelease) return -1;\n if (av.preRelease && bv.preRelease) return av.preRelease.localeCompare(bv.preRelease);\n return 0;\n}\n\nexport function isNewer(current: string, latest: string): boolean {\n return compareSemver(latest, current) > 0;\n}\n\nexport function updateType(current: string, latest: string): 'major' | 'minor' | 'patch' {\n const cv = parse(current);\n const lv = parse(latest);\n if (lv.major > cv.major) return 'major';\n if (lv.minor > cv.minor) return 'minor';\n return 'patch';\n}\n\nexport function isDowngrade(from: string, to: string): boolean {\n return compareSemver(to, from) < 0;\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, DiffData, PackageChange, ChangeType, Ecosystem } from './types.js';\nimport { scanRepo, scanRepoAtRef } from './parsers/index.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { isDowngrade } from './semver.js';\n\nexport function runDiff(\n config: ResolvedConfig,\n from: string,\n to: string | null,\n opts: ScanOptions\n): DiffData {\n void config;\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n const fromScan = scanRepoAtRef(repoRoot, from, opts);\n const toScan = to ? scanRepoAtRef(repoRoot, to, opts) : scanRepo(repoRoot, opts);\n\n // Key on ecosystem:name:source to preserve multiple versions of the same package\n // (common with transitive npm deps where the same package appears at different versions)\n type PkgKey = string;\n const fromMap = new Map<PkgKey, string>(); // key → version\n const toMap = new Map<PkgKey, string>();\n\n for (const pkg of fromScan.packages) {\n const key = `${pkg.ecosystem}:${pkg.name}:${pkg.source}`;\n fromMap.set(key, pkg.version);\n }\n for (const pkg of toScan.packages) {\n const key = `${pkg.ecosystem}:${pkg.name}:${pkg.source}`;\n toMap.set(key, pkg.version);\n }\n\n const changes: PackageChange[] = [];\n const allKeys = new Set([...fromMap.keys(), ...toMap.keys()]);\n\n for (const key of allKeys) {\n const parts = key.split(':');\n const eco = parts[0] as Ecosystem;\n const source = parts[parts.length - 1] ?? '';\n const name = parts.slice(1, -1).join(':');\n const fromVer = fromMap.get(key) ?? null;\n const toVer = toMap.get(key) ?? null;\n\n let change: ChangeType;\n if (!fromVer) {\n change = 'added';\n } else if (!toVer) {\n change = 'removed';\n } else if (fromVer === toVer) {\n continue; // unchanged — omit from output\n } else {\n change = isDowngrade(fromVer, toVer) ? 'downgraded' : 'upgraded';\n }\n\n changes.push({ name, ecosystem: eco, change, from: fromVer, to: toVer, source });\n }\n\n const summary = { added: 0, removed: 0, upgraded: 0, downgraded: 0, unchanged: 0 };\n for (const c of changes) summary[c.change]++;\n // Unchanged = keys present in both maps with identical versions\n summary.unchanged = [...allKeys].filter(k => {\n const fv = fromMap.get(k);\n const tv = toMap.get(k);\n return fv !== undefined && tv !== undefined && fv === tv;\n }).length;\n\n return { from, to: to ?? 'working tree', changes, summary };\n}\n\n","import type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst OSV_URL = 'https://api.osv.dev';\nconst BATCH_SIZE = 500;\nconst TIMEOUT_MS = 30_000;\n\nconst OSV_ECOSYSTEM: Record<string, string> = {\n npm: 'npm',\n nuget: 'NuGet',\n maven: 'Maven'\n};\n\ninterface OsvQuery {\n package: { name: string; ecosystem: string };\n version: string;\n}\n\ninterface OsvRange {\n type: string;\n events?: Array<{ introduced?: string; fixed?: string; last_affected?: string }>;\n}\n\ninterface OsvAffected {\n package?: { name: string; ecosystem: string };\n ranges?: OsvRange[];\n}\n\ninterface OsvSeverityEntry {\n type: string;\n score: string;\n}\n\ninterface OsvRawVuln {\n id: string;\n summary?: string;\n aliases?: string[];\n references?: Array<{ url?: string }>;\n affected?: OsvAffected[];\n severity?: OsvSeverityEntry[];\n database_specific?: Record<string, unknown>;\n}\n\ninterface OsvBatchResponse {\n results: Array<{ vulns?: OsvRawVuln[] }>;\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkOsvConnectivity(): Promise<{ reachable: boolean; error?: string }> {\n try {\n const res = await fetchWithTimeout(`${OSV_URL}/v1/querybatch`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries: [] })\n });\n return { reachable: res.ok || res.status === 400 }; // 400 is fine, means it's up\n } catch (err) {\n return {\n reachable: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nfunction extractRemediation(vuln: OsvRawVuln, pkg: Package): OsvVulnerability['remediation'] {\n const fixedVersions: string[] = [];\n\n for (const affected of vuln.affected ?? []) {\n for (const range of affected.ranges ?? []) {\n if (range.type === 'SEMVER' || range.type === 'ECOSYSTEM') {\n for (const event of range.events ?? []) {\n if (event.fixed) fixedVersions.push(event.fixed);\n }\n }\n }\n }\n\n const unique = [...new Set(fixedVersions)];\n const fixAvailable = unique.length > 0;\n const advice = fixAvailable\n ? `Upgrade ${pkg.name} to ${unique.join(' or ')}`\n : `No fix available yet for ${pkg.name}. Monitor ${vuln.id} for updates.`;\n\n return { fixAvailable, fixedVersions: unique, advice };\n}\n\nfunction extractSeverity(vuln: OsvRawVuln): { severity: string; cvss: number | null } {\n const dbSpecific = vuln.database_specific ?? {};\n const dbSeverity = typeof dbSpecific['severity'] === 'string' ? dbSpecific['severity'] : undefined;\n\n // Some databases put numeric CVSS in database_specific.cvss\n let cvss: number | null = null;\n const rawCvss = dbSpecific['cvss'];\n if (typeof rawCvss === 'number') {\n cvss = rawCvss;\n } else if (rawCvss && typeof rawCvss === 'object' && 'score' in rawCvss) {\n const score = (rawCvss as Record<string, unknown>)['score'];\n if (typeof score === 'number') cvss = score;\n }\n\n // Try severity array for numeric scores\n for (const s of vuln.severity ?? []) {\n const score = parseFloat(s.score);\n if (!isNaN(score) && score >= 0 && score <= 10) {\n cvss = score;\n break;\n }\n }\n\n return {\n severity: dbSeverity ?? inferSeverityFromCvss(cvss),\n cvss\n };\n}\n\nfunction inferSeverityFromCvss(cvss: number | null): string {\n if (cvss === null) return 'UNKNOWN';\n if (cvss >= 9.0) return 'CRITICAL';\n if (cvss >= 7.0) return 'HIGH';\n if (cvss >= 4.0) return 'MEDIUM';\n return 'LOW';\n}\n\nfunction mapVuln(vuln: OsvRawVuln, pkg: Package): OsvVulnerability {\n const { severity, cvss } = extractSeverity(vuln);\n return {\n id: vuln.id,\n summary: vuln.summary ?? '',\n severity,\n cvss,\n aliases: vuln.aliases ?? [],\n remediation: extractRemediation(vuln, pkg),\n references: (vuln.references ?? []).map(r => r.url ?? '').filter(Boolean)\n };\n}\n\nasync function queryBatch(queries: OsvQuery[], packages: Package[]): Promise<VulnerablePackage[]> {\n const res = await fetchWithTimeout(`${OSV_URL}/v1/querybatch`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries })\n });\n\n if (!res.ok) {\n throw new Error(`OSV.dev returned HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as OsvBatchResponse;\n const vulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < data.results.length; i++) {\n const result = data.results[i];\n const pkg = packages[i];\n if (!result || !pkg) continue;\n\n const vulns = result.vulns ?? [];\n if (vulns.length === 0) continue;\n\n vulnerable.push({\n ...pkg,\n vulnerabilities: vulns.map(v => mapVuln(v, pkg))\n });\n }\n\n return vulnerable;\n}\n\nexport async function checkPackagesForVulns(packages: Package[]): Promise<VulnerablePackage[]> {\n const allVulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const chunk = packages.slice(i, i + BATCH_SIZE);\n\n const queries: OsvQuery[] = chunk.map(pkg => ({\n package: {\n name: pkg.name,\n ecosystem: OSV_ECOSYSTEM[pkg.ecosystem] ?? pkg.ecosystem\n },\n version: pkg.version\n }));\n\n const results = await queryBatch(queries, chunk);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n","import type { Ecosystem, LicensedPackage, OutdatedPackage } from '../types.js';\nimport type { ArtifactoryConfig } from '../../../types/config.js';\nimport { PncliError } from '../../../lib/errors.js';\nimport { isNewer, updateType } from '../semver.js';\n\nconst TIMEOUT_MS = 15_000;\n\nasync function fetchWithTimeout(url: string, token: string): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkArtifactoryConnectivity(config: ArtifactoryConfig): Promise<{\n reachable: boolean;\n authenticated: boolean;\n configured: boolean;\n error?: string;\n}> {\n if (!config.baseUrl && !config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory is not configured'\n };\n }\n if (!config.baseUrl) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory baseUrl is not set'\n };\n }\n if (!config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory token is not set'\n };\n }\n\n try {\n const res = await fetchWithTimeout(`${config.baseUrl}/api/system/ping`, config.token);\n if (res.status === 401 || res.status === 403) {\n return {\n reachable: true,\n authenticated: false,\n configured: true,\n error: 'Artifactory token is invalid or lacks permissions'\n };\n }\n return { reachable: res.ok, authenticated: res.ok, configured: true };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n configured: true,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport function requireArtifactory(config: ArtifactoryConfig, command: string): void {\n if (!config.baseUrl && !config.token) {\n throw new PncliError(\n `${command} requires Artifactory. Add the following to ~/.pncli/config.json:\\n` +\n ` \"artifactory\": { \"baseUrl\": \"https://artifactory.company.com\", \"token\": \"your-token\" }\\n` +\n `Or set PNCLI_ARTIFACTORY_BASE_URL and PNCLI_ARTIFACTORY_TOKEN environment variables.`,\n 503\n );\n }\n if (!config.baseUrl) {\n throw new PncliError(\n `${command} requires an Artifactory URL. Set artifactory.baseUrl in ~/.pncli/config.json or PNCLI_ARTIFACTORY_BASE_URL.`,\n 503\n );\n }\n if (!config.token) {\n throw new PncliError(\n `${command} requires an Artifactory token. Set artifactory.token in ~/.pncli/config.json or PNCLI_ARTIFACTORY_TOKEN.`,\n 503\n );\n }\n}\n\nfunction repoForEcosystem(config: ArtifactoryConfig, eco: Ecosystem): string | undefined {\n if (eco === 'npm') return config.npmRepo;\n if (eco === 'nuget') return config.nugetRepo;\n if (eco === 'maven') return config.mavenRepo;\n return undefined;\n}\n\nasync function getLatestNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { 'dist-tags'?: { latest?: string } };\n return data['dist-tags']?.latest ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/flatcontainer/${lower}/index.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { versions?: string[] };\n const versions = data.versions ?? [];\n return versions[versions.length - 1] ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestMaven(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n const [groupId, artifactId] = packageName.split(':');\n if (!groupId || !artifactId) return null;\n\n try {\n const res = await fetchWithTimeout(\n `${baseUrl}/api/search/latestVersion?g=${encodeURIComponent(groupId)}&a=${encodeURIComponent(artifactId)}&repos=${repoName}`,\n token\n );\n if (!res.ok) return null;\n const text = await res.text();\n return text.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function getOutdatedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<{ outdated: OutdatedPackage[]; uncheckedEcosystems: string[] }> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return { outdated: [], uncheckedEcosystems: [] };\n\n const outdated: OutdatedPackage[] = [];\n const unchecked = new Set<string>();\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n if (!repoName) {\n unchecked.add(pkg.ecosystem);\n continue;\n }\n\n let latest: string | null = null;\n if (pkg.ecosystem === 'npm') {\n latest = await getLatestNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n latest = await getLatestNuget(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'maven') {\n latest = await getLatestMaven(baseUrl, token, repoName, pkg.name);\n }\n\n if (!latest || !isNewer(pkg.version, latest)) continue;\n\n const type = updateType(pkg.version, latest);\n if (filterType) {\n const order = { major: 3, minor: 2, patch: 1 };\n if (order[type] < order[filterType]) continue;\n }\n\n outdated.push({\n name: pkg.name,\n ecosystem: pkg.ecosystem,\n current: pkg.version,\n latest,\n updateType: type,\n source: pkg.source\n });\n }\n\n return { outdated, uncheckedEcosystems: [...unchecked] };\n}\n\nasync function getLicenseNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { license?: string | { type?: string } };\n if (typeof data.license === 'string') return data.license;\n if (typeof data.license === 'object' && data.license !== null) return data.license.type ?? null;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function getLicenseNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string,\n version: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/registration/${lower}/${version}.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { licenseExpression?: string; licenseUrl?: string };\n return data.licenseExpression ?? (data.licenseUrl ? 'See licenseUrl' : null);\n } catch {\n return null;\n }\n}\n\nexport async function getLicensedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig\n): Promise<LicensedPackage[]> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return [];\n\n const result: LicensedPackage[] = [];\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n let license: string | null = null;\n\n if (repoName) {\n if (pkg.ecosystem === 'npm') {\n license = await getLicenseNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n license = await getLicenseNuget(baseUrl, token, repoName, pkg.name, pkg.version);\n }\n // Maven: fetching license from POM via Artifactory is complex — emit null\n }\n\n result.push({\n name: pkg.name,\n version: pkg.version,\n ecosystem: pkg.ecosystem,\n source: pkg.source,\n license\n });\n }\n\n return result;\n}\n","import type { ConnectivityData, Tier } from './types.js';\nimport type { ResolvedConfig } from '../../types/config.js';\nimport { checkOsvConnectivity } from './clients/osv.js';\nimport { checkArtifactoryConnectivity } from './clients/artifactory.js';\n\ninterface TierResult {\n tier: Tier;\n osvReachable: boolean;\n artifactoryReachable: boolean;\n}\n\n// Session-level cache — not persisted to disk\nlet cachedTier: TierResult | null = null;\n\nexport async function detectTier(config: ResolvedConfig): Promise<TierResult> {\n if (cachedTier) return cachedTier;\n\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artifactoryReachable = artResult.reachable && artResult.authenticated;\n const osvReachable = osvResult.reachable;\n\n let tier: Tier = 'local';\n if (artifactoryReachable) tier = 'artifactory';\n if (osvReachable) tier = 'full';\n\n cachedTier = { tier, osvReachable, artifactoryReachable };\n return cachedTier;\n}\n\nexport function clearTierCache(): void {\n cachedTier = null;\n}\n\nexport async function buildConnectivityData(config: ResolvedConfig): Promise<ConnectivityData> {\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artCfg = config.artifactory;\n\n let tier: Tier = 'local';\n if (artResult.reachable && artResult.authenticated) tier = 'artifactory';\n if (osvResult.reachable) tier = 'full';\n\n cachedTier = {\n tier,\n osvReachable: osvResult.reachable,\n artifactoryReachable: artResult.reachable && artResult.authenticated\n };\n\n return {\n artifactory: {\n reachable: artResult.reachable,\n url: artCfg.baseUrl ?? '(not configured)',\n authenticated: artResult.authenticated,\n repositories: {\n npm: artCfg.npmRepo ?? '(not configured)',\n nuget: artCfg.nugetRepo ?? '(not configured)',\n maven: artCfg.mavenRepo ?? '(not configured)'\n },\n ...(artResult.error ? { error: artResult.error } : {})\n },\n osv: {\n reachable: osvResult.reachable,\n url: 'https://api.osv.dev',\n ...(osvResult.error ? { error: osvResult.error } : {})\n },\n tier,\n capabilities: {\n scan: true,\n diff: true,\n outdated: artResult.reachable && artResult.authenticated,\n licenseCheck: artResult.reachable && artResult.authenticated,\n cveCheck: osvResult.reachable\n }\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, FriskData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { checkPackagesForVulns } from './clients/osv.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runFrisk(config: ResolvedConfig, opts: ScanOptions): Promise<FriskData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n const { tier, osvReachable } = await detectTier(config);\n\n if (!osvReachable) {\n throw new PncliError(\n 'deps frisk requires OSV.dev access but api.osv.dev is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n // Default frisk: include transitive deps (CVEs hide in transitive deps)\n const scanOpts: ScanOptions = {\n ...opts,\n includeTransitive: opts.includeTransitive ?? true\n };\n\n const scan = scanRepo(repoRoot, scanOpts);\n\n if (scan.packages.length === 0) {\n return { tier, scanned: 0, vulnerable: 0, packages: [] };\n }\n\n const vulnerable = await checkPackagesForVulns(scan.packages);\n\n return {\n tier,\n scanned: scan.packages.length,\n vulnerable: vulnerable.length,\n packages: vulnerable\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, OutdatedData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getOutdatedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runOutdated(\n config: ResolvedConfig,\n opts: ScanOptions,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<OutdatedData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Fail fast with a clear message if Artifactory is not configured at all\n requireArtifactory(config.artifactory, 'deps outdated');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const { outdated, uncheckedEcosystems } = await getOutdatedPackages(\n directPackages,\n config.artifactory,\n filterType\n );\n\n const summary = { total: outdated.length, major: 0, minor: 0, patch: 0 };\n for (const pkg of outdated) summary[pkg.updateType]++;\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n outdated,\n uncheckedEcosystems,\n summary\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, LicenseCheckData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getLicensedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runLicenseCheck(config: ResolvedConfig, opts: ScanOptions): Promise<LicenseCheckData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n requireArtifactory(config.artifactory, 'deps license-check');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const licensed = await getLicensedPackages(directPackages, config.artifactory);\n\n const byLicense: Record<string, number> = {};\n let unknown = 0;\n\n for (const pkg of licensed) {\n if (!pkg.license) {\n unknown++;\n } else {\n byLicense[pkg.license] = (byLicense[pkg.license] ?? 0) + 1;\n }\n }\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n packages: licensed,\n summary: {\n total: licensed.length,\n byLicense,\n unknown\n }\n };\n}\n","import { Command } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { loadConfig } from '../../lib/config.js';\nimport type { ScanOptions, Ecosystem } from './types.js';\nimport { runScan } from './scan.js';\nimport { runDiff } from './diff.js';\nimport { runFrisk } from './frisk.js';\nimport { runOutdated } from './outdated.js';\nimport { runLicenseCheck } from './license-check.js';\nimport { buildConnectivityData } from './connectivity.js';\n\nexport function registerDepsCommands(program: Command): void {\n const deps = program\n .command('deps')\n .description('Dependency scanning, CVE detection, and license auditing');\n\n // ─── frisk (primary) ────────────────────────────────────────────────────────\n\n deps\n .command('frisk')\n .description('Scan all dependencies for CVEs and output remediation paths (requires OSV.dev)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--direct-only', 'Only scan direct dependencies (default: include transitive)', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; directOnly: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: !opts.directOnly,\n includeDev: opts.includeDev\n };\n const data = await runFrisk(config, scanOpts);\n success(data, 'deps', 'frisk', startTime);\n } catch (err) {\n fail(err, 'deps', 'frisk', startTime);\n }\n });\n\n // ─── scan ───────────────────────────────────────────────────────────────────\n\n deps\n .command('scan')\n .description('Inventory all dependencies from manifest files (local only, no network)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-transitive', 'Include transitive dependencies', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { ecosystem: string; includeTransitive: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: opts.includeTransitive,\n includeDev: opts.includeDev\n };\n const data = runScan(config, scanOpts);\n success(data, 'deps', 'scan', startTime);\n } catch (err) {\n fail(err, 'deps', 'scan', startTime);\n }\n });\n\n // ─── diff ───────────────────────────────────────────────────────────────────\n\n deps\n .command('diff')\n .description('Show dependency changes between two git refs (local only, no network)')\n .requiredOption('--from <ref>', 'Base git ref (commit, tag, or branch)')\n .option('--to <ref>', 'Target git ref (default: working tree)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { from: string; to?: string; ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: true,\n includeDev: opts.includeDev\n };\n const data = runDiff(config, opts.from, opts.to ?? null, scanOpts);\n success(data, 'deps', 'diff', startTime);\n } catch (err) {\n fail(err, 'deps', 'diff', startTime);\n }\n });\n\n // ─── outdated ───────────────────────────────────────────────────────────────\n\n deps\n .command('outdated')\n .description('Check for newer versions available in Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--major', 'Only show major version bumps')\n .option('--minor', 'Only show minor version bumps or higher')\n .option('--patch', 'Only show patch version bumps or higher')\n .action(async (opts: { ecosystem: string; major?: boolean; minor?: boolean; patch?: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = { ecosystem: opts.ecosystem as Ecosystem | 'all' };\n const filterType = opts.major ? 'major' : opts.minor ? 'minor' : opts.patch ? 'patch' : undefined;\n const data = await runOutdated(config, scanOpts, filterType);\n success(data, 'deps', 'outdated', startTime);\n } catch (err) {\n fail(err, 'deps', 'outdated', startTime);\n }\n });\n\n // ─── license-check ──────────────────────────────────────────────────────────\n\n deps\n .command('license-check')\n .description('Report licenses for all direct dependencies via Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeDev: opts.includeDev\n };\n const data = await runLicenseCheck(config, scanOpts);\n success(data, 'deps', 'license-check', startTime);\n } catch (err) {\n fail(err, 'deps', 'license-check', startTime);\n }\n });\n\n // ─── connectivity ───────────────────────────────────────────────────────────\n\n deps\n .command('connectivity')\n .description('Test network access to Artifactory and OSV.dev, report available tier')\n .action(async (_opts: unknown, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const data = await buildConnectivityData(config);\n success(data, 'deps', 'connectivity', startTime);\n } catch (err) {\n fail(err, 'deps', 'connectivity', startTime);\n }\n });\n}\n","import { Command } from 'commander';\nimport { input, password, confirm } from '@inquirer/prompts';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n maskConfig,\n getGlobalConfigPath\n} from '../../lib/config.js';\nimport { success, fail, warn } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport fs from 'fs';\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command('config').description('Manage pncli configuration');\n\n config\n .command('init')\n .description('Interactive setup wizard')\n .option('--repo', 'Write repo config (.pncli.json) instead of global config')\n .action(async (opts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.repo) {\n await initRepoConfig(start);\n } else {\n await initGlobalConfig(start);\n }\n } catch (err) {\n // Handle prompt cancellation (Ctrl+C) gracefully\n if (err instanceof Error && err.message.includes('User force closed')) {\n process.stderr.write('\\nSetup cancelled.\\n');\n process.exit(ExitCode.GENERAL_ERROR);\n }\n fail(err, 'config', 'init', start);\n }\n });\n\n config\n .command('show')\n .description('Print fully resolved config (PATs masked)')\n .action(() => {\n const start = Date.now();\n try {\n const resolved = loadConfig();\n success(maskConfig(resolved), 'config', 'show', start);\n } catch (err) {\n fail(err, 'config', 'show', start);\n }\n });\n\n config\n .command('set')\n .description('Set a config value by dot-notation key (e.g. jira.baseUrl https://...)')\n .argument('<key>', 'Config key in dot notation')\n .argument('<value>', 'Value to set')\n .action((key: string, value: string) => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n setConfigValue(key, value, opts.config);\n success({ key, value }, 'config', 'set', start);\n } catch (err) {\n fail(err, 'config', 'set', start);\n }\n });\n\n config\n .command('test')\n .description('Test connectivity to configured services')\n .action(() => {\n const start = Date.now();\n success(\n { message: 'Service connectivity test available after Phase 2.' },\n 'config',\n 'test',\n start\n );\n });\n}\n\nasync function initGlobalConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init — Global configuration\\n\\n');\n\n process.stderr.write('── Identity ──────────────────────────────────────\\n');\n const userEmail = await input({\n message: 'Your email address (used across Jira, Bitbucket, etc.):',\n default: ''\n });\n\n const userId = await input({\n message: 'Your username / user ID:',\n default: ''\n });\n\n process.stderr.write('\\n── Jira ──────────────────────────────────────────\\n');\n const jiraBaseUrl = await input({\n message: 'Jira base URL (e.g. https://jira.your-company.com):',\n default: ''\n });\n\n const jiraApiToken = await password({\n message: 'Jira personal access token:'\n });\n\n process.stderr.write('\\n── Bitbucket ─────────────────────────────────────\\n');\n const bitbucketBaseUrl = await input({\n message: 'Bitbucket Server base URL (e.g. https://bitbucket.your-company.com):',\n default: ''\n });\n\n const bitbucketPat = await password({\n message: 'Bitbucket personal access token:'\n });\n\n process.stderr.write('\\n── Artifactory ───────────────────────────────────\\n');\n const useArtifactory = await confirm({\n message: 'Configure Artifactory for dependency commands (deps outdated, deps license-check)?',\n default: false\n });\n\n let artifactoryBaseUrl = '';\n let artifactoryToken = '';\n let npmRepo = '';\n let nugetRepo = '';\n let mavenRepo = '';\n\n if (useArtifactory) {\n artifactoryBaseUrl = await input({\n message: 'Artifactory base URL (e.g. https://artifactory.company.com):',\n default: ''\n });\n\n artifactoryToken = await password({\n message: 'Artifactory API token:'\n });\n\n process.stderr.write('\\nConfigure which ecosystems you use (skip any that don\\'t apply):\\n');\n\n const useNpm = await confirm({ message: ' Use npm packages from Artifactory?', default: true });\n if (useNpm) {\n npmRepo = await input({ message: ' npm repository name:', default: 'npm-remote' });\n }\n\n const useNuget = await confirm({ message: ' Use NuGet packages from Artifactory?', default: false });\n if (useNuget) {\n nugetRepo = await input({ message: ' NuGet repository name:', default: 'nuget-remote' });\n }\n\n const useMaven = await confirm({ message: ' Use Maven packages from Artifactory?', default: false });\n if (useMaven) {\n mavenRepo = await input({ message: ' Maven repository name:', default: 'libs-release' });\n }\n }\n\n process.stderr.write('\\n── Defaults ──────────────────────────────────────\\n');\n const jiraProject = await input({\n message: 'Default Jira project key (optional):',\n default: ''\n });\n\n process.stderr.write('\\n');\n const confirmed = await confirm({\n message: 'Write config to ~/.pncli/config.json?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exit(ExitCode.SUCCESS);\n }\n\n writeGlobalConfig({\n user: {\n email: userEmail || undefined,\n userId: userId || undefined\n },\n jira: {\n baseUrl: jiraBaseUrl || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: bitbucketBaseUrl || undefined,\n pat: bitbucketPat || undefined\n },\n ...(useArtifactory ? {\n artifactory: {\n baseUrl: artifactoryBaseUrl || undefined,\n token: artifactoryToken || undefined,\n npmRepo: npmRepo || undefined,\n nugetRepo: nugetRepo || undefined,\n mavenRepo: mavenRepo || undefined\n }\n } : {}),\n defaults: {\n jira: {\n project: jiraProject || undefined\n }\n }\n });\n\n const configPath = getGlobalConfigPath();\n warn(`Config written to ${configPath}`);\n success({ written: configPath }, 'config', 'init', start);\n}\n\nasync function initRepoConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init --repo — Repo configuration\\n\\n');\n\n const jiraProject = await input({\n message: 'Jira project key (e.g. ACME):',\n default: ''\n });\n\n const jiraIssueType = await input({\n message: 'Default issue type:',\n default: 'Story'\n });\n\n const jiraPriority = await input({\n message: 'Default priority:',\n default: 'Medium'\n });\n\n const targetBranch = await input({\n message: 'Default target branch for PRs:',\n default: 'main'\n });\n\n const confirmed = await confirm({\n message: 'Write config to .pncli.json in repo root?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exit(ExitCode.SUCCESS);\n }\n\n // Warn if .pncli.json already exists\n if (fs.existsSync('.pncli.json')) {\n const overwrite = await confirm({\n message: '.pncli.json already exists. Overwrite?',\n default: false\n });\n if (!overwrite) {\n process.stderr.write('Aborted.\\n');\n process.exit(ExitCode.SUCCESS);\n }\n }\n\n writeRepoConfig({\n defaults: {\n jira: {\n project: jiraProject || undefined,\n issueType: jiraIssueType || undefined,\n priority: jiraPriority || undefined\n },\n bitbucket: {\n targetBranch: targetBranch || undefined\n }\n }\n });\n\n success({ written: '.pncli.json' }, 'config', 'init', start);\n}\n"],"mappings":"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","names":["execSync","execSync","getRepoRoot","path","getRepoRoot","program","API","program","getClient","program","program","program","fs","path","execSync","execFileSync","path","pkg","path","path","execSync","fs","path","execFileSync","pkg","getRepoRoot","getRepoRoot","pkg","fetchWithTimeout","pkg","TIMEOUT_MS","fetchWithTimeout","pkg","getRepoRoot","getRepoRoot","pkg","getRepoRoot","pkg","program","fs","program","require"]}
|