casement-lite-cli 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\ntype Primitive = string | number | boolean | null;\ntype JsonValue = Primitive | JsonValue[] | { [key: string]: JsonValue };\n\ninterface GlobalOptions {\n json: boolean;\n}\n\ninterface ParsedArgv {\n command: string | null;\n args: string[];\n options: GlobalOptions;\n}\n\ninterface ParsedFlags {\n positionals: string[];\n flags: Record<string, string | boolean>;\n}\n\ninterface SessionData {\n baseUrl: string;\n token?: string;\n cookie?: string;\n updatedAt: string;\n}\n\ninterface ApiResponse<T = unknown> {\n ok: boolean;\n code: number | null;\n msg: string | null;\n httpStatus: number;\n result: T | null;\n raw: unknown;\n}\n\nconst APP_DIR = join(homedir(), \".casement-lite\");\nconst SESSION_FILE = join(APP_DIR, \"session.json\");\nconst DEFAULT_BASE_URL = \"https://casement.scredit.io\";\n\nfunction toText(v: unknown): string {\n if (v === undefined || v === null) return \"\";\n return String(v).trim();\n}\n\nfunction toBool(v: unknown, fallback: boolean): boolean {\n const s = toText(v).toLowerCase();\n if (!s) return fallback;\n return [\"1\", \"true\", \"yes\", \"y\", \"on\"].includes(s);\n}\n\nfunction toPositiveInt(v: unknown, fallback: number): number {\n const n = Number(v);\n if (!Number.isFinite(n) || n <= 0) return fallback;\n return Math.floor(n);\n}\n\nfunction safeJsonParse<T = unknown>(text: string): T | null {\n try {\n return JSON.parse(text) as T;\n } catch {\n return null;\n }\n}\n\nfunction normalizeBaseUrl(url: string): string {\n const raw = toText(url) || DEFAULT_BASE_URL;\n const u = raw.startsWith(\"http://\") || raw.startsWith(\"https://\") ? raw : `https://${raw}`;\n return u.replace(/\\/$/, \"\");\n}\n\nfunction parseGlobalArgv(argv: string[]): ParsedArgv {\n const args = argv.slice(2);\n const filtered: string[] = [];\n let json = false;\n\n for (const arg of args) {\n if (arg === \"--json\") {\n json = true;\n continue;\n }\n filtered.push(arg);\n }\n\n return {\n command: filtered[0] || null,\n args: filtered.slice(1),\n options: { json },\n };\n}\n\nfunction parseFlags(args: string[]): ParsedFlags {\n const positionals: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n\n const body = arg.slice(2);\n if (!body) continue;\n\n if (body.includes(\"=\")) {\n const [k, ...rest] = body.split(\"=\");\n flags[k] = rest.join(\"=\");\n continue;\n }\n\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) {\n flags[body] = next;\n i += 1;\n } else {\n flags[body] = true;\n }\n }\n\n return { positionals, flags };\n}\n\nfunction getFlag(flags: Record<string, string | boolean>, ...keys: string[]): string {\n for (const k of keys) {\n if (Object.prototype.hasOwnProperty.call(flags, k)) {\n return toText(flags[k]);\n }\n }\n return \"\";\n}\n\nfunction printResult(data: unknown, options: GlobalOptions): void {\n const spacing = options.json ? 0 : 2;\n console.log(JSON.stringify(data, null, spacing));\n}\n\nfunction ensureSessionDir(): void {\n if (!existsSync(APP_DIR)) {\n mkdirSync(APP_DIR, { recursive: true });\n }\n}\n\nfunction loadSession(): SessionData | null {\n if (!existsSync(SESSION_FILE)) return null;\n try {\n const parsed = JSON.parse(readFileSync(SESSION_FILE, \"utf-8\")) as SessionData;\n if (!parsed || typeof parsed !== \"object\") return null;\n const baseUrl = normalizeBaseUrl(parsed.baseUrl || DEFAULT_BASE_URL);\n return {\n baseUrl,\n token: toText(parsed.token) || undefined,\n cookie: toText(parsed.cookie) || undefined,\n updatedAt: parsed.updatedAt || new Date().toISOString(),\n };\n } catch {\n return null;\n }\n}\n\nfunction saveSession(session: SessionData): void {\n ensureSessionDir();\n writeFileSync(SESSION_FILE, `${JSON.stringify(session, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction removeSession(): void {\n if (existsSync(SESSION_FILE)) rmSync(SESSION_FILE);\n}\n\nasync function prompt(question: string, mask = false): Promise<string> {\n const rl = createInterface({ input, output, terminal: true });\n if (!mask) {\n const ans = await rl.question(question);\n rl.close();\n return ans.trim();\n }\n // 简单掩码输入:关闭终端回显并恢复\n const previousRaw = (input as any).isRaw;\n if (typeof (input as any).setRawMode === \"function\") {\n (input as any).setRawMode(true);\n }\n output.write(question);\n let value = \"\";\n await new Promise<void>((resolve) => {\n const onData = (chunk: Buffer) => {\n const str = chunk.toString(\"utf8\");\n if (str === \"\\r\" || str === \"\\n\") {\n output.write(\"\\n\");\n input.off(\"data\", onData);\n resolve();\n return;\n }\n if (str === \"\\u0003\") {\n input.off(\"data\", onData);\n rl.close();\n process.exit(1);\n }\n if (str === \"\\u007f\") {\n if (value.length > 0) {\n value = value.slice(0, -1);\n output.write(\"\\b \\b\");\n }\n return;\n }\n value += str;\n output.write(\"*\");\n };\n input.on(\"data\", onData);\n });\n if (typeof (input as any).setRawMode === \"function\") {\n (input as any).setRawMode(Boolean(previousRaw));\n }\n rl.close();\n return value.trim();\n}\n\nfunction openUrl(url: string): void {\n const platform = process.platform;\n if (platform === \"darwin\") {\n spawn(\"open\", [url], { stdio: \"ignore\", detached: true }).unref();\n return;\n }\n if (platform === \"win32\") {\n spawn(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\", detached: true }).unref();\n return;\n }\n spawn(\"xdg-open\", [url], { stdio: \"ignore\", detached: true }).unref();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction tokenFromCookieHeader(cookieHeader: string): string {\n const raw = toText(cookieHeader);\n if (!raw) return \"\";\n const wanted = new Set([\n \"casement_login_token\",\n \"CASEMENT_LOGIN_TOKEN\",\n \"token\",\n \"access_token\",\n \"authorization\",\n \"Authorization\",\n ]);\n const chunks = raw.split(\";\");\n for (const one of chunks) {\n const [k, ...rest] = one.split(\"=\");\n const key = toText(k);\n if (!key || !wanted.has(key)) continue;\n const value = toText(rest.join(\"=\"));\n if (!value) continue;\n if (/^bearer\\s+/i.test(value)) return value.replace(/^bearer\\s+/i, \"\").trim();\n return value;\n }\n return \"\";\n}\n\nfunction maybeDecodeURIComponent(text: string): string {\n const raw = toText(text);\n if (!raw) return \"\";\n try {\n return decodeURIComponent(raw);\n } catch {\n return raw;\n }\n}\n\nasync function captureSessionFromBrowser(args: {\n baseUrl: string;\n loginUrl: string;\n headless: boolean;\n timeoutSec: number;\n pollMs: number;\n channel: string;\n json: boolean;\n}): Promise<{\n ok: boolean;\n token: string;\n cookie: string;\n error: string | null;\n attempts: number;\n elapsedMs: number;\n}> {\n const startedAt = Date.now();\n const timeoutMs = Math.max(30, args.timeoutSec) * 1000;\n const deadline = startedAt + timeoutMs;\n let attempts = 0;\n\n let playwrightModule: any;\n try {\n const dynamicImport = new Function(\"m\", \"return import(m)\") as (m: string) => Promise<any>;\n playwrightModule = await dynamicImport(\"playwright\");\n } catch {\n return {\n ok: false,\n token: \"\",\n cookie: \"\",\n error: \"缺少 playwright 依赖。请先执行: corepack pnpm install\",\n attempts,\n elapsedMs: Date.now() - startedAt,\n };\n }\n\n const chromium = playwrightModule?.chromium;\n if (!chromium || typeof chromium.launch !== \"function\") {\n return {\n ok: false,\n token: \"\",\n cookie: \"\",\n error: \"playwright.chromium 不可用\",\n attempts,\n elapsedMs: Date.now() - startedAt,\n };\n }\n\n let browser: any = null;\n try {\n const launchOptions: any = { headless: args.headless };\n if (args.channel) launchOptions.channel = args.channel;\n try {\n browser = await chromium.launch(launchOptions);\n } catch (launchErr) {\n if (args.channel) {\n browser = await chromium.launch({ headless: args.headless });\n } else {\n throw launchErr;\n }\n }\n const context = await browser.newContext();\n const page = await context.newPage();\n await page.goto(args.loginUrl, { waitUntil: \"domcontentloaded\", timeout: 120_000 });\n\n if (!args.json) {\n console.log(`已打开浏览器登录页: ${args.loginUrl}`);\n console.log(\"请在该窗口完成登录,CLI 将自动采集 token/cookie。\");\n }\n\n while (Date.now() < deadline) {\n attempts += 1;\n const cookies = await context.cookies(args.baseUrl);\n const cookieHeader = cookies.map((c: any) => `${c.name}=${c.value}`).join(\"; \");\n\n const storageToken = await page.evaluate(() => {\n const g = globalThis as any;\n const keyCandidates = [\n \"CASEMENT_LOGIN_TOKEN\",\n \"casement_login_token\",\n \"caseMent_login_token\",\n \"login_token\",\n \"access_token\",\n \"token\",\n \"Authorization\",\n \"authorization\",\n ];\n const stores = [g.localStorage, g.sessionStorage];\n for (const store of stores) {\n for (const key of keyCandidates) {\n const v = store.getItem(key);\n if (v) return v;\n }\n }\n return \"\";\n }).catch(() => \"\");\n\n const cookieToken = tokenFromCookieHeader(cookieHeader);\n const token = toText(maybeDecodeURIComponent(storageToken || cookieToken));\n const cookie = toText(cookieHeader);\n\n if (token || cookie) {\n const probeSession: SessionData = {\n baseUrl: args.baseUrl,\n token: token || undefined,\n cookie: cookie || undefined,\n updatedAt: new Date().toISOString(),\n };\n const probe = await new CasementClient(probeSession).post(\"/casement/project/list\", {\n showTotal: true,\n projectStatus: 1,\n });\n if (probe.ok) {\n return {\n ok: true,\n token,\n cookie,\n error: null,\n attempts,\n elapsedMs: Date.now() - startedAt,\n };\n }\n }\n\n await sleep(args.pollMs);\n }\n\n return {\n ok: false,\n token: \"\",\n cookie: \"\",\n error: `超时未检测到有效登录会话(>${args.timeoutSec}s)`,\n attempts,\n elapsedMs: Date.now() - startedAt,\n };\n } catch (e) {\n const msg = toText(e);\n const hint = /Executable doesn't exist|Please run the following command/i.test(msg)\n ? \"浏览器运行时缺失,可执行: npx playwright install chromium\"\n : \"\";\n return {\n ok: false,\n token: \"\",\n cookie: \"\",\n error: hint ? `${msg}\\n${hint}` : String(e),\n attempts,\n elapsedMs: Date.now() - startedAt,\n };\n } finally {\n if (browser) {\n await browser.close().catch(() => {});\n }\n }\n}\n\nclass CasementClient {\n private readonly baseUrl: string;\n private readonly token?: string;\n private readonly cookie?: string;\n\n constructor(session: SessionData) {\n this.baseUrl = normalizeBaseUrl(session.baseUrl || DEFAULT_BASE_URL);\n this.token = toText(session.token) || undefined;\n this.cookie = toText(session.cookie) || undefined;\n }\n\n getSessionSummary(): { baseUrl: string; hasToken: boolean; hasCookie: boolean } {\n return {\n baseUrl: this.baseUrl,\n hasToken: !!this.token,\n hasCookie: !!this.cookie,\n };\n }\n\n async post<T = unknown>(path: string, body: Record<string, unknown>): Promise<ApiResponse<T>> {\n const url = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"content-type\": \"application/json;charset=UTF-8\",\n };\n if (this.token) headers.authorization = `Bearer ${this.token}`;\n if (this.cookie) headers.cookie = this.cookie;\n\n const resp = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body || {}),\n });\n\n const text = await resp.text();\n const parsed = safeJsonParse<any>(text);\n const raw = parsed ?? { code: resp.ok ? 0 : resp.status, msg: text };\n const code = raw && typeof raw === \"object\" && \"code\" in raw ? Number((raw as any).code) : null;\n const msg = raw && typeof raw === \"object\" ? toText((raw as any).msg || (raw as any).message) || null : null;\n const result = raw && typeof raw === \"object\" && \"result\" in raw ? (raw as any).result : null;\n\n return {\n ok: code === 0,\n code,\n msg,\n httpStatus: resp.status,\n result: result as T,\n raw,\n };\n }\n}\n\nfunction ensureClientOrThrow(): CasementClient {\n const session = loadSession();\n if (!session) {\n throw new Error(\"未找到登录会话。请先执行: casement auth login\");\n }\n if (!toText(session.token) && !toText(session.cookie)) {\n throw new Error(\"会话无 token/cookie。请重新执行: casement auth login\");\n }\n return new CasementClient(session);\n}\n\nfunction phaseNameFromCode(code: unknown): string {\n const n = Number(code);\n const m: Record<number, string> = {\n 0: \"TODO\",\n 10: \"DEV\",\n 20: \"TEST\",\n 30: \"UAT\",\n 40: \"LIVE\",\n 99: \"DONE\",\n };\n return m[n] || `PHASE_${String(code)}`;\n}\n\nfunction normalizePhaseTimeline(versionPhase: unknown): { timeline: Array<{ phase: string; startTime: string | null; endTime: string | null }>; map: Record<string, { startTime: string | null; endTime: string | null }> } {\n const src = versionPhase && typeof versionPhase === \"object\" ? (versionPhase as Record<string, any>) : {};\n const preferred = [\"devTd\", \"devIntegration\", \"dev\", \"test\", \"uat\", \"live\"];\n const keys = [...new Set([...preferred, ...Object.keys(src)])];\n const map: Record<string, { startTime: string | null; endTime: string | null }> = {};\n const timeline = keys.map((k) => {\n const node = src[k] && typeof src[k] === \"object\" ? src[k] : {};\n const item = {\n phase: k,\n startTime: toText(node.startTime) || null,\n endTime: toText(node.endTime) || null,\n };\n map[k] = { startTime: item.startTime, endTime: item.endTime };\n return item;\n });\n return { timeline, map };\n}\n\nfunction inferCheckpointStage(currentPhase: unknown): string | null {\n const n = Number(currentPhase);\n const m: Record<number, string> = {\n 0: \"TodoToDev\",\n 10: \"DevToTest\",\n 20: \"TestToUAT\",\n 30: \"UATToLive\",\n 40: \"LiveToComplete\",\n 99: \"Complete\",\n };\n return m[n] || null;\n}\n\nfunction checkStatusName(code: unknown): string {\n const n = Number(code);\n const m: Record<number, string> = {\n 1: \"PASS\",\n 2: \"FAILURE\",\n 3: \"WARNING\",\n 4: \"SKIPPED\",\n };\n return m[n] || `STATUS_${String(code)}`;\n}\n\nfunction normalizeAssignee(v: unknown): string {\n const raw = toText(v);\n if (!raw) return \"\";\n const at = raw.indexOf(\"@\");\n return at > 0 ? raw.slice(0, at) : raw;\n}\n\nfunction normalizePriority(v: unknown): string {\n const raw = toText(v);\n if (!raw) return \"\";\n const s = raw.toLowerCase();\n const table: Record<string, string> = {\n p0: \"Highest\",\n highest: \"Highest\",\n critical: \"Highest\",\n blocker: \"Highest\",\n p1: \"High\",\n high: \"High\",\n p2: \"Medium\",\n medium: \"Medium\",\n normal: \"Medium\",\n p3: \"Low\",\n low: \"Low\",\n p4: \"Lowest\",\n lowest: \"Lowest\",\n trivial: \"Lowest\",\n };\n return table[s] || raw;\n}\n\nfunction normalizeRequirementType(v: unknown): string {\n const raw = toText(v);\n if (!raw) return \"\";\n const norm = raw.toLowerCase();\n const rtMap: Record<string, string> = {\n \"on_call_incident_handling\": \"On_call_Incident_Handling\",\n \"on-call & incident handling / 值班 & 故障处理\": \"On_call_Incident_Handling\",\n \"business_support_collaboration\": \"Business_Support_Collaboration\",\n \"business support & collaboration / 业务支持 & 协作\": \"Business_Support_Collaboration\",\n \"leave_vacation\": \"Leave_Vacation\",\n \"leave & vacation / 请假 & 休假\": \"Leave_Vacation\",\n \"team_other_tasks\": \"Team_Other_Tasks\",\n \"team & other tasks / 团队 & 其他工作\": \"Team_Other_Tasks\",\n };\n return rtMap[norm] || raw;\n}\n\nfunction normalizeFieldName(rawField: string): string {\n const norm = toText(rawField).toLowerCase();\n const table: Record<string, string> = {\n summary: \"summary\",\n title: \"summary\",\n status: \"status\",\n storypoints: \"storyPoints\",\n storypoint: \"storyPoints\",\n story_points: \"storyPoints\",\n sp: \"storyPoints\",\n priority: \"priority\",\n assignee: \"assignee\",\n owner: \"assignee\",\n pic: \"assignee\",\n phase: \"phase\",\n stage: \"phase\",\n startdate: \"startDate\",\n start_date: \"startDate\",\n duedate: \"dueDate\",\n due_date: \"dueDate\",\n description: \"description\",\n desc: \"description\",\n requirementtype: \"requirementType\",\n requirement_type: \"requirementType\",\n subtasktype: \"requirementType\",\n subtask_type: \"requirementType\",\n jirasubtasktype: \"requirementType\",\n };\n return table[norm] || toText(rawField);\n}\n\nfunction buildAssigneeFallbackCandidates(rawAssigneeInput: unknown, normalizedAssignee: unknown): string[] {\n const raw = toText(rawAssigneeInput);\n const normalized = toText(normalizedAssignee);\n if (!normalized || normalized.includes(\"@\")) return [];\n\n const out: string[] = [];\n if (raw && raw.includes(\"@\")) out.push(raw);\n out.push(`${normalized}@shopee.com`);\n out.push(`${normalized}@sea.com`);\n\n const uniq: string[] = [];\n const seen = new Set<string>();\n for (const one of out) {\n const key = toText(one).toLowerCase();\n if (!key || key === normalized.toLowerCase()) continue;\n if (seen.has(key)) continue;\n seen.add(key);\n uniq.push(one);\n }\n return uniq;\n}\n\nasync function authLogin(args: string[], options: GlobalOptions): Promise<void> {\n const parsed = parseFlags(args);\n const flags = parsed.flags;\n\n const fromFile = getFlag(flags, \"from\", \"file\");\n let token = getFlag(flags, \"token\") || toText(process.env.CASEMENT_LOGIN_TOKEN);\n let cookie = getFlag(flags, \"cookie\") || toText(process.env.CASEMENT_COOKIE);\n const baseUrl = normalizeBaseUrl(getFlag(flags, \"baseUrl\", \"base-url\") || DEFAULT_BASE_URL);\n const mode = toText(getFlag(flags, \"mode\")).toLowerCase();\n const autoCapture = mode ? mode === \"auto\" : toBool(getFlag(flags, \"auto\"), true);\n const autoOpen = toBool(flags.open, true);\n const headlessFlag = toBool(flags.headless, false);\n const headless = false;\n const timeoutSec = toPositiveInt(getFlag(flags, \"timeout\", \"timeoutSec\", \"timeout-sec\"), 300);\n const pollMs = Math.max(500, toPositiveInt(getFlag(flags, \"pollMs\", \"poll-ms\"), 2000));\n const browserChannel = toText(getFlag(flags, \"browser\", \"channel\") || \"chrome\");\n const loginUrl = toText(getFlag(flags, \"loginUrl\", \"login-url\") || `${baseUrl}/workspace`);\n const askInput = toBool(flags.interactive, true);\n let loginMethod = \"flags/env\";\n let autoCaptureDetail: Record<string, unknown> | null = null;\n\n if (fromFile) {\n try {\n const obj = JSON.parse(readFileSync(fromFile, \"utf-8\")) as Record<string, unknown>;\n token = token || toText(obj.token || obj.CASEMENT_LOGIN_TOKEN);\n cookie = cookie || toText(obj.cookie || obj.COOKIE || obj.cookieHeader);\n loginMethod = \"file\";\n } catch (e) {\n printResult({ ok: false, error: `无法读取 --from 文件: ${String(e)}` }, options);\n process.exit(1);\n }\n }\n\n if (!token && !cookie && autoCapture) {\n const auto = await captureSessionFromBrowser({\n baseUrl,\n loginUrl,\n headless,\n timeoutSec,\n pollMs,\n channel: browserChannel,\n json: options.json,\n });\n autoCaptureDetail = {\n ok: auto.ok,\n error: auto.error,\n attempts: auto.attempts,\n elapsedMs: auto.elapsedMs,\n channel: browserChannel,\n headless,\n requestedHeadless: headlessFlag,\n timeoutSec,\n };\n if (auto.ok) {\n token = toText(token || auto.token);\n cookie = toText(cookie || auto.cookie);\n loginMethod = \"auto-browser\";\n } else if (!options.json) {\n console.log(`自动采集失败: ${toText(auto.error) || \"unknown\"}`);\n console.log(\"将回退到手动输入模式。\");\n }\n }\n\n if ((!token && !cookie) && askInput) {\n if (autoOpen) {\n openUrl(loginUrl);\n }\n if (!options.json) {\n console.log(\"请在浏览器完成登录后,粘贴 token/cookie(可空一项,至少要有一项)。\");\n }\n token = token || (await prompt(\"CASEMENT_LOGIN_TOKEN (可留空): \", true));\n cookie = cookie || (await prompt(\"Cookie (可留空): \"));\n loginMethod = \"manual-input\";\n }\n\n token = toText(token);\n cookie = toText(cookie);\n if (cookie.toLowerCase().startsWith(\"cookie:\")) {\n cookie = cookie.slice(7).trim();\n }\n\n if (!token && !cookie) {\n printResult({\n ok: false,\n error: \"缺少 token/cookie,无法创建会话\",\n hint: \"可用: casement auth login --token <TOKEN> --cookie '<k=v; ...>'\",\n autoCapture: autoCaptureDetail,\n }, options);\n process.exit(1);\n }\n\n const session: SessionData = {\n baseUrl,\n token: token || undefined,\n cookie: cookie || undefined,\n updatedAt: new Date().toISOString(),\n };\n saveSession(session);\n\n const client = new CasementClient(session);\n const probe = await client.post(\"/casement/project/list\", { showTotal: true, projectStatus: 1 });\n\n printResult({\n ok: true,\n saved: SESSION_FILE,\n method: loginMethod,\n session: {\n baseUrl,\n hasToken: !!session.token,\n hasCookie: !!session.cookie,\n updatedAt: session.updatedAt,\n },\n autoCapture: autoCaptureDetail,\n verify: {\n ok: probe.ok,\n code: probe.code,\n msg: probe.msg,\n httpStatus: probe.httpStatus,\n },\n hint: probe.ok ? \"登录会话可用\" : \"会话已保存,但校验失败,可稍后用 casement auth status 复查\",\n }, options);\n}\n\nasync function authStatus(options: GlobalOptions): Promise<void> {\n const session = loadSession();\n if (!session) {\n printResult({ ok: false, exists: false, sessionFile: SESSION_FILE, hint: \"先执行 casement auth login\" }, options);\n return;\n }\n\n const client = new CasementClient(session);\n const probe = await client.post(\"/casement/project/list\", { showTotal: true, projectStatus: 1 });\n printResult({\n ok: probe.ok,\n exists: true,\n sessionFile: SESSION_FILE,\n session: {\n baseUrl: session.baseUrl,\n hasToken: !!session.token,\n hasCookie: !!session.cookie,\n updatedAt: session.updatedAt,\n },\n verify: {\n ok: probe.ok,\n code: probe.code,\n msg: probe.msg,\n httpStatus: probe.httpStatus,\n },\n }, options);\n}\n\nfunction authLogout(options: GlobalOptions): void {\n removeSession();\n printResult({ ok: true, removed: SESSION_FILE }, options);\n}\n\nasync function cmdProjects(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n let keyword = getFlag(parsed.flags, \"keyword\") || toText(parsed.positionals[0]);\n const limit = toPositiveInt(getFlag(parsed.flags, \"limit\") || parsed.positionals[1], 50);\n let projectStatus = toPositiveInt(getFlag(parsed.flags, \"projectStatus\"), 1);\n\n if (!getFlag(parsed.flags, \"projectStatus\") && keyword && /^\\d+$/.test(keyword)) {\n projectStatus = toPositiveInt(keyword, 1);\n keyword = \"\";\n }\n\n const groupIdRaw = getFlag(parsed.flags, \"groupId\");\n const groupId = groupIdRaw ? Number(groupIdRaw) : null;\n const includeRaw = toBool(parsed.flags.raw, false);\n\n const resp = await client.post<{ data?: any[]; total?: number }>(\"/casement/project/list\", {\n showTotal: true,\n projectStatus,\n });\n const result = (resp.result || {}) as any;\n let rows = Array.isArray(result.data) ? result.data : [];\n\n if (Number.isFinite(groupId)) {\n rows = rows.filter((x) => Number(x.groupId) === Number(groupId));\n }\n\n if (keyword) {\n const q = keyword.toLowerCase();\n rows = rows.filter((p) => [p.projectName, p.jiraLibraryKey, p.principal, p.groupName, p.relatedWiseskylarkProject]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase()\n .includes(q));\n }\n\n const projects = rows.map((p) => ({\n id: p.id,\n projectName: p.projectName,\n jiraLibraryKey: p.jiraLibraryKey,\n principal: p.principal,\n groupId: p.groupId,\n groupName: p.groupName,\n projectStatus: p.projectStatus,\n projectGrayStatus: p.projectGrayStatus,\n relatedWiseskylarkProject: p.relatedWiseskylarkProject,\n createTime: p.createTime,\n updateTime: p.updateTime,\n raw: includeRaw ? p : undefined,\n }));\n\n printResult({\n ok: resp.ok,\n code: resp.code,\n msg: resp.msg,\n projectStatus,\n keyword: keyword || null,\n groupId,\n total: result.total || rows.length,\n filteredTotal: projects.length,\n count: Math.min(projects.length, limit),\n projects: projects.slice(0, limit),\n }, options);\n}\n\nasync function cmdProjectDetail(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const projectId = Number(getFlag(parsed.flags, \"projectId\") || parsed.positionals[0]);\n if (!Number.isFinite(projectId) || projectId <= 0) {\n printResult({ ok: false, error: \"Missing or invalid projectId\" }, options);\n process.exit(1);\n }\n\n const includeMembers = toBool(getFlag(parsed.flags, \"includeMembers\") || parsed.positionals[1], false);\n const includeVersions = toBool(getFlag(parsed.flags, \"includeVersions\") || parsed.positionals[2], false);\n const includeRaw = toBool(parsed.flags.raw, false);\n const memberPageSize = toPositiveInt(getFlag(parsed.flags, \"memberPageSize\"), 50);\n const versionPageSize = toPositiveInt(getFlag(parsed.flags, \"versionPageSize\"), 20);\n\n const detail = await client.post<any>(\"/casement/project/detail\", { projectId });\n if (!detail.ok) {\n printResult({ ok: false, error: detail.msg || \"Failed to fetch project detail\", code: detail.code, httpStatus: detail.httpStatus }, options);\n return;\n }\n\n let members: any[] | null = null;\n let membersTotal: number | null = null;\n if (includeMembers) {\n const m = await client.post<any>(\"/casement/project-member/list\", { projectId, current: 1, pageSize: memberPageSize });\n if (m.ok) {\n const rows = Array.isArray(m.result?.data) ? m.result.data : [];\n membersTotal = Number(m.result?.total || rows.length);\n members = rows.map((x: any) => ({\n userId: x.userId,\n email: x.email,\n team: x.team,\n roles: Array.isArray(x.roles) ? x.roles.map((r: any) => r.roleName || r.roleId) : [],\n raw: includeRaw ? x : undefined,\n }));\n }\n }\n\n let versions: any[] | null = null;\n let versionsTotal: number | null = null;\n if (includeVersions) {\n const v = await client.post<any>(\"/casement/project_version/get_project_version_list\", {\n projectId,\n current: 1,\n pageSize: versionPageSize,\n });\n if (v.ok) {\n const rows = Array.isArray(v.result?.data) ? v.result.data : [];\n versionsTotal = Number(v.result?.total || rows.length);\n versions = rows.map((x: any) => ({\n id: x.id,\n versionName: x.versionName,\n currentPhase: x.currentPhase,\n startTime: x.startTime,\n endTime: x.endTime,\n pic: x.pic,\n publishWindowStatus: x.publishWindowStatus,\n raw: includeRaw ? x : undefined,\n }));\n }\n }\n\n const p = detail.result || {};\n printResult({\n ok: detail.ok,\n code: detail.code,\n msg: detail.msg,\n projectId,\n project: {\n id: p.id,\n projectName: p.projectName,\n projectDesc: p.projectDesc,\n groupId: p.groupId,\n groupName: p.groupName,\n projectStatus: p.projectStatus,\n projectGrayStatus: p.projectGrayStatus,\n jiraLibraryKey: p.jiraLibraryKey,\n principal: p.principal,\n createTime: p.createTime,\n updateTime: p.updateTime,\n relatedWiseskylarkProject: p.relatedWiseskylarkProject,\n raw: includeRaw ? p : undefined,\n },\n includeMembers,\n membersTotal,\n members,\n includeVersions,\n versionsTotal,\n versions,\n }, options);\n}\n\nasync function cmdProjectMembers(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n const projectId = Number(getFlag(parsed.flags, \"projectId\") || parsed.positionals[0]);\n if (!Number.isFinite(projectId) || projectId <= 0) {\n printResult({ ok: false, error: \"Missing or invalid projectId\" }, options);\n process.exit(1);\n }\n\n const page = toPositiveInt(getFlag(parsed.flags, \"page\") || parsed.positionals[1], 1);\n const pageSize = toPositiveInt(getFlag(parsed.flags, \"pageSize\") || parsed.positionals[2], 50);\n const keyword = (getFlag(parsed.flags, \"keyword\") || parsed.positionals[3] || \"\").toLowerCase();\n const limit = toPositiveInt(getFlag(parsed.flags, \"limit\") || parsed.positionals[4], pageSize);\n const includeRaw = toBool(parsed.flags.raw, false);\n\n const resp = await client.post<any>(\"/casement/project-member/list\", {\n projectId,\n current: page,\n pageSize,\n });\n\n const result = (resp.result || {}) as any;\n let rows = Array.isArray(result.data) ? result.data : [];\n if (keyword) {\n rows = rows.filter((m: any) => [m.email, m.team].filter(Boolean).join(\" \").toLowerCase().includes(keyword));\n }\n\n const members = rows.map((m: any) => ({\n userId: m.userId,\n projectId: m.projectId,\n email: m.email,\n team: m.team,\n roleConstraints: m.roleConstraints,\n roles: Array.isArray(m.roles) ? m.roles.map((r: any) => ({ roleId: r.roleId, roleName: r.roleName })) : [],\n raw: includeRaw ? m : undefined,\n }));\n\n printResult({\n ok: resp.ok,\n code: resp.code,\n msg: resp.msg,\n projectId,\n page,\n pageSize,\n keyword: keyword || null,\n total: result.total || members.length,\n filteredTotal: members.length,\n count: Math.min(members.length, limit),\n members: members.slice(0, limit),\n }, options);\n}\n\nasync function cmdVersions(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const projectId = Number(getFlag(parsed.flags, \"projectId\") || parsed.positionals[0]);\n if (!Number.isFinite(projectId) || projectId <= 0) {\n printResult({ ok: false, error: \"Missing or invalid projectId\" }, options);\n process.exit(1);\n }\n\n const page = toPositiveInt(getFlag(parsed.flags, \"page\") || parsed.positionals[1], 1);\n const pageSize = toPositiveInt(getFlag(parsed.flags, \"pageSize\") || parsed.positionals[2], 20);\n const keywordRaw = getFlag(parsed.flags, \"keyword\") || parsed.positionals[3] || \"\";\n const keyword = keywordRaw.toLowerCase();\n\n const limitOrOwnerPos = parsed.positionals[4] || \"\";\n const ownerPos = parsed.positionals[5] || \"\";\n const owner = (getFlag(parsed.flags, \"owner\") || ownerPos || (limitOrOwnerPos && !/^\\d+$/.test(limitOrOwnerPos) ? limitOrOwnerPos : \"\")).toLowerCase();\n const limit = toPositiveInt(getFlag(parsed.flags, \"limit\") || (/^\\d+$/.test(limitOrOwnerPos) ? limitOrOwnerPos : \"\"), pageSize);\n\n const filterAliases: Record<string, \"undone\" | \"done\"> = {\n undone: \"undone\",\n not_done: \"undone\",\n notdone: \"undone\",\n active: \"undone\",\n doing: \"undone\",\n inprogress: \"undone\",\n done: \"done\",\n completed: \"done\",\n complete: \"done\",\n closed: \"done\",\n };\n const phaseFilter = filterAliases[keyword] || null;\n\n const resp = await client.post<any>(\"/casement/project_version/get_project_version_list\", {\n projectId,\n current: page,\n pageSize,\n });\n\n const result = (resp.result || {}) as any;\n let rows = Array.isArray(result.data) ? result.data : [];\n\n if (phaseFilter === \"undone\") rows = rows.filter((v: any) => Number(v.currentPhase) !== 99);\n else if (phaseFilter === \"done\") rows = rows.filter((v: any) => Number(v.currentPhase) === 99);\n else if (keyword) rows = rows.filter((v: any) => toText(v.versionName).toLowerCase().includes(keyword));\n\n if (owner) rows = rows.filter((v: any) => toText(v.pic).toLowerCase().includes(owner));\n\n const includeRaw = toBool(parsed.flags.raw, false);\n const versions = rows.map((v: any) => {\n const phase = normalizePhaseTimeline(v.versionPhase);\n return {\n id: v.id,\n versionName: v.versionName,\n projectId: v.projectId,\n jiraVersionId: v.jiraVersionId,\n currentPhase: v.currentPhase,\n currentPhaseName: phaseNameFromCode(v.currentPhase),\n isDone: Number(v.currentPhase) === 99,\n status: {\n currentPhase: v.currentPhase,\n currentPhaseName: phaseNameFromCode(v.currentPhase),\n isDone: Number(v.currentPhase) === 99,\n publishWindowStatus: v.publishWindowStatus || null,\n publishWindowName: v.publishWindowName || null,\n },\n startTime: v.startTime,\n endTime: v.endTime,\n phaseTimeline: phase.timeline,\n phaseTimelineMap: phase.map,\n pic: v.pic,\n publishWindowId: v.publishWindowId,\n publishWindowStatus: v.publishWindowStatus,\n publishWindowName: v.publishWindowName,\n pfb: v.pfb,\n raw: includeRaw ? v : undefined,\n };\n });\n\n printResult({\n ok: resp.ok,\n code: resp.code,\n msg: resp.msg,\n projectId,\n page,\n pageSize,\n keyword: keyword || null,\n phaseFilter,\n owner: owner || null,\n total: result.total || versions.length,\n filteredTotal: versions.length,\n count: Math.min(versions.length, limit),\n versions: versions.slice(0, limit),\n }, options);\n}\n\nfunction normalizeCheckpointRows(rows: any[], detailLimit: number, includeRaw: boolean): any[] {\n const cap = Math.max(1, detailLimit);\n return (Array.isArray(rows) ? rows : []).slice(0, cap).map((r) => ({\n jiraKey: r.jiraKey || null,\n issueType: r.issueType || r.type || null,\n summary: r.summary || null,\n reporter: r.reporter || null,\n assignee: r.assignee || null,\n status: r.status || null,\n financialRisk: r.financialRisk || null,\n nonComplianceContent: r.nonComplianceContent || r.rcSignoffMsg || r.message || null,\n rcSignOff: r.rcSignOff || null,\n message: r.message || null,\n raw: includeRaw ? r : undefined,\n }));\n}\n\nfunction normalizeCheckpointDetails(item: any, detailLimit: number, includeRaw: boolean): any[] {\n const details = item && item.result && item.result.details && typeof item.result.details === \"object\"\n ? item.result.details\n : {};\n return Object.entries(details).map(([key, val]) => {\n const one = val && typeof val === \"object\" ? val as any : {};\n const more = one.moreDetails && typeof one.moreDetails === \"object\" ? one.moreDetails : {};\n const sourceRows = Array.isArray(more.dataSource) ? more.dataSource : [];\n return {\n key,\n pass: one.pass,\n actual: one.actual,\n expect: one.expect,\n message: one.message || null,\n total: Number(more.total || sourceRows.length || 0),\n rows: normalizeCheckpointRows(sourceRows, detailLimit, includeRaw),\n hasMoreRows: sourceRows.length > detailLimit,\n };\n });\n}\n\nasync function cmdVersionDetail(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const versionId = Number(getFlag(parsed.flags, \"versionId\") || parsed.positionals[0]);\n if (!Number.isFinite(versionId) || versionId <= 0) {\n printResult({ ok: false, error: \"Missing or invalid versionId\" }, options);\n process.exit(1);\n }\n\n const includeProject = toBool(getFlag(parsed.flags, \"includeProject\") || parsed.positionals[1], true);\n const includeTasks = toBool(getFlag(parsed.flags, \"includeTasks\") || parsed.positionals[2], true);\n const taskPage = toPositiveInt(getFlag(parsed.flags, \"taskPage\") || parsed.positionals[3], 1);\n const taskPageSize = Math.min(200, toPositiveInt(getFlag(parsed.flags, \"taskPageSize\") || parsed.positionals[4], 50));\n const includeCheckpoint = toBool(getFlag(parsed.flags, \"includeCheckpoint\") || parsed.positionals[5], true);\n const checkpointStageArg = getFlag(parsed.flags, \"checkpointStage\") || parsed.positionals[6] || \"\";\n const checkpointDetailLimit = Math.min(100, toPositiveInt(getFlag(parsed.flags, \"checkpointDetailLimit\") || parsed.positionals[7], 20));\n const includeRaw = toBool(parsed.flags.raw, false);\n\n const detailResp = await client.post<any>(\"/casement/project_version/get_project_version_detail\", { id: versionId });\n if (!detailResp.ok) {\n printResult({ ok: false, error: detailResp.msg || \"Failed to fetch version detail\", code: detailResp.code, httpStatus: detailResp.httpStatus }, options);\n return;\n }\n\n const version = detailResp.result || {};\n const phase = normalizePhaseTimeline(version.versionPhase);\n\n let project: any = null;\n if (includeProject && Number.isFinite(Number(version.projectId)) && Number(version.projectId) > 0) {\n const p = await client.post<any>(\"/casement/project/detail\", { projectId: Number(version.projectId) });\n if (p.ok) {\n const one = p.result || {};\n project = {\n id: one.id,\n projectName: one.projectName,\n groupId: one.groupId,\n groupName: one.groupName,\n jiraLibraryKey: one.jiraLibraryKey,\n principal: one.principal,\n projectStatus: one.projectStatus,\n raw: includeRaw ? one : undefined,\n };\n }\n }\n\n let tasks: any = null;\n if (includeTasks && Number.isFinite(Number(version.projectId)) && Number(version.projectId) > 0 && version.versionName) {\n const taskPayload = {\n projectId: Number(version.projectId),\n fixVersions: String(version.versionName),\n current: taskPage,\n pageSize: taskPageSize,\n };\n const taskResp = await client.post<any>(\"/casement/jira-task/v2/default_list\", taskPayload);\n if (taskResp.ok) {\n const taskResult = taskResp.result || {};\n const rows = Array.isArray(taskResult.data) ? taskResult.data : [];\n tasks = {\n ok: true,\n page: taskPage,\n pageSize: taskPageSize,\n total: Number(taskResult.total || 0),\n count: rows.length,\n list: rows.map((t: any) => ({\n id: t.id,\n jiraId: t.jiraId,\n jiraKey: t.jiraKey,\n summary: t.summary,\n status: t.status,\n currentPhase: t.currentPhase,\n currentPhaseName: phaseNameFromCode(t.currentPhase),\n priority: t.priority,\n assignee: t.assignee,\n developer: t.developer,\n qa: t.qa,\n reporter: t.reporter,\n creator: t.creator,\n fixVersions: t.fixVersions,\n fixVersionId: t.fixVersionId,\n requirementType: t.requirementType,\n country: t.country,\n business: t.business,\n childrenCount: t.childrenCount,\n createTime: t.createTime,\n updateTime: t.updateTime,\n resolvedDate: t.resolvedDate,\n raw: includeRaw ? t : undefined,\n })),\n };\n } else {\n tasks = {\n ok: false,\n page: taskPage,\n pageSize: taskPageSize,\n error: taskResp.msg || \"Failed to fetch version tasks\",\n code: taskResp.code,\n httpStatus: taskResp.httpStatus,\n };\n }\n }\n\n let checkpoint: any = null;\n if (\n includeCheckpoint &&\n Number.isFinite(Number(version.projectId)) &&\n Number(version.projectId) > 0 &&\n Number.isFinite(Number(version.publishWindowId)) &&\n Number(version.publishWindowId) > 0\n ) {\n const checkpointStage = checkpointStageArg || inferCheckpointStage(version.currentPhase);\n if (checkpointStage) {\n const checkpointPayload = {\n appId: -1,\n versionId: Number(version.id || versionId),\n windowId: Number(version.publishWindowId),\n projectId: Number(version.projectId),\n sceneType: \"VersionPhaseChange\",\n stage: checkpointStage,\n };\n const cp = await client.post<any>(\"/casement/workflow-scene-record/get_precheck_result\", checkpointPayload);\n if (cp.ok) {\n const checkpointResult = cp.result || {};\n const rows = Array.isArray(checkpointResult.cicdResults) ? checkpointResult.cicdResults : [];\n const checks = rows.map((item: any) => {\n const detailEntries = normalizeCheckpointDetails(item, checkpointDetailLimit, includeRaw);\n const hasDetailIssue = detailEntries.some((d) => Number(d.total || 0) > 0 || !!d.message);\n const hasIssue = Number(item.checkStatus) !== 1 || String(item.runStatus || \"\").toLowerCase() === \"failure\" || hasDetailIssue;\n return {\n category: item.category || null,\n displayName: item.displayName || item.taskName || null,\n taskName: item.taskName || null,\n taskDesc: item.taskDesc || null,\n runStatus: item.runStatus || null,\n taskStatus: item.taskStatus || null,\n checkStatus: item.checkStatus,\n checkStatusName: checkStatusName(item.checkStatus),\n skippable: item.skippable,\n operator: item.operator || null,\n updateTime: item.updateTime || null,\n hasIssue,\n details: detailEntries,\n raw: includeRaw ? item : undefined,\n };\n });\n const financialRiskChecks = checks.filter((c) => c.category === \"FinancialRisk\");\n const financialRiskIssues = financialRiskChecks.filter((c) => c.hasIssue);\n const allIssues = checks.filter((c) => c.hasIssue);\n checkpoint = {\n ok: true,\n sceneType: \"VersionPhaseChange\",\n stage: checkpointStage,\n isPass: !!checkpointResult.isPass,\n existing: !!checkpointResult.existing,\n totalChecks: checks.length,\n issueCount: allIssues.length,\n checks,\n issues: allIssues,\n financialRisk: {\n totalChecks: financialRiskChecks.length,\n issueCount: financialRiskIssues.length,\n issues: financialRiskIssues,\n },\n };\n } else {\n checkpoint = {\n ok: false,\n stage: checkpointStage,\n error: cp.msg || \"Failed to fetch checkpoint result\",\n code: cp.code,\n httpStatus: cp.httpStatus,\n };\n }\n }\n }\n\n printResult({\n ok: detailResp.ok,\n code: detailResp.code,\n msg: detailResp.msg,\n versionId,\n version: {\n id: version.id,\n versionName: version.versionName,\n projectId: version.projectId,\n jiraVersionId: version.jiraVersionId,\n currentPhase: version.currentPhase,\n currentPhaseName: phaseNameFromCode(version.currentPhase),\n isDone: Number(version.currentPhase) === 99,\n status: {\n currentPhase: version.currentPhase,\n currentPhaseName: phaseNameFromCode(version.currentPhase),\n isDone: Number(version.currentPhase) === 99,\n publishWindowStatus: version.publishWindowStatus || null,\n publishWindowName: version.publishWindowName || null,\n },\n startTime: version.startTime,\n endTime: version.endTime,\n phaseTimeline: phase.timeline,\n phaseTimelineMap: phase.map,\n pic: version.pic,\n publishWindowId: version.publishWindowId,\n publishWindowStatus: version.publishWindowStatus,\n publishWindowName: version.publishWindowName,\n raw: includeRaw ? version : undefined,\n },\n includeProject,\n includeTasks,\n includeCheckpoint,\n taskPage,\n taskPageSize,\n checkpointDetailLimit,\n tasks,\n checkpoint,\n project,\n }, options);\n}\n\nasync function cmdTasks(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const type = getFlag(parsed.flags, \"type\") || parsed.positionals[0] || \"assignToMe\";\n const email = getFlag(parsed.flags, \"email\") || parsed.positionals[1] || \"\";\n const page = toPositiveInt(getFlag(parsed.flags, \"page\") || parsed.positionals[2], 1);\n const pageSize = toPositiveInt(getFlag(parsed.flags, \"pageSize\") || parsed.positionals[3], 20);\n\n const payload: Record<string, unknown> = { type, current: page, pageSize };\n if (email) payload.email = email;\n\n const resp = await client.post<any>(\"/casement/workspace/task_list\", payload);\n const result = (resp.result || {}) as any;\n const rows = Array.isArray(result.data) ? result.data : Array.isArray(result.list) ? result.list : [];\n\n const tasks = rows.map((t: any) => ({\n jiraKey: t.jiraKey || t.jira_key || t.key,\n summary: t.summary || t.title,\n status: t.status || t.taskStatus,\n fixVersions: t.fixVersions || t.fixVersion || [],\n projectName: t.projectName,\n raw: t,\n }));\n\n printResult({\n ok: resp.ok,\n code: resp.code,\n msg: resp.msg,\n page,\n pageSize,\n type,\n total: result.total || tasks.length,\n count: tasks.length,\n tasks,\n }, options);\n}\n\nasync function cmdSubtasks(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const typeInput = getFlag(parsed.flags, \"type\") || parsed.positionals[0] || \"undone\";\n const typeMap: Record<string, string> = {\n thisWeek: \"weekly_done\",\n week: \"weekly_done\",\n lastWeek: \"lastWeek_done\",\n nextWeek: \"nextWeek_done\",\n overdue: \"past_due\",\n mine: \"createdByMe\",\n };\n const type = typeMap[typeInput] || typeInput;\n const email = getFlag(parsed.flags, \"email\") || parsed.positionals[1] || \"\";\n const page = toPositiveInt(getFlag(parsed.flags, \"page\") || parsed.positionals[2], 1);\n const pageSize = toPositiveInt(getFlag(parsed.flags, \"pageSize\") || parsed.positionals[3], 20);\n\n const payload: Record<string, unknown> = { type, current: page, pageSize };\n if (email) payload.email = email;\n\n const resp = await client.post<any>(\"/casement/workspace/subTask_list\", payload);\n const result = (resp.result || {}) as any;\n const rows = Array.isArray(result.data) ? result.data : Array.isArray(result.list) ? result.list : [];\n\n const subtasks = rows.map((t: any) => ({\n jiraSubtask: t.jiraSubtask || t.jiraKey || t.jira_key || t.key,\n parentJiraKey: t.parentJiraKey || t.parentJiraTask || t.jiraTask,\n summary: t.summary || t.title,\n dueDate: t.dueDate || t.planFinishTime,\n storyPoints: t.storyPoints,\n status: t.status || t.taskStatus,\n stage: t.stage || t.jiraSubtaskStage,\n fixVersions: t.parentFixVersions || t.fixVersions || [],\n raw: t,\n }));\n\n printResult({\n ok: resp.ok,\n code: resp.code,\n msg: resp.msg,\n page,\n pageSize,\n type,\n total: result.total || subtasks.length,\n count: subtasks.length,\n subtasks,\n }, options);\n}\n\nasync function cmdCreateSubtask(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const parentJiraKey = getFlag(parsed.flags, \"parentJiraKey\") || parsed.positionals[0];\n if (!parentJiraKey) {\n printResult({ ok: false, error: \"Missing argument: parentJiraKey\" }, options);\n process.exit(1);\n }\n\n const summaryOrJson = parsed.positionals[1] || \"\";\n const requirementTypePos = parsed.positionals[2] || \"\";\n const payloadRaw = getFlag(parsed.flags, \"payload\") || (summaryOrJson.startsWith(\"{\") ? summaryOrJson : \"\");\n\n let body: Record<string, unknown> = { parentJiraKey };\n\n if (payloadRaw) {\n const parsedPayload = safeJsonParse<Record<string, unknown>>(payloadRaw);\n if (!parsedPayload) {\n printResult({ ok: false, error: \"Invalid payload JSON\" }, options);\n process.exit(1);\n }\n body = { ...parsedPayload, parentJiraKey };\n } else {\n const summary = getFlag(parsed.flags, \"summary\") || (summaryOrJson && !summaryOrJson.startsWith(\"{\") ? summaryOrJson : \"\");\n const assignee = getFlag(parsed.flags, \"assignee\");\n const phase = getFlag(parsed.flags, \"phase\", \"stage\");\n const priority = getFlag(parsed.flags, \"priority\");\n const storyPoints = getFlag(parsed.flags, \"storyPoints\", \"story_points\");\n const startDate = getFlag(parsed.flags, \"startDate\", \"start_date\");\n const dueDate = getFlag(parsed.flags, \"dueDate\", \"due_date\");\n const description = getFlag(parsed.flags, \"description\");\n const requirementType = getFlag(parsed.flags, \"requirementType\", \"subtaskType\", \"jiraSubtaskType\") || requirementTypePos;\n\n if (summary) body.summary = summary;\n if (assignee) body.assignee = normalizeAssignee(assignee);\n if (phase) body.phase = phase;\n if (priority) body.priority = normalizePriority(priority);\n if (storyPoints && Number.isFinite(Number(storyPoints))) body.storyPoints = Number(storyPoints);\n if (startDate) body.startDate = startDate;\n if (dueDate) body.dueDate = dueDate;\n if (description) body.description = description;\n if (requirementType) body.requirementType = normalizeRequirementType(requirementType);\n }\n\n const send = async (oneBody: Record<string, unknown>) => {\n const resp = await client.post<any>(\"/casement/jira-subtask/add-v2\", oneBody);\n const result = resp.result || {};\n return {\n ok: resp.ok,\n code: resp.code,\n msg: resp.msg,\n httpStatus: resp.httpStatus,\n result,\n jiraSubtask: (result as any).jiraSubtask || (result as any).jiraKey || (result as any).key || null,\n };\n };\n\n let finalBody = { ...body };\n let result = await send(finalBody);\n let fallback = { assigneeTried: false, assigneeUsed: null as string | null };\n\n if (!result.ok && /User\\s+'.+'\\s+does not exist/i.test(toText(result.msg))) {\n const assignee = toText(finalBody.assignee);\n if (assignee && !assignee.includes(\"@\")) {\n const candidates = buildAssigneeFallbackCandidates(body.assignee, assignee);\n for (const candidate of candidates) {\n fallback.assigneeTried = true;\n const retryBody = { ...finalBody, assignee: candidate };\n const retry = await send(retryBody);\n if (retry.ok || !/User\\s+'.+'\\s+does not exist/i.test(toText(retry.msg))) {\n finalBody = retryBody;\n result = retry;\n fallback.assigneeUsed = candidate;\n break;\n }\n }\n }\n }\n\n printResult({\n ok: result.ok,\n code: result.code,\n msg: result.msg,\n httpStatus: result.httpStatus,\n parentJiraKey,\n jiraSubtask: result.jiraSubtask,\n result: result.result,\n requestBody: finalBody,\n fallback,\n }, options);\n}\n\nasync function cmdUpdateStatus(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const jiraKey = getFlag(parsed.flags, \"jiraKey\") || parsed.positionals[0];\n const statusRaw = getFlag(parsed.flags, \"status\") || parsed.positionals[1];\n if (!jiraKey) {\n printResult({ ok: false, error: \"Missing argument: jiraKey\" }, options);\n process.exit(1);\n }\n if (!statusRaw) {\n printResult({ ok: false, error: \"Missing argument: status\" }, options);\n process.exit(1);\n }\n\n const statusMap: Record<string, string> = {\n \"to do\": \"TO DO\",\n todo: \"TO DO\",\n doing: \"Doing\",\n done: \"Done\",\n closed: \"Closed\",\n };\n\n const normalized = statusRaw.toLowerCase();\n const statusId = statusMap[normalized];\n if (!statusId) {\n printResult({ ok: false, error: `Invalid status: ${statusRaw}`, hint: \"Use one of: To Do, Doing, Done, Closed\" }, options);\n process.exit(1);\n }\n\n async function setStatus(nextStatusName: string): Promise<ApiResponse<any>> {\n return client.post<any>(\"/casement/jira-subtask/update_field\", {\n jiraKey,\n field: \"status\",\n value: nextStatusName,\n });\n }\n\n const first = await setStatus(statusId);\n if (!first.ok && normalized === \"done\") {\n const stepDoing = await setStatus(statusMap.doing);\n const stepDone = stepDoing.ok ? await setStatus(statusId) : null;\n printResult({\n ok: !!(stepDone && stepDone.ok),\n code: stepDone ? stepDone.code : first.code,\n msg: stepDone ? stepDone.msg : first.msg,\n jiraKey,\n status: statusRaw,\n statusId,\n autoTransition: true,\n transitions: [\n { status: \"Doing\", statusId: statusMap.doing, ok: stepDoing.ok, code: stepDoing.code, msg: stepDoing.msg, httpStatus: stepDoing.httpStatus },\n { status: \"Done\", statusId, ok: stepDone ? stepDone.ok : false, code: stepDone ? stepDone.code : null, msg: stepDone ? stepDone.msg : \"Skip because Doing failed\" },\n ],\n result: stepDone ? stepDone.result : first.result,\n }, options);\n return;\n }\n\n printResult({\n ok: first.ok,\n code: first.code,\n msg: first.msg,\n jiraKey,\n status: statusRaw,\n statusId,\n httpStatus: first.httpStatus,\n result: first.result,\n }, options);\n}\n\nasync function cmdUpdateSubtask(args: string[], options: GlobalOptions): Promise<void> {\n const client = ensureClientOrThrow();\n const parsed = parseFlags(args);\n\n const jiraKey = getFlag(parsed.flags, \"jiraKey\") || parsed.positionals[0];\n if (!jiraKey) {\n printResult({ ok: false, error: \"Missing argument: jiraKey\" }, options);\n process.exit(1);\n }\n\n const secondPos = parsed.positionals[1] || \"\";\n const thirdPos = parsed.positionals[2] || \"\";\n const payloadRaw = getFlag(parsed.flags, \"payload\") || (secondPos.startsWith(\"{\") ? secondPos : \"\");\n\n const updates: Array<{ field: string; value: unknown; source: string }> = [];\n const payloadObj = payloadRaw ? safeJsonParse<Record<string, unknown>>(payloadRaw) : null;\n if (payloadObj && typeof payloadObj === \"object\") {\n for (const [k, v] of Object.entries(payloadObj)) {\n if (v === undefined || v === null || toText(v) === \"\") continue;\n updates.push({ field: k, value: v, source: \"payload\" });\n }\n }\n\n if (updates.length === 0) {\n const field = getFlag(parsed.flags, \"field\") || secondPos;\n const value = getFlag(parsed.flags, \"value\") || thirdPos;\n if (field && value !== \"\") {\n updates.push({ field, value, source: \"single\" });\n }\n }\n\n if (updates.length === 0) {\n const directFields = [\"summary\", \"storyPoints\", \"priority\", \"assignee\", \"phase\", \"startDate\", \"dueDate\", \"description\", \"requirementType\"];\n for (const key of directFields) {\n const val = getFlag(parsed.flags, key);\n if (val !== \"\") updates.push({ field: key, value: val, source: \"direct\" });\n }\n }\n\n if (updates.length === 0) {\n printResult({ ok: false, error: \"No fields to update\", hint: \"Use <jiraKey> <field> <value> OR JSON payload\" }, options);\n process.exit(1);\n }\n\n const results: any[] = [];\n for (const item of updates) {\n const canonicalField = normalizeFieldName(item.field);\n let value: unknown = item.value;\n if (canonicalField === \"priority\") value = normalizePriority(item.value);\n else if (canonicalField === \"assignee\") value = normalizeAssignee(item.value);\n else if (canonicalField === \"requirementType\") value = normalizeRequirementType(item.value);\n else value = toText(item.value);\n\n const send = async (v: unknown) => client.post<any>(\"/casement/jira-subtask/update_field\", {\n jiraKey,\n field: canonicalField,\n value: v,\n });\n\n let response = await send(value);\n let fallback = { tried: false, used: null as string | null };\n\n if (canonicalField === \"assignee\" && !response.ok && /User\\s+'.+'\\s+does not exist/i.test(toText(response.msg))) {\n const candidates = buildAssigneeFallbackCandidates(item.value, value);\n for (const candidate of candidates) {\n fallback.tried = true;\n const retry = await send(candidate);\n if (retry.ok || !/User\\s+'.+'\\s+does not exist/i.test(toText(retry.msg))) {\n response = retry;\n fallback.used = candidate;\n value = candidate;\n break;\n }\n }\n }\n\n results.push({\n field: canonicalField,\n inputField: item.field,\n inputValue: item.value,\n value,\n source: item.source,\n ok: response.ok,\n code: response.code,\n msg: response.msg,\n httpStatus: response.httpStatus,\n fallback,\n result: response.result,\n });\n }\n\n const successCount = results.filter((x) => x.ok).length;\n printResult({\n ok: successCount === results.length,\n jiraKey,\n total: results.length,\n successCount,\n failCount: results.length - successCount,\n updates: results,\n }, options);\n}\n\ninterface HelpCommand {\n title: string;\n purpose: string;\n positionalUsage: string;\n readOnly: boolean;\n args: Record<string, string>;\n examples: string[];\n notes?: string[];\n}\n\ninterface PositionalArgSpec {\n index: number;\n raw: string;\n name: string;\n required: boolean;\n inferredType: \"string\" | \"number\" | \"boolean\";\n enumValues: string[];\n default: string | null;\n description: string | null;\n}\n\nfunction inferArgType(name: string, description: string): \"string\" | \"number\" | \"boolean\" {\n const n = name.toLowerCase();\n const d = description.toLowerCase();\n if (n.includes(\"include\") || d.includes(\"true/false\") || d.includes(\"是否\")) return \"boolean\";\n if (n.includes(\"stage\")) return \"string\";\n\n const rawName = toText(name);\n const isNumberName =\n /Id$/.test(rawName) ||\n /Page$/.test(rawName) ||\n /PageSize$/.test(rawName) ||\n /Limit$/.test(rawName) ||\n /^storyPoints?$/i.test(rawName);\n\n if (isNumberName) return \"number\";\n return \"string\";\n}\n\nfunction extractDefaultValue(description: string): string | null {\n const text = toText(description);\n if (!text) return null;\n const m = text.match(/默认\\s*([^\\s,,))]+)/);\n return m ? m[1] : null;\n}\n\nfunction tokenizePositionalUsage(positionalUsage: string, args: Record<string, string>): PositionalArgSpec[] {\n const tokens = positionalUsage.match(/<[^>]+>|\\[[^\\]]+\\]/g) || [];\n return tokens.map((raw, idx) => {\n const required = raw.startsWith(\"<\");\n const body = raw.slice(1, -1).trim();\n const enumValues = body.includes(\"|\") ? body.split(\"|\").map((x) => x.trim()).filter(Boolean) : [];\n const name = enumValues[0] || body;\n const description = args[name] || null;\n const inferredType = inferArgType(name, description || \"\");\n return {\n index: idx,\n raw,\n name,\n required,\n inferredType,\n enumValues,\n default: extractDefaultValue(description || \"\"),\n description,\n };\n });\n}\n\nfunction buildAgentCommandContract(name: string, cmd: HelpCommand): Record<string, unknown> {\n const positionalArgs = tokenizePositionalUsage(cmd.positionalUsage, cmd.args);\n const positionalArgNames = new Set(positionalArgs.map((x) => x.name));\n const namedArgs = Object.entries(cmd.args)\n .filter(([k]) => !positionalArgNames.has(k))\n .map(([k, v]) => ({\n name: k,\n description: v,\n inferredType: inferArgType(k, v),\n default: extractDefaultValue(v),\n }));\n\n return {\n command: name,\n readOnly: cmd.readOnly,\n positionalArgs,\n namedArgs,\n parseRules: [\n \"优先按 positionalUsage 的顺序传位置参数。\",\n \"复杂内容优先传 JSON 字符串,避免 shell 解析歧义。\",\n \"未提供可选参数时,按命令内部默认值执行。\",\n ],\n successSignal: cmd.readOnly\n ? \"返回 ok=true 且包含列表/详情字段\"\n : \"返回 ok=true,且 successCount==total(批量更新场景)\",\n examples: cmd.examples,\n };\n}\n\nconst HELP_COMMANDS: Record<string, HelpCommand> = {\n projects: {\n title: \"casement projects\",\n purpose: \"查询项目列表\",\n positionalUsage: \"casement projects [keyword] [limit]\",\n readOnly: true,\n args: {\n keyword: \"项目关键字(projectName/jiraLibraryKey/principal/groupName)\",\n limit: \"最多返回条数,默认 50\",\n projectStatus: \"项目状态(默认 1)\",\n groupId: \"按 groupId 过滤(可选)\",\n },\n examples: [\"casement projects credit 20\"],\n },\n \"project-detail\": {\n title: \"casement project-detail\",\n purpose: \"查询项目详情\",\n positionalUsage: \"casement project-detail <projectId> [includeMembers] [includeVersions]\",\n readOnly: true,\n args: {\n projectId: \"项目 ID(必填)\",\n includeMembers: \"true/false,是否带成员\",\n includeVersions: \"true/false,是否带版本摘要\",\n memberPageSize: \"成员分页大小,默认 50\",\n versionPageSize: \"版本分页大小,默认 20\",\n },\n examples: [\"casement project-detail 6 true true\"],\n },\n versions: {\n title: \"casement versions\",\n purpose: \"查询项目版本\",\n positionalUsage: \"casement versions <projectId> [page] [pageSize] [keyword|undone|done] [limit|owner] [owner]\",\n readOnly: true,\n args: {\n projectId: \"项目 ID(必填)\",\n page: \"页码,默认 1\",\n pageSize: \"每页数量,默认 20\",\n keyword: \"版本关键字;或传 undone/done\",\n owner: \"按负责人过滤(邮箱或前缀)\",\n limit: \"最多返回条数\",\n },\n examples: [\"casement versions 6 1 100 undone\", \"casement versions 6 1 100 undone shipeng.chen\"],\n },\n \"version-detail\": {\n title: \"casement version-detail\",\n purpose: \"查询版本详情(可带 tasks/checkpoint)\",\n positionalUsage: \"casement version-detail <versionId> [includeProject] [includeTasks] [taskPage] [taskPageSize] [includeCheckpoint] [checkpointStage] [checkpointDetailLimit]\",\n readOnly: true,\n args: {\n versionId: \"版本 ID(必填)\",\n includeProject: \"是否附带项目信息,默认 true\",\n includeTasks: \"是否附带版本任务,默认 true\",\n taskPageSize: \"任务分页大小,默认 50\",\n includeCheckpoint: \"是否附带 checkpoint,默认 true\",\n checkpointStage: \"手动指定 stage(如 DevToTest)\",\n },\n examples: [\"casement version-detail 9099\", \"casement version-detail 9179 true true 1 50 true DevToTest 50\"],\n },\n \"project-members\": {\n title: \"casement project-members\",\n purpose: \"查询项目成员\",\n positionalUsage: \"casement project-members <projectId> [page] [pageSize] [keyword] [limit]\",\n readOnly: true,\n args: {\n projectId: \"项目 ID(必填)\",\n page: \"页码,默认 1\",\n pageSize: \"每页数量,默认 50\",\n keyword: \"按邮箱/team 过滤\",\n limit: \"最多返回条数\",\n },\n examples: [\"casement project-members 6 1 100\"],\n },\n tasks: {\n title: \"casement tasks\",\n purpose: \"查询 workspace my task\",\n positionalUsage: \"casement tasks [type] [email] [page] [pageSize]\",\n readOnly: true,\n args: {\n type: \"assignToMe | creatorByMe | relatedToMe\",\n email: \"目标邮箱(默认当前登录用户)\",\n page: \"页码,默认 1\",\n pageSize: \"每页数量,默认 20\",\n },\n examples: [\"casement tasks assignToMe\"],\n },\n subtasks: {\n title: \"casement subtasks\",\n purpose: \"查询 workspace my subtask\",\n positionalUsage: \"casement subtasks [type] [email] [page] [pageSize]\",\n readOnly: true,\n args: {\n type: \"undone/weekly_done/lastWeek_done/nextWeek_done/past_due/all/createdByMe\",\n email: \"目标邮箱(默认当前登录用户)\",\n page: \"页码,默认 1\",\n pageSize: \"每页数量,默认 20\",\n },\n examples: [\"casement subtasks undone\"],\n },\n \"create-subtask\": {\n title: \"casement create-subtask\",\n purpose: \"创建 subtask\",\n positionalUsage: \"casement create-subtask <parentJiraKey> [summary-or-json]\",\n readOnly: false,\n args: {\n parentJiraKey: \"父任务 key(必填)\",\n summary: \"标题\",\n assignee: \"指派人(邮箱会自动转短名)\",\n phase: \"阶段(Dev/Test/UAT/Live)\",\n priority: \"Highest/High/Medium/Low/Lowest(支持 P0~P4)\",\n storyPoints: \"故事点\",\n startDate: \"开始日期 YYYY-MM-DD\",\n dueDate: \"截止日期 YYYY-MM-DD\",\n requirementType: \"子任务类型\",\n description: \"描述\",\n payload: \"原始 JSON\",\n },\n notes: [\"推荐第 2 个位置参数直接传 JSON\"],\n examples: [\n \"casement create-subtask SPSK-245038 '{\\\"summary\\\":\\\"[BE] demo\\\",\\\"assignee\\\":\\\"shipeng.chen\\\",\\\"priority\\\":\\\"High\\\"}'\",\n ],\n },\n \"update-status\": {\n title: \"casement update-status\",\n purpose: \"更新 subtask 状态\",\n positionalUsage: \"casement update-status <jiraKey> <status>\",\n readOnly: false,\n args: {\n jiraKey: \"子任务 key(必填)\",\n status: \"To Do | Doing | Done | Closed\",\n },\n examples: [\"casement update-status SPSK-273098 Doing\"],\n },\n \"update-subtask\": {\n title: \"casement update-subtask\",\n purpose: \"更新 subtask 字段(summary/storyPoints/priority/assignee...)\",\n positionalUsage: \"casement update-subtask <jiraKey> <field|json> [value]\",\n readOnly: false,\n args: {\n jiraKey: \"子任务 key(必填)\",\n field: \"字段名\",\n value: \"字段值\",\n payload: \"批量 JSON\",\n summary: \"直接更新 summary\",\n storyPoints: \"直接更新 storyPoints\",\n priority: \"直接更新 priority(支持 P0~P4)\",\n assignee: \"直接更新 assignee(支持邮箱/用户名)\",\n phase: \"直接更新 phase\",\n startDate: \"直接更新 startDate\",\n dueDate: \"直接更新 dueDate\",\n description: \"直接更新 description\",\n requirementType: \"直接更新 requirementType\",\n },\n examples: [\n \"casement update-subtask SPSK-273096 summary '[BE] new title'\",\n \"casement update-subtask SPSK-273096 storyPoints 2.5\",\n \"casement update-subtask SPSK-273096 '{\\\"summary\\\":\\\"new\\\",\\\"storyPoints\\\":2.5,\\\"priority\\\":\\\"High\\\"}'\",\n ],\n },\n auth: {\n title: \"casement auth\",\n purpose: \"登录会话管理\",\n positionalUsage: \"casement auth <login|status|logout>\",\n readOnly: false,\n args: {\n login: \"保存 token/cookie 到本地会话\",\n status: \"检查会话可用性\",\n logout: \"清除本地会话\",\n token: \"CASEMENT_LOGIN_TOKEN\",\n cookie: \"浏览器 Cookie 字符串\",\n from: \"从 JSON 文件导入 token/cookie\",\n mode: \"登录模式:auto(默认) | manual\",\n auto: \"是否启用自动浏览器采集(默认 true)\",\n browser: \"Playwright 浏览器通道(默认 chrome)\",\n timeout: \"自动采集超时秒数(默认 300)\",\n open: \"是否自动打开登录页(默认 true)\",\n },\n examples: [\n \"casement auth login\",\n \"casement auth login --mode manual\",\n \"casement auth login --token <TOKEN> --cookie 'a=b; c=d'\",\n \"casement auth status\",\n \"casement auth logout\",\n ],\n },\n};\n\nfunction showHelp(target: string | null, options: GlobalOptions): void {\n const order = [\n \"auth\",\n \"projects\",\n \"project-detail\",\n \"versions\",\n \"version-detail\",\n \"project-members\",\n \"tasks\",\n \"subtasks\",\n \"create-subtask\",\n \"update-subtask\",\n \"update-status\",\n ];\n\n if (target) {\n const cmd = HELP_COMMANDS[target];\n if (!cmd) {\n printResult({ ok: false, error: `Unknown command: ${target}`, availableCommands: order }, options);\n return;\n }\n printResult({\n project: \"casement-lite\",\n command: target,\n detail: cmd,\n agentContract: buildAgentCommandContract(target, cmd),\n usageGuide: [\n \"推荐优先用位置参数;复杂更新建议传 JSON。\",\n \"先执行 `casement auth login` 建立会话。\",\n \"`auth login` 默认自动拉起受控浏览器并采集 token/cookie;可用 `--mode manual` 改为手动输入。\",\n ],\n }, options);\n return;\n }\n\n printResult({\n project: \"casement-lite\",\n description: \"Casement 轻量 CLI(直接通过接口调用)\",\n helpFormat: \"agent-friendly-json-v1\",\n sessionFile: SESSION_FILE,\n availableCommands: order,\n commands: order.map((k) => ({\n name: k,\n title: HELP_COMMANDS[k].title,\n purpose: HELP_COMMANDS[k].purpose,\n readOnly: HELP_COMMANDS[k].readOnly,\n positionalUsage: HELP_COMMANDS[k].positionalUsage,\n positionalSpec: tokenizePositionalUsage(HELP_COMMANDS[k].positionalUsage, HELP_COMMANDS[k].args),\n examples: HELP_COMMANDS[k].examples,\n })),\n agentGuide: {\n recommendedFlow: [\n \"1) 先执行 `casement auth login` 建立会话\",\n \"2) 先查询 projects 拿到 projectId\",\n \"3) 再查询 versions/version-detail\",\n \"4) 需要修改时再执行 create-subtask/update-*\",\n ],\n readOnlyCommands: order.filter((k) => HELP_COMMANDS[k].readOnly),\n writeCommands: order.filter((k) => !HELP_COMMANDS[k].readOnly),\n commandContracts: order.reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = buildAgentCommandContract(k, HELP_COMMANDS[k]);\n return acc;\n }, {}),\n },\n quickStart: [\n \"casement auth login\",\n \"casement projects credit 10\",\n \"casement versions 6 1 100 undone\",\n \"casement version-detail 9099\",\n ],\n }, options);\n}\n\nasync function runCommand(command: string | null, args: string[], options: GlobalOptions): Promise<void> {\n const cmd = command ? command.replace(/^casement\\//, \"\") : command;\n const rest = args;\n\n if (!cmd || cmd === \"help\" || cmd === \"-h\" || cmd === \"--help\") {\n showHelp(rest[0] || null, options);\n return;\n }\n\n if (cmd === \"auth\") {\n const sub = rest[0] || \"\";\n const subArgs = rest.slice(1);\n if (!sub || sub === \"help\") {\n showHelp(\"auth\", options);\n return;\n }\n if (sub === \"login\") return authLogin(subArgs, options);\n if (sub === \"status\") return authStatus(options);\n if (sub === \"logout\") return authLogout(options);\n printResult({ ok: false, error: `Unknown auth subcommand: ${sub}`, available: [\"login\", \"status\", \"logout\"] }, options);\n process.exit(1);\n }\n\n if (cmd === \"projects\") return cmdProjects(rest, options);\n if (cmd === \"project-detail\") return cmdProjectDetail(rest, options);\n if (cmd === \"project-members\") return cmdProjectMembers(rest, options);\n if (cmd === \"versions\") return cmdVersions(rest, options);\n if (cmd === \"version-detail\") return cmdVersionDetail(rest, options);\n if (cmd === \"tasks\") return cmdTasks(rest, options);\n if (cmd === \"subtasks\") return cmdSubtasks(rest, options);\n if (cmd === \"create-subtask\") return cmdCreateSubtask(rest, options);\n if (cmd === \"update-status\") return cmdUpdateStatus(rest, options);\n if (cmd === \"update-subtask\") return cmdUpdateSubtask(rest, options);\n\n printResult({ ok: false, error: `Unknown command: ${cmd}`, hint: \"Use: casement help\" }, options);\n process.exit(1);\n}\n\nasync function main(): Promise<void> {\n const parsed = parseGlobalArgv(process.argv);\n await runCommand(parsed.command, parsed.args, parsed.options);\n}\n\nmain().catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(JSON.stringify({ ok: false, error: msg }, null, 2));\n process.exit(1);\n});\n"],"mappings":"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","names":["result"]}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "casement-lite-cli",
3
+ "version": "0.0.1",
4
+ "description": "Lightweight Casement CLI for project/version/subtask queries and updates.",
5
+ "keywords": [
6
+ "casement",
7
+ "cli",
8
+ "jira",
9
+ "project-management"
10
+ ],
11
+ "license": "MIT",
12
+ "type": "module",
13
+ "main": "dist/index.js",
14
+ "types": "dist/index.d.ts",
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "bin": {
20
+ "casement": "dist/index.js",
21
+ "casement-lite": "dist/index.js"
22
+ },
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "engines": {
29
+ "node": ">=18"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "dependencies": {
35
+ "playwright": "^1.53.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^20.0.0",
39
+ "tsup": "^8.0.0",
40
+ "typescript": "^5.3.0"
41
+ }
42
+ }