@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.
- package/README.md +97 -16
- package/dist/src/cli.js +1429 -131
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-author.js +100 -0
- package/dist/src/lib/dataset-author.js.map +1 -0
- package/dist/src/lib/dataset-bilingual.js +545 -0
- package/dist/src/lib/dataset-bilingual.js.map +1 -0
- package/dist/src/lib/dataset-contract.js +350 -0
- package/dist/src/lib/dataset-contract.js.map +1 -0
- package/dist/src/lib/dataset-evidence-search.js +636 -0
- package/dist/src/lib/dataset-evidence-search.js.map +1 -0
- package/dist/src/lib/dataset-import-lca.js +171 -0
- package/dist/src/lib/dataset-import-lca.js.map +1 -0
- package/dist/src/lib/dataset-remote-refresh.js +166 -0
- package/dist/src/lib/dataset-remote-refresh.js.map +1 -0
- package/dist/src/lib/dataset-remote-verify.js +543 -0
- package/dist/src/lib/dataset-remote-verify.js.map +1 -0
- package/dist/src/lib/dataset-validate.js +63 -7
- package/dist/src/lib/dataset-validate.js.map +1 -1
- package/dist/src/lib/flow-fetch-rows.js +12 -12
- package/dist/src/lib/flow-fetch-rows.js.map +1 -1
- package/dist/src/lib/flow-payload-validation.js +51 -0
- package/dist/src/lib/flow-payload-validation.js.map +1 -0
- package/dist/src/lib/flow-publish-reviewed-data.js +16 -0
- package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +182 -12
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/{review-flow.js → flow-qa.js} +86 -28
- package/dist/src/lib/flow-qa.js.map +1 -0
- package/dist/src/lib/identity-preflight.js +1021 -0
- package/dist/src/lib/identity-preflight.js.map +1 -0
- package/dist/src/lib/{review-lifecyclemodel.js → lifecyclemodel-qa.js} +54 -54
- package/dist/src/lib/lifecyclemodel-qa.js.map +1 -0
- package/dist/src/lib/process-auto-build.js +147 -0
- package/dist/src/lib/process-auto-build.js.map +1 -1
- package/dist/src/lib/process-dedup-review.js +51 -0
- package/dist/src/lib/process-dedup-review.js.map +1 -1
- package/dist/src/lib/process-flow-build-plan.js +1071 -0
- package/dist/src/lib/process-flow-build-plan.js.map +1 -0
- package/dist/src/lib/process-payload-validation.js +14 -7
- package/dist/src/lib/process-payload-validation.js.map +1 -1
- package/dist/src/lib/process-publish-build.js +122 -4
- package/dist/src/lib/process-publish-build.js.map +1 -1
- package/dist/src/lib/{review-process.js → process-qa.js} +259 -117
- package/dist/src/lib/process-qa.js.map +1 -0
- package/dist/src/lib/process-refresh-references.js +19 -10
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-required-fields.js +810 -0
- package/dist/src/lib/process-required-fields.js.map +1 -0
- package/dist/src/lib/process-save-draft-run.js +4 -1
- package/dist/src/lib/process-save-draft-run.js.map +1 -1
- package/dist/src/lib/publish.js +100 -0
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/runtime-rulesets.js +283 -0
- package/dist/src/lib/runtime-rulesets.js.map +1 -0
- package/package.json +2 -2
- package/dist/src/lib/review-flow.js.map +0 -1
- package/dist/src/lib/review-lifecyclemodel.js.map +0 -1
- 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, '
|
|
133
|
-
reviewZhPath: path.join(outDir, '
|
|
134
|
-
reviewEnPath: path.join(outDir, '
|
|
135
|
-
timingPath: path.join(outDir, '
|
|
136
|
-
reportPath: path.join(outDir, '
|
|
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
|
|
143
|
-
code: '
|
|
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
|
|
150
|
-
code: '
|
|
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
|
|
159
|
-
code: '
|
|
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, '
|
|
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
|
|
169
|
-
code: '
|
|
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
|
|
189
|
-
code: '
|
|
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
|
|
201
|
-
code: '
|
|
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
|
|
220
|
-
code: '
|
|
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
|
|
236
|
-
code: '
|
|
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, '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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
|
|
349
|
-
code: '
|
|
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, '
|
|
392
|
-
const connections = readOptionalJsonArray(entry.connectionsPath, '
|
|
393
|
-
const processCatalog = readOptionalJsonArray(entry.processCatalogPath, '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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
|
-
'
|
|
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
|
-
'#
|
|
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
|
|
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', '- 当前
|
|
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
|
-
'#
|
|
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 = ['#
|
|
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: '
|
|
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
|
|
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-
|
|
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: '
|
|
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
|
-
|
|
670
|
-
|
|
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=
|
|
727
|
+
//# sourceMappingURL=lifecyclemodel-qa.js.map
|