/** * 活动包的编译产出 —— **构建工具**,不是活动包的一部分(编码规范 §8.2 / ADR-004)。 * * 「活动包 = 包清单 + 代码产物(.JS)+ 资产文件;清单**机器可读**, * 系统不执行代码即知包为何物。」 * * 产出 `activities//dist/{manifest.json,index.js}`; * api 侧只经**文件**读取它们 —— 与 activities 之间只有安装通道,没有代码通道。 * 放在 tools/ 而非 activities/ 是因为它要用 fs:活动包本身**零环境能力**,构建脚本不受此限。 */ import { mkdir, readFile, writeFile } from 'node:fs/promises'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { manifest as quoteIntake } from '../activities/quote-intake/src/manifest.ts'; import { manifest as quotePricing } from '../activities/quote-pricing/src/manifest.ts'; import { manifest as quoteNegotiate } from '../activities/quote-negotiate/src/manifest.ts'; import { manifest as quoteArchive } from '../activities/quote-archive/src/manifest.ts'; import { manifest as quoteSourcing } from '../activities/quote-sourcing/src/manifest.ts'; import { manifest as quoteAlternative } from '../activities/quote-alternative/src/manifest.ts'; import { manifest as crmRelationshipCoverage } from '../activities/crm-relationship-coverage/src/manifest.ts'; import { manifest as brandContentToolkit } from '../activities/brand-content-toolkit/src/manifest.ts'; import { manifest as partSubstitutionAssessment } from '../activities/part-substitution-assessment/src/manifest.ts'; const root = dirname(dirname(fileURLToPath(import.meta.url))); const PACKAGES = [ { dir: 'quote-intake', manifest: quoteIntake }, { dir: 'quote-pricing', manifest: quotePricing }, { dir: 'quote-negotiate', manifest: quoteNegotiate }, { dir: 'quote-archive', manifest: quoteArchive }, { dir: 'quote-sourcing', manifest: quoteSourcing }, { dir: 'quote-alternative', manifest: quoteAlternative }, { dir: 'crm-relationship-coverage', manifest: crmRelationshipCoverage }, { dir: 'brand-content-toolkit', manifest: brandContentToolkit }, { dir: 'part-substitution-assessment', manifest: partSubstitutionAssessment }, ] as const; for (const pkg of PACKAGES) { const base = join(root, 'activities', pkg.dir); const dist = join(base, 'dist'); await mkdir(dist, { recursive: true }); await writeFile(join(dist, 'manifest.json'), JSON.stringify(pkg.manifest, null, 2), 'utf8'); // MVP 阶段直接把源码文本当产物落盘:静态审扫描的正是产物文本(import 与全局引用)。 // 真编译(tsup 单文件 ESM)在装载器落地时接入 —— 见 docs/debt.md · M5-3 const source = await readFile(join(base, 'src', 'index.ts'), 'utf8'); await writeFile(join(dist, 'index.js'), source, 'utf8'); process.stdout.write(`活动包已产出:${pkg.dir}\n`); }