@kolatts/pncli 1.10.1 → 1.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/copilot-instructions.md +34 -1
- package/dist/{chunk-O3LWAWSN.js → chunk-AWSXVWRN.js} +2 -1
- package/dist/{chunk-O3LWAWSN.js.map → chunk-AWSXVWRN.js.map} +1 -1
- package/dist/{chunk-3XHTRFRX.js → chunk-VPUWMP2M.js} +3 -2
- package/dist/chunk-VPUWMP2M.js.map +1 -0
- package/dist/cli.js +379 -8
- package/dist/cli.js.map +1 -1
- package/dist/{config-NCI2BTQG.js → config-OFLPO5DN.js} +4 -2
- package/dist/{http-L2P23H2D.js → http-LNDRNPP7.js} +2 -2
- package/package.json +5 -2
- package/skills/pncli/SKILL.md +92 -0
- package/skills/pncli/ado.md +33 -0
- package/skills/pncli/artifactory.md +35 -0
- package/skills/pncli/bitbucket.md +30 -0
- package/skills/pncli/checkmarx.md +31 -0
- package/skills/pncli/confluence.md +24 -0
- package/skills/pncli/contrast.md +39 -0
- package/skills/pncli/jenkins.md +29 -0
- package/skills/pncli/jira.md +35 -0
- package/skills/pncli/marketplace.md +41 -0
- package/skills/pncli/sde.md +29 -0
- package/skills/pncli/servicenow.md +33 -0
- package/skills/pncli/sonarqube.md +30 -0
- package/skills/pncli/sonatypeiq.md +39 -0
- package/skills/pncli/udeploy.md +48 -0
- package/dist/chunk-3XHTRFRX.js.map +0 -1
- package/skills/address-pr-feedback/SKILL.md +0 -87
- package/skills/code-review/SKILL.md +0 -82
- package/skills/local-setup/SKILL.md +0 -225
- package/skills/plan/SKILL.md +0 -120
- package/skills/security-review/SKILL.md +0 -108
- package/skills/ship/SKILL.md +0 -170
- /package/dist/{config-NCI2BTQG.js.map → config-OFLPO5DN.js.map} +0 -0
- /package/dist/{http-L2P23H2D.js.map → http-LNDRNPP7.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/services/git/client.ts","../src/lib/git-context.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/client.ts","../src/services/confluence/commands.ts","../src/services/sonar/client.ts","../src/services/sonar/commands.ts","../src/services/sde/client.ts","../src/services/sde/commands.ts","../src/services/deps/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/sonatype.ts","../src/services/deps/clients/sonatypeiq.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/config/commands.ts","../src/services/ado/client/work.ts","../src/services/ado/discovery.ts","../src/services/ado/client/git.ts","../src/services/ado/client/build.ts","../src/services/ado/helpers.ts","../src/services/ado/commands/project.ts","../src/services/ado/commands/work.ts","../src/services/ado/commands/repo.ts","../src/services/ado/commands/pipeline.ts","../src/services/ado/commands/index.ts","../src/services/jenkins/client.ts","../src/services/jenkins/commands.ts","../src/services/artifactory/client.ts","../src/services/artifactory/commands.ts","../src/services/udeploy/client.ts","../src/services/udeploy/commands.ts","../src/services/checkmarx/client.ts","../src/services/checkmarx/commands.ts","../src/services/servicenow/commands.ts","../src/services/contrast/commands.ts","../src/services/sonatypeiq/commands.ts","../src/services/skills/commands.ts"],"sourcesContent":["// TLS verification is disabled by default — most enterprise Data Center installs\n// sit behind corporate SSL inspection proxies that break standard certificate chains.\n// To opt back in: set PNCLI_VERIFY_TLS=1\nif (!process.env.PNCLI_VERIFY_TLS) {\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';\n}\n\nimport { 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 { registerSdeCommands } from './services/sde/commands.js';\nimport { registerDepsCommands } from './services/deps/commands.js';\nimport { registerConfigCommands } from './services/config/commands.js';\nimport { registerAdoCommands } from './services/ado/commands/index.js';\nimport { registerJenkinsCommands } from './services/jenkins/commands.js';\nimport { registerArtifactoryCommands } from './services/artifactory/commands.js';\nimport { registerUdeployCommands } from './services/udeploy/commands.js';\nimport { registerCheckmarxCommands } from './services/checkmarx/commands.js';\nimport { registerServiceNowCommands } from './services/servicenow/commands.js';\nimport { registerContrastCommands } from './services/contrast/commands.js';\nimport { registerSonatypeIqCommands } from './services/sonatypeiq/commands.js';\nimport { registerSkillsCommands } from './services/skills/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 .option('--output-file <path>', 'Write JSON output to file instead of stdout');\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 outputFile: opts.outputFile as string | undefined\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);\nregisterSdeCommands(program);\nregisterDepsCommands(program);\nregisterConfigCommands(program);\nregisterAdoCommands(program);\nregisterJenkinsCommands(program);\nregisterArtifactoryCommands(program);\nregisterUdeployCommands(program);\nregisterCheckmarxCommands(program);\nregisterServiceNowCommands(program);\nregisterContrastCommands(program);\nregisterSonatypeIqCommands(program);\nregisterSkillsCommands(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\n bitbucket Bitbucket Server\n confluence Confluence\n sonar SonarQube Server (quality gates, issues, metrics, hotspots)\n sde SDElements (threat modeling, countermeasures, compliance)\n ado Azure DevOps Server (work items, repos, PRs, pipelines)\n jenkins Jenkins Data Center (jobs, builds, logs)\n artifactory Artifactory (repos, artifact search, build info, properties)\n udeploy IBM UrbanCode Deploy (component versions, deployment processes)\n checkmarx Checkmarx CxSAST (projects, scans, scan statistics)\n servicenow ServiceNow (change requests)\n contrast Contrast IAST (applications, vulnerability findings)\n sonatypeiq Sonatype IQ Server (applications, organizations, policies)\n config Manage pncli configuration\n skills Download and manage Claude Code skills\n`);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (process.exitCode !== undefined) return; // already handled by fail() or dry-run\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = ExitCode.GENERAL_ERROR;\n});\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 // Bitbucket-resolved fields\n project: string | null;\n repo: string | null;\n // Azure DevOps Server-resolved fields\n ado: { collection: string; project: string; 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\n/**\n * Parses an Azure DevOps Server git remote URL into { collection, project, repo }.\n *\n * Supported formats:\n * HTTPS : https://<host>[/<prefix>]/<collection>/<project>/_git/<repo>\n * SSH : ssh://git@<host>[:<port>][/<prefix>]/<collection>/<project>/_ssh/<repo>\n * git@<host>[:<port>]/<prefix>/<collection>/<project>/<repo>\n *\n * Strategy: find the `_git` or `_ssh` segment; walk back — the segment immediately\n * before it is the project, the one before that is the collection. Anything before\n * the collection is treated as a path prefix (e.g. /tfs/) and is ignored.\n * URL is only parsed if the host is contained in adoBaseUrl (same guard as Bitbucket).\n */\nexport function parseAdoRemote(\n remoteUrl: string,\n adoBaseUrl: string | undefined\n): { collection: string; project: string; repo: string } | null {\n if (!adoBaseUrl) return null;\n\n // Normalize base URL: extract just the hostname (without port) for comparison,\n // so that https://tfs.company.com:8080 and git@tfs.company.com:... both match.\n let baseHostname: string;\n try {\n const normalizedBase = /^https?:\\/\\//.test(adoBaseUrl) ? adoBaseUrl : `https://${adoBaseUrl}`;\n baseHostname = new URL(normalizedBase).hostname.toLowerCase();\n } catch {\n baseHostname = adoBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '').split(/[:/]/)[0]!.toLowerCase();\n }\n\n // Extract host from the remote URL (after stripping protocol/credentials)\n let path = remoteUrl;\n let remoteHostname = '';\n\n // ssh:// form\n const sshProtoMatch = path.match(/^ssh:\\/\\/[^@]*@?([^/:]+)(?::\\d+)?(.*)/);\n if (sshProtoMatch) {\n remoteHostname = sshProtoMatch[1]!.toLowerCase();\n path = sshProtoMatch[2]!;\n } else {\n // git@host form or https://\n const gitAtMatch = path.match(/^git@([^:]+)(?::\\d+)?:(.*)/);\n if (gitAtMatch) {\n remoteHostname = gitAtMatch[1]!.toLowerCase();\n path = '/' + gitAtMatch[2]!;\n } else {\n const httpsMatch = path.match(/^https?:\\/\\/([^/:]+)(?::\\d+)?(.*)/);\n if (httpsMatch) {\n remoteHostname = httpsMatch[1]!.toLowerCase();\n path = httpsMatch[2]!;\n }\n }\n }\n\n if (!remoteHostname || remoteHostname !== baseHostname) return null;\n\n // Strip trailing .git\n path = path.replace(/\\.git$/, '');\n\n // Find _git or _ssh segment\n const gitIdx = path.indexOf('/_git/');\n const sshIdx = path.indexOf('/_ssh/');\n const markerIdx = gitIdx !== -1 ? gitIdx : sshIdx;\n if (markerIdx === -1) return null;\n\n const repo = path.slice(markerIdx + 6); // skip /_git/ or /_ssh/\n if (!repo) return null;\n\n // Everything before the marker: /<prefix>/<collection>/<project>\n const before = path.slice(1, markerIdx); // strip leading /\n const parts = before.split('/').filter(Boolean);\n if (parts.length < 2) return null;\n\n const project = parts[parts.length - 1]!;\n const collection = parts[parts.length - 2]!;\n\n return { collection, project, repo };\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 // Bitbucket: disambiguated by /scm/ pattern\n let project: string | null = null;\n let repo: string | null = null;\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 // Azure DevOps Server: disambiguated by /_git/ pattern\n let adoContext: GitContext['ado'] = null;\n for (const url of remoteUrls) {\n const parsed = parseAdoRemote(url, config.ado.baseUrl);\n if (parsed) {\n adoContext = parsed;\n break;\n }\n }\n\n return { root, branch, project, repo, ado: adoContext };\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(\n project: string,\n repo: string,\n prId: number,\n opts: { withReplies?: boolean; inlineOnly?: boolean; generalOnly?: boolean } = {}\n ): Promise<BitbucketComment[]> {\n const { withReplies = true, inlineOnly = false, generalOnly = false } = opts;\n\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\n const topLevel = activities\n .filter(a => a.action === 'COMMENTED' && a.comment)\n .map(a => a.comment!);\n\n if (!withReplies) {\n return topLevel\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor);\n }\n\n // Recursively flatten nested replies, tagging each with its parentId\n function flatten(comment: BitbucketComment, parentId?: number): BitbucketComment[] {\n const node: BitbucketComment = {\n ...comment,\n comments: undefined,\n ...(parentId !== undefined ? { parentId } : {})\n };\n const replies = (comment.comments ?? []).flatMap(c => flatten(c, comment.id));\n return [node, ...replies];\n }\n\n const flat = topLevel.flatMap(c => flatten(c));\n return flat\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor)\n .sort((a, b) => a.createdDate - b.createdDate);\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, warn } 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('--parent <key>', 'Parent issue key — creates an \"is child of\" link after creation')\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; parent?: 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 if (opts.parent) {\n try {\n await client.linkIssue({ key: data.key, linkType: 'is child of', target: opts.parent });\n } catch (linkErr) {\n warn(`Created ${data.key} but failed to link to parent ${opts.parent}: ${linkErr instanceof Error ? linkErr.message : linkErr}`);\n }\n }\n return;\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 (consider --output-file for large results)')\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) (consider --output-file for large results)')\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(bb);\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(bb);\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(bb);\n const config = loadConfig({ configPath: bb.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(bb);\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(bb);\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(bb);\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 (includes threaded replies by default)')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--no-with-replies', 'Exclude replies; return top-level comments only')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general (non-inline) PR comments')\n .action(async (opts: { pr: string; withReplies: boolean; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listComments(project, repo, parseInt(opts.pr, 10), {\n withReplies: opts.withReplies,\n inlineOnly: opts.inlineOnly,\n generalOnly: opts.generalOnly\n });\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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 type { HttpClient } from '../../lib/http.js';\nimport type {\n ConfluencePage,\n ConfluenceSpace,\n ConfluenceComment,\n ConfluenceLabel,\n ConfluenceAttachment,\n ConfluencePageResponse,\n ConfluenceSearchResult\n} from '../../types/confluence.js';\n\nconst API = '/rest/api';\n\nexport interface CreatePageOpts {\n spaceKey: string;\n title: string;\n body: string;\n parentId?: string;\n representation?: string;\n}\n\nexport interface UpdatePageOpts {\n version: number;\n title: string;\n body?: string;\n status?: string;\n representation?: string;\n}\n\nexport interface ListPagesOpts {\n limit?: number;\n start?: number;\n}\n\nexport interface SearchOpts {\n limit?: number;\n start?: number;\n expand?: string;\n}\n\nexport interface ListSpacesOpts {\n type?: string;\n limit?: number;\n start?: number;\n}\n\nexport class ConfluenceClient {\n constructor(private http: HttpClient) {}\n\n async getPage(id: string, expand = 'body.storage,version,space,ancestors'): Promise<ConfluencePage> {\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n params: { expand }\n });\n }\n\n async getPageByTitle(spaceKey: string, title: string): Promise<ConfluencePage | null> {\n const result = await this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, title, expand: 'body.storage,version,space', type: 'page' }\n });\n return result.results[0] ?? null;\n }\n\n async listPages(spaceKey: string, opts: ListPagesOpts = {}): Promise<ConfluencePage[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, type: 'page', expand: 'version', start: initialStart + start, limit: opts.limit ?? limit }\n });\n });\n }\n\n async getPageChildren(id: string): Promise<ConfluencePage[]> {\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content/${id}/child/page`, {\n params: { expand: 'version', start, limit }\n });\n });\n }\n\n async getLabels(id: string): Promise<ConfluenceLabel[]> {\n return this.http.confluencePaginate<ConfluenceLabel>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${id}/label`, {\n params: { start, limit }\n });\n });\n }\n\n async search(cql: string, opts: SearchOpts = {}): Promise<ConfluenceSearchResult> {\n return this.http.confluence<ConfluenceSearchResult>(`${API}/content/search`, {\n params: {\n cql,\n start: opts.start ?? 0,\n limit: opts.limit ?? 25,\n ...(opts.expand ? { expand: opts.expand } : {})\n }\n });\n }\n\n async createPage(opts: CreatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n type: 'page',\n title: opts.title,\n space: { key: opts.spaceKey },\n ancestors: opts.parentId ? [{ id: opts.parentId }] : [],\n body: {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n }\n };\n return this.http.confluence<ConfluencePage>(`${API}/content`, {\n method: 'POST',\n body\n });\n }\n\n async updatePage(id: string, opts: UpdatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n version: { number: opts.version },\n type: 'page',\n title: opts.title,\n status: opts.status ?? 'current'\n };\n if (opts.body !== undefined) {\n body.body = {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n };\n }\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n method: 'PUT',\n body\n });\n }\n\n async deletePage(id: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${id}`, { method: 'DELETE' });\n }\n\n async listComments(pageId: string): Promise<ConfluenceComment[]> {\n return this.http.confluencePaginate<ConfluenceComment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceComment>>(`${API}/content/${pageId}/child/comment`, {\n params: { expand: 'body.storage,version', start, limit }\n });\n });\n }\n\n async addComment(pageId: string, body: string, representation = 'storage'): Promise<ConfluenceComment> {\n return this.http.confluence<ConfluenceComment>(`${API}/content`, {\n method: 'POST',\n body: {\n type: 'comment',\n container: { id: pageId, type: 'page' },\n body: {\n storage: { value: body, representation }\n }\n }\n });\n }\n\n async addLabel(pageId: string, labels: string[]): Promise<ConfluenceLabel[]> {\n const body = labels.map(name => ({ prefix: 'global', name }));\n const result = await this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${pageId}/label`, {\n method: 'POST',\n body\n });\n return result.results;\n }\n\n async removeLabel(pageId: string, label: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${pageId}/label/${label}`, { method: 'DELETE' });\n }\n\n async listSpaces(opts: ListSpacesOpts = {}): Promise<ConfluenceSpace[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluenceSpace>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceSpace>>(`${API}/space`, {\n params: {\n start: initialStart + start,\n limit: opts.limit ?? limit,\n ...(opts.type ? { type: opts.type } : {})\n }\n });\n });\n }\n\n async getSpace(key: string): Promise<ConfluenceSpace> {\n return this.http.confluence<ConfluenceSpace>(`${API}/space/${key}`, {\n params: { expand: 'description.plain' }\n });\n }\n\n async listAttachments(pageId: string): Promise<ConfluenceAttachment[]> {\n return this.http.confluencePaginate<ConfluenceAttachment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceAttachment>>(`${API}/content/${pageId}/child/attachment`, {\n params: { start, limit }\n });\n });\n }\n}\n","import { Command } from 'commander';\nimport { ConfluenceClient } from './client.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';\n\nfunction getClient(program: Command): ConfluenceClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.confluence.baseUrl) throw new PncliError('Confluence not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ConfluenceClient(http);\n}\n\nexport function registerConfluenceCommands(program: Command): void {\n const confluence = program.command('confluence').description('Confluence operations');\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n confluence.command('get-page')\n .description('Get a Confluence page by ID')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--expand <fields>', 'Comma-separated fields to expand', 'body.storage,version,space,ancestors')\n .action(async (opts: { id: string; expand: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPage(opts.id, opts.expand);\n success(data, 'confluence', 'get-page', start);\n } catch (err) { fail(err, 'confluence', 'get-page', start); }\n });\n\n confluence.command('get-page-by-title')\n .description('Find a Confluence page by space key and title')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .action(async (opts: { space: string; title: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageByTitle(opts.space, opts.title);\n if (!data) throw new PncliError(`Page not found: \"${opts.title}\" in space ${opts.space}`, 1);\n success(data, 'confluence', 'get-page-by-title', start);\n } catch (err) { fail(err, 'confluence', 'get-page-by-title', start); }\n });\n\n confluence.command('list-pages')\n .description('List pages in a Confluence space (consider --output-file for large results)')\n .requiredOption('--space <key>', 'Space key')\n .option('--limit <n>', 'Max results per page (default: all)')\n .option('--start <n>', 'Offset for first result')\n .action(async (opts: { space: string; limit?: string; start?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listPages(opts.space, {\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n start: opts.start ? parseInt(opts.start, 10) : undefined\n });\n success(data, 'confluence', 'list-pages', start);\n } catch (err) { fail(err, 'confluence', 'list-pages', start); }\n });\n\n confluence.command('get-page-children')\n .description('Get child pages of a Confluence page')\n .requiredOption('--id <page-id>', 'Parent page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageChildren(opts.id);\n success(data, 'confluence', 'get-page-children', start);\n } catch (err) { fail(err, 'confluence', 'get-page-children', start); }\n });\n\n confluence.command('get-labels')\n .description('Get labels on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getLabels(opts.id);\n success(data, 'confluence', 'get-labels', start);\n } catch (err) { fail(err, 'confluence', 'get-labels', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────────────\n\n confluence.command('search')\n .description('Search Confluence with CQL')\n .requiredOption('--cql <query>', 'CQL query string (e.g. \"space=PROJ AND type=page\")')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--start <n>', 'Offset for first result', '0')\n .option('--expand <fields>', 'Comma-separated fields to expand')\n .action(async (opts: { cql: string; limit: string; start: string; expand?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.search(opts.cql, {\n limit: parseInt(opts.limit, 10),\n start: parseInt(opts.start, 10),\n expand: opts.expand\n });\n success(data, 'confluence', 'search', start);\n } catch (err) { fail(err, 'confluence', 'search', start); }\n });\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n confluence.command('create-page')\n .description('Create a new Confluence page')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .requiredOption('--body <html>', 'Page body (storage format HTML)')\n .option('--parent-id <id>', 'Parent page ID (to nest under a page)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { space: string; title: string; body: string; parentId?: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.createPage({\n spaceKey: opts.space,\n title: opts.title,\n body: opts.body,\n parentId: opts.parentId,\n representation: opts.representation\n });\n success(data, 'confluence', 'create-page', start);\n } catch (err) { fail(err, 'confluence', 'create-page', start); }\n });\n\n confluence.command('update-page')\n .description('Update a Confluence page (fetches current version automatically)')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--title <title>', 'New page title')\n .option('--body <html>', 'New page body (storage format HTML)')\n .option('--status <status>', 'Page status: current (default) or draft', 'current')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; title?: string; body?: string; status: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const current = await client.getPage(opts.id, 'version');\n const nextVersion = current.version.number + 1;\n const data = await client.updatePage(opts.id, {\n version: nextVersion,\n title: opts.title ?? current.title,\n body: opts.body,\n status: opts.status,\n representation: opts.representation\n });\n success(data, 'confluence', 'update-page', start);\n } catch (err) { fail(err, 'confluence', 'update-page', start); }\n });\n\n confluence.command('delete-page')\n .description('Delete a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.deletePage(opts.id);\n success({ deleted: opts.id }, 'confluence', 'delete-page', start);\n } catch (err) { fail(err, 'confluence', 'delete-page', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────────────\n\n confluence.command('list-comments')\n .description('List comments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.id);\n success(data, 'confluence', 'list-comments', start);\n } catch (err) { fail(err, 'confluence', 'list-comments', start); }\n });\n\n confluence.command('add-comment')\n .description('Add a comment to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--body <text>', 'Comment body (storage format HTML)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; body: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.id, opts.body, opts.representation);\n success(data, 'confluence', 'add-comment', start);\n } catch (err) { fail(err, 'confluence', 'add-comment', start); }\n });\n\n // ── Labels ────────────────────────────────────────────────────────────────\n\n confluence.command('add-label')\n .description('Add labels to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--labels <names>', 'Comma-separated label names')\n .action(async (opts: { id: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n const data = await client.addLabel(opts.id, labels);\n success(data, 'confluence', 'add-label', start);\n } catch (err) { fail(err, 'confluence', 'add-label', start); }\n });\n\n confluence.command('remove-label')\n .description('Remove a label from a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--label <name>', 'Label name to remove')\n .action(async (opts: { id: string; label: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.removeLabel(opts.id, opts.label);\n success({ removed: opts.label, from: opts.id }, 'confluence', 'remove-label', start);\n } catch (err) { fail(err, 'confluence', 'remove-label', start); }\n });\n\n // ── Spaces ────────────────────────────────────────────────────────────────\n\n confluence.command('list-spaces')\n .description('List Confluence spaces')\n .option('--type <type>', 'Space type: global or personal')\n .option('--limit <n>', 'Max results (default: all)')\n .action(async (opts: { type?: string; limit?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listSpaces({\n type: opts.type,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined\n });\n success(data, 'confluence', 'list-spaces', start);\n } catch (err) { fail(err, 'confluence', 'list-spaces', start); }\n });\n\n confluence.command('get-space')\n .description('Get a Confluence space by key')\n .requiredOption('--key <space-key>', 'Space key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getSpace(opts.key);\n success(data, 'confluence', 'get-space', start);\n } catch (err) { fail(err, 'confluence', 'get-space', start); }\n });\n\n // ── Attachments ───────────────────────────────────────────────────────────\n\n confluence.command('list-attachments')\n .description('List attachments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listAttachments(opts.id);\n success(data, 'confluence', 'list-attachments', start);\n } catch (err) { fail(err, 'confluence', 'list-attachments', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SonarSystemStatus,\n SonarQualityGateStatus,\n SonarIssuesResponse,\n SonarIssue,\n SonarMeasuresComponent,\n SonarProjectsResponse,\n SonarProject,\n SonarHotspotsResponse,\n SonarHotspot\n} from '../../types/sonar.js';\n\nconst API = '/api';\n\nexport interface SearchIssuesOpts {\n projectKey: string;\n severities?: string;\n types?: string;\n statuses?: string;\n branch?: string;\n resolved?: boolean;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchHotspotsOpts {\n projectKey: string;\n status?: string;\n resolution?: string;\n branch?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchProjectsOpts {\n query?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface GetMeasuresOpts {\n projectKey: string;\n metricKeys: string;\n branch?: string;\n}\n\nexport class SonarClient {\n constructor(private http: HttpClient) {}\n\n async getStatus(): Promise<SonarSystemStatus> {\n return this.http.sonar<SonarSystemStatus>(`${API}/system/status`);\n }\n\n async getQualityGate(projectKey: string, branch?: string): Promise<SonarQualityGateStatus> {\n return this.http.sonar<SonarQualityGateStatus>(`${API}/qualitygates/project_status`, {\n params: { projectKey, ...(branch ? { branch } : {}) }\n });\n }\n\n async searchIssues(opts: SearchIssuesOpts): Promise<SonarIssuesResponse> {\n return this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllIssues(opts: SearchIssuesOpts): Promise<SonarIssue[]> {\n return this.http.sonarPaginate<SonarIssue>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.total, p: resp.p, ps: resp.ps, items: resp.issues };\n });\n }\n\n async getMeasures(opts: GetMeasuresOpts): Promise<SonarMeasuresComponent> {\n return this.http.sonar<SonarMeasuresComponent>(`${API}/measures/component`, {\n params: {\n component: opts.projectKey,\n metricKeys: opts.metricKeys,\n ...(opts.branch ? { branch: opts.branch } : {})\n }\n });\n }\n\n async searchProjects(opts: SearchProjectsOpts = {}): Promise<SonarProjectsResponse> {\n return this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: {\n q: opts.query,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllProjects(query?: string): Promise<SonarProject[]> {\n return this.http.sonarPaginate<SonarProject>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: { q: query, p: page, ps: pageSize }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.components };\n });\n }\n\n async searchHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspotsResponse> {\n return this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspot[]> {\n return this.http.sonarPaginate<SonarHotspot>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.hotspots };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SonarClient } from './client.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';\n\nconst DEFAULT_METRICS = 'coverage,duplicated_lines_density,bugs,vulnerabilities,code_smells,sqale_rating,reliability_rating,security_rating,ncloc';\n\nfunction getClient(program: Command): { client: SonarClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sonar.baseUrl) throw new PncliError('SonarQube not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SonarClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): string {\n const project = cliProject ?? config.defaults.sonar.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sonar.project in config.');\n return project;\n}\n\nexport function registerSonarCommands(program: Command): void {\n const sonar = program.command('sonar').description('SonarQube Server operations');\n\n // ── Quality Gate ─────────────────────────────────────────────────────────\n\n sonar.command('quality-gate')\n .description('Get quality gate status for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getQualityGate(projectKey, opts.branch);\n success(data, 'sonar', 'quality-gate', start);\n } catch (err) { fail(err, 'sonar', 'quality-gate', start); }\n });\n\n // ── Issues ────────────────────────────────────────────────────────────────\n\n sonar.command('issues')\n .description('Search/list issues for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--severities <list>', 'Filter by severity: BLOCKER,CRITICAL,MAJOR,MINOR,INFO (comma-separated)')\n .option('--types <list>', 'Filter by type: BUG,VULNERABILITY,CODE_SMELL (comma-separated)')\n .option('--statuses <list>', 'Filter by status: OPEN,CONFIRMED,REOPENED,RESOLVED,CLOSED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--resolved <bool>', 'Filter resolved issues: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page (max 500)', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results; ignores --page/--page-size)')\n .action(async (opts: { project?: string; severities?: string; types?: string; statuses?: string; branch?: string; resolved?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? opts.resolved === 'true' : undefined\n };\n if (opts.all) {\n const data = await client.searchAllIssues(baseOpts);\n success(data, 'sonar', 'issues', start);\n } else {\n const data = await client.searchIssues({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'issues', start);\n }\n } catch (err) { fail(err, 'sonar', 'issues', start); }\n });\n\n // ── Measures ──────────────────────────────────────────────────────────────\n\n sonar.command('measures')\n .description('Get key metrics for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--metrics <list>', 'Comma-separated metric keys', DEFAULT_METRICS)\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; metrics: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getMeasures({\n projectKey,\n metricKeys: opts.metrics,\n branch: opts.branch\n });\n success(data, 'sonar', 'measures', start);\n } catch (err) { fail(err, 'sonar', 'measures', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sonar.command('projects')\n .description('Search/list projects')\n .option('--query <text>', 'Search query')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { query?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n if (opts.all) {\n const data = await client.searchAllProjects(opts.query);\n success(data, 'sonar', 'projects', start);\n } else {\n const data = await client.searchProjects({\n query: opts.query,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'projects', start);\n }\n } catch (err) { fail(err, 'sonar', 'projects', start); }\n });\n\n // ── Hotspots ──────────────────────────────────────────────────────────────\n\n sonar.command('hotspots')\n .description('List security hotspots for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--status <status>', 'Filter: TO_REVIEW or REVIEWED')\n .option('--resolution <list>', 'Filter: FIXED,SAFE,ACKNOWLEDGED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; status?: string; resolution?: string; branch?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch\n };\n if (opts.all) {\n const data = await client.searchAllHotspots(baseOpts);\n success(data, 'sonar', 'hotspots', start);\n } else {\n const data = await client.searchHotspots({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'hotspots', start);\n }\n } catch (err) { fail(err, 'sonar', 'hotspots', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SdeServerInfo,\n SdeUser,\n SdeProject,\n SdeTask,\n SdeThreat,\n SdePaginatedResponse\n} from '../../types/sde.js';\n\nconst API = '/api/v2';\n\nexport interface ListProjectsOpts {\n name?: string;\n slug?: string;\n search?: string;\n active?: string;\n ordering?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListTasksOpts {\n projectId: number;\n phase?: string;\n priority?: string;\n status?: string;\n assignedTo?: string;\n source?: string;\n verification?: string;\n tag?: string;\n accepted?: string;\n relevant?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListThreatsOpts {\n projectId: number;\n severity?: string;\n title?: string;\n threatId?: string;\n capecId?: string;\n componentId?: string;\n search?: string;\n ordering?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListUsersOpts {\n email?: string;\n firstName?: string;\n lastName?: string;\n isActive?: string;\n page?: number;\n pageSize?: number;\n}\n\nfunction projectParams(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n name: opts.name,\n slug: opts.slug,\n search: opts.search,\n active: opts.active,\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction taskParams(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assigned_to: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction threatParams(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n severity: opts.severity,\n title: opts.title,\n threat_id: opts.threatId,\n capec_id: opts.capecId,\n component_id: opts.componentId,\n search: opts.search,\n ordering: opts.ordering,\n page,\n page_size: pageSize\n };\n}\n\nfunction userParams(opts: Omit<ListUsersOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n email: opts.email,\n first_name: opts.firstName,\n last_name: opts.lastName,\n is_active: opts.isActive,\n page,\n page_size: pageSize\n };\n}\n\nexport class SdeClient {\n constructor(private http: HttpClient) {}\n\n async getServerInfo(): Promise<SdeServerInfo> {\n return this.http.sde<SdeServerInfo>(`${API}/server-info/`);\n }\n\n async getMe(): Promise<SdeUser> {\n return this.http.sde<SdeUser>(`${API}/users/me/`);\n }\n\n async getProject(projectId: number, expand?: string, include?: string): Promise<SdeProject> {\n return this.http.sde<SdeProject>(`${API}/projects/${projectId}/`, {\n params: { expand, include }\n });\n }\n\n async getTask(projectId: number, taskId: string, expand?: string, include?: string): Promise<SdeTask> {\n return this.http.sde<SdeTask>(`${API}/projects/${projectId}/tasks/${taskId}/`, {\n params: { expand, include }\n });\n }\n\n async listProjects(opts: ListProjectsOpts = {}): Promise<SdePaginatedResponse<SdeProject>> {\n return this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllProjects(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'> = {}): Promise<SdeProject[]> {\n return this.http.sdePaginate<SdeProject>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listTasks(opts: ListTasksOpts): Promise<SdePaginatedResponse<SdeTask>> {\n return this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllTasks(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>): Promise<SdeTask[]> {\n return this.http.sdePaginate<SdeTask>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listThreats(opts: ListThreatsOpts): Promise<SdePaginatedResponse<SdeThreat>> {\n return this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllThreats(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>): Promise<SdeThreat[]> {\n return this.http.sdePaginate<SdeThreat>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listUsers(opts: ListUsersOpts = {}): Promise<SdePaginatedResponse<SdeUser>> {\n return this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllUsers(opts: Omit<ListUsersOpts, 'page' | 'pageSize'> = {}): Promise<SdeUser[]> {\n return this.http.sdePaginate<SdeUser>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SdeClient } from './client.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';\n\nfunction getClient(program: Command): { client: SdeClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sde.baseUrl) throw new PncliError('SDElements not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SdeClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): number {\n const project = cliProject ?? config.defaults.sde.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sde.project in config.');\n if (!/^\\d+$/.test(project)) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n const id = parseInt(project, 10);\n if (id <= 0) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n return id;\n}\n\nfunction parsePage(val: string, flag: string): number {\n const n = parseInt(val, 10);\n if (isNaN(n) || n < 1) throw new PncliError(`Invalid ${flag}: \"${val}\". Must be a positive integer.`);\n return n;\n}\n\nfunction validateActive(val: string | undefined, allowed: string[]): string | undefined {\n if (val === undefined) return undefined;\n if (!allowed.includes(val)) {\n throw new PncliError(`Invalid --active value: \"${val}\". Allowed: ${allowed.join(', ')}.`);\n }\n return val;\n}\n\nexport function registerSdeCommands(program: Command): void {\n const sde = program.command('sde').description('SDElements operations (threat modeling, countermeasures, compliance)');\n\n // ── Server Info ───────────────────────────────────────────────────────────\n\n sde.command('server-info')\n .description('Get server version and platform info (requires super-user)')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getServerInfo();\n success(data, 'sde', 'server-info', start);\n } catch (err) { fail(err, 'sde', 'server-info', start); }\n });\n\n // ── Whoami ────────────────────────────────────────────────────────────────\n\n sde.command('whoami')\n .description('Get current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getMe();\n success(data, 'sde', 'whoami', start);\n } catch (err) { fail(err, 'sde', 'whoami', start); }\n });\n\n // ── Users ─────────────────────────────────────────────────────────────────\n\n sde.command('users')\n .description('List users')\n .option('--email <email>', 'Filter by email address')\n .option('--first-name <name>', 'Filter by first name')\n .option('--last-name <name>', 'Filter by last name')\n .option('--active <bool>', 'Filter by active status: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { email?: string; firstName?: string; lastName?: string; active?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n email: opts.email,\n firstName: opts.firstName,\n lastName: opts.lastName,\n isActive: validateActive(opts.active, ['true', 'false'])\n };\n if (opts.all) {\n const data = await client.listAllUsers(baseOpts);\n success(data, 'sde', 'users', start);\n } else {\n const data = await client.listUsers({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'users', start);\n }\n } catch (err) { fail(err, 'sde', 'users', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sde.command('projects')\n .description('List projects')\n .option('--name <name>', 'Filter by project name')\n .option('--search <text>', 'Text search on name and profile')\n .option('--active <val>', 'Filter by active status: true, false, or all')\n .option('--ordering <field>', 'Sort by: name, created, updated (prefix with - for descending)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { name?: string; search?: string; active?: string; ordering?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n name: opts.name,\n search: opts.search,\n active: validateActive(opts.active, ['true', 'false', 'all']),\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllProjects(baseOpts);\n success(data, 'sde', 'projects', start);\n } else {\n const data = await client.listProjects({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'projects', start);\n }\n } catch (err) { fail(err, 'sde', 'projects', start); }\n });\n\n // ── Project ───────────────────────────────────────────────────────────────\n\n sde.command('project')\n .description('Get a single project by ID')\n .option('--id <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .action(async (opts: { id?: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.id);\n const data = await client.getProject(projectId, opts.expand, opts.include);\n success(data, 'sde', 'project', start);\n } catch (err) { fail(err, 'sde', 'project', start); }\n });\n\n // ── Tasks ─────────────────────────────────────────────────────────────────\n\n sde.command('tasks')\n .description('List countermeasures for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--phase <slug>', 'Filter by phase slug (e.g. development, architecture-design)')\n .option('--priority <n>', 'Filter by priority (1-10)')\n .option('--status <id>', 'Filter by status ID (e.g. TS1, TS2)')\n .option('--assigned-to <email>', 'Filter by assignee email')\n .option('--source <val>', 'Filter by source: default, custom, manual, project')\n .option('--verification <val>', 'Filter by verification: pass, fail, partial, none')\n .option('--tag <name>', 'Filter by tag name')\n .option('--accepted <bool>', 'Filter by accepted status: true or false')\n .option('--relevant <bool>', 'Filter by relevant status: true or false')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references,regulation_sections')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; phase?: string; priority?: string; status?: string; assignedTo?: string; source?: string; verification?: string; tag?: string; accepted?: string; relevant?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assignedTo: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllTasks(baseOpts);\n success(data, 'sde', 'tasks', start);\n } else {\n const data = await client.listTasks({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'tasks', start);\n }\n } catch (err) { fail(err, 'sde', 'tasks', start); }\n });\n\n // ── Task ──────────────────────────────────────────────────────────────────\n\n sde.command('task')\n .description('Get a single countermeasure')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .requiredOption('--task <id>', 'Task ID (e.g. T21)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references')\n .action(async (opts: { project?: string; task: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const data = await client.getTask(projectId, opts.task, opts.expand, opts.include);\n success(data, 'sde', 'task', start);\n } catch (err) { fail(err, 'sde', 'task', start); }\n });\n\n // ── Threats ───────────────────────────────────────────────────────────────\n\n sde.command('threats')\n .description('List threats for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--severity <n>', 'Filter by severity (1-10)')\n .option('--search <text>', 'Full-text search on title and threat ID')\n .option('--ordering <field>', 'Sort by: threat__severity, threat_id, status (prefix - for descending)')\n .option('--capec-id <id>', 'Filter by CAPEC attack pattern ID')\n .option('--component-id <id>', 'Filter by component ID')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; severity?: string; search?: string; ordering?: string; capecId?: string; componentId?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n severity: opts.severity,\n search: opts.search,\n ordering: opts.ordering,\n capecId: opts.capecId,\n componentId: opts.componentId\n };\n if (opts.all) {\n const data = await client.listAllThreats(baseOpts);\n success(data, 'sde', 'threats', start);\n } else {\n const data = await client.listThreats({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'threats', start);\n }\n } catch (err) { fail(err, 'sde', 'threats', start); }\n });\n}\n","import { Command, Option } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { loadConfig } from '../../lib/config.js';\nimport type { ScanOptions, Ecosystem, FriskSource } 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, Sonatype OSS Index, or Sonatype IQ Server)')\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 .addOption(new Option('--source <source>', 'Vulnerability source').choices(['osv', 'sonatype', 'sonatypeiq', 'all']).default('osv'))\n .option('--application-id <id>', 'Sonatype IQ Server application ID (required when --source sonatypeiq)')\n .action(async (opts: { ecosystem: string; directOnly: boolean; includeDev: boolean; source: string; applicationId?: string }, 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, opts.source as FriskSource, opts.applicationId);\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, OSV.dev, and Sonatype OSS Index, 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 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 maxBuffer: 10 * 1024 * 1024\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 maxBuffer: 10 * 1024 * 1024\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 maxBuffer: 10 * 1024 * 1024\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 { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst SONATYPE_URL = 'https://ossindex.sonatype.org';\nconst BATCH_SIZE = 128; // OSS Index limit per request\nconst TIMEOUT_MS = 30_000;\n\ninterface SonatypeVuln {\n id: string;\n displayName: string;\n title: string;\n description: string;\n cvssScore: number;\n cvssVector?: string;\n cwe?: string;\n reference: string;\n externalReferences?: string[];\n}\n\ninterface SonatypeComponentReport {\n coordinates: string;\n description?: string;\n reference: string;\n vulnerabilities: SonatypeVuln[];\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\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n // Scoped packages: @scope/name → pkg:npm/%40scope/name@version\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n // pncli stores Maven names as \"groupId:artifactId\"\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction inferSeverityFromCvss(score: number): string {\n if (score >= 9.0) return 'CRITICAL';\n if (score >= 7.0) return 'HIGH';\n if (score >= 4.0) return 'MEDIUM';\n if (score > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction mapSonatypeVuln(v: SonatypeVuln, pkg: Package): OsvVulnerability {\n const refs: string[] = [v.reference, ...(v.externalReferences ?? [])].filter(Boolean);\n\n // Sonatype doesn't return fixed versions — direct user to the vulnerability reference\n const advice = `See ${v.reference} for remediation details for ${pkg.name}@${pkg.version}.`;\n\n const cvePattern = /CVE-\\d{4}-\\d+/gi;\n const searchText = [v.displayName, v.title, v.description].filter(Boolean).join(' ');\n const aliases = [...new Set([...searchText.matchAll(cvePattern)].map(m => m[0].toUpperCase()))];\n\n return {\n id: v.displayName || v.id,\n summary: v.title || v.description,\n severity: inferSeverityFromCvss(v.cvssScore),\n cvss: v.cvssScore > 0 ? v.cvssScore : null,\n aliases,\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice\n },\n references: refs\n };\n}\n\nasync function queryBatch(\n purls: string[],\n packages: Package[]\n): Promise<VulnerablePackage[]> {\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: purls })\n });\n\n if (res.status === 429) {\n throw new Error(\n 'Sonatype OSS Index is rate-limiting requests from this IP. ' +\n 'Create a free account at ossindex.sonatype.org and add your credentials to your pncli config to raise the limit.'\n );\n }\n\n if (!res.ok) {\n throw new Error(`Sonatype OSS Index returned HTTP ${res.status}`);\n }\n\n const reports = (await res.json()) as SonatypeComponentReport[];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const report of reports) {\n if (!report?.coordinates) continue;\n const pkg = purlToPackage.get(report.coordinates);\n if (!pkg) continue;\n const vulns = report.vulnerabilities ?? [];\n if (vulns.length === 0) continue;\n vulnerable.push({ ...pkg, vulnerabilities: vulns.map(v => mapSonatypeVuln(v, pkg)) });\n }\n\n return vulnerable;\n}\n\nexport async function checkSonatypeConnectivity(): Promise<{ reachable: boolean; error?: string }> {\n try {\n // Send an empty batch to verify the endpoint is reachable\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: [] })\n });\n return { reachable: res.ok || res.status === 400 };\n } catch (err) {\n return {\n reachable: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport async function checkPackagesForVulnsViaSonatype(\n packages: Package[]\n): 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 const purls = chunk.map(toPurl);\n const results = await queryBatch(purls, chunk);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n","import type { ResolvedConfig } from '../../../types/config.js';\nimport type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst TIMEOUT_MS = 60_000;\nconst MAX_POLL_ATTEMPTS = 10;\nconst POLL_INTERVAL_MS = 2_000;\nconst BATCH_SIZE = 128;\n\ninterface IqConstraintReason {\n reason: string;\n reference?: {\n type: string;\n value: string;\n };\n}\n\ninterface IqConstraintViolation {\n constraintName: string;\n reasons: IqConstraintReason[];\n}\n\ninterface IqPolicyViolation {\n policyId: string;\n policyName: string;\n policyThreatCategory: string;\n policyThreatLevel: number;\n constraintViolations: IqConstraintViolation[];\n}\n\ninterface IqComponentResult {\n component: {\n packageUrl: string;\n };\n matchState: string;\n criticalVulnerabilityCount?: number;\n severeVulnerabilityCount?: number;\n moderateVulnerabilityCount?: number;\n policyData?: {\n policyViolations?: IqPolicyViolation[];\n };\n}\n\ninterface IqEvaluationResponse {\n isQueued: boolean;\n resultsUrl?: string;\n components?: IqComponentResult[];\n}\n\ninterface IqApplicationsResponse {\n applications?: Array<{ id: string; publicId: string; name: string }>;\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\nfunction buildBasicAuth(userCode: string, passcode: string): string {\n return `Basic ${Buffer.from(`${userCode}:${passcode}`).toString('base64')}`;\n}\n\nfunction threatLevelToSeverity(level: number): string {\n if (level >= 9) return 'CRITICAL';\n if (level >= 7) return 'HIGH';\n if (level >= 4) return 'MEDIUM';\n if (level > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction mapViolationToVuln(violation: IqPolicyViolation): OsvVulnerability {\n const cveRefs = violation.constraintViolations.flatMap(cv =>\n cv.reasons\n .filter(r => r.reference?.type === 'VULNERABILITY')\n .map(r => r.reference!.value)\n );\n const id = cveRefs[0] ?? violation.policyId;\n const severity = threatLevelToSeverity(violation.policyThreatLevel);\n\n return {\n id,\n summary: violation.policyName,\n severity,\n cvss: null,\n aliases: [...new Set(cveRefs)],\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice: `Policy violation: ${violation.policyName} (threat level ${violation.policyThreatLevel}). Check Sonatype IQ Server for details.`\n },\n references: []\n };\n}\n\nfunction syntheticVulnsFromCounts(\n criticalCount: number,\n severeCount: number,\n moderateCount: number,\n pkgName: string\n): OsvVulnerability[] {\n const vulns: OsvVulnerability[] = [];\n if (criticalCount > 0) {\n vulns.push({\n id: `iq-critical-${pkgName}`,\n summary: `${criticalCount} critical vulnerability(ies) detected by Sonatype IQ`,\n severity: 'CRITICAL',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (severeCount > 0) {\n vulns.push({\n id: `iq-high-${pkgName}`,\n summary: `${severeCount} severe vulnerability(ies) detected by Sonatype IQ`,\n severity: 'HIGH',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (moderateCount > 0) {\n vulns.push({\n id: `iq-medium-${pkgName}`,\n summary: `${moderateCount} moderate vulnerability(ies) detected by Sonatype IQ`,\n severity: 'MEDIUM',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n return vulns;\n}\n\nasync function resolveApplicationInternalId(\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<string> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?publicId=${encodeURIComponent(applicationId)}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n if (!res.ok) return applicationId;\n const data = await res.json() as IqApplicationsResponse;\n if (data.applications && data.applications.length > 0) {\n return data.applications[0]!.id;\n }\n return applicationId;\n}\n\nasync function pollResults(\n baseUrl: string,\n resultsUrl: string,\n auth: string\n): Promise<IqEvaluationResponse> {\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS * attempt));\n }\n\n const url = resultsUrl.startsWith('http') ? resultsUrl : `${baseUrl.replace(/\\/$/, '')}${resultsUrl}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status} polling results`);\n }\n\n const data = await res.json() as IqEvaluationResponse;\n if (!data.isQueued) return data;\n }\n\n throw new Error('Sonatype IQ Server evaluation timed out waiting for results.');\n}\n\nasync function evaluateBatch(\n purls: string[],\n packages: Package[],\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<VulnerablePackage[]> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/evaluation/applications/${encodeURIComponent(applicationId)}`;\n\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Authorization': auth, 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({ components: purls.map(p => ({ packageUrl: p })) })\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status}`);\n }\n\n let data = await res.json() as IqEvaluationResponse;\n\n if (data.isQueued && data.resultsUrl) {\n data = await pollResults(baseUrl, data.resultsUrl, auth);\n }\n\n const components = data.components ?? [];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const result of components) {\n if (!result?.component?.packageUrl) continue;\n\n const pkg = purlToPackage.get(result.component.packageUrl);\n if (!pkg) continue;\n\n const criticalCount = result.criticalVulnerabilityCount ?? 0;\n const severeCount = result.severeVulnerabilityCount ?? 0;\n const moderateCount = result.moderateVulnerabilityCount ?? 0;\n const totalVulns = criticalCount + severeCount + moderateCount;\n\n const violations = result.policyData?.policyViolations ?? [];\n const securityViolations = violations.filter(v => v.policyThreatCategory === 'SECURITY');\n\n if (securityViolations.length === 0 && totalVulns === 0) continue;\n\n const vulnerabilities: OsvVulnerability[] = securityViolations.length > 0\n ? securityViolations.map(v => mapViolationToVuln(v))\n : syntheticVulnsFromCounts(criticalCount, severeCount, moderateCount, pkg.name);\n\n vulnerable.push({ ...pkg, vulnerabilities });\n }\n\n return vulnerable;\n}\n\nexport async function checkPackagesViaIqServer(\n packages: Package[],\n applicationId: string,\n config: ResolvedConfig\n): Promise<VulnerablePackage[]> {\n const { baseUrl, userCode, passcode } = config.sonatypeiq;\n if (!baseUrl) throw new Error('Sonatype IQ Server baseUrl not configured.');\n if (!userCode || !passcode) throw new Error('Sonatype IQ Server credentials not configured.');\n\n const auth = buildBasicAuth(userCode, passcode);\n const internalId = await resolveApplicationInternalId(baseUrl, applicationId, auth);\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 const purls = chunk.map(toPurl);\n const results = await evaluateBatch(purls, chunk, baseUrl, internalId, auth);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n\nexport async function checkSonatypeIqConnectivity(\n baseUrl: string,\n userCode: string,\n passcode: string\n): Promise<{ reachable: boolean; authenticated: boolean; error?: string }> {\n try {\n const auth = buildBasicAuth(userCode, passcode);\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?limit=1`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10_000);\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (res.status === 401 || res.status === 403) {\n return { reachable: true, authenticated: false, error: `Authentication failed (HTTP ${res.status})` };\n }\n\n return { reachable: true, authenticated: res.ok };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\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';\nimport { checkSonatypeConnectivity } from './clients/sonatype.js';\nimport { checkSonatypeIqConnectivity } from './clients/sonatypeiq.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 checkSonatypeReachable(): Promise<boolean> {\n const result = await checkSonatypeConnectivity();\n return result.reachable;\n}\n\nexport async function buildConnectivityData(config: ResolvedConfig): Promise<ConnectivityData> {\n const iqCfg = config.sonatypeiq;\n const iqConfigured = !!(iqCfg.baseUrl && iqCfg.userCode && iqCfg.passcode);\n\n const checks = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory),\n checkSonatypeConnectivity(),\n iqConfigured\n ? checkSonatypeIqConnectivity(iqCfg.baseUrl!, iqCfg.userCode!, iqCfg.passcode!)\n : Promise.resolve(null)\n ]);\n\n const [osvResult, artResult, sonatypeResult, iqResult] = checks;\n\n const artCfg = config.artifactory;\n\n let tier: Tier = 'local';\n if (artResult.reachable && artResult.authenticated) tier = 'artifactory';\n if (osvResult.reachable || sonatypeResult.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 sonatype: {\n reachable: sonatypeResult.reachable,\n url: 'https://ossindex.sonatype.org',\n ...(sonatypeResult.error ? { error: sonatypeResult.error } : {})\n },\n ...(iqConfigured && iqResult ? {\n sonatypeiq: {\n reachable: iqResult.reachable,\n authenticated: iqResult.authenticated,\n url: iqCfg.baseUrl!,\n ...(iqResult.error ? { error: iqResult.error } : {})\n }\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 || sonatypeResult.reachable || (iqResult?.reachable && iqResult?.authenticated) === true\n }\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, FriskData, FriskSource, FriskSourceError, VulnerablePackage } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { checkPackagesForVulns } from './clients/osv.js';\nimport { checkPackagesForVulnsViaSonatype } from './clients/sonatype.js';\nimport { checkPackagesViaIqServer } from './clients/sonatypeiq.js';\nimport { detectTier, checkSonatypeReachable } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nexport async function runFrisk(\n config: ResolvedConfig,\n opts: ScanOptions,\n source: FriskSource = 'osv',\n applicationId?: string\n): Promise<FriskData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Validate sonatypeiq config upfront before any network checks\n if (source === 'sonatypeiq') {\n if (!config.sonatypeiq.baseUrl || !config.sonatypeiq.userCode || !config.sonatypeiq.passcode) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires Sonatype IQ Server to be configured. Run: pncli config init',\n 1\n );\n }\n if (!applicationId) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires --application-id <id>. ' +\n 'Use \\'pncli sonatypeiq applications list\\' to find application IDs.',\n 1\n );\n }\n }\n\n const { tier: baseTier, osvReachable } = await detectTier(config);\n const sonatypeReachable = (source === 'sonatype' || source === 'all') ? await checkSonatypeReachable() : false;\n const tier = sonatypeReachable ? 'full' : baseTier;\n\n if (source === 'osv' && !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 if (source === 'sonatype' && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk --source sonatype requires Sonatype OSS Index access but ossindex.sonatype.org is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n if (source === 'all' && !osvReachable && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk requires either OSV.dev or Sonatype OSS Index access, but neither is reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n // For source=all, capture pre-check failures in sourceErrors so the LLM can see what was skipped\n const sourceErrors: FriskSourceError[] = [];\n let sourcesQueried: FriskSource[];\n\n if (source === 'all') {\n if (!osvReachable) sourceErrors.push({ source: 'osv', error: 'api.osv.dev is not reachable — run pncli deps connectivity to diagnose.' });\n if (!sonatypeReachable) sourceErrors.push({ source: 'sonatype', error: 'ossindex.sonatype.org is not reachable — run pncli deps connectivity to diagnose.' });\n sourcesQueried = [\n ...(osvReachable ? ['osv' as const] : []),\n ...(sonatypeReachable ? ['sonatype' as const] : [])\n ];\n } else {\n sourcesQueried = [source];\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, source, sourcesQueried, sourceErrors, scanned: 0, vulnerable: 0, packages: [] };\n }\n\n let vulnerable: VulnerablePackage[];\n\n if (source === 'sonatypeiq') {\n vulnerable = await checkPackagesViaIqServer(scan.packages, applicationId!, config);\n } else if (source === 'sonatype') {\n vulnerable = await checkPackagesForVulnsViaSonatype(scan.packages);\n } else if (source === 'all') {\n // Use allSettled so a runtime failure from one source doesn't discard results from the other\n const [osvSettled, sonatypeSettled] = await Promise.allSettled([\n osvReachable ? checkPackagesForVulns(scan.packages) : Promise.resolve([] as VulnerablePackage[]),\n sonatypeReachable ? checkPackagesForVulnsViaSonatype(scan.packages) : Promise.resolve([] as VulnerablePackage[])\n ]);\n\n if (osvReachable) {\n if (osvSettled.status === 'rejected') {\n sourceErrors.push({ source: 'osv', error: toErrorMessage(osvSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'osv');\n }\n }\n if (sonatypeReachable) {\n if (sonatypeSettled.status === 'rejected') {\n sourceErrors.push({ source: 'sonatype', error: toErrorMessage(sonatypeSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'sonatype');\n }\n }\n\n if (sourcesQueried.length === 0) {\n throw new PncliError(\n 'All vulnerability sources failed during scanning. Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n vulnerable = mergeVulnerablePackages(\n osvSettled.status === 'fulfilled' ? osvSettled.value : [],\n sonatypeSettled.status === 'fulfilled' ? sonatypeSettled.value : []\n );\n } else {\n vulnerable = await checkPackagesForVulns(scan.packages);\n }\n\n return {\n tier,\n source,\n sourcesQueried,\n sourceErrors,\n scanned: scan.packages.length,\n vulnerable: vulnerable.length,\n packages: vulnerable\n };\n}\n\nfunction mergeVulnerablePackages(\n osvResults: VulnerablePackage[],\n sonatypeResults: VulnerablePackage[]\n): VulnerablePackage[] {\n const byKey = new Map<string, VulnerablePackage>();\n\n for (const pkg of osvResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n byKey.set(key, { ...pkg });\n }\n\n for (const pkg of sonatypeResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n const existing = byKey.get(key);\n if (existing) {\n // Merge: add Sonatype vulns not already present by ID\n const existingIds = new Set(existing.vulnerabilities.map(v => v.id));\n const newVulns = pkg.vulnerabilities.filter(v => !existingIds.has(v.id));\n existing.vulnerabilities = [...existing.vulnerabilities, ...newVulns];\n } else {\n byKey.set(key, { ...pkg });\n }\n }\n\n return [...byKey.values()];\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 { input, password, confirm } from '@inquirer/prompts';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n setRepoConfigValue,\n maskConfig,\n getGlobalConfigPath\n} from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { AdoCoreClient } from '../ado/client/core.js';\nimport { AdoWorkClient } from '../ado/client/work.js';\nimport { discoverFields, discoverTypes, buildDefaultAliases } from '../ado/discovery.js';\nimport { checkArtifactoryConnectivity } from '../deps/clients/artifactory.js';\nimport { success, fail, warn } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport chalk from 'chalk';\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.exitCode = ExitCode.GENERAL_ERROR;\n return;\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 .option('--repo', 'Write to repo config (.pncli.json) instead of global config')\n .action((key: string, value: string, cmdOpts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (cmdOpts.repo) {\n setRepoConfigValue(key, value);\n success({ key, value, target: '.pncli.json' }, 'config', 'set', start);\n } else {\n const opts = program.optsWithGlobals();\n setConfigValue(key, value, opts.config);\n success({ key, value }, 'config', 'set', start);\n }\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(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n const http = createHttpClient(cfg);\n\n type ServiceResult = { ok: boolean; message: string } | { ok: null; message: string };\n const results: Record<string, ServiceResult> = {};\n\n if (cfg.jira.baseUrl) {\n try {\n await http.jira<unknown>('/rest/api/2/myself');\n results.jira = { ok: true, message: 'connected' };\n } catch (err) {\n results.jira = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jira = { ok: null, message: 'not configured' };\n }\n\n if (cfg.bitbucket.baseUrl) {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties');\n results.bitbucket = { ok: true, message: 'connected' };\n } catch (err) {\n results.bitbucket = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.bitbucket = { ok: null, message: 'not configured' };\n }\n\n if (cfg.confluence.baseUrl) {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 } });\n results.confluence = { ok: true, message: 'connected' };\n } catch (err) {\n results.confluence = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.confluence = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonar.baseUrl) {\n try {\n await http.sonar<unknown>('/api/system/status');\n results.sonar = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonar = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonar = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sde.baseUrl) {\n try {\n await http.sde<unknown>('/api/v2/users/me/');\n results.sde = { ok: true, message: 'connected' };\n } catch (err) {\n results.sde = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sde = { ok: null, message: 'not configured' };\n }\n\n if (cfg.ado.baseUrl) {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path);\n results.ado = { ok: true, message: 'connected' };\n } catch (err) {\n results.ado = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.ado = { ok: null, message: 'not configured' };\n }\n\n if (cfg.jenkins.baseUrl && cfg.jenkins.username && cfg.jenkins.apiToken) {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' } });\n results.jenkins = { ok: true, message: 'connected' };\n } catch (err) {\n results.jenkins = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jenkins = { ok: null, message: 'not configured' };\n }\n\n if (cfg.artifactory.baseUrl) {\n try {\n await http.artifactoryText('/api/system/ping');\n results.artifactory = { ok: true, message: 'connected' };\n } catch (err) {\n results.artifactory = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.artifactory = { ok: null, message: 'not configured' };\n }\n\n if (cfg.udeploy.baseUrl && (cfg.udeploy.pat || (cfg.udeploy.username && cfg.udeploy.password))) {\n try {\n await http.udeploy<unknown>('/cli/application');\n results.udeploy = { ok: true, message: 'connected' };\n } catch (err) {\n results.udeploy = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.udeploy = { ok: null, message: 'not configured' };\n }\n\n if (cfg.checkmarx.baseUrl && cfg.checkmarx.username && cfg.checkmarx.password) {\n try {\n await http.checkmarx<unknown>('/cxrestapi/projects');\n results.checkmarx = { ok: true, message: 'connected' };\n } catch (err) {\n results.checkmarx = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.checkmarx = { ok: null, message: 'not configured' };\n }\n\n const snConfigured = cfg.servicenow.baseUrl && cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (snConfigured) {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n results.servicenow = { ok: true, message: 'connected' };\n } catch (err) {\n results.servicenow = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.servicenow = { ok: null, message: 'not configured' };\n }\n\n if (cfg.contrast.apiKey && cfg.contrast.serviceKey && cfg.contrast.username && cfg.contrast.orgUuid) {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 } });\n results.contrast = { ok: true, message: 'connected' };\n } catch (err) {\n results.contrast = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.contrast = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonatypeiq.baseUrl && cfg.sonatypeiq.userCode && cfg.sonatypeiq.passcode) {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n results.sonatypeiq = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonatypeiq = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonatypeiq = { ok: null, message: 'not configured' };\n }\n\n success(results, 'config', 'test', start);\n } catch (err) {\n fail(err, 'config', 'test', start);\n }\n });\n\n config\n .command('check')\n .description('Check PAT status for every service: Blank, Valid, or Invalid')\n .option('--output <format>', 'Output format: json or table', 'json')\n .action(async (cmdOpts: { output: string }) => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n // Always bypass --dry-run: a dry-run config check is meaningless\n const http = createHttpClient(cfg, false);\n\n type CheckStatus = 'blank' | 'valid' | 'invalid' | 'error';\n type CheckResult = { status: CheckStatus; message: string };\n const results: Record<string, CheckResult> = {};\n\n function categorize(err: unknown): CheckResult {\n const status = (err as { status?: number }).status ?? -1;\n if (status === 401 || status === 403) {\n return { status: 'invalid', message: `auth rejected (${status})` };\n }\n if (status === 0) {\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n\n // Jira\n if (!cfg.jira.apiToken) {\n results.jira = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jira.baseUrl) {\n results.jira = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jira<unknown>('/rest/api/2/myself', { timeoutMs: 10_000 });\n results.jira = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jira = categorize(err);\n }\n }\n\n // Bitbucket\n if (!cfg.bitbucket.pat) {\n results.bitbucket = { status: 'blank', message: 'not configured' };\n } else if (!cfg.bitbucket.baseUrl) {\n results.bitbucket = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties', { timeoutMs: 10_000 });\n results.bitbucket = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.bitbucket = categorize(err);\n }\n }\n\n // Confluence — distinguish explicit token from Jira fallback\n if (!cfg.confluence.apiTokenExplicit && !cfg.jira.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.baseUrl) {\n results.confluence = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 }, timeoutMs: 10_000 });\n const msg = cfg.confluence.apiTokenExplicit ? 'ok' : 'ok (inherited from Jira token)';\n results.confluence = { status: 'valid', message: msg };\n } catch (err) {\n results.confluence = categorize(err);\n }\n }\n\n // SonarQube\n if (!cfg.sonar.token) {\n results.sonar = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonar.baseUrl) {\n results.sonar = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonar<unknown>('/api/system/status', { timeoutMs: 10_000 });\n results.sonar = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonar = categorize(err);\n }\n }\n\n // SDElements\n if (!cfg.sde.token) {\n results.sde = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sde.baseUrl) {\n results.sde = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sde<unknown>('/api/v2/users/me/', { timeoutMs: 10_000 });\n results.sde = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sde = categorize(err);\n }\n }\n\n // Azure DevOps\n if (!cfg.ado.pat) {\n results.ado = { status: 'blank', message: 'not configured' };\n } else if (!cfg.ado.baseUrl) {\n results.ado = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path, { timeoutMs: 10_000 });\n results.ado = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.ado = categorize(err);\n }\n }\n\n // Jenkins\n if (!cfg.jenkins.apiToken || !cfg.jenkins.username) {\n results.jenkins = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jenkins.baseUrl) {\n results.jenkins = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' }, timeoutMs: 10_000 });\n results.jenkins = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jenkins = categorize(err);\n }\n }\n\n // UDeploy\n if (!cfg.udeploy.pat && !(cfg.udeploy.username && cfg.udeploy.password)) {\n results.udeploy = { status: 'blank', message: 'not configured' };\n } else if (!cfg.udeploy.baseUrl) {\n results.udeploy = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.udeploy<unknown>('/cli/application', { timeoutMs: 10_000 });\n results.udeploy = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.udeploy = categorize(err);\n }\n }\n\n // Artifactory — reuse existing helper\n const artResult = await checkArtifactoryConnectivity(cfg.artifactory);\n if (!artResult.configured) {\n results.artifactory = { status: 'blank', message: artResult.error ?? 'not configured' };\n } else if (!artResult.authenticated) {\n results.artifactory = { status: 'invalid', message: artResult.error ?? 'auth rejected' };\n } else if (!artResult.reachable) {\n results.artifactory = { status: 'error', message: artResult.error ?? 'unreachable' };\n } else {\n results.artifactory = { status: 'valid', message: 'ok' };\n }\n\n // Checkmarx\n if (!cfg.checkmarx.username || !cfg.checkmarx.password) {\n results.checkmarx = { status: 'blank', message: 'not configured' };\n } else if (!cfg.checkmarx.baseUrl) {\n results.checkmarx = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.checkmarx<unknown>('/cxrestapi/projects', { timeoutMs: 10_000 });\n results.checkmarx = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.checkmarx = categorize(err);\n }\n }\n\n // ServiceNow\n const snCreds = cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (!snCreds) {\n results.servicenow = { status: 'blank', message: 'not configured' };\n } else if (!cfg.servicenow.baseUrl) {\n results.servicenow = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 }, timeoutMs: 10_000 });\n results.servicenow = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.servicenow = categorize(err);\n }\n }\n\n // Contrast IAST\n if (!cfg.contrast.apiKey || !cfg.contrast.serviceKey || !cfg.contrast.username) {\n results.contrast = { status: 'blank', message: 'not configured' };\n } else if (!cfg.contrast.orgUuid) {\n results.contrast = { status: 'error', message: 'orgUuid not configured' };\n } else {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 }, timeoutMs: 10_000 });\n results.contrast = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.contrast = categorize(err);\n }\n }\n\n // Sonatype IQ Server\n if (!cfg.sonatypeiq.userCode || !cfg.sonatypeiq.passcode) {\n results.sonatypeiq = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonatypeiq.baseUrl) {\n results.sonatypeiq = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 }, timeoutMs: 10_000 });\n results.sonatypeiq = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonatypeiq = categorize(err);\n }\n }\n\n // Exit code: prefer AUTH_ERROR if any invalid, else NETWORK_ERROR if any errors\n const statuses = Object.values(results).map(r => r.status);\n if (statuses.includes('invalid')) process.exitCode = ExitCode.AUTH_ERROR;\n else if (statuses.includes('error')) process.exitCode = ExitCode.NETWORK_ERROR;\n\n if (cmdOpts.output === 'table') {\n // Human-readable table to stdout\n const services = ['jira', 'bitbucket', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stdout.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stdout.write('\\n');\n } else {\n // Pretty table on stderr when --pretty is set (stdout stays JSON)\n if (opts.pretty) {\n const services = ['jira', 'bitbucket', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stderr.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stderr.write('\\n');\n }\n success(results, 'config', 'check', start);\n }\n } catch (err) {\n fail(err, 'config', 'check', start);\n }\n });\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return trimmed;\n return /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\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. 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. 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── Confluence ────────────────────────────────────\\n');\n const confluenceBaseUrl = await input({\n message: 'Confluence base URL (e.g. confluence.your-company.com):',\n default: ''\n });\n\n const confluenceApiToken = await password({\n message: 'Confluence 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. 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── SonarQube ─────────────────────────────────────\\n');\n const useSonar = await confirm({\n message: 'Configure SonarQube Server for code quality checks?',\n default: false\n });\n\n let sonarBaseUrl = '';\n let sonarToken = '';\n\n if (useSonar) {\n sonarBaseUrl = await input({\n message: 'SonarQube Server base URL (e.g. sonar.your-company.com):',\n default: ''\n });\n\n sonarToken = await password({\n message: 'SonarQube personal access token:'\n });\n }\n\n process.stderr.write('\\n── SDElements ────────────────────────────────────\\n');\n const useSde = await confirm({\n message: 'Configure SDElements for threat modeling and countermeasure queries?',\n default: false\n });\n\n let sdeBaseUrl = '';\n let sdeToken = '';\n\n if (useSde) {\n process.stderr.write(' Connection string format: <api-token>@<base-url>\\n');\n const useSdeConnectionString = await confirm({\n message: 'Do you have a connection string to paste (token@url)?',\n default: false\n });\n\n if (useSdeConnectionString) {\n const sdeConnection = await password({\n message: 'SDElements connection string (api-token@hostname, e.g. mytoken@myorg.sdelements.com):'\n });\n const atIdx = sdeConnection.indexOf('@');\n if (atIdx > 0) {\n sdeToken = sdeConnection.slice(0, atIdx);\n sdeBaseUrl = sdeConnection.slice(atIdx + 1);\n }\n } else {\n sdeBaseUrl = await input({\n message: 'SDElements hostname\\n Cloud-hosted: your-org.sdelements.com\\n On-premise: sde.your-company.com\\n Host: ',\n default: ''\n });\n\n sdeToken = await password({\n message: 'SDElements API token:'\n });\n }\n }\n\n process.stderr.write('\\n── Azure DevOps Server ───────────────────────────\\n');\n const useAdo = await confirm({\n message: 'Configure Azure DevOps Server for work items, repos, and pipelines?',\n default: false\n });\n\n let adoBaseUrl = '';\n let adoPat = '';\n let adoCollection = '';\n let adoProject = '';\n let adoFieldAliases: Record<string, string> = {};\n let adoDiscoveredFields: import('../../types/config.js').AdoFieldMeta[] = [];\n let adoDiscoveredTypes: import('../../types/config.js').AdoWorkItemTypeMeta[] = [];\n\n if (useAdo) {\n adoBaseUrl = await input({\n message: 'Azure DevOps Server base URL (e.g. tfs.company.com or devops.company.com/tfs):',\n default: ''\n });\n\n adoPat = await password({\n message: 'Azure DevOps personal access token:'\n });\n\n adoCollection = await input({\n message: 'Default collection name (e.g. DefaultCollection):',\n default: ''\n });\n\n adoProject = await input({\n message: 'Default team project name:',\n default: ''\n });\n\n // Validate connectivity before asking discovery questions\n if (adoBaseUrl && adoCollection) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n pat: adoPat || undefined,\n fieldAliases: {},\n discoveredFields: [],\n discoveredTypes: []\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n const tempCore = new AdoCoreClient(tempHttp);\n await tempCore.getConnectionData(adoCollection);\n process.stderr.write(' Connected.\\n');\n\n // Optional field/type discovery\n if (adoProject) {\n const doDiscover = await confirm({\n message: 'Discover work item types and fields from this collection now? (recommended)',\n default: true\n });\n\n if (doDiscover) {\n process.stderr.write(' Fetching work item types and fields...\\n');\n const tempWork = new AdoWorkClient(tempHttp);\n adoDiscoveredFields = await discoverFields(tempWork, adoCollection);\n process.stderr.write(` Found ${adoDiscoveredFields.length} fields.\\n`);\n adoDiscoveredTypes = await discoverTypes(tempWork, adoCollection, adoProject);\n process.stderr.write(` Found ${adoDiscoveredTypes.length} work item types.\\n`);\n\n const doAliases = await confirm({\n message: 'Save friendly aliases for common fields? (e.g. \"priority\" → reference name)',\n default: true\n });\n if (doAliases) {\n adoFieldAliases = buildDefaultAliases(adoDiscoveredFields as Parameters<typeof buildDefaultAliases>[0]);\n process.stderr.write(` Generated ${Object.keys(adoFieldAliases).length} aliases.\\n`);\n }\n }\n }\n } catch (err) {\n warn(`Could not connect to Azure DevOps: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Jenkins ───────────────────────────────────────\\n');\n const useJenkins = await confirm({\n message: 'Configure Jenkins Data Center for pipeline operations?',\n default: false\n });\n\n let jenkinsBaseUrl = '';\n let jenkinsUsername = '';\n let jenkinsApiToken = '';\n\n if (useJenkins) {\n jenkinsBaseUrl = await input({\n message: 'Jenkins base URL (e.g. jenkins.your-company.com):',\n default: ''\n });\n\n jenkinsUsername = await input({\n message: 'Jenkins username:',\n default: ''\n });\n\n jenkinsApiToken = await password({\n message: 'Jenkins API token:'\n });\n }\n\n process.stderr.write('\\n── IBM UrbanCode Deploy ──────────────────────────\\n');\n const useUdeploy = await confirm({\n message: 'Configure IBM UrbanCode Deploy for component imports and deployment processes?',\n default: false\n });\n\n let udeployBaseUrl = '';\n let udeployPat = '';\n let udeployUsername = '';\n let udeployPassword = '';\n let udeployDefaultApp = '';\n let udeployDefaultEnv = '';\n\n if (useUdeploy) {\n udeployBaseUrl = await input({\n message: 'UDeploy base URL (e.g. ucd.company.com:8443):',\n default: ''\n });\n\n udeployUsername = await input({\n message: 'UDeploy username (leave blank to use a PAT instead):',\n default: ''\n });\n\n if (udeployUsername) {\n udeployPassword = await password({\n message: 'UDeploy password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n } else {\n udeployPat = await password({\n message: 'UDeploy personal access token:'\n });\n }\n\n udeployDefaultApp = await input({\n message: 'Default application name (optional):',\n default: ''\n });\n\n udeployDefaultEnv = await input({\n message: 'Default environment name (optional):',\n default: ''\n });\n\n const hasCredentials = udeployBaseUrl && (udeployPat || (udeployUsername && udeployPassword));\n if (hasCredentials) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n pat: udeployPat || undefined,\n username: udeployUsername || undefined,\n password: udeployPassword || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.udeploy<unknown>('/cli/application');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to UDeploy: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Checkmarx ─────────────────────────────────────\\n');\n const useCheckmarx = await confirm({\n message: 'Configure Checkmarx CxSAST for vulnerability scanning?',\n default: false\n });\n\n let checkmarxBaseUrl = '';\n let checkmarxUsername = '';\n let checkmarxPassword = '';\n\n if (useCheckmarx) {\n checkmarxBaseUrl = await input({\n message: 'Checkmarx base URL (e.g. cx.company.com):',\n default: ''\n });\n\n checkmarxUsername = await input({\n message: 'Checkmarx username:',\n default: ''\n });\n\n checkmarxPassword = await password({\n message: 'Checkmarx password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n\n if (checkmarxBaseUrl && checkmarxUsername && checkmarxPassword) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n username: checkmarxUsername,\n password: checkmarxPassword\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.checkmarx<unknown>('/cxrestapi/projects');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Checkmarx: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── ServiceNow ────────────────────────────────────\\n');\n const useServiceNow = await confirm({\n message: 'Configure ServiceNow for change management?',\n default: false\n });\n\n let servicenowBaseUrl = '';\n let servicenowUsername = '';\n let servicenowPassword = '';\n let servicenowApiToken = '';\n\n if (useServiceNow) {\n servicenowBaseUrl = await input({\n message: 'ServiceNow instance URL (e.g. mycompany.service-now.com):',\n default: ''\n });\n\n servicenowUsername = await input({\n message: 'ServiceNow username:',\n default: ''\n });\n\n const snUseToken = await confirm({\n message: 'Authenticate with an API token instead of a password?',\n default: false\n });\n\n if (snUseToken) {\n servicenowApiToken = await password({\n message: 'ServiceNow API token:',\n validate: (v) => v.length > 0 || 'Token cannot be blank'\n });\n } else {\n servicenowPassword = await password({\n message: 'ServiceNow password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n }\n\n const snHasCreds = servicenowBaseUrl && servicenowUsername && (servicenowPassword || servicenowApiToken);\n if (snHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername,\n password: servicenowPassword || undefined,\n apiToken: servicenowApiToken || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to ServiceNow: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Sonatype IQ Server ────────────────────────────\\n');\n const useSonatypeIq = await confirm({\n message: 'Configure Sonatype IQ Server for dependency vulnerability scanning?',\n default: false\n });\n\n let sonatypeIqBaseUrl = '';\n let sonatypeIqUserCode = '';\n let sonatypeIqPasscode = '';\n\n if (useSonatypeIq) {\n process.stderr.write(' User Token credentials are found in your IQ Server profile under User Token.\\n');\n\n sonatypeIqBaseUrl = await input({\n message: 'Sonatype IQ Server base URL (e.g. iq.your-company.com):',\n default: ''\n });\n\n sonatypeIqUserCode = await input({\n message: 'User Code (from User Token):',\n default: ''\n });\n\n sonatypeIqPasscode = await password({\n message: 'Passcode (from User Token):'\n });\n\n if (sonatypeIqBaseUrl && sonatypeIqUserCode && sonatypeIqPasscode) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode,\n passcode: sonatypeIqPasscode\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Sonatype IQ Server: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Contrast IAST ─────────────────────────────────\\n');\n const useContrast = await confirm({\n message: 'Configure Contrast Security IAST for vulnerability findings?',\n default: false\n });\n\n let contrastBaseUrl = '';\n let contrastOrgUuid = '';\n let contrastUsername = '';\n let contrastApiKey = '';\n let contrastServiceKey = '';\n\n if (useContrast) {\n process.stderr.write(' Find your credentials in Contrast under User Settings → Your Keys.\\n');\n\n contrastBaseUrl = await input({\n message: 'Contrast base URL (leave blank for cloud: https://app.contrastsecurity.com):',\n default: ''\n });\n\n contrastOrgUuid = await input({\n message: 'Organization UUID:',\n default: ''\n });\n\n contrastUsername = await input({\n message: 'Username (email):',\n default: ''\n });\n\n contrastApiKey = await password({\n message: 'API key:'\n });\n\n contrastServiceKey = await password({\n message: 'Service key:'\n });\n\n const contrastHasCreds = contrastOrgUuid && contrastUsername && contrastApiKey && contrastServiceKey;\n if (contrastHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n contrast: {\n baseUrl: normalizeBaseUrl(contrastBaseUrl) || undefined,\n orgUuid: contrastOrgUuid,\n username: contrastUsername,\n apiKey: contrastApiKey,\n serviceKey: contrastServiceKey\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.contrast<unknown>(`/Contrast/api/ng/${contrastOrgUuid}/applications`, { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Contrast: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your credentials and re-run pncli config init or pncli config test.');\n }\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 const sonarProject = useSonar ? await input({\n message: 'Default SonarQube project key (optional):',\n default: ''\n }) : '';\n\n const sdeProject = useSde ? await input({\n message: 'Default SDElements project ID (optional, numeric):',\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.exitCode = ExitCode.SUCCESS;\n return;\n }\n\n writeGlobalConfig({\n user: {\n email: userEmail || undefined,\n userId: userId || undefined\n },\n jira: {\n baseUrl: normalizeBaseUrl(jiraBaseUrl) || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: normalizeBaseUrl(bitbucketBaseUrl) || undefined,\n pat: bitbucketPat || undefined\n },\n ...(confluenceBaseUrl || confluenceApiToken ? {\n confluence: {\n baseUrl: normalizeBaseUrl(confluenceBaseUrl) || undefined,\n apiToken: confluenceApiToken || undefined\n }\n } : {}),\n ...(useArtifactory ? {\n artifactory: {\n baseUrl: normalizeBaseUrl(artifactoryBaseUrl) || undefined,\n token: artifactoryToken || undefined,\n npmRepo: npmRepo || undefined,\n nugetRepo: nugetRepo || undefined,\n mavenRepo: mavenRepo || undefined\n }\n } : {}),\n ...(useSonar ? {\n sonar: {\n baseUrl: normalizeBaseUrl(sonarBaseUrl) || undefined,\n token: sonarToken || undefined\n }\n } : {}),\n ...(useSde && sdeToken && sdeBaseUrl ? {\n sde: {\n connection: `${sdeToken}@${sdeBaseUrl}`\n }\n } : {}),\n ...(useAdo && adoBaseUrl ? {\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n ...(adoPat ? { pat: adoPat } : {}),\n ...(Object.keys(adoFieldAliases).length ? { fieldAliases: adoFieldAliases } : {}),\n ...(adoDiscoveredFields.length ? { discoveredFields: adoDiscoveredFields } : {}),\n ...(adoDiscoveredTypes.length ? { discoveredTypes: adoDiscoveredTypes } : {})\n }\n } : {}),\n ...(useJenkins && jenkinsBaseUrl ? {\n jenkins: {\n baseUrl: normalizeBaseUrl(jenkinsBaseUrl),\n ...(jenkinsUsername ? { username: jenkinsUsername } : {}),\n ...(jenkinsApiToken ? { apiToken: jenkinsApiToken } : {})\n }\n } : {}),\n ...(useUdeploy && udeployBaseUrl ? {\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n ...(udeployPat ? { pat: udeployPat } : {}),\n ...(udeployUsername ? { username: udeployUsername } : {}),\n ...(udeployPassword ? { password: udeployPassword } : {})\n }\n } : {}),\n ...(useCheckmarx && checkmarxBaseUrl ? {\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n username: checkmarxUsername || undefined,\n password: checkmarxPassword || undefined\n }\n } : {}),\n ...(useServiceNow && servicenowBaseUrl ? {\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername || undefined,\n ...(servicenowApiToken ? { apiToken: servicenowApiToken } : {}),\n ...(servicenowPassword ? { password: servicenowPassword } : {})\n }\n } : {}),\n ...(useContrast && contrastOrgUuid ? {\n contrast: {\n ...(contrastBaseUrl ? { baseUrl: normalizeBaseUrl(contrastBaseUrl) } : {}),\n orgUuid: contrastOrgUuid,\n username: contrastUsername || undefined,\n apiKey: contrastApiKey || undefined,\n serviceKey: contrastServiceKey || undefined\n }\n } : {}),\n ...(useSonatypeIq && sonatypeIqBaseUrl ? {\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode || undefined,\n passcode: sonatypeIqPasscode || undefined\n }\n } : {}),\n defaults: {\n jira: {\n project: jiraProject || undefined\n },\n ...(useSonar && sonarProject ? {\n sonar: {\n project: sonarProject || undefined\n }\n } : {}),\n ...(useSde && sdeProject ? {\n sde: {\n project: sdeProject || undefined\n }\n } : {}),\n ...(useAdo && (adoCollection || adoProject) ? {\n ado: {\n collection: adoCollection || undefined,\n project: adoProject || undefined\n }\n } : {}),\n ...(useUdeploy && (udeployDefaultApp || udeployDefaultEnv) ? {\n udeploy: {\n application: udeployDefaultApp || undefined,\n environment: udeployDefaultEnv || undefined\n }\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 adoRepoCollection = await input({\n message: 'Default Azure DevOps collection for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoProject = await input({\n message: 'Default Azure DevOps project for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoRepo = await input({\n message: 'Default Azure DevOps repo name for this repo (leave blank to auto-detect):',\n default: ''\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.exitCode = ExitCode.SUCCESS;\n return;\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.exitCode = ExitCode.SUCCESS;\n return;\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 ...(adoRepoCollection || adoRepoProject || adoRepoRepo ? {\n ado: {\n collection: adoRepoCollection || undefined,\n project: adoRepoProject || undefined,\n repo: adoRepoRepo || undefined\n }\n } : {})\n }\n });\n\n success({ written: '.pncli.json' }, 'config', 'init', start);\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoWorkItem,\n AdoWorkItemComment,\n AdoWorkItemType,\n AdoWorkItemTypeState,\n AdoField,\n AdoWiqlResult,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\nconst API_PREVIEW = '7.1-preview.4';\n\nexport interface JsonPatchOp {\n op: 'add' | 'replace' | 'remove';\n path: string;\n value?: unknown;\n}\n\nexport class AdoWorkClient {\n constructor(private http: HttpClient) {}\n\n async getWorkItem(collection: string, id: number): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}&$expand=all`\n );\n }\n\n async createWorkItem(\n collection: string,\n project: string,\n type: string,\n patch: JsonPatchOp[]\n ): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitems/${encodeURIComponent('$' + type)}?api-version=${API}`,\n { method: 'POST', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async updateWorkItem(collection: string, id: number, patch: JsonPatchOp[]): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}`,\n { method: 'PATCH', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async queryWiql(collection: string, project: string, wiql: string): Promise<AdoWiqlResult> {\n return this.http.ado<AdoWiqlResult>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/wiql?api-version=${API}`,\n { method: 'POST', body: { query: wiql } }\n );\n }\n\n async listComments(collection: string, project: string, workItemId: number): Promise<AdoWorkItemComment[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemComment>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`\n );\n return result.value ?? [];\n }\n\n async addComment(collection: string, project: string, workItemId: number, text: string): Promise<AdoWorkItemComment> {\n return this.http.ado<AdoWorkItemComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`,\n { method: 'POST', body: { text } }\n );\n }\n\n async listWorkItemTypes(collection: string, project: string): Promise<AdoWorkItemType[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemType>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeStates(collection: string, project: string, type: string): Promise<AdoWorkItemTypeState[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemTypeState>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/states?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listFields(collection: string, project?: string): Promise<AdoField[]> {\n const scope = project\n ? `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}`\n : `/${encodeURIComponent(collection)}`;\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `${scope}/_apis/wit/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeFields(collection: string, project: string, type: string): Promise<AdoField[]> {\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n}\n","import type { AdoWorkClient } from './client/work.js';\nimport type { AdoFieldMeta, AdoWorkItemTypeMeta } from '../../types/config.js';\n\n/**\n * Discovers all work item fields in the collection and maps them to AdoFieldMeta.\n */\nexport async function discoverFields(\n client: AdoWorkClient,\n collection: string,\n project?: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listFields(collection, project);\n return fields.map(toFieldMeta);\n}\n\n/**\n * Discovers fields scoped to a specific work item type.\n */\nexport async function discoverTypeFields(\n client: AdoWorkClient,\n collection: string,\n project: string,\n type: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listTypeFields(collection, project, type);\n return fields.map(toFieldMeta);\n}\n\nfunction toFieldMeta(f: { referenceName: string; name: string; type: string; readOnly?: boolean; picklistId?: string }): AdoFieldMeta {\n return {\n referenceName: f.referenceName,\n name: f.name,\n type: f.type,\n readOnly: f.readOnly,\n ...(f.picklistId ? { picklistId: f.picklistId } : {})\n };\n}\n\n/**\n * Discovers all work item types and their valid states per type.\n */\nexport async function discoverTypes(\n client: AdoWorkClient,\n collection: string,\n project: string\n): Promise<AdoWorkItemTypeMeta[]> {\n const types = await client.listWorkItemTypes(collection, project);\n const result: AdoWorkItemTypeMeta[] = [];\n\n for (const t of types) {\n const states = await client.listTypeStates(collection, project, t.name);\n const requiredFields = (t.fields ?? [])\n .filter(f => f.alwaysRequired)\n .map(f => f.referenceName);\n result.push({\n name: t.name,\n states: states.map(s => s.name),\n requiredFields\n });\n }\n\n return result;\n}\n\n/**\n * Generates a default alias map for the most common field reference names.\n * Only includes aliases for fields actually present in the discovered set.\n */\nexport function buildDefaultAliases(fields: AdoFieldMeta[]): Record<string, string> {\n const refNames = new Set(fields.map(f => f.referenceName));\n\n const candidates: Array<[string, string]> = [\n ['title', 'System.Title'],\n ['state', 'System.State'],\n ['assignedto', 'System.AssignedTo'],\n ['assigned-to', 'System.AssignedTo'],\n ['description', 'System.Description'],\n ['areapath', 'System.AreaPath'],\n ['area-path', 'System.AreaPath'],\n ['iterationpath', 'System.IterationPath'],\n ['iteration', 'System.IterationPath'],\n ['tags', 'System.Tags'],\n ['priority', 'Microsoft.VSTS.Common.Priority'],\n ['severity', 'Microsoft.VSTS.Common.Severity'],\n ['effort', 'Microsoft.VSTS.Scheduling.Effort'],\n ['storypoints', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['story-points', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['remainingwork', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['remaining', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['acceptancecriteria', 'Microsoft.VSTS.Common.AcceptanceCriteria'],\n ['reprosteps', 'Microsoft.VSTS.TCM.ReproSteps'],\n ['foundinsource', 'Microsoft.VSTS.Build.FoundIn']\n ];\n\n const aliases: Record<string, string> = {};\n for (const [alias, ref] of candidates) {\n if (refNames.has(ref)) {\n aliases[alias] = ref;\n }\n }\n return aliases;\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoGitRepo,\n AdoPullRequest,\n AdoPRThread,\n AdoPRComment,\n AdoPRCompletionOptions,\n AdoGitChange,\n AdoGitDiff,\n AdoGitStatus,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoGitClient {\n constructor(private http: HttpClient) {}\n\n // ── Repositories ──────────────────────────────────────────────────\n\n async listRepos(collection: string, project: string): Promise<AdoGitRepo[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitRepo>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getRepo(collection: string, project: string, repoId: string): Promise<AdoGitRepo> {\n return this.http.ado<AdoGitRepo>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repoId)}?api-version=${API}`\n );\n }\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n async listPRs(\n collection: string,\n project: string,\n repo: string,\n opts: { status?: string; creatorAlias?: string; reviewerAlias?: string } = {}\n ): Promise<AdoPullRequest[]> {\n return this.http.adoPaginate<AdoPullRequest>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n 'searchCriteria.status': opts.status ?? 'active',\n ...(opts.creatorAlias ? { 'searchCriteria.creatorId': opts.creatorAlias } : {}),\n ...(opts.reviewerAlias ? { 'searchCriteria.reviewerId': opts.reviewerAlias } : {}),\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests`,\n { params }\n ) as Promise<{ data: { value: AdoPullRequest[] }; headers: Headers }>;\n });\n }\n\n async getPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`\n );\n }\n\n async createPR(\n collection: string,\n project: string,\n repo: string,\n body: {\n title: string;\n description?: string;\n sourceRefName: string;\n targetRefName: string;\n reviewers?: Array<{ id: string }>;\n }\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async updatePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: Partial<{ title: string; description: string; reviewers: Array<{ id: string }> }>\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body }\n );\n }\n\n async completePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n lastMergeSourceCommit: string,\n completionOptions: AdoPRCompletionOptions\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n {\n method: 'PATCH',\n body: {\n status: 'completed',\n lastMergeSourceCommit: { commitId: lastMergeSourceCommit },\n completionOptions\n }\n }\n );\n }\n\n async abandonPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'abandoned' } }\n );\n }\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n async setPRVote(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n reviewerId: string,\n vote: number\n ): Promise<unknown> {\n return this.http.ado<unknown>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/reviewers/${encodeURIComponent(reviewerId)}?api-version=${API}`,\n { method: 'PUT', body: { vote } }\n );\n }\n\n async listReviewers(collection: string, project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(collection, project, repo, prId);\n return pr.reviewers;\n }\n\n // ── Threads / Comments ────────────────────────────────────────────\n\n async listThreads(collection: string, project: string, repo: string, prId: number): Promise<AdoPRThread[]> {\n const result = await this.http.ado<AdoPageResponse<AdoPRThread>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async createThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: {\n comments: Array<{ content: string; commentType?: string }>;\n status?: string;\n threadContext?: {\n filePath: string;\n rightFileStart?: { line: number; offset: number };\n rightFileEnd?: { line: number; offset: number };\n leftFileStart?: { line: number; offset: number };\n leftFileEnd?: { line: number; offset: number };\n };\n }\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async addCommentToThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n content: string\n ): Promise<AdoPRComment> {\n return this.http.ado<AdoPRComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments?api-version=${API}`,\n { method: 'POST', body: { content, commentType: 'text' } }\n );\n }\n\n async updateThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n status: string\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}?api-version=${API}`,\n { method: 'PATCH', body: { status } }\n );\n }\n\n async deleteComment(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n commentId: number\n ): Promise<void> {\n await this.http.ado<void>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments/${commentId}?api-version=${API}`,\n { method: 'DELETE' }\n );\n }\n\n // ── Diffs / Files ─────────────────────────────────────────────────\n\n async getPRDiff(collection: string, project: string, repo: string, prId: number): Promise<AdoGitDiff> {\n const pr = await this.getPR(collection, project, repo, prId);\n const sourceCommit = pr.lastMergeSourceCommit?.commitId;\n const targetCommit = pr.lastMergeTargetCommit?.commitId;\n if (!sourceCommit || !targetCommit) return { changes: [], aheadCount: 0, behindCount: 0 };\n return this.http.ado<AdoGitDiff>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/diffs/commits?baseVersion=${encodeURIComponent(targetCommit)}&baseVersionType=commit&targetVersion=${encodeURIComponent(sourceCommit)}&targetVersionType=commit&api-version=${API}`\n );\n }\n\n async getCommitStatuses(collection: string, project: string, repo: string, commitId: string): Promise<AdoGitStatus[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitStatus>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/commits/${encodeURIComponent(commitId)}/statuses?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listPRChanges(collection: string, project: string, repo: string, prId: number): Promise<AdoGitChange[]> {\n const iterations = await this.http.ado<AdoPageResponse<{ id: number }>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations?api-version=${API}`\n );\n // Get the latest iteration then its changes\n const latestId = (iterations.value ?? []).at(-1)?.id;\n if (!latestId) return [];\n const changes = await this.http.ado<{ changeEntries?: AdoGitChange[] }>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations/${latestId}/changes?api-version=${API}`\n );\n return changes.changeEntries ?? [];\n }\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoBuildDefinition,\n AdoBuild,\n AdoBuildLog,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoBuildClient {\n constructor(private http: HttpClient) {}\n\n // ── Definitions ───────────────────────────────────────────────────\n\n async listDefinitions(collection: string, project: string): Promise<AdoBuildDefinition[]> {\n return this.http.adoPaginate<AdoBuildDefinition>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions`,\n { params }\n ) as Promise<{ data: { value: AdoBuildDefinition[] }; headers: Headers }>;\n });\n }\n\n async getDefinition(collection: string, project: string, id: number): Promise<AdoBuildDefinition> {\n return this.http.ado<AdoBuildDefinition>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions/${id}?api-version=${API}`\n );\n }\n\n // ── Builds (runs) ─────────────────────────────────────────────────\n\n async queueBuild(\n collection: string,\n project: string,\n definitionId: number,\n opts: { sourceBranch?: string; parameters?: string } = {}\n ): Promise<AdoBuild> {\n const body: Record<string, unknown> = {\n definition: { id: definitionId },\n ...(opts.sourceBranch ? { sourceBranch: opts.sourceBranch } : {}),\n ...(opts.parameters ? { parameters: opts.parameters } : {})\n };\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async listBuilds(\n collection: string,\n project: string,\n opts: { definitionIds?: number[]; branchName?: string; statusFilter?: string; top?: number } = {}\n ): Promise<AdoBuild[]> {\n return this.http.adoPaginate<AdoBuild>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(opts.definitionIds?.length ? { definitionIds: opts.definitionIds.join(',') } : {}),\n ...(opts.branchName ? { branchName: opts.branchName } : {}),\n ...(opts.statusFilter ? { statusFilter: opts.statusFilter } : {}),\n ...(opts.top ? { '$top': opts.top } : {}),\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds`,\n { params }\n ) as Promise<{ data: { value: AdoBuild[] }; headers: Headers }>;\n });\n }\n\n async getBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`\n );\n }\n\n async cancelBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'cancelling' } }\n );\n }\n\n // ── Logs ──────────────────────────────────────────────────────────\n\n async listLogs(collection: string, project: string, buildId: number): Promise<AdoBuildLog[]> {\n const result = await this.http.ado<AdoPageResponse<AdoBuildLog>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getLog(collection: string, project: string, buildId: number, logId: number): Promise<string> {\n return this.http.adoText(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs/${logId}?api-version=${API}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { log } from '../../lib/output.js';\nimport { AdoCoreClient } from './client/core.js';\nimport { AdoWorkClient } from './client/work.js';\nimport { AdoGitClient } from './client/git.js';\nimport { AdoBuildClient } from './client/build.js';\nimport type { JsonPatchOp } from './client/work.js';\nimport type { AdoBuild } from '../../types/ado.js';\n\nexport interface AdoContext {\n collection: string;\n project: string;\n repo: string;\n coreClient: AdoCoreClient;\n workClient: AdoWorkClient;\n gitClient: AdoGitClient;\n buildClient: AdoBuildClient;\n}\n\n/**\n * Resolves ADO (collection, project, repo) from CLI flags → git remote → config defaults.\n * Mirrors the getClient() helper in bitbucket/commands.ts.\n */\nexport function getAdoContext(program: Command, requireRepo = false): AdoContext {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const ctx = getGitContext(config);\n\n const collection: string =\n opts.collection ?? opts.organization ??\n ctx?.ado?.collection ??\n config.defaults.ado?.collection ?? '';\n\n const project: string =\n opts.project ??\n ctx?.ado?.project ??\n config.defaults.ado?.project ?? '';\n\n const repo: string =\n opts.repo ??\n ctx?.ado?.repo ??\n config.defaults.ado?.repo ?? '';\n\n if (!collection) {\n throw new PncliError(\n 'Could not determine Azure DevOps collection. Pass --collection, or run pncli config init.',\n 1\n );\n }\n\n if (!project) {\n throw new PncliError(\n 'Could not determine Azure DevOps project. Pass --project, or run pncli config init.',\n 1\n );\n }\n\n if (requireRepo && !repo) {\n throw new PncliError(\n 'Could not determine Azure DevOps repo. Pass --repo, or run from inside a checked-out ADO repo.',\n 1\n );\n }\n\n return {\n collection,\n project,\n repo,\n coreClient: new AdoCoreClient(http),\n workClient: new AdoWorkClient(http),\n gitClient: new AdoGitClient(http),\n buildClient: new AdoBuildClient(http)\n };\n}\n\n// ── Field helpers ─────────────────────────────────────────────────────\n\n/**\n * Parses repeated --field name=value arguments into a Record.\n * Accepts \"name=value\" strings (split on first =). Throws on missing `=`.\n */\nexport function parseFieldArgs(fields: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const f of fields) {\n const eq = f.indexOf('=');\n if (eq <= 0) throw new PncliError(`Invalid --field value \"${f}\". Expected format: name=value`, 1);\n result[f.slice(0, eq)] = f.slice(eq + 1);\n }\n return result;\n}\n\n/**\n * Resolves field keys against the loaded alias map, then builds JSON Patch ops.\n * If a key is in fieldAliases → use the reference name. Otherwise use the key as-is.\n */\nexport function buildFieldPatch(\n fields: Record<string, string>,\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n return Object.entries(fields).map(([key, value]) => {\n const refName = fieldAliases[key.toLowerCase()] ?? fieldAliases[key] ?? key;\n return { op: 'add' as const, path: `/fields/${refName}`, value };\n });\n}\n\n/** Convenience: parse --field args and immediately build the patch ops. */\nexport function fieldArgsToPatch(\n fieldArgs: string[],\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n return buildFieldPatch(parseFieldArgs(fieldArgs), fieldAliases);\n}\n\n// ── Vote constants ────────────────────────────────────────────────────\n\nexport const PR_VOTE = {\n APPROVE: 10,\n APPROVE_WITH_SUGGESTIONS: 5,\n NO_VOTE: 0,\n WAIT_FOR_AUTHOR: -5,\n REJECT: -10\n} as const;\n\n// ── Build polling ─────────────────────────────────────────────────────\n\nconst TERMINAL_STATUSES = new Set(['completed']);\n\nexport function isBuildTerminal(build: AdoBuild): boolean {\n return TERMINAL_STATUSES.has(build.status);\n}\n\nexport interface PollOpts {\n timeoutSec: number;\n pollSec: number;\n}\n\n/**\n * Polls fetchStatus() until isTerminal() returns true or timeout is reached.\n * Progress lines emitted via log() (verbose-only stderr); stdout stays clean.\n */\nexport async function pollUntilTerminal<T>(\n fetchStatus: () => Promise<T>,\n isTerminal: (s: T) => boolean,\n opts: PollOpts\n): Promise<T> {\n const deadline = Date.now() + opts.timeoutSec * 1000;\n let status = await fetchStatus();\n\n while (!isTerminal(status)) {\n if (Date.now() >= deadline) {\n throw new PncliError(\n `Timed out waiting for completion after ${opts.timeoutSec}s`,\n 1\n );\n }\n log(`Waiting ${opts.pollSec}s...`);\n await new Promise(resolve => setTimeout(resolve, opts.pollSec * 1000));\n status = await fetchStatus();\n }\n\n return status;\n}\n","import { Command } from 'commander';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoProjectCommands(ado: Command): void {\n const project = ado\n .command('project')\n .description('Azure DevOps project and collection operations');\n\n project\n .command('list-collections')\n .description('List all project collections on the server')\n .action(async () => {\n const start = Date.now();\n try {\n const { coreClient } = getAdoContext(ado);\n const data = await coreClient.listCollections();\n success(data, 'ado', 'project-list-collections', start);\n } catch (err) { fail(err, 'ado', 'project-list-collections', start); }\n });\n\n project\n .command('list')\n .description('List team projects in a collection')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.listProjects(collection);\n success(data, 'ado', 'project-list', start);\n } catch (err) { fail(err, 'ado', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a team project by name')\n .requiredOption('--name <project>', 'Project name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getProject(collection, opts.name);\n success(data, 'ado', 'project-get', start);\n } catch (err) { fail(err, 'ado', 'project-get', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, fieldArgsToPatch } from '../helpers.js';\nimport { discoverFields, discoverTypeFields, discoverTypes, buildDefaultAliases } from '../discovery.js';\nimport { success, fail, warn } from '../../../lib/output.js';\nimport { loadConfig, getGlobalConfigPath } from '../../../lib/config.js';\n\nexport function registerAdoWorkCommands(ado: Command): void {\n const work = ado\n .command('work')\n .description('Azure DevOps work item operations');\n\n // ── Get ───────────────────────────────────────────────────────────\n\n work\n .command('get')\n .description('Get a work item by ID')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.getWorkItem(collection, parseInt(opts.id, 10));\n success(data, 'ado', 'work-get', start);\n } catch (err) { fail(err, 'ado', 'work-get', start); }\n });\n\n // ── Create ────────────────────────────────────────────────────────\n\n work\n .command('create')\n .description('Create a work item')\n .requiredOption('--type <type>', 'Work item type (e.g. Bug, Task, User Story)')\n .requiredOption('--title <title>', 'Work item title')\n .option('--description <text>', 'Description')\n .option('--assignee <user>', 'Assigned to (display name or email)')\n .option('--priority <n>', 'Priority (1-4)')\n .option('--parent <id>', 'Parent work item ID — creates a parent link after creation')\n .option('--field <name=value>', 'Additional field (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .action(async (opts: { type: string; title: string; description?: string; assignee?: string; priority?: string; parent?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, project, workClient } = getAdoContext(ado);\n const builtIn: Record<string, string> = {\n 'System.Title': opts.title,\n ...(opts.description ? { 'System.Description': opts.description } : {}),\n ...(opts.assignee ? { 'System.AssignedTo': opts.assignee } : {}),\n ...(opts.priority ? { 'Microsoft.VSTS.Common.Priority': opts.priority } : {})\n };\n const extra = fieldArgsToPatch(opts.field, config.ado.fieldAliases);\n const patch = [\n ...Object.entries(builtIn).map(([k, v]) => ({ op: 'add' as const, path: `/fields/${k}`, value: v })),\n ...extra\n ];\n const data = await workClient.createWorkItem(collection, project, opts.type, patch);\n success(data, 'ado', 'work-create', start);\n if (opts.parent) {\n try {\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.parent}`;\n const linkPatch = [{ op: 'add' as const, path: '/relations/-', value: { rel: 'System.LinkTypes.Hierarchy-Reverse', url: targetUrl } }];\n await workClient.updateWorkItem(collection, data.id, linkPatch);\n } catch (linkErr) {\n warn(`Created #${data.id} but failed to link to parent ${opts.parent}: ${linkErr instanceof Error ? linkErr.message : linkErr}`);\n }\n }\n return;\n } catch (err) { fail(err, 'ado', 'work-create', start); }\n });\n\n // ── Update ────────────────────────────────────────────────────────\n\n work\n .command('update')\n .description('Update a work item field')\n .requiredOption('--id <n>', 'Work item ID')\n .option('--field <name=value>', 'Field to update (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .action(async (opts: { id: string; field: string[] }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n const patch = fieldArgsToPatch(opts.field, config.ado.fieldAliases);\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-update', start);\n } catch (err) { fail(err, 'ado', 'work-update', start); }\n });\n\n // ── Transition (wrapper over update for System.State) ─────────────\n\n work\n .command('transition')\n .description('Set the state of a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--state <state>', 'New state (e.g. Active, Resolved, Closed)')\n .action(async (opts: { id: string; state: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.State', value: opts.state }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-transition', start);\n } catch (err) { fail(err, 'ado', 'work-transition', start); }\n });\n\n // ── Assign ────────────────────────────────────────────────────────\n\n work\n .command('assign')\n .description('Assign a work item to a user')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--to <user>', 'User display name or email')\n .action(async (opts: { id: string; to: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.AssignedTo', value: opts.to }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-assign', start);\n } catch (err) { fail(err, 'ado', 'work-assign', start); }\n });\n\n // ── Link ──────────────────────────────────────────────────────────\n\n work\n .command('link')\n .description('Link two work items')\n .requiredOption('--id <a>', 'Source work item ID')\n .requiredOption('--to <b>', 'Target work item ID')\n .option('--type <rel>', 'Link type (related|parent|child|duplicate|duplicate-of)', 'related')\n .action(async (opts: { id: string; to: string; type: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n // AzDO rel strings\n const relMap: Record<string, string> = {\n related: 'System.LinkTypes.Related',\n parent: 'System.LinkTypes.Hierarchy-Reverse',\n child: 'System.LinkTypes.Hierarchy-Forward',\n duplicate: 'System.LinkTypes.Duplicate-Forward',\n 'duplicate-of': 'System.LinkTypes.Duplicate-Reverse'\n };\n const rel = relMap[opts.type] ?? opts.type;\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.to}`;\n const patch = [{ op: 'add' as const, path: '/relations/-', value: { rel, url: targetUrl } }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-link', start);\n } catch (err) { fail(err, 'ado', 'work-link', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────\n\n work\n .command('search')\n .description('Run a WIQL query (consider --output-file for large results)')\n .requiredOption('--wiql <query>', 'WIQL query string')\n .action(async (opts: { wiql: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.queryWiql(collection, project, opts.wiql);\n success(data, 'ado', 'work-search', start);\n } catch (err) { fail(err, 'ado', 'work-search', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────\n\n work\n .command('list-comments')\n .description('List comments on a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listComments(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'work-list-comments', start);\n } catch (err) { fail(err, 'ado', 'work-list-comments', start); }\n });\n\n work\n .command('add-comment')\n .description('Add a comment to a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { id: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.addComment(collection, project, parseInt(opts.id, 10), opts.body);\n success(data, 'ado', 'work-add-comment', start);\n } catch (err) { fail(err, 'ado', 'work-add-comment', start); }\n });\n\n // ── Type / Field discovery ────────────────────────────────────────\n\n work\n .command('types')\n .description('List work item types in the project')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered types to ~/.pncli/config.json')\n .action(async (opts: { save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n const types = await discoverTypes(workClient, collection, project);\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n existing.ado = { ...(existing.ado ?? {}), discoveredTypes: types };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${types.length} types to ${globalConfigPath}`);\n }\n success(types, 'ado', 'work-types', start);\n } catch (err) { fail(err, 'ado', 'work-types', start); }\n });\n\n work\n .command('list-states')\n .description('List valid states for a work item type')\n .requiredOption('--type <type>', 'Work item type name (e.g. Bug)')\n .action(async (opts: { type: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listTypeStates(collection, project, opts.type);\n success(data, 'ado', 'work-list-states', start);\n } catch (err) { fail(err, 'ado', 'work-list-states', start); }\n });\n\n work\n .command('fields')\n .description('List work item fields available in the collection (consider --output-file for large results)')\n .option('--type <type>', 'Scope to fields for a specific work item type (e.g. Bug)')\n .option('--custom-only', 'Exclude System.* and Microsoft.VSTS.* fields')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered fields and aliases to ~/.pncli/config.json')\n .action(async (opts: { type?: string; customOnly?: boolean; save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n // Fetch full field list (used for alias generation and --save)\n const allFields = opts.type\n ? await discoverTypeFields(workClient, collection, project, opts.type)\n : await discoverFields(workClient, collection);\n // Apply --custom-only filter only to displayed/saved output\n const fields = opts.customOnly\n ? allFields.filter(f =>\n !f.referenceName.startsWith('System.') &&\n !f.referenceName.startsWith('Microsoft.VSTS.')\n )\n : allFields;\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n // Generate aliases from the full (unfiltered) set so System/VSTS aliases are included\n const aliases = buildDefaultAliases(allFields);\n existing.ado = { ...(existing.ado ?? {}), discoveredFields: allFields, fieldAliases: aliases };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${allFields.length} fields and ${Object.keys(aliases).length} aliases to ${globalConfigPath}`);\n }\n success(fields, 'ado', 'work-fields', start);\n } catch (err) { fail(err, 'ado', 'work-fields', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, PR_VOTE } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\nimport type { AdoPRThread, AdoPRComment } from '../../../types/ado.js';\n\n/** Flatten all comments across all threads into a sorted list with threadContext attached */\nfunction flattenThreadComments(\n threads: AdoPRThread[],\n filterInlineOnly: boolean,\n filterGeneralOnly: boolean\n): Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> {\n const flat: Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> = [];\n for (const thread of threads) {\n if (thread.isDeleted) continue;\n if (filterInlineOnly && !thread.threadContext) continue;\n if (filterGeneralOnly && thread.threadContext) continue;\n for (const comment of thread.comments) {\n if (comment.isDeleted) continue;\n flat.push({ ...comment, threadId: thread.id, threadContext: thread.threadContext ?? null });\n }\n }\n return flat.sort((a, b) => a.publishedDate.localeCompare(b.publishedDate));\n}\n\nexport function registerAdoRepoCommands(ado: Command): void {\n const repo = ado\n .command('repo')\n .description('Azure DevOps repository and pull request operations');\n\n // ── Repos ─────────────────────────────────────────────────────────\n\n repo\n .command('list')\n .description('List git repositories in the project')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, gitClient } = getAdoContext(ado);\n const data = await gitClient.listRepos(collection, project);\n success(data, 'ado', 'repo-list', start);\n } catch (err) { fail(err, 'ado', 'repo-list', start); }\n });\n\n repo\n .command('get')\n .description('Get a specific repository')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, repo: repoName, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getRepo(collection, project, repoName);\n success(data, 'ado', 'repo-get', start);\n } catch (err) { fail(err, 'ado', 'repo-get', start); }\n });\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n repo\n .command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: active|abandoned|completed|all', 'active')\n .option('--creator <alias>', 'Filter by creator')\n .option('--reviewer <alias>', 'Filter by reviewer')\n .action(async (opts: { state?: string; creator?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRs(collection, project, repo, {\n status: opts.state,\n creatorAlias: opts.creator,\n reviewerAlias: opts.reviewer\n });\n success(data, 'ado', 'repo-list-prs', start);\n } catch (err) { fail(err, 'ado', 'repo-list-prs', start); }\n });\n\n repo\n .command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-get-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-get-pr', start); }\n });\n\n repo\n .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 (default: main)', 'main')\n .option('--description <text>', 'PR description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs or display names')\n .action(async (opts: { title: string; source: string; target: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : [];\n const data = await gitClient.createPR(collection, project, repo, {\n title: opts.title,\n description: opts.description,\n sourceRefName: `refs/heads/${opts.source}`,\n targetRefName: `refs/heads/${opts.target}`,\n reviewers\n });\n success(data, 'ado', 'repo-create-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-create-pr', start); }\n });\n\n repo\n .command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <text>', 'New description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : undefined;\n const body: Record<string, unknown> = {};\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (reviewers) body.reviewers = reviewers;\n const data = await gitClient.updatePR(collection, project, repo, parseInt(opts.id, 10), body);\n success(data, 'ado', 'repo-update-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-update-pr', start); }\n });\n\n repo\n .command('merge-pr')\n .description('Complete (merge) a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--strategy <s>', 'Merge strategy: noFastForward|squash|rebase|rebaseMerge', 'noFastForward')\n .option('--delete-source', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy: string; deleteSource?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const prId = parseInt(opts.id, 10);\n const pr = await gitClient.getPR(collection, project, repo, prId);\n const data = await gitClient.completePR(\n collection, project, repo, prId,\n pr.lastMergeSourceCommit?.commitId ?? '',\n {\n mergeStrategy: opts.strategy as 'noFastForward' | 'squash' | 'rebase' | 'rebaseMerge',\n deleteSourceBranch: opts.deleteSource ?? false\n }\n );\n success(data, 'ado', 'repo-merge-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-merge-pr', start); }\n });\n\n repo\n .command('abandon-pr')\n .description('Abandon a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.abandonPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-abandon-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-abandon-pr', start); }\n });\n\n // ── Comments (threads) ────────────────────────────────────────────\n\n repo\n .command('list-comments')\n .description('List all comments on a pull request (general + inline)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general PR comments')\n .action(async (opts: { pr: string; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const threads = await gitClient.listThreads(collection, project, repo, parseInt(opts.pr, 10));\n const flat = flattenThreadComments(threads, opts.inlineOnly ?? false, opts.generalOnly ?? false);\n success(flat, 'ado', 'repo-list-comments', start);\n } catch (err) { fail(err, 'ado', 'repo-list-comments', start); }\n });\n\n repo\n .command('add-comment')\n .description('Add a general comment to a pull request')\n .requiredOption('--pr <n>', '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 { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active'\n });\n success(data, 'ado', 'repo-add-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-comment', start); }\n });\n\n repo\n .command('add-inline-comment')\n .description('Add an inline comment on a file in a pull request')\n .requiredOption('--pr <n>', '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 <side>', 'Line side: left|right (default: right)', 'right')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const lineNum = parseInt(opts.line, 10);\n const isRight = opts.lineType !== 'left';\n const lineRange = isRight\n ? { rightFileStart: { line: lineNum, offset: 1 }, rightFileEnd: { line: lineNum, offset: 1 } }\n : { leftFileStart: { line: lineNum, offset: 1 }, leftFileEnd: { line: lineNum, offset: 1 } };\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active',\n threadContext: { filePath: opts.file, ...lineRange }\n });\n success(data, 'ado', 'repo-add-inline-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-inline-comment', start); }\n });\n\n repo\n .command('reply-comment')\n .description('Reply to a comment thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; threadId: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.addCommentToThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), opts.body\n );\n success(data, 'ado', 'repo-reply-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-reply-comment', start); }\n });\n\n repo\n .command('resolve-comment')\n .description('Mark a comment thread as resolved (fixed)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .action(async (opts: { pr: string; threadId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.updateThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), 'fixed'\n );\n success(data, 'ado', 'repo-resolve-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-resolve-comment', start); }\n });\n\n repo\n .command('delete-comment')\n .description('Delete a comment from a thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .action(async (opts: { pr: string; threadId: string; commentId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n await gitClient.deleteComment(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), parseInt(opts.commentId, 10)\n );\n success({ deleted: true }, 'ado', 'repo-delete-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-delete-comment', start); }\n });\n\n // ── Files / Diffs ─────────────────────────────────────────────────\n\n repo\n .command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRChanges(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-files', start);\n } catch (err) { fail(err, 'ado', 'repo-list-files', start); }\n });\n\n repo\n .command('diff')\n .description('Show files changed in a pull request with change types and commit metadata')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--path <p>', 'Filter diff to a specific file path')\n .action(async (opts: { pr: string; path?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPRDiff(collection, project, repo, parseInt(opts.pr, 10));\n if (opts.path) {\n if (opts.path) {\n const needle = opts.path.startsWith('/') ? opts.path : `/${opts.path}`;\n data.changes = (data.changes ?? []).filter(c => c.item.path === needle);\n }\n }\n success(data, 'ado', 'repo-diff', start);\n } catch (err) { fail(err, 'ado', 'repo-diff', start); }\n });\n\n // ── Build statuses ────────────────────────────────────────────────\n\n repo\n .command('get-build-status')\n .description('Get CI/build statuses posted to a commit')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getCommitStatuses(collection, project, repo, opts.commit);\n success(data, 'ado', 'repo-get-build-status', start);\n } catch (err) { fail(err, 'ado', 'repo-get-build-status', start); }\n });\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n repo\n .command('list-reviewers')\n .description('List reviewers on a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listReviewers(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-reviewers', start);\n } catch (err) { fail(err, 'ado', 'repo-list-reviewers', start); }\n });\n\n const voteCmd = (\n name: string,\n description: string,\n vote: number,\n action: string\n ) => {\n repo\n .command(name)\n .description(description)\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const { loadConfig: lc } = await import('../../../lib/config.js');\n const config = lc({ configPath: globalOpts.config });\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n // Self-identity: use connection data\n const { AdoCoreClient } = await import('../client/core.js');\n const { createHttpClient } = await import('../../../lib/http.js');\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const coreClient = new AdoCoreClient(http);\n const me = await coreClient.getConnectionData(collection);\n const myId = me.authenticatedUser.id;\n const data = await gitClient.setPRVote(collection, project, repo, parseInt(opts.pr, 10), myId, vote);\n success(data, 'ado', action, start);\n } catch (err) { fail(err, 'ado', action, start); }\n });\n };\n\n voteCmd('approve', 'Approve a pull request', PR_VOTE.APPROVE, 'repo-approve');\n voteCmd('unapprove', 'Remove approval from a pull request', PR_VOTE.NO_VOTE, 'repo-unapprove');\n voteCmd('wait-for-author', 'Mark a pull request as waiting for author', PR_VOTE.WAIT_FOR_AUTHOR, 'repo-wait-for-author');\n\n // ── Builds for PR ─────────────────────────────────────────────────\n\n repo\n .command('list-builds')\n .description('List builds associated with a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient, buildClient } = getAdoContext(ado, true);\n const pr = await gitClient.getPR(collection, project, repo, parseInt(opts.pr, 10));\n const data = await buildClient.listBuilds(collection, project, {\n branchName: pr.sourceRefName\n });\n success(data, 'ado', 'repo-list-builds', start);\n } catch (err) { fail(err, 'ado', 'repo-list-builds', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, pollUntilTerminal, isBuildTerminal } from '../helpers.js';\nimport { success, fail, log } from '../../../lib/output.js';\nimport { ExitCode } from '../../../lib/exitCodes.js';\nimport { PncliError } from '../../../lib/errors.js';\n\nexport function registerAdoPipelineCommands(ado: Command): void {\n const pipeline = ado\n .command('pipeline')\n .description('Azure DevOps pipeline (build) operations');\n\n pipeline\n .command('list')\n .description('List pipeline definitions')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.listDefinitions(collection, project);\n success(data, 'ado', 'pipeline-list', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get a pipeline definition by ID')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getDefinition(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Queue a pipeline run')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .option('--branch <ref>', 'Source branch (e.g. refs/heads/main or main)')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the run to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds (default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { id: string; branch?: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const sourceBranch = opts.branch\n ? (opts.branch.startsWith('refs/') ? opts.branch : `refs/heads/${opts.branch}`)\n : undefined;\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const parameters = opts.parameter.length > 0\n ? JSON.stringify(Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n })))\n : undefined;\n\n let build = await buildClient.queueBuild(collection, project, parseInt(opts.id, 10), {\n sourceBranch,\n parameters\n });\n log(`Queued build #${build.id} (${build.buildNumber}) — status: ${build.status}`);\n\n if (opts.wait) {\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n log(`Waiting for build #${build.id} to complete (timeout ${timeoutSec}s, poll ${pollSec}s)...`);\n build = await pollUntilTerminal(\n () => buildClient.getBuild(collection, project, build.id),\n isBuildTerminal,\n { timeoutSec, pollSec }\n );\n if (build.result && build.result !== 'succeeded') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n }\n\n success(build, 'ado', 'pipeline-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List pipeline runs')\n .option('--definition <id>', 'Filter by definition ID')\n .option('--branch <ref>', 'Filter by branch name')\n .option('--status <filter>', 'Filter by status (inProgress|completed|cancelling|...)')\n .option('--top <n>', 'Maximum results', '50')\n .action(async (opts: { definition?: string; branch?: string; status?: string; top: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.listBuilds(collection, project, {\n definitionIds: opts.definition ? [parseInt(opts.definition, 10)] : undefined,\n branchName: opts.branch,\n statusFilter: opts.status,\n top: parseInt(opts.top, 10)\n });\n success(data, 'ado', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get a pipeline run by build ID')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('cancel-run')\n .description('Cancel a running pipeline build')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.cancelBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-cancel-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-cancel-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('List or retrieve build logs (consider --output-file for large logs)')\n .requiredOption('--id <n>', 'Build ID')\n .option('--log-id <n>', 'Specific log ID (omit to list all logs)')\n .action(async (opts: { id: string; logId?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const buildId = parseInt(opts.id, 10);\n if (opts.logId) {\n const data = await buildClient.getLog(collection, project, buildId, parseInt(opts.logId, 10));\n success({ log: data }, 'ado', 'pipeline-logs', start);\n } else {\n const data = await buildClient.listLogs(collection, project, buildId);\n success(data, 'ado', 'pipeline-logs', start);\n }\n } catch (err) { fail(err, 'ado', 'pipeline-logs', start); }\n });\n}\n","import { Command } from 'commander';\nimport { registerAdoProjectCommands } from './project.js';\nimport { registerAdoWorkCommands } from './work.js';\nimport { registerAdoRepoCommands } from './repo.js';\nimport { registerAdoPipelineCommands } from './pipeline.js';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoCommands(program: Command): void {\n const ado = program\n .command('ado')\n .description('Azure DevOps Server operations')\n .option('--collection <name>', 'Azure DevOps collection (organization)')\n .option('--organization <name>', 'Alias for --collection')\n .option('--project <name>', 'Azure DevOps team project')\n .option('--repo <name>', 'Azure DevOps git repository name');\n\n // ── Top-level commands ─────────────────────────────────────────────\n\n ado\n .command('whoami')\n .description('Show current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'whoami', start);\n } catch (err) { fail(err, 'ado', 'whoami', start); }\n });\n\n ado\n .command('connection-data')\n .description('Show raw connection data from the ADO server')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'connection-data', start);\n } catch (err) { fail(err, 'ado', 'connection-data', start); }\n });\n\n // ── Subcommand groups ──────────────────────────────────────────────\n\n registerAdoProjectCommands(ado);\n registerAdoWorkCommands(ado);\n registerAdoRepoCommands(ado);\n registerAdoPipelineCommands(ado);\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n JenkinsJob,\n JenkinsJobDetail,\n JenkinsBuild,\n JenkinsListJobsResponse,\n JenkinsQueueItem\n} from '../../types/jenkins.js';\n\n/** Converts a multi-level Jenkins job name (e.g. `A/B/C`) into the correct\n * URL path segment (e.g. `A/job/B/job/C`). Single-level names are unchanged.\n * Each segment is individually percent-encoded. */\nfunction jobPath(name: string): string {\n return name.split('/').map(encodeURIComponent).join('/job/');\n}\n\nexport class JenkinsClient {\n constructor(private http: HttpClient) {}\n\n async listJobs(): Promise<JenkinsJob[]> {\n const data = await this.http.jenkins<JenkinsListJobsResponse>(\n '/api/json',\n { params: { tree: 'jobs[name,url,color,description,buildable,lastBuild[number,url,result]]' } }\n );\n return data.jobs;\n }\n\n async getJob(name: string): Promise<JenkinsJobDetail> {\n return this.http.jenkins<JenkinsJobDetail>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: 'name,url,color,description,buildable,nextBuildNumber,inQueue,lastBuild[number,url,result],builds[number,url,result,duration,timestamp,building,displayName]{0,10}' } }\n );\n }\n\n async triggerBuild(\n name: string,\n params?: Record<string, string>\n ): Promise<{ queueItemId: number }> {\n const hasParams = params && Object.keys(params).length > 0;\n const endpoint = hasParams\n ? `/job/${jobPath(name)}/buildWithParameters`\n : `/job/${jobPath(name)}/build`;\n\n const res = await this.http.jenkinsRaw(endpoint, {\n method: 'POST',\n params: hasParams ? params : undefined\n });\n\n const location = res.headers.get('Location') ?? '';\n const match = location.match(/\\/queue\\/item\\/(\\d+)\\/?$/);\n if (!match) throw new PncliError('Build queued but Jenkins did not return a Location header — cannot track queue item');\n const queueItemId = parseInt(match[1]!, 10);\n return { queueItemId };\n }\n\n async getQueueItem(queueItemId: number): Promise<JenkinsQueueItem> {\n return this.http.jenkins<JenkinsQueueItem>(`/queue/item/${queueItemId}/api/json`);\n }\n\n async listBuilds(name: string, top = 25): Promise<Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[]> {\n const data = await this.http.jenkins<{ builds: Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[] }>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: `builds[number,url,result,duration,timestamp,building,displayName,fullDisplayName,description,id,queueId]{0,${top}}` } }\n );\n return data.builds ?? [];\n }\n\n async getBuild(name: string, buildNumber: number): Promise<JenkinsBuild> {\n return this.http.jenkins<JenkinsBuild>(\n `/job/${jobPath(name)}/${buildNumber}/api/json`\n );\n }\n\n async getConsoleLog(name: string, buildNumber: number): Promise<string> {\n const res = await this.http.jenkinsRaw(\n `/job/${jobPath(name)}/${buildNumber}/consoleText`,\n { method: 'GET' }\n );\n return res.text;\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { JenkinsClient } from './client.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { JenkinsBuild } from '../../types/jenkins.js';\n\nfunction getClient(program: Command): JenkinsClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.jenkins.baseUrl) throw new PncliError('Jenkins not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JenkinsClient(http);\n}\n\nasync function pollQueueItem(\n client: JenkinsClient,\n queueItemId: number,\n pollMs: number,\n timeoutMs: number\n): Promise<number> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const item = await client.getQueueItem(queueItemId);\n if (item.executable?.number !== undefined) return item.executable.number;\n if (item.why === null && !item.blocked && !item.buildable) {\n throw new PncliError('Build was cancelled while in queue', 1);\n }\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build to leave queue after ${timeoutMs / 1000}s`, 1);\n}\n\nasync function pollBuildComplete(\n client: JenkinsClient,\n jobName: string,\n buildNumber: number,\n pollMs: number,\n timeoutMs: number\n): Promise<JenkinsBuild> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const build = await client.getBuild(jobName, buildNumber);\n if (!build.building) return build;\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build #${buildNumber} to complete after ${timeoutMs / 1000}s`, 1);\n}\n\nexport function registerJenkinsCommands(program: Command): void {\n const jenkins = program.command('jenkins').description('Jenkins Data Center operations');\n const pipeline = jenkins.command('pipeline').description('Pipeline (job/build) operations');\n\n pipeline\n .command('list')\n .description('List all jobs on the Jenkins instance')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listJobs();\n success(data, 'jenkins', 'pipeline-list', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get details for a specific job')\n .requiredOption('--name <job>', 'Job name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getJob(opts.name);\n success(data, 'jenkins', 'pipeline-get', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Trigger a build')\n .requiredOption('--name <job>', 'Job name')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the build to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds per phase (queue-wait and build-wait each get this budget; default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { name: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const params = opts.parameter.length > 0\n ? Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n }))\n : undefined;\n\n const { queueItemId } = await client.triggerBuild(opts.name, params);\n log(`Queued build (queue item #${queueItemId})`);\n\n if (!opts.wait) {\n success({ queueItemId }, 'jenkins', 'pipeline-run', start);\n return;\n }\n\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n\n log(`Waiting for build to start (timeout ${timeoutSec}s)...`);\n const buildNumber = await pollQueueItem(client, queueItemId, pollSec * 1000, timeoutSec * 1000);\n log(`Build #${buildNumber} started — waiting for completion...`);\n\n const build = await pollBuildComplete(client, opts.name, buildNumber, pollSec * 1000, timeoutSec * 1000);\n if (build.result !== null && build.result !== 'SUCCESS') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n success(build, 'jenkins', 'pipeline-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List recent builds for a job')\n .requiredOption('--name <job>', 'Job name')\n .option('--top <n>', 'Maximum number of builds to return (default 25)', '25')\n .action(async (opts: { name: string; top: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const top = parseInt(opts.top, 10);\n if (isNaN(top) || top <= 0) throw new PncliError(`Invalid --top \"${opts.top}\". Expected a positive integer.`, 1);\n const data = await client.listBuilds(opts.name, top);\n success(data, 'jenkins', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get details for a specific build')\n .requiredOption('--name <job>', 'Job name')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const data = await client.getBuild(opts.name, buildNumber);\n success(data, 'jenkins', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('Fetch console log for a build (consider --output-file for large logs)')\n .requiredOption('--name <job>', 'Job name')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const text = await client.getConsoleLog(opts.name, buildNumber);\n success({ log: text }, 'jenkins', 'pipeline-logs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-logs', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n ArtifactoryRepository,\n ArtifactoryStorageInfo,\n ArtifactoryProperties,\n ArtifactoryAqlResult,\n ArtifactoryAqlArtifact,\n ArtifactoryBuildInfo,\n ArtifactoryBuildList,\n ArtifactoryBuildRuns\n} from '../../types/artifactory.js';\n\nconst API = 'api';\n\nexport interface ListReposOpts {\n type?: 'local' | 'virtual' | 'remote' | 'federated';\n packageType?: string;\n}\n\nexport interface SearchAqlOpts {\n repo?: string;\n name?: string;\n path?: string;\n before?: string;\n after?: string;\n limit?: number;\n includeProperties?: boolean;\n}\n\nexport interface SetPropertiesOpts {\n recursive?: boolean;\n}\n\nexport class ArtifactoryClient {\n constructor(private http: HttpClient) {}\n\n async ping(): Promise<string> {\n return this.http.artifactoryText(`${API}/system/ping`);\n }\n\n async listRepos(opts: ListReposOpts = {}): Promise<ArtifactoryRepository[]> {\n return this.http.artifactory<ArtifactoryRepository[]>(`${API}/repositories`, {\n params: {\n type: opts.type,\n packageType: opts.packageType\n }\n });\n }\n\n async getStorageInfo(repo: string, path: string): Promise<ArtifactoryStorageInfo> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryStorageInfo>(`${API}/storage/${repo}/${cleanPath}`);\n }\n\n async getProperties(repo: string, path: string): Promise<ArtifactoryProperties> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryProperties>(`${API}/storage/${repo}/${cleanPath}`, {\n params: { properties: '' }\n });\n }\n\n async setProperties(repo: string, path: string, properties: Record<string, string>, opts: SetPropertiesOpts = {}): Promise<void> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n const propString = Object.entries(properties)\n .map(([k, v]) => `${k}=${v}`)\n .join(';');\n await this.http.artifactory<void>(`${API}/storage/${repo}/${cleanPath}`, {\n method: 'PUT',\n params: {\n properties: propString,\n ...(opts.recursive ? { recursive: 1 } : {})\n }\n });\n }\n\n async searchAql(opts: SearchAqlOpts = {}): Promise<ArtifactoryAqlResult<ArtifactoryAqlArtifact>> {\n const criteria: string[] = [];\n\n if (opts.repo) criteria.push(`\"repo\": {\"$eq\": \"${opts.repo}\"}`);\n if (opts.name) criteria.push(`\"name\": {\"$match\": \"${opts.name}\"}`);\n if (opts.path) criteria.push(`\"path\": {\"$match\": \"${opts.path}\"}`);\n if (opts.after) criteria.push(`\"created\": {\"$gt\": \"${opts.after}\"}`);\n if (opts.before) criteria.push(`\"created\": {\"$lt\": \"${opts.before}\"}`);\n\n const findClause = criteria.length > 0\n ? `{${criteria.join(',')}}`\n : '{}';\n\n const includeFields = opts.includeProperties\n ? '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\",\"properties\")'\n : '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\")';\n\n const sortClause = '.sort({\"$desc\": [\"created\"]})';\n const limitClause = opts.limit ? `.limit(${opts.limit})` : '.limit(100)';\n\n const aql = `items.find(${findClause})${includeFields}${sortClause}${limitClause}`;\n\n return this.http.artifactory<ArtifactoryAqlResult<ArtifactoryAqlArtifact>>(`${API}/search/aql`, {\n method: 'POST',\n body: aql,\n headers: { 'Content-Type': 'text/plain' }\n });\n }\n\n async listBuilds(): Promise<ArtifactoryBuildList> {\n return this.http.artifactory<ArtifactoryBuildList>(`${API}/build`);\n }\n\n async listBuildRuns(buildName: string): Promise<ArtifactoryBuildRuns> {\n return this.http.artifactory<ArtifactoryBuildRuns>(`${API}/build/${encodeURIComponent(buildName)}`);\n }\n\n async getBuildInfo(buildName: string, buildNumber: string): Promise<ArtifactoryBuildInfo> {\n return this.http.artifactory<ArtifactoryBuildInfo>(\n `${API}/build/${encodeURIComponent(buildName)}/${encodeURIComponent(buildNumber)}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { ArtifactoryClient } from './client.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';\n\nfunction getClient(program: Command): ArtifactoryClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.artifactory.baseUrl) throw new PncliError('Artifactory not configured. Run: pncli config init');\n if (!config.artifactory.token) throw new PncliError('Artifactory token not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ArtifactoryClient(http);\n}\n\nexport function registerArtifactoryCommands(program: Command): void {\n const art = program.command('artifactory').description('Artifactory operations');\n\n // ── Ping ──────────────────────────────────────────────────────────────────\n\n art.command('ping')\n .description('Check Artifactory connectivity and authentication')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.ping();\n success(data, 'artifactory', 'ping', start);\n } catch (err) { fail(err, 'artifactory', 'ping', start); }\n });\n\n // ── Repos ─────────────────────────────────────────────────────────────────\n\n art.command('repos')\n .description('List repositories')\n .option('--type <type>', 'Filter by type: local, virtual, remote, federated')\n .option('--package-type <type>', 'Filter by package type: npm, maven, nuget, docker, pypi, etc.')\n .action(async (opts: { type?: string; packageType?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listRepos({ type: opts.type as 'local' | 'virtual' | 'remote' | 'federated' | undefined, packageType: opts.packageType });\n success(data, 'artifactory', 'repos', start);\n } catch (err) { fail(err, 'artifactory', 'repos', start); }\n });\n\n // ── Artifact info ─────────────────────────────────────────────────────────\n\n art.command('artifact-info <repo> <path>')\n .description('Get metadata for an artifact or folder (checksums, size, timestamps)')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getStorageInfo(repo, path);\n success(data, 'artifactory', 'artifact-info', start);\n } catch (err) { fail(err, 'artifactory', 'artifact-info', start); }\n });\n\n // ── Properties get ────────────────────────────────────────────────────────\n\n art.command('properties-get <repo> <path>')\n .description('Read custom properties on an artifact')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getProperties(repo, path);\n success(data, 'artifactory', 'properties-get', start);\n } catch (err) { fail(err, 'artifactory', 'properties-get', start); }\n });\n\n // ── Properties set ────────────────────────────────────────────────────────\n\n art.command('properties-set <repo> <path> [keyvals...]')\n .description('Set custom properties on an artifact (format: key=value key=value...)')\n .option('--recursive', 'Apply recursively to folder contents', false)\n .action(async (repo: string, path: string, keyvals: string[], opts: { recursive: boolean }) => {\n const start = Date.now();\n try {\n if (!keyvals.length) throw new PncliError('Provide at least one key=value pair');\n const properties: Record<string, string> = {};\n for (const kv of keyvals) {\n const eq = kv.indexOf('=');\n if (eq < 1) throw new PncliError(`Invalid property format: \"${kv}\" — expected key=value`);\n properties[kv.slice(0, eq)] = kv.slice(eq + 1);\n }\n const client = getClient(program);\n await client.setProperties(repo, path, properties, { recursive: opts.recursive });\n success({ repo, path, properties }, 'artifactory', 'properties-set', start);\n } catch (err) { fail(err, 'artifactory', 'properties-set', start); }\n });\n\n // ── AQL search ────────────────────────────────────────────────────────────\n\n art.command('search')\n .description('Search artifacts using AQL (Artifactory Query Language) (consider --output-file for large results)')\n .option('--repo <name>', 'Filter by repository key')\n .option('--name <pattern>', 'Filter by artifact name (supports * and ? wildcards)')\n .option('--path <pattern>', 'Filter by artifact path (supports * and ? wildcards)')\n .option('--after <date>', 'Created after this date (ISO 8601, e.g. 2024-01-01)')\n .option('--before <date>', 'Created before this date (ISO 8601)')\n .option('--limit <n>', 'Maximum results to return (default: 100)', '100')\n .option('--properties', 'Include artifact properties in results', false)\n .action(async (opts: { repo?: string; name?: string; path?: string; after?: string; before?: string; limit: string; properties: boolean }) => {\n const start = Date.now();\n try {\n if (!opts.repo && !opts.name && !opts.path) {\n throw new PncliError('Provide at least one filter: --repo, --name, or --path');\n }\n const client = getClient(program);\n const data = await client.searchAql({\n repo: opts.repo,\n name: opts.name,\n path: opts.path,\n after: opts.after,\n before: opts.before,\n limit: Number.isNaN(parseInt(opts.limit, 10)) ? 100 : parseInt(opts.limit, 10),\n includeProperties: opts.properties\n });\n success(data, 'artifactory', 'search', start);\n } catch (err) { fail(err, 'artifactory', 'search', start); }\n });\n\n // ── Builds ────────────────────────────────────────────────────────────────\n\n art.command('builds')\n .description('List all build names in Artifactory')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBuilds();\n success(data, 'artifactory', 'builds', start);\n } catch (err) { fail(err, 'artifactory', 'builds', start); }\n });\n\n art.command('build-runs <name>')\n .description('List all run numbers for a build')\n .action(async (name: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBuildRuns(name);\n success(data, 'artifactory', 'build-runs', start);\n } catch (err) { fail(err, 'artifactory', 'build-runs', start); }\n });\n\n art.command('build-info <name> <number>')\n .description('Get build info (artifacts, dependencies, VCS revision) for a specific run')\n .action(async (name: string, number: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getBuildInfo(name, number);\n success(data, 'artifactory', 'build-info', start);\n } catch (err) { fail(err, 'artifactory', 'build-info', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n UdeployApplication,\n UdeployComponent,\n UdeployEnvironment,\n UdeployProcessRequest,\n UdeployRequestInfo,\n UdeployRequestStatus,\n UdeployVersion,\n UdeployVersionCreateResult,\n} from '../../types/udeploy.js';\n\nexport interface UdeployRunProcessOptions {\n application: string;\n applicationProcess: string;\n environment: string;\n onlyChanged?: boolean;\n versions?: Array<{ component: string; version: string }>;\n snapshot?: string;\n properties?: Record<string, string>;\n}\n\nexport class UdeployClient {\n constructor(private http: HttpClient) {}\n\n listApplications(): Promise<UdeployApplication[]> {\n return this.http.udeploy<UdeployApplication[]>('/cli/application');\n }\n\n listEnvironments(application: string): Promise<UdeployEnvironment[]> {\n return this.http.udeploy<UdeployEnvironment[]>('/cli/application/environmentsInApplication', {\n params: { application }\n });\n }\n\n listComponents(): Promise<UdeployComponent[]> {\n return this.http.udeploy<UdeployComponent[]>('/cli/component');\n }\n\n listVersions(component: string): Promise<UdeployVersion[]> {\n return this.http.udeploy<UdeployVersion[]>('/cli/component/versions', {\n params: { component }\n });\n }\n\n createVersion(component: string, name: string): Promise<UdeployVersionCreateResult> {\n return this.http.udeploy<UdeployVersionCreateResult>('/cli/version/createVersion', {\n method: 'POST',\n params: { component, name }\n });\n }\n\n finishImporting(component: string, version: string): Promise<void> {\n return this.http.udeploy<void>('/cli/version/finishedImporting', {\n method: 'POST',\n params: { component, version }\n });\n }\n\n runProcess(opts: UdeployRunProcessOptions): Promise<UdeployProcessRequest> {\n return this.http.udeploy<UdeployProcessRequest>('/cli/applicationProcessRequest/request', {\n method: 'PUT',\n body: {\n application: opts.application,\n applicationProcess: opts.applicationProcess,\n environment: opts.environment,\n onlyChanged: opts.onlyChanged ?? false,\n ...(opts.versions ? { versions: opts.versions } : {}),\n ...(opts.snapshot ? { snapshot: opts.snapshot } : {}),\n ...(opts.properties ? { properties: opts.properties } : {}),\n }\n });\n }\n\n getRequestStatus(requestId: string): Promise<UdeployRequestStatus> {\n return this.http.udeploy<UdeployRequestStatus>('/cli/applicationProcessRequest/requestStatus', {\n params: { requestId }\n });\n }\n\n getRequestInfo(requestId: string): Promise<UdeployRequestInfo> {\n return this.http.udeploy<UdeployRequestInfo>('/cli/applicationProcessRequest/requestInfo', {\n params: { requestId }\n });\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { UdeployClient } from './client.js';\n\nconst POLL_INTERVAL_MS = 5000;\nconst DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;\n\nfunction getClient(program: Command): { client: UdeployClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.udeploy.baseUrl) {\n throw new PncliError('UDeploy baseUrl not configured. Run: pncli config init', 78);\n }\n const http = createHttpClient(config, opts.dryRun);\n return { client: new UdeployClient(http), config };\n}\n\nfunction resolveApplication(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const app = cliValue ?? config.defaults.udeploy.application;\n if (!app) throw new PncliError('--application is required (or set defaults.udeploy.application in config)', 2);\n return app;\n}\n\nfunction resolveEnvironment(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const env = cliValue ?? config.defaults.udeploy.environment;\n if (!env) throw new PncliError('--environment is required (or set defaults.udeploy.environment in config)', 2);\n return env;\n}\n\nexport function registerUdeployCommands(program: Command): void {\n const udeploy = program\n .command('udeploy')\n .description('IBM UrbanCode Deploy — component versions and deployment processes')\n .option('--application <name>', 'Application name or ID')\n .option('--environment <name>', 'Environment name or ID');\n\n udeploy\n .command('apps')\n .description('List all applications')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const apps = await client.listApplications();\n success(apps, 'udeploy', 'apps', start);\n } catch (err) {\n fail(err, 'udeploy', 'apps', start);\n }\n });\n\n udeploy\n .command('environments')\n .description('List environments for an application')\n .action(async () => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const envs = await client.listEnvironments(application);\n success(envs, 'udeploy', 'environments', start);\n } catch (err) {\n fail(err, 'udeploy', 'environments', start);\n }\n });\n\n udeploy\n .command('components')\n .description('List all components')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const components = await client.listComponents();\n success(components, 'udeploy', 'components', start);\n } catch (err) {\n fail(err, 'udeploy', 'components', start);\n }\n });\n\n udeploy\n .command('versions')\n .description('List versions for a component')\n .requiredOption('--component <name>', 'Component name or ID')\n .action(async (cmdOpts: { component: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const versions = await client.listVersions(cmdOpts.component);\n success(versions, 'udeploy', 'versions', start);\n } catch (err) {\n fail(err, 'udeploy', 'versions', start);\n }\n });\n\n udeploy\n .command('import-version')\n .description('Create a component version and mark it ready for deployment')\n .requiredOption('--component <name>', 'Component name or ID')\n .requiredOption('--name <name>', 'Version name')\n .option('--no-finish', 'Skip marking the version as finished importing')\n .action(async (cmdOpts: { component: string; name: string; finish: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const created = await client.createVersion(cmdOpts.component, cmdOpts.name);\n if (cmdOpts.finish) {\n await client.finishImporting(cmdOpts.component, cmdOpts.name);\n }\n success({ ...created, finishedImporting: cmdOpts.finish }, 'udeploy', 'import-version', start);\n } catch (err) {\n fail(err, 'udeploy', 'import-version', start);\n }\n });\n\n udeploy\n .command('run')\n .description('Run an application deployment process')\n .requiredOption('--process <name>', 'Application process name or ID')\n .option('--component <name>', 'Component name (repeatable)', collect, [])\n .option('--component-version <name>', 'Component version (repeatable; positionally paired with --component)', collect, [])\n .option('--snapshot <name>', 'Snapshot name or ID (alternative to specifying versions)')\n .option('--only-changed', 'Deploy only changed components', false)\n .option('--wait', 'Poll until the process completes', false)\n .option('--timeout <ms>', 'Max wait time in milliseconds', String(DEFAULT_TIMEOUT_MS))\n .action(async (cmdOpts: {\n process: string;\n component: string[];\n componentVersion: string[];\n snapshot?: string;\n onlyChanged: boolean;\n wait: boolean;\n timeout: string;\n }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string; environment?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const environment = resolveEnvironment(config, parentOpts.environment);\n\n const components = cmdOpts.component;\n const versions = cmdOpts.componentVersion;\n const versionEntries = components.map((c, i) => ({\n component: c,\n version: versions[i] ?? 'latest'\n }));\n\n const result = await client.runProcess({\n application,\n applicationProcess: cmdOpts.process,\n environment,\n onlyChanged: cmdOpts.onlyChanged,\n ...(versionEntries.length > 0 ? { versions: versionEntries } : {}),\n ...(cmdOpts.snapshot ? { snapshot: cmdOpts.snapshot } : {}),\n });\n\n if (!cmdOpts.wait) {\n success(result, 'udeploy', 'run', start);\n return;\n }\n\n const timeoutMs = parseInt(cmdOpts.timeout, 10);\n const requestId = result.requestId;\n log(`Process started. Request ID: ${requestId}. Polling for completion...`);\n\n while (true) {\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n throw new PncliError(`Timed out after ${timeoutMs}ms waiting for request ${requestId}`, 1);\n }\n\n await sleep(POLL_INTERVAL_MS);\n\n const status = await client.getRequestStatus(requestId);\n\n if (status.status === 'CLOSED') {\n const outcome = { requestId, status: status.status, result: status.result, elapsed_ms: Date.now() - start };\n if (status.result === 'SUCCEEDED') {\n success(outcome, 'udeploy', 'run', start);\n } else {\n throw new PncliError(\n `Deployment ${status.result ?? 'failed'} (requestId: ${requestId})`,\n 1\n );\n }\n return;\n }\n\n log(`Status: ${status.status} (${Math.round((Date.now() - start) / 1000)}s elapsed)`);\n }\n } catch (err) {\n fail(err, 'udeploy', 'run', start);\n }\n });\n\n udeploy\n .command('request-status')\n .description('Get the current status of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const status = await client.getRequestStatus(cmdOpts.requestId);\n success(status, 'udeploy', 'request-status', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-status', start);\n }\n });\n\n udeploy\n .command('request-info')\n .description('Get full details of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const info = await client.getRequestInfo(cmdOpts.requestId);\n success(info, 'udeploy', 'request-info', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-info', start);\n }\n });\n}\n\nfunction collect(val: string, prev: string[]): string[] {\n return [...prev, val];\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type { CheckmarxProject, CheckmarxScan, CheckmarxResultsStats } from '../../types/checkmarx.js';\n\nexport class CheckmarxClient {\n constructor(private http: HttpClient) {}\n\n async listProjects(): Promise<CheckmarxProject[]> {\n return this.http.checkmarx<CheckmarxProject[]>('/cxrestapi/projects');\n }\n\n async getProject(id: number): Promise<CheckmarxProject> {\n return this.http.checkmarx<CheckmarxProject>(`/cxrestapi/projects/${id}`);\n }\n\n async listScans(opts: { projectId?: number; last?: number } = {}): Promise<CheckmarxScan[]> {\n return this.http.checkmarx<CheckmarxScan[]>('/cxrestapi/sast/scans', {\n params: {\n projectId: opts.projectId,\n last: opts.last\n }\n });\n }\n\n async getScan(id: number): Promise<CheckmarxScan> {\n return this.http.checkmarx<CheckmarxScan>(`/cxrestapi/sast/scans/${id}`);\n }\n\n async getScanResultsStatistics(scanId: number): Promise<CheckmarxResultsStats> {\n return this.http.checkmarx<CheckmarxResultsStats>(`/cxrestapi/sast/scans/${scanId}/resultsStatistics`);\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { CheckmarxClient } from './client.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): CheckmarxClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.checkmarx.baseUrl) throw new PncliError('Checkmarx not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new CheckmarxClient(http);\n}\n\nexport function registerCheckmarxCommands(program: Command): void {\n const cx = program.command('checkmarx').description('Checkmarx CxSAST operations');\n const project = cx.command('project').description('Project operations');\n const scan = cx.command('scan').description('Scan operations');\n\n project\n .command('list')\n .description('List all projects')\n .action(async () => {\n const start = Date.now();\n try {\n const data = await getClient(program).listProjects();\n success(data, 'checkmarx', 'project-list', start);\n } catch (err) { fail(err, 'checkmarx', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a project by ID')\n .requiredOption('--id <id>', 'Project ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const id = parseInt(opts.id, 10);\n if (isNaN(id)) throw new PncliError(`Invalid --id \"${opts.id}\". Expected an integer.`, 1);\n const data = await getClient(program).getProject(id);\n success(data, 'checkmarx', 'project-get', start);\n } catch (err) { fail(err, 'checkmarx', 'project-get', start); }\n });\n\n scan\n .command('list')\n .description('List scans')\n .option('--project <id>', 'Filter by project ID')\n .option('--last <n>', 'Return only the last N scans per project')\n .action(async (opts: { project?: string; last?: string }) => {\n const start = Date.now();\n try {\n const projectId = opts.project ? parseInt(opts.project, 10) : undefined;\n const last = opts.last ? parseInt(opts.last, 10) : undefined;\n if (opts.project && isNaN(projectId!)) throw new PncliError(`Invalid --project \"${opts.project}\". Expected an integer.`, 1);\n if (opts.last && isNaN(last!)) throw new PncliError(`Invalid --last \"${opts.last}\". Expected an integer.`, 1);\n const data = await getClient(program).listScans({ projectId, last });\n success(data, 'checkmarx', 'scan-list', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-list', start); }\n });\n\n scan\n .command('get')\n .description('Get a scan by ID')\n .requiredOption('--id <id>', 'Scan ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const id = parseInt(opts.id, 10);\n if (isNaN(id)) throw new PncliError(`Invalid --id \"${opts.id}\". Expected an integer.`, 1);\n const data = await getClient(program).getScan(id);\n success(data, 'checkmarx', 'scan-get', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-get', start); }\n });\n\n scan\n .command('stats')\n .description('Get results statistics for a scan')\n .requiredOption('--id <id>', 'Scan ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const id = parseInt(opts.id, 10);\n if (isNaN(id)) throw new PncliError(`Invalid --id \"${opts.id}\". Expected an integer.`, 1);\n const data = await getClient(program).getScanResultsStatistics(id);\n success(data, 'checkmarx', 'scan-stats', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-stats', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\ninterface SnowChangeRecord {\n sys_id: string;\n number: string;\n short_description: string;\n state: string;\n priority: string;\n assigned_to?: { display_value?: string };\n assignment_group?: { display_value?: string };\n start_date?: string;\n end_date?: string;\n description?: string;\n [key: string]: unknown;\n}\n\ninterface SnowListResponse {\n result: SnowChangeRecord[];\n}\n\ninterface SnowSingleResponse {\n result: SnowChangeRecord;\n}\n\nfunction getHttp(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.servicenow.baseUrl) throw new PncliError('ServiceNow not configured. Run: pncli config init');\n return createHttpClient(config, Boolean(opts.dryRun));\n}\n\nexport function registerServiceNowCommands(program: Command): void {\n const sn = program.command('servicenow').description('ServiceNow operations');\n const change = sn.command('change').description('Change request operations');\n\n change\n .command('list')\n .description('List change requests')\n .option('--state <state>', 'Filter by state (e.g. -1=Pending, 1=Open, 2=Work in Progress, 3=Closed Complete)')\n .option('--assigned-to <user>', 'Filter by assigned user sys_id or display name')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--fields <fields>', 'Comma-separated field names to return')\n .action(async (opts: { state?: string; assignedTo?: string; limit?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string | number | boolean | undefined> = {\n sysparm_limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n sysparm_display_value: 'true',\n };\n const sanitize = (v: string) => v.replace(/\\^/g, '');\n const queries: string[] = [];\n if (opts.state !== undefined) queries.push(`state=${sanitize(opts.state)}`);\n if (opts.assignedTo) queries.push(`assigned_to=${sanitize(opts.assignedTo)}`);\n if (queries.length) params['sysparm_query'] = queries.join('^');\n if (opts.fields) params['sysparm_fields'] = opts.fields;\n\n const data = await http.servicenow<SnowListResponse>('/api/now/table/change_request', { params });\n success(data.result, 'servicenow', 'change list', start);\n } catch (err) { fail(err, 'servicenow', 'change list', start); }\n });\n\n change\n .command('get')\n .description('Get a change request by sys_id or number')\n .requiredOption('--id <id>', 'Change request sys_id or number (e.g. CHG0001234)')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n if (opts.id.toUpperCase().startsWith('CHG')) {\n const list = await http.servicenow<SnowListResponse>('/api/now/table/change_request', {\n params: { sysparm_query: `number=${opts.id}`, sysparm_display_value: 'true', sysparm_limit: 1 }\n });\n if (!list.result.length) throw new PncliError(`Change request not found: ${opts.id}`, 1);\n success(list.result[0], 'servicenow', 'change get', start);\n return;\n }\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n params: { sysparm_display_value: 'true' }\n });\n success(data.result, 'servicenow', 'change get', start);\n } catch (err) { fail(err, 'servicenow', 'change get', start); }\n });\n\n change\n .command('create')\n .description('Create a change request')\n .requiredOption('--short-description <text>', 'Short description (title)')\n .option('--description <text>', 'Full description')\n .option('--type <type>', 'Change type: normal, standard, or emergency', 'normal')\n .option('--priority <n>', 'Priority: 1=Critical, 2=High, 3=Moderate, 4=Low')\n .option('--assigned-to <user>', 'Assigned user sys_id')\n .option('--assignment-group <group>', 'Assignment group sys_id')\n .option('--start-date <datetime>', 'Planned start date (yyyy-MM-dd HH:mm:ss)')\n .option('--end-date <datetime>', 'Planned end date (yyyy-MM-dd HH:mm:ss)')\n .action(async (opts: {\n shortDescription: string;\n description?: string;\n type?: string;\n priority?: string;\n assignedTo?: string;\n assignmentGroup?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {\n short_description: opts.shortDescription,\n type: opts.type ?? 'normal'\n };\n if (opts.description) body['description'] = opts.description;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.assignmentGroup) body['assignment_group'] = opts.assignmentGroup;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n const data = await http.servicenow<SnowSingleResponse>('/api/now/table/change_request', {\n method: 'POST',\n body\n });\n success(data.result, 'servicenow', 'change create', start);\n } catch (err) { fail(err, 'servicenow', 'change create', start); }\n });\n\n change\n .command('update')\n .description('Update a change request')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--short-description <text>', 'New short description')\n .option('--description <text>', 'New description')\n .option('--state <state>', 'New state value')\n .option('--priority <n>', 'New priority')\n .option('--assigned-to <user>', 'New assigned user sys_id')\n .option('--start-date <datetime>', 'New planned start date')\n .option('--end-date <datetime>', 'New planned end date')\n .action(async (opts: {\n id: string;\n shortDescription?: string;\n description?: string;\n state?: string;\n priority?: string;\n assignedTo?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {};\n if (opts.shortDescription) body['short_description'] = opts.shortDescription;\n if (opts.description) body['description'] = opts.description;\n if (opts.state !== undefined) body['state'] = opts.state;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n if (Object.keys(body).length === 0) throw new PncliError('No fields to update. Provide at least one option besides --id.', 1);\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change update', start);\n } catch (err) { fail(err, 'servicenow', 'change update', start); }\n });\n\n change\n .command('close')\n .description('Close a change request (state=3)')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--close-notes <text>', 'Closure notes')\n .option('--close-code <code>', 'Close code (e.g. successful, unsuccessful)')\n .action(async (opts: { id: string; closeNotes?: string; closeCode?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = { state: 3 };\n if (opts.closeNotes) body['close_notes'] = opts.closeNotes;\n if (opts.closeCode) body['close_code'] = opts.closeCode;\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change close', start);\n } catch (err) { fail(err, 'servicenow', 'change close', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpAndOrg(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.contrast.apiKey || !config.contrast.serviceKey || !config.contrast.username) throw new PncliError('Contrast not configured. Run: pncli config init');\n if (!config.contrast.orgUuid) throw new PncliError('Contrast org UUID not configured. Run: pncli config set contrast.orgUuid <uuid>');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { http, orgUuid: config.contrast.orgUuid };\n}\n\nexport function registerContrastCommands(program: Command): void {\n const contrast = program.command('contrast').description('Contrast IAST operations');\n\n const apps = contrast.command('apps').description('Application operations');\n\n apps\n .command('list')\n .description('List applications in the organization')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(`/Contrast/api/ng/${orgUuid}/applications`, {\n params: {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n }\n });\n success(data, 'contrast', 'apps list', start);\n } catch (err) { fail(err, 'contrast', 'apps list', start); }\n });\n\n const findings = contrast.command('findings').description('Vulnerability findings operations');\n\n findings\n .command('list')\n .description('List vulnerability findings for an application')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .option('--severity <level>', 'Filter by severity: CRITICAL, HIGH, MEDIUM, LOW, NOTE')\n .option('--status <status>', 'Filter by status: REPORTED, CONFIRMED, SUSPICIOUS, NOT_A_PROBLEM, REMEDIATED, FIXED')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { app: string; severity?: string; status?: string; limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const params: Record<string, string | number | boolean | undefined> = {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n };\n if (opts.severity) params['severities'] = opts.severity;\n if (opts.status) params['statuses'] = opts.status;\n\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/filter`,\n { params }\n );\n success(data, 'contrast', 'findings list', start);\n } catch (err) { fail(err, 'contrast', 'findings list', start); }\n });\n\n findings\n .command('get')\n .description('Get details for a specific vulnerability finding')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .requiredOption('--trace <trace-id>', 'Trace/finding UUID')\n .action(async (opts: { app: string; trace: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/trace/${opts.trace}`\n );\n success(data, 'contrast', 'findings get', start);\n } catch (err) { fail(err, 'contrast', 'findings get', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpClient(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.sonatypeiq.baseUrl) throw new PncliError('Sonatype IQ Server baseUrl not configured. Run: pncli config init');\n if (!config.sonatypeiq.userCode || !config.sonatypeiq.passcode) throw new PncliError('Sonatype IQ Server credentials not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return http;\n}\n\nexport function registerSonatypeIqCommands(program: Command): void {\n const sonatypeiq = program.command('sonatypeiq').description('Sonatype IQ Server operations');\n\n const applications = sonatypeiq.command('applications').description('Application operations');\n\n applications\n .command('list')\n .description('List all applications in Sonatype IQ Server')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const params: Record<string, string | number | boolean | undefined> = {};\n if (opts.organizationId) params['organizationId'] = opts.organizationId;\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', { params });\n success(data, 'sonatypeiq', 'applications list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications list', startTime); }\n });\n\n applications\n .command('get')\n .description('Get an application by its public ID')\n .requiredOption('--public-id <id>', 'Application public ID')\n .action(async (opts: { publicId: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', {\n params: { publicId: opts.publicId }\n });\n success(data, 'sonatypeiq', 'applications get', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications get', startTime); }\n });\n\n const organizations = sonatypeiq.command('organizations').description('Organization operations');\n\n organizations\n .command('list')\n .description('List all organizations in Sonatype IQ Server')\n .action(async () => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/organizations');\n success(data, 'sonatypeiq', 'organizations list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'organizations list', startTime); }\n });\n\n const policies = sonatypeiq.command('policies').description('Policy operations');\n\n policies\n .command('list')\n .description('List all policies')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const path = opts.organizationId\n ? `/api/v2/policies/organization/${encodeURIComponent(opts.organizationId)}`\n : '/api/v2/policies';\n const data = await http.sonatypeiq<unknown>(path);\n success(data, 'sonatypeiq', 'policies list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'policies list', startTime); }\n });\n}\n","import { Command } from 'commander';\nimport { success, fail, warn } from '../../lib/output.js';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { fileURLToPath } from 'url';\n\nconst AGENT_PATHS: Record<string, { project: string; user: string }> = {\n 'github-copilot': { project: '.agents/skills', user: path.join(os.homedir(), '.copilot/skills') },\n 'claude-code': { project: '.claude/skills', user: path.join(os.homedir(), '.claude/skills') },\n};\n\n// Resolve the bundled skills directory relative to this file (dist/cli.js → ../skills)\nfunction getBundledSkillsDir(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(thisFile), '..', 'skills');\n } catch {\n return '';\n }\n}\n\nexport function registerSkillsCommands(program: Command): void {\n const skills = program.command('skills').description('Manage pncli Claude Code skills');\n\n skills\n .command('install')\n .description('Install pncli skills into the current repo')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override install directory (ignores --agent and --scope)')\n\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = AGENT_PATHS[opts.agent];\n if (!agentConfig) {\n throw new Error(`Unknown agent: \"${opts.agent}\". Use: ${Object.keys(AGENT_PATHS).join(' | ')}`);\n }\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n const resolvedTarget = path.resolve(targetDir);\n const bundledDir = getBundledSkillsDir();\n let skillDirs: string[] = [];\n\n if (bundledDir !== '') {\n try {\n skillDirs = fs.readdirSync(bundledDir).filter(name =>\n fs.existsSync(path.join(bundledDir, name, 'SKILL.md'))\n );\n } catch { /* bundledDir not readable */ }\n }\n\n if (skillDirs.length === 0) {\n throw new Error('No bundled skills found. Reinstall pncli to get the latest version: npm install -g @kolatts/pncli');\n }\n\n const installed: string[] = [];\n const failed: string[] = [];\n\n // Remove only pncli-managed skills (not user-created ones)\n for (const skillName of skillDirs) {\n const existingDir = path.resolve(targetDir, skillName);\n if (!existingDir.startsWith(resolvedTarget + path.sep)) continue;\n if (fs.existsSync(existingDir)) {\n fs.rmSync(existingDir, { recursive: true, force: true });\n }\n }\n\n warn(`Installing ${skillDirs.length} bundled skill(s) to ${targetDir}...`);\n\n for (const skillName of skillDirs) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) {\n failed.push(skillName);\n continue;\n }\n\n try {\n const content = fs.readFileSync(path.join(bundledDir, skillName, 'SKILL.md'), 'utf8');\n fs.mkdirSync(skillDir, { recursive: true });\n fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content, 'utf8');\n installed.push(skillName);\n } catch {\n failed.push(skillName);\n }\n }\n\n warn(`Installed ${installed.length} skill(s) to ${targetDir}`);\n if (failed.length > 0) {\n warn(`Failed to install: ${failed.join(', ')}`);\n }\n\n success({\n installed,\n failed,\n target: targetDir,\n total: installed.length,\n agent: opts.target ? 'custom' : opts.agent,\n scope: opts.target ? 'custom' : opts.scope,\n source: 'bundled',\n }, 'skills', 'install', start);\n } catch (err) {\n fail(err, 'skills', 'install', start);\n }\n });\n\n skills\n .command('list')\n .description('List locally installed skills')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override skills directory to scan')\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = AGENT_PATHS[opts.agent];\n if (!agentConfig) {\n throw new Error(`Unknown agent: \"${opts.agent}\". Use: ${Object.keys(AGENT_PATHS).join(' | ')}`);\n }\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n if (!fs.existsSync(targetDir)) {\n success({ skills: [], message: `No skills directory found at ${targetDir}. Run: pncli skills install` }, 'skills', 'list', start);\n return;\n }\n\n const skillDirs = fs.readdirSync(targetDir).filter(name => {\n const skillPath = path.join(targetDir, name, 'SKILL.md');\n return fs.existsSync(skillPath);\n });\n\n const skillsList = skillDirs.map(name => {\n const content = fs.readFileSync(path.join(targetDir, name, 'SKILL.md'), 'utf8');\n const frontmatter = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n const data: Record<string, string> = {};\n const metadata: Record<string, string> = {};\n if (frontmatter) {\n let inMetadata = false;\n for (const line of frontmatter[1].split('\\n')) {\n if (line.trimEnd() === 'metadata:') { inMetadata = true; continue; }\n if (inMetadata && line.startsWith(' ')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx !== -1) {\n metadata[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n continue;\n }\n inMetadata = false;\n const colonIdx = line.indexOf(':');\n if (colonIdx === -1) continue;\n data[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n }\n return {\n name: data.name || name,\n slug: name,\n category: metadata.category || data.category || 'other',\n services: metadata.services || data.services || '',\n providers: metadata.providers || data.providers || 'none',\n userInvocable: data['user-invocable'] === 'true',\n };\n });\n\n success({ skills: skillsList, total: skillsList.length }, 'skills', 'list', start);\n } catch (err) {\n fail(err, 'skills', 'list', start);\n }\n });\n}\n"],"mappings":"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","names":["Command","execSync","path","program","API","program","getClient","program","API","getClient","program","API","getClient","program","API","getClient","program","resolveProject","path","execSync","execFileSync","pkg","path","path","execSync","path","execFileSync","pkg","pkg","pkg","BATCH_SIZE","TIMEOUT_MS","fetchWithTimeout","pkg","inferSeverityFromCvss","queryBatch","TIMEOUT_MS","BATCH_SIZE","fetchWithTimeout","toPurl","pkg","TIMEOUT_MS","fetchWithTimeout","pkg","pkg","pkg","pkg","program","API","fs","program","path","categorize","API","API","program","parseFieldArgs","fs","repo","AdoCoreClient","createHttpClient","program","getClient","program","API","path","getClient","program","path","POLL_INTERVAL_MS","getClient","program","getClient","program","program","program","program","path","fs","path","program","colonIdx","require","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/services/git/client.ts","../src/lib/git-context.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/client.ts","../src/services/confluence/commands.ts","../src/services/sonar/client.ts","../src/services/sonar/commands.ts","../src/services/sde/client.ts","../src/services/sde/commands.ts","../src/services/deps/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/sonatype.ts","../src/services/deps/clients/sonatypeiq.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/config/commands.ts","../src/services/ado/client/work.ts","../src/services/ado/discovery.ts","../src/services/ado/client/git.ts","../src/services/ado/client/build.ts","../src/services/ado/helpers.ts","../src/services/ado/commands/project.ts","../src/services/ado/commands/work.ts","../src/services/ado/commands/repo.ts","../src/services/ado/commands/pipeline.ts","../src/services/ado/commands/index.ts","../src/services/jenkins/client.ts","../src/services/jenkins/commands.ts","../src/services/artifactory/client.ts","../src/services/artifactory/commands.ts","../src/services/udeploy/client.ts","../src/services/udeploy/commands.ts","../src/services/checkmarx/client.ts","../src/services/checkmarx/commands.ts","../src/services/servicenow/commands.ts","../src/services/contrast/commands.ts","../src/services/sonatypeiq/commands.ts","../src/services/skills/commands.ts"],"sourcesContent":["// TLS verification is disabled by default — most enterprise Data Center installs\n// sit behind corporate SSL inspection proxies that break standard certificate chains.\n// To opt back in: set PNCLI_VERIFY_TLS=1\nif (!process.env.PNCLI_VERIFY_TLS) {\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';\n}\n\nimport { 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 { registerSdeCommands } from './services/sde/commands.js';\nimport { registerDepsCommands } from './services/deps/commands.js';\nimport { registerConfigCommands } from './services/config/commands.js';\nimport { registerAdoCommands } from './services/ado/commands/index.js';\nimport { registerJenkinsCommands } from './services/jenkins/commands.js';\nimport { registerArtifactoryCommands } from './services/artifactory/commands.js';\nimport { registerUdeployCommands } from './services/udeploy/commands.js';\nimport { registerCheckmarxCommands } from './services/checkmarx/commands.js';\nimport { registerServiceNowCommands } from './services/servicenow/commands.js';\nimport { registerContrastCommands } from './services/contrast/commands.js';\nimport { registerSonatypeIqCommands } from './services/sonatypeiq/commands.js';\nimport { registerSkillsCommands } from './services/skills/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 .option('--output-file <path>', 'Write JSON output to file instead of stdout');\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 outputFile: opts.outputFile as string | undefined\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);\nregisterSdeCommands(program);\nregisterDepsCommands(program);\nregisterConfigCommands(program);\nregisterAdoCommands(program);\nregisterJenkinsCommands(program);\nregisterArtifactoryCommands(program);\nregisterUdeployCommands(program);\nregisterCheckmarxCommands(program);\nregisterServiceNowCommands(program);\nregisterContrastCommands(program);\nregisterSonatypeIqCommands(program);\nregisterSkillsCommands(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\n bitbucket Bitbucket Server\n confluence Confluence\n sonar SonarQube Server (quality gates, issues, metrics, hotspots)\n sde SDElements (threat modeling, countermeasures, compliance)\n ado Azure DevOps Server (work items, repos, PRs, pipelines)\n jenkins Jenkins Data Center (jobs, builds, logs)\n artifactory Artifactory (repos, artifact search, build info, properties)\n udeploy IBM UrbanCode Deploy (component versions, deployment processes)\n checkmarx Checkmarx CxSAST (projects, scans, scan statistics)\n servicenow ServiceNow (change requests)\n contrast Contrast IAST (applications, vulnerability findings)\n sonatypeiq Sonatype IQ Server (applications, organizations, policies)\n config Manage pncli configuration\n skills Download and manage Claude Code skills\n`);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (process.exitCode !== undefined) return; // already handled by fail() or dry-run\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = ExitCode.GENERAL_ERROR;\n});\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\nexport interface CommitStats {\n hash: string;\n date: string;\n author: string;\n message: string;\n filesChanged: number;\n insertions: number;\n deletions: number;\n netLines: number;\n}\n\nexport interface AuthorStats {\n author: string;\n commitCount: number;\n insertions: number;\n deletions: number;\n netLines: number;\n filesChanged: number;\n}\n\nexport interface WeeklyBreakdown {\n week: string;\n weekStart: string;\n weekEnd: string;\n authors: AuthorStats[];\n summary: {\n commitCount: number;\n totalInsertions: number;\n totalDeletions: number;\n totalNetLines: number;\n totalFilesChanged: number;\n };\n}\n\nexport interface BranchReport {\n branch: string;\n since: string | null;\n until: string | null;\n commits: CommitStats[];\n weeks: WeeklyBreakdown[];\n byAuthor: AuthorStats[];\n summary: {\n commitCount: number;\n totalInsertions: number;\n totalDeletions: number;\n totalNetLines: number;\n totalFilesChanged: number;\n };\n}\n\nexport const COMMIT_PREFIX = '__PNCLI_COMMIT__';\n\nfunction getWeekMonday(dateStr: string): string {\n const d = new Date(dateStr);\n const day = d.getUTCDay(); // 0=Sun\n const diff = day === 0 ? -6 : 1 - day;\n const monday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + diff));\n return monday.toISOString().slice(0, 10);\n}\n\nfunction getWeekSunday(mondayStr: string): string {\n const d = new Date(mondayStr);\n const sunday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + 6));\n return sunday.toISOString().slice(0, 10);\n}\n\nfunction getISOWeekLabel(mondayStr: string): string {\n const d = new Date(mondayStr);\n // Thursday of the same week determines the ISO year\n const thursday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + 3));\n const year = thursday.getUTCFullYear();\n const jan4 = new Date(Date.UTC(year, 0, 4)); // Jan 4 is always in week 1\n const jan4Monday = new Date(Date.UTC(year, 0, 4 - (jan4.getUTCDay() === 0 ? 6 : jan4.getUTCDay() - 1)));\n const weekNum = Math.round((d.getTime() - jan4Monday.getTime()) / (7 * 86400000)) + 1;\n return `${year}-W${String(weekNum).padStart(2, '0')}`;\n}\n\nfunction buildWeeklyBreakdown(commits: CommitStats[]): WeeklyBreakdown[] {\n const weekMap = new Map<string, Map<string, AuthorStats>>();\n\n for (const commit of commits) {\n const monday = getWeekMonday(commit.date);\n if (!weekMap.has(monday)) weekMap.set(monday, new Map());\n const authorMap = weekMap.get(monday)!;\n\n if (!authorMap.has(commit.author)) {\n authorMap.set(commit.author, {\n author: commit.author,\n commitCount: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0,\n filesChanged: 0\n });\n }\n\n const stats = authorMap.get(commit.author)!;\n stats.commitCount++;\n stats.insertions += commit.insertions;\n stats.deletions += commit.deletions;\n stats.netLines += commit.netLines;\n stats.filesChanged += commit.filesChanged;\n }\n\n return [...weekMap.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([monday, authorMap]) => {\n const authors = [...authorMap.values()].sort((a, b) => a.author.localeCompare(b.author));\n return {\n week: getISOWeekLabel(monday),\n weekStart: monday,\n weekEnd: getWeekSunday(monday),\n authors,\n summary: {\n commitCount: authors.reduce((s, a) => s + a.commitCount, 0),\n totalInsertions: authors.reduce((s, a) => s + a.insertions, 0),\n totalDeletions: authors.reduce((s, a) => s + a.deletions, 0),\n totalNetLines: authors.reduce((s, a) => s + a.netLines, 0),\n totalFilesChanged: authors.reduce((s, a) => s + a.filesChanged, 0)\n }\n };\n });\n}\n\nfunction buildByAuthor(commits: CommitStats[]): AuthorStats[] {\n const map = new Map<string, AuthorStats>();\n for (const commit of commits) {\n if (!map.has(commit.author)) {\n map.set(commit.author, {\n author: commit.author,\n commitCount: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0,\n filesChanged: 0\n });\n }\n const stats = map.get(commit.author)!;\n stats.commitCount++;\n stats.insertions += commit.insertions;\n stats.deletions += commit.deletions;\n stats.netLines += commit.netLines;\n stats.filesChanged += commit.filesChanged;\n }\n return [...map.values()].sort((a, b) => a.author.localeCompare(b.author));\n}\n\n// Exported for unit testing\nexport function parseBranchReportOutput(\n raw: string,\n branchName: string,\n opts: { since?: string; until?: string }\n): BranchReport {\n const commits: CommitStats[] = [];\n let current: CommitStats | null = null;\n\n for (const line of raw.split('\\n')) {\n if (line.startsWith(COMMIT_PREFIX)) {\n if (current) commits.push(current);\n const parts = line.slice(COMMIT_PREFIX.length).split('\\t');\n current = {\n hash: parts[0] ?? '',\n author: parts[1] ?? '',\n date: parts[2] ?? '',\n message: parts[3] ?? '',\n filesChanged: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0\n };\n } else if (current && /^(\\d+|-)\\t(\\d+|-)/.test(line)) {\n // numstat line: insertions\\tdeletions\\tfilename\n const [ins, del] = line.split('\\t');\n const insertions = ins === '-' ? 0 : parseInt(ins ?? '0', 10);\n const deletions = del === '-' ? 0 : parseInt(del ?? '0', 10);\n if (!isNaN(insertions) && !isNaN(deletions)) {\n current.insertions += insertions;\n current.deletions += deletions;\n current.filesChanged++;\n current.netLines = current.insertions - current.deletions;\n }\n }\n }\n\n if (current) commits.push(current);\n\n const totalInsertions = commits.reduce((sum, c) => sum + c.insertions, 0);\n const totalDeletions = commits.reduce((sum, c) => sum + c.deletions, 0);\n\n return {\n branch: branchName,\n since: opts.since ?? null,\n until: opts.until ?? null,\n commits,\n weeks: buildWeeklyBreakdown(commits),\n byAuthor: buildByAuthor(commits),\n summary: {\n commitCount: commits.length,\n totalInsertions,\n totalDeletions,\n totalNetLines: totalInsertions - totalDeletions,\n totalFilesChanged: commits.reduce((sum, c) => sum + c.filesChanged, 0)\n }\n };\n}\n\n// Exported for unit testing — pure arg construction with no I/O\nexport function buildReportArgs(opts: { branch?: string; since?: string; until?: string; base?: string }): string[] {\n const fmt = `${COMMIT_PREFIX}%H\\t%an\\t%aI\\t%s`;\n const args = ['log', `--format=${fmt}`, '--numstat'];\n\n if (opts.since) args.push(`--since=${opts.since}`);\n if (opts.until) args.push(`--until=${opts.until}`);\n\n if (opts.base && opts.branch) {\n args.push(`${opts.base}..${opts.branch}`);\n } else if (opts.base) {\n args.push(`${opts.base}..HEAD`);\n } else if (opts.branch) {\n args.push(opts.branch);\n }\n\n return args;\n}\n\nexport function getBranchReport(\n root: string,\n opts: { branch?: string; since?: string; until?: string; base?: string }\n): BranchReport {\n const args = buildReportArgs(opts);\n\n let raw = '';\n try {\n raw = execFileSync('git', args, { encoding: 'utf8', cwd: root }).trim();\n } catch {\n // no commits or invalid ref — return empty report\n }\n\n let branchName = opts.branch ?? '';\n if (!branchName) {\n try {\n branchName = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\n encoding: 'utf8',\n cwd: root\n }).trim();\n } catch {\n branchName = 'HEAD';\n }\n }\n\n return parseBranchReportOutput(raw, branchName, opts);\n}\n\nfunction escapeCsvField(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport function formatBranchReportCsv(report: BranchReport): string {\n const header = 'week,week_start,author,commits,insertions,deletions,net_lines,files_changed';\n const rows: string[] = [];\n\n for (const week of report.weeks) {\n for (const a of week.authors) {\n rows.push(\n [\n week.week,\n week.weekStart,\n escapeCsvField(a.author),\n a.commitCount,\n a.insertions,\n a.deletions,\n a.netLines,\n a.filesChanged\n ].join(',')\n );\n }\n }\n\n const s = report.summary;\n const totalRow = ['TOTAL', '', '', s.commitCount, s.totalInsertions, s.totalDeletions, s.totalNetLines, s.totalFilesChanged].join(',');\n\n return [header, ...rows, totalRow].join('\\n') + '\\n';\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 // Bitbucket-resolved fields\n project: string | null;\n repo: string | null;\n // Azure DevOps Server-resolved fields\n ado: { collection: string; project: string; 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\n/**\n * Parses an Azure DevOps Server git remote URL into { collection, project, repo }.\n *\n * Supported formats:\n * HTTPS : https://<host>[/<prefix>]/<collection>/<project>/_git/<repo>\n * SSH : ssh://git@<host>[:<port>][/<prefix>]/<collection>/<project>/_ssh/<repo>\n * git@<host>[:<port>]/<prefix>/<collection>/<project>/<repo>\n *\n * Strategy: find the `_git` or `_ssh` segment; walk back — the segment immediately\n * before it is the project, the one before that is the collection. Anything before\n * the collection is treated as a path prefix (e.g. /tfs/) and is ignored.\n * URL is only parsed if the host is contained in adoBaseUrl (same guard as Bitbucket).\n */\nexport function parseAdoRemote(\n remoteUrl: string,\n adoBaseUrl: string | undefined\n): { collection: string; project: string; repo: string } | null {\n if (!adoBaseUrl) return null;\n\n // Normalize base URL: extract just the hostname (without port) for comparison,\n // so that https://tfs.company.com:8080 and git@tfs.company.com:... both match.\n let baseHostname: string;\n try {\n const normalizedBase = /^https?:\\/\\//.test(adoBaseUrl) ? adoBaseUrl : `https://${adoBaseUrl}`;\n baseHostname = new URL(normalizedBase).hostname.toLowerCase();\n } catch {\n baseHostname = adoBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '').split(/[:/]/)[0]!.toLowerCase();\n }\n\n // Extract host from the remote URL (after stripping protocol/credentials)\n let path = remoteUrl;\n let remoteHostname = '';\n\n // ssh:// form\n const sshProtoMatch = path.match(/^ssh:\\/\\/[^@]*@?([^/:]+)(?::\\d+)?(.*)/);\n if (sshProtoMatch) {\n remoteHostname = sshProtoMatch[1]!.toLowerCase();\n path = sshProtoMatch[2]!;\n } else {\n // git@host form or https://\n const gitAtMatch = path.match(/^git@([^:]+)(?::\\d+)?:(.*)/);\n if (gitAtMatch) {\n remoteHostname = gitAtMatch[1]!.toLowerCase();\n path = '/' + gitAtMatch[2]!;\n } else {\n const httpsMatch = path.match(/^https?:\\/\\/([^/:]+)(?::\\d+)?(.*)/);\n if (httpsMatch) {\n remoteHostname = httpsMatch[1]!.toLowerCase();\n path = httpsMatch[2]!;\n }\n }\n }\n\n if (!remoteHostname || remoteHostname !== baseHostname) return null;\n\n // Strip trailing .git\n path = path.replace(/\\.git$/, '');\n\n // Find _git or _ssh segment\n const gitIdx = path.indexOf('/_git/');\n const sshIdx = path.indexOf('/_ssh/');\n const markerIdx = gitIdx !== -1 ? gitIdx : sshIdx;\n if (markerIdx === -1) return null;\n\n const repo = path.slice(markerIdx + 6); // skip /_git/ or /_ssh/\n if (!repo) return null;\n\n // Everything before the marker: /<prefix>/<collection>/<project>\n const before = path.slice(1, markerIdx); // strip leading /\n const parts = before.split('/').filter(Boolean);\n if (parts.length < 2) return null;\n\n const project = parts[parts.length - 1]!;\n const collection = parts[parts.length - 2]!;\n\n return { collection, project, repo };\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 // Bitbucket: disambiguated by /scm/ pattern\n let project: string | null = null;\n let repo: string | null = null;\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 // Azure DevOps Server: disambiguated by /_git/ pattern\n let adoContext: GitContext['ado'] = null;\n for (const url of remoteUrls) {\n const parsed = parseAdoRemote(url, config.ado.baseUrl);\n if (parsed) {\n adoContext = parsed;\n break;\n }\n }\n\n return { root, branch, project, repo, ado: adoContext };\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(\n project: string,\n repo: string,\n prId: number,\n opts: { withReplies?: boolean; inlineOnly?: boolean; generalOnly?: boolean } = {}\n ): Promise<BitbucketComment[]> {\n const { withReplies = true, inlineOnly = false, generalOnly = false } = opts;\n\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\n const topLevel = activities\n .filter(a => a.action === 'COMMENTED' && a.comment)\n .map(a => a.comment!);\n\n if (!withReplies) {\n return topLevel\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor);\n }\n\n // Recursively flatten nested replies, tagging each with its parentId\n function flatten(comment: BitbucketComment, parentId?: number): BitbucketComment[] {\n const node: BitbucketComment = {\n ...comment,\n comments: undefined,\n ...(parentId !== undefined ? { parentId } : {})\n };\n const replies = (comment.comments ?? []).flatMap(c => flatten(c, comment.id));\n return [node, ...replies];\n }\n\n const flat = topLevel.flatMap(c => flatten(c));\n return flat\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor)\n .sort((a, b) => a.createdDate - b.createdDate);\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, getBranchReport, formatBranchReportCsv } 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('report')\n .description('Report lines of code and commit counts for a branch, optionally filtered by date')\n .option('--branch <name>', 'Branch to report on (defaults to current branch)')\n .option('--base <ref>', 'Base ref to compare against, e.g. \"main\" (base..branch, or base..HEAD if --branch is omitted)')\n .option('--since <date>', 'Include commits on or after this date (e.g. \"2024-01-01\")')\n .option('--until <date>', 'Include commits on or before this date (e.g. \"2024-12-31\")')\n .option('--csv', 'Output as CSV instead of JSON')\n .action((opts: { branch?: string; base?: string; since?: string; until?: string; csv?: boolean }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const report = getBranchReport(root, {\n branch: opts.branch,\n base: opts.base,\n since: opts.since,\n until: opts.until\n });\n if (opts.csv) {\n process.stdout.write(formatBranchReportCsv(report));\n } else {\n success(report, 'git', 'report', start);\n }\n } catch (err) {\n fail(err, 'git', 'report', 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, warn } 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('--parent <key>', 'Parent issue key — creates an \"is child of\" link after creation')\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; parent?: 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 if (opts.parent) {\n try {\n await client.linkIssue({ key: data.key, linkType: 'is child of', target: opts.parent });\n } catch (linkErr) {\n warn(`Created ${data.key} but failed to link to parent ${opts.parent}: ${linkErr instanceof Error ? linkErr.message : linkErr}`);\n }\n }\n return;\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 (consider --output-file for large results)')\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) (consider --output-file for large results)')\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(bb);\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(bb);\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(bb);\n const config = loadConfig({ configPath: bb.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(bb);\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(bb);\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(bb);\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 (includes threaded replies by default)')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--no-with-replies', 'Exclude replies; return top-level comments only')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general (non-inline) PR comments')\n .action(async (opts: { pr: string; withReplies: boolean; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listComments(project, repo, parseInt(opts.pr, 10), {\n withReplies: opts.withReplies,\n inlineOnly: opts.inlineOnly,\n generalOnly: opts.generalOnly\n });\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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(bb);\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 type { HttpClient } from '../../lib/http.js';\nimport type {\n ConfluencePage,\n ConfluenceSpace,\n ConfluenceComment,\n ConfluenceLabel,\n ConfluenceAttachment,\n ConfluencePageResponse,\n ConfluenceSearchResult\n} from '../../types/confluence.js';\n\nconst API = '/rest/api';\n\nexport interface CreatePageOpts {\n spaceKey: string;\n title: string;\n body: string;\n parentId?: string;\n representation?: string;\n}\n\nexport interface UpdatePageOpts {\n version: number;\n title: string;\n body?: string;\n status?: string;\n representation?: string;\n}\n\nexport interface ListPagesOpts {\n limit?: number;\n start?: number;\n}\n\nexport interface SearchOpts {\n limit?: number;\n start?: number;\n expand?: string;\n}\n\nexport interface ListSpacesOpts {\n type?: string;\n limit?: number;\n start?: number;\n}\n\nexport class ConfluenceClient {\n constructor(private http: HttpClient) {}\n\n async getPage(id: string, expand = 'body.storage,version,space,ancestors'): Promise<ConfluencePage> {\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n params: { expand }\n });\n }\n\n async getPageByTitle(spaceKey: string, title: string): Promise<ConfluencePage | null> {\n const result = await this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, title, expand: 'body.storage,version,space', type: 'page' }\n });\n return result.results[0] ?? null;\n }\n\n async listPages(spaceKey: string, opts: ListPagesOpts = {}): Promise<ConfluencePage[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, type: 'page', expand: 'version', start: initialStart + start, limit: opts.limit ?? limit }\n });\n });\n }\n\n async getPageChildren(id: string): Promise<ConfluencePage[]> {\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content/${id}/child/page`, {\n params: { expand: 'version', start, limit }\n });\n });\n }\n\n async getLabels(id: string): Promise<ConfluenceLabel[]> {\n return this.http.confluencePaginate<ConfluenceLabel>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${id}/label`, {\n params: { start, limit }\n });\n });\n }\n\n async search(cql: string, opts: SearchOpts = {}): Promise<ConfluenceSearchResult> {\n return this.http.confluence<ConfluenceSearchResult>(`${API}/content/search`, {\n params: {\n cql,\n start: opts.start ?? 0,\n limit: opts.limit ?? 25,\n ...(opts.expand ? { expand: opts.expand } : {})\n }\n });\n }\n\n async createPage(opts: CreatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n type: 'page',\n title: opts.title,\n space: { key: opts.spaceKey },\n ancestors: opts.parentId ? [{ id: opts.parentId }] : [],\n body: {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n }\n };\n return this.http.confluence<ConfluencePage>(`${API}/content`, {\n method: 'POST',\n body\n });\n }\n\n async updatePage(id: string, opts: UpdatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n version: { number: opts.version },\n type: 'page',\n title: opts.title,\n status: opts.status ?? 'current'\n };\n if (opts.body !== undefined) {\n body.body = {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n };\n }\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n method: 'PUT',\n body\n });\n }\n\n async deletePage(id: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${id}`, { method: 'DELETE' });\n }\n\n async listComments(pageId: string): Promise<ConfluenceComment[]> {\n return this.http.confluencePaginate<ConfluenceComment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceComment>>(`${API}/content/${pageId}/child/comment`, {\n params: { expand: 'body.storage,version', start, limit }\n });\n });\n }\n\n async addComment(pageId: string, body: string, representation = 'storage'): Promise<ConfluenceComment> {\n return this.http.confluence<ConfluenceComment>(`${API}/content`, {\n method: 'POST',\n body: {\n type: 'comment',\n container: { id: pageId, type: 'page' },\n body: {\n storage: { value: body, representation }\n }\n }\n });\n }\n\n async addLabel(pageId: string, labels: string[]): Promise<ConfluenceLabel[]> {\n const body = labels.map(name => ({ prefix: 'global', name }));\n const result = await this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${pageId}/label`, {\n method: 'POST',\n body\n });\n return result.results;\n }\n\n async removeLabel(pageId: string, label: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${pageId}/label/${label}`, { method: 'DELETE' });\n }\n\n async listSpaces(opts: ListSpacesOpts = {}): Promise<ConfluenceSpace[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluenceSpace>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceSpace>>(`${API}/space`, {\n params: {\n start: initialStart + start,\n limit: opts.limit ?? limit,\n ...(opts.type ? { type: opts.type } : {})\n }\n });\n });\n }\n\n async getSpace(key: string): Promise<ConfluenceSpace> {\n return this.http.confluence<ConfluenceSpace>(`${API}/space/${key}`, {\n params: { expand: 'description.plain' }\n });\n }\n\n async listAttachments(pageId: string): Promise<ConfluenceAttachment[]> {\n return this.http.confluencePaginate<ConfluenceAttachment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceAttachment>>(`${API}/content/${pageId}/child/attachment`, {\n params: { start, limit }\n });\n });\n }\n}\n","import { Command } from 'commander';\nimport { ConfluenceClient } from './client.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';\n\nfunction getClient(program: Command): ConfluenceClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.confluence.baseUrl) throw new PncliError('Confluence not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ConfluenceClient(http);\n}\n\nexport function registerConfluenceCommands(program: Command): void {\n const confluence = program.command('confluence').description('Confluence operations');\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n confluence.command('get-page')\n .description('Get a Confluence page by ID')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--expand <fields>', 'Comma-separated fields to expand', 'body.storage,version,space,ancestors')\n .action(async (opts: { id: string; expand: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPage(opts.id, opts.expand);\n success(data, 'confluence', 'get-page', start);\n } catch (err) { fail(err, 'confluence', 'get-page', start); }\n });\n\n confluence.command('get-page-by-title')\n .description('Find a Confluence page by space key and title')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .action(async (opts: { space: string; title: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageByTitle(opts.space, opts.title);\n if (!data) throw new PncliError(`Page not found: \"${opts.title}\" in space ${opts.space}`, 1);\n success(data, 'confluence', 'get-page-by-title', start);\n } catch (err) { fail(err, 'confluence', 'get-page-by-title', start); }\n });\n\n confluence.command('list-pages')\n .description('List pages in a Confluence space (consider --output-file for large results)')\n .requiredOption('--space <key>', 'Space key')\n .option('--limit <n>', 'Max results per page (default: all)')\n .option('--start <n>', 'Offset for first result')\n .action(async (opts: { space: string; limit?: string; start?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listPages(opts.space, {\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n start: opts.start ? parseInt(opts.start, 10) : undefined\n });\n success(data, 'confluence', 'list-pages', start);\n } catch (err) { fail(err, 'confluence', 'list-pages', start); }\n });\n\n confluence.command('get-page-children')\n .description('Get child pages of a Confluence page')\n .requiredOption('--id <page-id>', 'Parent page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageChildren(opts.id);\n success(data, 'confluence', 'get-page-children', start);\n } catch (err) { fail(err, 'confluence', 'get-page-children', start); }\n });\n\n confluence.command('get-labels')\n .description('Get labels on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getLabels(opts.id);\n success(data, 'confluence', 'get-labels', start);\n } catch (err) { fail(err, 'confluence', 'get-labels', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────────────\n\n confluence.command('search')\n .description('Search Confluence with CQL')\n .requiredOption('--cql <query>', 'CQL query string (e.g. \"space=PROJ AND type=page\")')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--start <n>', 'Offset for first result', '0')\n .option('--expand <fields>', 'Comma-separated fields to expand')\n .action(async (opts: { cql: string; limit: string; start: string; expand?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.search(opts.cql, {\n limit: parseInt(opts.limit, 10),\n start: parseInt(opts.start, 10),\n expand: opts.expand\n });\n success(data, 'confluence', 'search', start);\n } catch (err) { fail(err, 'confluence', 'search', start); }\n });\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n confluence.command('create-page')\n .description('Create a new Confluence page')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .requiredOption('--body <html>', 'Page body (storage format HTML)')\n .option('--parent-id <id>', 'Parent page ID (to nest under a page)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { space: string; title: string; body: string; parentId?: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.createPage({\n spaceKey: opts.space,\n title: opts.title,\n body: opts.body,\n parentId: opts.parentId,\n representation: opts.representation\n });\n success(data, 'confluence', 'create-page', start);\n } catch (err) { fail(err, 'confluence', 'create-page', start); }\n });\n\n confluence.command('update-page')\n .description('Update a Confluence page (fetches current version automatically)')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--title <title>', 'New page title')\n .option('--body <html>', 'New page body (storage format HTML)')\n .option('--status <status>', 'Page status: current (default) or draft', 'current')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; title?: string; body?: string; status: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const current = await client.getPage(opts.id, 'version');\n const nextVersion = current.version.number + 1;\n const data = await client.updatePage(opts.id, {\n version: nextVersion,\n title: opts.title ?? current.title,\n body: opts.body,\n status: opts.status,\n representation: opts.representation\n });\n success(data, 'confluence', 'update-page', start);\n } catch (err) { fail(err, 'confluence', 'update-page', start); }\n });\n\n confluence.command('delete-page')\n .description('Delete a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.deletePage(opts.id);\n success({ deleted: opts.id }, 'confluence', 'delete-page', start);\n } catch (err) { fail(err, 'confluence', 'delete-page', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────────────\n\n confluence.command('list-comments')\n .description('List comments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.id);\n success(data, 'confluence', 'list-comments', start);\n } catch (err) { fail(err, 'confluence', 'list-comments', start); }\n });\n\n confluence.command('add-comment')\n .description('Add a comment to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--body <text>', 'Comment body (storage format HTML)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; body: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.id, opts.body, opts.representation);\n success(data, 'confluence', 'add-comment', start);\n } catch (err) { fail(err, 'confluence', 'add-comment', start); }\n });\n\n // ── Labels ────────────────────────────────────────────────────────────────\n\n confluence.command('add-label')\n .description('Add labels to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--labels <names>', 'Comma-separated label names')\n .action(async (opts: { id: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n const data = await client.addLabel(opts.id, labels);\n success(data, 'confluence', 'add-label', start);\n } catch (err) { fail(err, 'confluence', 'add-label', start); }\n });\n\n confluence.command('remove-label')\n .description('Remove a label from a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--label <name>', 'Label name to remove')\n .action(async (opts: { id: string; label: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.removeLabel(opts.id, opts.label);\n success({ removed: opts.label, from: opts.id }, 'confluence', 'remove-label', start);\n } catch (err) { fail(err, 'confluence', 'remove-label', start); }\n });\n\n // ── Spaces ────────────────────────────────────────────────────────────────\n\n confluence.command('list-spaces')\n .description('List Confluence spaces')\n .option('--type <type>', 'Space type: global or personal')\n .option('--limit <n>', 'Max results (default: all)')\n .action(async (opts: { type?: string; limit?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listSpaces({\n type: opts.type,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined\n });\n success(data, 'confluence', 'list-spaces', start);\n } catch (err) { fail(err, 'confluence', 'list-spaces', start); }\n });\n\n confluence.command('get-space')\n .description('Get a Confluence space by key')\n .requiredOption('--key <space-key>', 'Space key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getSpace(opts.key);\n success(data, 'confluence', 'get-space', start);\n } catch (err) { fail(err, 'confluence', 'get-space', start); }\n });\n\n // ── Attachments ───────────────────────────────────────────────────────────\n\n confluence.command('list-attachments')\n .description('List attachments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listAttachments(opts.id);\n success(data, 'confluence', 'list-attachments', start);\n } catch (err) { fail(err, 'confluence', 'list-attachments', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SonarSystemStatus,\n SonarQualityGateStatus,\n SonarIssuesResponse,\n SonarIssue,\n SonarMeasuresComponent,\n SonarProjectsResponse,\n SonarProject,\n SonarHotspotsResponse,\n SonarHotspot\n} from '../../types/sonar.js';\n\nconst API = '/api';\n\nexport interface SearchIssuesOpts {\n projectKey: string;\n severities?: string;\n types?: string;\n statuses?: string;\n branch?: string;\n resolved?: boolean;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchHotspotsOpts {\n projectKey: string;\n status?: string;\n resolution?: string;\n branch?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchProjectsOpts {\n query?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface GetMeasuresOpts {\n projectKey: string;\n metricKeys: string;\n branch?: string;\n}\n\nexport class SonarClient {\n constructor(private http: HttpClient) {}\n\n async getStatus(): Promise<SonarSystemStatus> {\n return this.http.sonar<SonarSystemStatus>(`${API}/system/status`);\n }\n\n async getQualityGate(projectKey: string, branch?: string): Promise<SonarQualityGateStatus> {\n return this.http.sonar<SonarQualityGateStatus>(`${API}/qualitygates/project_status`, {\n params: { projectKey, ...(branch ? { branch } : {}) }\n });\n }\n\n async searchIssues(opts: SearchIssuesOpts): Promise<SonarIssuesResponse> {\n return this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllIssues(opts: SearchIssuesOpts): Promise<SonarIssue[]> {\n return this.http.sonarPaginate<SonarIssue>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.total, p: resp.p, ps: resp.ps, items: resp.issues };\n });\n }\n\n async getMeasures(opts: GetMeasuresOpts): Promise<SonarMeasuresComponent> {\n return this.http.sonar<SonarMeasuresComponent>(`${API}/measures/component`, {\n params: {\n component: opts.projectKey,\n metricKeys: opts.metricKeys,\n ...(opts.branch ? { branch: opts.branch } : {})\n }\n });\n }\n\n async searchProjects(opts: SearchProjectsOpts = {}): Promise<SonarProjectsResponse> {\n return this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: {\n q: opts.query,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllProjects(query?: string): Promise<SonarProject[]> {\n return this.http.sonarPaginate<SonarProject>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: { q: query, p: page, ps: pageSize }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.components };\n });\n }\n\n async searchHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspotsResponse> {\n return this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspot[]> {\n return this.http.sonarPaginate<SonarHotspot>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.hotspots };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SonarClient } from './client.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';\n\nconst DEFAULT_METRICS = 'coverage,duplicated_lines_density,bugs,vulnerabilities,code_smells,sqale_rating,reliability_rating,security_rating,ncloc';\n\nfunction getClient(program: Command): { client: SonarClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sonar.baseUrl) throw new PncliError('SonarQube not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SonarClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): string {\n const project = cliProject ?? config.defaults.sonar.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sonar.project in config.');\n return project;\n}\n\nexport function registerSonarCommands(program: Command): void {\n const sonar = program.command('sonar').description('SonarQube Server operations');\n\n // ── Quality Gate ─────────────────────────────────────────────────────────\n\n sonar.command('quality-gate')\n .description('Get quality gate status for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getQualityGate(projectKey, opts.branch);\n success(data, 'sonar', 'quality-gate', start);\n } catch (err) { fail(err, 'sonar', 'quality-gate', start); }\n });\n\n // ── Issues ────────────────────────────────────────────────────────────────\n\n sonar.command('issues')\n .description('Search/list issues for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--severities <list>', 'Filter by severity: BLOCKER,CRITICAL,MAJOR,MINOR,INFO (comma-separated)')\n .option('--types <list>', 'Filter by type: BUG,VULNERABILITY,CODE_SMELL (comma-separated)')\n .option('--statuses <list>', 'Filter by status: OPEN,CONFIRMED,REOPENED,RESOLVED,CLOSED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--resolved <bool>', 'Filter resolved issues: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page (max 500)', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results; ignores --page/--page-size)')\n .action(async (opts: { project?: string; severities?: string; types?: string; statuses?: string; branch?: string; resolved?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? opts.resolved === 'true' : undefined\n };\n if (opts.all) {\n const data = await client.searchAllIssues(baseOpts);\n success(data, 'sonar', 'issues', start);\n } else {\n const data = await client.searchIssues({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'issues', start);\n }\n } catch (err) { fail(err, 'sonar', 'issues', start); }\n });\n\n // ── Measures ──────────────────────────────────────────────────────────────\n\n sonar.command('measures')\n .description('Get key metrics for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--metrics <list>', 'Comma-separated metric keys', DEFAULT_METRICS)\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; metrics: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getMeasures({\n projectKey,\n metricKeys: opts.metrics,\n branch: opts.branch\n });\n success(data, 'sonar', 'measures', start);\n } catch (err) { fail(err, 'sonar', 'measures', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sonar.command('projects')\n .description('Search/list projects')\n .option('--query <text>', 'Search query')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { query?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n if (opts.all) {\n const data = await client.searchAllProjects(opts.query);\n success(data, 'sonar', 'projects', start);\n } else {\n const data = await client.searchProjects({\n query: opts.query,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'projects', start);\n }\n } catch (err) { fail(err, 'sonar', 'projects', start); }\n });\n\n // ── Hotspots ──────────────────────────────────────────────────────────────\n\n sonar.command('hotspots')\n .description('List security hotspots for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--status <status>', 'Filter: TO_REVIEW or REVIEWED')\n .option('--resolution <list>', 'Filter: FIXED,SAFE,ACKNOWLEDGED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; status?: string; resolution?: string; branch?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch\n };\n if (opts.all) {\n const data = await client.searchAllHotspots(baseOpts);\n success(data, 'sonar', 'hotspots', start);\n } else {\n const data = await client.searchHotspots({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'hotspots', start);\n }\n } catch (err) { fail(err, 'sonar', 'hotspots', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SdeServerInfo,\n SdeUser,\n SdeProject,\n SdeTask,\n SdeThreat,\n SdePaginatedResponse\n} from '../../types/sde.js';\n\nconst API = '/api/v2';\n\nexport interface ListProjectsOpts {\n name?: string;\n slug?: string;\n search?: string;\n active?: string;\n ordering?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListTasksOpts {\n projectId: number;\n phase?: string;\n priority?: string;\n status?: string;\n assignedTo?: string;\n source?: string;\n verification?: string;\n tag?: string;\n accepted?: string;\n relevant?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListThreatsOpts {\n projectId: number;\n severity?: string;\n title?: string;\n threatId?: string;\n capecId?: string;\n componentId?: string;\n search?: string;\n ordering?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListUsersOpts {\n email?: string;\n firstName?: string;\n lastName?: string;\n isActive?: string;\n page?: number;\n pageSize?: number;\n}\n\nfunction projectParams(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n name: opts.name,\n slug: opts.slug,\n search: opts.search,\n active: opts.active,\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction taskParams(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assigned_to: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction threatParams(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n severity: opts.severity,\n title: opts.title,\n threat_id: opts.threatId,\n capec_id: opts.capecId,\n component_id: opts.componentId,\n search: opts.search,\n ordering: opts.ordering,\n page,\n page_size: pageSize\n };\n}\n\nfunction userParams(opts: Omit<ListUsersOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n email: opts.email,\n first_name: opts.firstName,\n last_name: opts.lastName,\n is_active: opts.isActive,\n page,\n page_size: pageSize\n };\n}\n\nexport class SdeClient {\n constructor(private http: HttpClient) {}\n\n async getServerInfo(): Promise<SdeServerInfo> {\n return this.http.sde<SdeServerInfo>(`${API}/server-info/`);\n }\n\n async getMe(): Promise<SdeUser> {\n return this.http.sde<SdeUser>(`${API}/users/me/`);\n }\n\n async getProject(projectId: number, expand?: string, include?: string): Promise<SdeProject> {\n return this.http.sde<SdeProject>(`${API}/projects/${projectId}/`, {\n params: { expand, include }\n });\n }\n\n async getTask(projectId: number, taskId: string, expand?: string, include?: string): Promise<SdeTask> {\n return this.http.sde<SdeTask>(`${API}/projects/${projectId}/tasks/${taskId}/`, {\n params: { expand, include }\n });\n }\n\n async listProjects(opts: ListProjectsOpts = {}): Promise<SdePaginatedResponse<SdeProject>> {\n return this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllProjects(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'> = {}): Promise<SdeProject[]> {\n return this.http.sdePaginate<SdeProject>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listTasks(opts: ListTasksOpts): Promise<SdePaginatedResponse<SdeTask>> {\n return this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllTasks(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>): Promise<SdeTask[]> {\n return this.http.sdePaginate<SdeTask>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listThreats(opts: ListThreatsOpts): Promise<SdePaginatedResponse<SdeThreat>> {\n return this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllThreats(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>): Promise<SdeThreat[]> {\n return this.http.sdePaginate<SdeThreat>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listUsers(opts: ListUsersOpts = {}): Promise<SdePaginatedResponse<SdeUser>> {\n return this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllUsers(opts: Omit<ListUsersOpts, 'page' | 'pageSize'> = {}): Promise<SdeUser[]> {\n return this.http.sdePaginate<SdeUser>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SdeClient } from './client.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';\n\nfunction getClient(program: Command): { client: SdeClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sde.baseUrl) throw new PncliError('SDElements not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SdeClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): number {\n const project = cliProject ?? config.defaults.sde.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sde.project in config.');\n if (!/^\\d+$/.test(project)) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n const id = parseInt(project, 10);\n if (id <= 0) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n return id;\n}\n\nfunction parsePage(val: string, flag: string): number {\n const n = parseInt(val, 10);\n if (isNaN(n) || n < 1) throw new PncliError(`Invalid ${flag}: \"${val}\". Must be a positive integer.`);\n return n;\n}\n\nfunction validateActive(val: string | undefined, allowed: string[]): string | undefined {\n if (val === undefined) return undefined;\n if (!allowed.includes(val)) {\n throw new PncliError(`Invalid --active value: \"${val}\". Allowed: ${allowed.join(', ')}.`);\n }\n return val;\n}\n\nexport function registerSdeCommands(program: Command): void {\n const sde = program.command('sde').description('SDElements operations (threat modeling, countermeasures, compliance)');\n\n // ── Server Info ───────────────────────────────────────────────────────────\n\n sde.command('server-info')\n .description('Get server version and platform info (requires super-user)')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getServerInfo();\n success(data, 'sde', 'server-info', start);\n } catch (err) { fail(err, 'sde', 'server-info', start); }\n });\n\n // ── Whoami ────────────────────────────────────────────────────────────────\n\n sde.command('whoami')\n .description('Get current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getMe();\n success(data, 'sde', 'whoami', start);\n } catch (err) { fail(err, 'sde', 'whoami', start); }\n });\n\n // ── Users ─────────────────────────────────────────────────────────────────\n\n sde.command('users')\n .description('List users')\n .option('--email <email>', 'Filter by email address')\n .option('--first-name <name>', 'Filter by first name')\n .option('--last-name <name>', 'Filter by last name')\n .option('--active <bool>', 'Filter by active status: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { email?: string; firstName?: string; lastName?: string; active?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n email: opts.email,\n firstName: opts.firstName,\n lastName: opts.lastName,\n isActive: validateActive(opts.active, ['true', 'false'])\n };\n if (opts.all) {\n const data = await client.listAllUsers(baseOpts);\n success(data, 'sde', 'users', start);\n } else {\n const data = await client.listUsers({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'users', start);\n }\n } catch (err) { fail(err, 'sde', 'users', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sde.command('projects')\n .description('List projects')\n .option('--name <name>', 'Filter by project name')\n .option('--search <text>', 'Text search on name and profile')\n .option('--active <val>', 'Filter by active status: true, false, or all')\n .option('--ordering <field>', 'Sort by: name, created, updated (prefix with - for descending)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { name?: string; search?: string; active?: string; ordering?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n name: opts.name,\n search: opts.search,\n active: validateActive(opts.active, ['true', 'false', 'all']),\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllProjects(baseOpts);\n success(data, 'sde', 'projects', start);\n } else {\n const data = await client.listProjects({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'projects', start);\n }\n } catch (err) { fail(err, 'sde', 'projects', start); }\n });\n\n // ── Project ───────────────────────────────────────────────────────────────\n\n sde.command('project')\n .description('Get a single project by ID')\n .option('--id <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .action(async (opts: { id?: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.id);\n const data = await client.getProject(projectId, opts.expand, opts.include);\n success(data, 'sde', 'project', start);\n } catch (err) { fail(err, 'sde', 'project', start); }\n });\n\n // ── Tasks ─────────────────────────────────────────────────────────────────\n\n sde.command('tasks')\n .description('List countermeasures for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--phase <slug>', 'Filter by phase slug (e.g. development, architecture-design)')\n .option('--priority <n>', 'Filter by priority (1-10)')\n .option('--status <id>', 'Filter by status ID (e.g. TS1, TS2)')\n .option('--assigned-to <email>', 'Filter by assignee email')\n .option('--source <val>', 'Filter by source: default, custom, manual, project')\n .option('--verification <val>', 'Filter by verification: pass, fail, partial, none')\n .option('--tag <name>', 'Filter by tag name')\n .option('--accepted <bool>', 'Filter by accepted status: true or false')\n .option('--relevant <bool>', 'Filter by relevant status: true or false')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references,regulation_sections')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; phase?: string; priority?: string; status?: string; assignedTo?: string; source?: string; verification?: string; tag?: string; accepted?: string; relevant?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assignedTo: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllTasks(baseOpts);\n success(data, 'sde', 'tasks', start);\n } else {\n const data = await client.listTasks({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'tasks', start);\n }\n } catch (err) { fail(err, 'sde', 'tasks', start); }\n });\n\n // ── Task ──────────────────────────────────────────────────────────────────\n\n sde.command('task')\n .description('Get a single countermeasure')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .requiredOption('--task <id>', 'Task ID (e.g. T21)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references')\n .action(async (opts: { project?: string; task: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const data = await client.getTask(projectId, opts.task, opts.expand, opts.include);\n success(data, 'sde', 'task', start);\n } catch (err) { fail(err, 'sde', 'task', start); }\n });\n\n // ── Threats ───────────────────────────────────────────────────────────────\n\n sde.command('threats')\n .description('List threats for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--severity <n>', 'Filter by severity (1-10)')\n .option('--search <text>', 'Full-text search on title and threat ID')\n .option('--ordering <field>', 'Sort by: threat__severity, threat_id, status (prefix - for descending)')\n .option('--capec-id <id>', 'Filter by CAPEC attack pattern ID')\n .option('--component-id <id>', 'Filter by component ID')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; severity?: string; search?: string; ordering?: string; capecId?: string; componentId?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n severity: opts.severity,\n search: opts.search,\n ordering: opts.ordering,\n capecId: opts.capecId,\n componentId: opts.componentId\n };\n if (opts.all) {\n const data = await client.listAllThreats(baseOpts);\n success(data, 'sde', 'threats', start);\n } else {\n const data = await client.listThreats({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'threats', start);\n }\n } catch (err) { fail(err, 'sde', 'threats', start); }\n });\n}\n","import { Command, Option } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { loadConfig } from '../../lib/config.js';\nimport type { ScanOptions, Ecosystem, FriskSource } 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, Sonatype OSS Index, or Sonatype IQ Server)')\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 .addOption(new Option('--source <source>', 'Vulnerability source').choices(['osv', 'sonatype', 'sonatypeiq', 'all']).default('osv'))\n .option('--application-id <id>', 'Sonatype IQ Server application ID (required when --source sonatypeiq)')\n .action(async (opts: { ecosystem: string; directOnly: boolean; includeDev: boolean; source: string; applicationId?: string }, 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, opts.source as FriskSource, opts.applicationId);\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, OSV.dev, and Sonatype OSS Index, 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 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 maxBuffer: 10 * 1024 * 1024\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 maxBuffer: 10 * 1024 * 1024\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 maxBuffer: 10 * 1024 * 1024\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 { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst SONATYPE_URL = 'https://ossindex.sonatype.org';\nconst BATCH_SIZE = 128; // OSS Index limit per request\nconst TIMEOUT_MS = 30_000;\n\ninterface SonatypeVuln {\n id: string;\n displayName: string;\n title: string;\n description: string;\n cvssScore: number;\n cvssVector?: string;\n cwe?: string;\n reference: string;\n externalReferences?: string[];\n}\n\ninterface SonatypeComponentReport {\n coordinates: string;\n description?: string;\n reference: string;\n vulnerabilities: SonatypeVuln[];\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\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n // Scoped packages: @scope/name → pkg:npm/%40scope/name@version\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n // pncli stores Maven names as \"groupId:artifactId\"\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction inferSeverityFromCvss(score: number): string {\n if (score >= 9.0) return 'CRITICAL';\n if (score >= 7.0) return 'HIGH';\n if (score >= 4.0) return 'MEDIUM';\n if (score > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction mapSonatypeVuln(v: SonatypeVuln, pkg: Package): OsvVulnerability {\n const refs: string[] = [v.reference, ...(v.externalReferences ?? [])].filter(Boolean);\n\n // Sonatype doesn't return fixed versions — direct user to the vulnerability reference\n const advice = `See ${v.reference} for remediation details for ${pkg.name}@${pkg.version}.`;\n\n const cvePattern = /CVE-\\d{4}-\\d+/gi;\n const searchText = [v.displayName, v.title, v.description].filter(Boolean).join(' ');\n const aliases = [...new Set([...searchText.matchAll(cvePattern)].map(m => m[0].toUpperCase()))];\n\n return {\n id: v.displayName || v.id,\n summary: v.title || v.description,\n severity: inferSeverityFromCvss(v.cvssScore),\n cvss: v.cvssScore > 0 ? v.cvssScore : null,\n aliases,\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice\n },\n references: refs\n };\n}\n\nasync function queryBatch(\n purls: string[],\n packages: Package[]\n): Promise<VulnerablePackage[]> {\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: purls })\n });\n\n if (res.status === 429) {\n throw new Error(\n 'Sonatype OSS Index is rate-limiting requests from this IP. ' +\n 'Create a free account at ossindex.sonatype.org and add your credentials to your pncli config to raise the limit.'\n );\n }\n\n if (!res.ok) {\n throw new Error(`Sonatype OSS Index returned HTTP ${res.status}`);\n }\n\n const reports = (await res.json()) as SonatypeComponentReport[];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const report of reports) {\n if (!report?.coordinates) continue;\n const pkg = purlToPackage.get(report.coordinates);\n if (!pkg) continue;\n const vulns = report.vulnerabilities ?? [];\n if (vulns.length === 0) continue;\n vulnerable.push({ ...pkg, vulnerabilities: vulns.map(v => mapSonatypeVuln(v, pkg)) });\n }\n\n return vulnerable;\n}\n\nexport async function checkSonatypeConnectivity(): Promise<{ reachable: boolean; error?: string }> {\n try {\n // Send an empty batch to verify the endpoint is reachable\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: [] })\n });\n return { reachable: res.ok || res.status === 400 };\n } catch (err) {\n return {\n reachable: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport async function checkPackagesForVulnsViaSonatype(\n packages: Package[]\n): 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 const purls = chunk.map(toPurl);\n const results = await queryBatch(purls, chunk);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n","import type { ResolvedConfig } from '../../../types/config.js';\nimport type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst TIMEOUT_MS = 60_000;\nconst MAX_POLL_ATTEMPTS = 10;\nconst POLL_INTERVAL_MS = 2_000;\nconst BATCH_SIZE = 128;\n\ninterface IqConstraintReason {\n reason: string;\n reference?: {\n type: string;\n value: string;\n };\n}\n\ninterface IqConstraintViolation {\n constraintName: string;\n reasons: IqConstraintReason[];\n}\n\ninterface IqPolicyViolation {\n policyId: string;\n policyName: string;\n policyThreatCategory: string;\n policyThreatLevel: number;\n constraintViolations: IqConstraintViolation[];\n}\n\ninterface IqComponentResult {\n component: {\n packageUrl: string;\n };\n matchState: string;\n criticalVulnerabilityCount?: number;\n severeVulnerabilityCount?: number;\n moderateVulnerabilityCount?: number;\n policyData?: {\n policyViolations?: IqPolicyViolation[];\n };\n}\n\ninterface IqEvaluationResponse {\n isQueued: boolean;\n resultsUrl?: string;\n components?: IqComponentResult[];\n}\n\ninterface IqApplicationsResponse {\n applications?: Array<{ id: string; publicId: string; name: string }>;\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\nfunction buildBasicAuth(userCode: string, passcode: string): string {\n return `Basic ${Buffer.from(`${userCode}:${passcode}`).toString('base64')}`;\n}\n\nfunction threatLevelToSeverity(level: number): string {\n if (level >= 9) return 'CRITICAL';\n if (level >= 7) return 'HIGH';\n if (level >= 4) return 'MEDIUM';\n if (level > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction mapViolationToVuln(violation: IqPolicyViolation): OsvVulnerability {\n const cveRefs = violation.constraintViolations.flatMap(cv =>\n cv.reasons\n .filter(r => r.reference?.type === 'VULNERABILITY')\n .map(r => r.reference!.value)\n );\n const id = cveRefs[0] ?? violation.policyId;\n const severity = threatLevelToSeverity(violation.policyThreatLevel);\n\n return {\n id,\n summary: violation.policyName,\n severity,\n cvss: null,\n aliases: [...new Set(cveRefs)],\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice: `Policy violation: ${violation.policyName} (threat level ${violation.policyThreatLevel}). Check Sonatype IQ Server for details.`\n },\n references: []\n };\n}\n\nfunction syntheticVulnsFromCounts(\n criticalCount: number,\n severeCount: number,\n moderateCount: number,\n pkgName: string\n): OsvVulnerability[] {\n const vulns: OsvVulnerability[] = [];\n if (criticalCount > 0) {\n vulns.push({\n id: `iq-critical-${pkgName}`,\n summary: `${criticalCount} critical vulnerability(ies) detected by Sonatype IQ`,\n severity: 'CRITICAL',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (severeCount > 0) {\n vulns.push({\n id: `iq-high-${pkgName}`,\n summary: `${severeCount} severe vulnerability(ies) detected by Sonatype IQ`,\n severity: 'HIGH',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (moderateCount > 0) {\n vulns.push({\n id: `iq-medium-${pkgName}`,\n summary: `${moderateCount} moderate vulnerability(ies) detected by Sonatype IQ`,\n severity: 'MEDIUM',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n return vulns;\n}\n\nasync function resolveApplicationInternalId(\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<string> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?publicId=${encodeURIComponent(applicationId)}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n if (!res.ok) return applicationId;\n const data = await res.json() as IqApplicationsResponse;\n if (data.applications && data.applications.length > 0) {\n return data.applications[0]!.id;\n }\n return applicationId;\n}\n\nasync function pollResults(\n baseUrl: string,\n resultsUrl: string,\n auth: string\n): Promise<IqEvaluationResponse> {\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS * attempt));\n }\n\n const url = resultsUrl.startsWith('http') ? resultsUrl : `${baseUrl.replace(/\\/$/, '')}${resultsUrl}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status} polling results`);\n }\n\n const data = await res.json() as IqEvaluationResponse;\n if (!data.isQueued) return data;\n }\n\n throw new Error('Sonatype IQ Server evaluation timed out waiting for results.');\n}\n\nasync function evaluateBatch(\n purls: string[],\n packages: Package[],\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<VulnerablePackage[]> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/evaluation/applications/${encodeURIComponent(applicationId)}`;\n\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Authorization': auth, 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({ components: purls.map(p => ({ packageUrl: p })) })\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status}`);\n }\n\n let data = await res.json() as IqEvaluationResponse;\n\n if (data.isQueued && data.resultsUrl) {\n data = await pollResults(baseUrl, data.resultsUrl, auth);\n }\n\n const components = data.components ?? [];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const result of components) {\n if (!result?.component?.packageUrl) continue;\n\n const pkg = purlToPackage.get(result.component.packageUrl);\n if (!pkg) continue;\n\n const criticalCount = result.criticalVulnerabilityCount ?? 0;\n const severeCount = result.severeVulnerabilityCount ?? 0;\n const moderateCount = result.moderateVulnerabilityCount ?? 0;\n const totalVulns = criticalCount + severeCount + moderateCount;\n\n const violations = result.policyData?.policyViolations ?? [];\n const securityViolations = violations.filter(v => v.policyThreatCategory === 'SECURITY');\n\n if (securityViolations.length === 0 && totalVulns === 0) continue;\n\n const vulnerabilities: OsvVulnerability[] = securityViolations.length > 0\n ? securityViolations.map(v => mapViolationToVuln(v))\n : syntheticVulnsFromCounts(criticalCount, severeCount, moderateCount, pkg.name);\n\n vulnerable.push({ ...pkg, vulnerabilities });\n }\n\n return vulnerable;\n}\n\nexport async function checkPackagesViaIqServer(\n packages: Package[],\n applicationId: string,\n config: ResolvedConfig\n): Promise<VulnerablePackage[]> {\n const { baseUrl, userCode, passcode } = config.sonatypeiq;\n if (!baseUrl) throw new Error('Sonatype IQ Server baseUrl not configured.');\n if (!userCode || !passcode) throw new Error('Sonatype IQ Server credentials not configured.');\n\n const auth = buildBasicAuth(userCode, passcode);\n const internalId = await resolveApplicationInternalId(baseUrl, applicationId, auth);\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 const purls = chunk.map(toPurl);\n const results = await evaluateBatch(purls, chunk, baseUrl, internalId, auth);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n\nexport async function checkSonatypeIqConnectivity(\n baseUrl: string,\n userCode: string,\n passcode: string\n): Promise<{ reachable: boolean; authenticated: boolean; error?: string }> {\n try {\n const auth = buildBasicAuth(userCode, passcode);\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?limit=1`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10_000);\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (res.status === 401 || res.status === 403) {\n return { reachable: true, authenticated: false, error: `Authentication failed (HTTP ${res.status})` };\n }\n\n return { reachable: true, authenticated: res.ok };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\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';\nimport { checkSonatypeConnectivity } from './clients/sonatype.js';\nimport { checkSonatypeIqConnectivity } from './clients/sonatypeiq.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 checkSonatypeReachable(): Promise<boolean> {\n const result = await checkSonatypeConnectivity();\n return result.reachable;\n}\n\nexport async function buildConnectivityData(config: ResolvedConfig): Promise<ConnectivityData> {\n const iqCfg = config.sonatypeiq;\n const iqConfigured = !!(iqCfg.baseUrl && iqCfg.userCode && iqCfg.passcode);\n\n const checks = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory),\n checkSonatypeConnectivity(),\n iqConfigured\n ? checkSonatypeIqConnectivity(iqCfg.baseUrl!, iqCfg.userCode!, iqCfg.passcode!)\n : Promise.resolve(null)\n ]);\n\n const [osvResult, artResult, sonatypeResult, iqResult] = checks;\n\n const artCfg = config.artifactory;\n\n let tier: Tier = 'local';\n if (artResult.reachable && artResult.authenticated) tier = 'artifactory';\n if (osvResult.reachable || sonatypeResult.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 sonatype: {\n reachable: sonatypeResult.reachable,\n url: 'https://ossindex.sonatype.org',\n ...(sonatypeResult.error ? { error: sonatypeResult.error } : {})\n },\n ...(iqConfigured && iqResult ? {\n sonatypeiq: {\n reachable: iqResult.reachable,\n authenticated: iqResult.authenticated,\n url: iqCfg.baseUrl!,\n ...(iqResult.error ? { error: iqResult.error } : {})\n }\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 || sonatypeResult.reachable || (iqResult?.reachable && iqResult?.authenticated) === true\n }\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, FriskData, FriskSource, FriskSourceError, VulnerablePackage } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { checkPackagesForVulns } from './clients/osv.js';\nimport { checkPackagesForVulnsViaSonatype } from './clients/sonatype.js';\nimport { checkPackagesViaIqServer } from './clients/sonatypeiq.js';\nimport { detectTier, checkSonatypeReachable } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nexport async function runFrisk(\n config: ResolvedConfig,\n opts: ScanOptions,\n source: FriskSource = 'osv',\n applicationId?: string\n): Promise<FriskData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Validate sonatypeiq config upfront before any network checks\n if (source === 'sonatypeiq') {\n if (!config.sonatypeiq.baseUrl || !config.sonatypeiq.userCode || !config.sonatypeiq.passcode) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires Sonatype IQ Server to be configured. Run: pncli config init',\n 1\n );\n }\n if (!applicationId) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires --application-id <id>. ' +\n 'Use \\'pncli sonatypeiq applications list\\' to find application IDs.',\n 1\n );\n }\n }\n\n const { tier: baseTier, osvReachable } = await detectTier(config);\n const sonatypeReachable = (source === 'sonatype' || source === 'all') ? await checkSonatypeReachable() : false;\n const tier = sonatypeReachable ? 'full' : baseTier;\n\n if (source === 'osv' && !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 if (source === 'sonatype' && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk --source sonatype requires Sonatype OSS Index access but ossindex.sonatype.org is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n if (source === 'all' && !osvReachable && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk requires either OSV.dev or Sonatype OSS Index access, but neither is reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n // For source=all, capture pre-check failures in sourceErrors so the LLM can see what was skipped\n const sourceErrors: FriskSourceError[] = [];\n let sourcesQueried: FriskSource[];\n\n if (source === 'all') {\n if (!osvReachable) sourceErrors.push({ source: 'osv', error: 'api.osv.dev is not reachable — run pncli deps connectivity to diagnose.' });\n if (!sonatypeReachable) sourceErrors.push({ source: 'sonatype', error: 'ossindex.sonatype.org is not reachable — run pncli deps connectivity to diagnose.' });\n sourcesQueried = [\n ...(osvReachable ? ['osv' as const] : []),\n ...(sonatypeReachable ? ['sonatype' as const] : [])\n ];\n } else {\n sourcesQueried = [source];\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, source, sourcesQueried, sourceErrors, scanned: 0, vulnerable: 0, packages: [] };\n }\n\n let vulnerable: VulnerablePackage[];\n\n if (source === 'sonatypeiq') {\n vulnerable = await checkPackagesViaIqServer(scan.packages, applicationId!, config);\n } else if (source === 'sonatype') {\n vulnerable = await checkPackagesForVulnsViaSonatype(scan.packages);\n } else if (source === 'all') {\n // Use allSettled so a runtime failure from one source doesn't discard results from the other\n const [osvSettled, sonatypeSettled] = await Promise.allSettled([\n osvReachable ? checkPackagesForVulns(scan.packages) : Promise.resolve([] as VulnerablePackage[]),\n sonatypeReachable ? checkPackagesForVulnsViaSonatype(scan.packages) : Promise.resolve([] as VulnerablePackage[])\n ]);\n\n if (osvReachable) {\n if (osvSettled.status === 'rejected') {\n sourceErrors.push({ source: 'osv', error: toErrorMessage(osvSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'osv');\n }\n }\n if (sonatypeReachable) {\n if (sonatypeSettled.status === 'rejected') {\n sourceErrors.push({ source: 'sonatype', error: toErrorMessage(sonatypeSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'sonatype');\n }\n }\n\n if (sourcesQueried.length === 0) {\n throw new PncliError(\n 'All vulnerability sources failed during scanning. Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n vulnerable = mergeVulnerablePackages(\n osvSettled.status === 'fulfilled' ? osvSettled.value : [],\n sonatypeSettled.status === 'fulfilled' ? sonatypeSettled.value : []\n );\n } else {\n vulnerable = await checkPackagesForVulns(scan.packages);\n }\n\n return {\n tier,\n source,\n sourcesQueried,\n sourceErrors,\n scanned: scan.packages.length,\n vulnerable: vulnerable.length,\n packages: vulnerable\n };\n}\n\nfunction mergeVulnerablePackages(\n osvResults: VulnerablePackage[],\n sonatypeResults: VulnerablePackage[]\n): VulnerablePackage[] {\n const byKey = new Map<string, VulnerablePackage>();\n\n for (const pkg of osvResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n byKey.set(key, { ...pkg });\n }\n\n for (const pkg of sonatypeResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n const existing = byKey.get(key);\n if (existing) {\n // Merge: add Sonatype vulns not already present by ID\n const existingIds = new Set(existing.vulnerabilities.map(v => v.id));\n const newVulns = pkg.vulnerabilities.filter(v => !existingIds.has(v.id));\n existing.vulnerabilities = [...existing.vulnerabilities, ...newVulns];\n } else {\n byKey.set(key, { ...pkg });\n }\n }\n\n return [...byKey.values()];\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 input from '@inquirer/input';\nimport password from '@inquirer/password';\nimport confirm from '@inquirer/confirm';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n setRepoConfigValue,\n maskConfig,\n getGlobalConfigPath\n} from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { AdoCoreClient } from '../ado/client/core.js';\nimport { AdoWorkClient } from '../ado/client/work.js';\nimport { discoverFields, discoverTypes, buildDefaultAliases } from '../ado/discovery.js';\nimport { checkArtifactoryConnectivity } from '../deps/clients/artifactory.js';\nimport { success, fail, warn } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport chalk from 'chalk';\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.exitCode = ExitCode.GENERAL_ERROR;\n return;\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 .option('--repo', 'Write to repo config (.pncli.json) instead of global config')\n .action((key: string, value: string, cmdOpts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (cmdOpts.repo) {\n setRepoConfigValue(key, value);\n success({ key, value, target: '.pncli.json' }, 'config', 'set', start);\n } else {\n const opts = program.optsWithGlobals();\n setConfigValue(key, value, opts.config);\n success({ key, value }, 'config', 'set', start);\n }\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(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n const http = createHttpClient(cfg);\n\n type ServiceResult = { ok: boolean; message: string } | { ok: null; message: string };\n const results: Record<string, ServiceResult> = {};\n\n if (cfg.jira.baseUrl) {\n try {\n await http.jira<unknown>('/rest/api/2/myself');\n results.jira = { ok: true, message: 'connected' };\n } catch (err) {\n results.jira = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jira = { ok: null, message: 'not configured' };\n }\n\n if (cfg.bitbucket.baseUrl) {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties');\n results.bitbucket = { ok: true, message: 'connected' };\n } catch (err) {\n results.bitbucket = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.bitbucket = { ok: null, message: 'not configured' };\n }\n\n if (cfg.confluence.baseUrl) {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 } });\n results.confluence = { ok: true, message: 'connected' };\n } catch (err) {\n results.confluence = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.confluence = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonar.baseUrl) {\n try {\n await http.sonar<unknown>('/api/system/status');\n results.sonar = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonar = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonar = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sde.baseUrl) {\n try {\n await http.sde<unknown>('/api/v2/users/me/');\n results.sde = { ok: true, message: 'connected' };\n } catch (err) {\n results.sde = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sde = { ok: null, message: 'not configured' };\n }\n\n if (cfg.ado.baseUrl) {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path);\n results.ado = { ok: true, message: 'connected' };\n } catch (err) {\n results.ado = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.ado = { ok: null, message: 'not configured' };\n }\n\n if (cfg.jenkins.baseUrl && cfg.jenkins.username && cfg.jenkins.apiToken) {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' } });\n results.jenkins = { ok: true, message: 'connected' };\n } catch (err) {\n results.jenkins = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jenkins = { ok: null, message: 'not configured' };\n }\n\n if (cfg.artifactory.baseUrl) {\n try {\n await http.artifactoryText('/api/system/ping');\n results.artifactory = { ok: true, message: 'connected' };\n } catch (err) {\n results.artifactory = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.artifactory = { ok: null, message: 'not configured' };\n }\n\n if (cfg.udeploy.baseUrl && (cfg.udeploy.pat || (cfg.udeploy.username && cfg.udeploy.password))) {\n try {\n await http.udeploy<unknown>('/cli/application');\n results.udeploy = { ok: true, message: 'connected' };\n } catch (err) {\n results.udeploy = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.udeploy = { ok: null, message: 'not configured' };\n }\n\n if (cfg.checkmarx.baseUrl && cfg.checkmarx.username && cfg.checkmarx.password) {\n try {\n await http.checkmarx<unknown>('/cxrestapi/projects');\n results.checkmarx = { ok: true, message: 'connected' };\n } catch (err) {\n results.checkmarx = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.checkmarx = { ok: null, message: 'not configured' };\n }\n\n const snConfigured = cfg.servicenow.baseUrl && cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (snConfigured) {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n results.servicenow = { ok: true, message: 'connected' };\n } catch (err) {\n results.servicenow = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.servicenow = { ok: null, message: 'not configured' };\n }\n\n if (cfg.contrast.apiKey && cfg.contrast.serviceKey && cfg.contrast.username && cfg.contrast.orgUuid) {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 } });\n results.contrast = { ok: true, message: 'connected' };\n } catch (err) {\n results.contrast = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.contrast = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonatypeiq.baseUrl && cfg.sonatypeiq.userCode && cfg.sonatypeiq.passcode) {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n results.sonatypeiq = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonatypeiq = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonatypeiq = { ok: null, message: 'not configured' };\n }\n\n success(results, 'config', 'test', start);\n } catch (err) {\n fail(err, 'config', 'test', start);\n }\n });\n\n config\n .command('check')\n .description('Check PAT status for every service: Blank, Valid, or Invalid')\n .option('--output <format>', 'Output format: json or table', 'json')\n .action(async (cmdOpts: { output: string }) => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n // Always bypass --dry-run: a dry-run config check is meaningless\n const http = createHttpClient(cfg, false);\n\n type CheckStatus = 'blank' | 'valid' | 'invalid' | 'error';\n type CheckResult = { status: CheckStatus; message: string };\n const results: Record<string, CheckResult> = {};\n\n function categorize(err: unknown): CheckResult {\n const status = (err as { status?: number }).status ?? -1;\n if (status === 401 || status === 403) {\n return { status: 'invalid', message: `auth rejected (${status})` };\n }\n if (status === 0) {\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n\n // Jira\n if (!cfg.jira.apiToken) {\n results.jira = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jira.baseUrl) {\n results.jira = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jira<unknown>('/rest/api/2/myself', { timeoutMs: 10_000 });\n results.jira = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jira = categorize(err);\n }\n }\n\n // Bitbucket\n if (!cfg.bitbucket.pat) {\n results.bitbucket = { status: 'blank', message: 'not configured' };\n } else if (!cfg.bitbucket.baseUrl) {\n results.bitbucket = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties', { timeoutMs: 10_000 });\n results.bitbucket = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.bitbucket = categorize(err);\n }\n }\n\n // Confluence — distinguish explicit token from Jira fallback\n if (!cfg.confluence.apiTokenExplicit && !cfg.jira.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.baseUrl) {\n results.confluence = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 }, timeoutMs: 10_000 });\n const msg = cfg.confluence.apiTokenExplicit ? 'ok' : 'ok (inherited from Jira token)';\n results.confluence = { status: 'valid', message: msg };\n } catch (err) {\n results.confluence = categorize(err);\n }\n }\n\n // SonarQube\n if (!cfg.sonar.token) {\n results.sonar = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonar.baseUrl) {\n results.sonar = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonar<unknown>('/api/system/status', { timeoutMs: 10_000 });\n results.sonar = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonar = categorize(err);\n }\n }\n\n // SDElements\n if (!cfg.sde.token) {\n results.sde = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sde.baseUrl) {\n results.sde = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sde<unknown>('/api/v2/users/me/', { timeoutMs: 10_000 });\n results.sde = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sde = categorize(err);\n }\n }\n\n // Azure DevOps\n if (!cfg.ado.pat) {\n results.ado = { status: 'blank', message: 'not configured' };\n } else if (!cfg.ado.baseUrl) {\n results.ado = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path, { timeoutMs: 10_000 });\n results.ado = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.ado = categorize(err);\n }\n }\n\n // Jenkins\n if (!cfg.jenkins.apiToken || !cfg.jenkins.username) {\n results.jenkins = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jenkins.baseUrl) {\n results.jenkins = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' }, timeoutMs: 10_000 });\n results.jenkins = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jenkins = categorize(err);\n }\n }\n\n // UDeploy\n if (!cfg.udeploy.pat && !(cfg.udeploy.username && cfg.udeploy.password)) {\n results.udeploy = { status: 'blank', message: 'not configured' };\n } else if (!cfg.udeploy.baseUrl) {\n results.udeploy = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.udeploy<unknown>('/cli/application', { timeoutMs: 10_000 });\n results.udeploy = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.udeploy = categorize(err);\n }\n }\n\n // Artifactory — reuse existing helper\n const artResult = await checkArtifactoryConnectivity(cfg.artifactory);\n if (!artResult.configured) {\n results.artifactory = { status: 'blank', message: artResult.error ?? 'not configured' };\n } else if (!artResult.authenticated) {\n results.artifactory = { status: 'invalid', message: artResult.error ?? 'auth rejected' };\n } else if (!artResult.reachable) {\n results.artifactory = { status: 'error', message: artResult.error ?? 'unreachable' };\n } else {\n results.artifactory = { status: 'valid', message: 'ok' };\n }\n\n // Checkmarx\n if (!cfg.checkmarx.username || !cfg.checkmarx.password) {\n results.checkmarx = { status: 'blank', message: 'not configured' };\n } else if (!cfg.checkmarx.baseUrl) {\n results.checkmarx = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.checkmarx<unknown>('/cxrestapi/projects', { timeoutMs: 10_000 });\n results.checkmarx = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.checkmarx = categorize(err);\n }\n }\n\n // ServiceNow\n const snCreds = cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (!snCreds) {\n results.servicenow = { status: 'blank', message: 'not configured' };\n } else if (!cfg.servicenow.baseUrl) {\n results.servicenow = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 }, timeoutMs: 10_000 });\n results.servicenow = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.servicenow = categorize(err);\n }\n }\n\n // Contrast IAST\n if (!cfg.contrast.apiKey || !cfg.contrast.serviceKey || !cfg.contrast.username) {\n results.contrast = { status: 'blank', message: 'not configured' };\n } else if (!cfg.contrast.orgUuid) {\n results.contrast = { status: 'error', message: 'orgUuid not configured' };\n } else {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 }, timeoutMs: 10_000 });\n results.contrast = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.contrast = categorize(err);\n }\n }\n\n // Sonatype IQ Server\n if (!cfg.sonatypeiq.userCode || !cfg.sonatypeiq.passcode) {\n results.sonatypeiq = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonatypeiq.baseUrl) {\n results.sonatypeiq = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 }, timeoutMs: 10_000 });\n results.sonatypeiq = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonatypeiq = categorize(err);\n }\n }\n\n // Exit code: prefer AUTH_ERROR if any invalid, else NETWORK_ERROR if any errors\n const statuses = Object.values(results).map(r => r.status);\n if (statuses.includes('invalid')) process.exitCode = ExitCode.AUTH_ERROR;\n else if (statuses.includes('error')) process.exitCode = ExitCode.NETWORK_ERROR;\n\n if (cmdOpts.output === 'table') {\n // Human-readable table to stdout\n const services = ['jira', 'bitbucket', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stdout.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stdout.write('\\n');\n } else {\n // Pretty table on stderr when --pretty is set (stdout stays JSON)\n if (opts.pretty) {\n const services = ['jira', 'bitbucket', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stderr.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stderr.write('\\n');\n }\n success(results, 'config', 'check', start);\n }\n } catch (err) {\n fail(err, 'config', 'check', start);\n }\n });\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return trimmed;\n return /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\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. 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. 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── Confluence ────────────────────────────────────\\n');\n const confluenceBaseUrl = await input({\n message: 'Confluence base URL (e.g. confluence.your-company.com):',\n default: ''\n });\n\n const confluenceApiToken = await password({\n message: 'Confluence 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. 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── SonarQube ─────────────────────────────────────\\n');\n const useSonar = await confirm({\n message: 'Configure SonarQube Server for code quality checks?',\n default: false\n });\n\n let sonarBaseUrl = '';\n let sonarToken = '';\n\n if (useSonar) {\n sonarBaseUrl = await input({\n message: 'SonarQube Server base URL (e.g. sonar.your-company.com):',\n default: ''\n });\n\n sonarToken = await password({\n message: 'SonarQube personal access token:'\n });\n }\n\n process.stderr.write('\\n── SDElements ────────────────────────────────────\\n');\n const useSde = await confirm({\n message: 'Configure SDElements for threat modeling and countermeasure queries?',\n default: false\n });\n\n let sdeBaseUrl = '';\n let sdeToken = '';\n\n if (useSde) {\n process.stderr.write(' Connection string format: <api-token>@<base-url>\\n');\n const useSdeConnectionString = await confirm({\n message: 'Do you have a connection string to paste (token@url)?',\n default: false\n });\n\n if (useSdeConnectionString) {\n const sdeConnection = await password({\n message: 'SDElements connection string (api-token@hostname, e.g. mytoken@myorg.sdelements.com):'\n });\n const atIdx = sdeConnection.indexOf('@');\n if (atIdx > 0) {\n sdeToken = sdeConnection.slice(0, atIdx);\n sdeBaseUrl = sdeConnection.slice(atIdx + 1);\n }\n } else {\n sdeBaseUrl = await input({\n message: 'SDElements hostname\\n Cloud-hosted: your-org.sdelements.com\\n On-premise: sde.your-company.com\\n Host: ',\n default: ''\n });\n\n sdeToken = await password({\n message: 'SDElements API token:'\n });\n }\n }\n\n process.stderr.write('\\n── Azure DevOps Server ───────────────────────────\\n');\n const useAdo = await confirm({\n message: 'Configure Azure DevOps Server for work items, repos, and pipelines?',\n default: false\n });\n\n let adoBaseUrl = '';\n let adoPat = '';\n let adoCollection = '';\n let adoProject = '';\n let adoFieldAliases: Record<string, string> = {};\n let adoDiscoveredFields: import('../../types/config.js').AdoFieldMeta[] = [];\n let adoDiscoveredTypes: import('../../types/config.js').AdoWorkItemTypeMeta[] = [];\n\n if (useAdo) {\n adoBaseUrl = await input({\n message: 'Azure DevOps Server base URL (e.g. tfs.company.com or devops.company.com/tfs):',\n default: ''\n });\n\n adoPat = await password({\n message: 'Azure DevOps personal access token:'\n });\n\n adoCollection = await input({\n message: 'Default collection name (e.g. DefaultCollection):',\n default: ''\n });\n\n adoProject = await input({\n message: 'Default team project name:',\n default: ''\n });\n\n // Validate connectivity before asking discovery questions\n if (adoBaseUrl && adoCollection) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n pat: adoPat || undefined,\n fieldAliases: {},\n discoveredFields: [],\n discoveredTypes: []\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n const tempCore = new AdoCoreClient(tempHttp);\n await tempCore.getConnectionData(adoCollection);\n process.stderr.write(' Connected.\\n');\n\n // Optional field/type discovery\n if (adoProject) {\n const doDiscover = await confirm({\n message: 'Discover work item types and fields from this collection now? (recommended)',\n default: true\n });\n\n if (doDiscover) {\n process.stderr.write(' Fetching work item types and fields...\\n');\n const tempWork = new AdoWorkClient(tempHttp);\n adoDiscoveredFields = await discoverFields(tempWork, adoCollection);\n process.stderr.write(` Found ${adoDiscoveredFields.length} fields.\\n`);\n adoDiscoveredTypes = await discoverTypes(tempWork, adoCollection, adoProject);\n process.stderr.write(` Found ${adoDiscoveredTypes.length} work item types.\\n`);\n\n const doAliases = await confirm({\n message: 'Save friendly aliases for common fields? (e.g. \"priority\" → reference name)',\n default: true\n });\n if (doAliases) {\n adoFieldAliases = buildDefaultAliases(adoDiscoveredFields as Parameters<typeof buildDefaultAliases>[0]);\n process.stderr.write(` Generated ${Object.keys(adoFieldAliases).length} aliases.\\n`);\n }\n }\n }\n } catch (err) {\n warn(`Could not connect to Azure DevOps: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Jenkins ───────────────────────────────────────\\n');\n const useJenkins = await confirm({\n message: 'Configure Jenkins Data Center for pipeline operations?',\n default: false\n });\n\n let jenkinsBaseUrl = '';\n let jenkinsUsername = '';\n let jenkinsApiToken = '';\n\n if (useJenkins) {\n jenkinsBaseUrl = await input({\n message: 'Jenkins base URL (e.g. jenkins.your-company.com):',\n default: ''\n });\n\n jenkinsUsername = await input({\n message: 'Jenkins username:',\n default: ''\n });\n\n jenkinsApiToken = await password({\n message: 'Jenkins API token:'\n });\n }\n\n process.stderr.write('\\n── IBM UrbanCode Deploy ──────────────────────────\\n');\n const useUdeploy = await confirm({\n message: 'Configure IBM UrbanCode Deploy for component imports and deployment processes?',\n default: false\n });\n\n let udeployBaseUrl = '';\n let udeployPat = '';\n let udeployUsername = '';\n let udeployPassword = '';\n let udeployDefaultApp = '';\n let udeployDefaultEnv = '';\n\n if (useUdeploy) {\n udeployBaseUrl = await input({\n message: 'UDeploy base URL (e.g. ucd.company.com:8443):',\n default: ''\n });\n\n udeployUsername = await input({\n message: 'UDeploy username (leave blank to use a PAT instead):',\n default: ''\n });\n\n if (udeployUsername) {\n udeployPassword = await password({\n message: 'UDeploy password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n } else {\n udeployPat = await password({\n message: 'UDeploy personal access token:'\n });\n }\n\n udeployDefaultApp = await input({\n message: 'Default application name (optional):',\n default: ''\n });\n\n udeployDefaultEnv = await input({\n message: 'Default environment name (optional):',\n default: ''\n });\n\n const hasCredentials = udeployBaseUrl && (udeployPat || (udeployUsername && udeployPassword));\n if (hasCredentials) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n pat: udeployPat || undefined,\n username: udeployUsername || undefined,\n password: udeployPassword || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.udeploy<unknown>('/cli/application');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to UDeploy: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Checkmarx ─────────────────────────────────────\\n');\n const useCheckmarx = await confirm({\n message: 'Configure Checkmarx CxSAST for vulnerability scanning?',\n default: false\n });\n\n let checkmarxBaseUrl = '';\n let checkmarxUsername = '';\n let checkmarxPassword = '';\n\n if (useCheckmarx) {\n checkmarxBaseUrl = await input({\n message: 'Checkmarx base URL (e.g. cx.company.com):',\n default: ''\n });\n\n checkmarxUsername = await input({\n message: 'Checkmarx username:',\n default: ''\n });\n\n checkmarxPassword = await password({\n message: 'Checkmarx password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n\n if (checkmarxBaseUrl && checkmarxUsername && checkmarxPassword) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n username: checkmarxUsername,\n password: checkmarxPassword\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.checkmarx<unknown>('/cxrestapi/projects');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Checkmarx: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── ServiceNow ────────────────────────────────────\\n');\n const useServiceNow = await confirm({\n message: 'Configure ServiceNow for change management?',\n default: false\n });\n\n let servicenowBaseUrl = '';\n let servicenowUsername = '';\n let servicenowPassword = '';\n let servicenowApiToken = '';\n\n if (useServiceNow) {\n servicenowBaseUrl = await input({\n message: 'ServiceNow instance URL (e.g. mycompany.service-now.com):',\n default: ''\n });\n\n servicenowUsername = await input({\n message: 'ServiceNow username:',\n default: ''\n });\n\n const snUseToken = await confirm({\n message: 'Authenticate with an API token instead of a password?',\n default: false\n });\n\n if (snUseToken) {\n servicenowApiToken = await password({\n message: 'ServiceNow API token:',\n validate: (v) => v.length > 0 || 'Token cannot be blank'\n });\n } else {\n servicenowPassword = await password({\n message: 'ServiceNow password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n }\n\n const snHasCreds = servicenowBaseUrl && servicenowUsername && (servicenowPassword || servicenowApiToken);\n if (snHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername,\n password: servicenowPassword || undefined,\n apiToken: servicenowApiToken || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to ServiceNow: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Sonatype IQ Server ────────────────────────────\\n');\n const useSonatypeIq = await confirm({\n message: 'Configure Sonatype IQ Server for dependency vulnerability scanning?',\n default: false\n });\n\n let sonatypeIqBaseUrl = '';\n let sonatypeIqUserCode = '';\n let sonatypeIqPasscode = '';\n\n if (useSonatypeIq) {\n process.stderr.write(' User Token credentials are found in your IQ Server profile under User Token.\\n');\n\n sonatypeIqBaseUrl = await input({\n message: 'Sonatype IQ Server base URL (e.g. iq.your-company.com):',\n default: ''\n });\n\n sonatypeIqUserCode = await input({\n message: 'User Code (from User Token):',\n default: ''\n });\n\n sonatypeIqPasscode = await password({\n message: 'Passcode (from User Token):'\n });\n\n if (sonatypeIqBaseUrl && sonatypeIqUserCode && sonatypeIqPasscode) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode,\n passcode: sonatypeIqPasscode\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Sonatype IQ Server: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Contrast IAST ─────────────────────────────────\\n');\n const useContrast = await confirm({\n message: 'Configure Contrast Security IAST for vulnerability findings?',\n default: false\n });\n\n let contrastBaseUrl = '';\n let contrastOrgUuid = '';\n let contrastUsername = '';\n let contrastApiKey = '';\n let contrastServiceKey = '';\n\n if (useContrast) {\n process.stderr.write(' Find your credentials in Contrast under User Settings → Your Keys.\\n');\n\n contrastBaseUrl = await input({\n message: 'Contrast base URL (e.g. https://app.contrastsecurity.com for cloud SaaS):',\n validate: (v: string) => v.trim() ? true : 'Base URL is required',\n default: ''\n });\n\n contrastOrgUuid = await input({\n message: 'Organization UUID:',\n default: ''\n });\n\n contrastUsername = await input({\n message: 'Username (email):',\n default: ''\n });\n\n contrastApiKey = await password({\n message: 'API key:'\n });\n\n contrastServiceKey = await password({\n message: 'Service key:'\n });\n\n const contrastHasCreds = contrastOrgUuid && contrastUsername && contrastApiKey && contrastServiceKey;\n if (contrastHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n contrast: {\n baseUrl: normalizeBaseUrl(contrastBaseUrl) || undefined,\n orgUuid: contrastOrgUuid,\n username: contrastUsername,\n apiKey: contrastApiKey,\n serviceKey: contrastServiceKey\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.contrast<unknown>(`/Contrast/api/ng/${contrastOrgUuid}/applications`, { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Contrast: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your credentials and re-run pncli config init or pncli config test.');\n }\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 const sonarProject = useSonar ? await input({\n message: 'Default SonarQube project key (optional):',\n default: ''\n }) : '';\n\n const sdeProject = useSde ? await input({\n message: 'Default SDElements project ID (optional, numeric):',\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.exitCode = ExitCode.SUCCESS;\n return;\n }\n\n writeGlobalConfig({\n user: {\n email: userEmail || undefined,\n userId: userId || undefined\n },\n jira: {\n baseUrl: normalizeBaseUrl(jiraBaseUrl) || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: normalizeBaseUrl(bitbucketBaseUrl) || undefined,\n pat: bitbucketPat || undefined\n },\n ...(confluenceBaseUrl || confluenceApiToken ? {\n confluence: {\n baseUrl: normalizeBaseUrl(confluenceBaseUrl) || undefined,\n apiToken: confluenceApiToken || undefined\n }\n } : {}),\n ...(useArtifactory ? {\n artifactory: {\n baseUrl: normalizeBaseUrl(artifactoryBaseUrl) || undefined,\n token: artifactoryToken || undefined,\n npmRepo: npmRepo || undefined,\n nugetRepo: nugetRepo || undefined,\n mavenRepo: mavenRepo || undefined\n }\n } : {}),\n ...(useSonar ? {\n sonar: {\n baseUrl: normalizeBaseUrl(sonarBaseUrl) || undefined,\n token: sonarToken || undefined\n }\n } : {}),\n ...(useSde && sdeToken && sdeBaseUrl ? {\n sde: {\n connection: `${sdeToken}@${sdeBaseUrl}`\n }\n } : {}),\n ...(useAdo && adoBaseUrl ? {\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n ...(adoPat ? { pat: adoPat } : {}),\n ...(Object.keys(adoFieldAliases).length ? { fieldAliases: adoFieldAliases } : {}),\n ...(adoDiscoveredFields.length ? { discoveredFields: adoDiscoveredFields } : {}),\n ...(adoDiscoveredTypes.length ? { discoveredTypes: adoDiscoveredTypes } : {})\n }\n } : {}),\n ...(useJenkins && jenkinsBaseUrl ? {\n jenkins: {\n baseUrl: normalizeBaseUrl(jenkinsBaseUrl),\n ...(jenkinsUsername ? { username: jenkinsUsername } : {}),\n ...(jenkinsApiToken ? { apiToken: jenkinsApiToken } : {})\n }\n } : {}),\n ...(useUdeploy && udeployBaseUrl ? {\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n ...(udeployPat ? { pat: udeployPat } : {}),\n ...(udeployUsername ? { username: udeployUsername } : {}),\n ...(udeployPassword ? { password: udeployPassword } : {})\n }\n } : {}),\n ...(useCheckmarx && checkmarxBaseUrl ? {\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n username: checkmarxUsername || undefined,\n password: checkmarxPassword || undefined\n }\n } : {}),\n ...(useServiceNow && servicenowBaseUrl ? {\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername || undefined,\n ...(servicenowApiToken ? { apiToken: servicenowApiToken } : {}),\n ...(servicenowPassword ? { password: servicenowPassword } : {})\n }\n } : {}),\n ...(useContrast && contrastOrgUuid ? {\n contrast: {\n ...(contrastBaseUrl ? { baseUrl: normalizeBaseUrl(contrastBaseUrl) } : {}),\n orgUuid: contrastOrgUuid,\n username: contrastUsername || undefined,\n apiKey: contrastApiKey || undefined,\n serviceKey: contrastServiceKey || undefined\n }\n } : {}),\n ...(useSonatypeIq && sonatypeIqBaseUrl ? {\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode || undefined,\n passcode: sonatypeIqPasscode || undefined\n }\n } : {}),\n defaults: {\n jira: {\n project: jiraProject || undefined\n },\n ...(useSonar && sonarProject ? {\n sonar: {\n project: sonarProject || undefined\n }\n } : {}),\n ...(useSde && sdeProject ? {\n sde: {\n project: sdeProject || undefined\n }\n } : {}),\n ...(useAdo && (adoCollection || adoProject) ? {\n ado: {\n collection: adoCollection || undefined,\n project: adoProject || undefined\n }\n } : {}),\n ...(useUdeploy && (udeployDefaultApp || udeployDefaultEnv) ? {\n udeploy: {\n application: udeployDefaultApp || undefined,\n environment: udeployDefaultEnv || undefined\n }\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 adoRepoCollection = await input({\n message: 'Default Azure DevOps collection for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoProject = await input({\n message: 'Default Azure DevOps project for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoRepo = await input({\n message: 'Default Azure DevOps repo name for this repo (leave blank to auto-detect):',\n default: ''\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.exitCode = ExitCode.SUCCESS;\n return;\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.exitCode = ExitCode.SUCCESS;\n return;\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 ...(adoRepoCollection || adoRepoProject || adoRepoRepo ? {\n ado: {\n collection: adoRepoCollection || undefined,\n project: adoRepoProject || undefined,\n repo: adoRepoRepo || undefined\n }\n } : {})\n }\n });\n\n success({ written: '.pncli.json' }, 'config', 'init', start);\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoWorkItem,\n AdoWorkItemComment,\n AdoWorkItemType,\n AdoWorkItemTypeState,\n AdoField,\n AdoWiqlResult,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\nconst API_PREVIEW = '7.1-preview.4';\n\nexport interface JsonPatchOp {\n op: 'add' | 'replace' | 'remove';\n path: string;\n value?: unknown;\n}\n\nexport class AdoWorkClient {\n constructor(private http: HttpClient) {}\n\n async getWorkItem(collection: string, id: number): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}&$expand=all`\n );\n }\n\n async createWorkItem(\n collection: string,\n project: string,\n type: string,\n patch: JsonPatchOp[]\n ): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitems/${encodeURIComponent('$' + type)}?api-version=${API}`,\n { method: 'POST', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async updateWorkItem(collection: string, id: number, patch: JsonPatchOp[]): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}`,\n { method: 'PATCH', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async queryWiql(collection: string, project: string, wiql: string): Promise<AdoWiqlResult> {\n return this.http.ado<AdoWiqlResult>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/wiql?api-version=${API}`,\n { method: 'POST', body: { query: wiql } }\n );\n }\n\n async listComments(collection: string, project: string, workItemId: number): Promise<AdoWorkItemComment[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemComment>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`\n );\n return result.value ?? [];\n }\n\n async addComment(collection: string, project: string, workItemId: number, text: string): Promise<AdoWorkItemComment> {\n return this.http.ado<AdoWorkItemComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`,\n { method: 'POST', body: { text } }\n );\n }\n\n async listWorkItemTypes(collection: string, project: string): Promise<AdoWorkItemType[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemType>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeStates(collection: string, project: string, type: string): Promise<AdoWorkItemTypeState[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemTypeState>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/states?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listFields(collection: string, project?: string): Promise<AdoField[]> {\n const scope = project\n ? `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}`\n : `/${encodeURIComponent(collection)}`;\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `${scope}/_apis/wit/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeFields(collection: string, project: string, type: string): Promise<AdoField[]> {\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n}\n","import type { AdoWorkClient } from './client/work.js';\nimport type { AdoFieldMeta, AdoWorkItemTypeMeta } from '../../types/config.js';\n\n/**\n * Discovers all work item fields in the collection and maps them to AdoFieldMeta.\n */\nexport async function discoverFields(\n client: AdoWorkClient,\n collection: string,\n project?: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listFields(collection, project);\n return fields.map(toFieldMeta);\n}\n\n/**\n * Discovers fields scoped to a specific work item type.\n */\nexport async function discoverTypeFields(\n client: AdoWorkClient,\n collection: string,\n project: string,\n type: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listTypeFields(collection, project, type);\n return fields.map(toFieldMeta);\n}\n\nfunction toFieldMeta(f: { referenceName: string; name: string; type: string; readOnly?: boolean; picklistId?: string }): AdoFieldMeta {\n return {\n referenceName: f.referenceName,\n name: f.name,\n type: f.type,\n readOnly: f.readOnly,\n ...(f.picklistId ? { picklistId: f.picklistId } : {})\n };\n}\n\n/**\n * Discovers all work item types and their valid states per type.\n */\nexport async function discoverTypes(\n client: AdoWorkClient,\n collection: string,\n project: string\n): Promise<AdoWorkItemTypeMeta[]> {\n const types = await client.listWorkItemTypes(collection, project);\n const result: AdoWorkItemTypeMeta[] = [];\n\n for (const t of types) {\n const states = await client.listTypeStates(collection, project, t.name);\n const requiredFields = (t.fields ?? [])\n .filter(f => f.alwaysRequired)\n .map(f => f.referenceName);\n result.push({\n name: t.name,\n states: states.map(s => s.name),\n requiredFields\n });\n }\n\n return result;\n}\n\n/**\n * Generates a default alias map for the most common field reference names.\n * Only includes aliases for fields actually present in the discovered set.\n */\nexport function buildDefaultAliases(fields: AdoFieldMeta[]): Record<string, string> {\n const refNames = new Set(fields.map(f => f.referenceName));\n\n const candidates: Array<[string, string]> = [\n ['title', 'System.Title'],\n ['state', 'System.State'],\n ['assignedto', 'System.AssignedTo'],\n ['assigned-to', 'System.AssignedTo'],\n ['description', 'System.Description'],\n ['areapath', 'System.AreaPath'],\n ['area-path', 'System.AreaPath'],\n ['iterationpath', 'System.IterationPath'],\n ['iteration', 'System.IterationPath'],\n ['tags', 'System.Tags'],\n ['priority', 'Microsoft.VSTS.Common.Priority'],\n ['severity', 'Microsoft.VSTS.Common.Severity'],\n ['effort', 'Microsoft.VSTS.Scheduling.Effort'],\n ['storypoints', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['story-points', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['remainingwork', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['remaining', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['acceptancecriteria', 'Microsoft.VSTS.Common.AcceptanceCriteria'],\n ['reprosteps', 'Microsoft.VSTS.TCM.ReproSteps'],\n ['foundinsource', 'Microsoft.VSTS.Build.FoundIn']\n ];\n\n const aliases: Record<string, string> = {};\n for (const [alias, ref] of candidates) {\n if (refNames.has(ref)) {\n aliases[alias] = ref;\n }\n }\n return aliases;\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoGitRepo,\n AdoPullRequest,\n AdoPRThread,\n AdoPRComment,\n AdoPRCompletionOptions,\n AdoGitChange,\n AdoGitDiff,\n AdoGitStatus,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoGitClient {\n constructor(private http: HttpClient) {}\n\n // ── Repositories ──────────────────────────────────────────────────\n\n async listRepos(collection: string, project: string): Promise<AdoGitRepo[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitRepo>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getRepo(collection: string, project: string, repoId: string): Promise<AdoGitRepo> {\n return this.http.ado<AdoGitRepo>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repoId)}?api-version=${API}`\n );\n }\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n async listPRs(\n collection: string,\n project: string,\n repo: string,\n opts: { status?: string; creatorAlias?: string; reviewerAlias?: string } = {}\n ): Promise<AdoPullRequest[]> {\n return this.http.adoPaginate<AdoPullRequest>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n 'searchCriteria.status': opts.status ?? 'active',\n ...(opts.creatorAlias ? { 'searchCriteria.creatorId': opts.creatorAlias } : {}),\n ...(opts.reviewerAlias ? { 'searchCriteria.reviewerId': opts.reviewerAlias } : {}),\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests`,\n { params }\n ) as Promise<{ data: { value: AdoPullRequest[] }; headers: Headers }>;\n });\n }\n\n async getPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`\n );\n }\n\n async createPR(\n collection: string,\n project: string,\n repo: string,\n body: {\n title: string;\n description?: string;\n sourceRefName: string;\n targetRefName: string;\n reviewers?: Array<{ id: string }>;\n }\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async updatePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: Partial<{ title: string; description: string; reviewers: Array<{ id: string }> }>\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body }\n );\n }\n\n async completePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n lastMergeSourceCommit: string,\n completionOptions: AdoPRCompletionOptions\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n {\n method: 'PATCH',\n body: {\n status: 'completed',\n lastMergeSourceCommit: { commitId: lastMergeSourceCommit },\n completionOptions\n }\n }\n );\n }\n\n async abandonPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'abandoned' } }\n );\n }\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n async setPRVote(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n reviewerId: string,\n vote: number\n ): Promise<unknown> {\n return this.http.ado<unknown>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/reviewers/${encodeURIComponent(reviewerId)}?api-version=${API}`,\n { method: 'PUT', body: { vote } }\n );\n }\n\n async listReviewers(collection: string, project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(collection, project, repo, prId);\n return pr.reviewers;\n }\n\n // ── Threads / Comments ────────────────────────────────────────────\n\n async listThreads(collection: string, project: string, repo: string, prId: number): Promise<AdoPRThread[]> {\n const result = await this.http.ado<AdoPageResponse<AdoPRThread>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async createThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: {\n comments: Array<{ content: string; commentType?: string }>;\n status?: string;\n threadContext?: {\n filePath: string;\n rightFileStart?: { line: number; offset: number };\n rightFileEnd?: { line: number; offset: number };\n leftFileStart?: { line: number; offset: number };\n leftFileEnd?: { line: number; offset: number };\n };\n }\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async addCommentToThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n content: string\n ): Promise<AdoPRComment> {\n return this.http.ado<AdoPRComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments?api-version=${API}`,\n { method: 'POST', body: { content, commentType: 'text' } }\n );\n }\n\n async updateThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n status: string\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}?api-version=${API}`,\n { method: 'PATCH', body: { status } }\n );\n }\n\n async deleteComment(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n commentId: number\n ): Promise<void> {\n await this.http.ado<void>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments/${commentId}?api-version=${API}`,\n { method: 'DELETE' }\n );\n }\n\n // ── Diffs / Files ─────────────────────────────────────────────────\n\n async getPRDiff(collection: string, project: string, repo: string, prId: number): Promise<AdoGitDiff> {\n const pr = await this.getPR(collection, project, repo, prId);\n const sourceCommit = pr.lastMergeSourceCommit?.commitId;\n const targetCommit = pr.lastMergeTargetCommit?.commitId;\n if (!sourceCommit || !targetCommit) return { changes: [], aheadCount: 0, behindCount: 0 };\n return this.http.ado<AdoGitDiff>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/diffs/commits?baseVersion=${encodeURIComponent(targetCommit)}&baseVersionType=commit&targetVersion=${encodeURIComponent(sourceCommit)}&targetVersionType=commit&api-version=${API}`\n );\n }\n\n async getCommitStatuses(collection: string, project: string, repo: string, commitId: string): Promise<AdoGitStatus[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitStatus>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/commits/${encodeURIComponent(commitId)}/statuses?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listPRChanges(collection: string, project: string, repo: string, prId: number): Promise<AdoGitChange[]> {\n const iterations = await this.http.ado<AdoPageResponse<{ id: number }>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations?api-version=${API}`\n );\n // Get the latest iteration then its changes\n const latestId = (iterations.value ?? []).at(-1)?.id;\n if (!latestId) return [];\n const changes = await this.http.ado<{ changeEntries?: AdoGitChange[] }>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations/${latestId}/changes?api-version=${API}`\n );\n return changes.changeEntries ?? [];\n }\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoBuildDefinition,\n AdoBuild,\n AdoBuildLog,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoBuildClient {\n constructor(private http: HttpClient) {}\n\n // ── Definitions ───────────────────────────────────────────────────\n\n async listDefinitions(collection: string, project: string): Promise<AdoBuildDefinition[]> {\n return this.http.adoPaginate<AdoBuildDefinition>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions`,\n { params }\n ) as Promise<{ data: { value: AdoBuildDefinition[] }; headers: Headers }>;\n });\n }\n\n async getDefinition(collection: string, project: string, id: number): Promise<AdoBuildDefinition> {\n return this.http.ado<AdoBuildDefinition>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions/${id}?api-version=${API}`\n );\n }\n\n // ── Builds (runs) ─────────────────────────────────────────────────\n\n async queueBuild(\n collection: string,\n project: string,\n definitionId: number,\n opts: { sourceBranch?: string; parameters?: string } = {}\n ): Promise<AdoBuild> {\n const body: Record<string, unknown> = {\n definition: { id: definitionId },\n ...(opts.sourceBranch ? { sourceBranch: opts.sourceBranch } : {}),\n ...(opts.parameters ? { parameters: opts.parameters } : {})\n };\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async listBuilds(\n collection: string,\n project: string,\n opts: { definitionIds?: number[]; branchName?: string; statusFilter?: string; top?: number } = {}\n ): Promise<AdoBuild[]> {\n return this.http.adoPaginate<AdoBuild>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(opts.definitionIds?.length ? { definitionIds: opts.definitionIds.join(',') } : {}),\n ...(opts.branchName ? { branchName: opts.branchName } : {}),\n ...(opts.statusFilter ? { statusFilter: opts.statusFilter } : {}),\n ...(opts.top ? { '$top': opts.top } : {}),\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds`,\n { params }\n ) as Promise<{ data: { value: AdoBuild[] }; headers: Headers }>;\n });\n }\n\n async getBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`\n );\n }\n\n async cancelBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'cancelling' } }\n );\n }\n\n // ── Logs ──────────────────────────────────────────────────────────\n\n async listLogs(collection: string, project: string, buildId: number): Promise<AdoBuildLog[]> {\n const result = await this.http.ado<AdoPageResponse<AdoBuildLog>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getLog(collection: string, project: string, buildId: number, logId: number): Promise<string> {\n return this.http.adoText(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs/${logId}?api-version=${API}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { log } from '../../lib/output.js';\nimport { AdoCoreClient } from './client/core.js';\nimport { AdoWorkClient } from './client/work.js';\nimport { AdoGitClient } from './client/git.js';\nimport { AdoBuildClient } from './client/build.js';\nimport type { JsonPatchOp } from './client/work.js';\nimport type { AdoBuild } from '../../types/ado.js';\n\nexport interface AdoContext {\n collection: string;\n project: string;\n repo: string;\n coreClient: AdoCoreClient;\n workClient: AdoWorkClient;\n gitClient: AdoGitClient;\n buildClient: AdoBuildClient;\n}\n\n/**\n * Resolves ADO (collection, project, repo) from CLI flags → git remote → config defaults.\n * Mirrors the getClient() helper in bitbucket/commands.ts.\n */\nexport function getAdoContext(program: Command, requireRepo = false): AdoContext {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const ctx = getGitContext(config);\n\n const collection: string =\n opts.collection ?? opts.organization ??\n ctx?.ado?.collection ??\n config.defaults.ado?.collection ?? '';\n\n const project: string =\n opts.project ??\n ctx?.ado?.project ??\n config.defaults.ado?.project ?? '';\n\n const repo: string =\n opts.repo ??\n ctx?.ado?.repo ??\n config.defaults.ado?.repo ?? '';\n\n if (!collection) {\n throw new PncliError(\n 'Could not determine Azure DevOps collection. Pass --collection, or run pncli config init.',\n 1\n );\n }\n\n if (!project) {\n throw new PncliError(\n 'Could not determine Azure DevOps project. Pass --project, or run pncli config init.',\n 1\n );\n }\n\n if (requireRepo && !repo) {\n throw new PncliError(\n 'Could not determine Azure DevOps repo. Pass --repo, or run from inside a checked-out ADO repo.',\n 1\n );\n }\n\n return {\n collection,\n project,\n repo,\n coreClient: new AdoCoreClient(http),\n workClient: new AdoWorkClient(http),\n gitClient: new AdoGitClient(http),\n buildClient: new AdoBuildClient(http)\n };\n}\n\n// ── Field helpers ─────────────────────────────────────────────────────\n\n/**\n * Parses repeated --field name=value arguments into a Record.\n * Accepts \"name=value\" strings (split on first =). Throws on missing `=`.\n */\nexport function parseFieldArgs(fields: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const f of fields) {\n const eq = f.indexOf('=');\n if (eq <= 0) throw new PncliError(`Invalid --field value \"${f}\". Expected format: name=value`, 1);\n result[f.slice(0, eq)] = f.slice(eq + 1);\n }\n return result;\n}\n\n/**\n * Resolves field keys against the loaded alias map, then builds JSON Patch ops.\n * If a key is in fieldAliases → use the reference name. Otherwise use the key as-is.\n */\nexport function buildFieldPatch(\n fields: Record<string, string>,\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n return Object.entries(fields).map(([key, value]) => {\n const refName = fieldAliases[key.toLowerCase()] ?? fieldAliases[key] ?? key;\n return { op: 'add' as const, path: `/fields/${refName}`, value };\n });\n}\n\n/** Convenience: parse --field args and immediately build the patch ops. */\nexport function fieldArgsToPatch(\n fieldArgs: string[],\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n return buildFieldPatch(parseFieldArgs(fieldArgs), fieldAliases);\n}\n\n// ── Vote constants ────────────────────────────────────────────────────\n\nexport const PR_VOTE = {\n APPROVE: 10,\n APPROVE_WITH_SUGGESTIONS: 5,\n NO_VOTE: 0,\n WAIT_FOR_AUTHOR: -5,\n REJECT: -10\n} as const;\n\n// ── Build polling ─────────────────────────────────────────────────────\n\nconst TERMINAL_STATUSES = new Set(['completed']);\n\nexport function isBuildTerminal(build: AdoBuild): boolean {\n return TERMINAL_STATUSES.has(build.status);\n}\n\nexport interface PollOpts {\n timeoutSec: number;\n pollSec: number;\n}\n\n/**\n * Polls fetchStatus() until isTerminal() returns true or timeout is reached.\n * Progress lines emitted via log() (verbose-only stderr); stdout stays clean.\n */\nexport async function pollUntilTerminal<T>(\n fetchStatus: () => Promise<T>,\n isTerminal: (s: T) => boolean,\n opts: PollOpts\n): Promise<T> {\n const deadline = Date.now() + opts.timeoutSec * 1000;\n let status = await fetchStatus();\n\n while (!isTerminal(status)) {\n if (Date.now() >= deadline) {\n throw new PncliError(\n `Timed out waiting for completion after ${opts.timeoutSec}s`,\n 1\n );\n }\n log(`Waiting ${opts.pollSec}s...`);\n await new Promise(resolve => setTimeout(resolve, opts.pollSec * 1000));\n status = await fetchStatus();\n }\n\n return status;\n}\n","import { Command } from 'commander';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoProjectCommands(ado: Command): void {\n const project = ado\n .command('project')\n .description('Azure DevOps project and collection operations');\n\n project\n .command('list-collections')\n .description('List all project collections on the server')\n .action(async () => {\n const start = Date.now();\n try {\n const { coreClient } = getAdoContext(ado);\n const data = await coreClient.listCollections();\n success(data, 'ado', 'project-list-collections', start);\n } catch (err) { fail(err, 'ado', 'project-list-collections', start); }\n });\n\n project\n .command('list')\n .description('List team projects in a collection')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.listProjects(collection);\n success(data, 'ado', 'project-list', start);\n } catch (err) { fail(err, 'ado', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a team project by name')\n .requiredOption('--name <project>', 'Project name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getProject(collection, opts.name);\n success(data, 'ado', 'project-get', start);\n } catch (err) { fail(err, 'ado', 'project-get', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, fieldArgsToPatch } from '../helpers.js';\nimport { discoverFields, discoverTypeFields, discoverTypes, buildDefaultAliases } from '../discovery.js';\nimport { success, fail, warn } from '../../../lib/output.js';\nimport { loadConfig, getGlobalConfigPath } from '../../../lib/config.js';\n\nexport function registerAdoWorkCommands(ado: Command): void {\n const work = ado\n .command('work')\n .description('Azure DevOps work item operations');\n\n // ── Get ───────────────────────────────────────────────────────────\n\n work\n .command('get')\n .description('Get a work item by ID')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.getWorkItem(collection, parseInt(opts.id, 10));\n success(data, 'ado', 'work-get', start);\n } catch (err) { fail(err, 'ado', 'work-get', start); }\n });\n\n // ── Create ────────────────────────────────────────────────────────\n\n work\n .command('create')\n .description('Create a work item')\n .requiredOption('--type <type>', 'Work item type (e.g. Bug, Task, User Story)')\n .requiredOption('--title <title>', 'Work item title')\n .option('--description <text>', 'Description')\n .option('--assignee <user>', 'Assigned to (display name or email)')\n .option('--priority <n>', 'Priority (1-4)')\n .option('--parent <id>', 'Parent work item ID — creates a parent link after creation')\n .option('--field <name=value>', 'Additional field (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .action(async (opts: { type: string; title: string; description?: string; assignee?: string; priority?: string; parent?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, project, workClient } = getAdoContext(ado);\n const builtIn: Record<string, string> = {\n 'System.Title': opts.title,\n ...(opts.description ? { 'System.Description': opts.description } : {}),\n ...(opts.assignee ? { 'System.AssignedTo': opts.assignee } : {}),\n ...(opts.priority ? { 'Microsoft.VSTS.Common.Priority': opts.priority } : {})\n };\n const extra = fieldArgsToPatch(opts.field, config.ado.fieldAliases);\n const patch = [\n ...Object.entries(builtIn).map(([k, v]) => ({ op: 'add' as const, path: `/fields/${k}`, value: v })),\n ...extra\n ];\n const data = await workClient.createWorkItem(collection, project, opts.type, patch);\n success(data, 'ado', 'work-create', start);\n if (opts.parent) {\n try {\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.parent}`;\n const linkPatch = [{ op: 'add' as const, path: '/relations/-', value: { rel: 'System.LinkTypes.Hierarchy-Reverse', url: targetUrl } }];\n await workClient.updateWorkItem(collection, data.id, linkPatch);\n } catch (linkErr) {\n warn(`Created #${data.id} but failed to link to parent ${opts.parent}: ${linkErr instanceof Error ? linkErr.message : linkErr}`);\n }\n }\n return;\n } catch (err) { fail(err, 'ado', 'work-create', start); }\n });\n\n // ── Update ────────────────────────────────────────────────────────\n\n work\n .command('update')\n .description('Update a work item field')\n .requiredOption('--id <n>', 'Work item ID')\n .option('--field <name=value>', 'Field to update (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .action(async (opts: { id: string; field: string[] }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n const patch = fieldArgsToPatch(opts.field, config.ado.fieldAliases);\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-update', start);\n } catch (err) { fail(err, 'ado', 'work-update', start); }\n });\n\n // ── Transition (wrapper over update for System.State) ─────────────\n\n work\n .command('transition')\n .description('Set the state of a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--state <state>', 'New state (e.g. Active, Resolved, Closed)')\n .action(async (opts: { id: string; state: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.State', value: opts.state }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-transition', start);\n } catch (err) { fail(err, 'ado', 'work-transition', start); }\n });\n\n // ── Assign ────────────────────────────────────────────────────────\n\n work\n .command('assign')\n .description('Assign a work item to a user')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--to <user>', 'User display name or email')\n .action(async (opts: { id: string; to: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.AssignedTo', value: opts.to }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-assign', start);\n } catch (err) { fail(err, 'ado', 'work-assign', start); }\n });\n\n // ── Link ──────────────────────────────────────────────────────────\n\n work\n .command('link')\n .description('Link two work items')\n .requiredOption('--id <a>', 'Source work item ID')\n .requiredOption('--to <b>', 'Target work item ID')\n .option('--type <rel>', 'Link type (related|parent|child|duplicate|duplicate-of)', 'related')\n .action(async (opts: { id: string; to: string; type: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n // AzDO rel strings\n const relMap: Record<string, string> = {\n related: 'System.LinkTypes.Related',\n parent: 'System.LinkTypes.Hierarchy-Reverse',\n child: 'System.LinkTypes.Hierarchy-Forward',\n duplicate: 'System.LinkTypes.Duplicate-Forward',\n 'duplicate-of': 'System.LinkTypes.Duplicate-Reverse'\n };\n const rel = relMap[opts.type] ?? opts.type;\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.to}`;\n const patch = [{ op: 'add' as const, path: '/relations/-', value: { rel, url: targetUrl } }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-link', start);\n } catch (err) { fail(err, 'ado', 'work-link', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────\n\n work\n .command('search')\n .description('Run a WIQL query (consider --output-file for large results)')\n .requiredOption('--wiql <query>', 'WIQL query string')\n .action(async (opts: { wiql: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.queryWiql(collection, project, opts.wiql);\n success(data, 'ado', 'work-search', start);\n } catch (err) { fail(err, 'ado', 'work-search', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────\n\n work\n .command('list-comments')\n .description('List comments on a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listComments(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'work-list-comments', start);\n } catch (err) { fail(err, 'ado', 'work-list-comments', start); }\n });\n\n work\n .command('add-comment')\n .description('Add a comment to a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { id: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.addComment(collection, project, parseInt(opts.id, 10), opts.body);\n success(data, 'ado', 'work-add-comment', start);\n } catch (err) { fail(err, 'ado', 'work-add-comment', start); }\n });\n\n // ── Type / Field discovery ────────────────────────────────────────\n\n work\n .command('types')\n .description('List work item types in the project')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered types to ~/.pncli/config.json')\n .action(async (opts: { save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n const types = await discoverTypes(workClient, collection, project);\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n existing.ado = { ...(existing.ado ?? {}), discoveredTypes: types };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${types.length} types to ${globalConfigPath}`);\n }\n success(types, 'ado', 'work-types', start);\n } catch (err) { fail(err, 'ado', 'work-types', start); }\n });\n\n work\n .command('list-states')\n .description('List valid states for a work item type')\n .requiredOption('--type <type>', 'Work item type name (e.g. Bug)')\n .action(async (opts: { type: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listTypeStates(collection, project, opts.type);\n success(data, 'ado', 'work-list-states', start);\n } catch (err) { fail(err, 'ado', 'work-list-states', start); }\n });\n\n work\n .command('fields')\n .description('List work item fields available in the collection (consider --output-file for large results)')\n .option('--type <type>', 'Scope to fields for a specific work item type (e.g. Bug)')\n .option('--custom-only', 'Exclude System.* and Microsoft.VSTS.* fields')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered fields and aliases to ~/.pncli/config.json')\n .action(async (opts: { type?: string; customOnly?: boolean; save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n // Fetch full field list (used for alias generation and --save)\n const allFields = opts.type\n ? await discoverTypeFields(workClient, collection, project, opts.type)\n : await discoverFields(workClient, collection);\n // Apply --custom-only filter only to displayed/saved output\n const fields = opts.customOnly\n ? allFields.filter(f =>\n !f.referenceName.startsWith('System.') &&\n !f.referenceName.startsWith('Microsoft.VSTS.')\n )\n : allFields;\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n // Generate aliases from the full (unfiltered) set so System/VSTS aliases are included\n const aliases = buildDefaultAliases(allFields);\n existing.ado = { ...(existing.ado ?? {}), discoveredFields: allFields, fieldAliases: aliases };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${allFields.length} fields and ${Object.keys(aliases).length} aliases to ${globalConfigPath}`);\n }\n success(fields, 'ado', 'work-fields', start);\n } catch (err) { fail(err, 'ado', 'work-fields', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, PR_VOTE } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\nimport type { AdoPRThread, AdoPRComment } from '../../../types/ado.js';\n\n/** Flatten all comments across all threads into a sorted list with threadContext attached */\nfunction flattenThreadComments(\n threads: AdoPRThread[],\n filterInlineOnly: boolean,\n filterGeneralOnly: boolean\n): Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> {\n const flat: Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> = [];\n for (const thread of threads) {\n if (thread.isDeleted) continue;\n if (filterInlineOnly && !thread.threadContext) continue;\n if (filterGeneralOnly && thread.threadContext) continue;\n for (const comment of thread.comments) {\n if (comment.isDeleted) continue;\n flat.push({ ...comment, threadId: thread.id, threadContext: thread.threadContext ?? null });\n }\n }\n return flat.sort((a, b) => a.publishedDate.localeCompare(b.publishedDate));\n}\n\nexport function registerAdoRepoCommands(ado: Command): void {\n const repo = ado\n .command('repo')\n .description('Azure DevOps repository and pull request operations');\n\n // ── Repos ─────────────────────────────────────────────────────────\n\n repo\n .command('list')\n .description('List git repositories in the project')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, gitClient } = getAdoContext(ado);\n const data = await gitClient.listRepos(collection, project);\n success(data, 'ado', 'repo-list', start);\n } catch (err) { fail(err, 'ado', 'repo-list', start); }\n });\n\n repo\n .command('get')\n .description('Get a specific repository')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, repo: repoName, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getRepo(collection, project, repoName);\n success(data, 'ado', 'repo-get', start);\n } catch (err) { fail(err, 'ado', 'repo-get', start); }\n });\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n repo\n .command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: active|abandoned|completed|all', 'active')\n .option('--creator <alias>', 'Filter by creator')\n .option('--reviewer <alias>', 'Filter by reviewer')\n .action(async (opts: { state?: string; creator?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRs(collection, project, repo, {\n status: opts.state,\n creatorAlias: opts.creator,\n reviewerAlias: opts.reviewer\n });\n success(data, 'ado', 'repo-list-prs', start);\n } catch (err) { fail(err, 'ado', 'repo-list-prs', start); }\n });\n\n repo\n .command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-get-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-get-pr', start); }\n });\n\n repo\n .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 (default: main)', 'main')\n .option('--description <text>', 'PR description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs or display names')\n .action(async (opts: { title: string; source: string; target: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : [];\n const data = await gitClient.createPR(collection, project, repo, {\n title: opts.title,\n description: opts.description,\n sourceRefName: `refs/heads/${opts.source}`,\n targetRefName: `refs/heads/${opts.target}`,\n reviewers\n });\n success(data, 'ado', 'repo-create-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-create-pr', start); }\n });\n\n repo\n .command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <text>', 'New description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : undefined;\n const body: Record<string, unknown> = {};\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (reviewers) body.reviewers = reviewers;\n const data = await gitClient.updatePR(collection, project, repo, parseInt(opts.id, 10), body);\n success(data, 'ado', 'repo-update-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-update-pr', start); }\n });\n\n repo\n .command('merge-pr')\n .description('Complete (merge) a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--strategy <s>', 'Merge strategy: noFastForward|squash|rebase|rebaseMerge', 'noFastForward')\n .option('--delete-source', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy: string; deleteSource?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const prId = parseInt(opts.id, 10);\n const pr = await gitClient.getPR(collection, project, repo, prId);\n const data = await gitClient.completePR(\n collection, project, repo, prId,\n pr.lastMergeSourceCommit?.commitId ?? '',\n {\n mergeStrategy: opts.strategy as 'noFastForward' | 'squash' | 'rebase' | 'rebaseMerge',\n deleteSourceBranch: opts.deleteSource ?? false\n }\n );\n success(data, 'ado', 'repo-merge-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-merge-pr', start); }\n });\n\n repo\n .command('abandon-pr')\n .description('Abandon a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.abandonPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-abandon-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-abandon-pr', start); }\n });\n\n // ── Comments (threads) ────────────────────────────────────────────\n\n repo\n .command('list-comments')\n .description('List all comments on a pull request (general + inline)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general PR comments')\n .action(async (opts: { pr: string; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const threads = await gitClient.listThreads(collection, project, repo, parseInt(opts.pr, 10));\n const flat = flattenThreadComments(threads, opts.inlineOnly ?? false, opts.generalOnly ?? false);\n success(flat, 'ado', 'repo-list-comments', start);\n } catch (err) { fail(err, 'ado', 'repo-list-comments', start); }\n });\n\n repo\n .command('add-comment')\n .description('Add a general comment to a pull request')\n .requiredOption('--pr <n>', '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 { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active'\n });\n success(data, 'ado', 'repo-add-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-comment', start); }\n });\n\n repo\n .command('add-inline-comment')\n .description('Add an inline comment on a file in a pull request')\n .requiredOption('--pr <n>', '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 <side>', 'Line side: left|right (default: right)', 'right')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const lineNum = parseInt(opts.line, 10);\n const isRight = opts.lineType !== 'left';\n const lineRange = isRight\n ? { rightFileStart: { line: lineNum, offset: 1 }, rightFileEnd: { line: lineNum, offset: 1 } }\n : { leftFileStart: { line: lineNum, offset: 1 }, leftFileEnd: { line: lineNum, offset: 1 } };\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active',\n threadContext: { filePath: opts.file, ...lineRange }\n });\n success(data, 'ado', 'repo-add-inline-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-inline-comment', start); }\n });\n\n repo\n .command('reply-comment')\n .description('Reply to a comment thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; threadId: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.addCommentToThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), opts.body\n );\n success(data, 'ado', 'repo-reply-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-reply-comment', start); }\n });\n\n repo\n .command('resolve-comment')\n .description('Mark a comment thread as resolved (fixed)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .action(async (opts: { pr: string; threadId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.updateThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), 'fixed'\n );\n success(data, 'ado', 'repo-resolve-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-resolve-comment', start); }\n });\n\n repo\n .command('delete-comment')\n .description('Delete a comment from a thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .action(async (opts: { pr: string; threadId: string; commentId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n await gitClient.deleteComment(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), parseInt(opts.commentId, 10)\n );\n success({ deleted: true }, 'ado', 'repo-delete-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-delete-comment', start); }\n });\n\n // ── Files / Diffs ─────────────────────────────────────────────────\n\n repo\n .command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRChanges(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-files', start);\n } catch (err) { fail(err, 'ado', 'repo-list-files', start); }\n });\n\n repo\n .command('diff')\n .description('Show files changed in a pull request with change types and commit metadata')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--path <p>', 'Filter diff to a specific file path')\n .action(async (opts: { pr: string; path?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPRDiff(collection, project, repo, parseInt(opts.pr, 10));\n if (opts.path) {\n if (opts.path) {\n const needle = opts.path.startsWith('/') ? opts.path : `/${opts.path}`;\n data.changes = (data.changes ?? []).filter(c => c.item.path === needle);\n }\n }\n success(data, 'ado', 'repo-diff', start);\n } catch (err) { fail(err, 'ado', 'repo-diff', start); }\n });\n\n // ── Build statuses ────────────────────────────────────────────────\n\n repo\n .command('get-build-status')\n .description('Get CI/build statuses posted to a commit')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getCommitStatuses(collection, project, repo, opts.commit);\n success(data, 'ado', 'repo-get-build-status', start);\n } catch (err) { fail(err, 'ado', 'repo-get-build-status', start); }\n });\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n repo\n .command('list-reviewers')\n .description('List reviewers on a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listReviewers(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-reviewers', start);\n } catch (err) { fail(err, 'ado', 'repo-list-reviewers', start); }\n });\n\n const voteCmd = (\n name: string,\n description: string,\n vote: number,\n action: string\n ) => {\n repo\n .command(name)\n .description(description)\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const { loadConfig: lc } = await import('../../../lib/config.js');\n const config = lc({ configPath: globalOpts.config });\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n // Self-identity: use connection data\n const { AdoCoreClient } = await import('../client/core.js');\n const { createHttpClient } = await import('../../../lib/http.js');\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const coreClient = new AdoCoreClient(http);\n const me = await coreClient.getConnectionData(collection);\n const myId = me.authenticatedUser.id;\n const data = await gitClient.setPRVote(collection, project, repo, parseInt(opts.pr, 10), myId, vote);\n success(data, 'ado', action, start);\n } catch (err) { fail(err, 'ado', action, start); }\n });\n };\n\n voteCmd('approve', 'Approve a pull request', PR_VOTE.APPROVE, 'repo-approve');\n voteCmd('unapprove', 'Remove approval from a pull request', PR_VOTE.NO_VOTE, 'repo-unapprove');\n voteCmd('wait-for-author', 'Mark a pull request as waiting for author', PR_VOTE.WAIT_FOR_AUTHOR, 'repo-wait-for-author');\n\n // ── Builds for PR ─────────────────────────────────────────────────\n\n repo\n .command('list-builds')\n .description('List builds associated with a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient, buildClient } = getAdoContext(ado, true);\n const pr = await gitClient.getPR(collection, project, repo, parseInt(opts.pr, 10));\n const data = await buildClient.listBuilds(collection, project, {\n branchName: pr.sourceRefName\n });\n success(data, 'ado', 'repo-list-builds', start);\n } catch (err) { fail(err, 'ado', 'repo-list-builds', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, pollUntilTerminal, isBuildTerminal } from '../helpers.js';\nimport { success, fail, log } from '../../../lib/output.js';\nimport { ExitCode } from '../../../lib/exitCodes.js';\nimport { PncliError } from '../../../lib/errors.js';\n\nexport function registerAdoPipelineCommands(ado: Command): void {\n const pipeline = ado\n .command('pipeline')\n .description('Azure DevOps pipeline (build) operations');\n\n pipeline\n .command('list')\n .description('List pipeline definitions')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.listDefinitions(collection, project);\n success(data, 'ado', 'pipeline-list', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get a pipeline definition by ID')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getDefinition(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Queue a pipeline run')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .option('--branch <ref>', 'Source branch (e.g. refs/heads/main or main)')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the run to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds (default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { id: string; branch?: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const sourceBranch = opts.branch\n ? (opts.branch.startsWith('refs/') ? opts.branch : `refs/heads/${opts.branch}`)\n : undefined;\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const parameters = opts.parameter.length > 0\n ? JSON.stringify(Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n })))\n : undefined;\n\n let build = await buildClient.queueBuild(collection, project, parseInt(opts.id, 10), {\n sourceBranch,\n parameters\n });\n log(`Queued build #${build.id} (${build.buildNumber}) — status: ${build.status}`);\n\n if (opts.wait) {\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n log(`Waiting for build #${build.id} to complete (timeout ${timeoutSec}s, poll ${pollSec}s)...`);\n build = await pollUntilTerminal(\n () => buildClient.getBuild(collection, project, build.id),\n isBuildTerminal,\n { timeoutSec, pollSec }\n );\n if (build.result && build.result !== 'succeeded') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n }\n\n success(build, 'ado', 'pipeline-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List pipeline runs')\n .option('--definition <id>', 'Filter by definition ID')\n .option('--branch <ref>', 'Filter by branch name')\n .option('--status <filter>', 'Filter by status (inProgress|completed|cancelling|...)')\n .option('--top <n>', 'Maximum results', '50')\n .action(async (opts: { definition?: string; branch?: string; status?: string; top: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.listBuilds(collection, project, {\n definitionIds: opts.definition ? [parseInt(opts.definition, 10)] : undefined,\n branchName: opts.branch,\n statusFilter: opts.status,\n top: parseInt(opts.top, 10)\n });\n success(data, 'ado', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get a pipeline run by build ID')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('cancel-run')\n .description('Cancel a running pipeline build')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.cancelBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-cancel-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-cancel-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('List or retrieve build logs (consider --output-file for large logs)')\n .requiredOption('--id <n>', 'Build ID')\n .option('--log-id <n>', 'Specific log ID (omit to list all logs)')\n .action(async (opts: { id: string; logId?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const buildId = parseInt(opts.id, 10);\n if (opts.logId) {\n const data = await buildClient.getLog(collection, project, buildId, parseInt(opts.logId, 10));\n success({ log: data }, 'ado', 'pipeline-logs', start);\n } else {\n const data = await buildClient.listLogs(collection, project, buildId);\n success(data, 'ado', 'pipeline-logs', start);\n }\n } catch (err) { fail(err, 'ado', 'pipeline-logs', start); }\n });\n}\n","import { Command } from 'commander';\nimport { registerAdoProjectCommands } from './project.js';\nimport { registerAdoWorkCommands } from './work.js';\nimport { registerAdoRepoCommands } from './repo.js';\nimport { registerAdoPipelineCommands } from './pipeline.js';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoCommands(program: Command): void {\n const ado = program\n .command('ado')\n .description('Azure DevOps Server operations')\n .option('--collection <name>', 'Azure DevOps collection (organization)')\n .option('--organization <name>', 'Alias for --collection')\n .option('--project <name>', 'Azure DevOps team project')\n .option('--repo <name>', 'Azure DevOps git repository name');\n\n // ── Top-level commands ─────────────────────────────────────────────\n\n ado\n .command('whoami')\n .description('Show current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'whoami', start);\n } catch (err) { fail(err, 'ado', 'whoami', start); }\n });\n\n ado\n .command('connection-data')\n .description('Show raw connection data from the ADO server')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'connection-data', start);\n } catch (err) { fail(err, 'ado', 'connection-data', start); }\n });\n\n // ── Subcommand groups ──────────────────────────────────────────────\n\n registerAdoProjectCommands(ado);\n registerAdoWorkCommands(ado);\n registerAdoRepoCommands(ado);\n registerAdoPipelineCommands(ado);\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n JenkinsJob,\n JenkinsJobDetail,\n JenkinsBuild,\n JenkinsListJobsResponse,\n JenkinsQueueItem\n} from '../../types/jenkins.js';\n\n/** Converts a multi-level Jenkins job name (e.g. `A/B/C`) into the correct\n * URL path segment (e.g. `A/job/B/job/C`). Single-level names are unchanged.\n * Each segment is individually percent-encoded. */\nfunction jobPath(name: string): string {\n return name.split('/').map(encodeURIComponent).join('/job/');\n}\n\nexport class JenkinsClient {\n constructor(private http: HttpClient) {}\n\n async listJobs(): Promise<JenkinsJob[]> {\n const data = await this.http.jenkins<JenkinsListJobsResponse>(\n '/api/json',\n { params: { tree: 'jobs[name,url,color,description,buildable,lastBuild[number,url,result]]' } }\n );\n return data.jobs;\n }\n\n async getJob(name: string): Promise<JenkinsJobDetail> {\n return this.http.jenkins<JenkinsJobDetail>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: 'name,url,color,description,buildable,nextBuildNumber,inQueue,lastBuild[number,url,result],builds[number,url,result,duration,timestamp,building,displayName]{0,10}' } }\n );\n }\n\n async triggerBuild(\n name: string,\n params?: Record<string, string>\n ): Promise<{ queueItemId: number }> {\n const hasParams = params && Object.keys(params).length > 0;\n const endpoint = hasParams\n ? `/job/${jobPath(name)}/buildWithParameters`\n : `/job/${jobPath(name)}/build`;\n\n const res = await this.http.jenkinsRaw(endpoint, {\n method: 'POST',\n params: hasParams ? params : undefined\n });\n\n const location = res.headers.get('Location') ?? '';\n const match = location.match(/\\/queue\\/item\\/(\\d+)\\/?$/);\n if (!match) throw new PncliError('Build queued but Jenkins did not return a Location header — cannot track queue item');\n const queueItemId = parseInt(match[1]!, 10);\n return { queueItemId };\n }\n\n async getQueueItem(queueItemId: number): Promise<JenkinsQueueItem> {\n return this.http.jenkins<JenkinsQueueItem>(`/queue/item/${queueItemId}/api/json`);\n }\n\n async listBuilds(name: string, top = 25): Promise<Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[]> {\n const data = await this.http.jenkins<{ builds: Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[] }>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: `builds[number,url,result,duration,timestamp,building,displayName,fullDisplayName,description,id,queueId]{0,${top}}` } }\n );\n return data.builds ?? [];\n }\n\n async getBuild(name: string, buildNumber: number): Promise<JenkinsBuild> {\n return this.http.jenkins<JenkinsBuild>(\n `/job/${jobPath(name)}/${buildNumber}/api/json`\n );\n }\n\n async getConsoleLog(name: string, buildNumber: number): Promise<string> {\n const res = await this.http.jenkinsRaw(\n `/job/${jobPath(name)}/${buildNumber}/consoleText`,\n { method: 'GET' }\n );\n return res.text;\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { JenkinsClient } from './client.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { JenkinsBuild } from '../../types/jenkins.js';\n\nfunction getClient(program: Command): JenkinsClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.jenkins.baseUrl) throw new PncliError('Jenkins not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JenkinsClient(http);\n}\n\nasync function pollQueueItem(\n client: JenkinsClient,\n queueItemId: number,\n pollMs: number,\n timeoutMs: number\n): Promise<number> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const item = await client.getQueueItem(queueItemId);\n if (item.executable?.number !== undefined) return item.executable.number;\n if (item.why === null && !item.blocked && !item.buildable) {\n throw new PncliError('Build was cancelled while in queue', 1);\n }\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build to leave queue after ${timeoutMs / 1000}s`, 1);\n}\n\nasync function pollBuildComplete(\n client: JenkinsClient,\n jobName: string,\n buildNumber: number,\n pollMs: number,\n timeoutMs: number\n): Promise<JenkinsBuild> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const build = await client.getBuild(jobName, buildNumber);\n if (!build.building) return build;\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build #${buildNumber} to complete after ${timeoutMs / 1000}s`, 1);\n}\n\nexport function registerJenkinsCommands(program: Command): void {\n const jenkins = program.command('jenkins').description('Jenkins Data Center operations');\n const pipeline = jenkins.command('pipeline').description('Pipeline (job/build) operations');\n\n pipeline\n .command('list')\n .description('List all jobs on the Jenkins instance')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listJobs();\n success(data, 'jenkins', 'pipeline-list', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get details for a specific job')\n .requiredOption('--name <job>', 'Job name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getJob(opts.name);\n success(data, 'jenkins', 'pipeline-get', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Trigger a build')\n .requiredOption('--name <job>', 'Job name')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the build to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds per phase (queue-wait and build-wait each get this budget; default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { name: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const params = opts.parameter.length > 0\n ? Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n }))\n : undefined;\n\n const { queueItemId } = await client.triggerBuild(opts.name, params);\n log(`Queued build (queue item #${queueItemId})`);\n\n if (!opts.wait) {\n success({ queueItemId }, 'jenkins', 'pipeline-run', start);\n return;\n }\n\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n\n log(`Waiting for build to start (timeout ${timeoutSec}s)...`);\n const buildNumber = await pollQueueItem(client, queueItemId, pollSec * 1000, timeoutSec * 1000);\n log(`Build #${buildNumber} started — waiting for completion...`);\n\n const build = await pollBuildComplete(client, opts.name, buildNumber, pollSec * 1000, timeoutSec * 1000);\n if (build.result !== null && build.result !== 'SUCCESS') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n success(build, 'jenkins', 'pipeline-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List recent builds for a job')\n .requiredOption('--name <job>', 'Job name')\n .option('--top <n>', 'Maximum number of builds to return (default 25)', '25')\n .action(async (opts: { name: string; top: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const top = parseInt(opts.top, 10);\n if (isNaN(top) || top <= 0) throw new PncliError(`Invalid --top \"${opts.top}\". Expected a positive integer.`, 1);\n const data = await client.listBuilds(opts.name, top);\n success(data, 'jenkins', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get details for a specific build')\n .requiredOption('--name <job>', 'Job name')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const data = await client.getBuild(opts.name, buildNumber);\n success(data, 'jenkins', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('Fetch console log for a build (consider --output-file for large logs)')\n .requiredOption('--name <job>', 'Job name')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const text = await client.getConsoleLog(opts.name, buildNumber);\n success({ log: text }, 'jenkins', 'pipeline-logs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-logs', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n ArtifactoryRepository,\n ArtifactoryStorageInfo,\n ArtifactoryProperties,\n ArtifactoryAqlResult,\n ArtifactoryAqlArtifact,\n ArtifactoryBuildInfo,\n ArtifactoryBuildList,\n ArtifactoryBuildRuns\n} from '../../types/artifactory.js';\n\nconst API = 'api';\n\nexport interface ListReposOpts {\n type?: 'local' | 'virtual' | 'remote' | 'federated';\n packageType?: string;\n}\n\nexport interface SearchAqlOpts {\n repo?: string;\n name?: string;\n path?: string;\n before?: string;\n after?: string;\n limit?: number;\n includeProperties?: boolean;\n}\n\nexport interface SetPropertiesOpts {\n recursive?: boolean;\n}\n\nexport class ArtifactoryClient {\n constructor(private http: HttpClient) {}\n\n async ping(): Promise<string> {\n return this.http.artifactoryText(`${API}/system/ping`);\n }\n\n async listRepos(opts: ListReposOpts = {}): Promise<ArtifactoryRepository[]> {\n return this.http.artifactory<ArtifactoryRepository[]>(`${API}/repositories`, {\n params: {\n type: opts.type,\n packageType: opts.packageType\n }\n });\n }\n\n async getStorageInfo(repo: string, path: string): Promise<ArtifactoryStorageInfo> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryStorageInfo>(`${API}/storage/${repo}/${cleanPath}`);\n }\n\n async getProperties(repo: string, path: string): Promise<ArtifactoryProperties> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryProperties>(`${API}/storage/${repo}/${cleanPath}`, {\n params: { properties: '' }\n });\n }\n\n async setProperties(repo: string, path: string, properties: Record<string, string>, opts: SetPropertiesOpts = {}): Promise<void> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n const propString = Object.entries(properties)\n .map(([k, v]) => `${k}=${v}`)\n .join(';');\n await this.http.artifactory<void>(`${API}/storage/${repo}/${cleanPath}`, {\n method: 'PUT',\n params: {\n properties: propString,\n ...(opts.recursive ? { recursive: 1 } : {})\n }\n });\n }\n\n async searchAql(opts: SearchAqlOpts = {}): Promise<ArtifactoryAqlResult<ArtifactoryAqlArtifact>> {\n const criteria: string[] = [];\n\n if (opts.repo) criteria.push(`\"repo\": {\"$eq\": \"${opts.repo}\"}`);\n if (opts.name) criteria.push(`\"name\": {\"$match\": \"${opts.name}\"}`);\n if (opts.path) criteria.push(`\"path\": {\"$match\": \"${opts.path}\"}`);\n if (opts.after) criteria.push(`\"created\": {\"$gt\": \"${opts.after}\"}`);\n if (opts.before) criteria.push(`\"created\": {\"$lt\": \"${opts.before}\"}`);\n\n const findClause = criteria.length > 0\n ? `{${criteria.join(',')}}`\n : '{}';\n\n const includeFields = opts.includeProperties\n ? '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\",\"properties\")'\n : '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\")';\n\n const sortClause = '.sort({\"$desc\": [\"created\"]})';\n const limitClause = opts.limit ? `.limit(${opts.limit})` : '.limit(100)';\n\n const aql = `items.find(${findClause})${includeFields}${sortClause}${limitClause}`;\n\n return this.http.artifactory<ArtifactoryAqlResult<ArtifactoryAqlArtifact>>(`${API}/search/aql`, {\n method: 'POST',\n body: aql,\n headers: { 'Content-Type': 'text/plain' }\n });\n }\n\n async listBuilds(): Promise<ArtifactoryBuildList> {\n return this.http.artifactory<ArtifactoryBuildList>(`${API}/build`);\n }\n\n async listBuildRuns(buildName: string): Promise<ArtifactoryBuildRuns> {\n return this.http.artifactory<ArtifactoryBuildRuns>(`${API}/build/${encodeURIComponent(buildName)}`);\n }\n\n async getBuildInfo(buildName: string, buildNumber: string): Promise<ArtifactoryBuildInfo> {\n return this.http.artifactory<ArtifactoryBuildInfo>(\n `${API}/build/${encodeURIComponent(buildName)}/${encodeURIComponent(buildNumber)}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { ArtifactoryClient } from './client.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';\n\nfunction getClient(program: Command): ArtifactoryClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.artifactory.baseUrl) throw new PncliError('Artifactory not configured. Run: pncli config init');\n if (!config.artifactory.token) throw new PncliError('Artifactory token not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ArtifactoryClient(http);\n}\n\nexport function registerArtifactoryCommands(program: Command): void {\n const art = program.command('artifactory').description('Artifactory operations');\n\n // ── Ping ──────────────────────────────────────────────────────────────────\n\n art.command('ping')\n .description('Check Artifactory connectivity and authentication')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.ping();\n success(data, 'artifactory', 'ping', start);\n } catch (err) { fail(err, 'artifactory', 'ping', start); }\n });\n\n // ── Repos ─────────────────────────────────────────────────────────────────\n\n art.command('repos')\n .description('List repositories')\n .option('--type <type>', 'Filter by type: local, virtual, remote, federated')\n .option('--package-type <type>', 'Filter by package type: npm, maven, nuget, docker, pypi, etc.')\n .action(async (opts: { type?: string; packageType?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listRepos({ type: opts.type as 'local' | 'virtual' | 'remote' | 'federated' | undefined, packageType: opts.packageType });\n success(data, 'artifactory', 'repos', start);\n } catch (err) { fail(err, 'artifactory', 'repos', start); }\n });\n\n // ── Artifact info ─────────────────────────────────────────────────────────\n\n art.command('artifact-info <repo> <path>')\n .description('Get metadata for an artifact or folder (checksums, size, timestamps)')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getStorageInfo(repo, path);\n success(data, 'artifactory', 'artifact-info', start);\n } catch (err) { fail(err, 'artifactory', 'artifact-info', start); }\n });\n\n // ── Properties get ────────────────────────────────────────────────────────\n\n art.command('properties-get <repo> <path>')\n .description('Read custom properties on an artifact')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getProperties(repo, path);\n success(data, 'artifactory', 'properties-get', start);\n } catch (err) { fail(err, 'artifactory', 'properties-get', start); }\n });\n\n // ── Properties set ────────────────────────────────────────────────────────\n\n art.command('properties-set <repo> <path> [keyvals...]')\n .description('Set custom properties on an artifact (format: key=value key=value...)')\n .option('--recursive', 'Apply recursively to folder contents', false)\n .action(async (repo: string, path: string, keyvals: string[], opts: { recursive: boolean }) => {\n const start = Date.now();\n try {\n if (!keyvals.length) throw new PncliError('Provide at least one key=value pair');\n const properties: Record<string, string> = {};\n for (const kv of keyvals) {\n const eq = kv.indexOf('=');\n if (eq < 1) throw new PncliError(`Invalid property format: \"${kv}\" — expected key=value`);\n properties[kv.slice(0, eq)] = kv.slice(eq + 1);\n }\n const client = getClient(program);\n await client.setProperties(repo, path, properties, { recursive: opts.recursive });\n success({ repo, path, properties }, 'artifactory', 'properties-set', start);\n } catch (err) { fail(err, 'artifactory', 'properties-set', start); }\n });\n\n // ── AQL search ────────────────────────────────────────────────────────────\n\n art.command('search')\n .description('Search artifacts using AQL (Artifactory Query Language) (consider --output-file for large results)')\n .option('--repo <name>', 'Filter by repository key')\n .option('--name <pattern>', 'Filter by artifact name (supports * and ? wildcards)')\n .option('--path <pattern>', 'Filter by artifact path (supports * and ? wildcards)')\n .option('--after <date>', 'Created after this date (ISO 8601, e.g. 2024-01-01)')\n .option('--before <date>', 'Created before this date (ISO 8601)')\n .option('--limit <n>', 'Maximum results to return (default: 100)', '100')\n .option('--properties', 'Include artifact properties in results', false)\n .action(async (opts: { repo?: string; name?: string; path?: string; after?: string; before?: string; limit: string; properties: boolean }) => {\n const start = Date.now();\n try {\n if (!opts.repo && !opts.name && !opts.path) {\n throw new PncliError('Provide at least one filter: --repo, --name, or --path');\n }\n const client = getClient(program);\n const data = await client.searchAql({\n repo: opts.repo,\n name: opts.name,\n path: opts.path,\n after: opts.after,\n before: opts.before,\n limit: Number.isNaN(parseInt(opts.limit, 10)) ? 100 : parseInt(opts.limit, 10),\n includeProperties: opts.properties\n });\n success(data, 'artifactory', 'search', start);\n } catch (err) { fail(err, 'artifactory', 'search', start); }\n });\n\n // ── Builds ────────────────────────────────────────────────────────────────\n\n art.command('builds')\n .description('List all build names in Artifactory')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBuilds();\n success(data, 'artifactory', 'builds', start);\n } catch (err) { fail(err, 'artifactory', 'builds', start); }\n });\n\n art.command('build-runs <name>')\n .description('List all run numbers for a build')\n .action(async (name: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBuildRuns(name);\n success(data, 'artifactory', 'build-runs', start);\n } catch (err) { fail(err, 'artifactory', 'build-runs', start); }\n });\n\n art.command('build-info <name> <number>')\n .description('Get build info (artifacts, dependencies, VCS revision) for a specific run')\n .action(async (name: string, number: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getBuildInfo(name, number);\n success(data, 'artifactory', 'build-info', start);\n } catch (err) { fail(err, 'artifactory', 'build-info', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n UdeployApplication,\n UdeployComponent,\n UdeployEnvironment,\n UdeployProcessRequest,\n UdeployRequestInfo,\n UdeployRequestStatus,\n UdeployVersion,\n UdeployVersionCreateResult,\n} from '../../types/udeploy.js';\n\nexport interface UdeployRunProcessOptions {\n application: string;\n applicationProcess: string;\n environment: string;\n onlyChanged?: boolean;\n versions?: Array<{ component: string; version: string }>;\n snapshot?: string;\n properties?: Record<string, string>;\n}\n\nexport class UdeployClient {\n constructor(private http: HttpClient) {}\n\n listApplications(): Promise<UdeployApplication[]> {\n return this.http.udeploy<UdeployApplication[]>('/cli/application');\n }\n\n listEnvironments(application: string): Promise<UdeployEnvironment[]> {\n return this.http.udeploy<UdeployEnvironment[]>('/cli/application/environmentsInApplication', {\n params: { application }\n });\n }\n\n listComponents(): Promise<UdeployComponent[]> {\n return this.http.udeploy<UdeployComponent[]>('/cli/component');\n }\n\n listVersions(component: string): Promise<UdeployVersion[]> {\n return this.http.udeploy<UdeployVersion[]>('/cli/component/versions', {\n params: { component }\n });\n }\n\n createVersion(component: string, name: string): Promise<UdeployVersionCreateResult> {\n return this.http.udeploy<UdeployVersionCreateResult>('/cli/version/createVersion', {\n method: 'POST',\n params: { component, name }\n });\n }\n\n finishImporting(component: string, version: string): Promise<void> {\n return this.http.udeploy<void>('/cli/version/finishedImporting', {\n method: 'POST',\n params: { component, version }\n });\n }\n\n runProcess(opts: UdeployRunProcessOptions): Promise<UdeployProcessRequest> {\n return this.http.udeploy<UdeployProcessRequest>('/cli/applicationProcessRequest/request', {\n method: 'PUT',\n body: {\n application: opts.application,\n applicationProcess: opts.applicationProcess,\n environment: opts.environment,\n onlyChanged: opts.onlyChanged ?? false,\n ...(opts.versions ? { versions: opts.versions } : {}),\n ...(opts.snapshot ? { snapshot: opts.snapshot } : {}),\n ...(opts.properties ? { properties: opts.properties } : {}),\n }\n });\n }\n\n getRequestStatus(requestId: string): Promise<UdeployRequestStatus> {\n return this.http.udeploy<UdeployRequestStatus>('/cli/applicationProcessRequest/requestStatus', {\n params: { requestId }\n });\n }\n\n getRequestInfo(requestId: string): Promise<UdeployRequestInfo> {\n return this.http.udeploy<UdeployRequestInfo>('/cli/applicationProcessRequest/requestInfo', {\n params: { requestId }\n });\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { UdeployClient } from './client.js';\n\nconst POLL_INTERVAL_MS = 5000;\nconst DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;\n\nfunction getClient(program: Command): { client: UdeployClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.udeploy.baseUrl) {\n throw new PncliError('UDeploy baseUrl not configured. Run: pncli config init', 78);\n }\n const http = createHttpClient(config, opts.dryRun);\n return { client: new UdeployClient(http), config };\n}\n\nfunction resolveApplication(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const app = cliValue ?? config.defaults.udeploy.application;\n if (!app) throw new PncliError('--application is required (or set defaults.udeploy.application in config)', 2);\n return app;\n}\n\nfunction resolveEnvironment(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const env = cliValue ?? config.defaults.udeploy.environment;\n if (!env) throw new PncliError('--environment is required (or set defaults.udeploy.environment in config)', 2);\n return env;\n}\n\nexport function registerUdeployCommands(program: Command): void {\n const udeploy = program\n .command('udeploy')\n .description('IBM UrbanCode Deploy — component versions and deployment processes')\n .option('--application <name>', 'Application name or ID')\n .option('--environment <name>', 'Environment name or ID');\n\n udeploy\n .command('apps')\n .description('List all applications')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const apps = await client.listApplications();\n success(apps, 'udeploy', 'apps', start);\n } catch (err) {\n fail(err, 'udeploy', 'apps', start);\n }\n });\n\n udeploy\n .command('environments')\n .description('List environments for an application')\n .action(async () => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const envs = await client.listEnvironments(application);\n success(envs, 'udeploy', 'environments', start);\n } catch (err) {\n fail(err, 'udeploy', 'environments', start);\n }\n });\n\n udeploy\n .command('components')\n .description('List all components')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const components = await client.listComponents();\n success(components, 'udeploy', 'components', start);\n } catch (err) {\n fail(err, 'udeploy', 'components', start);\n }\n });\n\n udeploy\n .command('versions')\n .description('List versions for a component')\n .requiredOption('--component <name>', 'Component name or ID')\n .action(async (cmdOpts: { component: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const versions = await client.listVersions(cmdOpts.component);\n success(versions, 'udeploy', 'versions', start);\n } catch (err) {\n fail(err, 'udeploy', 'versions', start);\n }\n });\n\n udeploy\n .command('import-version')\n .description('Create a component version and mark it ready for deployment')\n .requiredOption('--component <name>', 'Component name or ID')\n .requiredOption('--name <name>', 'Version name')\n .option('--no-finish', 'Skip marking the version as finished importing')\n .action(async (cmdOpts: { component: string; name: string; finish: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const created = await client.createVersion(cmdOpts.component, cmdOpts.name);\n if (cmdOpts.finish) {\n await client.finishImporting(cmdOpts.component, cmdOpts.name);\n }\n success({ ...created, finishedImporting: cmdOpts.finish }, 'udeploy', 'import-version', start);\n } catch (err) {\n fail(err, 'udeploy', 'import-version', start);\n }\n });\n\n udeploy\n .command('run')\n .description('Run an application deployment process')\n .requiredOption('--process <name>', 'Application process name or ID')\n .option('--component <name>', 'Component name (repeatable)', collect, [])\n .option('--component-version <name>', 'Component version (repeatable; positionally paired with --component)', collect, [])\n .option('--snapshot <name>', 'Snapshot name or ID (alternative to specifying versions)')\n .option('--only-changed', 'Deploy only changed components', false)\n .option('--wait', 'Poll until the process completes', false)\n .option('--timeout <ms>', 'Max wait time in milliseconds', String(DEFAULT_TIMEOUT_MS))\n .action(async (cmdOpts: {\n process: string;\n component: string[];\n componentVersion: string[];\n snapshot?: string;\n onlyChanged: boolean;\n wait: boolean;\n timeout: string;\n }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string; environment?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const environment = resolveEnvironment(config, parentOpts.environment);\n\n const components = cmdOpts.component;\n const versions = cmdOpts.componentVersion;\n const versionEntries = components.map((c, i) => ({\n component: c,\n version: versions[i] ?? 'latest'\n }));\n\n const result = await client.runProcess({\n application,\n applicationProcess: cmdOpts.process,\n environment,\n onlyChanged: cmdOpts.onlyChanged,\n ...(versionEntries.length > 0 ? { versions: versionEntries } : {}),\n ...(cmdOpts.snapshot ? { snapshot: cmdOpts.snapshot } : {}),\n });\n\n if (!cmdOpts.wait) {\n success(result, 'udeploy', 'run', start);\n return;\n }\n\n const timeoutMs = parseInt(cmdOpts.timeout, 10);\n const requestId = result.requestId;\n log(`Process started. Request ID: ${requestId}. Polling for completion...`);\n\n while (true) {\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n throw new PncliError(`Timed out after ${timeoutMs}ms waiting for request ${requestId}`, 1);\n }\n\n await sleep(POLL_INTERVAL_MS);\n\n const status = await client.getRequestStatus(requestId);\n\n if (status.status === 'CLOSED') {\n const outcome = { requestId, status: status.status, result: status.result, elapsed_ms: Date.now() - start };\n if (status.result === 'SUCCEEDED') {\n success(outcome, 'udeploy', 'run', start);\n } else {\n throw new PncliError(\n `Deployment ${status.result ?? 'failed'} (requestId: ${requestId})`,\n 1\n );\n }\n return;\n }\n\n log(`Status: ${status.status} (${Math.round((Date.now() - start) / 1000)}s elapsed)`);\n }\n } catch (err) {\n fail(err, 'udeploy', 'run', start);\n }\n });\n\n udeploy\n .command('request-status')\n .description('Get the current status of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const status = await client.getRequestStatus(cmdOpts.requestId);\n success(status, 'udeploy', 'request-status', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-status', start);\n }\n });\n\n udeploy\n .command('request-info')\n .description('Get full details of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const info = await client.getRequestInfo(cmdOpts.requestId);\n success(info, 'udeploy', 'request-info', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-info', start);\n }\n });\n}\n\nfunction collect(val: string, prev: string[]): string[] {\n return [...prev, val];\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type { CheckmarxProject, CheckmarxScan, CheckmarxResultsStats } from '../../types/checkmarx.js';\n\nexport class CheckmarxClient {\n constructor(private http: HttpClient) {}\n\n async listProjects(): Promise<CheckmarxProject[]> {\n return this.http.checkmarx<CheckmarxProject[]>('/cxrestapi/projects');\n }\n\n async getProject(id: number): Promise<CheckmarxProject> {\n return this.http.checkmarx<CheckmarxProject>(`/cxrestapi/projects/${id}`);\n }\n\n async listScans(opts: { projectId?: number; last?: number } = {}): Promise<CheckmarxScan[]> {\n return this.http.checkmarx<CheckmarxScan[]>('/cxrestapi/sast/scans', {\n params: {\n projectId: opts.projectId,\n last: opts.last\n }\n });\n }\n\n async getScan(id: number): Promise<CheckmarxScan> {\n return this.http.checkmarx<CheckmarxScan>(`/cxrestapi/sast/scans/${id}`);\n }\n\n async getScanResultsStatistics(scanId: number): Promise<CheckmarxResultsStats> {\n return this.http.checkmarx<CheckmarxResultsStats>(`/cxrestapi/sast/scans/${scanId}/resultsStatistics`);\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { CheckmarxClient } from './client.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): CheckmarxClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.checkmarx.baseUrl) throw new PncliError('Checkmarx not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new CheckmarxClient(http);\n}\n\nexport function registerCheckmarxCommands(program: Command): void {\n const cx = program.command('checkmarx').description('Checkmarx CxSAST operations');\n const project = cx.command('project').description('Project operations');\n const scan = cx.command('scan').description('Scan operations');\n\n project\n .command('list')\n .description('List all projects')\n .action(async () => {\n const start = Date.now();\n try {\n const data = await getClient(program).listProjects();\n success(data, 'checkmarx', 'project-list', start);\n } catch (err) { fail(err, 'checkmarx', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a project by ID')\n .requiredOption('--id <id>', 'Project ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const id = parseInt(opts.id, 10);\n if (isNaN(id)) throw new PncliError(`Invalid --id \"${opts.id}\". Expected an integer.`, 1);\n const data = await getClient(program).getProject(id);\n success(data, 'checkmarx', 'project-get', start);\n } catch (err) { fail(err, 'checkmarx', 'project-get', start); }\n });\n\n scan\n .command('list')\n .description('List scans')\n .option('--project <id>', 'Filter by project ID')\n .option('--last <n>', 'Return only the last N scans per project')\n .action(async (opts: { project?: string; last?: string }) => {\n const start = Date.now();\n try {\n const projectId = opts.project ? parseInt(opts.project, 10) : undefined;\n const last = opts.last ? parseInt(opts.last, 10) : undefined;\n if (opts.project && isNaN(projectId!)) throw new PncliError(`Invalid --project \"${opts.project}\". Expected an integer.`, 1);\n if (opts.last && isNaN(last!)) throw new PncliError(`Invalid --last \"${opts.last}\". Expected an integer.`, 1);\n const data = await getClient(program).listScans({ projectId, last });\n success(data, 'checkmarx', 'scan-list', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-list', start); }\n });\n\n scan\n .command('get')\n .description('Get a scan by ID')\n .requiredOption('--id <id>', 'Scan ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const id = parseInt(opts.id, 10);\n if (isNaN(id)) throw new PncliError(`Invalid --id \"${opts.id}\". Expected an integer.`, 1);\n const data = await getClient(program).getScan(id);\n success(data, 'checkmarx', 'scan-get', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-get', start); }\n });\n\n scan\n .command('stats')\n .description('Get results statistics for a scan')\n .requiredOption('--id <id>', 'Scan ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const id = parseInt(opts.id, 10);\n if (isNaN(id)) throw new PncliError(`Invalid --id \"${opts.id}\". Expected an integer.`, 1);\n const data = await getClient(program).getScanResultsStatistics(id);\n success(data, 'checkmarx', 'scan-stats', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-stats', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\ninterface SnowChangeRecord {\n sys_id: string;\n number: string;\n short_description: string;\n state: string;\n priority: string;\n assigned_to?: { display_value?: string };\n assignment_group?: { display_value?: string };\n start_date?: string;\n end_date?: string;\n description?: string;\n [key: string]: unknown;\n}\n\ninterface SnowListResponse {\n result: SnowChangeRecord[];\n}\n\ninterface SnowSingleResponse {\n result: SnowChangeRecord;\n}\n\nfunction getHttp(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.servicenow.baseUrl) throw new PncliError('ServiceNow not configured. Run: pncli config init');\n return createHttpClient(config, Boolean(opts.dryRun));\n}\n\nexport function registerServiceNowCommands(program: Command): void {\n const sn = program.command('servicenow').description('ServiceNow operations');\n const change = sn.command('change').description('Change request operations');\n\n change\n .command('list')\n .description('List change requests')\n .option('--state <state>', 'Filter by state (e.g. -1=Pending, 1=Open, 2=Work in Progress, 3=Closed Complete)')\n .option('--assigned-to <user>', 'Filter by assigned user sys_id or display name')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--fields <fields>', 'Comma-separated field names to return')\n .action(async (opts: { state?: string; assignedTo?: string; limit?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string | number | boolean | undefined> = {\n sysparm_limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n sysparm_display_value: 'true',\n };\n const sanitize = (v: string) => v.replace(/\\^/g, '');\n const queries: string[] = [];\n if (opts.state !== undefined) queries.push(`state=${sanitize(opts.state)}`);\n if (opts.assignedTo) queries.push(`assigned_to=${sanitize(opts.assignedTo)}`);\n if (queries.length) params['sysparm_query'] = queries.join('^');\n if (opts.fields) params['sysparm_fields'] = opts.fields;\n\n const data = await http.servicenow<SnowListResponse>('/api/now/table/change_request', { params });\n success(data.result, 'servicenow', 'change list', start);\n } catch (err) { fail(err, 'servicenow', 'change list', start); }\n });\n\n change\n .command('get')\n .description('Get a change request by sys_id or number')\n .requiredOption('--id <id>', 'Change request sys_id or number (e.g. CHG0001234)')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n if (opts.id.toUpperCase().startsWith('CHG')) {\n const list = await http.servicenow<SnowListResponse>('/api/now/table/change_request', {\n params: { sysparm_query: `number=${opts.id}`, sysparm_display_value: 'true', sysparm_limit: 1 }\n });\n if (!list.result.length) throw new PncliError(`Change request not found: ${opts.id}`, 1);\n success(list.result[0], 'servicenow', 'change get', start);\n return;\n }\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n params: { sysparm_display_value: 'true' }\n });\n success(data.result, 'servicenow', 'change get', start);\n } catch (err) { fail(err, 'servicenow', 'change get', start); }\n });\n\n change\n .command('create')\n .description('Create a change request')\n .requiredOption('--short-description <text>', 'Short description (title)')\n .option('--description <text>', 'Full description')\n .option('--type <type>', 'Change type: normal, standard, or emergency', 'normal')\n .option('--priority <n>', 'Priority: 1=Critical, 2=High, 3=Moderate, 4=Low')\n .option('--assigned-to <user>', 'Assigned user sys_id')\n .option('--assignment-group <group>', 'Assignment group sys_id')\n .option('--start-date <datetime>', 'Planned start date (yyyy-MM-dd HH:mm:ss)')\n .option('--end-date <datetime>', 'Planned end date (yyyy-MM-dd HH:mm:ss)')\n .action(async (opts: {\n shortDescription: string;\n description?: string;\n type?: string;\n priority?: string;\n assignedTo?: string;\n assignmentGroup?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {\n short_description: opts.shortDescription,\n type: opts.type ?? 'normal'\n };\n if (opts.description) body['description'] = opts.description;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.assignmentGroup) body['assignment_group'] = opts.assignmentGroup;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n const data = await http.servicenow<SnowSingleResponse>('/api/now/table/change_request', {\n method: 'POST',\n body\n });\n success(data.result, 'servicenow', 'change create', start);\n } catch (err) { fail(err, 'servicenow', 'change create', start); }\n });\n\n change\n .command('update')\n .description('Update a change request')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--short-description <text>', 'New short description')\n .option('--description <text>', 'New description')\n .option('--state <state>', 'New state value')\n .option('--priority <n>', 'New priority')\n .option('--assigned-to <user>', 'New assigned user sys_id')\n .option('--start-date <datetime>', 'New planned start date')\n .option('--end-date <datetime>', 'New planned end date')\n .action(async (opts: {\n id: string;\n shortDescription?: string;\n description?: string;\n state?: string;\n priority?: string;\n assignedTo?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {};\n if (opts.shortDescription) body['short_description'] = opts.shortDescription;\n if (opts.description) body['description'] = opts.description;\n if (opts.state !== undefined) body['state'] = opts.state;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n if (Object.keys(body).length === 0) throw new PncliError('No fields to update. Provide at least one option besides --id.', 1);\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change update', start);\n } catch (err) { fail(err, 'servicenow', 'change update', start); }\n });\n\n change\n .command('close')\n .description('Close a change request (state=3)')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--close-notes <text>', 'Closure notes')\n .option('--close-code <code>', 'Close code (e.g. successful, unsuccessful)')\n .action(async (opts: { id: string; closeNotes?: string; closeCode?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = { state: 3 };\n if (opts.closeNotes) body['close_notes'] = opts.closeNotes;\n if (opts.closeCode) body['close_code'] = opts.closeCode;\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change close', start);\n } catch (err) { fail(err, 'servicenow', 'change close', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpAndOrg(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.contrast.apiKey || !config.contrast.serviceKey || !config.contrast.username) throw new PncliError('Contrast not configured. Run: pncli config init');\n if (!config.contrast.orgUuid) throw new PncliError('Contrast org UUID not configured. Run: pncli config set contrast.orgUuid <uuid>');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { http, orgUuid: config.contrast.orgUuid };\n}\n\nexport function registerContrastCommands(program: Command): void {\n const contrast = program.command('contrast').description('Contrast IAST operations');\n\n const apps = contrast.command('apps').description('Application operations');\n\n apps\n .command('list')\n .description('List applications in the organization')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(`/Contrast/api/ng/${orgUuid}/applications`, {\n params: {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n }\n });\n success(data, 'contrast', 'apps list', start);\n } catch (err) { fail(err, 'contrast', 'apps list', start); }\n });\n\n const findings = contrast.command('findings').description('Vulnerability findings operations');\n\n findings\n .command('list')\n .description('List vulnerability findings for an application')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .option('--severity <level>', 'Filter by severity: CRITICAL, HIGH, MEDIUM, LOW, NOTE')\n .option('--status <status>', 'Filter by status: REPORTED, CONFIRMED, SUSPICIOUS, NOT_A_PROBLEM, REMEDIATED, FIXED')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { app: string; severity?: string; status?: string; limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const params: Record<string, string | number | boolean | undefined> = {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n };\n if (opts.severity) params['severities'] = opts.severity;\n if (opts.status) params['statuses'] = opts.status;\n\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/filter`,\n { params }\n );\n success(data, 'contrast', 'findings list', start);\n } catch (err) { fail(err, 'contrast', 'findings list', start); }\n });\n\n findings\n .command('get')\n .description('Get details for a specific vulnerability finding')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .requiredOption('--trace <trace-id>', 'Trace/finding UUID')\n .action(async (opts: { app: string; trace: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/trace/${opts.trace}`\n );\n success(data, 'contrast', 'findings get', start);\n } catch (err) { fail(err, 'contrast', 'findings get', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpClient(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.sonatypeiq.baseUrl) throw new PncliError('Sonatype IQ Server baseUrl not configured. Run: pncli config init');\n if (!config.sonatypeiq.userCode || !config.sonatypeiq.passcode) throw new PncliError('Sonatype IQ Server credentials not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return http;\n}\n\nexport function registerSonatypeIqCommands(program: Command): void {\n const sonatypeiq = program.command('sonatypeiq').description('Sonatype IQ Server operations');\n\n const applications = sonatypeiq.command('applications').description('Application operations');\n\n applications\n .command('list')\n .description('List all applications in Sonatype IQ Server')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const params: Record<string, string | number | boolean | undefined> = {};\n if (opts.organizationId) params['organizationId'] = opts.organizationId;\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', { params });\n success(data, 'sonatypeiq', 'applications list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications list', startTime); }\n });\n\n applications\n .command('get')\n .description('Get an application by its public ID')\n .requiredOption('--public-id <id>', 'Application public ID')\n .action(async (opts: { publicId: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', {\n params: { publicId: opts.publicId }\n });\n success(data, 'sonatypeiq', 'applications get', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications get', startTime); }\n });\n\n const organizations = sonatypeiq.command('organizations').description('Organization operations');\n\n organizations\n .command('list')\n .description('List all organizations in Sonatype IQ Server')\n .action(async () => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/organizations');\n success(data, 'sonatypeiq', 'organizations list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'organizations list', startTime); }\n });\n\n const policies = sonatypeiq.command('policies').description('Policy operations');\n\n policies\n .command('list')\n .description('List all policies')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const path = opts.organizationId\n ? `/api/v2/policies/organization/${encodeURIComponent(opts.organizationId)}`\n : '/api/v2/policies';\n const data = await http.sonatypeiq<unknown>(path);\n success(data, 'sonatypeiq', 'policies list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'policies list', startTime); }\n });\n}\n","import { Command } from 'commander';\nimport { success, fail, warn } from '../../lib/output.js';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { fileURLToPath } from 'url';\nimport { execFileSync } from 'child_process';\nimport select from '@inquirer/select';\nimport { writeGlobalConfig, getGlobalConfigPath, loadJsonFile } from '../../lib/config.js';\nimport type { GlobalConfig } from '../../types/config.js';\n\n/**\n * Injects a Bitbucket HTTP access token into a git clone URL using the\n * x-token-auth scheme: https://x-token-auth:<token>@host/path\n */\nexport function injectTokenIntoUrl(url: string, token: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`--token requires an HTTPS clone URL; got: ${url}`);\n }\n parsed.username = 'x-token-auth';\n parsed.password = token;\n return parsed.toString();\n}\n\nconst AGENT_PATHS: Record<string, { project: string; user: string }> = {\n 'github-copilot': { project: '.agents/skills', user: path.join(os.homedir(), '.copilot/skills') },\n 'claude-code': { project: '.claude/skills', user: path.join(os.homedir(), '.claude/skills') },\n};\n\n// Resolve the bundled skills directory relative to this file (dist/cli.js → ../skills)\nfunction getBundledSkillsDir(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(thisFile), '..', 'skills');\n } catch {\n return '';\n }\n}\n\nexport function registerSkillsCommands(program: Command): void {\n const skills = program.command('skills').description('Manage pncli Claude Code skills');\n\n skills\n .command('install')\n .description('Install pncli skills into the current repo')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override install directory (ignores --agent and --scope)')\n\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = AGENT_PATHS[opts.agent];\n if (!agentConfig) {\n throw new Error(`Unknown agent: \"${opts.agent}\". Use: ${Object.keys(AGENT_PATHS).join(' | ')}`);\n }\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n const resolvedTarget = path.resolve(targetDir);\n const bundledDir = getBundledSkillsDir();\n let skillDirs: string[] = [];\n\n if (bundledDir !== '') {\n try {\n skillDirs = fs.readdirSync(bundledDir).filter(name =>\n fs.existsSync(path.join(bundledDir, name, 'SKILL.md'))\n );\n } catch { /* bundledDir not readable */ }\n }\n\n if (skillDirs.length === 0) {\n throw new Error('No bundled skills found. Reinstall pncli to get the latest version: npm install -g @kolatts/pncli');\n }\n\n const installed: string[] = [];\n const failed: string[] = [];\n\n // Remove only pncli-managed skills (not user-created ones)\n for (const skillName of skillDirs) {\n const existingDir = path.resolve(targetDir, skillName);\n if (!existingDir.startsWith(resolvedTarget + path.sep)) continue;\n if (fs.existsSync(existingDir)) {\n fs.rmSync(existingDir, { recursive: true, force: true });\n }\n }\n\n warn(`Installing ${skillDirs.length} bundled skill(s) to ${targetDir}...`);\n\n for (const skillName of skillDirs) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) {\n failed.push(skillName);\n continue;\n }\n\n try {\n const mdFiles = fs.readdirSync(path.join(bundledDir, skillName))\n .filter(f => f.endsWith('.md'));\n fs.mkdirSync(skillDir, { recursive: true });\n for (const mdFile of mdFiles) {\n const content = fs.readFileSync(path.join(bundledDir, skillName, mdFile), 'utf8');\n fs.writeFileSync(path.join(skillDir, mdFile), content, 'utf8');\n }\n installed.push(skillName);\n } catch {\n failed.push(skillName);\n }\n }\n\n warn(`Installed ${installed.length} skill(s) to ${targetDir}`);\n if (failed.length > 0) {\n warn(`Failed to install: ${failed.join(', ')}`);\n }\n\n success({\n installed,\n failed,\n target: targetDir,\n total: installed.length,\n agent: opts.target ? 'custom' : opts.agent,\n scope: opts.target ? 'custom' : opts.scope,\n source: 'bundled',\n }, 'skills', 'install', start);\n } catch (err) {\n fail(err, 'skills', 'install', start);\n }\n });\n\n skills\n .command('list')\n .description('List locally installed skills')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override skills directory to scan')\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = AGENT_PATHS[opts.agent];\n if (!agentConfig) {\n throw new Error(`Unknown agent: \"${opts.agent}\". Use: ${Object.keys(AGENT_PATHS).join(' | ')}`);\n }\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n if (!fs.existsSync(targetDir)) {\n success({ skills: [], message: `No skills directory found at ${targetDir}. Run: pncli skills install` }, 'skills', 'list', start);\n return;\n }\n\n const skillDirs = fs.readdirSync(targetDir).filter(name => {\n const skillPath = path.join(targetDir, name, 'SKILL.md');\n return fs.existsSync(skillPath);\n });\n\n const skillsList = skillDirs.map(name => {\n const content = fs.readFileSync(path.join(targetDir, name, 'SKILL.md'), 'utf8');\n const frontmatter = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n const data: Record<string, string> = {};\n const metadata: Record<string, string> = {};\n if (frontmatter) {\n let inMetadata = false;\n for (const line of frontmatter[1].split('\\n')) {\n if (line.trimEnd() === 'metadata:') { inMetadata = true; continue; }\n if (inMetadata && line.startsWith(' ')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx !== -1) {\n metadata[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n continue;\n }\n inMetadata = false;\n const colonIdx = line.indexOf(':');\n if (colonIdx === -1) continue;\n data[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n }\n return {\n name: data.name || name,\n slug: name,\n category: metadata.category || data.category || 'other',\n services: metadata.services || data.services || '',\n providers: metadata.providers || data.providers || 'none',\n userInvocable: data['user-invocable'] === 'true',\n };\n });\n\n success({ skills: skillsList, total: skillsList.length }, 'skills', 'list', start);\n } catch (err) {\n fail(err, 'skills', 'list', start);\n }\n });\n\n const marketplace = skills.command('marketplace').description('Manage a git-hosted skills marketplace');\n\n marketplace\n .command('setup')\n .description('Clone a skills marketplace repo and register it in global config')\n .argument('<url>', 'Git clone URL of the marketplace repository')\n .argument('<localPath>', 'Local directory to clone the marketplace into')\n .option('--branch <branch>', 'Branch to clone', 'master')\n .option('--token <token>', 'Bitbucket HTTP access token for authenticated clone and pull')\n .action(async (url: string, localPath: string, opts: { branch: string; token?: string }) => {\n const start = Date.now();\n try {\n const resolvedPath = path.resolve(localPath);\n\n const hasGit = fs.existsSync(path.join(resolvedPath, '.git'));\n if (fs.existsSync(resolvedPath) && !hasGit && fs.readdirSync(resolvedPath).length > 0) {\n throw new Error(`Directory already exists and is not a git repo: ${resolvedPath}`);\n }\n if (hasGit) {\n warn(`Directory already contains a git repo at ${resolvedPath} — skipping clone, updating config only.`);\n } else {\n warn(`Cloning ${url} (branch: ${opts.branch}) → ${resolvedPath}...`);\n const cloneUrl = opts.token ? injectTokenIntoUrl(url, opts.token) : url;\n try {\n execFileSync('git', ['clone', '--branch', opts.branch, cloneUrl, resolvedPath], { stdio: ['inherit', 'inherit', 'pipe'] });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(msg.replace(/x-token-auth:[^@]+@/g, 'x-token-auth:***@'));\n }\n }\n\n const configPath = getGlobalConfigPath();\n const existing: GlobalConfig = loadJsonFile<GlobalConfig>(configPath) ?? {};\n existing.marketplace = { repoUrl: url, localPath: resolvedPath, ...(opts.token ? { token: opts.token } : {}) };\n writeGlobalConfig(existing, configPath);\n\n success({ repoUrl: url, localPath: resolvedPath, branch: opts.branch, tokenConfigured: !!opts.token }, 'skills', 'marketplace-setup', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-setup', start);\n }\n });\n\n marketplace\n .command('sync')\n .description('Pull latest marketplace content and install a plugin\\'s skills')\n .argument('[plugin]', 'Plugin name to install (skips interactive selection)')\n .option('--claude', 'Install to ~/.claude/skills instead of ~/.agents/skills')\n .action(async (plugin: string | undefined, opts: { claude?: boolean }) => {\n const start = Date.now();\n try {\n const configPath = getGlobalConfigPath();\n const globalConfig: GlobalConfig = loadJsonFile<GlobalConfig>(configPath) ?? {};\n\n const marketplacePath = globalConfig.marketplace?.localPath;\n if (!marketplacePath || !fs.existsSync(marketplacePath)) {\n throw new Error('Marketplace not configured. Run: pncli skills marketplace setup <url> <localPath>');\n }\n\n warn('Pulling latest marketplace content...');\n const repoUrl = globalConfig.marketplace?.repoUrl;\n const token = globalConfig.marketplace?.token;\n const gitArgs = ['-C', marketplacePath];\n if (repoUrl && token) {\n gitArgs.push('-c', `remote.origin.url=${injectTokenIntoUrl(repoUrl, token)}`);\n }\n gitArgs.push('pull');\n try {\n execFileSync('git', gitArgs, { stdio: ['inherit', 'inherit', 'pipe'] });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(msg.replace(/x-token-auth:[^@]+@/g, 'x-token-auth:***@'));\n }\n\n const pluginChoices = resolvePluginChoices(marketplacePath);\n if (pluginChoices.length === 0) {\n throw new Error('No plugins found in marketplace. Check the marketplace repository structure.');\n }\n\n let selectedPlugin: string;\n if (plugin) {\n if (!pluginChoices.some(p => p.name === plugin)) {\n throw new Error(`Plugin \"${plugin}\" not found. Available: ${pluginChoices.map(p => p.name).join(', ')}`);\n }\n selectedPlugin = plugin;\n } else {\n selectedPlugin = await select({\n message: 'Select a plugin to install:',\n choices: pluginChoices.map(p => ({\n value: p.name,\n name: p.description ? `${p.name} — ${p.description}` : p.name,\n })),\n });\n }\n\n const skillsSrc = resolveSkillsSrc(marketplacePath, selectedPlugin);\n if (!fs.existsSync(skillsSrc)) {\n throw new Error(`No skills directory found at ${skillsSrc}`);\n }\n\n const targetDir = opts.claude\n ? path.join(os.homedir(), '.claude', 'skills')\n : path.join(os.homedir(), '.agents', 'skills');\n\n const { installed, failed } = copyPluginSkills(skillsSrc, targetDir);\n if (failed.length > 0) {\n warn(`Skipped ${failed.length} skill(s) with invalid names: ${failed.join(', ')}`);\n }\n\n success({\n plugin: selectedPlugin,\n installed,\n failed,\n total: installed.length,\n target: targetDir,\n }, 'skills', 'marketplace-sync', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-sync', start);\n }\n });\n}\n\nexport function resolvePluginChoices(marketplacePath: string): { name: string; description: string }[] {\n const marketplaceJsonPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');\n if (fs.existsSync(marketplaceJsonPath)) {\n try {\n const meta = JSON.parse(fs.readFileSync(marketplaceJsonPath, 'utf8')) as {\n plugins?: { name: string; description?: string }[];\n };\n if (Array.isArray(meta.plugins) && meta.plugins.length > 0) {\n return meta.plugins.map(p => ({ name: p.name, description: p.description ?? '' }));\n }\n } catch { /* fallthrough to dir scan */ }\n }\n\n const pluginsDir = path.join(marketplacePath, 'plugins');\n if (fs.existsSync(pluginsDir)) {\n return fs.readdirSync(pluginsDir)\n .filter(name => fs.statSync(path.join(pluginsDir, name)).isDirectory())\n .map(name => ({ name, description: '' }));\n }\n\n return [];\n}\n\nexport function resolveSkillsSrc(marketplacePath: string, selectedPlugin: string): string {\n const pluginsBase = path.resolve(marketplacePath, 'plugins');\n const skillsSrc = path.resolve(pluginsBase, selectedPlugin, 'skills');\n if (!skillsSrc.startsWith(pluginsBase + path.sep)) {\n throw new Error(`Invalid plugin name: \"${selectedPlugin}\"`);\n }\n return skillsSrc;\n}\n\nexport function copyPluginSkills(skillsSrc: string, targetDir: string): { installed: string[]; failed: string[] } {\n fs.mkdirSync(targetDir, { recursive: true });\n const resolvedTarget = path.resolve(targetDir);\n\n const skillNames = fs.readdirSync(skillsSrc).filter(name =>\n fs.statSync(path.join(skillsSrc, name)).isDirectory()\n );\n\n const installed: string[] = [];\n const failed: string[] = [];\n\n for (const skillName of skillNames) {\n const dest = path.resolve(targetDir, skillName);\n if (!dest.startsWith(resolvedTarget + path.sep)) {\n failed.push(skillName);\n continue;\n }\n fs.rmSync(dest, { recursive: true, force: true });\n fs.cpSync(path.join(skillsSrc, skillName), dest, { recursive: true });\n installed.push(skillName);\n }\n\n return { installed, failed };\n}\n"],"mappings":"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","names":["Command","execSync","path","program","API","program","getClient","program","API","getClient","program","API","getClient","program","API","getClient","program","resolveProject","path","execSync","execFileSync","pkg","path","path","execSync","path","execFileSync","pkg","pkg","pkg","BATCH_SIZE","TIMEOUT_MS","fetchWithTimeout","pkg","inferSeverityFromCvss","queryBatch","TIMEOUT_MS","BATCH_SIZE","fetchWithTimeout","toPurl","pkg","TIMEOUT_MS","fetchWithTimeout","pkg","pkg","pkg","pkg","program","API","fs","program","path","categorize","API","API","program","parseFieldArgs","fs","repo","AdoCoreClient","createHttpClient","program","getClient","program","API","path","getClient","program","path","POLL_INTERVAL_MS","getClient","program","getClient","program","program","program","program","path","fs","path","execFileSync","path","program","fs","colonIdx","execFileSync","require","Command"]}
|