@tiangong-lca/cli 0.0.6 → 0.0.8

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 (90) hide show
  1. package/README.md +154 -30
  2. package/dist/src/cli.js +2235 -149
  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-local.js +231 -0
  15. package/dist/src/lib/dataset-local.js.map +1 -0
  16. package/dist/src/lib/dataset-references-rewrite.js +214 -0
  17. package/dist/src/lib/dataset-references-rewrite.js.map +1 -0
  18. package/dist/src/lib/dataset-remote-refresh.js +166 -0
  19. package/dist/src/lib/dataset-remote-refresh.js.map +1 -0
  20. package/dist/src/lib/dataset-remote-verify.js +543 -0
  21. package/dist/src/lib/dataset-remote-verify.js.map +1 -0
  22. package/dist/src/lib/dataset-validate.js +247 -0
  23. package/dist/src/lib/dataset-validate.js.map +1 -0
  24. package/dist/src/lib/flow-payload-validation.js +51 -0
  25. package/dist/src/lib/flow-payload-validation.js.map +1 -0
  26. package/dist/src/lib/flow-publish-reviewed-data.js +16 -0
  27. package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
  28. package/dist/src/lib/flow-publish-version.js +182 -12
  29. package/dist/src/lib/flow-publish-version.js.map +1 -1
  30. package/dist/src/lib/flow-regen-product.js +2 -10
  31. package/dist/src/lib/flow-regen-product.js.map +1 -1
  32. package/dist/src/lib/flow-remediate.js +4 -8
  33. package/dist/src/lib/flow-remediate.js.map +1 -1
  34. package/dist/src/lib/identity-preflight.js +1021 -0
  35. package/dist/src/lib/identity-preflight.js.map +1 -0
  36. package/dist/src/lib/lifecyclemodel-auto-build.js +11 -8
  37. package/dist/src/lib/lifecyclemodel-auto-build.js.map +1 -1
  38. package/dist/src/lib/lifecyclemodel-graph.js +248 -0
  39. package/dist/src/lib/lifecyclemodel-graph.js.map +1 -0
  40. package/dist/src/lib/lifecyclemodel-publish-build.js +1 -1
  41. package/dist/src/lib/lifecyclemodel-publish-build.js.map +1 -1
  42. package/dist/src/lib/lifecyclemodel-save-draft-run.js +245 -0
  43. package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -0
  44. package/dist/src/lib/lifecyclemodel-validate-build.js +1 -1
  45. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
  46. package/dist/src/lib/process-auto-build.js +158 -8
  47. package/dist/src/lib/process-auto-build.js.map +1 -1
  48. package/dist/src/lib/process-batch-build.js +6 -3
  49. package/dist/src/lib/process-batch-build.js.map +1 -1
  50. package/dist/src/lib/process-dedup-review.js +921 -0
  51. package/dist/src/lib/process-dedup-review.js.map +1 -0
  52. package/dist/src/lib/process-flow-build-plan.js +1071 -0
  53. package/dist/src/lib/process-flow-build-plan.js.map +1 -0
  54. package/dist/src/lib/process-payload-validation.js +57 -0
  55. package/dist/src/lib/process-payload-validation.js.map +1 -0
  56. package/dist/src/lib/process-publish-build.js +126 -10
  57. package/dist/src/lib/process-publish-build.js.map +1 -1
  58. package/dist/src/lib/process-refresh-references.js +1037 -0
  59. package/dist/src/lib/process-refresh-references.js.map +1 -0
  60. package/dist/src/lib/process-required-fields.js +810 -0
  61. package/dist/src/lib/process-required-fields.js.map +1 -0
  62. package/dist/src/lib/process-resume-build.js +4 -6
  63. package/dist/src/lib/process-resume-build.js.map +1 -1
  64. package/dist/src/lib/process-save-draft-run.js +35 -13
  65. package/dist/src/lib/process-save-draft-run.js.map +1 -1
  66. package/dist/src/lib/process-scope-statistics.js +859 -0
  67. package/dist/src/lib/process-scope-statistics.js.map +1 -0
  68. package/dist/src/lib/process-verify-rows.js +250 -0
  69. package/dist/src/lib/process-verify-rows.js.map +1 -0
  70. package/dist/src/lib/publish.js +101 -1
  71. package/dist/src/lib/publish.js.map +1 -1
  72. package/dist/src/lib/remote.js +4 -4
  73. package/dist/src/lib/remote.js.map +1 -1
  74. package/dist/src/lib/review-flow.js +58 -0
  75. package/dist/src/lib/review-flow.js.map +1 -1
  76. package/dist/src/lib/review-lifecyclemodel.js +2 -2
  77. package/dist/src/lib/review-lifecyclemodel.js.map +1 -1
  78. package/dist/src/lib/review-process.js +150 -2
  79. package/dist/src/lib/review-process.js.map +1 -1
  80. package/dist/src/lib/runtime-rulesets.js +283 -0
  81. package/dist/src/lib/runtime-rulesets.js.map +1 -0
  82. package/dist/src/lib/tidas-sdk-package-validator.js +28 -9
  83. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  84. package/dist/src/lib/tidas-sdk-validation.js +96 -0
  85. package/dist/src/lib/tidas-sdk-validation.js.map +1 -0
  86. package/dist/src/lib/user-api-key.js +1 -1
  87. package/dist/src/lib/user-api-key.js.map +1 -1
  88. package/package.json +5 -5
  89. /package/bin/{tiangong.d.ts → tiangong-lca.d.ts} +0 -0
  90. /package/bin/{tiangong.js → tiangong-lca.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"review-lifecyclemodel.js","sourceRoot":"","sources":["../../../src/lib/review-lifecyclemodel.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n writeTextArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { ValidationIssue } from './validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\ntype ModelEntry = {\n runName: string;\n modelFiles: string[];\n summaryPath: string;\n connectionsPath: string;\n processCatalogPath: string;\n};\n\ntype ModelFileReviewInfo = {\n modelFile: string;\n modelUuid: string;\n modelVersion: string;\n referenceProcessInternalId: string | null;\n resultingProcessUuid: string | null;\n processInstanceCount: number;\n zeroMultiplicationFactorCount: number;\n};\n\ntype LifecyclemodelValidationAggregate = {\n ok: boolean | null;\n reportPath: string | null;\n modelReports: Map<string, LifecyclemodelModelValidationSummary>;\n};\n\ntype LifecyclemodelModelValidationSummary = {\n ok: boolean | null;\n reportFile: string | null;\n engineCount: number;\n issues: ValidationIssue[];\n};\n\ntype SeverityCounts = {\n error: number;\n warning: number;\n info: number;\n};\n\nexport type LifecyclemodelReviewFinding = {\n run_name: string;\n model_file: string | null;\n severity: 'error' | 'warning' | 'info';\n rule_id: string;\n source: 'validation' | 'review';\n message: string;\n evidence: JsonObject;\n};\n\nexport type LifecyclemodelReviewModelSummary = {\n run_name: string;\n model_files: string[];\n model_uuids: string[];\n model_versions: string[];\n reference_process_uuids: string[];\n reference_process_internal_ids: string[];\n resulting_process_uuids: string[];\n summary_process_count: number | null;\n process_instance_count: number;\n summary_edge_count: number | null;\n connection_count: number | null;\n process_catalog_count: number | null;\n multiplication_factor_count: number;\n zero_multiplication_factor_count: number;\n validation: {\n available: boolean;\n ok: boolean | null;\n report_file: string | null;\n engine_count: number;\n issue_count: number;\n };\n artifacts: {\n summary: string | null;\n connections: string | null;\n process_catalog: string | null;\n };\n finding_count: number;\n severity_counts: SeverityCounts;\n};\n\nexport type LifecyclemodelReviewReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_lifecyclemodel_review';\n run_id: string;\n run_root: string;\n out_dir: string;\n logic_version: string;\n model_count: number;\n finding_count: number;\n severity_counts: SeverityCounts;\n validation: {\n available: boolean;\n ok: boolean | null;\n report: string | null;\n };\n files: {\n run_manifest: string;\n invocation_index: string;\n validation_report: string | null;\n model_summaries: string;\n findings: string;\n summary: string;\n review_zh: string;\n review_en: string;\n timing: string;\n report: string;\n };\n model_summaries: LifecyclemodelReviewModelSummary[];\n next_actions: string[];\n};\n\nexport type RunLifecyclemodelReviewOptions = {\n runDir: string;\n outDir: string;\n startTs?: string;\n endTs?: string;\n logicVersion?: string;\n now?: () => Date;\n cwd?: string;\n};\n\nexport type LifecyclemodelReviewLayout = {\n runId: string;\n runRoot: string;\n outDir: string;\n modelsDir: string;\n reportsDir: string;\n manifestsDir: string;\n runManifestPath: string;\n invocationIndexPath: string;\n validationReportPath: string;\n modelSummariesPath: string;\n findingsPath: string;\n summaryPath: string;\n reviewZhPath: string;\n reviewEnPath: string;\n timingPath: string;\n reportPath: string;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction deepGet(value: unknown, pathParts: string[]): unknown {\n let current: unknown = value;\n for (const part of pathParts) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[part];\n }\n return current;\n}\n\nfunction listify(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (value === undefined || value === null) {\n return [];\n }\n return [value];\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n return null;\n}\n\nfunction toNonNegativeInteger(value: unknown): number | null {\n const parsed = toNumber(value);\n if (parsed === null || !Number.isInteger(parsed) || parsed < 0) {\n return null;\n }\n return parsed;\n}\n\nfunction uniqueStrings(values: Array<string | null | undefined>): string[] {\n return [\n ...new Set(\n values.filter(\n (value): value is string => typeof value === 'string' && value.trim().length > 0,\n ),\n ),\n ];\n}\n\nfunction copyJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction emptySeverityCounts(): SeverityCounts {\n return {\n error: 0,\n warning: 0,\n info: 0,\n };\n}\n\nfunction severityCounts(findings: LifecyclemodelReviewFinding[]): SeverityCounts {\n return findings.reduce<SeverityCounts>((counts, finding) => {\n counts[finding.severity] += 1;\n return counts;\n }, emptySeverityCounts());\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonObject {\n if (!existsSync(filePath)) {\n throw new CliError(`Required lifecyclemodel ${label} artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction readOptionalJsonObject(\n filePath: string,\n invalidCode: string,\n label: string,\n): JsonObject | null {\n if (!existsSync(filePath)) {\n return null;\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction readOptionalJsonArray(\n filePath: string,\n invalidCode: string,\n label: string,\n): unknown[] | null {\n if (!existsSync(filePath)) {\n return null;\n }\n\n const value = readJsonArtifact(filePath);\n if (!Array.isArray(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON array: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction buildLayout(runRoot: string, outDir: string): LifecyclemodelReviewLayout {\n const runId = path.basename(runRoot);\n return {\n runId,\n runRoot,\n outDir,\n modelsDir: path.join(runRoot, 'models'),\n reportsDir: path.join(runRoot, 'reports'),\n manifestsDir: path.join(runRoot, 'manifests'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n validationReportPath: path.join(\n runRoot,\n 'reports',\n 'lifecyclemodel-validate-build-report.json',\n ),\n modelSummariesPath: path.join(outDir, 'model_summaries.jsonl'),\n findingsPath: path.join(outDir, 'findings.jsonl'),\n summaryPath: path.join(outDir, 'lifecyclemodel_review_summary.json'),\n reviewZhPath: path.join(outDir, 'lifecyclemodel_review_zh.md'),\n reviewEnPath: path.join(outDir, 'lifecyclemodel_review_en.md'),\n timingPath: path.join(outDir, 'lifecyclemodel_review_timing.md'),\n reportPath: path.join(outDir, 'lifecyclemodel_review_report.json'),\n };\n}\n\nfunction resolveLayout(options: RunLifecyclemodelReviewOptions): LifecyclemodelReviewLayout {\n const runDir = nonEmptyString(options.runDir);\n if (!runDir) {\n throw new CliError('Missing required --run-dir for review lifecyclemodel.', {\n code: 'LIFECYCLEMODEL_REVIEW_RUN_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = nonEmptyString(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir for review lifecyclemodel.', {\n code: 'LIFECYCLEMODEL_REVIEW_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return buildLayout(path.resolve(runDir), path.resolve(outDir));\n}\n\nfunction ensureRunRootExists(layout: LifecyclemodelReviewLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`lifecyclemodel review run root not found: ${layout.runRoot}`, {\n code: 'LIFECYCLEMODEL_REVIEW_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: LifecyclemodelReviewLayout): JsonObject {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_MISSING',\n 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(\n `lifecyclemodel review run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n },\n );\n }\n\n return manifest;\n}\n\nfunction readInvocationIndex(layout: LifecyclemodelReviewLayout): JsonObject {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected lifecyclemodel review invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected lifecyclemodel review invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction discoverModelEntries(layout: LifecyclemodelReviewLayout): ModelEntry[] {\n const runNames = existsSync(layout.modelsDir) ? readdirSync(layout.modelsDir).sort() : [];\n const entries = runNames.flatMap((runName) => {\n const lifecyclemodelsDir = path.join(\n layout.modelsDir,\n runName,\n 'tidas_bundle',\n 'lifecyclemodels',\n );\n if (!existsSync(lifecyclemodelsDir)) {\n return [];\n }\n\n const modelFiles = readdirSync(lifecyclemodelsDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => path.join(lifecyclemodelsDir, entry));\n\n if (modelFiles.length === 0) {\n throw new CliError(\n `lifecyclemodel review found a bundle without lifecyclemodel JSON files: ${lifecyclemodelsDir}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_MODELS_EMPTY',\n exitCode: 2,\n },\n );\n }\n\n return [\n {\n runName,\n modelFiles,\n summaryPath: path.join(layout.modelsDir, runName, 'summary.json'),\n connectionsPath: path.join(layout.modelsDir, runName, 'connections.json'),\n processCatalogPath: path.join(layout.modelsDir, runName, 'process-catalog.json'),\n },\n ];\n });\n\n if (entries.length === 0) {\n throw new CliError(\n `lifecyclemodel review run does not contain any model bundles: ${layout.modelsDir}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_MODELS_NOT_FOUND',\n exitCode: 2,\n },\n );\n }\n\n return entries;\n}\n\nfunction normalizeValidationIssue(raw: unknown): ValidationIssue {\n if (!isRecord(raw)) {\n return {\n issue_code: 'validation_issue',\n severity: 'error',\n category: 'unknown',\n file_path: '<unknown>',\n message: String(raw),\n location: '<root>',\n context: {},\n };\n }\n\n const severity =\n raw.severity === 'warning' || raw.severity === 'info' || raw.severity === 'error'\n ? raw.severity\n : 'error';\n\n return {\n issue_code: nonEmptyString(raw.issue_code) ?? 'validation_issue',\n severity,\n category: nonEmptyString(raw.category) ?? 'unknown',\n file_path: nonEmptyString(raw.file_path) ?? '<unknown>',\n message: nonEmptyString(raw.message) ?? JSON.stringify(raw),\n location: nonEmptyString(raw.location) ?? '<root>',\n context: isRecord(raw.context) ? raw.context : {},\n };\n}\n\nfunction collectValidationIssues(validation: JsonObject): ValidationIssue[] {\n const executionReports = Array.isArray(validation.reports) ? validation.reports : [];\n const seen = new Set<string>();\n const issues: ValidationIssue[] = [];\n\n executionReports.forEach((report) => {\n if (!isRecord(report) || !isRecord(report.report)) {\n return;\n }\n\n const rawIssues = Array.isArray(report.report.issues) ? report.report.issues : [];\n rawIssues.forEach((rawIssue) => {\n const issue = normalizeValidationIssue(rawIssue);\n const key = JSON.stringify([\n issue.issue_code,\n issue.severity,\n issue.category,\n issue.file_path,\n issue.message,\n issue.location,\n ]);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n issues.push(issue);\n });\n });\n\n return issues;\n}\n\nfunction readValidationAggregate(\n layout: LifecyclemodelReviewLayout,\n): LifecyclemodelValidationAggregate {\n const aggregate = readOptionalJsonObject(\n layout.validationReportPath,\n 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n 'validate-build report',\n );\n\n if (!aggregate) {\n return {\n ok: null,\n reportPath: null,\n modelReports: new Map(),\n };\n }\n\n if (aggregate.model_reports !== undefined && !Array.isArray(aggregate.model_reports)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build report to contain a model_reports array: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const modelReports = new Map<string, LifecyclemodelModelValidationSummary>();\n for (const rawEntry of Array.isArray(aggregate.model_reports) ? aggregate.model_reports : []) {\n if (!isRecord(rawEntry)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build model report entry JSON object: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const runName = nonEmptyString(rawEntry.run_name);\n if (!runName || !isRecord(rawEntry.validation)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build model report entry to contain run_name and validation: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const validation = rawEntry.validation;\n const executionReports = Array.isArray(validation.reports) ? validation.reports : [];\n modelReports.set(runName, {\n ok: typeof validation.ok === 'boolean' ? validation.ok : null,\n reportFile: nonEmptyString(rawEntry.report_file),\n engineCount: executionReports.length,\n issues: collectValidationIssues(validation),\n });\n }\n\n return {\n ok: typeof aggregate.ok === 'boolean' ? aggregate.ok : null,\n reportPath: layout.validationReportPath,\n modelReports,\n };\n}\n\nfunction modelRoot(value: JsonObject): JsonObject {\n return isRecord(value.lifeCycleModelDataSet)\n ? (value.lifeCycleModelDataSet as JsonObject)\n : value;\n}\n\nfunction readModelFileReviewInfo(filePath: string): ModelFileReviewInfo {\n const payload = readJsonArtifact(filePath);\n if (!isRecord(payload)) {\n throw new CliError(`Expected lifecyclemodel review payload JSON object: ${filePath}`, {\n code: 'LIFECYCLEMODEL_REVIEW_MODEL_INVALID',\n exitCode: 2,\n });\n }\n\n const root = modelRoot(payload);\n const processInstances = listify(\n deepGet(root, ['lifeCycleModelInformation', 'technology', 'processes', 'processInstance']),\n ).filter(isRecord);\n const zeroMultiplicationFactorCount = processInstances.filter(\n (instance) => toNumber(instance['@multiplicationFactor']) === 0,\n ).length;\n\n return {\n modelFile: filePath,\n modelUuid:\n nonEmptyString(\n deepGet(root, ['lifeCycleModelInformation', 'dataSetInformation', 'common:UUID']),\n ) ?? path.basename(filePath),\n modelVersion:\n nonEmptyString(\n deepGet(root, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n ) ?? 'unknown',\n referenceProcessInternalId: nonEmptyString(\n deepGet(root, [\n 'lifeCycleModelInformation',\n 'quantitativeReference',\n 'referenceToReferenceProcess',\n ]),\n ),\n resultingProcessUuid: nonEmptyString(\n deepGet(root, [\n 'lifeCycleModelInformation',\n 'dataSetInformation',\n 'referenceToResultingProcess',\n '@refObjectId',\n ]),\n ),\n processInstanceCount: processInstances.length,\n zeroMultiplicationFactorCount,\n };\n}\n\nfunction makeFinding(\n runName: string,\n modelFile: string | null,\n severity: LifecyclemodelReviewFinding['severity'],\n ruleId: string,\n source: LifecyclemodelReviewFinding['source'],\n message: string,\n evidence: JsonObject,\n): LifecyclemodelReviewFinding {\n return {\n run_name: runName,\n model_file: modelFile,\n severity,\n rule_id: ruleId,\n source,\n message,\n evidence,\n };\n}\n\nfunction buildModelReview(\n entry: ModelEntry,\n validationAggregate: LifecyclemodelValidationAggregate,\n): {\n summary: LifecyclemodelReviewModelSummary;\n findings: LifecyclemodelReviewFinding[];\n} {\n const summaryArtifact = readOptionalJsonObject(\n entry.summaryPath,\n 'LIFECYCLEMODEL_REVIEW_SUMMARY_INVALID',\n 'summary',\n );\n const connections = readOptionalJsonArray(\n entry.connectionsPath,\n 'LIFECYCLEMODEL_REVIEW_CONNECTIONS_INVALID',\n 'connections',\n );\n const processCatalog = readOptionalJsonArray(\n entry.processCatalogPath,\n 'LIFECYCLEMODEL_REVIEW_PROCESS_CATALOG_INVALID',\n 'process-catalog',\n );\n const modelFileInfos = entry.modelFiles.map((modelFile) => readModelFileReviewInfo(modelFile));\n const validation = validationAggregate.modelReports.get(entry.runName) ?? {\n ok: null,\n reportFile: null,\n engineCount: 0,\n issues: [],\n };\n\n const findings: LifecyclemodelReviewFinding[] = [];\n validation.issues.forEach((issue) => {\n findings.push(\n makeFinding(\n entry.runName,\n issue.file_path,\n issue.severity,\n `validation:${issue.issue_code}`,\n 'validation',\n issue.message,\n {\n category: issue.category,\n location: issue.location,\n context: issue.context,\n },\n ),\n );\n });\n\n const modelUuids = uniqueStrings(modelFileInfos.map((info) => info.modelUuid));\n const modelVersions = uniqueStrings(modelFileInfos.map((info) => info.modelVersion));\n const resultingProcessUuids = uniqueStrings(\n modelFileInfos.map((info) => info.resultingProcessUuid),\n );\n const referenceProcessInternalIds = uniqueStrings(\n modelFileInfos.map((info) => info.referenceProcessInternalId),\n );\n const referenceProcessUuids = uniqueStrings([\n nonEmptyString(summaryArtifact?.reference_process_uuid),\n ]);\n const processInstanceCount = modelFileInfos.reduce(\n (sum, info) => sum + info.processInstanceCount,\n 0,\n );\n const zeroMultiplicationFactorCount = modelFileInfos.reduce(\n (sum, info) => sum + info.zeroMultiplicationFactorCount,\n 0,\n );\n const summaryProcessCount = toNonNegativeInteger(summaryArtifact?.process_count);\n const summaryEdgeCount = toNonNegativeInteger(summaryArtifact?.edge_count);\n const multiplicationFactors = isRecord(summaryArtifact?.multiplication_factors)\n ? (summaryArtifact?.multiplication_factors as JsonObject)\n : null;\n const multiplicationFactorCount = multiplicationFactors\n ? Object.keys(multiplicationFactors).length\n : 0;\n\n if (!summaryArtifact) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_model_summary',\n 'review',\n 'Model bundle is missing summary.json generated by lifecyclemodel auto-build.',\n {\n summary_path: entry.summaryPath,\n },\n ),\n );\n }\n\n if (!connections) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_connections_artifact',\n 'review',\n 'Model bundle is missing connections.json generated by lifecyclemodel auto-build.',\n {\n connections_path: entry.connectionsPath,\n },\n ),\n );\n }\n\n if (!processCatalog) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_process_catalog',\n 'review',\n 'Model bundle is missing process-catalog.json generated by lifecyclemodel auto-build.',\n {\n process_catalog_path: entry.processCatalogPath,\n },\n ),\n );\n }\n\n if (referenceProcessUuids.length === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_reference_process_uuid',\n 'review',\n 'Review could not resolve reference_process_uuid from summary.json.',\n {\n summary_path: summaryArtifact ? entry.summaryPath : null,\n },\n ),\n );\n }\n\n if (resultingProcessUuids.length === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_resulting_process_ref',\n 'review',\n 'Review could not resolve referenceToResultingProcess from the lifecyclemodel payload.',\n {\n model_files: entry.modelFiles,\n },\n ),\n );\n }\n\n if (processInstanceCount === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'error',\n 'empty_process_instances',\n 'review',\n 'Lifecyclemodel payload does not contain any processInstance entries.',\n {\n model_files: entry.modelFiles,\n },\n ),\n );\n }\n\n if (summaryProcessCount !== null && summaryProcessCount !== processInstanceCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'process_count_mismatch',\n 'review',\n 'summary.json process_count does not match the number of processInstance entries in the payload.',\n {\n summary_process_count: summaryProcessCount,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n if (connections && summaryEdgeCount !== null && connections.length !== summaryEdgeCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'edge_count_mismatch',\n 'review',\n 'summary.json edge_count does not match the connections.json row count.',\n {\n summary_edge_count: summaryEdgeCount,\n connection_count: connections.length,\n },\n ),\n );\n }\n\n if (processCatalog && processCatalog.length !== processInstanceCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'process_catalog_count_mismatch',\n 'review',\n 'process-catalog.json row count does not match the number of processInstance entries in the payload.',\n {\n process_catalog_count: processCatalog.length,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n if (\n summaryArtifact &&\n multiplicationFactors &&\n multiplicationFactorCount !== processInstanceCount\n ) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'multiplication_factor_count_mismatch',\n 'review',\n 'summary.json multiplication_factors count does not match the number of processInstance entries in the payload.',\n {\n multiplication_factor_count: multiplicationFactorCount,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n const counts = severityCounts(findings);\n return {\n summary: {\n run_name: entry.runName,\n model_files: entry.modelFiles,\n model_uuids: modelUuids,\n model_versions: modelVersions,\n reference_process_uuids: referenceProcessUuids,\n reference_process_internal_ids: referenceProcessInternalIds,\n resulting_process_uuids: resultingProcessUuids,\n summary_process_count: summaryProcessCount,\n process_instance_count: processInstanceCount,\n summary_edge_count: summaryEdgeCount,\n connection_count: connections ? connections.length : null,\n process_catalog_count: processCatalog ? processCatalog.length : null,\n multiplication_factor_count: multiplicationFactorCount,\n zero_multiplication_factor_count: zeroMultiplicationFactorCount,\n validation: {\n available: validationAggregate.reportPath !== null,\n ok: validation.ok,\n report_file: validation.reportFile,\n engine_count: validation.engineCount,\n issue_count: validation.issues.length,\n },\n artifacts: {\n summary: summaryArtifact ? entry.summaryPath : null,\n connections: connections ? entry.connectionsPath : null,\n process_catalog: processCatalog ? entry.processCatalogPath : null,\n },\n finding_count: findings.length,\n severity_counts: counts,\n },\n findings,\n };\n}\n\nfunction buildInvocationIndex(\n layout: LifecyclemodelReviewLayout,\n invocationIndex: JsonObject,\n options: RunLifecyclemodelReviewOptions,\n now: Date,\n): JsonObject {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = [\n 'review',\n 'lifecyclemodel',\n '--run-dir',\n options.runDir,\n '--out-dir',\n options.outDir,\n ];\n\n if (nonEmptyString(options.logicVersion)) {\n command.push('--logic-version', options.logicVersion as string);\n }\n if (nonEmptyString(options.startTs)) {\n command.push('--start-ts', options.startTs as string);\n }\n if (nonEmptyString(options.endTs)) {\n command.push('--end-ts', options.endTs as string);\n }\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n },\n ],\n };\n}\n\nfunction buildNextActions(\n layout: LifecyclemodelReviewLayout,\n validationAggregate: LifecyclemodelValidationAggregate,\n): string[] {\n return [\n `inspect: ${layout.findingsPath}`,\n validationAggregate.reportPath\n ? `inspect: ${validationAggregate.reportPath}`\n : `run: tiangong lifecyclemodel validate-build --run-dir ${layout.runRoot}`,\n `run: tiangong lifecyclemodel publish-build --run-dir ${layout.runRoot}`,\n ];\n}\n\nfunction renderZhReview(options: {\n runId: string;\n logicVersion: string;\n runRoot: string;\n modelSummaries: LifecyclemodelReviewModelSummary[];\n findings: LifecyclemodelReviewFinding[];\n validation: LifecyclemodelReviewReport['validation'];\n}): string {\n const lines = [\n '# lifecyclemodel_review_zh\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- run_root: \\`${options.runRoot}\\`\\n`,\n '\\n## 总览\\n',\n `- model bundle 数量: **${options.modelSummaries.length}**\\n`,\n `- findings 数量: **${options.findings.length}**\\n`,\n `- validation report: \\`${options.validation.available ? 'available' : 'missing'}\\`\\n`,\n ];\n\n lines.push(\n '\\n## 模型摘要\\n|run name|model uuid 数|processInstance|connections|validation issues|findings|\\n|---|---:|---:|---:|---:|---:|\\n',\n );\n options.modelSummaries.forEach((summary) => {\n lines.push(\n `|${summary.run_name}|${summary.model_uuids.length}|${summary.process_instance_count}|${summary.connection_count ?? 0}|${summary.validation.issue_count}|${summary.finding_count}|\\n`,\n );\n });\n\n lines.push('\\n## Findings\\n');\n if (options.findings.length === 0) {\n lines.push('- 未发现新的 lifecyclemodel review findings。\\n');\n } else {\n lines.push('\\n|run name|severity|source|rule id|message|\\n|---|---|---|---|---|\\n');\n options.findings.slice(0, 200).forEach((finding) => {\n lines.push(\n `|${finding.run_name}|${finding.severity}|${finding.source}|${finding.rule_id}|${finding.message.replace(/\\|/gu, '/')}|\\n`,\n );\n });\n }\n\n lines.push(\n '\\n## 说明\\n',\n '- 当前 review lifecyclemodel 保持 local-first / artifact-first,只读取现有 build run 与 validate-build 产物。\\n',\n '- 当前命令不引入 Python、LangGraph 或 skill 私有 review runtime。\\n',\n );\n\n return lines.join('');\n}\n\nfunction renderEnReview(options: {\n runId: string;\n logicVersion: string;\n runRoot: string;\n modelSummaries: LifecyclemodelReviewModelSummary[];\n findings: LifecyclemodelReviewFinding[];\n validation: LifecyclemodelReviewReport['validation'];\n}): string {\n const lines = [\n '# lifecyclemodel_review_en\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- run_root: \\`${options.runRoot}\\`\\n`,\n '\\n## Summary\\n',\n `- model bundles: **${options.modelSummaries.length}**\\n`,\n `- findings: **${options.findings.length}**\\n`,\n `- validation report: \\`${options.validation.available ? 'available' : 'missing'}\\`\\n`,\n ];\n\n lines.push(\n '\\n## Model overview\\n|run name|model uuids|process instances|connections|validation issues|findings|\\n|---|---:|---:|---:|---:|---:|\\n',\n );\n options.modelSummaries.forEach((summary) => {\n lines.push(\n `|${summary.run_name}|${summary.model_uuids.length}|${summary.process_instance_count}|${summary.connection_count ?? 0}|${summary.validation.issue_count}|${summary.finding_count}|\\n`,\n );\n });\n\n if (options.findings.length > 0) {\n lines.push('\\n## Findings\\n');\n options.findings.slice(0, 100).forEach((finding) => {\n lines.push(`- [${finding.severity}] ${finding.run_name}: ${finding.message}\\n`);\n });\n }\n\n return lines.join('');\n}\n\nfunction renderTiming(options: {\n runId: string;\n startTs?: string;\n endTs?: string;\n modelCount: number;\n}): string {\n const lines = ['# lifecyclemodel_review_timing\\n', `- run_id: \\`${options.runId}\\`\\n`];\n if (options.startTs && options.endTs) {\n const started = Date.parse(options.startTs);\n const ended = Date.parse(options.endTs);\n if (!Number.isFinite(started) || !Number.isFinite(ended)) {\n throw new CliError('Expected --start-ts and --end-ts to be valid ISO timestamps.', {\n code: 'LIFECYCLEMODEL_REVIEW_INVALID_TIMESTAMP',\n exitCode: 2,\n });\n }\n\n lines.push(`- start: \\`${options.startTs}\\`\\n`);\n lines.push(`- end: \\`${options.endTs}\\`\\n`);\n lines.push(`- total elapsed: **${((ended - started) / 60_000).toFixed(2)} min**\\n`);\n }\n\n lines.push(`- model bundles reviewed: \\`${options.modelCount}\\`\\n`);\n lines.push(\n '- major time consumers: model JSON parsing, validation issue aggregation, artifact checks.\\n',\n );\n return lines.join('');\n}\n\nexport async function runLifecyclemodelReview(\n options: RunLifecyclemodelReviewOptions,\n): Promise<LifecyclemodelReviewReport> {\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n const invocationIndex = readInvocationIndex(layout);\n const validationAggregate = readValidationAggregate(layout);\n const modelEntries = discoverModelEntries(layout);\n const logicVersion = options.logicVersion?.trim() || 'lifecyclemodel-review-v1.0';\n const now = options.now ?? (() => new Date());\n const generatedAt = now();\n\n const reviewedModels = modelEntries.map((entry) => buildModelReview(entry, validationAggregate));\n const modelSummaries = reviewedModels.map((model) => model.summary);\n const findings = reviewedModels.flatMap((model) => model.findings);\n const report: LifecyclemodelReviewReport = {\n schema_version: 1,\n generated_at_utc: generatedAt.toISOString(),\n status: 'completed_local_lifecyclemodel_review',\n run_id: layout.runId,\n run_root: layout.runRoot,\n out_dir: layout.outDir,\n logic_version: logicVersion,\n model_count: modelSummaries.length,\n finding_count: findings.length,\n severity_counts: severityCounts(findings),\n validation: {\n available: validationAggregate.reportPath !== null,\n ok: validationAggregate.ok,\n report: validationAggregate.reportPath,\n },\n files: {\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n validation_report: validationAggregate.reportPath,\n model_summaries: layout.modelSummariesPath,\n findings: layout.findingsPath,\n summary: layout.summaryPath,\n review_zh: layout.reviewZhPath,\n review_en: layout.reviewEnPath,\n timing: layout.timingPath,\n report: layout.reportPath,\n },\n model_summaries: modelSummaries,\n next_actions: buildNextActions(layout, validationAggregate),\n };\n\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(layout, invocationIndex, options, generatedAt),\n );\n writeJsonLinesArtifact(layout.modelSummariesPath, modelSummaries);\n writeJsonLinesArtifact(layout.findingsPath, findings);\n writeJsonArtifact(layout.summaryPath, {\n run_id: report.run_id,\n logic_version: report.logic_version,\n model_count: report.model_count,\n finding_count: report.finding_count,\n severity_counts: copyJson(report.severity_counts),\n validation: copyJson(report.validation),\n });\n writeTextArtifact(\n layout.reviewZhPath,\n renderZhReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n runRoot: report.run_root,\n modelSummaries,\n findings,\n validation: report.validation,\n }),\n );\n writeTextArtifact(\n layout.reviewEnPath,\n renderEnReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n runRoot: report.run_root,\n modelSummaries,\n findings,\n validation: report.validation,\n }),\n );\n writeTextArtifact(\n layout.timingPath,\n renderTiming({\n runId: report.run_id,\n startTs: options.startTs,\n endTs: options.endTs,\n modelCount: report.model_count,\n }),\n );\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n readInvocationIndex,\n discoverModelEntries,\n readValidationAggregate,\n readModelFileReviewInfo,\n buildModelReview,\n buildInvocationIndex,\n buildNextActions,\n renderZhReview,\n renderEnReview,\n renderTiming,\n};\n"]}
1
+ {"version":3,"file":"review-lifecyclemodel.js","sourceRoot":"","sources":["../../../src/lib/review-lifecyclemodel.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n writeTextArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { ValidationIssue } from './validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\ntype ModelEntry = {\n runName: string;\n modelFiles: string[];\n summaryPath: string;\n connectionsPath: string;\n processCatalogPath: string;\n};\n\ntype ModelFileReviewInfo = {\n modelFile: string;\n modelUuid: string;\n modelVersion: string;\n referenceProcessInternalId: string | null;\n resultingProcessUuid: string | null;\n processInstanceCount: number;\n zeroMultiplicationFactorCount: number;\n};\n\ntype LifecyclemodelValidationAggregate = {\n ok: boolean | null;\n reportPath: string | null;\n modelReports: Map<string, LifecyclemodelModelValidationSummary>;\n};\n\ntype LifecyclemodelModelValidationSummary = {\n ok: boolean | null;\n reportFile: string | null;\n engineCount: number;\n issues: ValidationIssue[];\n};\n\ntype SeverityCounts = {\n error: number;\n warning: number;\n info: number;\n};\n\nexport type LifecyclemodelReviewFinding = {\n run_name: string;\n model_file: string | null;\n severity: 'error' | 'warning' | 'info';\n rule_id: string;\n source: 'validation' | 'review';\n message: string;\n evidence: JsonObject;\n};\n\nexport type LifecyclemodelReviewModelSummary = {\n run_name: string;\n model_files: string[];\n model_uuids: string[];\n model_versions: string[];\n reference_process_uuids: string[];\n reference_process_internal_ids: string[];\n resulting_process_uuids: string[];\n summary_process_count: number | null;\n process_instance_count: number;\n summary_edge_count: number | null;\n connection_count: number | null;\n process_catalog_count: number | null;\n multiplication_factor_count: number;\n zero_multiplication_factor_count: number;\n validation: {\n available: boolean;\n ok: boolean | null;\n report_file: string | null;\n engine_count: number;\n issue_count: number;\n };\n artifacts: {\n summary: string | null;\n connections: string | null;\n process_catalog: string | null;\n };\n finding_count: number;\n severity_counts: SeverityCounts;\n};\n\nexport type LifecyclemodelReviewReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_lifecyclemodel_review';\n run_id: string;\n run_root: string;\n out_dir: string;\n logic_version: string;\n model_count: number;\n finding_count: number;\n severity_counts: SeverityCounts;\n validation: {\n available: boolean;\n ok: boolean | null;\n report: string | null;\n };\n files: {\n run_manifest: string;\n invocation_index: string;\n validation_report: string | null;\n model_summaries: string;\n findings: string;\n summary: string;\n review_zh: string;\n review_en: string;\n timing: string;\n report: string;\n };\n model_summaries: LifecyclemodelReviewModelSummary[];\n next_actions: string[];\n};\n\nexport type RunLifecyclemodelReviewOptions = {\n runDir: string;\n outDir: string;\n startTs?: string;\n endTs?: string;\n logicVersion?: string;\n now?: () => Date;\n cwd?: string;\n};\n\nexport type LifecyclemodelReviewLayout = {\n runId: string;\n runRoot: string;\n outDir: string;\n modelsDir: string;\n reportsDir: string;\n manifestsDir: string;\n runManifestPath: string;\n invocationIndexPath: string;\n validationReportPath: string;\n modelSummariesPath: string;\n findingsPath: string;\n summaryPath: string;\n reviewZhPath: string;\n reviewEnPath: string;\n timingPath: string;\n reportPath: string;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction deepGet(value: unknown, pathParts: string[]): unknown {\n let current: unknown = value;\n for (const part of pathParts) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[part];\n }\n return current;\n}\n\nfunction listify(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (value === undefined || value === null) {\n return [];\n }\n return [value];\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n return null;\n}\n\nfunction toNonNegativeInteger(value: unknown): number | null {\n const parsed = toNumber(value);\n if (parsed === null || !Number.isInteger(parsed) || parsed < 0) {\n return null;\n }\n return parsed;\n}\n\nfunction uniqueStrings(values: Array<string | null | undefined>): string[] {\n return [\n ...new Set(\n values.filter(\n (value): value is string => typeof value === 'string' && value.trim().length > 0,\n ),\n ),\n ];\n}\n\nfunction copyJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction emptySeverityCounts(): SeverityCounts {\n return {\n error: 0,\n warning: 0,\n info: 0,\n };\n}\n\nfunction severityCounts(findings: LifecyclemodelReviewFinding[]): SeverityCounts {\n return findings.reduce<SeverityCounts>((counts, finding) => {\n counts[finding.severity] += 1;\n return counts;\n }, emptySeverityCounts());\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonObject {\n if (!existsSync(filePath)) {\n throw new CliError(`Required lifecyclemodel ${label} artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction readOptionalJsonObject(\n filePath: string,\n invalidCode: string,\n label: string,\n): JsonObject | null {\n if (!existsSync(filePath)) {\n return null;\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction readOptionalJsonArray(\n filePath: string,\n invalidCode: string,\n label: string,\n): unknown[] | null {\n if (!existsSync(filePath)) {\n return null;\n }\n\n const value = readJsonArtifact(filePath);\n if (!Array.isArray(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON array: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction buildLayout(runRoot: string, outDir: string): LifecyclemodelReviewLayout {\n const runId = path.basename(runRoot);\n return {\n runId,\n runRoot,\n outDir,\n modelsDir: path.join(runRoot, 'models'),\n reportsDir: path.join(runRoot, 'reports'),\n manifestsDir: path.join(runRoot, 'manifests'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n validationReportPath: path.join(\n runRoot,\n 'reports',\n 'lifecyclemodel-validate-build-report.json',\n ),\n modelSummariesPath: path.join(outDir, 'model_summaries.jsonl'),\n findingsPath: path.join(outDir, 'findings.jsonl'),\n summaryPath: path.join(outDir, 'lifecyclemodel_review_summary.json'),\n reviewZhPath: path.join(outDir, 'lifecyclemodel_review_zh.md'),\n reviewEnPath: path.join(outDir, 'lifecyclemodel_review_en.md'),\n timingPath: path.join(outDir, 'lifecyclemodel_review_timing.md'),\n reportPath: path.join(outDir, 'lifecyclemodel_review_report.json'),\n };\n}\n\nfunction resolveLayout(options: RunLifecyclemodelReviewOptions): LifecyclemodelReviewLayout {\n const runDir = nonEmptyString(options.runDir);\n if (!runDir) {\n throw new CliError('Missing required --run-dir for review lifecyclemodel.', {\n code: 'LIFECYCLEMODEL_REVIEW_RUN_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = nonEmptyString(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir for review lifecyclemodel.', {\n code: 'LIFECYCLEMODEL_REVIEW_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return buildLayout(path.resolve(runDir), path.resolve(outDir));\n}\n\nfunction ensureRunRootExists(layout: LifecyclemodelReviewLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`lifecyclemodel review run root not found: ${layout.runRoot}`, {\n code: 'LIFECYCLEMODEL_REVIEW_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: LifecyclemodelReviewLayout): JsonObject {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_MISSING',\n 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(\n `lifecyclemodel review run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n },\n );\n }\n\n return manifest;\n}\n\nfunction readInvocationIndex(layout: LifecyclemodelReviewLayout): JsonObject {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected lifecyclemodel review invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected lifecyclemodel review invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction discoverModelEntries(layout: LifecyclemodelReviewLayout): ModelEntry[] {\n const runNames = existsSync(layout.modelsDir) ? readdirSync(layout.modelsDir).sort() : [];\n const entries = runNames.flatMap((runName) => {\n const lifecyclemodelsDir = path.join(\n layout.modelsDir,\n runName,\n 'tidas_bundle',\n 'lifecyclemodels',\n );\n if (!existsSync(lifecyclemodelsDir)) {\n return [];\n }\n\n const modelFiles = readdirSync(lifecyclemodelsDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => path.join(lifecyclemodelsDir, entry));\n\n if (modelFiles.length === 0) {\n throw new CliError(\n `lifecyclemodel review found a bundle without lifecyclemodel JSON files: ${lifecyclemodelsDir}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_MODELS_EMPTY',\n exitCode: 2,\n },\n );\n }\n\n return [\n {\n runName,\n modelFiles,\n summaryPath: path.join(layout.modelsDir, runName, 'summary.json'),\n connectionsPath: path.join(layout.modelsDir, runName, 'connections.json'),\n processCatalogPath: path.join(layout.modelsDir, runName, 'process-catalog.json'),\n },\n ];\n });\n\n if (entries.length === 0) {\n throw new CliError(\n `lifecyclemodel review run does not contain any model bundles: ${layout.modelsDir}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_MODELS_NOT_FOUND',\n exitCode: 2,\n },\n );\n }\n\n return entries;\n}\n\nfunction normalizeValidationIssue(raw: unknown): ValidationIssue {\n if (!isRecord(raw)) {\n return {\n issue_code: 'validation_issue',\n severity: 'error',\n category: 'unknown',\n file_path: '<unknown>',\n message: String(raw),\n location: '<root>',\n context: {},\n };\n }\n\n const severity =\n raw.severity === 'warning' || raw.severity === 'info' || raw.severity === 'error'\n ? raw.severity\n : 'error';\n\n return {\n issue_code: nonEmptyString(raw.issue_code) ?? 'validation_issue',\n severity,\n category: nonEmptyString(raw.category) ?? 'unknown',\n file_path: nonEmptyString(raw.file_path) ?? '<unknown>',\n message: nonEmptyString(raw.message) ?? JSON.stringify(raw),\n location: nonEmptyString(raw.location) ?? '<root>',\n context: isRecord(raw.context) ? raw.context : {},\n };\n}\n\nfunction collectValidationIssues(validation: JsonObject): ValidationIssue[] {\n const executionReports = Array.isArray(validation.reports) ? validation.reports : [];\n const seen = new Set<string>();\n const issues: ValidationIssue[] = [];\n\n executionReports.forEach((report) => {\n if (!isRecord(report) || !isRecord(report.report)) {\n return;\n }\n\n const rawIssues = Array.isArray(report.report.issues) ? report.report.issues : [];\n rawIssues.forEach((rawIssue) => {\n const issue = normalizeValidationIssue(rawIssue);\n const key = JSON.stringify([\n issue.issue_code,\n issue.severity,\n issue.category,\n issue.file_path,\n issue.message,\n issue.location,\n ]);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n issues.push(issue);\n });\n });\n\n return issues;\n}\n\nfunction readValidationAggregate(\n layout: LifecyclemodelReviewLayout,\n): LifecyclemodelValidationAggregate {\n const aggregate = readOptionalJsonObject(\n layout.validationReportPath,\n 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n 'validate-build report',\n );\n\n if (!aggregate) {\n return {\n ok: null,\n reportPath: null,\n modelReports: new Map(),\n };\n }\n\n if (aggregate.model_reports !== undefined && !Array.isArray(aggregate.model_reports)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build report to contain a model_reports array: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const modelReports = new Map<string, LifecyclemodelModelValidationSummary>();\n for (const rawEntry of Array.isArray(aggregate.model_reports) ? aggregate.model_reports : []) {\n if (!isRecord(rawEntry)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build model report entry JSON object: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const runName = nonEmptyString(rawEntry.run_name);\n if (!runName || !isRecord(rawEntry.validation)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build model report entry to contain run_name and validation: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_REVIEW_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const validation = rawEntry.validation;\n const executionReports = Array.isArray(validation.reports) ? validation.reports : [];\n modelReports.set(runName, {\n ok: typeof validation.ok === 'boolean' ? validation.ok : null,\n reportFile: nonEmptyString(rawEntry.report_file),\n engineCount: executionReports.length,\n issues: collectValidationIssues(validation),\n });\n }\n\n return {\n ok: typeof aggregate.ok === 'boolean' ? aggregate.ok : null,\n reportPath: layout.validationReportPath,\n modelReports,\n };\n}\n\nfunction modelRoot(value: JsonObject): JsonObject {\n return isRecord(value.lifeCycleModelDataSet)\n ? (value.lifeCycleModelDataSet as JsonObject)\n : value;\n}\n\nfunction readModelFileReviewInfo(filePath: string): ModelFileReviewInfo {\n const payload = readJsonArtifact(filePath);\n if (!isRecord(payload)) {\n throw new CliError(`Expected lifecyclemodel review payload JSON object: ${filePath}`, {\n code: 'LIFECYCLEMODEL_REVIEW_MODEL_INVALID',\n exitCode: 2,\n });\n }\n\n const root = modelRoot(payload);\n const processInstances = listify(\n deepGet(root, ['lifeCycleModelInformation', 'technology', 'processes', 'processInstance']),\n ).filter(isRecord);\n const zeroMultiplicationFactorCount = processInstances.filter(\n (instance) => toNumber(instance['@multiplicationFactor']) === 0,\n ).length;\n\n return {\n modelFile: filePath,\n modelUuid:\n nonEmptyString(\n deepGet(root, ['lifeCycleModelInformation', 'dataSetInformation', 'common:UUID']),\n ) ?? path.basename(filePath),\n modelVersion:\n nonEmptyString(\n deepGet(root, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n ) ?? 'unknown',\n referenceProcessInternalId: nonEmptyString(\n deepGet(root, [\n 'lifeCycleModelInformation',\n 'quantitativeReference',\n 'referenceToReferenceProcess',\n ]),\n ),\n resultingProcessUuid: nonEmptyString(\n deepGet(root, [\n 'lifeCycleModelInformation',\n 'dataSetInformation',\n 'referenceToResultingProcess',\n '@refObjectId',\n ]),\n ),\n processInstanceCount: processInstances.length,\n zeroMultiplicationFactorCount,\n };\n}\n\nfunction makeFinding(\n runName: string,\n modelFile: string | null,\n severity: LifecyclemodelReviewFinding['severity'],\n ruleId: string,\n source: LifecyclemodelReviewFinding['source'],\n message: string,\n evidence: JsonObject,\n): LifecyclemodelReviewFinding {\n return {\n run_name: runName,\n model_file: modelFile,\n severity,\n rule_id: ruleId,\n source,\n message,\n evidence,\n };\n}\n\nfunction buildModelReview(\n entry: ModelEntry,\n validationAggregate: LifecyclemodelValidationAggregate,\n): {\n summary: LifecyclemodelReviewModelSummary;\n findings: LifecyclemodelReviewFinding[];\n} {\n const summaryArtifact = readOptionalJsonObject(\n entry.summaryPath,\n 'LIFECYCLEMODEL_REVIEW_SUMMARY_INVALID',\n 'summary',\n );\n const connections = readOptionalJsonArray(\n entry.connectionsPath,\n 'LIFECYCLEMODEL_REVIEW_CONNECTIONS_INVALID',\n 'connections',\n );\n const processCatalog = readOptionalJsonArray(\n entry.processCatalogPath,\n 'LIFECYCLEMODEL_REVIEW_PROCESS_CATALOG_INVALID',\n 'process-catalog',\n );\n const modelFileInfos = entry.modelFiles.map((modelFile) => readModelFileReviewInfo(modelFile));\n const validation = validationAggregate.modelReports.get(entry.runName) ?? {\n ok: null,\n reportFile: null,\n engineCount: 0,\n issues: [],\n };\n\n const findings: LifecyclemodelReviewFinding[] = [];\n validation.issues.forEach((issue) => {\n findings.push(\n makeFinding(\n entry.runName,\n issue.file_path,\n issue.severity,\n `validation:${issue.issue_code}`,\n 'validation',\n issue.message,\n {\n category: issue.category,\n location: issue.location,\n context: issue.context,\n },\n ),\n );\n });\n\n const modelUuids = uniqueStrings(modelFileInfos.map((info) => info.modelUuid));\n const modelVersions = uniqueStrings(modelFileInfos.map((info) => info.modelVersion));\n const resultingProcessUuids = uniqueStrings(\n modelFileInfos.map((info) => info.resultingProcessUuid),\n );\n const referenceProcessInternalIds = uniqueStrings(\n modelFileInfos.map((info) => info.referenceProcessInternalId),\n );\n const referenceProcessUuids = uniqueStrings([\n nonEmptyString(summaryArtifact?.reference_process_uuid),\n ]);\n const processInstanceCount = modelFileInfos.reduce(\n (sum, info) => sum + info.processInstanceCount,\n 0,\n );\n const zeroMultiplicationFactorCount = modelFileInfos.reduce(\n (sum, info) => sum + info.zeroMultiplicationFactorCount,\n 0,\n );\n const summaryProcessCount = toNonNegativeInteger(summaryArtifact?.process_count);\n const summaryEdgeCount = toNonNegativeInteger(summaryArtifact?.edge_count);\n const multiplicationFactors = isRecord(summaryArtifact?.multiplication_factors)\n ? (summaryArtifact?.multiplication_factors as JsonObject)\n : null;\n const multiplicationFactorCount = multiplicationFactors\n ? Object.keys(multiplicationFactors).length\n : 0;\n\n if (!summaryArtifact) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_model_summary',\n 'review',\n 'Model bundle is missing summary.json generated by lifecyclemodel auto-build.',\n {\n summary_path: entry.summaryPath,\n },\n ),\n );\n }\n\n if (!connections) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_connections_artifact',\n 'review',\n 'Model bundle is missing connections.json generated by lifecyclemodel auto-build.',\n {\n connections_path: entry.connectionsPath,\n },\n ),\n );\n }\n\n if (!processCatalog) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_process_catalog',\n 'review',\n 'Model bundle is missing process-catalog.json generated by lifecyclemodel auto-build.',\n {\n process_catalog_path: entry.processCatalogPath,\n },\n ),\n );\n }\n\n if (referenceProcessUuids.length === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_reference_process_uuid',\n 'review',\n 'Review could not resolve reference_process_uuid from summary.json.',\n {\n summary_path: summaryArtifact ? entry.summaryPath : null,\n },\n ),\n );\n }\n\n if (resultingProcessUuids.length === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_resulting_process_ref',\n 'review',\n 'Review could not resolve referenceToResultingProcess from the lifecyclemodel payload.',\n {\n model_files: entry.modelFiles,\n },\n ),\n );\n }\n\n if (processInstanceCount === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'error',\n 'empty_process_instances',\n 'review',\n 'Lifecyclemodel payload does not contain any processInstance entries.',\n {\n model_files: entry.modelFiles,\n },\n ),\n );\n }\n\n if (summaryProcessCount !== null && summaryProcessCount !== processInstanceCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'process_count_mismatch',\n 'review',\n 'summary.json process_count does not match the number of processInstance entries in the payload.',\n {\n summary_process_count: summaryProcessCount,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n if (connections && summaryEdgeCount !== null && connections.length !== summaryEdgeCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'edge_count_mismatch',\n 'review',\n 'summary.json edge_count does not match the connections.json row count.',\n {\n summary_edge_count: summaryEdgeCount,\n connection_count: connections.length,\n },\n ),\n );\n }\n\n if (processCatalog && processCatalog.length !== processInstanceCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'process_catalog_count_mismatch',\n 'review',\n 'process-catalog.json row count does not match the number of processInstance entries in the payload.',\n {\n process_catalog_count: processCatalog.length,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n if (\n summaryArtifact &&\n multiplicationFactors &&\n multiplicationFactorCount !== processInstanceCount\n ) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'multiplication_factor_count_mismatch',\n 'review',\n 'summary.json multiplication_factors count does not match the number of processInstance entries in the payload.',\n {\n multiplication_factor_count: multiplicationFactorCount,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n const counts = severityCounts(findings);\n return {\n summary: {\n run_name: entry.runName,\n model_files: entry.modelFiles,\n model_uuids: modelUuids,\n model_versions: modelVersions,\n reference_process_uuids: referenceProcessUuids,\n reference_process_internal_ids: referenceProcessInternalIds,\n resulting_process_uuids: resultingProcessUuids,\n summary_process_count: summaryProcessCount,\n process_instance_count: processInstanceCount,\n summary_edge_count: summaryEdgeCount,\n connection_count: connections ? connections.length : null,\n process_catalog_count: processCatalog ? processCatalog.length : null,\n multiplication_factor_count: multiplicationFactorCount,\n zero_multiplication_factor_count: zeroMultiplicationFactorCount,\n validation: {\n available: validationAggregate.reportPath !== null,\n ok: validation.ok,\n report_file: validation.reportFile,\n engine_count: validation.engineCount,\n issue_count: validation.issues.length,\n },\n artifacts: {\n summary: summaryArtifact ? entry.summaryPath : null,\n connections: connections ? entry.connectionsPath : null,\n process_catalog: processCatalog ? entry.processCatalogPath : null,\n },\n finding_count: findings.length,\n severity_counts: counts,\n },\n findings,\n };\n}\n\nfunction buildInvocationIndex(\n layout: LifecyclemodelReviewLayout,\n invocationIndex: JsonObject,\n options: RunLifecyclemodelReviewOptions,\n now: Date,\n): JsonObject {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = [\n 'review',\n 'lifecyclemodel',\n '--run-dir',\n options.runDir,\n '--out-dir',\n options.outDir,\n ];\n\n if (nonEmptyString(options.logicVersion)) {\n command.push('--logic-version', options.logicVersion as string);\n }\n if (nonEmptyString(options.startTs)) {\n command.push('--start-ts', options.startTs as string);\n }\n if (nonEmptyString(options.endTs)) {\n command.push('--end-ts', options.endTs as string);\n }\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n },\n ],\n };\n}\n\nfunction buildNextActions(\n layout: LifecyclemodelReviewLayout,\n validationAggregate: LifecyclemodelValidationAggregate,\n): string[] {\n return [\n `inspect: ${layout.findingsPath}`,\n validationAggregate.reportPath\n ? `inspect: ${validationAggregate.reportPath}`\n : `run: tiangong-lca lifecyclemodel validate-build --run-dir ${layout.runRoot}`,\n `run: tiangong-lca lifecyclemodel publish-build --run-dir ${layout.runRoot}`,\n ];\n}\n\nfunction renderZhReview(options: {\n runId: string;\n logicVersion: string;\n runRoot: string;\n modelSummaries: LifecyclemodelReviewModelSummary[];\n findings: LifecyclemodelReviewFinding[];\n validation: LifecyclemodelReviewReport['validation'];\n}): string {\n const lines = [\n '# lifecyclemodel_review_zh\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- run_root: \\`${options.runRoot}\\`\\n`,\n '\\n## 总览\\n',\n `- model bundle 数量: **${options.modelSummaries.length}**\\n`,\n `- findings 数量: **${options.findings.length}**\\n`,\n `- validation report: \\`${options.validation.available ? 'available' : 'missing'}\\`\\n`,\n ];\n\n lines.push(\n '\\n## 模型摘要\\n|run name|model uuid 数|processInstance|connections|validation issues|findings|\\n|---|---:|---:|---:|---:|---:|\\n',\n );\n options.modelSummaries.forEach((summary) => {\n lines.push(\n `|${summary.run_name}|${summary.model_uuids.length}|${summary.process_instance_count}|${summary.connection_count ?? 0}|${summary.validation.issue_count}|${summary.finding_count}|\\n`,\n );\n });\n\n lines.push('\\n## Findings\\n');\n if (options.findings.length === 0) {\n lines.push('- 未发现新的 lifecyclemodel review findings。\\n');\n } else {\n lines.push('\\n|run name|severity|source|rule id|message|\\n|---|---|---|---|---|\\n');\n options.findings.slice(0, 200).forEach((finding) => {\n lines.push(\n `|${finding.run_name}|${finding.severity}|${finding.source}|${finding.rule_id}|${finding.message.replace(/\\|/gu, '/')}|\\n`,\n );\n });\n }\n\n lines.push(\n '\\n## 说明\\n',\n '- 当前 review lifecyclemodel 保持 local-first / artifact-first,只读取现有 build run 与 validate-build 产物。\\n',\n '- 当前命令不引入 Python、LangGraph 或 skill 私有 review runtime。\\n',\n );\n\n return lines.join('');\n}\n\nfunction renderEnReview(options: {\n runId: string;\n logicVersion: string;\n runRoot: string;\n modelSummaries: LifecyclemodelReviewModelSummary[];\n findings: LifecyclemodelReviewFinding[];\n validation: LifecyclemodelReviewReport['validation'];\n}): string {\n const lines = [\n '# lifecyclemodel_review_en\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- run_root: \\`${options.runRoot}\\`\\n`,\n '\\n## Summary\\n',\n `- model bundles: **${options.modelSummaries.length}**\\n`,\n `- findings: **${options.findings.length}**\\n`,\n `- validation report: \\`${options.validation.available ? 'available' : 'missing'}\\`\\n`,\n ];\n\n lines.push(\n '\\n## Model overview\\n|run name|model uuids|process instances|connections|validation issues|findings|\\n|---|---:|---:|---:|---:|---:|\\n',\n );\n options.modelSummaries.forEach((summary) => {\n lines.push(\n `|${summary.run_name}|${summary.model_uuids.length}|${summary.process_instance_count}|${summary.connection_count ?? 0}|${summary.validation.issue_count}|${summary.finding_count}|\\n`,\n );\n });\n\n if (options.findings.length > 0) {\n lines.push('\\n## Findings\\n');\n options.findings.slice(0, 100).forEach((finding) => {\n lines.push(`- [${finding.severity}] ${finding.run_name}: ${finding.message}\\n`);\n });\n }\n\n return lines.join('');\n}\n\nfunction renderTiming(options: {\n runId: string;\n startTs?: string;\n endTs?: string;\n modelCount: number;\n}): string {\n const lines = ['# lifecyclemodel_review_timing\\n', `- run_id: \\`${options.runId}\\`\\n`];\n if (options.startTs && options.endTs) {\n const started = Date.parse(options.startTs);\n const ended = Date.parse(options.endTs);\n if (!Number.isFinite(started) || !Number.isFinite(ended)) {\n throw new CliError('Expected --start-ts and --end-ts to be valid ISO timestamps.', {\n code: 'LIFECYCLEMODEL_REVIEW_INVALID_TIMESTAMP',\n exitCode: 2,\n });\n }\n\n lines.push(`- start: \\`${options.startTs}\\`\\n`);\n lines.push(`- end: \\`${options.endTs}\\`\\n`);\n lines.push(`- total elapsed: **${((ended - started) / 60_000).toFixed(2)} min**\\n`);\n }\n\n lines.push(`- model bundles reviewed: \\`${options.modelCount}\\`\\n`);\n lines.push(\n '- major time consumers: model JSON parsing, validation issue aggregation, artifact checks.\\n',\n );\n return lines.join('');\n}\n\nexport async function runLifecyclemodelReview(\n options: RunLifecyclemodelReviewOptions,\n): Promise<LifecyclemodelReviewReport> {\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n const invocationIndex = readInvocationIndex(layout);\n const validationAggregate = readValidationAggregate(layout);\n const modelEntries = discoverModelEntries(layout);\n const logicVersion = options.logicVersion?.trim() || 'lifecyclemodel-review-v1.0';\n const now = options.now ?? (() => new Date());\n const generatedAt = now();\n\n const reviewedModels = modelEntries.map((entry) => buildModelReview(entry, validationAggregate));\n const modelSummaries = reviewedModels.map((model) => model.summary);\n const findings = reviewedModels.flatMap((model) => model.findings);\n const report: LifecyclemodelReviewReport = {\n schema_version: 1,\n generated_at_utc: generatedAt.toISOString(),\n status: 'completed_local_lifecyclemodel_review',\n run_id: layout.runId,\n run_root: layout.runRoot,\n out_dir: layout.outDir,\n logic_version: logicVersion,\n model_count: modelSummaries.length,\n finding_count: findings.length,\n severity_counts: severityCounts(findings),\n validation: {\n available: validationAggregate.reportPath !== null,\n ok: validationAggregate.ok,\n report: validationAggregate.reportPath,\n },\n files: {\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n validation_report: validationAggregate.reportPath,\n model_summaries: layout.modelSummariesPath,\n findings: layout.findingsPath,\n summary: layout.summaryPath,\n review_zh: layout.reviewZhPath,\n review_en: layout.reviewEnPath,\n timing: layout.timingPath,\n report: layout.reportPath,\n },\n model_summaries: modelSummaries,\n next_actions: buildNextActions(layout, validationAggregate),\n };\n\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(layout, invocationIndex, options, generatedAt),\n );\n writeJsonLinesArtifact(layout.modelSummariesPath, modelSummaries);\n writeJsonLinesArtifact(layout.findingsPath, findings);\n writeJsonArtifact(layout.summaryPath, {\n run_id: report.run_id,\n logic_version: report.logic_version,\n model_count: report.model_count,\n finding_count: report.finding_count,\n severity_counts: copyJson(report.severity_counts),\n validation: copyJson(report.validation),\n });\n writeTextArtifact(\n layout.reviewZhPath,\n renderZhReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n runRoot: report.run_root,\n modelSummaries,\n findings,\n validation: report.validation,\n }),\n );\n writeTextArtifact(\n layout.reviewEnPath,\n renderEnReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n runRoot: report.run_root,\n modelSummaries,\n findings,\n validation: report.validation,\n }),\n );\n writeTextArtifact(\n layout.timingPath,\n renderTiming({\n runId: report.run_id,\n startTs: options.startTs,\n endTs: options.endTs,\n modelCount: report.model_count,\n }),\n );\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n readInvocationIndex,\n discoverModelEntries,\n readValidationAggregate,\n readModelFileReviewInfo,\n buildModelReview,\n buildInvocationIndex,\n buildNextActions,\n renderZhReview,\n renderEnReview,\n renderTiming,\n};\n"]}
@@ -1,9 +1,10 @@
1
1
  import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
2
  import path from 'node:path';
3
- import { writeJsonArtifact, writeTextArtifact } from './artifacts.js';
3
+ import { writeJsonArtifact, writeJsonLinesArtifact, writeTextArtifact } from './artifacts.js';
4
4
  import { CliError } from './errors.js';
5
5
  import { readJsonInput } from './io.js';
6
6
  import { invokeLlm, readLlmRuntimeEnv } from './llm.js';
7
+ import { getRuntimeRuleset, isRuntimeRuleBlocker, resolveRuntimeRuleId, } from './runtime-rulesets.js';
7
8
  const KIND_RE = /\[tg_io_kind_tag=([^\]]+)\]/gu;
8
9
  const UOM_RE = /\[tg_io_uom_tag=([^\]]+)\]/gu;
9
10
  const ENERGY_WORDS = [
@@ -226,6 +227,97 @@ function unitIssueCheck(exchange, uoms, blob) {
226
227
  }
227
228
  return [];
228
229
  }
230
+ function hasNumericAmount(exchange) {
231
+ for (const key of ['meanAmount', 'resultingAmount']) {
232
+ const value = exchange[key];
233
+ if (typeof value === 'number' && Number.isFinite(value)) {
234
+ return true;
235
+ }
236
+ if (typeof value === 'string' && value.trim() && Number.isFinite(Number(value))) {
237
+ return true;
238
+ }
239
+ }
240
+ return false;
241
+ }
242
+ function createProcessReviewFinding(options) {
243
+ const methodologyRuleId = resolveRuntimeRuleId('process-authoring/strict', options.code);
244
+ return {
245
+ process_file: options.processFile,
246
+ severity: options.severity,
247
+ code: options.code,
248
+ methodology_rule_id: methodologyRuleId,
249
+ message: options.message,
250
+ source: 'rule',
251
+ ...(options.evidence ? { evidence: options.evidence } : {}),
252
+ };
253
+ }
254
+ function reviewFindingsForBase(processFile, base) {
255
+ const findings = [];
256
+ if (!base.name_zh_en_ok) {
257
+ findings.push(createProcessReviewFinding({
258
+ processFile,
259
+ severity: 'blocker',
260
+ code: 'process_missing_bilingual_base_name',
261
+ message: 'Process baseName must include usable Chinese and English entries.',
262
+ evidence: { base_names: base.base_names },
263
+ }));
264
+ }
265
+ if (!base.functional_unit_ok) {
266
+ findings.push(createProcessReviewFinding({
267
+ processFile,
268
+ severity: 'blocker',
269
+ code: 'process_missing_functional_unit',
270
+ message: 'Process quantitative reference functionalUnitOrOther is missing.',
271
+ }));
272
+ }
273
+ for (const [ok, code, message] of [
274
+ [
275
+ base.system_boundary_ok,
276
+ 'process_missing_system_boundary',
277
+ 'Process system boundary or typeOfDataSet context is missing.',
278
+ ],
279
+ [base.time_ok, 'process_missing_time', 'Process time coverage is missing.'],
280
+ [base.geo_ok, 'process_missing_geography', 'Process geography is missing.'],
281
+ [base.tech_ok, 'process_missing_technology', 'Process technology description is missing.'],
282
+ [
283
+ base.admin_ok,
284
+ 'process_missing_admin_metadata',
285
+ 'Process administrative metadata is missing.',
286
+ ],
287
+ ]) {
288
+ if (!ok) {
289
+ findings.push(createProcessReviewFinding({
290
+ processFile,
291
+ severity: 'warning',
292
+ code,
293
+ message,
294
+ }));
295
+ }
296
+ }
297
+ return findings;
298
+ }
299
+ function processRulesetGate(findings) {
300
+ const ruleset = getRuntimeRuleset('process-authoring/strict');
301
+ const blockers = findings.filter((finding) => finding.severity === 'blocker' || isRuntimeRuleBlocker(finding.methodology_rule_id));
302
+ const status = blockers.length > 0 ? 'blocked' : findings.length > 0 ? 'needs_review' : 'passed';
303
+ return {
304
+ status,
305
+ ruleset_id: ruleset.id,
306
+ ruleset_version: ruleset.version,
307
+ ruleset_source_version: ruleset.source_version,
308
+ ruleset_rule_ids: ruleset.rule_ids,
309
+ counts: {
310
+ findings: findings.length,
311
+ blockers: blockers.length,
312
+ },
313
+ blockers,
314
+ next_action: status === 'blocked'
315
+ ? 'fix_blockers'
316
+ : status === 'needs_review'
317
+ ? 'review_findings'
318
+ : 'continue',
319
+ };
320
+ }
229
321
  function baseInfoCheck(processPayload) {
230
322
  const [zhOk, enOk, values] = extractBaseNames(processPayload);
231
323
  const functionalUnit = deepGet(processPayload, [
@@ -676,6 +768,7 @@ export async function runProcessReview(options) {
676
768
  const baseRows = [];
677
769
  const rows = [];
678
770
  const unitIssues = [];
771
+ const ruleFindings = [];
679
772
  const processSummariesForLlm = [];
680
773
  let totalRaw = 0;
681
774
  let totalProduct = 0;
@@ -693,6 +786,7 @@ export async function runProcessReview(options) {
693
786
  const base = baseInfoCheck(processPayload);
694
787
  const fileName = path.basename(filePath);
695
788
  baseRows.push([fileName, base]);
789
+ ruleFindings.push(...reviewFindingsForBase(fileName, base));
696
790
  let rawInput = 0;
697
791
  let product = 0;
698
792
  let byproduct = 0;
@@ -700,6 +794,18 @@ export async function runProcessReview(options) {
700
794
  let energyExcluded = 0;
701
795
  exchanges.forEach((exchange) => {
702
796
  const classified = classifyExchange(exchange);
797
+ if (!hasNumericAmount(exchange)) {
798
+ ruleFindings.push(createProcessReviewFinding({
799
+ processFile: fileName,
800
+ severity: 'blocker',
801
+ code: 'process_missing_exchange_amount',
802
+ message: 'Process exchange is missing both numeric meanAmount and resultingAmount.',
803
+ evidence: {
804
+ exchange_internal_id: String(exchange['@dataSetInternalID'] ?? ''),
805
+ direction: String(exchange.exchangeDirection ?? ''),
806
+ },
807
+ }));
808
+ }
703
809
  const amount = toNumber(exchange.meanAmount ?? exchange.resultingAmount);
704
810
  if (classified.classification === 'raw_material_input') {
705
811
  rawInput += amount;
@@ -716,7 +822,17 @@ export async function runProcessReview(options) {
716
822
  else if (classified.classification === 'energy_input') {
717
823
  energyExcluded += amount;
718
824
  }
719
- unitIssues.push(...unitIssueCheck(exchange, classified.uoms, classified.blob));
825
+ const currentUnitIssues = unitIssueCheck(exchange, classified.uoms, classified.blob);
826
+ unitIssues.push(...currentUnitIssues);
827
+ currentUnitIssues.forEach((issue) => {
828
+ ruleFindings.push(createProcessReviewFinding({
829
+ processFile: fileName,
830
+ severity: 'warning',
831
+ code: 'process_exchange_unit_semantic_mismatch',
832
+ message: 'Exchange unit tag conflicts with flow description semantics.',
833
+ evidence: { ...issue },
834
+ }));
835
+ });
720
836
  });
721
837
  const balanceOut = product + byproduct + waste;
722
838
  const delta = balanceOut - rawInput;
@@ -731,6 +847,21 @@ export async function runProcessReview(options) {
731
847
  delta,
732
848
  relative_deviation: relativeDeviation,
733
849
  });
850
+ if (relativeDeviation !== null && relativeDeviation > 0.05) {
851
+ ruleFindings.push(createProcessReviewFinding({
852
+ processFile: fileName,
853
+ severity: relativeDeviation > 0.1 ? 'blocker' : 'warning',
854
+ code: 'process_material_balance_deviation',
855
+ message: 'Material balance deviation exceeds the review threshold for raw inputs versus product/by-product/waste outputs.',
856
+ evidence: {
857
+ raw_input: rawInput,
858
+ product,
859
+ byproduct,
860
+ waste,
861
+ relative_deviation: relativeDeviation,
862
+ },
863
+ }));
864
+ }
734
865
  totalRaw += rawInput;
735
866
  totalProduct += product;
736
867
  totalByproduct += byproduct;
@@ -786,14 +917,18 @@ export async function runProcessReview(options) {
786
917
  fetchImpl,
787
918
  outDir,
788
919
  });
920
+ const rulesetGate = processRulesetGate(ruleFindings);
789
921
  const summary = {
790
922
  run_id: runId,
791
923
  logic_version: logicVersion,
792
924
  process_count: processFiles.length,
793
925
  totals,
926
+ ruleset_gate: rulesetGate,
794
927
  llm: llmResult,
795
928
  };
796
929
  const reviewInputSummaryPath = writeJsonArtifact(path.join(outDir, 'review-input-summary.json'), resolvedInput.reviewInputSummary);
930
+ const ruleFindingsPath = writeJsonLinesArtifact(path.join(outDir, 'process-review-rule-findings.jsonl'), ruleFindings);
931
+ const rulesetGatePath = writeJsonArtifact(path.join(outDir, 'process-review-ruleset-gate.json'), rulesetGate);
797
932
  const reviewZhPath = writeTextArtifact(path.join(outDir, 'one_flow_rerun_review_v2_1_zh.md'), renderZhReview({
798
933
  runId,
799
934
  logicVersion,
@@ -832,11 +967,20 @@ export async function runProcessReview(options) {
832
967
  input_mode: resolvedInput.inputMode,
833
968
  effective_processes_dir: resolvedInput.effectiveProcessesDir,
834
969
  logic_version: logicVersion,
970
+ ruleset_id: rulesetGate.ruleset_id,
971
+ ruleset_version: rulesetGate.ruleset_version,
972
+ ruleset_source_version: rulesetGate.ruleset_source_version,
973
+ ruleset_rule_ids: rulesetGate.ruleset_rule_ids,
835
974
  process_count: processFiles.length,
836
975
  totals,
976
+ rule_finding_count: ruleFindings.length,
977
+ blocker_count: rulesetGate.counts.blockers,
978
+ ruleset_gate: rulesetGate,
837
979
  files: {
838
980
  review_input_summary: reviewInputSummaryPath,
839
981
  materialization_summary: resolvedInput.materializationSummaryPath,
982
+ rule_findings: ruleFindingsPath,
983
+ ruleset_gate: rulesetGatePath,
840
984
  review_zh: reviewZhPath,
841
985
  review_en: reviewEnPath,
842
986
  timing: timingPath,
@@ -860,6 +1004,10 @@ export const __testInternals = {
860
1004
  extractBaseNames,
861
1005
  classifyExchange,
862
1006
  unitIssueCheck,
1007
+ hasNumericAmount,
1008
+ createProcessReviewFinding,
1009
+ reviewFindingsForBase,
1010
+ processRulesetGate,
863
1011
  baseInfoCheck,
864
1012
  unwrapProcessPayload,
865
1013
  buildPrompt,