@kolatts/pncli 1.4.0 → 1.6.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/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/parsers/index.ts","../src/services/deps/parsers/npm.ts","../src/services/deps/parsers/nuget.ts","../src/services/deps/parsers/maven.ts","../src/services/deps/scan.ts","../src/services/deps/semver.ts","../src/services/deps/diff.ts","../src/services/deps/clients/osv.ts","../src/services/deps/clients/artifactory.ts","../src/services/deps/connectivity.ts","../src/services/deps/frisk.ts","../src/services/deps/outdated.ts","../src/services/deps/license-check.ts","../src/services/deps/commands.ts","../src/services/config/commands.ts","../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"],"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';\n\nconst require = createRequire(import.meta.url);\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst pkg = require('../package.json') as any;\n\nconst TAGLINE = 'One command does what three meetings couldn\\'t.';\n\nconst program = new Command();\n\nprogram\n .name('pncli')\n .description(`The Paperwork Nightmare CLI — ${TAGLINE}`)\n .version(`${pkg.version as string} — ${TAGLINE}`, '-v, --version')\n .option('--pretty', 'Human-readable formatted output', false)\n .option('--verbose', 'Include full response metadata', false)\n .option('--dry-run', 'Print API requests without executing', false)\n .option('--config <path>', 'Override global config file location');\n\n// Propagate global options and user identity before any command runs\nprogram.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setGlobalOptions({\n pretty: Boolean(opts.pretty),\n verbose: Boolean(opts.verbose)\n });\n try {\n const config = loadConfig({ configPath: opts.config as string | undefined });\n setGlobalUser(config.user);\n } catch {\n // config may not exist yet (e.g. during `config init`) — silently skip\n }\n});\n\nregisterGitCommands(program);\nregisterJiraCommands(program);\nregisterBitbucketCommands(program);\nregisterConfluenceCommands(program);\nregisterSonarCommands(program);\nregisterSdeCommands(program);\nregisterDepsCommands(program);\nregisterConfigCommands(program);\nregisterAdoCommands(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 config Manage pncli configuration\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 } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { CustomFieldMap } from '../../types/jira.js';\n\nfunction getClient(program: Command): JiraClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JiraClient(http);\n}\n\nfunction getClientAndFields(program: Command): { client: JiraClient; fieldMap: CustomFieldMap; customFields: import('../../types/jira.js').CustomFieldDefinition[] } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new JiraClient(http);\n const customFields = config.jira.customFields;\n const fieldMap = buildFieldMap(customFields);\n return { client, fieldMap, customFields };\n}\n\nfunction getDefaults(program: Command): { project?: string; issueType?: string; priority?: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n return {\n project: config.defaults.jira?.project,\n issueType: config.defaults.jira?.issueType,\n priority: config.defaults.jira?.priority\n };\n}\n\nexport function registerJiraCommands(program: Command): void {\n const jira = program.command('jira').description('Jira Data Cloud operations');\n\n jira.command('get-issue')\n .description('Get a Jira issue by key')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const data = await client.getIssue(opts.key);\n const translated = { ...data, fields: translateFieldsInOutput(data.fields as Record<string, unknown>, fieldMap) };\n success(translated, 'jira', 'get-issue', start);\n } catch (err) { fail(err, 'jira', 'get-issue', start); }\n });\n\n jira.command('create-issue')\n .description('Create a Jira issue')\n .option('--project <key>', 'Project key')\n .option('--type <type>', 'Issue type (Bug, Story, Task, ...)')\n .requiredOption('--summary <text>', 'Issue summary')\n .option('--description <text>', 'Issue description')\n .option('--priority <name>', 'Priority name')\n .option('--assignee <accountId>', 'Assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { project?: string; type?: string; summary: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const defaults = getDefaults(program);\n const project = opts.project ?? defaults.project;\n const issueType = opts.type ?? defaults.issueType ?? 'Task';\n const priority = opts.priority ?? defaults.priority;\n if (!project) throw new PncliError('--project required (or set defaults.jira.project in config)', 1);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n const data = await client.createIssue({ project, issueType, summary: opts.summary, description: opts.description, priority, assignee: opts.assignee, labels, customFieldValues });\n success(data, 'jira', 'create-issue', start);\n } catch (err) { fail(err, 'jira', 'create-issue', start); }\n });\n\n jira.command('update-issue')\n .description('Update a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .option('--summary <text>', 'New summary')\n .option('--description <text>', 'New description')\n .option('--priority <name>', 'New priority')\n .option('--assignee <accountId>', 'New assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { key: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n await client.updateIssue(opts.key, { summary: opts.summary, description: opts.description, priority: opts.priority, assignee: opts.assignee, labels, customFieldValues });\n success({ updated: opts.key }, 'jira', 'update-issue', start);\n } catch (err) { fail(err, 'jira', 'update-issue', start); }\n });\n\n jira.command('transition-issue')\n .description('Transition a Jira issue to a new status')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--transition <name-or-id>', 'Transition name or ID')\n .action(async (opts: { key: string; transition: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n // Resolve transition name to ID if needed\n let transitionId = opts.transition;\n if (isNaN(parseInt(opts.transition, 10))) {\n const transitions = await client.listTransitions(opts.key);\n const found = transitions.find(t => t.name.toLowerCase() === opts.transition.toLowerCase());\n if (!found) throw new PncliError(`Transition not found: ${opts.transition}`, 1);\n transitionId = found.id;\n }\n await client.transitionIssue(opts.key, transitionId);\n success({ transitioned: opts.key, transition: opts.transition }, 'jira', 'transition-issue', start);\n } catch (err) { fail(err, 'jira', 'transition-issue', start); }\n });\n\n jira.command('list-transitions')\n .description('List available transitions for an issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listTransitions(opts.key);\n success(data, 'jira', 'list-transitions', start);\n } catch (err) { fail(err, 'jira', 'list-transitions', start); }\n });\n\n jira.command('add-comment')\n .description('Add a comment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { key: string; body: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.key, opts.body);\n success(data, 'jira', 'add-comment', start);\n } catch (err) { fail(err, 'jira', 'add-comment', start); }\n });\n\n jira.command('list-comments')\n .description('List comments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.key);\n success(data, 'jira', 'list-comments', start);\n } catch (err) { fail(err, 'jira', 'list-comments', start); }\n });\n\n jira.command('search')\n .description('Search Jira issues with JQL')\n .requiredOption('--jql <query>', 'JQL query string')\n .option('--max-results <n>', 'Maximum number of results')\n .action(async (opts: { jql: string; maxResults?: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap, customFields } = getClientAndFields(program);\n const maxResults = opts.maxResults ? parseInt(opts.maxResults, 10) : undefined;\n const translatedJql = translateJql(opts.jql, fieldMap);\n const data = await client.search(translatedJql, maxResults, customFields);\n const translatedIssues = data.issues.map(issue => ({\n ...issue,\n fields: translateFieldsInOutput(issue.fields as Record<string, unknown>, fieldMap)\n }));\n success({ ...data, issues: translatedIssues }, 'jira', 'search', start);\n } catch (err) { fail(err, 'jira', 'search', start); }\n });\n\n jira.command('assign')\n .description('Assign a Jira issue to a user')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--assignee <accountId>', 'Assignee account ID')\n .action(async (opts: { key: string; assignee: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.assignIssue(opts.key, opts.assignee);\n success({ assigned: opts.key, assignee: opts.assignee }, 'jira', 'assign', start);\n } catch (err) { fail(err, 'jira', 'assign', start); }\n });\n\n jira.command('link-issue')\n .description('Link two Jira issues together')\n .requiredOption('--key <issue-key>', 'Source issue key')\n .requiredOption('--link-type <type>', 'Link type name or ID')\n .requiredOption('--target <issue-key>', 'Target issue key')\n .action(async (opts: { key: string; linkType: string; target: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.linkIssue({ key: opts.key, linkType: opts.linkType, target: opts.target });\n success({ linked: opts.key, to: opts.target, type: opts.linkType }, 'jira', 'link-issue', start);\n } catch (err) { fail(err, 'jira', 'link-issue', start); }\n });\n\n jira.command('fields')\n .description('List custom fields (configured or discovered from Jira API)')\n .option('--discover', 'Fetch field metadata from Jira API')\n .option('--custom-only', 'Show only custom fields (requires --discover)')\n .action(async (opts: { discover?: boolean; customOnly?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.discover) {\n const client = getClient(program);\n const fields = await client.fetchFields();\n const result = opts.customOnly ? fields.filter(f => f.custom) : fields;\n success(result, 'jira', 'fields', start);\n } else {\n const { customFields } = getClientAndFields(program);\n success(customFields, 'jira', 'fields', start);\n }\n } catch (err) { fail(err, 'jira', 'fields', start); }\n });\n}\n\nfunction parseFieldArgs(\n fieldArgs: string[],\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const arg of fieldArgs) {\n const eq = arg.indexOf('=');\n if (eq === -1) throw new PncliError(`Invalid --field format (expected Name=value): ${arg}`, 1);\n const name = arg.slice(0, eq).trim();\n const value = arg.slice(eq + 1);\n const def = fieldMap.byName.get(name.toLowerCase());\n if (!def) throw new PncliError(`Unknown custom field: \"${name}\". Run: pncli jira fields`, 1);\n result[def.id] = formatFieldValue(value, def.type);\n }\n return result;\n}\n","import { Command } from 'commander';\nimport { BitbucketClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): { client: BitbucketClient; project: string; repo: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n\n const project: string = opts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo: string = opts.repo ?? ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n\n if (!project || !repo) {\n throw new PncliError(\n 'Could not determine Bitbucket project/repo. Pass --project and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, project, repo };\n}\n\nexport function registerBitbucketCommands(program: Command): void {\n const bb = program\n .command('bitbucket')\n .description('Bitbucket Server operations')\n .option('--project <key>', 'Bitbucket project key')\n .option('--repo <slug>', 'Bitbucket repository slug');\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n bb.command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: OPEN|MERGED|DECLINED|ALL', 'OPEN')\n .option('--author <username>', 'Filter by author username')\n .option('--reviewer <username>', 'Filter by reviewer username')\n .action(async (opts: { state?: string; author?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listPRs({ project, repo, state: opts.state, author: opts.author, reviewer: opts.reviewer });\n success(data, 'bitbucket', 'list-prs', start);\n } catch (err) { fail(err, 'bitbucket', 'list-prs', start); }\n });\n\n bb.command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.getPR(project, repo, parseInt(opts.id, 10));\n success(data, 'bitbucket', 'get-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'get-pr', start); }\n });\n\n bb.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (defaults to config)')\n .option('--description <desc>', 'PR description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { title: string; source: string; target?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const config = loadConfig({ configPath: program.optsWithGlobals().config });\n const target = opts.target ?? config.defaults.bitbucket?.targetBranch ?? 'main';\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : [];\n const data = await client.createPR({ project, repo, title: opts.title, source: opts.source, target, description: opts.description, reviewers });\n success(data, 'bitbucket', 'create-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'create-pr', start); }\n });\n\n bb.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <desc>', 'New description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : undefined;\n const data = await client.updatePR({ project, repo, id: prId, title: opts.title, description: opts.description, reviewers, version: pr.version });\n success(data, 'bitbucket', 'update-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'update-pr', start); }\n });\n\n bb.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--strategy <strategy>', 'Merge strategy: merge|squash|ff')\n .option('--delete-branch', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy?: string; deleteBranch?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.mergePR({ project, repo, id: prId, version: pr.version, strategy: opts.strategy as 'merge' | 'squash' | 'ff', deleteBranch: opts.deleteBranch });\n success(data, 'bitbucket', 'merge-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'merge-pr', start); }\n });\n\n bb.command('decline-pr')\n .description('Decline a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.declinePR(project, repo, prId, pr.version);\n success(data, 'bitbucket', 'decline-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'decline-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n bb.command('list-comments')\n .description('List comments on a pull request (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(program);\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(program);\n const data = await client.addComment(project, repo, parseInt(opts.pr, 10), opts.body);\n success(data, 'bitbucket', 'add-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-comment', start); }\n });\n\n bb.command('add-inline-comment')\n .description('Add an inline comment to a file in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <type>', 'Line type: ADDED|REMOVED|CONTEXT', 'ADDED')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.addInlineComment({\n project, repo,\n prId: parseInt(opts.pr, 10),\n text: opts.body,\n filePath: opts.file,\n line: parseInt(opts.line, 10),\n lineType: opts.lineType as 'ADDED' | 'REMOVED' | 'CONTEXT'\n });\n success(data, 'bitbucket', 'add-inline-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-inline-comment', start); }\n });\n\n bb.command('reply-comment')\n .description('Reply to a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.replyComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'bitbucket', 'reply-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'reply-comment', start); }\n });\n\n bb.command('resolve-comment')\n .description('Resolve a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.resolveComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ resolved: true }, 'bitbucket', 'resolve-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'resolve-comment', start); }\n });\n\n bb.command('delete-comment')\n .description('Delete a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.deleteComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ deleted: true }, 'bitbucket', 'delete-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'delete-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n bb.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--file <path>', 'Limit diff to a specific file')\n .option('--context-lines <n>', 'Lines of context around changes')\n .action(async (opts: { pr: string; file?: string; contextLines?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const contextLines = opts.contextLines ? parseInt(opts.contextLines, 10) : undefined;\n const diff = await client.getDiff(project, repo, parseInt(opts.pr, 10), opts.file, contextLines);\n success({ diff }, 'bitbucket', 'diff', start);\n } catch (err) { fail(err, 'bitbucket', 'diff', start); }\n });\n\n bb.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listFiles(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-files', start);\n } catch (err) { fail(err, 'bitbucket', 'list-files', start); }\n });\n\n // ── Approvals ──────────────────────────────────────────────────────\n\n bb.command('approve')\n .description('Approve a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.approvePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'approve', start);\n } catch (err) { fail(err, 'bitbucket', 'approve', start); }\n });\n\n bb.command('unapprove')\n .description('Remove approval from a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.unapprovePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'unapprove', start);\n } catch (err) { fail(err, 'bitbucket', 'unapprove', start); }\n });\n\n bb.command('needs-work')\n .description('Mark a pull request as needs-work')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.needsWorkPR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'needs-work', start);\n } catch (err) { fail(err, 'bitbucket', 'needs-work', start); }\n });\n\n bb.command('list-reviewers')\n .description('List reviewers of a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listReviewers(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-reviewers', start);\n } catch (err) { fail(err, 'bitbucket', 'list-reviewers', start); }\n });\n\n // ── Build Status ───────────────────────────────────────────────────\n\n bb.command('list-builds')\n .description('List build statuses for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listBuilds(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-builds', start);\n } catch (err) { fail(err, 'bitbucket', 'list-builds', start); }\n });\n\n bb.command('get-build-status')\n .description('Get build status for a commit SHA')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getBuildStatus(opts.commit);\n success(data, 'bitbucket', 'get-build-status', start);\n } catch (err) { fail(err, 'bitbucket', 'get-build-status', start); }\n });\n}\n","import 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')\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 (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')\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')\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')\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')\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')\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')\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 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 { Ecosystem, LicensedPackage, OutdatedPackage } from '../types.js';\nimport type { ArtifactoryConfig } from '../../../types/config.js';\nimport { PncliError } from '../../../lib/errors.js';\nimport { isNewer, updateType } from '../semver.js';\n\nconst TIMEOUT_MS = 15_000;\n\nasync function fetchWithTimeout(url: string, token: string): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkArtifactoryConnectivity(config: ArtifactoryConfig): Promise<{\n reachable: boolean;\n authenticated: boolean;\n configured: boolean;\n error?: string;\n}> {\n if (!config.baseUrl && !config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory is not configured'\n };\n }\n if (!config.baseUrl) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory baseUrl is not set'\n };\n }\n if (!config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory token is not set'\n };\n }\n\n try {\n const res = await fetchWithTimeout(`${config.baseUrl}/api/system/ping`, config.token);\n if (res.status === 401 || res.status === 403) {\n return {\n reachable: true,\n authenticated: false,\n configured: true,\n error: 'Artifactory token is invalid or lacks permissions'\n };\n }\n return { reachable: res.ok, authenticated: res.ok, configured: true };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n configured: true,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport function requireArtifactory(config: ArtifactoryConfig, command: string): void {\n if (!config.baseUrl && !config.token) {\n throw new PncliError(\n `${command} requires Artifactory. Add the following to ~/.pncli/config.json:\\n` +\n ` \"artifactory\": { \"baseUrl\": \"https://artifactory.company.com\", \"token\": \"your-token\" }\\n` +\n `Or set PNCLI_ARTIFACTORY_BASE_URL and PNCLI_ARTIFACTORY_TOKEN environment variables.`,\n 503\n );\n }\n if (!config.baseUrl) {\n throw new PncliError(\n `${command} requires an Artifactory URL. Set artifactory.baseUrl in ~/.pncli/config.json or PNCLI_ARTIFACTORY_BASE_URL.`,\n 503\n );\n }\n if (!config.token) {\n throw new PncliError(\n `${command} requires an Artifactory token. Set artifactory.token in ~/.pncli/config.json or PNCLI_ARTIFACTORY_TOKEN.`,\n 503\n );\n }\n}\n\nfunction repoForEcosystem(config: ArtifactoryConfig, eco: Ecosystem): string | undefined {\n if (eco === 'npm') return config.npmRepo;\n if (eco === 'nuget') return config.nugetRepo;\n if (eco === 'maven') return config.mavenRepo;\n return undefined;\n}\n\nasync function getLatestNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { 'dist-tags'?: { latest?: string } };\n return data['dist-tags']?.latest ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/flatcontainer/${lower}/index.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { versions?: string[] };\n const versions = data.versions ?? [];\n return versions[versions.length - 1] ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestMaven(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n const [groupId, artifactId] = packageName.split(':');\n if (!groupId || !artifactId) return null;\n\n try {\n const res = await fetchWithTimeout(\n `${baseUrl}/api/search/latestVersion?g=${encodeURIComponent(groupId)}&a=${encodeURIComponent(artifactId)}&repos=${repoName}`,\n token\n );\n if (!res.ok) return null;\n const text = await res.text();\n return text.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function getOutdatedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<{ outdated: OutdatedPackage[]; uncheckedEcosystems: string[] }> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return { outdated: [], uncheckedEcosystems: [] };\n\n const outdated: OutdatedPackage[] = [];\n const unchecked = new Set<string>();\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n if (!repoName) {\n unchecked.add(pkg.ecosystem);\n continue;\n }\n\n let latest: string | null = null;\n if (pkg.ecosystem === 'npm') {\n latest = await getLatestNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n latest = await getLatestNuget(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'maven') {\n latest = await getLatestMaven(baseUrl, token, repoName, pkg.name);\n }\n\n if (!latest || !isNewer(pkg.version, latest)) continue;\n\n const type = updateType(pkg.version, latest);\n if (filterType) {\n const order = { major: 3, minor: 2, patch: 1 };\n if (order[type] < order[filterType]) continue;\n }\n\n outdated.push({\n name: pkg.name,\n ecosystem: pkg.ecosystem,\n current: pkg.version,\n latest,\n updateType: type,\n source: pkg.source\n });\n }\n\n return { outdated, uncheckedEcosystems: [...unchecked] };\n}\n\nasync function getLicenseNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { license?: string | { type?: string } };\n if (typeof data.license === 'string') return data.license;\n if (typeof data.license === 'object' && data.license !== null) return data.license.type ?? null;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function getLicenseNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string,\n version: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/registration/${lower}/${version}.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { licenseExpression?: string; licenseUrl?: string };\n return data.licenseExpression ?? (data.licenseUrl ? 'See licenseUrl' : null);\n } catch {\n return null;\n }\n}\n\nexport async function getLicensedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig\n): Promise<LicensedPackage[]> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return [];\n\n const result: LicensedPackage[] = [];\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n let license: string | null = null;\n\n if (repoName) {\n if (pkg.ecosystem === 'npm') {\n license = await getLicenseNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n license = await getLicenseNuget(baseUrl, token, repoName, pkg.name, pkg.version);\n }\n // Maven: fetching license from POM via Artifactory is complex — emit null\n }\n\n result.push({\n name: pkg.name,\n version: pkg.version,\n ecosystem: pkg.ecosystem,\n source: pkg.source,\n license\n });\n }\n\n return result;\n}\n","import type { ConnectivityData, Tier } from './types.js';\nimport type { ResolvedConfig } from '../../types/config.js';\nimport { checkOsvConnectivity } from './clients/osv.js';\nimport { checkArtifactoryConnectivity } from './clients/artifactory.js';\n\ninterface TierResult {\n tier: Tier;\n osvReachable: boolean;\n artifactoryReachable: boolean;\n}\n\n// Session-level cache — not persisted to disk\nlet cachedTier: TierResult | null = null;\n\nexport async function detectTier(config: ResolvedConfig): Promise<TierResult> {\n if (cachedTier) return cachedTier;\n\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artifactoryReachable = artResult.reachable && artResult.authenticated;\n const osvReachable = osvResult.reachable;\n\n let tier: Tier = 'local';\n if (artifactoryReachable) tier = 'artifactory';\n if (osvReachable) tier = 'full';\n\n cachedTier = { tier, osvReachable, artifactoryReachable };\n return cachedTier;\n}\n\nexport function clearTierCache(): void {\n cachedTier = null;\n}\n\nexport async function buildConnectivityData(config: ResolvedConfig): Promise<ConnectivityData> {\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artCfg = config.artifactory;\n\n let tier: Tier = 'local';\n if (artResult.reachable && artResult.authenticated) tier = 'artifactory';\n if (osvResult.reachable) tier = 'full';\n\n cachedTier = {\n tier,\n osvReachable: osvResult.reachable,\n artifactoryReachable: artResult.reachable && artResult.authenticated\n };\n\n return {\n artifactory: {\n reachable: artResult.reachable,\n url: artCfg.baseUrl ?? '(not configured)',\n authenticated: artResult.authenticated,\n repositories: {\n npm: artCfg.npmRepo ?? '(not configured)',\n nuget: artCfg.nugetRepo ?? '(not configured)',\n maven: artCfg.mavenRepo ?? '(not configured)'\n },\n ...(artResult.error ? { error: artResult.error } : {})\n },\n osv: {\n reachable: osvResult.reachable,\n url: 'https://api.osv.dev',\n ...(osvResult.error ? { error: osvResult.error } : {})\n },\n tier,\n capabilities: {\n scan: true,\n diff: true,\n outdated: artResult.reachable && artResult.authenticated,\n licenseCheck: artResult.reachable && artResult.authenticated,\n cveCheck: osvResult.reachable\n }\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, FriskData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { checkPackagesForVulns } from './clients/osv.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runFrisk(config: ResolvedConfig, opts: ScanOptions): Promise<FriskData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n const { tier, osvReachable } = await detectTier(config);\n\n if (!osvReachable) {\n throw new PncliError(\n 'deps frisk requires OSV.dev access but api.osv.dev is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n // Default frisk: include transitive deps (CVEs hide in transitive deps)\n const scanOpts: ScanOptions = {\n ...opts,\n includeTransitive: opts.includeTransitive ?? true\n };\n\n const scan = scanRepo(repoRoot, scanOpts);\n\n if (scan.packages.length === 0) {\n return { tier, scanned: 0, vulnerable: 0, packages: [] };\n }\n\n const vulnerable = await checkPackagesForVulns(scan.packages);\n\n return {\n tier,\n scanned: scan.packages.length,\n vulnerable: vulnerable.length,\n packages: vulnerable\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, OutdatedData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getOutdatedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runOutdated(\n config: ResolvedConfig,\n opts: ScanOptions,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<OutdatedData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Fail fast with a clear message if Artifactory is not configured at all\n requireArtifactory(config.artifactory, 'deps outdated');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const { outdated, uncheckedEcosystems } = await getOutdatedPackages(\n directPackages,\n config.artifactory,\n filterType\n );\n\n const summary = { total: outdated.length, major: 0, minor: 0, patch: 0 };\n for (const pkg of outdated) summary[pkg.updateType]++;\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n outdated,\n uncheckedEcosystems,\n summary\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, LicenseCheckData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getLicensedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runLicenseCheck(config: ResolvedConfig, opts: ScanOptions): Promise<LicenseCheckData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n requireArtifactory(config.artifactory, 'deps license-check');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const licensed = await getLicensedPackages(directPackages, config.artifactory);\n\n const byLicense: Record<string, number> = {};\n let unknown = 0;\n\n for (const pkg of licensed) {\n if (!pkg.license) {\n unknown++;\n } else {\n byLicense[pkg.license] = (byLicense[pkg.license] ?? 0) + 1;\n }\n }\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n packages: licensed,\n summary: {\n total: licensed.length,\n byLicense,\n unknown\n }\n };\n}\n","import { Command } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { loadConfig } from '../../lib/config.js';\nimport type { ScanOptions, Ecosystem } from './types.js';\nimport { runScan } from './scan.js';\nimport { runDiff } from './diff.js';\nimport { runFrisk } from './frisk.js';\nimport { runOutdated } from './outdated.js';\nimport { runLicenseCheck } from './license-check.js';\nimport { buildConnectivityData } from './connectivity.js';\n\nexport function registerDepsCommands(program: Command): void {\n const deps = program\n .command('deps')\n .description('Dependency scanning, CVE detection, and license auditing');\n\n // ─── frisk (primary) ────────────────────────────────────────────────────────\n\n deps\n .command('frisk')\n .description('Scan all dependencies for CVEs and output remediation paths (requires OSV.dev)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--direct-only', 'Only scan direct dependencies (default: include transitive)', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; directOnly: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: !opts.directOnly,\n includeDev: opts.includeDev\n };\n const data = await runFrisk(config, scanOpts);\n success(data, 'deps', 'frisk', startTime);\n } catch (err) {\n fail(err, 'deps', 'frisk', startTime);\n }\n });\n\n // ─── scan ───────────────────────────────────────────────────────────────────\n\n deps\n .command('scan')\n .description('Inventory all dependencies from manifest files (local only, no network)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-transitive', 'Include transitive dependencies', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { ecosystem: string; includeTransitive: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: opts.includeTransitive,\n includeDev: opts.includeDev\n };\n const data = runScan(config, scanOpts);\n success(data, 'deps', 'scan', startTime);\n } catch (err) {\n fail(err, 'deps', 'scan', startTime);\n }\n });\n\n // ─── diff ───────────────────────────────────────────────────────────────────\n\n deps\n .command('diff')\n .description('Show dependency changes between two git refs (local only, no network)')\n .requiredOption('--from <ref>', 'Base git ref (commit, tag, or branch)')\n .option('--to <ref>', 'Target git ref (default: working tree)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { from: string; to?: string; ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: true,\n includeDev: opts.includeDev\n };\n const data = runDiff(config, opts.from, opts.to ?? null, scanOpts);\n success(data, 'deps', 'diff', startTime);\n } catch (err) {\n fail(err, 'deps', 'diff', startTime);\n }\n });\n\n // ─── outdated ───────────────────────────────────────────────────────────────\n\n deps\n .command('outdated')\n .description('Check for newer versions available in Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--major', 'Only show major version bumps')\n .option('--minor', 'Only show minor version bumps or higher')\n .option('--patch', 'Only show patch version bumps or higher')\n .action(async (opts: { ecosystem: string; major?: boolean; minor?: boolean; patch?: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = { ecosystem: opts.ecosystem as Ecosystem | 'all' };\n const filterType = opts.major ? 'major' : opts.minor ? 'minor' : opts.patch ? 'patch' : undefined;\n const data = await runOutdated(config, scanOpts, filterType);\n success(data, 'deps', 'outdated', startTime);\n } catch (err) {\n fail(err, 'deps', 'outdated', startTime);\n }\n });\n\n // ─── license-check ──────────────────────────────────────────────────────────\n\n deps\n .command('license-check')\n .description('Report licenses for all direct dependencies via Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeDev: opts.includeDev\n };\n const data = await runLicenseCheck(config, scanOpts);\n success(data, 'deps', 'license-check', startTime);\n } catch (err) {\n fail(err, 'deps', 'license-check', startTime);\n }\n });\n\n // ─── connectivity ───────────────────────────────────────────────────────────\n\n deps\n .command('connectivity')\n .description('Test network access to Artifactory and OSV.dev, report available tier')\n .action(async (_opts: unknown, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const data = await buildConnectivityData(config);\n success(data, 'deps', 'connectivity', startTime);\n } catch (err) {\n fail(err, 'deps', 'connectivity', startTime);\n }\n });\n}\n","import { Command } from 'commander';\nimport { input, password, confirm } from '@inquirer/prompts';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n maskConfig,\n getGlobalConfigPath\n} from '../../lib/config.js';\nimport { 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 { success, fail, warn } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport fs from 'fs';\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command('config').description('Manage pncli configuration');\n\n config\n .command('init')\n .description('Interactive setup wizard')\n .option('--repo', 'Write repo config (.pncli.json) instead of global config')\n .action(async (opts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.repo) {\n await initRepoConfig(start);\n } else {\n await initGlobalConfig(start);\n }\n } catch (err) {\n // Handle prompt cancellation (Ctrl+C) gracefully\n if (err instanceof Error && err.message.includes('User force closed')) {\n process.stderr.write('\\nSetup cancelled.\\n');\n process.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 .action((key: string, value: string) => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n setConfigValue(key, value, opts.config);\n success({ key, value }, 'config', 'set', start);\n } catch (err) {\n fail(err, 'config', 'set', start);\n }\n });\n\n config\n .command('test')\n .description('Test connectivity to configured services')\n .action(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`\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 success(results, 'config', 'test', start);\n } catch (err) {\n fail(err, 'config', 'test', start);\n }\n });\n}\n\nasync function initGlobalConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init — Global configuration\\n\\n');\n\n process.stderr.write('── Identity ──────────────────────────────────────\\n');\n const userEmail = await input({\n message: 'Your email address (used across Jira, Bitbucket, etc.):',\n default: ''\n });\n\n const userId = await input({\n message: 'Your username / user ID:',\n default: ''\n });\n\n process.stderr.write('\\n── Jira ──────────────────────────────────────────\\n');\n const jiraBaseUrl = await input({\n message: 'Jira base URL (e.g. https://jira.your-company.com):',\n default: ''\n });\n\n const jiraApiToken = await password({\n message: 'Jira personal access token:'\n });\n\n process.stderr.write('\\n── Bitbucket ─────────────────────────────────────\\n');\n const bitbucketBaseUrl = await input({\n message: 'Bitbucket Server base URL (e.g. https://bitbucket.your-company.com):',\n default: ''\n });\n\n const bitbucketPat = await password({\n message: 'Bitbucket personal access token:'\n });\n\n process.stderr.write('\\n── Confluence ────────────────────────────────────\\n');\n const confluenceBaseUrl = await input({\n message: 'Confluence base URL (e.g. https://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. https://artifactory.company.com):',\n default: ''\n });\n\n artifactoryToken = await password({\n message: 'Artifactory API token:'\n });\n\n process.stderr.write('\\nConfigure which ecosystems you use (skip any that don\\'t apply):\\n');\n\n const useNpm = await confirm({ message: ' Use npm packages from Artifactory?', default: true });\n if (useNpm) {\n npmRepo = await input({ message: ' npm repository name:', default: 'npm-remote' });\n }\n\n const useNuget = await confirm({ message: ' Use NuGet packages from Artifactory?', default: false });\n if (useNuget) {\n nugetRepo = await input({ message: ' NuGet repository name:', default: 'nuget-remote' });\n }\n\n const useMaven = await confirm({ message: ' Use Maven packages from Artifactory?', default: false });\n if (useMaven) {\n mavenRepo = await input({ message: ' Maven repository name:', default: 'libs-release' });\n }\n }\n\n process.stderr.write('\\n── 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. https://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. https://tfs.company.com or https://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: 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── 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: jiraBaseUrl || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: bitbucketBaseUrl || undefined,\n pat: bitbucketPat || undefined\n },\n ...(confluenceBaseUrl || confluenceApiToken ? {\n confluence: {\n baseUrl: confluenceBaseUrl || undefined,\n apiToken: confluenceApiToken || undefined\n }\n } : {}),\n ...(useArtifactory ? {\n artifactory: {\n baseUrl: artifactoryBaseUrl || undefined,\n token: artifactoryToken || undefined,\n npmRepo: npmRepo || undefined,\n nugetRepo: nugetRepo || undefined,\n mavenRepo: mavenRepo || undefined\n }\n } : {}),\n ...(useSonar ? {\n sonar: {\n baseUrl: 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: 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 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 }\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 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 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('--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; 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 } 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')\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')\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 ─────────────────────────────────────────────────────────\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 // ── 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')\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"],"mappings":"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","names":["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","TIMEOUT_MS","fetchWithTimeout","pkg","pkg","pkg","program","API","fs","program","path","API","API","program","parseFieldArgs","fs","repo","AdoCoreClient","createHttpClient","program","require"]}
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/parsers/index.ts","../src/services/deps/parsers/npm.ts","../src/services/deps/parsers/nuget.ts","../src/services/deps/parsers/maven.ts","../src/services/deps/scan.ts","../src/services/deps/semver.ts","../src/services/deps/diff.ts","../src/services/deps/clients/osv.ts","../src/services/deps/clients/artifactory.ts","../src/services/deps/connectivity.ts","../src/services/deps/frisk.ts","../src/services/deps/outdated.ts","../src/services/deps/license-check.ts","../src/services/deps/commands.ts","../src/services/config/commands.ts","../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/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 { 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\n// Propagate global options and user identity before any command runs\nprogram.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setGlobalOptions({\n pretty: Boolean(opts.pretty),\n verbose: Boolean(opts.verbose)\n });\n try {\n const config = loadConfig({ configPath: opts.config as string | undefined });\n setGlobalUser(config.user);\n } catch {\n // config may not exist yet (e.g. during `config init`) — silently skip\n }\n});\n\nregisterGitCommands(program);\nregisterJiraCommands(program);\nregisterBitbucketCommands(program);\nregisterConfluenceCommands(program);\nregisterSonarCommands(program);\nregisterSdeCommands(program);\nregisterDepsCommands(program);\nregisterConfigCommands(program);\nregisterAdoCommands(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 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 } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { CustomFieldMap } from '../../types/jira.js';\n\nfunction getClient(program: Command): JiraClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JiraClient(http);\n}\n\nfunction getClientAndFields(program: Command): { client: JiraClient; fieldMap: CustomFieldMap; customFields: import('../../types/jira.js').CustomFieldDefinition[] } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new JiraClient(http);\n const customFields = config.jira.customFields;\n const fieldMap = buildFieldMap(customFields);\n return { client, fieldMap, customFields };\n}\n\nfunction getDefaults(program: Command): { project?: string; issueType?: string; priority?: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n return {\n project: config.defaults.jira?.project,\n issueType: config.defaults.jira?.issueType,\n priority: config.defaults.jira?.priority\n };\n}\n\nexport function registerJiraCommands(program: Command): void {\n const jira = program.command('jira').description('Jira Data Cloud operations');\n\n jira.command('get-issue')\n .description('Get a Jira issue by key')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const data = await client.getIssue(opts.key);\n const translated = { ...data, fields: translateFieldsInOutput(data.fields as Record<string, unknown>, fieldMap) };\n success(translated, 'jira', 'get-issue', start);\n } catch (err) { fail(err, 'jira', 'get-issue', start); }\n });\n\n jira.command('create-issue')\n .description('Create a Jira issue')\n .option('--project <key>', 'Project key')\n .option('--type <type>', 'Issue type (Bug, Story, Task, ...)')\n .requiredOption('--summary <text>', 'Issue summary')\n .option('--description <text>', 'Issue description')\n .option('--priority <name>', 'Priority name')\n .option('--assignee <accountId>', 'Assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { project?: string; type?: string; summary: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const defaults = getDefaults(program);\n const project = opts.project ?? defaults.project;\n const issueType = opts.type ?? defaults.issueType ?? 'Task';\n const priority = opts.priority ?? defaults.priority;\n if (!project) throw new PncliError('--project required (or set defaults.jira.project in config)', 1);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n const data = await client.createIssue({ project, issueType, summary: opts.summary, description: opts.description, priority, assignee: opts.assignee, labels, customFieldValues });\n success(data, 'jira', 'create-issue', start);\n } catch (err) { fail(err, 'jira', 'create-issue', start); }\n });\n\n jira.command('update-issue')\n .description('Update a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .option('--summary <text>', 'New summary')\n .option('--description <text>', 'New description')\n .option('--priority <name>', 'New priority')\n .option('--assignee <accountId>', 'New assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .action(async (opts: { key: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[] }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const labels = opts.labels ? opts.labels.split(',').map(s => s.trim()) : undefined;\n const customFieldValues = parseFieldArgs(opts.field, fieldMap);\n await client.updateIssue(opts.key, { summary: opts.summary, description: opts.description, priority: opts.priority, assignee: opts.assignee, labels, customFieldValues });\n success({ updated: opts.key }, 'jira', 'update-issue', start);\n } catch (err) { fail(err, 'jira', 'update-issue', start); }\n });\n\n jira.command('transition-issue')\n .description('Transition a Jira issue to a new status')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--transition <name-or-id>', 'Transition name or ID')\n .action(async (opts: { key: string; transition: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n // Resolve transition name to ID if needed\n let transitionId = opts.transition;\n if (isNaN(parseInt(opts.transition, 10))) {\n const transitions = await client.listTransitions(opts.key);\n const found = transitions.find(t => t.name.toLowerCase() === opts.transition.toLowerCase());\n if (!found) throw new PncliError(`Transition not found: ${opts.transition}`, 1);\n transitionId = found.id;\n }\n await client.transitionIssue(opts.key, transitionId);\n success({ transitioned: opts.key, transition: opts.transition }, 'jira', 'transition-issue', start);\n } catch (err) { fail(err, 'jira', 'transition-issue', start); }\n });\n\n jira.command('list-transitions')\n .description('List available transitions for an issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listTransitions(opts.key);\n success(data, 'jira', 'list-transitions', start);\n } catch (err) { fail(err, 'jira', 'list-transitions', start); }\n });\n\n jira.command('add-comment')\n .description('Add a comment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { key: string; body: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.key, opts.body);\n success(data, 'jira', 'add-comment', start);\n } catch (err) { fail(err, 'jira', 'add-comment', start); }\n });\n\n jira.command('list-comments')\n .description('List comments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.key);\n success(data, 'jira', 'list-comments', start);\n } catch (err) { fail(err, 'jira', 'list-comments', start); }\n });\n\n jira.command('search')\n .description('Search Jira issues with JQL')\n .requiredOption('--jql <query>', 'JQL query string')\n .option('--max-results <n>', 'Maximum number of results')\n .action(async (opts: { jql: string; maxResults?: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap, customFields } = getClientAndFields(program);\n const maxResults = opts.maxResults ? parseInt(opts.maxResults, 10) : undefined;\n const translatedJql = translateJql(opts.jql, fieldMap);\n const data = await client.search(translatedJql, maxResults, customFields);\n const translatedIssues = data.issues.map(issue => ({\n ...issue,\n fields: translateFieldsInOutput(issue.fields as Record<string, unknown>, fieldMap)\n }));\n success({ ...data, issues: translatedIssues }, 'jira', 'search', start);\n } catch (err) { fail(err, 'jira', 'search', start); }\n });\n\n jira.command('assign')\n .description('Assign a Jira issue to a user')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--assignee <accountId>', 'Assignee account ID')\n .action(async (opts: { key: string; assignee: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.assignIssue(opts.key, opts.assignee);\n success({ assigned: opts.key, assignee: opts.assignee }, 'jira', 'assign', start);\n } catch (err) { fail(err, 'jira', 'assign', start); }\n });\n\n jira.command('link-issue')\n .description('Link two Jira issues together')\n .requiredOption('--key <issue-key>', 'Source issue key')\n .requiredOption('--link-type <type>', 'Link type name or ID')\n .requiredOption('--target <issue-key>', 'Target issue key')\n .action(async (opts: { key: string; linkType: string; target: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.linkIssue({ key: opts.key, linkType: opts.linkType, target: opts.target });\n success({ linked: opts.key, to: opts.target, type: opts.linkType }, 'jira', 'link-issue', start);\n } catch (err) { fail(err, 'jira', 'link-issue', start); }\n });\n\n jira.command('fields')\n .description('List custom fields (configured or discovered from Jira API)')\n .option('--discover', 'Fetch field metadata from Jira API')\n .option('--custom-only', 'Show only custom fields (requires --discover)')\n .action(async (opts: { discover?: boolean; customOnly?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.discover) {\n const client = getClient(program);\n const fields = await client.fetchFields();\n const result = opts.customOnly ? fields.filter(f => f.custom) : fields;\n success(result, 'jira', 'fields', start);\n } else {\n const { customFields } = getClientAndFields(program);\n success(customFields, 'jira', 'fields', start);\n }\n } catch (err) { fail(err, 'jira', 'fields', start); }\n });\n}\n\nfunction parseFieldArgs(\n fieldArgs: string[],\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const arg of fieldArgs) {\n const eq = arg.indexOf('=');\n if (eq === -1) throw new PncliError(`Invalid --field format (expected Name=value): ${arg}`, 1);\n const name = arg.slice(0, eq).trim();\n const value = arg.slice(eq + 1);\n const def = fieldMap.byName.get(name.toLowerCase());\n if (!def) throw new PncliError(`Unknown custom field: \"${name}\". Run: pncli jira fields`, 1);\n result[def.id] = formatFieldValue(value, def.type);\n }\n return result;\n}\n","import { Command } from 'commander';\nimport { BitbucketClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): { client: BitbucketClient; project: string; repo: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n\n const project: string = opts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo: string = opts.repo ?? ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n\n if (!project || !repo) {\n throw new PncliError(\n 'Could not determine Bitbucket project/repo. Pass --project and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, project, repo };\n}\n\nexport function registerBitbucketCommands(program: Command): void {\n const bb = program\n .command('bitbucket')\n .description('Bitbucket Server operations')\n .option('--project <key>', 'Bitbucket project key')\n .option('--repo <slug>', 'Bitbucket repository slug');\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n bb.command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: OPEN|MERGED|DECLINED|ALL', 'OPEN')\n .option('--author <username>', 'Filter by author username')\n .option('--reviewer <username>', 'Filter by reviewer username')\n .action(async (opts: { state?: string; author?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listPRs({ project, repo, state: opts.state, author: opts.author, reviewer: opts.reviewer });\n success(data, 'bitbucket', 'list-prs', start);\n } catch (err) { fail(err, 'bitbucket', 'list-prs', start); }\n });\n\n bb.command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.getPR(project, repo, parseInt(opts.id, 10));\n success(data, 'bitbucket', 'get-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'get-pr', start); }\n });\n\n bb.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (defaults to config)')\n .option('--description <desc>', 'PR description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { title: string; source: string; target?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const config = loadConfig({ configPath: program.optsWithGlobals().config });\n const target = opts.target ?? config.defaults.bitbucket?.targetBranch ?? 'main';\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : [];\n const data = await client.createPR({ project, repo, title: opts.title, source: opts.source, target, description: opts.description, reviewers });\n success(data, 'bitbucket', 'create-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'create-pr', start); }\n });\n\n bb.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <desc>', 'New description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : undefined;\n const data = await client.updatePR({ project, repo, id: prId, title: opts.title, description: opts.description, reviewers, version: pr.version });\n success(data, 'bitbucket', 'update-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'update-pr', start); }\n });\n\n bb.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--strategy <strategy>', 'Merge strategy: merge|squash|ff')\n .option('--delete-branch', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy?: string; deleteBranch?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.mergePR({ project, repo, id: prId, version: pr.version, strategy: opts.strategy as 'merge' | 'squash' | 'ff', deleteBranch: opts.deleteBranch });\n success(data, 'bitbucket', 'merge-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'merge-pr', start); }\n });\n\n bb.command('decline-pr')\n .description('Decline a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.declinePR(project, repo, prId, pr.version);\n success(data, 'bitbucket', 'decline-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'decline-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n bb.command('list-comments')\n .description('List comments on a pull request (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(program);\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(program);\n const data = await client.addComment(project, repo, parseInt(opts.pr, 10), opts.body);\n success(data, 'bitbucket', 'add-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-comment', start); }\n });\n\n bb.command('add-inline-comment')\n .description('Add an inline comment to a file in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <type>', 'Line type: ADDED|REMOVED|CONTEXT', 'ADDED')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.addInlineComment({\n project, repo,\n prId: parseInt(opts.pr, 10),\n text: opts.body,\n filePath: opts.file,\n line: parseInt(opts.line, 10),\n lineType: opts.lineType as 'ADDED' | 'REMOVED' | 'CONTEXT'\n });\n success(data, 'bitbucket', 'add-inline-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-inline-comment', start); }\n });\n\n bb.command('reply-comment')\n .description('Reply to a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.replyComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'bitbucket', 'reply-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'reply-comment', start); }\n });\n\n bb.command('resolve-comment')\n .description('Resolve a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.resolveComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ resolved: true }, 'bitbucket', 'resolve-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'resolve-comment', start); }\n });\n\n bb.command('delete-comment')\n .description('Delete a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n await client.deleteComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ deleted: true }, 'bitbucket', 'delete-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'delete-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n bb.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--file <path>', 'Limit diff to a specific file')\n .option('--context-lines <n>', 'Lines of context around changes')\n .action(async (opts: { pr: string; file?: string; contextLines?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const contextLines = opts.contextLines ? parseInt(opts.contextLines, 10) : undefined;\n const diff = await client.getDiff(project, repo, parseInt(opts.pr, 10), opts.file, contextLines);\n success({ diff }, 'bitbucket', 'diff', start);\n } catch (err) { fail(err, 'bitbucket', 'diff', start); }\n });\n\n bb.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listFiles(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-files', start);\n } catch (err) { fail(err, 'bitbucket', 'list-files', start); }\n });\n\n // ── Approvals ──────────────────────────────────────────────────────\n\n bb.command('approve')\n .description('Approve a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.approvePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'approve', start);\n } catch (err) { fail(err, 'bitbucket', 'approve', start); }\n });\n\n bb.command('unapprove')\n .description('Remove approval from a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.unapprovePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'unapprove', start);\n } catch (err) { fail(err, 'bitbucket', 'unapprove', start); }\n });\n\n bb.command('needs-work')\n .description('Mark a pull request as needs-work')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.needsWorkPR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'needs-work', start);\n } catch (err) { fail(err, 'bitbucket', 'needs-work', start); }\n });\n\n bb.command('list-reviewers')\n .description('List reviewers of a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listReviewers(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-reviewers', start);\n } catch (err) { fail(err, 'bitbucket', 'list-reviewers', start); }\n });\n\n // ── Build Status ───────────────────────────────────────────────────\n\n bb.command('list-builds')\n .description('List build statuses for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(program);\n const data = await client.listBuilds(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-builds', start);\n } catch (err) { fail(err, 'bitbucket', 'list-builds', start); }\n });\n\n bb.command('get-build-status')\n .description('Get build status for a commit SHA')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getBuildStatus(opts.commit);\n success(data, 'bitbucket', 'get-build-status', start);\n } catch (err) { fail(err, 'bitbucket', 'get-build-status', start); }\n });\n}\n","import 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')\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 (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')\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')\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')\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')\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')\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')\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 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 { Ecosystem, LicensedPackage, OutdatedPackage } from '../types.js';\nimport type { ArtifactoryConfig } from '../../../types/config.js';\nimport { PncliError } from '../../../lib/errors.js';\nimport { isNewer, updateType } from '../semver.js';\n\nconst TIMEOUT_MS = 15_000;\n\nasync function fetchWithTimeout(url: string, token: string): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkArtifactoryConnectivity(config: ArtifactoryConfig): Promise<{\n reachable: boolean;\n authenticated: boolean;\n configured: boolean;\n error?: string;\n}> {\n if (!config.baseUrl && !config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory is not configured'\n };\n }\n if (!config.baseUrl) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory baseUrl is not set'\n };\n }\n if (!config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory token is not set'\n };\n }\n\n try {\n const res = await fetchWithTimeout(`${config.baseUrl}/api/system/ping`, config.token);\n if (res.status === 401 || res.status === 403) {\n return {\n reachable: true,\n authenticated: false,\n configured: true,\n error: 'Artifactory token is invalid or lacks permissions'\n };\n }\n return { reachable: res.ok, authenticated: res.ok, configured: true };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n configured: true,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport function requireArtifactory(config: ArtifactoryConfig, command: string): void {\n if (!config.baseUrl && !config.token) {\n throw new PncliError(\n `${command} requires Artifactory. Add the following to ~/.pncli/config.json:\\n` +\n ` \"artifactory\": { \"baseUrl\": \"https://artifactory.company.com\", \"token\": \"your-token\" }\\n` +\n `Or set PNCLI_ARTIFACTORY_BASE_URL and PNCLI_ARTIFACTORY_TOKEN environment variables.`,\n 503\n );\n }\n if (!config.baseUrl) {\n throw new PncliError(\n `${command} requires an Artifactory URL. Set artifactory.baseUrl in ~/.pncli/config.json or PNCLI_ARTIFACTORY_BASE_URL.`,\n 503\n );\n }\n if (!config.token) {\n throw new PncliError(\n `${command} requires an Artifactory token. Set artifactory.token in ~/.pncli/config.json or PNCLI_ARTIFACTORY_TOKEN.`,\n 503\n );\n }\n}\n\nfunction repoForEcosystem(config: ArtifactoryConfig, eco: Ecosystem): string | undefined {\n if (eco === 'npm') return config.npmRepo;\n if (eco === 'nuget') return config.nugetRepo;\n if (eco === 'maven') return config.mavenRepo;\n return undefined;\n}\n\nasync function getLatestNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { 'dist-tags'?: { latest?: string } };\n return data['dist-tags']?.latest ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/flatcontainer/${lower}/index.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { versions?: string[] };\n const versions = data.versions ?? [];\n return versions[versions.length - 1] ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestMaven(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n const [groupId, artifactId] = packageName.split(':');\n if (!groupId || !artifactId) return null;\n\n try {\n const res = await fetchWithTimeout(\n `${baseUrl}/api/search/latestVersion?g=${encodeURIComponent(groupId)}&a=${encodeURIComponent(artifactId)}&repos=${repoName}`,\n token\n );\n if (!res.ok) return null;\n const text = await res.text();\n return text.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function getOutdatedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<{ outdated: OutdatedPackage[]; uncheckedEcosystems: string[] }> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return { outdated: [], uncheckedEcosystems: [] };\n\n const outdated: OutdatedPackage[] = [];\n const unchecked = new Set<string>();\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n if (!repoName) {\n unchecked.add(pkg.ecosystem);\n continue;\n }\n\n let latest: string | null = null;\n if (pkg.ecosystem === 'npm') {\n latest = await getLatestNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n latest = await getLatestNuget(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'maven') {\n latest = await getLatestMaven(baseUrl, token, repoName, pkg.name);\n }\n\n if (!latest || !isNewer(pkg.version, latest)) continue;\n\n const type = updateType(pkg.version, latest);\n if (filterType) {\n const order = { major: 3, minor: 2, patch: 1 };\n if (order[type] < order[filterType]) continue;\n }\n\n outdated.push({\n name: pkg.name,\n ecosystem: pkg.ecosystem,\n current: pkg.version,\n latest,\n updateType: type,\n source: pkg.source\n });\n }\n\n return { outdated, uncheckedEcosystems: [...unchecked] };\n}\n\nasync function getLicenseNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { license?: string | { type?: string } };\n if (typeof data.license === 'string') return data.license;\n if (typeof data.license === 'object' && data.license !== null) return data.license.type ?? null;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function getLicenseNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string,\n version: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/registration/${lower}/${version}.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { licenseExpression?: string; licenseUrl?: string };\n return data.licenseExpression ?? (data.licenseUrl ? 'See licenseUrl' : null);\n } catch {\n return null;\n }\n}\n\nexport async function getLicensedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig\n): Promise<LicensedPackage[]> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return [];\n\n const result: LicensedPackage[] = [];\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n let license: string | null = null;\n\n if (repoName) {\n if (pkg.ecosystem === 'npm') {\n license = await getLicenseNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n license = await getLicenseNuget(baseUrl, token, repoName, pkg.name, pkg.version);\n }\n // Maven: fetching license from POM via Artifactory is complex — emit null\n }\n\n result.push({\n name: pkg.name,\n version: pkg.version,\n ecosystem: pkg.ecosystem,\n source: pkg.source,\n license\n });\n }\n\n return result;\n}\n","import type { ConnectivityData, Tier } from './types.js';\nimport type { ResolvedConfig } from '../../types/config.js';\nimport { checkOsvConnectivity } from './clients/osv.js';\nimport { checkArtifactoryConnectivity } from './clients/artifactory.js';\n\ninterface TierResult {\n tier: Tier;\n osvReachable: boolean;\n artifactoryReachable: boolean;\n}\n\n// Session-level cache — not persisted to disk\nlet cachedTier: TierResult | null = null;\n\nexport async function detectTier(config: ResolvedConfig): Promise<TierResult> {\n if (cachedTier) return cachedTier;\n\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artifactoryReachable = artResult.reachable && artResult.authenticated;\n const osvReachable = osvResult.reachable;\n\n let tier: Tier = 'local';\n if (artifactoryReachable) tier = 'artifactory';\n if (osvReachable) tier = 'full';\n\n cachedTier = { tier, osvReachable, artifactoryReachable };\n return cachedTier;\n}\n\nexport function clearTierCache(): void {\n cachedTier = null;\n}\n\nexport async function buildConnectivityData(config: ResolvedConfig): Promise<ConnectivityData> {\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artCfg = config.artifactory;\n\n let tier: Tier = 'local';\n if (artResult.reachable && artResult.authenticated) tier = 'artifactory';\n if (osvResult.reachable) tier = 'full';\n\n cachedTier = {\n tier,\n osvReachable: osvResult.reachable,\n artifactoryReachable: artResult.reachable && artResult.authenticated\n };\n\n return {\n artifactory: {\n reachable: artResult.reachable,\n url: artCfg.baseUrl ?? '(not configured)',\n authenticated: artResult.authenticated,\n repositories: {\n npm: artCfg.npmRepo ?? '(not configured)',\n nuget: artCfg.nugetRepo ?? '(not configured)',\n maven: artCfg.mavenRepo ?? '(not configured)'\n },\n ...(artResult.error ? { error: artResult.error } : {})\n },\n osv: {\n reachable: osvResult.reachable,\n url: 'https://api.osv.dev',\n ...(osvResult.error ? { error: osvResult.error } : {})\n },\n tier,\n capabilities: {\n scan: true,\n diff: true,\n outdated: artResult.reachable && artResult.authenticated,\n licenseCheck: artResult.reachable && artResult.authenticated,\n cveCheck: osvResult.reachable\n }\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, FriskData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { checkPackagesForVulns } from './clients/osv.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runFrisk(config: ResolvedConfig, opts: ScanOptions): Promise<FriskData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n const { tier, osvReachable } = await detectTier(config);\n\n if (!osvReachable) {\n throw new PncliError(\n 'deps frisk requires OSV.dev access but api.osv.dev is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n // Default frisk: include transitive deps (CVEs hide in transitive deps)\n const scanOpts: ScanOptions = {\n ...opts,\n includeTransitive: opts.includeTransitive ?? true\n };\n\n const scan = scanRepo(repoRoot, scanOpts);\n\n if (scan.packages.length === 0) {\n return { tier, scanned: 0, vulnerable: 0, packages: [] };\n }\n\n const vulnerable = await checkPackagesForVulns(scan.packages);\n\n return {\n tier,\n scanned: scan.packages.length,\n vulnerable: vulnerable.length,\n packages: vulnerable\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, OutdatedData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getOutdatedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runOutdated(\n config: ResolvedConfig,\n opts: ScanOptions,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<OutdatedData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Fail fast with a clear message if Artifactory is not configured at all\n requireArtifactory(config.artifactory, 'deps outdated');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const { outdated, uncheckedEcosystems } = await getOutdatedPackages(\n directPackages,\n config.artifactory,\n filterType\n );\n\n const summary = { total: outdated.length, major: 0, minor: 0, patch: 0 };\n for (const pkg of outdated) summary[pkg.updateType]++;\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n outdated,\n uncheckedEcosystems,\n summary\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, LicenseCheckData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getLicensedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runLicenseCheck(config: ResolvedConfig, opts: ScanOptions): Promise<LicenseCheckData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n requireArtifactory(config.artifactory, 'deps license-check');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const licensed = await getLicensedPackages(directPackages, config.artifactory);\n\n const byLicense: Record<string, number> = {};\n let unknown = 0;\n\n for (const pkg of licensed) {\n if (!pkg.license) {\n unknown++;\n } else {\n byLicense[pkg.license] = (byLicense[pkg.license] ?? 0) + 1;\n }\n }\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n packages: licensed,\n summary: {\n total: licensed.length,\n byLicense,\n unknown\n }\n };\n}\n","import { Command } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { loadConfig } from '../../lib/config.js';\nimport type { ScanOptions, Ecosystem } from './types.js';\nimport { runScan } from './scan.js';\nimport { runDiff } from './diff.js';\nimport { runFrisk } from './frisk.js';\nimport { runOutdated } from './outdated.js';\nimport { runLicenseCheck } from './license-check.js';\nimport { buildConnectivityData } from './connectivity.js';\n\nexport function registerDepsCommands(program: Command): void {\n const deps = program\n .command('deps')\n .description('Dependency scanning, CVE detection, and license auditing');\n\n // ─── frisk (primary) ────────────────────────────────────────────────────────\n\n deps\n .command('frisk')\n .description('Scan all dependencies for CVEs and output remediation paths (requires OSV.dev)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--direct-only', 'Only scan direct dependencies (default: include transitive)', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; directOnly: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: !opts.directOnly,\n includeDev: opts.includeDev\n };\n const data = await runFrisk(config, scanOpts);\n success(data, 'deps', 'frisk', startTime);\n } catch (err) {\n fail(err, 'deps', 'frisk', startTime);\n }\n });\n\n // ─── scan ───────────────────────────────────────────────────────────────────\n\n deps\n .command('scan')\n .description('Inventory all dependencies from manifest files (local only, no network)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-transitive', 'Include transitive dependencies', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { ecosystem: string; includeTransitive: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: opts.includeTransitive,\n includeDev: opts.includeDev\n };\n const data = runScan(config, scanOpts);\n success(data, 'deps', 'scan', startTime);\n } catch (err) {\n fail(err, 'deps', 'scan', startTime);\n }\n });\n\n // ─── diff ───────────────────────────────────────────────────────────────────\n\n deps\n .command('diff')\n .description('Show dependency changes between two git refs (local only, no network)')\n .requiredOption('--from <ref>', 'Base git ref (commit, tag, or branch)')\n .option('--to <ref>', 'Target git ref (default: working tree)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { from: string; to?: string; ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: true,\n includeDev: opts.includeDev\n };\n const data = runDiff(config, opts.from, opts.to ?? null, scanOpts);\n success(data, 'deps', 'diff', startTime);\n } catch (err) {\n fail(err, 'deps', 'diff', startTime);\n }\n });\n\n // ─── outdated ───────────────────────────────────────────────────────────────\n\n deps\n .command('outdated')\n .description('Check for newer versions available in Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--major', 'Only show major version bumps')\n .option('--minor', 'Only show minor version bumps or higher')\n .option('--patch', 'Only show patch version bumps or higher')\n .action(async (opts: { ecosystem: string; major?: boolean; minor?: boolean; patch?: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = { ecosystem: opts.ecosystem as Ecosystem | 'all' };\n const filterType = opts.major ? 'major' : opts.minor ? 'minor' : opts.patch ? 'patch' : undefined;\n const data = await runOutdated(config, scanOpts, filterType);\n success(data, 'deps', 'outdated', startTime);\n } catch (err) {\n fail(err, 'deps', 'outdated', startTime);\n }\n });\n\n // ─── license-check ──────────────────────────────────────────────────────────\n\n deps\n .command('license-check')\n .description('Report licenses for all direct dependencies via Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeDev: opts.includeDev\n };\n const data = await runLicenseCheck(config, scanOpts);\n success(data, 'deps', 'license-check', startTime);\n } catch (err) {\n fail(err, 'deps', 'license-check', startTime);\n }\n });\n\n // ─── connectivity ───────────────────────────────────────────────────────────\n\n deps\n .command('connectivity')\n .description('Test network access to Artifactory and OSV.dev, report available tier')\n .action(async (_opts: unknown, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const data = await buildConnectivityData(config);\n success(data, 'deps', 'connectivity', startTime);\n } catch (err) {\n fail(err, 'deps', 'connectivity', startTime);\n }\n });\n}\n","import { Command } from 'commander';\nimport { input, password, confirm } from '@inquirer/prompts';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n 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`\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 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`\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 // 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 // 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', 'artifactory'] 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', 'artifactory'] 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\nasync function initGlobalConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init — Global configuration\\n\\n');\n\n process.stderr.write('── Identity ──────────────────────────────────────\\n');\n const userEmail = await input({\n message: 'Your email address (used across Jira, Bitbucket, etc.):',\n default: ''\n });\n\n const userId = await input({\n message: 'Your username / user ID:',\n default: ''\n });\n\n process.stderr.write('\\n── Jira ──────────────────────────────────────────\\n');\n const jiraBaseUrl = await input({\n message: 'Jira base URL (e.g. https://jira.your-company.com):',\n default: ''\n });\n\n const jiraApiToken = await password({\n message: 'Jira personal access token:'\n });\n\n process.stderr.write('\\n── Bitbucket ─────────────────────────────────────\\n');\n const bitbucketBaseUrl = await input({\n message: 'Bitbucket Server base URL (e.g. https://bitbucket.your-company.com):',\n default: ''\n });\n\n const bitbucketPat = await password({\n message: 'Bitbucket personal access token:'\n });\n\n process.stderr.write('\\n── Confluence ────────────────────────────────────\\n');\n const confluenceBaseUrl = await input({\n message: 'Confluence base URL (e.g. https://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. https://artifactory.company.com):',\n default: ''\n });\n\n artifactoryToken = await password({\n message: 'Artifactory API token:'\n });\n\n process.stderr.write('\\nConfigure which ecosystems you use (skip any that don\\'t apply):\\n');\n\n const useNpm = await confirm({ message: ' Use npm packages from Artifactory?', default: true });\n if (useNpm) {\n npmRepo = await input({ message: ' npm repository name:', default: 'npm-remote' });\n }\n\n const useNuget = await confirm({ message: ' Use NuGet packages from Artifactory?', default: false });\n if (useNuget) {\n nugetRepo = await input({ message: ' NuGet repository name:', default: 'nuget-remote' });\n }\n\n const useMaven = await confirm({ message: ' Use Maven packages from Artifactory?', default: false });\n if (useMaven) {\n mavenRepo = await input({ message: ' Maven repository name:', default: 'libs-release' });\n }\n }\n\n process.stderr.write('\\n── 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. https://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. https://tfs.company.com or https://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: 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── 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: jiraBaseUrl || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: bitbucketBaseUrl || undefined,\n pat: bitbucketPat || undefined\n },\n ...(confluenceBaseUrl || confluenceApiToken ? {\n confluence: {\n baseUrl: confluenceBaseUrl || undefined,\n apiToken: confluenceApiToken || undefined\n }\n } : {}),\n ...(useArtifactory ? {\n artifactory: {\n baseUrl: artifactoryBaseUrl || undefined,\n token: artifactoryToken || undefined,\n npmRepo: npmRepo || undefined,\n nugetRepo: nugetRepo || undefined,\n mavenRepo: mavenRepo || undefined\n }\n } : {}),\n ...(useSonar ? {\n sonar: {\n baseUrl: 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: 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 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 }\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('--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; 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 } 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')\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')\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 .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.getPRDiff(collection, project, repo, parseInt(opts.pr, 10));\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')\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 { Command } from 'commander';\nimport { success, fail, warn } from '../../lib/output.js';\nimport fs from 'fs';\nimport path from 'path';\n\nconst GITHUB_API = 'https://api.github.com/repos/kolatts/pncli/contents/.claude/skills';\nconst RAW_BASE = 'https://raw.githubusercontent.com/kolatts/pncli/main/.claude/skills';\nconst RAW_COPILOT_INSTRUCTIONS = 'https://raw.githubusercontent.com/kolatts/pncli/main/copilot-instructions.md';\n\ninterface GitHubEntry {\n name: string;\n type: 'dir' | 'file';\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('Download latest pncli skills and copilot-instructions.md into the current repo')\n .option('--target <dir>', 'Target directory for skills', '.claude/skills')\n .option('--skip-instructions', 'Skip downloading copilot-instructions.md (always written to repo root)')\n\n .action(async (opts: { target: string; skipInstructions: boolean }) => {\n const start = Date.now();\n try {\n const targetDir = path.resolve(opts.target);\n\n // 1. Fetch skill directory listing from GitHub API\n warn('Fetching skill list from GitHub...');\n const listRes = await fetch(GITHUB_API, {\n headers: { 'Accept': 'application/vnd.github.v3+json', 'User-Agent': 'pncli' }\n });\n\n if (!listRes.ok) {\n throw new Error(`GitHub API returned ${listRes.status}: ${await listRes.text()}`);\n }\n\n const entries = (await listRes.json()) as GitHubEntry[];\n const skillDirs = entries.filter(e => e.type === 'dir').map(e => e.name);\n\n if (skillDirs.length === 0) {\n throw new Error('No skills found in the pncli repository');\n }\n\n // 2. Remove only the pncli-managed skills (not user-created ones)\n const resolvedTarget = path.resolve(targetDir);\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 // 3. Download each SKILL.md\n warn(`Found ${skillDirs.length} skills. Downloading...`);\n const installed: string[] = [];\n const failed: string[] = [];\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 const skillUrl = `${RAW_BASE}/${skillName}/SKILL.md`;\n\n try {\n const res = await fetch(skillUrl, {\n headers: { 'User-Agent': 'pncli' }\n });\n\n if (!res.ok) {\n failed.push(skillName);\n continue;\n }\n\n const content = await res.text();\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 download: ${failed.join(', ')}`);\n }\n\n // 4. Download copilot-instructions.md\n let instructionsWritten = false;\n if (!opts.skipInstructions) {\n warn('Downloading copilot-instructions.md...');\n try {\n const res = await fetch(RAW_COPILOT_INSTRUCTIONS, {\n headers: { 'User-Agent': 'pncli' }\n });\n if (res.ok) {\n const content = await res.text();\n fs.writeFileSync('copilot-instructions.md', content, 'utf8');\n instructionsWritten = true;\n warn('Wrote copilot-instructions.md');\n } else {\n warn(`Failed to download copilot-instructions.md (${res.status})`);\n }\n } catch {\n warn('Failed to download copilot-instructions.md');\n }\n }\n\n success({\n installed,\n failed,\n target: targetDir,\n total: installed.length,\n copilotInstructions: instructionsWritten\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('--target <dir>', 'Skills directory to scan', '.claude/skills')\n .action((opts: { target: string }) => {\n const start = Date.now();\n try {\n const targetDir = path.resolve(opts.target);\n\n if (!fs.existsSync(targetDir)) {\n success({ skills: [], message: 'No skills directory found. 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 skills = 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 if (frontmatter) {\n for (const line of frontmatter[1].split('\\n')) {\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: data.category || 'other',\n services: data.services || '',\n providers: data.providers || 'none'\n };\n });\n\n success({ skills, total: skills.length }, 'skills', 'list', start);\n } catch (err) {\n fail(err, 'skills', 'list', start);\n }\n });\n}\n"],"mappings":"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","names":["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","TIMEOUT_MS","fetchWithTimeout","pkg","pkg","pkg","program","API","fs","program","path","categorize","API","API","program","parseFieldArgs","fs","repo","AdoCoreClient","createHttpClient","program","fs","path","program","skills","require"]}