@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-bilingual.js","sourceRoot":"","sources":["../../../src/lib/dataset-bilingual.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n cloneJson,\n isRecord,\n materializeDatasetRows,\n readDatasetRowsInput,\n trimToken,\n type DatasetKind,\n type JsonObject,\n} from './dataset-local.js';\nimport {\n runDatasetValidate,\n type DatasetValidateReport,\n type RunDatasetValidateOptions,\n} from './dataset-validate.js';\nimport { runFlowReview, type FlowReviewReport, type RunFlowReviewOptions } from './review-flow.js';\nimport {\n runProcessReview,\n type ProcessReviewReport,\n type RunProcessReviewOptions,\n} from './review-process.js';\n\ntype BilingualDatasetType = 'auto' | DatasetKind;\ntype BilingualStatus = 'completed' | 'blocked';\ntype ScanSeverity = 'warning' | 'blocker';\n\nexport type BilingualTranslationUnit = {\n schema_version: 1;\n unit_id: string;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n source_lang: string;\n target_lang: string;\n source_text: string;\n current_target_text: string | null;\n context: {\n root_field: string | null;\n sibling_keys: string[];\n };\n};\n\nexport type DatasetBilingualExtractReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n requested_type: BilingualDatasetType;\n source_lang: string;\n target_lang: string;\n unit_count: number;\n row_count: number;\n files: {\n translation_units: string | null;\n report: string | null;\n };\n};\n\nexport type TranslationEvidenceEntry = {\n unit_id: string;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n source_lang: string;\n target_lang: string;\n source_text: string;\n translated_text: string;\n basis: string | null;\n review_status: string | null;\n reviewer: string | null;\n};\n\nexport type DatasetBilingualApplyReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n translations_path: string;\n out_path: string;\n target_lang: string;\n status: BilingualStatus;\n row_count: number;\n translation_count: number;\n applied_count: number;\n skipped_count: number;\n blockers: Array<{ code: string; message: string; unit_id?: string }>;\n files: {\n translated_rows: string;\n translation_evidence: string | null;\n report: string | null;\n };\n};\n\nexport type BilingualScanFinding = {\n code: string;\n severity: ScanSeverity;\n row_index: number;\n dataset_type: DatasetKind | null;\n dataset_id: string | null;\n dataset_version: string | null;\n field_path: string;\n lang: string | null;\n message: string;\n text_preview: string;\n};\n\nexport type DatasetBilingualValidateReport = {\n schema_version: 1;\n generated_at_utc: string;\n input_path: string;\n requested_type: BilingualDatasetType;\n status: BilingualStatus;\n row_count: number;\n scan: {\n finding_count: number;\n blocker_count: number;\n warning_count: number;\n findings: BilingualScanFinding[];\n };\n schema_gate: {\n status: DatasetValidateReport['status'];\n valid: number;\n invalid: number;\n report_file: string | null;\n };\n review_gate: {\n status: 'completed' | 'not_run';\n process_report_file: string | null;\n flow_report_file: string | null;\n };\n files: {\n report: string | null;\n findings: string | null;\n };\n};\n\nexport type RunDatasetBilingualExtractOptions = {\n inputPath: string;\n type?: string | null;\n outDir?: string | null;\n sourceLang?: string | null;\n targetLang?: string | null;\n rawInput?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetBilingualApplyOptions = {\n inputPath: string;\n translationsPath: string;\n outPath: string;\n outDir?: string | null;\n targetLang?: string | null;\n rawInput?: unknown;\n rawTranslations?: unknown;\n now?: Date;\n};\n\nexport type RunDatasetBilingualValidateOptions = {\n inputPath: string;\n type?: string | null;\n outDir?: string | null;\n rawInput?: unknown;\n now?: Date;\n datasetValidateImpl?: (options: RunDatasetValidateOptions) => Promise<DatasetValidateReport>;\n processReviewImpl?: (options: RunProcessReviewOptions) => Promise<ProcessReviewReport>;\n flowReviewImpl?: (options: RunFlowReviewOptions) => Promise<FlowReviewReport>;\n schemas?: RunDatasetValidateOptions['schemas'];\n};\n\ntype LangRecord = JsonObject & {\n '#text'?: unknown;\n '@xml:lang'?: unknown;\n};\n\ntype TranslationInput = {\n unit_id: string | null;\n row_index: number | null;\n field_path: string | null;\n source_lang: string | null;\n target_lang: string | null;\n source_text: string | null;\n translated_text: string | null;\n basis: string | null;\n review_status: string | null;\n reviewer: string | null;\n};\n\ntype ApplyTranslationResult =\n | { applied: true; evidence: TranslationEvidenceEntry }\n | { applied: false; blocker: string };\n\ntype PathVisit = {\n rowIndex: number;\n row: JsonObject;\n kind: DatasetKind | null;\n id: string | null;\n version: string | null;\n};\n\nconst DEFAULT_SOURCE_LANG = 'en';\nconst DEFAULT_TARGET_LANG = 'zh';\nconst PLACEHOLDER_RE = /\\b(?:TODO|TBD|FIXME|REPLACE_ME)\\b|待补充|占位/u;\nconst CJK_RE = /[\\u3400-\\u9fff]/u;\nconst LATIN_WORD_RE = /[A-Za-z]{3,}/gu;\nconst CJK_PLURAL_SUFFIX_RE = /[\\u3400-\\u9fff]+s\\b/u;\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction normalizeType(value: string | null | undefined): BilingualDatasetType {\n const normalized = value?.trim().toLowerCase();\n if (!normalized || normalized === 'auto') {\n return 'auto';\n }\n if (normalized === 'flow' || normalized === 'flows') {\n return 'flow';\n }\n if (normalized === 'process' || normalized === 'processes') {\n return 'process';\n }\n if (\n normalized === 'lifecyclemodel' ||\n normalized === 'lifecyclemodels' ||\n normalized === 'model' ||\n normalized === 'models'\n ) {\n return 'lifecyclemodel';\n }\n throw new CliError('Expected --type to be auto, flow, process, or lifecyclemodel.', {\n code: 'DATASET_BILINGUAL_TYPE_INVALID',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction normalizeLang(value: string | null | undefined, fallback: string): string {\n const normalized = value?.trim().toLowerCase();\n return normalized || fallback;\n}\n\nfunction pointerEscape(segment: string): string {\n return segment.replace(/~/gu, '~0').replace(/\\//gu, '~1');\n}\n\nfunction pointerUnescape(segment: string): string {\n return segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n}\n\nfunction pointerFromSegments(segments: string[]): string {\n return `/${segments.map(pointerEscape).join('/')}`;\n}\n\nfunction segmentsFromPointer(pointer: string): string[] {\n if (!pointer.startsWith('/')) {\n throw new CliError(`Expected JSON pointer field_path, got: ${pointer}`, {\n code: 'DATASET_BILINGUAL_FIELD_PATH_INVALID',\n exitCode: 2,\n });\n }\n return pointer.slice(1).split('/').map(pointerUnescape);\n}\n\nfunction textPreview(value: string): string {\n return value.length > 180 ? `${value.slice(0, 177)}...` : value;\n}\n\nfunction langOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['@xml:lang'] : null)?.toLowerCase() ?? null;\n}\n\nfunction textOf(value: unknown): string | null {\n return trimToken(isRecord(value) ? value['#text'] : null);\n}\n\nfunction isLangRecord(value: unknown): value is LangRecord {\n return isRecord(value) && (typeof value['@xml:lang'] === 'string' || '#text' in value);\n}\n\nfunction isLangRecordArray(value: unknown): value is LangRecord[] {\n return Array.isArray(value) && value.some((item) => isLangRecord(item));\n}\n\nfunction hashUnit(parts: unknown[]): string {\n const hash = createHash('sha256');\n for (const part of parts) {\n hash.update(String(part ?? ''));\n hash.update('\\n');\n }\n return hash.digest('hex').slice(0, 24);\n}\n\nfunction filterRowsByType(\n rows: ReturnType<typeof materializeDatasetRows>,\n requestedType: BilingualDatasetType,\n): ReturnType<typeof materializeDatasetRows> {\n if (requestedType === 'auto') {\n return rows;\n }\n return rows.filter((row) => row.kind === requestedType);\n}\n\nfunction rootFieldFromPath(pathSegments: string[]): string | null {\n return pathSegments.find((segment) => !/^\\d+$/u.test(segment)) ?? null;\n}\n\nfunction siblingKeys(parent: unknown): string[] {\n if (!isRecord(parent)) {\n return [];\n }\n return Object.keys(parent).sort().slice(0, 20);\n}\n\nfunction collectTranslationUnitsFromNode(\n node: unknown,\n pathSegments: string[],\n parent: unknown,\n visit: PathVisit,\n sourceLang: string,\n targetLang: string,\n units: BilingualTranslationUnit[],\n): void {\n if (isLangRecordArray(node)) {\n const source = node.find((item) => langOf(item) === sourceLang);\n const target = node.find((item) => langOf(item) === targetLang);\n const sourceText = textOf(source);\n if (sourceText) {\n const fieldPath = pointerFromSegments(pathSegments);\n units.push({\n schema_version: 1,\n unit_id: hashUnit([\n visit.rowIndex,\n visit.id,\n visit.version,\n fieldPath,\n sourceLang,\n targetLang,\n sourceText,\n ]),\n row_index: visit.rowIndex,\n dataset_type: visit.kind,\n dataset_id: visit.id,\n dataset_version: visit.version,\n field_path: fieldPath,\n source_lang: sourceLang,\n target_lang: targetLang,\n source_text: sourceText,\n current_target_text: textOf(target),\n context: {\n root_field: rootFieldFromPath(pathSegments),\n sibling_keys: siblingKeys(parent),\n },\n });\n }\n return;\n }\n\n if (Array.isArray(node)) {\n node.forEach((item, index) =>\n collectTranslationUnitsFromNode(\n item,\n [...pathSegments, String(index)],\n node,\n visit,\n sourceLang,\n targetLang,\n units,\n ),\n );\n return;\n }\n\n if (isRecord(node)) {\n for (const [key, value] of Object.entries(node)) {\n collectTranslationUnitsFromNode(\n value,\n [...pathSegments, key],\n node,\n visit,\n sourceLang,\n targetLang,\n units,\n );\n }\n }\n}\n\nfunction collectTranslationUnits(\n rows: ReturnType<typeof materializeDatasetRows>,\n sourceLang: string,\n targetLang: string,\n): BilingualTranslationUnit[] {\n const units: BilingualTranslationUnit[] = [];\n for (const row of rows) {\n collectTranslationUnitsFromNode(\n row.row,\n [],\n null,\n {\n rowIndex: row.index,\n row: row.row,\n kind: row.kind,\n id: row.id,\n version: row.version,\n },\n sourceLang,\n targetLang,\n units,\n );\n }\n return units;\n}\n\nfunction outFiles(outDir: string | null | undefined): DatasetBilingualExtractReport['files'] {\n if (!outDir) {\n return {\n translation_units: null,\n report: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n translation_units: path.join(resolved, 'outputs', 'trans-units.jsonl'),\n report: path.join(resolved, 'outputs', 'extract-report.json'),\n };\n}\n\nfunction readTranslationInputs(inputPath: string, rawInput?: unknown): TranslationInput[] {\n return readDatasetRowsInput(inputPath, rawInput).map((row) => {\n const translatedText =\n trimToken(row.translated_text) ??\n trimToken(row.translatedText) ??\n trimToken(row.translation) ??\n trimToken(row.target_text) ??\n trimToken(row.targetText);\n return {\n unit_id: trimToken(row.unit_id) ?? trimToken(row.unitId),\n row_index:\n typeof row.row_index === 'number'\n ? row.row_index\n : typeof row.rowIndex === 'number'\n ? row.rowIndex\n : null,\n field_path: trimToken(row.field_path) ?? trimToken(row.fieldPath),\n source_lang: trimToken(row.source_lang) ?? trimToken(row.sourceLang),\n target_lang: trimToken(row.target_lang) ?? trimToken(row.targetLang),\n source_text: trimToken(row.source_text) ?? trimToken(row.sourceText),\n translated_text: translatedText,\n basis: trimToken(row.basis) ?? trimToken(row.rationale),\n review_status: trimToken(row.review_status) ?? trimToken(row.reviewStatus),\n reviewer: trimToken(row.reviewer),\n };\n });\n}\n\nfunction resolvePointer(root: unknown, pointer: string): unknown {\n let current = root;\n for (const segment of segmentsFromPointer(pointer)) {\n if (Array.isArray(current)) {\n current = current[Number(segment)];\n } else if (isRecord(current)) {\n current = current[segment];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction cloneSourceLangRecord(container: LangRecord[], sourceLang: string): LangRecord {\n const source = container.find((item) => langOf(item) === sourceLang);\n const cloned = isRecord(source) ? cloneJson(source) : {};\n cloned['@xml:lang'] = '';\n cloned['#text'] = '';\n return cloned;\n}\n\nfunction applyTranslationToRows(options: {\n rows: JsonObject[];\n translation: TranslationInput;\n targetLang: string;\n}): ApplyTranslationResult {\n const translation = options.translation;\n if (translation.row_index === null || translation.row_index < 0) {\n return { applied: false, blocker: 'Translation is missing row_index.' };\n }\n if (!translation.field_path) {\n return { applied: false, blocker: 'Translation is missing field_path.' };\n }\n if (!translation.translated_text) {\n return { applied: false, blocker: 'Translation is missing translated_text.' };\n }\n\n const row = options.rows[translation.row_index];\n if (!row) {\n return { applied: false, blocker: `No input row exists at index ${translation.row_index}.` };\n }\n\n const container = resolvePointer(row, translation.field_path);\n if (!Array.isArray(container)) {\n return { applied: false, blocker: `field_path does not point to a language array.` };\n }\n\n let target = container.find((item) => isRecord(item) && langOf(item) === options.targetLang);\n if (!target) {\n target = cloneSourceLangRecord(container as LangRecord[], translation.source_lang ?? 'en');\n container.push(target);\n }\n target['@xml:lang'] = options.targetLang;\n target['#text'] = translation.translated_text;\n\n const materializedRows = materializeDatasetRows('memory', { rows: [row] });\n const materialized = materializedRows[0];\n return {\n applied: true,\n evidence: {\n unit_id:\n translation.unit_id ??\n hashUnit([\n translation.row_index,\n translation.field_path,\n translation.source_lang,\n options.targetLang,\n translation.source_text,\n ]),\n row_index: translation.row_index,\n dataset_type: materialized?.kind ?? null,\n dataset_id: materialized?.id ?? null,\n dataset_version: materialized?.version ?? null,\n field_path: translation.field_path,\n source_lang: translation.source_lang ?? 'en',\n target_lang: options.targetLang,\n source_text: translation.source_text ?? '',\n translated_text: translation.translated_text,\n basis: translation.basis,\n review_status: translation.review_status,\n reviewer: translation.reviewer,\n },\n };\n}\n\nfunction writeRowsJsonl(filePath: string, rows: JsonObject[]): string {\n return writeJsonLinesArtifact(filePath, rows);\n}\n\nfunction scanText(node: unknown, pathSegments: string[], visit: PathVisit): BilingualScanFinding[] {\n const findings: BilingualScanFinding[] = [];\n\n if (isLangRecord(node)) {\n const lang = langOf(node);\n const text = textOf(node);\n if (!text) {\n return findings;\n }\n const fieldPath = pointerFromSegments(pathSegments);\n const base = {\n row_index: visit.rowIndex,\n dataset_type: visit.kind,\n dataset_id: visit.id,\n dataset_version: visit.version,\n field_path: fieldPath,\n lang,\n text_preview: textPreview(text),\n };\n if (PLACEHOLDER_RE.test(text)) {\n findings.push({\n ...base,\n code: 'placeholder_text',\n severity: 'blocker',\n message: 'Text contains placeholder markers.',\n });\n }\n if (lang === 'en' && CJK_RE.test(text)) {\n findings.push({\n ...base,\n code: 'english_contains_cjk',\n severity: 'blocker',\n message: 'English text contains CJK characters.',\n });\n }\n if (lang === 'zh' && CJK_PLURAL_SUFFIX_RE.test(text)) {\n findings.push({\n ...base,\n code: 'mechanical_plural_suffix',\n severity: 'blocker',\n message: 'Chinese text contains mechanical mixed-language plural suffixes.',\n });\n }\n if (lang === 'zh') {\n const latinWords = text.match(LATIN_WORD_RE) ?? [];\n if (latinWords.length >= 8) {\n findings.push({\n ...base,\n code: 'zh_latin_word_density',\n severity: 'warning',\n message:\n 'Chinese text contains many Latin words; review for machine-translation residue.',\n });\n }\n }\n return findings;\n }\n\n if (Array.isArray(node)) {\n node.forEach((item, index) => {\n findings.push(...scanText(item, [...pathSegments, String(index)], visit));\n });\n return findings;\n }\n\n if (isRecord(node)) {\n for (const [key, value] of Object.entries(node)) {\n findings.push(...scanText(value, [...pathSegments, key], visit));\n }\n }\n\n return findings;\n}\n\nfunction scanRows(rows: ReturnType<typeof materializeDatasetRows>): BilingualScanFinding[] {\n return rows.flatMap((row) =>\n scanText(row.row, [], {\n rowIndex: row.index,\n row: row.row,\n kind: row.kind,\n id: row.id,\n version: row.version,\n }),\n );\n}\n\nfunction validateFiles(outDir: string | null | undefined): DatasetBilingualValidateReport['files'] {\n if (!outDir) {\n return {\n report: null,\n findings: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n report: path.join(resolved, 'outputs', 'bilingual-validate-report.json'),\n findings: path.join(resolved, 'outputs', 'bilingual-findings.jsonl'),\n };\n}\n\nexport async function runDatasetBilingualExtract(\n options: RunDatasetBilingualExtractOptions,\n): Promise<DatasetBilingualExtractReport> {\n const requestedType = normalizeType(options.type);\n const sourceLang = normalizeLang(options.sourceLang, DEFAULT_SOURCE_LANG);\n const targetLang = normalizeLang(options.targetLang, DEFAULT_TARGET_LANG);\n const rows = filterRowsByType(\n materializeDatasetRows(options.inputPath, options.rawInput),\n requestedType,\n );\n const units = collectTranslationUnits(rows, sourceLang, targetLang);\n const files = outFiles(options.outDir);\n const report: DatasetBilingualExtractReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n requested_type: requestedType,\n source_lang: sourceLang,\n target_lang: targetLang,\n unit_count: units.length,\n row_count: rows.length,\n files,\n };\n\n if (files.translation_units) {\n writeJsonLinesArtifact(files.translation_units, units);\n }\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n return report;\n}\n\nexport async function runDatasetBilingualApply(\n options: RunDatasetBilingualApplyOptions,\n): Promise<DatasetBilingualApplyReport> {\n const targetLang = normalizeLang(options.targetLang, DEFAULT_TARGET_LANG);\n if (!options.outPath) {\n throw new CliError('Missing required --out value.', {\n code: 'DATASET_BILINGUAL_OUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!options.translationsPath) {\n throw new CliError('Missing required --translations value.', {\n code: 'DATASET_BILINGUAL_TRANSLATIONS_REQUIRED',\n exitCode: 2,\n });\n }\n\n const rows = readDatasetRowsInput(options.inputPath, options.rawInput).map((row) =>\n cloneJson(row),\n );\n const translations = readTranslationInputs(options.translationsPath, options.rawTranslations);\n const blockers: DatasetBilingualApplyReport['blockers'] = [];\n const evidence: TranslationEvidenceEntry[] = [];\n let appliedCount = 0;\n let skippedCount = 0;\n\n for (const translation of translations) {\n const result = applyTranslationToRows({ rows, translation, targetLang });\n if (result.applied) {\n appliedCount += 1;\n evidence.push(result.evidence);\n } else {\n skippedCount += 1;\n blockers.push({\n code: 'translation_not_applied',\n message: result.blocker,\n unit_id: translation.unit_id ?? undefined,\n });\n }\n }\n\n const resolvedOut = path.resolve(options.outPath);\n const resolvedOutDir = options.outDir ? path.resolve(options.outDir) : path.dirname(resolvedOut);\n const evidenceFile = path.join(resolvedOutDir, 'outputs', 'translation-evidence.json');\n const reportFile = path.join(resolvedOutDir, 'outputs', 'bilingual-apply-report.json');\n writeRowsJsonl(resolvedOut, rows);\n writeJsonArtifact(evidenceFile, {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n entries: evidence,\n });\n\n const report: DatasetBilingualApplyReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n translations_path: options.translationsPath,\n out_path: resolvedOut,\n target_lang: targetLang,\n status: blockers.length > 0 ? 'blocked' : 'completed',\n row_count: rows.length,\n translation_count: translations.length,\n applied_count: appliedCount,\n skipped_count: skippedCount,\n blockers,\n files: {\n translated_rows: resolvedOut,\n translation_evidence: evidenceFile,\n report: reportFile,\n },\n };\n writeJsonArtifact(reportFile, report);\n return report;\n}\n\nexport async function runDatasetBilingualValidate(\n options: RunDatasetBilingualValidateOptions,\n): Promise<DatasetBilingualValidateReport> {\n const requestedType = normalizeType(options.type);\n const rows = filterRowsByType(\n materializeDatasetRows(options.inputPath, options.rawInput),\n requestedType,\n );\n const findings = scanRows(rows);\n const files = validateFiles(options.outDir);\n const datasetValidateImpl = options.datasetValidateImpl ?? runDatasetValidate;\n const schemaGateOutDir = options.outDir\n ? path.join(path.resolve(options.outDir), 'schema')\n : null;\n const schemaReport = await datasetValidateImpl({\n inputPath: options.inputPath,\n type: requestedType,\n outDir: schemaGateOutDir,\n rawInput: { rows: rows.map((row) => row.row) },\n now: options.now,\n schemas: options.schemas,\n });\n\n let processReport: ProcessReviewReport | null = null;\n let flowReport: FlowReviewReport | null = null;\n if (options.outDir && (requestedType === 'process' || requestedType === 'auto')) {\n const processRows = rows.filter((row) => row.kind === 'process').map((row) => row.row);\n if (processRows.length > 0) {\n const processRowsFile = path.join(\n path.resolve(options.outDir),\n 'review-input-processes.jsonl',\n );\n writeJsonLinesArtifact(processRowsFile, processRows);\n processReport = await (options.processReviewImpl ?? runProcessReview)({\n rowsFile: processRowsFile,\n outDir: path.join(path.resolve(options.outDir), 'review', 'process'),\n now: () => options.now ?? new Date(),\n });\n }\n }\n if (options.outDir && (requestedType === 'flow' || requestedType === 'auto')) {\n const flowRows = rows.filter((row) => row.kind === 'flow').map((row) => row.row);\n if (flowRows.length > 0) {\n const flowRowsFile = path.join(path.resolve(options.outDir), 'review-input-flows.jsonl');\n writeJsonLinesArtifact(flowRowsFile, flowRows);\n flowReport = await (options.flowReviewImpl ?? runFlowReview)({\n rowsFile: flowRowsFile,\n outDir: path.join(path.resolve(options.outDir), 'review', 'flow'),\n now: () => options.now ?? new Date(),\n });\n }\n }\n\n const blockerCount = findings.filter((finding) => finding.severity === 'blocker').length;\n const warningCount = findings.filter((finding) => finding.severity === 'warning').length;\n const report: DatasetBilingualValidateReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n input_path: options.inputPath,\n requested_type: requestedType,\n status: blockerCount > 0 || schemaReport.counts.invalid > 0 ? 'blocked' : 'completed',\n row_count: rows.length,\n scan: {\n finding_count: findings.length,\n blocker_count: blockerCount,\n warning_count: warningCount,\n findings,\n },\n schema_gate: {\n status: schemaReport.status,\n valid: schemaReport.counts.valid,\n invalid: schemaReport.counts.invalid,\n report_file: schemaReport.files.report,\n },\n review_gate: {\n status: processReport || flowReport ? 'completed' : 'not_run',\n process_report_file: processReport?.files.report ?? null,\n flow_report_file: flowReport?.files.report ?? null,\n },\n files,\n };\n\n if (files.findings) {\n writeJsonLinesArtifact(files.findings, findings);\n }\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n return report;\n}\n\nexport const __testInternals = {\n collectTranslationUnits,\n normalizeType,\n pointerFromSegments,\n segmentsFromPointer,\n scanRows,\n};\n"]}
@@ -0,0 +1,350 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { createRequire } from 'node:module';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { writeJsonArtifact, writeTextArtifact } from './artifacts.js';
7
+ import { CliError } from './errors.js';
8
+ const requireFromHere = createRequire(import.meta.url);
9
+ const aliases = {
10
+ contact: 'contact',
11
+ contacts: 'contact',
12
+ flow: 'flow',
13
+ flows: 'flow',
14
+ flowproperty: 'flowproperty',
15
+ flowproperties: 'flowproperty',
16
+ lciamethod: 'lciamethod',
17
+ lciamethods: 'lciamethod',
18
+ lifecyclemodel: 'lifecyclemodel',
19
+ lifecyclemodels: 'lifecyclemodel',
20
+ process: 'process',
21
+ processes: 'process',
22
+ source: 'source',
23
+ sources: 'source',
24
+ unitgroup: 'unitgroup',
25
+ unitgroups: 'unitgroup',
26
+ };
27
+ const schemaFiles = {
28
+ contact: 'tidas_contacts.json',
29
+ flow: 'tidas_flows.json',
30
+ flowproperty: 'tidas_flowproperties.json',
31
+ lciamethod: 'tidas_lciamethods.json',
32
+ lifecyclemodel: 'tidas_lifecyclemodels.json',
33
+ process: 'tidas_processes.json',
34
+ source: 'tidas_sources.json',
35
+ unitgroup: 'tidas_unitgroups.json',
36
+ };
37
+ const methodologyFiles = {
38
+ flow: 'tidas_flows.yaml',
39
+ process: 'tidas_processes.yaml',
40
+ };
41
+ const allowedIncludes = new Set(['schema', 'methodology', 'ruleset']);
42
+ export async function runDatasetContract(options) {
43
+ const type = normalizeType(options.type);
44
+ const includes = normalizeIncludes(options.include);
45
+ const profile = normalizeProfile(options.profile ?? defaultProfile(options.mode));
46
+ const outDir = requireOutDir(options.outDir);
47
+ const includeAiContext = options.mode === 'context-pack';
48
+ const loaded = await loadContractPack({
49
+ type,
50
+ includes,
51
+ profile,
52
+ includeAiContext,
53
+ sdkModule: options.sdkModule,
54
+ runtimeAssetsRoot: options.runtimeAssetsRoot,
55
+ });
56
+ const files = buildFiles(outDir, loaded.pack, includeAiContext);
57
+ writeJsonArtifact(files.manifest, loaded.pack.manifest);
58
+ if (loaded.pack.schemaText && files.schema) {
59
+ writeTextArtifact(files.schema, `${loaded.pack.schemaText.trimEnd()}\n`);
60
+ }
61
+ if (loaded.pack.methodologyText && files.methodology) {
62
+ writeTextArtifact(files.methodology, `${loaded.pack.methodologyText.trimEnd()}\n`);
63
+ }
64
+ if (loaded.pack.runtimeRuleset && files.ruleset) {
65
+ writeJsonArtifact(files.ruleset, loaded.pack.runtimeRuleset);
66
+ }
67
+ if (loaded.pack.aiContext && files.ai_context_json) {
68
+ writeJsonArtifact(files.ai_context_json, loaded.pack.aiContext);
69
+ }
70
+ if (includeAiContext && files.ai_context_markdown) {
71
+ writeTextArtifact(files.ai_context_markdown, renderAiContextMarkdown(type, loaded.pack));
72
+ }
73
+ const report = {
74
+ schema_version: 1,
75
+ status: 'completed',
76
+ generated_at_utc: (options.now ?? new Date()).toISOString(),
77
+ mode: options.mode,
78
+ requested_type: String(options.type),
79
+ type,
80
+ profile,
81
+ includes,
82
+ source: loaded.source,
83
+ manifest: loaded.pack.manifest,
84
+ files,
85
+ };
86
+ writeJsonArtifact(files.report, report);
87
+ return report;
88
+ }
89
+ function normalizeType(value) {
90
+ const raw = value?.trim();
91
+ if (!raw) {
92
+ throw new CliError('Missing required --type value.', {
93
+ code: 'DATASET_CONTRACT_TYPE_REQUIRED',
94
+ exitCode: 2,
95
+ });
96
+ }
97
+ const normalized = raw.toLowerCase().replace(/[-_]/gu, '');
98
+ const type = aliases[normalized];
99
+ if (!type) {
100
+ throw new CliError(`Unsupported dataset contract type '${value}'. Supported types: ${Object.keys(aliases)
101
+ .sort()
102
+ .join(', ')}.`, {
103
+ code: 'DATASET_CONTRACT_TYPE_INVALID',
104
+ exitCode: 2,
105
+ });
106
+ }
107
+ return type;
108
+ }
109
+ function normalizeIncludes(value) {
110
+ const rawValues = Array.isArray(value) && value.length > 0
111
+ ? value
112
+ : value && !Array.isArray(value)
113
+ ? [value]
114
+ : ['schema,methodology,ruleset'];
115
+ const includes = rawValues.flatMap((raw) => raw
116
+ .split(',')
117
+ .map((item) => item.trim().toLowerCase())
118
+ .filter(Boolean));
119
+ if (!includes.length) {
120
+ throw new CliError('At least one --include value is required.', {
121
+ code: 'DATASET_CONTRACT_INCLUDE_REQUIRED',
122
+ exitCode: 2,
123
+ });
124
+ }
125
+ for (const include of includes) {
126
+ if (!allowedIncludes.has(include)) {
127
+ throw new CliError('--include values must be schema, methodology, or ruleset.', {
128
+ code: 'DATASET_CONTRACT_INCLUDE_INVALID',
129
+ exitCode: 2,
130
+ });
131
+ }
132
+ }
133
+ return Array.from(new Set(includes));
134
+ }
135
+ function normalizeProfile(value) {
136
+ if (value === 'default' || value === 'ai-import') {
137
+ return value;
138
+ }
139
+ throw new CliError("--profile must be 'default' or 'ai-import'.", {
140
+ code: 'DATASET_CONTRACT_PROFILE_INVALID',
141
+ exitCode: 2,
142
+ });
143
+ }
144
+ function defaultProfile(mode) {
145
+ return mode === 'context-pack' ? 'ai-import' : 'default';
146
+ }
147
+ function requireOutDir(value) {
148
+ if (!value?.trim()) {
149
+ throw new CliError('Missing required --out-dir value.', {
150
+ code: 'DATASET_CONTRACT_OUT_DIR_REQUIRED',
151
+ exitCode: 2,
152
+ });
153
+ }
154
+ return path.resolve(value);
155
+ }
156
+ async function loadContractPack(options) {
157
+ let sdkModule = options.sdkModule;
158
+ if (!sdkModule) {
159
+ sdkModule = requireFromHere('@tiangong-lca/tidas-sdk');
160
+ }
161
+ const getTidasContractPack = sdkModule.getTidasContractPack;
162
+ if (typeof getTidasContractPack === 'function') {
163
+ return {
164
+ source: 'sdk-contract-api',
165
+ pack: getTidasContractPack(options.type, {
166
+ include: options.includes,
167
+ profile: options.profile,
168
+ includeAiContext: options.includeAiContext,
169
+ }),
170
+ };
171
+ }
172
+ return {
173
+ source: 'sdk-runtime-assets',
174
+ pack: loadFallbackContractPack(options),
175
+ };
176
+ }
177
+ function loadFallbackContractPack(options) {
178
+ const runtimeRoot = options.runtimeAssetsRoot ?? resolveSdkRuntimeAssetsRoot();
179
+ const schemaText = options.includes.includes('schema')
180
+ ? readOptionalText(path.join(runtimeRoot, 'tidas', 'schemas', schemaFiles[options.type]))
181
+ : undefined;
182
+ const methodologyFile = methodologyFiles[options.type];
183
+ const methodologyText = options.includes.includes('methodology') && methodologyFile
184
+ ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', methodologyFile))
185
+ : undefined;
186
+ const rulesetText = options.includes.includes('ruleset')
187
+ ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', 'runtime_rulesets.json'))
188
+ : undefined;
189
+ const runtimeRuleset = rulesetText
190
+ ? filterRuntimeRuleset(JSON.parse(rulesetText), options.type)
191
+ : undefined;
192
+ const aiContext = options.includeAiContext
193
+ ? buildAiContext({
194
+ type: options.type,
195
+ profile: options.profile,
196
+ schemaText,
197
+ methodologyText,
198
+ runtimeRuleset,
199
+ })
200
+ : undefined;
201
+ return {
202
+ manifest: {
203
+ schema_version: 1,
204
+ kind: options.type,
205
+ profile: options.profile,
206
+ includes: options.includes,
207
+ sdk_package: '@tiangong-lca/tidas-sdk',
208
+ schema: schemaText ? artifactManifest(schemaFiles[options.type], schemaText) : null,
209
+ methodology: methodologyText && methodologyFile
210
+ ? artifactManifest(methodologyFile, methodologyText)
211
+ : null,
212
+ ruleset: runtimeRuleset
213
+ ? artifactManifest('runtime_rulesets.json', JSON.stringify(runtimeRuleset, null, 2))
214
+ : null,
215
+ },
216
+ schemaText,
217
+ methodologyText,
218
+ runtimeRuleset,
219
+ aiContext,
220
+ };
221
+ }
222
+ function resolveSdkRuntimeAssetsRoot(candidatesOverride, sdkEntryOverride) {
223
+ const sdkEntry = sdkEntryOverride ?? requireFromHere.resolve('@tiangong-lca/tidas-sdk');
224
+ const candidates = candidatesOverride ??
225
+ (() => {
226
+ const distRoot = path.dirname(sdkEntry);
227
+ const packagedRoot = path.join(distRoot, 'runtime-assets');
228
+ const cliRepoRoot = resolveCliRepoRoot();
229
+ const siblingSdkRoot = path.resolve(cliRepoRoot, '../tidas-sdk/sdks/typescript/src/runtime-assets');
230
+ return [siblingSdkRoot, packagedRoot];
231
+ })();
232
+ for (const candidate of candidates) {
233
+ if (existsSync(candidate)) {
234
+ return candidate;
235
+ }
236
+ }
237
+ throw new CliError('Could not resolve @tiangong-lca/tidas-sdk runtime assets.', {
238
+ code: 'DATASET_CONTRACT_SDK_ASSETS_NOT_FOUND',
239
+ exitCode: 1,
240
+ details: { sdkEntry },
241
+ });
242
+ }
243
+ function resolveCliRepoRoot(candidatesOverride) {
244
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
245
+ const candidates = candidatesOverride ?? [
246
+ path.resolve(moduleDir, '../..'),
247
+ path.resolve(moduleDir, '../../..'),
248
+ ];
249
+ return (candidates.find((candidate) => existsSync(path.join(candidate, 'package.json')) &&
250
+ existsSync(path.join(candidate, 'src/cli.ts'))) ?? candidates[0]);
251
+ }
252
+ function readOptionalText(filePath) {
253
+ if (!existsSync(filePath)) {
254
+ return undefined;
255
+ }
256
+ return readFileSync(filePath, 'utf8');
257
+ }
258
+ function filterRuntimeRuleset(source, type) {
259
+ const rulesets = Array.isArray(source.rulesets)
260
+ ? source.rulesets.filter((entry) => isRulesetForType(entry, type))
261
+ : [];
262
+ const rules = Array.isArray(source.rules)
263
+ ? source.rules.filter((entry) => isRulesetForType(entry, type))
264
+ : [];
265
+ if (!rulesets.length && !rules.length) {
266
+ return undefined;
267
+ }
268
+ return {
269
+ $schema: source.$schema,
270
+ schema_version: source.schema_version,
271
+ ruleset_version: source.ruleset_version,
272
+ purpose: source.purpose,
273
+ rulesets,
274
+ rules,
275
+ };
276
+ }
277
+ function isRulesetForType(entry, type) {
278
+ return (typeof entry === 'object' &&
279
+ entry !== null &&
280
+ 'dataset_type' in entry &&
281
+ entry.dataset_type === type);
282
+ }
283
+ function artifactManifest(name, content) {
284
+ return {
285
+ name,
286
+ sha256: createHash('sha256').update(content).digest('hex'),
287
+ bytes: Buffer.byteLength(content, 'utf8'),
288
+ };
289
+ }
290
+ function buildAiContext(options) {
291
+ return {
292
+ schema_version: 1,
293
+ kind: options.type,
294
+ profile: options.profile,
295
+ instructions: [
296
+ `Generate or repair only canonical TIDAS ${options.type} data.`,
297
+ 'Use the JSON schema as the structural contract.',
298
+ 'Use the methodology YAML as the semantic authoring contract when present.',
299
+ 'Treat runtime ruleset blocker rules as gate requirements.',
300
+ 'Return candidate data only; do not claim that database writes have happened.',
301
+ 'Preserve source provenance and unresolved assumptions so Foundry can build evidence and repair queues.',
302
+ ],
303
+ schema_text: options.schemaText,
304
+ methodology_text: options.methodologyText,
305
+ runtime_ruleset: options.runtimeRuleset,
306
+ };
307
+ }
308
+ function buildFiles(outDir, pack, includeAiContext) {
309
+ const outputsDir = path.join(outDir, 'outputs');
310
+ return {
311
+ manifest: path.join(outputsDir, 'contract-manifest.json'),
312
+ schema: pack.schemaText ? path.join(outputsDir, 'schema.json') : null,
313
+ methodology: pack.methodologyText ? path.join(outputsDir, 'methodology.yaml') : null,
314
+ ruleset: pack.runtimeRuleset ? path.join(outputsDir, 'runtime-ruleset.json') : null,
315
+ ai_context_json: includeAiContext && pack.aiContext ? path.join(outputsDir, 'ai-context.json') : null,
316
+ ai_context_markdown: includeAiContext ? path.join(outputsDir, 'ai-context.md') : null,
317
+ report: path.join(outputsDir, 'contract-report.json'),
318
+ };
319
+ }
320
+ function renderAiContextMarkdown(type, pack) {
321
+ const aiContext = isRecord(pack.aiContext) ? pack.aiContext : {};
322
+ const instructions = Array.isArray(aiContext.instructions)
323
+ ? aiContext.instructions.map((item) => `- ${String(item)}`).join('\n')
324
+ : '';
325
+ const sections = [`# TIDAS ${type} AI Context`, '', '## Instructions', instructions];
326
+ if (pack.methodologyText) {
327
+ sections.push('', '## Methodology YAML', '```yaml', pack.methodologyText.trimEnd(), '```');
328
+ }
329
+ if (pack.schemaText) {
330
+ sections.push('', '## JSON Schema', '```json', pack.schemaText.trimEnd(), '```');
331
+ }
332
+ if (pack.runtimeRuleset) {
333
+ sections.push('', '## Runtime Ruleset', '```json', JSON.stringify(pack.runtimeRuleset, null, 2), '```');
334
+ }
335
+ return `${sections.join('\n')}\n`;
336
+ }
337
+ function isRecord(value) {
338
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
339
+ }
340
+ export const __testInternals = {
341
+ filterRuntimeRuleset,
342
+ loadFallbackContractPack,
343
+ renderAiContextMarkdown,
344
+ resolveCliRepoRoot,
345
+ resolveSdkRuntimeAssetsRoot,
346
+ normalizeIncludes,
347
+ normalizeProfile,
348
+ normalizeType,
349
+ };
350
+ //# sourceMappingURL=dataset-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-contract.js","sourceRoot":"","sources":["../../../src/lib/dataset-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { writeJsonArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\n\nexport type DatasetContractInclude = 'schema' | 'methodology' | 'ruleset';\nexport type DatasetContractProfile = 'default' | 'ai-import';\nexport type DatasetContractMode = 'contract' | 'context-pack';\n\nexport type DatasetContractReport = {\n schema_version: 1;\n status: 'completed';\n generated_at_utc: string;\n mode: DatasetContractMode;\n requested_type: string;\n type: string;\n profile: DatasetContractProfile;\n includes: DatasetContractInclude[];\n source: 'sdk-contract-api' | 'sdk-runtime-assets';\n manifest: unknown;\n files: {\n manifest: string;\n schema: string | null;\n methodology: string | null;\n ruleset: string | null;\n ai_context_json: string | null;\n ai_context_markdown: string | null;\n report: string;\n };\n};\n\nexport type RunDatasetContractOptions = {\n type: string | undefined;\n include?: string | string[] | undefined;\n profile?: string | undefined;\n outDir: string | null | undefined;\n mode: DatasetContractMode;\n now?: Date;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n};\n\ntype ContractPack = {\n manifest: unknown;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n aiContext?: unknown;\n};\n\ntype CanonicalKind =\n | 'contact'\n | 'flow'\n | 'flowproperty'\n | 'lciamethod'\n | 'lifecyclemodel'\n | 'process'\n | 'source'\n | 'unitgroup';\n\nconst requireFromHere = createRequire(import.meta.url);\n\nconst aliases: Record<string, CanonicalKind> = {\n contact: 'contact',\n contacts: 'contact',\n flow: 'flow',\n flows: 'flow',\n flowproperty: 'flowproperty',\n flowproperties: 'flowproperty',\n lciamethod: 'lciamethod',\n lciamethods: 'lciamethod',\n lifecyclemodel: 'lifecyclemodel',\n lifecyclemodels: 'lifecyclemodel',\n process: 'process',\n processes: 'process',\n source: 'source',\n sources: 'source',\n unitgroup: 'unitgroup',\n unitgroups: 'unitgroup',\n};\n\nconst schemaFiles: Record<CanonicalKind, string> = {\n contact: 'tidas_contacts.json',\n flow: 'tidas_flows.json',\n flowproperty: 'tidas_flowproperties.json',\n lciamethod: 'tidas_lciamethods.json',\n lifecyclemodel: 'tidas_lifecyclemodels.json',\n process: 'tidas_processes.json',\n source: 'tidas_sources.json',\n unitgroup: 'tidas_unitgroups.json',\n};\n\nconst methodologyFiles: Partial<Record<CanonicalKind, string>> = {\n flow: 'tidas_flows.yaml',\n process: 'tidas_processes.yaml',\n};\n\nconst allowedIncludes = new Set<DatasetContractInclude>(['schema', 'methodology', 'ruleset']);\n\nexport async function runDatasetContract(\n options: RunDatasetContractOptions,\n): Promise<DatasetContractReport> {\n const type = normalizeType(options.type);\n const includes = normalizeIncludes(options.include);\n const profile = normalizeProfile(options.profile ?? defaultProfile(options.mode));\n const outDir = requireOutDir(options.outDir);\n const includeAiContext = options.mode === 'context-pack';\n const loaded = await loadContractPack({\n type,\n includes,\n profile,\n includeAiContext,\n sdkModule: options.sdkModule,\n runtimeAssetsRoot: options.runtimeAssetsRoot,\n });\n const files = buildFiles(outDir, loaded.pack, includeAiContext);\n\n writeJsonArtifact(files.manifest, loaded.pack.manifest);\n if (loaded.pack.schemaText && files.schema) {\n writeTextArtifact(files.schema, `${loaded.pack.schemaText.trimEnd()}\\n`);\n }\n if (loaded.pack.methodologyText && files.methodology) {\n writeTextArtifact(files.methodology, `${loaded.pack.methodologyText.trimEnd()}\\n`);\n }\n if (loaded.pack.runtimeRuleset && files.ruleset) {\n writeJsonArtifact(files.ruleset, loaded.pack.runtimeRuleset);\n }\n if (loaded.pack.aiContext && files.ai_context_json) {\n writeJsonArtifact(files.ai_context_json, loaded.pack.aiContext);\n }\n if (includeAiContext && files.ai_context_markdown) {\n writeTextArtifact(files.ai_context_markdown, renderAiContextMarkdown(type, loaded.pack));\n }\n\n const report: DatasetContractReport = {\n schema_version: 1,\n status: 'completed',\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n mode: options.mode,\n requested_type: String(options.type),\n type,\n profile,\n includes,\n source: loaded.source,\n manifest: loaded.pack.manifest,\n files,\n };\n writeJsonArtifact(files.report, report);\n\n return report;\n}\n\nfunction normalizeType(value: string | undefined): CanonicalKind {\n const raw = value?.trim();\n if (!raw) {\n throw new CliError('Missing required --type value.', {\n code: 'DATASET_CONTRACT_TYPE_REQUIRED',\n exitCode: 2,\n });\n }\n const normalized = raw.toLowerCase().replace(/[-_]/gu, '');\n const type = aliases[normalized];\n if (!type) {\n throw new CliError(\n `Unsupported dataset contract type '${value}'. Supported types: ${Object.keys(aliases)\n .sort()\n .join(', ')}.`,\n {\n code: 'DATASET_CONTRACT_TYPE_INVALID',\n exitCode: 2,\n },\n );\n }\n return type;\n}\n\nfunction normalizeIncludes(value: string | string[] | undefined): DatasetContractInclude[] {\n const rawValues =\n Array.isArray(value) && value.length > 0\n ? value\n : value && !Array.isArray(value)\n ? [value]\n : ['schema,methodology,ruleset'];\n const includes = rawValues.flatMap((raw) =>\n raw\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean),\n );\n\n if (!includes.length) {\n throw new CliError('At least one --include value is required.', {\n code: 'DATASET_CONTRACT_INCLUDE_REQUIRED',\n exitCode: 2,\n });\n }\n\n for (const include of includes) {\n if (!allowedIncludes.has(include as DatasetContractInclude)) {\n throw new CliError('--include values must be schema, methodology, or ruleset.', {\n code: 'DATASET_CONTRACT_INCLUDE_INVALID',\n exitCode: 2,\n });\n }\n }\n\n return Array.from(new Set(includes)) as DatasetContractInclude[];\n}\n\nfunction normalizeProfile(value: string): DatasetContractProfile {\n if (value === 'default' || value === 'ai-import') {\n return value;\n }\n throw new CliError(\"--profile must be 'default' or 'ai-import'.\", {\n code: 'DATASET_CONTRACT_PROFILE_INVALID',\n exitCode: 2,\n });\n}\n\nfunction defaultProfile(mode: DatasetContractMode): DatasetContractProfile {\n return mode === 'context-pack' ? 'ai-import' : 'default';\n}\n\nfunction requireOutDir(value: string | null | undefined): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'DATASET_CONTRACT_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(value);\n}\n\nasync function loadContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n sdkModule?: Record<string, unknown>;\n runtimeAssetsRoot?: string;\n}): Promise<{ source: DatasetContractReport['source']; pack: ContractPack }> {\n let sdkModule = options.sdkModule;\n if (!sdkModule) {\n sdkModule = requireFromHere('@tiangong-lca/tidas-sdk') as Record<string, unknown>;\n }\n const getTidasContractPack = sdkModule.getTidasContractPack;\n if (typeof getTidasContractPack === 'function') {\n return {\n source: 'sdk-contract-api',\n pack: getTidasContractPack(options.type, {\n include: options.includes,\n profile: options.profile,\n includeAiContext: options.includeAiContext,\n }) as ContractPack,\n };\n }\n\n return {\n source: 'sdk-runtime-assets',\n pack: loadFallbackContractPack(options),\n };\n}\n\nfunction loadFallbackContractPack(options: {\n type: CanonicalKind;\n includes: DatasetContractInclude[];\n profile: DatasetContractProfile;\n includeAiContext: boolean;\n runtimeAssetsRoot?: string;\n}): ContractPack {\n const runtimeRoot = options.runtimeAssetsRoot ?? resolveSdkRuntimeAssetsRoot();\n const schemaText = options.includes.includes('schema')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'schemas', schemaFiles[options.type]))\n : undefined;\n const methodologyFile = methodologyFiles[options.type];\n const methodologyText =\n options.includes.includes('methodology') && methodologyFile\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', methodologyFile))\n : undefined;\n const rulesetText = options.includes.includes('ruleset')\n ? readOptionalText(path.join(runtimeRoot, 'tidas', 'methodologies', 'runtime_rulesets.json'))\n : undefined;\n const runtimeRuleset = rulesetText\n ? filterRuntimeRuleset(JSON.parse(rulesetText) as Record<string, unknown>, options.type)\n : undefined;\n const aiContext = options.includeAiContext\n ? buildAiContext({\n type: options.type,\n profile: options.profile,\n schemaText,\n methodologyText,\n runtimeRuleset,\n })\n : undefined;\n\n return {\n manifest: {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n includes: options.includes,\n sdk_package: '@tiangong-lca/tidas-sdk',\n schema: schemaText ? artifactManifest(schemaFiles[options.type], schemaText) : null,\n methodology:\n methodologyText && methodologyFile\n ? artifactManifest(methodologyFile, methodologyText)\n : null,\n ruleset: runtimeRuleset\n ? artifactManifest('runtime_rulesets.json', JSON.stringify(runtimeRuleset, null, 2))\n : null,\n },\n schemaText,\n methodologyText,\n runtimeRuleset,\n aiContext,\n };\n}\n\nfunction resolveSdkRuntimeAssetsRoot(\n candidatesOverride?: string[],\n sdkEntryOverride?: string,\n): string {\n const sdkEntry = sdkEntryOverride ?? requireFromHere.resolve('@tiangong-lca/tidas-sdk');\n const candidates =\n candidatesOverride ??\n (() => {\n const distRoot = path.dirname(sdkEntry);\n const packagedRoot = path.join(distRoot, 'runtime-assets');\n const cliRepoRoot = resolveCliRepoRoot();\n const siblingSdkRoot = path.resolve(\n cliRepoRoot,\n '../tidas-sdk/sdks/typescript/src/runtime-assets',\n );\n return [siblingSdkRoot, packagedRoot];\n })();\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new CliError('Could not resolve @tiangong-lca/tidas-sdk runtime assets.', {\n code: 'DATASET_CONTRACT_SDK_ASSETS_NOT_FOUND',\n exitCode: 1,\n details: { sdkEntry },\n });\n}\n\nfunction resolveCliRepoRoot(candidatesOverride?: string[]): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(moduleDir, '../..'),\n path.resolve(moduleDir, '../../..'),\n ];\n return (\n candidates.find(\n (candidate) =>\n existsSync(path.join(candidate, 'package.json')) &&\n existsSync(path.join(candidate, 'src/cli.ts')),\n ) ?? candidates[0]\n );\n}\n\nfunction readOptionalText(filePath: string): string | undefined {\n if (!existsSync(filePath)) {\n return undefined;\n }\n return readFileSync(filePath, 'utf8');\n}\n\nfunction filterRuntimeRuleset(\n source: Record<string, unknown>,\n type: CanonicalKind,\n): unknown | undefined {\n const rulesets = Array.isArray(source.rulesets)\n ? source.rulesets.filter((entry) => isRulesetForType(entry, type))\n : [];\n const rules = Array.isArray(source.rules)\n ? source.rules.filter((entry) => isRulesetForType(entry, type))\n : [];\n if (!rulesets.length && !rules.length) {\n return undefined;\n }\n return {\n $schema: source.$schema,\n schema_version: source.schema_version,\n ruleset_version: source.ruleset_version,\n purpose: source.purpose,\n rulesets,\n rules,\n };\n}\n\nfunction isRulesetForType(entry: unknown, type: CanonicalKind): boolean {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n 'dataset_type' in entry &&\n (entry as { dataset_type?: unknown }).dataset_type === type\n );\n}\n\nfunction artifactManifest(\n name: string,\n content: string,\n): { name: string; sha256: string; bytes: number } {\n return {\n name,\n sha256: createHash('sha256').update(content).digest('hex'),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n}\n\nfunction buildAiContext(options: {\n type: CanonicalKind;\n profile: DatasetContractProfile;\n schemaText?: string;\n methodologyText?: string;\n runtimeRuleset?: unknown;\n}): unknown {\n return {\n schema_version: 1,\n kind: options.type,\n profile: options.profile,\n instructions: [\n `Generate or repair only canonical TIDAS ${options.type} data.`,\n 'Use the JSON schema as the structural contract.',\n 'Use the methodology YAML as the semantic authoring contract when present.',\n 'Treat runtime ruleset blocker rules as gate requirements.',\n 'Return candidate data only; do not claim that database writes have happened.',\n 'Preserve source provenance and unresolved assumptions so Foundry can build evidence and repair queues.',\n ],\n schema_text: options.schemaText,\n methodology_text: options.methodologyText,\n runtime_ruleset: options.runtimeRuleset,\n };\n}\n\nfunction buildFiles(\n outDir: string,\n pack: ContractPack,\n includeAiContext: boolean,\n): DatasetContractReport['files'] {\n const outputsDir = path.join(outDir, 'outputs');\n return {\n manifest: path.join(outputsDir, 'contract-manifest.json'),\n schema: pack.schemaText ? path.join(outputsDir, 'schema.json') : null,\n methodology: pack.methodologyText ? path.join(outputsDir, 'methodology.yaml') : null,\n ruleset: pack.runtimeRuleset ? path.join(outputsDir, 'runtime-ruleset.json') : null,\n ai_context_json:\n includeAiContext && pack.aiContext ? path.join(outputsDir, 'ai-context.json') : null,\n ai_context_markdown: includeAiContext ? path.join(outputsDir, 'ai-context.md') : null,\n report: path.join(outputsDir, 'contract-report.json'),\n };\n}\n\nfunction renderAiContextMarkdown(type: CanonicalKind, pack: ContractPack): string {\n const aiContext = isRecord(pack.aiContext) ? pack.aiContext : {};\n const instructions = Array.isArray(aiContext.instructions)\n ? aiContext.instructions.map((item) => `- ${String(item)}`).join('\\n')\n : '';\n const sections = [`# TIDAS ${type} AI Context`, '', '## Instructions', instructions];\n if (pack.methodologyText) {\n sections.push('', '## Methodology YAML', '```yaml', pack.methodologyText.trimEnd(), '```');\n }\n if (pack.schemaText) {\n sections.push('', '## JSON Schema', '```json', pack.schemaText.trimEnd(), '```');\n }\n if (pack.runtimeRuleset) {\n sections.push(\n '',\n '## Runtime Ruleset',\n '```json',\n JSON.stringify(pack.runtimeRuleset, null, 2),\n '```',\n );\n }\n return `${sections.join('\\n')}\\n`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const __testInternals = {\n filterRuntimeRuleset,\n loadFallbackContractPack,\n renderAiContextMarkdown,\n resolveCliRepoRoot,\n resolveSdkRuntimeAssetsRoot,\n normalizeIncludes,\n normalizeProfile,\n normalizeType,\n};\n"]}