@tiangong-lca/cli 0.0.7 → 0.0.9

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.
Files changed (59) hide show
  1. package/README.md +97 -16
  2. package/dist/src/cli.js +1429 -131
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/lib/dataset-author.js +100 -0
  5. package/dist/src/lib/dataset-author.js.map +1 -0
  6. package/dist/src/lib/dataset-bilingual.js +545 -0
  7. package/dist/src/lib/dataset-bilingual.js.map +1 -0
  8. package/dist/src/lib/dataset-contract.js +350 -0
  9. package/dist/src/lib/dataset-contract.js.map +1 -0
  10. package/dist/src/lib/dataset-evidence-search.js +636 -0
  11. package/dist/src/lib/dataset-evidence-search.js.map +1 -0
  12. package/dist/src/lib/dataset-import-lca.js +171 -0
  13. package/dist/src/lib/dataset-import-lca.js.map +1 -0
  14. package/dist/src/lib/dataset-remote-refresh.js +166 -0
  15. package/dist/src/lib/dataset-remote-refresh.js.map +1 -0
  16. package/dist/src/lib/dataset-remote-verify.js +543 -0
  17. package/dist/src/lib/dataset-remote-verify.js.map +1 -0
  18. package/dist/src/lib/dataset-validate.js +63 -7
  19. package/dist/src/lib/dataset-validate.js.map +1 -1
  20. package/dist/src/lib/flow-fetch-rows.js +12 -12
  21. package/dist/src/lib/flow-fetch-rows.js.map +1 -1
  22. package/dist/src/lib/flow-payload-validation.js +51 -0
  23. package/dist/src/lib/flow-payload-validation.js.map +1 -0
  24. package/dist/src/lib/flow-publish-reviewed-data.js +16 -0
  25. package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
  26. package/dist/src/lib/flow-publish-version.js +182 -12
  27. package/dist/src/lib/flow-publish-version.js.map +1 -1
  28. package/dist/src/lib/{review-flow.js → flow-qa.js} +86 -28
  29. package/dist/src/lib/flow-qa.js.map +1 -0
  30. package/dist/src/lib/identity-preflight.js +1021 -0
  31. package/dist/src/lib/identity-preflight.js.map +1 -0
  32. package/dist/src/lib/{review-lifecyclemodel.js → lifecyclemodel-qa.js} +54 -54
  33. package/dist/src/lib/lifecyclemodel-qa.js.map +1 -0
  34. package/dist/src/lib/process-auto-build.js +147 -0
  35. package/dist/src/lib/process-auto-build.js.map +1 -1
  36. package/dist/src/lib/process-dedup-review.js +51 -0
  37. package/dist/src/lib/process-dedup-review.js.map +1 -1
  38. package/dist/src/lib/process-flow-build-plan.js +1071 -0
  39. package/dist/src/lib/process-flow-build-plan.js.map +1 -0
  40. package/dist/src/lib/process-payload-validation.js +14 -7
  41. package/dist/src/lib/process-payload-validation.js.map +1 -1
  42. package/dist/src/lib/process-publish-build.js +122 -4
  43. package/dist/src/lib/process-publish-build.js.map +1 -1
  44. package/dist/src/lib/{review-process.js → process-qa.js} +259 -117
  45. package/dist/src/lib/process-qa.js.map +1 -0
  46. package/dist/src/lib/process-refresh-references.js +19 -10
  47. package/dist/src/lib/process-refresh-references.js.map +1 -1
  48. package/dist/src/lib/process-required-fields.js +810 -0
  49. package/dist/src/lib/process-required-fields.js.map +1 -0
  50. package/dist/src/lib/process-save-draft-run.js +4 -1
  51. package/dist/src/lib/process-save-draft-run.js.map +1 -1
  52. package/dist/src/lib/publish.js +100 -0
  53. package/dist/src/lib/publish.js.map +1 -1
  54. package/dist/src/lib/runtime-rulesets.js +283 -0
  55. package/dist/src/lib/runtime-rulesets.js.map +1 -0
  56. package/package.json +2 -2
  57. package/dist/src/lib/review-flow.js.map +0 -1
  58. package/dist/src/lib/review-lifecyclemodel.js.map +0 -1
  59. package/dist/src/lib/review-process.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-preflight.js","sourceRoot":"","sources":["../../../src/lib/identity-preflight.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport * as tidasSdk from '@tiangong-lca/tidas-sdk';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { readRuntimeEnv } from './env.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson } from './http.js';\nimport {\n datasetIdentity,\n detectDatasetKind,\n isRecord,\n readDatasetRowsInput,\n unwrapDatasetPayload,\n type DatasetKind,\n type JsonObject,\n} from './dataset-local.js';\nimport { readJsonInput } from './io.js';\nimport { deriveSupabaseFunctionsBaseUrl, requireSupabaseRestRuntime } from './supabase-client.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\nimport {\n normalizeIssuePath,\n type SafeParseSchema,\n type SdkValidationFactory,\n validateSchemaWithDeepFallback,\n} from './tidas-sdk-validation.js';\n\ntype IdentityPreflightKind = 'process' | 'flow';\n\nexport type IdentityPreflightDecision =\n | 'reuse'\n | 'update_same_row'\n | 'version_bump'\n | 'create_new'\n | 'block_duplicate'\n | 'manual_review';\n\nexport type IdentityPreflightStatus = 'passed' | 'blocked' | 'needs_review';\n\nexport type IdentityPreflightFinding = {\n code: string;\n severity: 'info' | 'warning' | 'blocker';\n message: string;\n candidate_index?: number;\n};\n\ntype ValidationSummary = {\n status: 'passed' | 'failed' | 'not_applicable';\n validator: string | null;\n issue_count: number;\n issues: Array<{\n path: string;\n message: string;\n code: string;\n }>;\n};\n\ntype IdentityProfile = {\n id: string | null;\n version: string | null;\n state_code: number | null;\n names: string[];\n normalized_names: string[];\n identity_key: string;\n exchange_signature: string[];\n fields: Record<string, string | null | string[]>;\n};\n\nexport type IdentityPreflightCandidateReport = {\n index: number;\n id: string | null;\n version: string | null;\n state_code: number | null;\n identity_key: string;\n match_score: number;\n match_reasons: string[];\n decision_hint: IdentityPreflightDecision | null;\n};\n\nexport type IdentityPreflightCandidateSourceReport = {\n path: string;\n kind: 'embedded_request' | 'file' | 'directory' | 'remote_search';\n row_count: number;\n scanned_files: string[];\n endpoint?: string;\n query?: string;\n filter?: JsonObject | null;\n};\n\nexport type IdentityPreflightReport = {\n schema_version: 1;\n generated_at_utc: string;\n kind: IdentityPreflightKind;\n status: IdentityPreflightStatus;\n decision: IdentityPreflightDecision;\n confidence: 'high' | 'medium' | 'low';\n input_path: string;\n out_dir: string | null;\n target: {\n id: string | null;\n version: string | null;\n identity_key: string;\n exchange_signature: string[];\n schema_validation: ValidationSummary;\n };\n candidates: IdentityPreflightCandidateReport[];\n candidate_sources: IdentityPreflightCandidateSourceReport[];\n findings: IdentityPreflightFinding[];\n blockers: IdentityPreflightFinding[];\n next_action:\n | 'reuse_existing'\n | 'repair_existing_draft'\n | 'prepare_version_update'\n | 'materialize_new_payload'\n | 'stop_duplicate'\n | 'queue_manual_review';\n files: {\n identity_decision: string | null;\n candidates: string | null;\n candidate_sources: string | null;\n };\n};\n\nexport type RunIdentityPreflightOptions = {\n inputPath: string;\n outDir?: string | null;\n rawInput?: unknown;\n candidateInputPaths?: string[];\n remoteCandidateSearch?: boolean;\n remoteQuery?: string | null;\n remoteFilter?: JsonObject | null;\n remoteLimit?: number | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n schemas?: Partial<Record<IdentityPreflightKind, SafeParseSchema>>;\n};\n\nexport type RunProcessIdentityPreflightOptions = RunIdentityPreflightOptions;\nexport type RunFlowIdentityPreflightOptions = RunIdentityPreflightOptions;\nexport type ProcessIdentityPreflightReport = IdentityPreflightReport & { kind: 'process' };\nexport type FlowIdentityPreflightReport = IdentityPreflightReport & { kind: 'flow' };\n\ntype NormalizedInput = {\n target: JsonObject;\n candidates: JsonObject[];\n candidateInputPaths: string[];\n remoteCandidateSearch: RemoteCandidateSearchConfig;\n};\n\ntype CandidateEvaluation = {\n report: IdentityPreflightCandidateReport;\n findings: IdentityPreflightFinding[];\n};\n\ntype RemoteCandidateSearchConfig = {\n enabled: boolean;\n query: string | null;\n filter: JsonObject | null;\n limit: number | null;\n};\n\ntype RemoteCandidateRead = {\n rows: JsonObject[];\n source: IdentityPreflightCandidateSourceReport;\n};\n\nconst SCHEMA_EXPORTS: Record<IdentityPreflightKind, keyof typeof tidasSdk> = {\n flow: 'FlowSchema' as keyof typeof tidasSdk,\n process: 'ProcessSchema' as keyof typeof tidasSdk,\n};\n\nconst ENTITY_FACTORY_EXPORTS: Record<IdentityPreflightKind, keyof typeof tidasSdk> = {\n flow: 'createFlow' as keyof typeof tidasSdk,\n process: 'createProcess' as keyof typeof tidasSdk,\n};\n\nfunction requiredInputPath(inputPath: string): string {\n const normalized = inputPath.trim();\n if (!normalized) {\n throw new CliError('Missing required --input value.', {\n code: 'IDENTITY_PREFLIGHT_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction normalizeToRecord(value: unknown, label: string): JsonObject {\n if (!isRecord(value)) {\n throw new CliError(`${label} must be a JSON object.`, {\n code: 'IDENTITY_PREFLIGHT_INVALID_INPUT',\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction normalizeRows(value: unknown, label: string): JsonObject[] {\n if (value === undefined || value === null) {\n return [];\n }\n const rows = isRecord(value) && Array.isArray(value.rows) ? value.rows : value;\n const normalizedRows = Array.isArray(rows) ? rows : [rows];\n return normalizedRows.map((row, index) => normalizeToRecord(row, `${label}[${index}]`));\n}\n\nfunction normalizePathList(value: unknown, label: string): string[] {\n if (value === undefined || value === null) {\n return [];\n }\n const values = Array.isArray(value) ? value : [value];\n return values.flatMap((entry, index) => {\n if (typeof entry !== 'string') {\n throw new CliError(`${label}[${index}] must be a string path.`, {\n code: 'IDENTITY_PREFLIGHT_INVALID_CANDIDATE_INPUT',\n exitCode: 2,\n });\n }\n return entry\n .split(',')\n .map((pathValue) => pathValue.trim())\n .filter(Boolean);\n });\n}\n\nfunction normalizePositiveInteger(value: unknown, label: string): number | null {\n if (value === undefined || value === null || value === '') {\n return null;\n }\n const parsed = typeof value === 'number' ? value : Number.parseInt(String(value), 10);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code: 'IDENTITY_PREFLIGHT_INVALID_REMOTE_LIMIT',\n exitCode: 2,\n });\n }\n return parsed;\n}\n\nfunction normalizeRemoteCandidateSearch(value: unknown): RemoteCandidateSearchConfig {\n if (value === undefined || value === null) {\n return { enabled: false, query: null, filter: null, limit: null };\n }\n if (typeof value === 'boolean') {\n return { enabled: value, query: null, filter: null, limit: null };\n }\n if (!isRecord(value)) {\n throw new CliError('remote_candidate_search must be a boolean or object.', {\n code: 'IDENTITY_PREFLIGHT_INVALID_REMOTE_SEARCH',\n exitCode: 2,\n });\n }\n\n const enabled = value.enabled === undefined ? true : Boolean(value.enabled);\n const query = textValue(value.query) ?? textValue(value.search_query);\n const filter =\n value.filter === undefined || value.filter === null\n ? null\n : normalizeToRecord(value.filter, 'remote_candidate_search.filter');\n return {\n enabled,\n query,\n filter,\n limit: normalizePositiveInteger(value.limit, 'remote_candidate_search.limit'),\n };\n}\n\nfunction pickKindTarget(input: JsonObject, kind: IdentityPreflightKind): unknown {\n if (input.target !== undefined) {\n return input.target;\n }\n if (input.candidate !== undefined) {\n return input.candidate;\n }\n if (kind === 'process' && input.process !== undefined) {\n return input.process;\n }\n if (kind === 'flow' && input.flow !== undefined) {\n return input.flow;\n }\n return input;\n}\n\nfunction normalizePreflightInput(rawInput: unknown, kind: IdentityPreflightKind): NormalizedInput {\n const input = normalizeToRecord(rawInput, 'identity preflight input');\n const target = normalizeToRecord(pickKindTarget(input, kind), 'identity preflight target');\n const candidateGroups = [\n ...normalizeRows(input.candidates, 'candidates'),\n ...normalizeRows(input.existing, 'existing'),\n ...normalizeRows(input.existing_rows, 'existing_rows'),\n ...normalizeRows(input.rows, 'rows'),\n ];\n\n return {\n target,\n candidates: candidateGroups,\n candidateInputPaths: [\n ...normalizePathList(input.candidate_input, 'candidate_input'),\n ...normalizePathList(input.candidate_inputs, 'candidate_inputs'),\n ...normalizePathList(input.candidateInputPaths, 'candidateInputPaths'),\n ...normalizePathList(input.candidate_files, 'candidate_files'),\n ...normalizePathList(input.candidateFiles, 'candidateFiles'),\n ],\n remoteCandidateSearch: normalizeRemoteCandidateSearch(\n input.remote_candidate_search ?? input.remoteCandidateSearch ?? input.remote_candidates,\n ),\n };\n}\n\ninterface CandidateInputStats {\n isFile(): boolean;\n isDirectory(): boolean;\n}\n\nfunction isCandidateDatasetFile(filePath: string): boolean {\n return /\\.(?:json|jsonl)$/iu.test(path.basename(filePath));\n}\n\nfunction throwUnsupportedCandidateInput(resolved: string): never {\n throw new CliError(`Candidate input must be a JSON/JSONL file or directory: ${resolved}`, {\n code: 'IDENTITY_PREFLIGHT_CANDIDATE_INPUT_UNSUPPORTED',\n exitCode: 2,\n });\n}\n\nfunction collectCandidateFilesFromStats(resolved: string, stats: CandidateInputStats): string[] {\n if (stats.isFile()) {\n if (!isCandidateDatasetFile(resolved)) {\n throwUnsupportedCandidateInput(resolved);\n }\n return [resolved];\n }\n if (!stats.isDirectory()) {\n throwUnsupportedCandidateInput(resolved);\n }\n\n const files: string[] = [];\n const visit = (directory: string): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n if (entry.name.startsWith('.')) {\n continue;\n }\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n visit(entryPath);\n } else if (entry.isFile() && isCandidateDatasetFile(entry.name)) {\n files.push(entryPath);\n }\n }\n };\n visit(resolved);\n return files.sort((left, right) => left.localeCompare(right));\n}\n\nfunction collectCandidateFiles(candidatePath: string): string[] {\n const resolved = path.resolve(candidatePath);\n if (!existsSync(resolved)) {\n throw new CliError(`Candidate input not found: ${resolved}`, {\n code: 'IDENTITY_PREFLIGHT_CANDIDATE_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n const stats = statSync(resolved);\n return collectCandidateFilesFromStats(resolved, stats);\n}\n\nfunction readCandidateSource(candidatePath: string): {\n rows: JsonObject[];\n source: IdentityPreflightCandidateSourceReport;\n} {\n const resolved = path.resolve(candidatePath);\n const files = collectCandidateFiles(resolved);\n const rows = files.flatMap((file) => readDatasetRowsInput(file));\n const kind = statSync(resolved).isDirectory() ? 'directory' : 'file';\n return {\n rows,\n source: {\n path: resolved,\n kind,\n row_count: rows.length,\n scanned_files: files,\n },\n };\n}\n\nfunction mergeRemoteCandidateSearchConfig(\n inputConfig: RemoteCandidateSearchConfig,\n options: RunIdentityPreflightOptions,\n): RemoteCandidateSearchConfig {\n return {\n enabled: options.remoteCandidateSearch ?? inputConfig.enabled,\n query: options.remoteQuery?.trim() || inputConfig.query,\n filter: options.remoteFilter ?? inputConfig.filter,\n limit: options.remoteLimit ?? inputConfig.limit,\n };\n}\n\nfunction remoteSearchEndpoint(kind: IdentityPreflightKind): string {\n return kind === 'process' ? 'process_hybrid_search' : 'flow_hybrid_search';\n}\n\nfunction defaultRemoteQuery(profile: IdentityProfile): string | null {\n return (\n profile.names[0] ??\n Object.values(profile.fields)\n .flat()\n .find((value): value is string => typeof value === 'string' && value.trim().length > 0) ??\n (profile.identity_key ? profile.identity_key : null)\n );\n}\n\nfunction remoteSearchFilter(\n kind: IdentityPreflightKind,\n profile: IdentityProfile,\n explicitFilter: JsonObject | null,\n): JsonObject | null {\n const filter: JsonObject = explicitFilter ? { ...explicitFilter } : {};\n if (kind === 'flow' && filter.flowType === undefined) {\n const flowType = Array.isArray(profile.fields.type_of_dataset)\n ? profile.fields.type_of_dataset[0]\n : profile.fields.type_of_dataset;\n if (flowType) {\n filter.flowType = flowType;\n }\n }\n return Object.keys(filter).length > 0 ? filter : null;\n}\n\nfunction rowsFromRemoteSearchResponse(value: unknown): JsonObject[] {\n const rows = isRecord(value)\n ? (value.data ?? value.rows ?? value.results ?? value.candidates ?? [])\n : value;\n if (rows === undefined || rows === null) {\n return [];\n }\n return normalizeRows(rows, 'remote search candidates');\n}\n\nasync function readRemoteCandidateSource(\n kind: IdentityPreflightKind,\n targetProfile: IdentityProfile,\n config: RemoteCandidateSearchConfig,\n options: RunIdentityPreflightOptions,\n): Promise<RemoteCandidateRead | null> {\n if (!config.enabled) {\n return null;\n }\n\n const query = config.query ?? defaultRemoteQuery(targetProfile);\n if (!query) {\n throw new CliError('Remote identity candidate search requires a query.', {\n code: 'IDENTITY_PREFLIGHT_REMOTE_QUERY_REQUIRED',\n exitCode: 2,\n });\n }\n\n const runtimeEnv = readRuntimeEnv(options.env ?? process.env);\n const runtime = requireSupabaseRestRuntime(options.env ?? process.env);\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? 10_000;\n const endpoint = remoteSearchEndpoint(kind);\n const url = `${deriveSupabaseFunctionsBaseUrl(runtime.apiBaseUrl)}/${endpoint}`;\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const filter = remoteSearchFilter(kind, targetProfile, config.filter);\n const body: JsonObject = {\n query,\n ...(filter ? { filter } : {}),\n ...(config.limit ? { limit: config.limit } : {}),\n };\n const headers: Record<string, string> = {\n Authorization: `Bearer ${session.accessToken}`,\n 'Content-Type': 'application/json',\n };\n if (runtimeEnv.region) {\n headers['x-region'] = runtimeEnv.region;\n }\n\n const response = await postJson({\n url,\n headers,\n body,\n timeoutMs,\n fetchImpl,\n });\n const rows = rowsFromRemoteSearchResponse(response);\n const limitedRows = config.limit ? rows.slice(0, config.limit) : rows;\n return {\n rows: limitedRows,\n source: {\n path: url,\n kind: 'remote_search',\n row_count: limitedRows.length,\n scanned_files: [],\n endpoint,\n query,\n filter,\n },\n };\n}\n\nfunction schemaForKind(\n kind: IdentityPreflightKind,\n schemas: Partial<Record<IdentityPreflightKind, SafeParseSchema>> | undefined,\n): { validator: string; schema: SafeParseSchema; createEntity: SdkValidationFactory | null } {\n if (schemas?.[kind]) {\n return {\n validator: 'injected',\n schema: schemas[kind],\n createEntity: null,\n };\n }\n\n const exportName = SCHEMA_EXPORTS[kind];\n const candidate = (tidasSdk as Record<string, unknown>)[exportName];\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n typeof (candidate as SafeParseSchema).safeParse !== 'function'\n ) {\n throw new CliError(`${String(exportName)} is unavailable in @tiangong-lca/tidas-sdk.`, {\n code: 'IDENTITY_PREFLIGHT_SCHEMA_UNAVAILABLE',\n exitCode: 2,\n details: { kind },\n });\n }\n\n const factoryName = ENTITY_FACTORY_EXPORTS[kind];\n const createEntity = (tidasSdk as Record<string, unknown>)[factoryName];\n return {\n validator: `@tiangong-lca/tidas-sdk/${String(exportName)}`,\n schema: candidate as SafeParseSchema,\n createEntity:\n typeof createEntity === 'function' ? (createEntity as SdkValidationFactory) : null,\n };\n}\n\nfunction validateTargetSchema(\n target: JsonObject,\n kind: IdentityPreflightKind,\n schemas: Partial<Record<IdentityPreflightKind, SafeParseSchema>> | undefined,\n): ValidationSummary {\n const detectedKind = detectDatasetKind(target);\n if (detectedKind && detectedKind !== kind) {\n return {\n status: 'failed',\n validator: null,\n issue_count: 1,\n issues: [\n {\n path: '<root>',\n message: `Expected ${kind} target but detected ${detectedKind}.`,\n code: 'dataset_kind_mismatch',\n },\n ],\n };\n }\n\n if (!detectedKind) {\n return {\n status: 'not_applicable',\n validator: null,\n issue_count: 0,\n issues: [],\n };\n }\n\n const { validator, schema, createEntity } = schemaForKind(kind, schemas);\n const payload = unwrapDatasetPayload(target);\n const outcome = validateSchemaWithDeepFallback(schema, payload, createEntity);\n if (outcome.success) {\n return {\n status: 'passed',\n validator,\n issue_count: 0,\n issues: [],\n };\n }\n\n return {\n status: 'failed',\n validator,\n issue_count: outcome.issues.length,\n issues: outcome.issues.map((issue) => ({\n path: normalizeIssuePath(issue.path),\n message: issue.message ?? 'Validation failed',\n code: issue.code ?? 'custom',\n })),\n };\n}\n\nfunction normalizeText(value: string): string {\n return value\n .normalize('NFKC')\n .trim()\n .toLowerCase()\n .replace(/[^\\p{Letter}\\p{Number}]+/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim();\n}\n\nfunction normalizeKey(key: string): string {\n return key\n .split(':')\n .pop()!\n .replace(/[^a-zA-Z0-9]+/gu, '')\n .toLowerCase();\n}\n\nfunction textValue(value: unknown): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n}\n\nfunction collectText(value: unknown, output: string[] = []): string[] {\n const direct = textValue(value);\n if (direct) {\n output.push(direct);\n return output;\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectText(entry, output);\n }\n return output;\n }\n if (isRecord(value)) {\n if (textValue(value['#text'])) {\n output.push(textValue(value['#text']) as string);\n }\n for (const [key, entry] of Object.entries(value)) {\n if (key === '#text') {\n continue;\n }\n collectText(entry, output);\n }\n }\n return output;\n}\n\nfunction collectValuesByKey(\n value: unknown,\n wantedKeys: Set<string>,\n output: unknown[] = [],\n): unknown[] {\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectValuesByKey(entry, wantedKeys, output);\n }\n return output;\n }\n if (!isRecord(value)) {\n return output;\n }\n for (const [key, entry] of Object.entries(value)) {\n if (wantedKeys.has(normalizeKey(key))) {\n output.push(entry);\n }\n collectValuesByKey(entry, wantedKeys, output);\n }\n return output;\n}\n\nfunction uniqueTexts(values: unknown[]): string[] {\n const normalized = new Map<string, string>();\n for (const value of values) {\n for (const text of collectText(value)) {\n const key = normalizeText(text);\n if (key && !normalized.has(key)) {\n normalized.set(key, text.trim());\n }\n }\n }\n return [...normalized.values()].sort((a, b) => normalizeText(a).localeCompare(normalizeText(b)));\n}\n\nfunction firstUniqueText(...values: unknown[]): string | null {\n return uniqueTexts(values)[0] ?? null;\n}\n\nfunction fieldFromKeys(row: JsonObject, payload: JsonObject, keys: string[]): string | null {\n const wanted = new Set(keys.map(normalizeKey));\n return firstUniqueText(\n ...collectValuesByKey(row, wanted),\n ...collectValuesByKey(payload, wanted),\n );\n}\n\nfunction textListFromKeys(row: JsonObject, payload: JsonObject, keys: string[]): string[] {\n const wanted = new Set(keys.map(normalizeKey));\n return uniqueTexts([...collectValuesByKey(row, wanted), ...collectValuesByKey(payload, wanted)]);\n}\n\nfunction normalizedList(values: string[]): string[] {\n return [...new Set(values.map(normalizeText).filter(Boolean))].sort();\n}\n\nfunction numberOrNull(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number.parseInt(value.trim(), 10);\n return Number.isInteger(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction collectExchangeLikeRecords(value: unknown, output: JsonObject[] = []): JsonObject[] {\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectExchangeLikeRecords(entry, output);\n }\n return output;\n }\n if (!isRecord(value)) {\n return output;\n }\n\n const keys = new Set(Object.keys(value).map(normalizeKey));\n if (\n keys.has('referencetoflowdataset') ||\n keys.has('flowid') ||\n keys.has('flowuuid') ||\n keys.has('flow') ||\n keys.has('exchangedirection')\n ) {\n output.push(value);\n }\n\n for (const entry of Object.values(value)) {\n collectExchangeLikeRecords(entry, output);\n }\n return output;\n}\n\nfunction exchangeRecordSignature(record: JsonObject): string | null {\n const flowId = fieldFromKeys(record, record, [\n '@refObjectId',\n 'refObjectId',\n 'flow_id',\n 'flowId',\n 'flow_uuid',\n 'flowUuid',\n 'referenceToFlowDataSet',\n ]);\n const direction = fieldFromKeys(record, record, [\n 'exchangeDirection',\n 'direction',\n 'inputGroup',\n 'outputGroup',\n ]);\n const amount = fieldFromKeys(record, record, [\n 'meanAmount',\n 'mean_amount',\n 'resultingAmount',\n 'resulting_amount',\n 'amount',\n 'meanValue',\n ]);\n\n const normalizedFlowId = flowId ? normalizeText(flowId) : '';\n if (!normalizedFlowId) {\n return null;\n }\n return [normalizedFlowId, normalizeText(direction ?? ''), normalizeText(amount ?? '')].join(':');\n}\n\nfunction processExchangeSignature(row: JsonObject, payload: JsonObject): string[] {\n return [\n ...new Set(\n [...collectExchangeLikeRecords(row), ...collectExchangeLikeRecords(payload)]\n .map(exchangeRecordSignature)\n .filter((entry): entry is string => Boolean(entry)),\n ),\n ].sort();\n}\n\nfunction profileDatasetIdentity(\n row: JsonObject,\n payload: JsonObject,\n kind: IdentityPreflightKind,\n): { id: string | null; version: string | null } {\n const detectedKind = detectDatasetKind(row);\n const identity = datasetIdentity(\n row,\n payload,\n detectedKind === kind ? (kind as DatasetKind) : null,\n );\n return {\n id: firstUniqueText(row.id, row.process_id, row.flow_id, row.uuid, identity.id) ?? identity.id,\n version:\n firstUniqueText(row.version, row.dataset_version, identity.version) ?? identity.version,\n };\n}\n\nfunction processProfile(row: JsonObject): IdentityProfile {\n const payload = unwrapDatasetPayload(row);\n const identity = profileDatasetIdentity(row, payload, 'process');\n const names = textListFromKeys(row, payload, [\n 'name',\n 'baseName',\n 'shortDescription',\n 'name_en',\n 'name_zh',\n ]);\n const referenceFlowIds = textListFromKeys(row, payload, [\n 'reference_flow_id',\n 'referenceFlowId',\n 'reference_product_flow',\n 'referenceProductFlow',\n 'referenceToReferenceFlow',\n 'referenceToFlowDataSet',\n '@refObjectId',\n 'refObjectId',\n ]);\n const operation = fieldFromKeys(row, payload, ['operation', 'process_operation']);\n const quantitativeReference = fieldFromKeys(row, payload, [\n 'quantitative_reference',\n 'quantitativeReference',\n 'qref',\n 'referenceToReferenceFlow',\n ]);\n const geography = fieldFromKeys(row, payload, [\n 'geography',\n 'location',\n 'locationOfOperationSupplyOrProduction',\n ]);\n const time = fieldFromKeys(row, payload, [\n 'time',\n 'reference_year',\n 'referenceYear',\n 'timePeriod',\n ]);\n const technologyRoute = fieldFromKeys(row, payload, [\n 'technology_route',\n 'technologyRoute',\n 'technology',\n 'treatmentStandardsRoutes',\n ]);\n const systemBoundary = fieldFromKeys(row, payload, [\n 'system_boundary',\n 'systemBoundary',\n 'boundary',\n ]);\n const providerRole = fieldFromKeys(row, payload, ['provider_role', 'providerRole']);\n const exchangeSignature = processExchangeSignature(row, payload);\n const keyParts = [\n ...normalizedList(names).slice(0, 4),\n ...normalizedList(referenceFlowIds).slice(0, 4),\n normalizeText(operation ?? ''),\n normalizeText(quantitativeReference ?? ''),\n normalizeText(geography ?? ''),\n normalizeText(time ?? ''),\n normalizeText(technologyRoute ?? ''),\n normalizeText(systemBoundary ?? ''),\n normalizeText(providerRole ?? ''),\n exchangeSignature.join(','),\n ].filter(Boolean);\n\n return {\n id: identity.id,\n version: identity.version,\n state_code: numberOrNull(row.state_code ?? row.stateCode),\n names,\n normalized_names: normalizedList(names),\n identity_key: keyParts.join('|'),\n exchange_signature: exchangeSignature,\n fields: {\n reference_flow_ids: referenceFlowIds,\n operation,\n quantitative_reference: quantitativeReference,\n geography,\n time,\n technology_route: technologyRoute,\n system_boundary: systemBoundary,\n provider_role: providerRole,\n },\n };\n}\n\nfunction flowProfile(row: JsonObject): IdentityProfile {\n const payload = unwrapDatasetPayload(row);\n const identity = profileDatasetIdentity(row, payload, 'flow');\n const names = textListFromKeys(row, payload, [\n 'name',\n 'baseName',\n 'shortDescription',\n 'name_en',\n 'name_zh',\n 'synonyms',\n ]);\n const typeOfDataset = fieldFromKeys(row, payload, [\n 'type_of_dataset',\n 'typeOfDataSet',\n 'flow_type',\n 'flowType',\n ]);\n const cas = fieldFromKeys(row, payload, ['CASNumber', 'cas_number', 'cas']);\n const flowProperty = fieldFromKeys(row, payload, [\n 'flow_property',\n 'flowProperty',\n 'referenceToFlowPropertyDataSet',\n 'reference_property',\n 'referenceProperty',\n ]);\n const referenceUnit = fieldFromKeys(row, payload, ['reference_unit', 'referenceUnit', 'unit']);\n const categories = textListFromKeys(row, payload, ['category', 'compartment']);\n const geography = fieldFromKeys(row, payload, [\n 'geography',\n 'location',\n 'market',\n 'mixAndLocationTypes',\n ]);\n const keyParts = [\n normalizeText(typeOfDataset ?? ''),\n ...normalizedList(names).slice(0, 4),\n normalizeText(cas ?? ''),\n normalizeText(flowProperty ?? ''),\n normalizeText(referenceUnit ?? ''),\n ...normalizedList(categories).slice(0, 4),\n normalizeText(geography ?? ''),\n ].filter(Boolean);\n\n return {\n id: identity.id,\n version: identity.version,\n state_code: numberOrNull(row.state_code ?? row.stateCode),\n names,\n normalized_names: normalizedList(names),\n identity_key: keyParts.join('|'),\n exchange_signature: [],\n fields: {\n type_of_dataset: typeOfDataset,\n cas,\n flow_property: flowProperty,\n reference_unit: referenceUnit,\n categories,\n geography,\n },\n };\n}\n\nfunction profileForKind(row: JsonObject, kind: IdentityPreflightKind): IdentityProfile {\n return kind === 'process' ? processProfile(row) : flowProfile(row);\n}\n\nfunction intersects(left: string[], right: string[]): boolean {\n const rightSet = new Set(right);\n return left.some((entry) => rightSet.has(entry));\n}\n\nfunction normalizedFieldValues(value: string | null | string[]): string[] {\n return (Array.isArray(value) ? value : [value])\n .filter((entry): entry is string => typeof entry === 'string')\n .map(normalizeText)\n .filter(Boolean);\n}\n\nfunction sameNonEmptyField(\n left: string | null | string[],\n right: string | null | string[],\n): boolean {\n const leftValues = normalizedFieldValues(left);\n const rightValues = normalizedFieldValues(right);\n return leftValues.length > 0 && rightValues.length > 0 && intersects(leftValues, rightValues);\n}\n\nfunction sameExchangeSignature(left: string[], right: string[]): boolean {\n return left.length > 0 && right.length > 0 && left.join('|') === right.join('|');\n}\n\nfunction hasEquivalentFlowCore(target: IdentityProfile, candidate: IdentityProfile): boolean {\n const hasSameType = sameNonEmptyField(\n target.fields.type_of_dataset,\n candidate.fields.type_of_dataset,\n );\n const hasSameProperty = sameNonEmptyField(\n target.fields.flow_property,\n candidate.fields.flow_property,\n );\n const hasSameUnit = sameNonEmptyField(\n target.fields.reference_unit,\n candidate.fields.reference_unit,\n );\n const hasSameCas = sameNonEmptyField(target.fields.cas, candidate.fields.cas);\n const hasSameCategory = sameNonEmptyField(target.fields.categories, candidate.fields.categories);\n\n return (\n hasSameType &&\n hasSameProperty &&\n hasSameUnit &&\n intersects(target.normalized_names, candidate.normalized_names) &&\n (hasSameCas || hasSameCategory)\n );\n}\n\nfunction candidateEvaluation(\n target: IdentityProfile,\n candidate: IdentityProfile,\n kind: IdentityPreflightKind,\n index: number,\n): CandidateEvaluation {\n const matchReasons: string[] = [];\n let matchScore = 0;\n let decisionHint: IdentityPreflightDecision | null = null;\n\n if (target.id && candidate.id && target.id === candidate.id) {\n matchScore += 100;\n matchReasons.push('same_dataset_id');\n if (candidate.state_code === 0) {\n decisionHint = 'update_same_row';\n } else if (target.version && candidate.version && target.version !== candidate.version) {\n decisionHint = 'version_bump';\n } else {\n decisionHint = 'reuse';\n }\n }\n\n if (\n target.identity_key &&\n candidate.identity_key &&\n target.identity_key === candidate.identity_key\n ) {\n matchScore += 90;\n matchReasons.push('same_identity_key');\n if (!decisionHint) {\n decisionHint = 'block_duplicate';\n }\n }\n\n if (\n kind === 'process' &&\n sameExchangeSignature(target.exchange_signature, candidate.exchange_signature)\n ) {\n matchScore += 40;\n matchReasons.push('same_exchange_signature');\n if (!decisionHint) {\n decisionHint = 'manual_review';\n }\n }\n\n const hasOverlappingName = intersects(target.normalized_names, candidate.normalized_names);\n if (hasOverlappingName) {\n matchScore += 20;\n matchReasons.push('overlapping_name');\n if (!decisionHint) {\n decisionHint = 'manual_review';\n }\n }\n\n const targetReferenceFields = Object.values(target.fields)\n .flat()\n .filter((value): value is string => typeof value === 'string')\n .map(normalizeText)\n .filter(Boolean);\n const candidateReferenceFields = Object.values(candidate.fields)\n .flat()\n .filter((value): value is string => typeof value === 'string')\n .map(normalizeText)\n .filter(Boolean);\n const hasOverlappingIdentityField = intersects(targetReferenceFields, candidateReferenceFields);\n if (hasOverlappingIdentityField) {\n matchScore += 10;\n matchReasons.push('overlapping_identity_field');\n }\n\n if (\n kind === 'process' &&\n decisionHint === 'manual_review' &&\n matchReasons.includes('same_exchange_signature') &&\n hasOverlappingIdentityField\n ) {\n matchScore += 20;\n matchReasons.push('same_exchange_fingerprint');\n decisionHint = 'block_duplicate';\n }\n\n if (\n kind === 'flow' &&\n (decisionHint === null || decisionHint === 'manual_review') &&\n hasEquivalentFlowCore(target, candidate)\n ) {\n matchScore += 70;\n matchReasons.push('equivalent_flow_core_fields');\n decisionHint = 'block_duplicate';\n }\n\n const findings: IdentityPreflightFinding[] = [];\n if (decisionHint === 'block_duplicate') {\n findings.push({\n code: `${kind}_duplicate_candidate`,\n severity: 'blocker',\n message: `Candidate ${index} matches the target identity and should block new ${kind} creation.`,\n candidate_index: index,\n });\n } else if (decisionHint === 'manual_review') {\n findings.push({\n code: `${kind}_manual_review_candidate`,\n severity: 'warning',\n message: `Candidate ${index} is similar enough to require manual review before new ${kind} creation.`,\n candidate_index: index,\n });\n } else if (decisionHint) {\n findings.push({\n code: `${kind}_${decisionHint}`,\n severity: 'info',\n message: `Candidate ${index} supports decision ${decisionHint}.`,\n candidate_index: index,\n });\n }\n\n return {\n report: {\n index,\n id: candidate.id,\n version: candidate.version,\n state_code: candidate.state_code,\n identity_key: candidate.identity_key,\n match_score: matchScore,\n match_reasons: matchReasons,\n decision_hint: decisionHint,\n },\n findings,\n };\n}\n\nfunction chooseDecision(\n evaluations: CandidateEvaluation[],\n validation: ValidationSummary,\n kind: IdentityPreflightKind,\n): {\n decision: IdentityPreflightDecision;\n confidence: 'high' | 'medium' | 'low';\n findings: IdentityPreflightFinding[];\n} {\n const findings = evaluations.flatMap((evaluation) => evaluation.findings);\n if (validation.status === 'failed') {\n return {\n decision: 'manual_review',\n confidence: 'high',\n findings: [\n {\n code: `${kind}_schema_invalid`,\n severity: 'blocker',\n message: `Target ${kind} payload failed schema validation.`,\n },\n ...findings,\n ],\n };\n }\n\n const sorted = [...evaluations].sort(\n (left, right) => right.report.match_score - left.report.match_score,\n );\n const top = sorted[0]?.report;\n if (!top || top.match_score === 0) {\n return {\n decision: 'create_new',\n confidence: 'medium',\n findings: [\n {\n code: `${kind}_no_duplicate_candidate`,\n severity: 'info',\n message: `No duplicate ${kind} candidate matched the target identity.`,\n },\n ...findings,\n ],\n };\n }\n\n if (top.decision_hint === 'block_duplicate') {\n return {\n decision: 'block_duplicate',\n confidence: top.match_score >= 90 ? 'high' : 'medium',\n findings,\n };\n }\n if (\n top.decision_hint === 'reuse' ||\n top.decision_hint === 'update_same_row' ||\n top.decision_hint === 'version_bump'\n ) {\n return {\n decision: top.decision_hint,\n confidence: top.match_score >= 90 ? 'high' : 'medium',\n findings,\n };\n }\n\n return {\n decision: 'manual_review',\n confidence: top.match_score >= 60 ? 'medium' : 'low',\n findings,\n };\n}\n\nfunction statusForDecision(\n decision: IdentityPreflightDecision,\n blockers: IdentityPreflightFinding[],\n): IdentityPreflightStatus {\n if (blockers.length > 0 || decision === 'block_duplicate') {\n return 'blocked';\n }\n if (decision === 'manual_review') {\n return 'needs_review';\n }\n return 'passed';\n}\n\nfunction nextActionForDecision(\n decision: IdentityPreflightDecision,\n): IdentityPreflightReport['next_action'] {\n if (decision === 'reuse') {\n return 'reuse_existing';\n }\n if (decision === 'update_same_row') {\n return 'repair_existing_draft';\n }\n if (decision === 'version_bump') {\n return 'prepare_version_update';\n }\n if (decision === 'block_duplicate') {\n return 'stop_duplicate';\n }\n if (decision === 'manual_review') {\n return 'queue_manual_review';\n }\n return 'materialize_new_payload';\n}\n\nfunction writeArtifacts(\n report: IdentityPreflightReport,\n outDir: string | null | undefined,\n): IdentityPreflightReport['files'] {\n if (!outDir) {\n return {\n identity_decision: null,\n candidates: null,\n candidate_sources: null,\n };\n }\n\n const resolved = path.resolve(outDir);\n const files = {\n identity_decision: path.join(resolved, 'outputs', 'identity-decision.json'),\n candidates: path.join(resolved, 'outputs', 'identity-candidates.jsonl'),\n candidate_sources: path.join(resolved, 'outputs', 'identity-candidate-sources.json'),\n };\n\n writeJsonArtifact(files.identity_decision, { ...report, files });\n writeJsonLinesArtifact(files.candidates, report.candidates);\n writeJsonArtifact(files.candidate_sources, report.candidate_sources);\n return files;\n}\n\nexport async function runIdentityPreflight(\n kind: IdentityPreflightKind,\n options: RunIdentityPreflightOptions,\n): Promise<IdentityPreflightReport> {\n const inputPath = requiredInputPath(options.inputPath);\n const normalizedInput = normalizePreflightInput(\n options.rawInput ?? readJsonInput(inputPath),\n kind,\n );\n const targetProfile = profileForKind(normalizedInput.target, kind);\n const remoteCandidateSearch = mergeRemoteCandidateSearchConfig(\n normalizedInput.remoteCandidateSearch,\n options,\n );\n const candidateSourceReads = [\n ...normalizedInput.candidateInputPaths,\n ...(options.candidateInputPaths ?? []),\n ].map(readCandidateSource);\n const remoteCandidateRead = await readRemoteCandidateSource(\n kind,\n targetProfile,\n remoteCandidateSearch,\n options,\n );\n const candidateSources: IdentityPreflightCandidateSourceReport[] = [\n ...(normalizedInput.candidates.length > 0\n ? [\n {\n path: path.resolve(inputPath),\n kind: 'embedded_request' as const,\n row_count: normalizedInput.candidates.length,\n scanned_files: [],\n },\n ]\n : []),\n ...candidateSourceReads.map((entry) => entry.source),\n ...(remoteCandidateRead ? [remoteCandidateRead.source] : []),\n ];\n const candidates = [\n ...normalizedInput.candidates,\n ...candidateSourceReads.flatMap((entry) => entry.rows),\n ...(remoteCandidateRead?.rows ?? []),\n ];\n const validation = validateTargetSchema(normalizedInput.target, kind, options.schemas);\n const evaluations = candidates.map((candidate, index) =>\n candidateEvaluation(targetProfile, profileForKind(candidate, kind), kind, index),\n );\n const decision = chooseDecision(evaluations, validation, kind);\n const blockers = decision.findings.filter((finding) => finding.severity === 'blocker');\n\n const baseReport: IdentityPreflightReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n kind,\n status: statusForDecision(decision.decision, blockers),\n decision: decision.decision,\n confidence: decision.confidence,\n input_path: path.resolve(inputPath),\n out_dir: options.outDir ? path.resolve(options.outDir) : null,\n target: {\n id: targetProfile.id,\n version: targetProfile.version,\n identity_key: targetProfile.identity_key,\n exchange_signature: targetProfile.exchange_signature,\n schema_validation: validation,\n },\n candidates: evaluations.map((evaluation) => evaluation.report),\n candidate_sources: candidateSources,\n findings: decision.findings,\n blockers,\n next_action: nextActionForDecision(decision.decision),\n files: {\n identity_decision: null,\n candidates: null,\n candidate_sources: null,\n },\n };\n\n const files = writeArtifacts(baseReport, options.outDir);\n return {\n ...baseReport,\n files,\n };\n}\n\nexport async function runProcessIdentityPreflight(\n options: RunProcessIdentityPreflightOptions,\n): Promise<ProcessIdentityPreflightReport> {\n return (await runIdentityPreflight('process', options)) as ProcessIdentityPreflightReport;\n}\n\nexport async function runFlowIdentityPreflight(\n options: RunFlowIdentityPreflightOptions,\n): Promise<FlowIdentityPreflightReport> {\n return (await runIdentityPreflight('flow', options)) as FlowIdentityPreflightReport;\n}\n\nexport const __testInternals = {\n normalizePreflightInput,\n schemaForKind,\n entityFactoryExports: ENTITY_FACTORY_EXPORTS,\n processProfile,\n flowProfile,\n candidateEvaluation,\n chooseDecision,\n collectCandidateFilesFromStats,\n readCandidateSource,\n defaultRemoteQuery,\n normalizeRemoteCandidateSearch,\n remoteSearchFilter,\n rowsFromRemoteSearchResponse,\n};\n"]}
@@ -129,25 +129,25 @@ function buildLayout(runRoot, outDir) {
129
129
  validationReportPath: path.join(runRoot, 'reports', 'lifecyclemodel-validate-build-report.json'),
130
130
  modelSummariesPath: path.join(outDir, 'model_summaries.jsonl'),
131
131
  findingsPath: path.join(outDir, 'findings.jsonl'),
132
- summaryPath: path.join(outDir, 'lifecyclemodel_review_summary.json'),
133
- reviewZhPath: path.join(outDir, 'lifecyclemodel_review_zh.md'),
134
- reviewEnPath: path.join(outDir, 'lifecyclemodel_review_en.md'),
135
- timingPath: path.join(outDir, 'lifecyclemodel_review_timing.md'),
136
- reportPath: path.join(outDir, 'lifecyclemodel_review_report.json'),
132
+ summaryPath: path.join(outDir, 'lifecyclemodel_qa_summary.json'),
133
+ reviewZhPath: path.join(outDir, 'lifecyclemodel_qa_zh.md'),
134
+ reviewEnPath: path.join(outDir, 'lifecyclemodel_qa_en.md'),
135
+ timingPath: path.join(outDir, 'lifecyclemodel_qa_timing.md'),
136
+ reportPath: path.join(outDir, 'lifecyclemodel_qa_report.json'),
137
137
  };
138
138
  }
139
139
  function resolveLayout(options) {
140
140
  const runDir = nonEmptyString(options.runDir);
141
141
  if (!runDir) {
142
- throw new CliError('Missing required --run-dir for review lifecyclemodel.', {
143
- code: 'LIFECYCLEMODEL_REVIEW_RUN_DIR_REQUIRED',
142
+ throw new CliError('Missing required --run-dir for qa lifecyclemodel.', {
143
+ code: 'LIFECYCLEMODEL_QA_RUN_DIR_REQUIRED',
144
144
  exitCode: 2,
145
145
  });
146
146
  }
147
147
  const outDir = nonEmptyString(options.outDir);
148
148
  if (!outDir) {
149
- throw new CliError('Missing required --out-dir for review lifecyclemodel.', {
150
- code: 'LIFECYCLEMODEL_REVIEW_OUT_DIR_REQUIRED',
149
+ throw new CliError('Missing required --out-dir for qa lifecyclemodel.', {
150
+ code: 'LIFECYCLEMODEL_QA_OUT_DIR_REQUIRED',
151
151
  exitCode: 2,
152
152
  });
153
153
  }
@@ -155,18 +155,18 @@ function resolveLayout(options) {
155
155
  }
156
156
  function ensureRunRootExists(layout) {
157
157
  if (!existsSync(layout.runRoot)) {
158
- throw new CliError(`lifecyclemodel review run root not found: ${layout.runRoot}`, {
159
- code: 'LIFECYCLEMODEL_REVIEW_RUN_NOT_FOUND',
158
+ throw new CliError(`lifecyclemodel QA run root not found: ${layout.runRoot}`, {
159
+ code: 'LIFECYCLEMODEL_QA_RUN_NOT_FOUND',
160
160
  exitCode: 2,
161
161
  });
162
162
  }
163
163
  }
164
164
  function readRequiredRunManifest(layout) {
165
- const manifest = readRequiredJsonObject(layout.runManifestPath, 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_MISSING', 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_INVALID', 'run-manifest');
165
+ const manifest = readRequiredJsonObject(layout.runManifestPath, 'LIFECYCLEMODEL_QA_RUN_MANIFEST_MISSING', 'LIFECYCLEMODEL_QA_RUN_MANIFEST_INVALID', 'run-manifest');
166
166
  const manifestRunId = nonEmptyString(manifest.runId);
167
167
  if (manifestRunId && manifestRunId !== layout.runId) {
168
- throw new CliError(`lifecyclemodel review run manifest runId mismatch: ${layout.runManifestPath}`, {
169
- code: 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_MISMATCH',
168
+ throw new CliError(`lifecyclemodel QA run manifest runId mismatch: ${layout.runManifestPath}`, {
169
+ code: 'LIFECYCLEMODEL_QA_RUN_MANIFEST_MISMATCH',
170
170
  exitCode: 2,
171
171
  details: {
172
172
  expected: layout.runId,
@@ -185,8 +185,8 @@ function readInvocationIndex(layout) {
185
185
  }
186
186
  const value = readJsonArtifact(layout.invocationIndexPath);
187
187
  if (!isRecord(value)) {
188
- throw new CliError(`Expected lifecyclemodel review invocation index JSON object: ${layout.invocationIndexPath}`, {
189
- code: 'LIFECYCLEMODEL_REVIEW_INVOCATION_INDEX_INVALID',
188
+ throw new CliError(`Expected lifecyclemodel QA invocation index JSON object: ${layout.invocationIndexPath}`, {
189
+ code: 'LIFECYCLEMODEL_QA_INVOCATION_INDEX_INVALID',
190
190
  exitCode: 2,
191
191
  });
192
192
  }
@@ -197,8 +197,8 @@ function readInvocationIndex(layout) {
197
197
  };
198
198
  }
199
199
  if (!Array.isArray(value.invocations)) {
200
- throw new CliError(`Expected lifecyclemodel review invocation index to contain an invocations array: ${layout.invocationIndexPath}`, {
201
- code: 'LIFECYCLEMODEL_REVIEW_INVOCATION_INDEX_INVALID',
200
+ throw new CliError(`Expected lifecyclemodel QA invocation index to contain an invocations array: ${layout.invocationIndexPath}`, {
201
+ code: 'LIFECYCLEMODEL_QA_INVOCATION_INDEX_INVALID',
202
202
  exitCode: 2,
203
203
  });
204
204
  }
@@ -216,8 +216,8 @@ function discoverModelEntries(layout) {
216
216
  .sort()
217
217
  .map((entry) => path.join(lifecyclemodelsDir, entry));
218
218
  if (modelFiles.length === 0) {
219
- throw new CliError(`lifecyclemodel review found a bundle without lifecyclemodel JSON files: ${lifecyclemodelsDir}`, {
220
- code: 'LIFECYCLEMODEL_REVIEW_MODELS_EMPTY',
219
+ throw new CliError(`lifecyclemodel QA found a bundle without lifecyclemodel JSON files: ${lifecyclemodelsDir}`, {
220
+ code: 'LIFECYCLEMODEL_QA_MODELS_EMPTY',
221
221
  exitCode: 2,
222
222
  });
223
223
  }
@@ -232,8 +232,8 @@ function discoverModelEntries(layout) {
232
232
  ];
233
233
  });
234
234
  if (entries.length === 0) {
235
- throw new CliError(`lifecyclemodel review run does not contain any model bundles: ${layout.modelsDir}`, {
236
- code: 'LIFECYCLEMODEL_REVIEW_MODELS_NOT_FOUND',
235
+ throw new CliError(`lifecyclemodel QA run does not contain any model bundles: ${layout.modelsDir}`, {
236
+ code: 'LIFECYCLEMODEL_QA_MODELS_NOT_FOUND',
237
237
  exitCode: 2,
238
238
  });
239
239
  }
@@ -293,7 +293,7 @@ function collectValidationIssues(validation) {
293
293
  return issues;
294
294
  }
295
295
  function readValidationAggregate(layout) {
296
- const aggregate = readOptionalJsonObject(layout.validationReportPath, 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID', 'validate-build report');
296
+ const aggregate = readOptionalJsonObject(layout.validationReportPath, 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID', 'validate-build report');
297
297
  if (!aggregate) {
298
298
  return {
299
299
  ok: null,
@@ -303,7 +303,7 @@ function readValidationAggregate(layout) {
303
303
  }
304
304
  if (aggregate.model_reports !== undefined && !Array.isArray(aggregate.model_reports)) {
305
305
  throw new CliError(`Expected lifecyclemodel validate-build report to contain a model_reports array: ${layout.validationReportPath}`, {
306
- code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',
306
+ code: 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID',
307
307
  exitCode: 2,
308
308
  });
309
309
  }
@@ -311,14 +311,14 @@ function readValidationAggregate(layout) {
311
311
  for (const rawEntry of Array.isArray(aggregate.model_reports) ? aggregate.model_reports : []) {
312
312
  if (!isRecord(rawEntry)) {
313
313
  throw new CliError(`Expected lifecyclemodel validate-build model report entry JSON object: ${layout.validationReportPath}`, {
314
- code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',
314
+ code: 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID',
315
315
  exitCode: 2,
316
316
  });
317
317
  }
318
318
  const runName = nonEmptyString(rawEntry.run_name);
319
319
  if (!runName || !isRecord(rawEntry.validation)) {
320
320
  throw new CliError(`Expected lifecyclemodel validate-build model report entry to contain run_name and validation: ${layout.validationReportPath}`, {
321
- code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',
321
+ code: 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID',
322
322
  exitCode: 2,
323
323
  });
324
324
  }
@@ -345,8 +345,8 @@ function modelRoot(value) {
345
345
  function readModelFileReviewInfo(filePath) {
346
346
  const payload = readJsonArtifact(filePath);
347
347
  if (!isRecord(payload)) {
348
- throw new CliError(`Expected lifecyclemodel review payload JSON object: ${filePath}`, {
349
- code: 'LIFECYCLEMODEL_REVIEW_MODEL_INVALID',
348
+ throw new CliError(`Expected lifecyclemodel QA payload JSON object: ${filePath}`, {
349
+ code: 'LIFECYCLEMODEL_QA_MODEL_INVALID',
350
350
  exitCode: 2,
351
351
  });
352
352
  }
@@ -388,9 +388,9 @@ function makeFinding(runName, modelFile, severity, ruleId, source, message, evid
388
388
  };
389
389
  }
390
390
  function buildModelReview(entry, validationAggregate) {
391
- const summaryArtifact = readOptionalJsonObject(entry.summaryPath, 'LIFECYCLEMODEL_REVIEW_SUMMARY_INVALID', 'summary');
392
- const connections = readOptionalJsonArray(entry.connectionsPath, 'LIFECYCLEMODEL_REVIEW_CONNECTIONS_INVALID', 'connections');
393
- const processCatalog = readOptionalJsonArray(entry.processCatalogPath, 'LIFECYCLEMODEL_REVIEW_PROCESS_CATALOG_INVALID', 'process-catalog');
391
+ const summaryArtifact = readOptionalJsonObject(entry.summaryPath, 'LIFECYCLEMODEL_QA_SUMMARY_INVALID', 'summary');
392
+ const connections = readOptionalJsonArray(entry.connectionsPath, 'LIFECYCLEMODEL_QA_CONNECTIONS_INVALID', 'connections');
393
+ const processCatalog = readOptionalJsonArray(entry.processCatalogPath, 'LIFECYCLEMODEL_QA_PROCESS_CATALOG_INVALID', 'process-catalog');
394
394
  const modelFileInfos = entry.modelFiles.map((modelFile) => readModelFileReviewInfo(modelFile));
395
395
  const validation = validationAggregate.modelReports.get(entry.runName) ?? {
396
396
  ok: null,
@@ -424,49 +424,49 @@ function buildModelReview(entry, validationAggregate) {
424
424
  ? Object.keys(multiplicationFactors).length
425
425
  : 0;
426
426
  if (!summaryArtifact) {
427
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_model_summary', 'review', 'Model bundle is missing summary.json generated by lifecyclemodel auto-build.', {
427
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_model_summary', 'qa', 'Model bundle is missing summary.json generated by lifecyclemodel auto-build.', {
428
428
  summary_path: entry.summaryPath,
429
429
  }));
430
430
  }
431
431
  if (!connections) {
432
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_connections_artifact', 'review', 'Model bundle is missing connections.json generated by lifecyclemodel auto-build.', {
432
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_connections_artifact', 'qa', 'Model bundle is missing connections.json generated by lifecyclemodel auto-build.', {
433
433
  connections_path: entry.connectionsPath,
434
434
  }));
435
435
  }
436
436
  if (!processCatalog) {
437
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_process_catalog', 'review', 'Model bundle is missing process-catalog.json generated by lifecyclemodel auto-build.', {
437
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_process_catalog', 'qa', 'Model bundle is missing process-catalog.json generated by lifecyclemodel auto-build.', {
438
438
  process_catalog_path: entry.processCatalogPath,
439
439
  }));
440
440
  }
441
441
  if (referenceProcessUuids.length === 0) {
442
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_reference_process_uuid', 'review', 'Review could not resolve reference_process_uuid from summary.json.', {
442
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_reference_process_uuid', 'qa', 'QA could not resolve reference_process_uuid from summary.json.', {
443
443
  summary_path: summaryArtifact ? entry.summaryPath : null,
444
444
  }));
445
445
  }
446
446
  if (resultingProcessUuids.length === 0) {
447
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_resulting_process_ref', 'review', 'Review could not resolve referenceToResultingProcess from the lifecyclemodel payload.', {
447
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'missing_resulting_process_ref', 'qa', 'QA could not resolve referenceToResultingProcess from the lifecyclemodel payload.', {
448
448
  model_files: entry.modelFiles,
449
449
  }));
450
450
  }
451
451
  if (processInstanceCount === 0) {
452
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'error', 'empty_process_instances', 'review', 'Lifecyclemodel payload does not contain any processInstance entries.', {
452
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'error', 'empty_process_instances', 'qa', 'Lifecyclemodel payload does not contain any processInstance entries.', {
453
453
  model_files: entry.modelFiles,
454
454
  }));
455
455
  }
456
456
  if (summaryProcessCount !== null && summaryProcessCount !== processInstanceCount) {
457
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'process_count_mismatch', 'review', 'summary.json process_count does not match the number of processInstance entries in the payload.', {
457
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'process_count_mismatch', 'qa', 'summary.json process_count does not match the number of processInstance entries in the payload.', {
458
458
  summary_process_count: summaryProcessCount,
459
459
  process_instance_count: processInstanceCount,
460
460
  }));
461
461
  }
462
462
  if (connections && summaryEdgeCount !== null && connections.length !== summaryEdgeCount) {
463
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'edge_count_mismatch', 'review', 'summary.json edge_count does not match the connections.json row count.', {
463
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'edge_count_mismatch', 'qa', 'summary.json edge_count does not match the connections.json row count.', {
464
464
  summary_edge_count: summaryEdgeCount,
465
465
  connection_count: connections.length,
466
466
  }));
467
467
  }
468
468
  if (processCatalog && processCatalog.length !== processInstanceCount) {
469
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'process_catalog_count_mismatch', 'review', 'process-catalog.json row count does not match the number of processInstance entries in the payload.', {
469
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'process_catalog_count_mismatch', 'qa', 'process-catalog.json row count does not match the number of processInstance entries in the payload.', {
470
470
  process_catalog_count: processCatalog.length,
471
471
  process_instance_count: processInstanceCount,
472
472
  }));
@@ -474,7 +474,7 @@ function buildModelReview(entry, validationAggregate) {
474
474
  if (summaryArtifact &&
475
475
  multiplicationFactors &&
476
476
  multiplicationFactorCount !== processInstanceCount) {
477
- findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'multiplication_factor_count_mismatch', 'review', 'summary.json multiplication_factors count does not match the number of processInstance entries in the payload.', {
477
+ findings.push(makeFinding(entry.runName, entry.modelFiles[0] ?? null, 'warning', 'multiplication_factor_count_mismatch', 'qa', 'summary.json multiplication_factors count does not match the number of processInstance entries in the payload.', {
478
478
  multiplication_factor_count: multiplicationFactorCount,
479
479
  process_instance_count: processInstanceCount,
480
480
  }));
@@ -519,7 +519,7 @@ function buildInvocationIndex(layout, invocationIndex, options, now) {
519
519
  ? [...invocationIndex.invocations]
520
520
  : [];
521
521
  const command = [
522
- 'review',
522
+ 'qa',
523
523
  'lifecyclemodel',
524
524
  '--run-dir',
525
525
  options.runDir,
@@ -562,7 +562,7 @@ function buildNextActions(layout, validationAggregate) {
562
562
  }
563
563
  function renderZhReview(options) {
564
564
  const lines = [
565
- '# lifecyclemodel_review_zh\n',
565
+ '# lifecyclemodel_qa_zh\n',
566
566
  `- run_id: \`${options.runId}\`\n`,
567
567
  `- logic_version: \`${options.logicVersion}\`\n`,
568
568
  `- run_root: \`${options.runRoot}\`\n`,
@@ -577,7 +577,7 @@ function renderZhReview(options) {
577
577
  });
578
578
  lines.push('\n## Findings\n');
579
579
  if (options.findings.length === 0) {
580
- lines.push('- 未发现新的 lifecyclemodel review findings。\n');
580
+ lines.push('- 未发现新的 lifecyclemodel QA findings。\n');
581
581
  }
582
582
  else {
583
583
  lines.push('\n|run name|severity|source|rule id|message|\n|---|---|---|---|---|\n');
@@ -585,12 +585,12 @@ function renderZhReview(options) {
585
585
  lines.push(`|${finding.run_name}|${finding.severity}|${finding.source}|${finding.rule_id}|${finding.message.replace(/\|/gu, '/')}|\n`);
586
586
  });
587
587
  }
588
- lines.push('\n## 说明\n', '- 当前 review lifecyclemodel 保持 local-first / artifact-first,只读取现有 build run 与 validate-build 产物。\n', '- 当前命令不引入 Python、LangGraph 或 skill 私有 review runtime。\n');
588
+ lines.push('\n## 说明\n', '- 当前 qa lifecyclemodel 保持 local-first / artifact-first,只读取现有 build run 与 validate-build 产物。\n', '- 当前命令不引入 Python、LangGraph 或 skill 私有 QA runtime。\n');
589
589
  return lines.join('');
590
590
  }
591
591
  function renderEnReview(options) {
592
592
  const lines = [
593
- '# lifecyclemodel_review_en\n',
593
+ '# lifecyclemodel_qa_en\n',
594
594
  `- run_id: \`${options.runId}\`\n`,
595
595
  `- logic_version: \`${options.logicVersion}\`\n`,
596
596
  `- run_root: \`${options.runRoot}\`\n`,
@@ -612,13 +612,13 @@ function renderEnReview(options) {
612
612
  return lines.join('');
613
613
  }
614
614
  function renderTiming(options) {
615
- const lines = ['# lifecyclemodel_review_timing\n', `- run_id: \`${options.runId}\`\n`];
615
+ const lines = ['# lifecyclemodel_qa_timing\n', `- run_id: \`${options.runId}\`\n`];
616
616
  if (options.startTs && options.endTs) {
617
617
  const started = Date.parse(options.startTs);
618
618
  const ended = Date.parse(options.endTs);
619
619
  if (!Number.isFinite(started) || !Number.isFinite(ended)) {
620
620
  throw new CliError('Expected --start-ts and --end-ts to be valid ISO timestamps.', {
621
- code: 'LIFECYCLEMODEL_REVIEW_INVALID_TIMESTAMP',
621
+ code: 'LIFECYCLEMODEL_QA_INVALID_TIMESTAMP',
622
622
  exitCode: 2,
623
623
  });
624
624
  }
@@ -630,14 +630,14 @@ function renderTiming(options) {
630
630
  lines.push('- major time consumers: model JSON parsing, validation issue aggregation, artifact checks.\n');
631
631
  return lines.join('');
632
632
  }
633
- export async function runLifecyclemodelReview(options) {
633
+ export async function runLifecyclemodelQa(options) {
634
634
  const layout = resolveLayout(options);
635
635
  ensureRunRootExists(layout);
636
636
  readRequiredRunManifest(layout);
637
637
  const invocationIndex = readInvocationIndex(layout);
638
638
  const validationAggregate = readValidationAggregate(layout);
639
639
  const modelEntries = discoverModelEntries(layout);
640
- const logicVersion = options.logicVersion?.trim() || 'lifecyclemodel-review-v1.0';
640
+ const logicVersion = options.logicVersion?.trim() || 'lifecyclemodel-qa-v1.0';
641
641
  const now = options.now ?? (() => new Date());
642
642
  const generatedAt = now();
643
643
  const reviewedModels = modelEntries.map((entry) => buildModelReview(entry, validationAggregate));
@@ -646,7 +646,7 @@ export async function runLifecyclemodelReview(options) {
646
646
  const report = {
647
647
  schema_version: 1,
648
648
  generated_at_utc: generatedAt.toISOString(),
649
- status: 'completed_local_lifecyclemodel_review',
649
+ status: 'completed_local_lifecyclemodel_qa',
650
650
  run_id: layout.runId,
651
651
  run_root: layout.runRoot,
652
652
  out_dir: layout.outDir,
@@ -666,8 +666,8 @@ export async function runLifecyclemodelReview(options) {
666
666
  model_summaries: layout.modelSummariesPath,
667
667
  findings: layout.findingsPath,
668
668
  summary: layout.summaryPath,
669
- review_zh: layout.reviewZhPath,
670
- review_en: layout.reviewEnPath,
669
+ qa_zh: layout.reviewZhPath,
670
+ qa_en: layout.reviewEnPath,
671
671
  timing: layout.timingPath,
672
672
  report: layout.reportPath,
673
673
  },
@@ -724,4 +724,4 @@ export const __testInternals = {
724
724
  renderEnReview,
725
725
  renderTiming,
726
726
  };
727
- //# sourceMappingURL=review-lifecyclemodel.js.map
727
+ //# sourceMappingURL=lifecyclemodel-qa.js.map