@umec/core 0.1.0-alpha.10 → 0.1.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/doctor.ts","../schema/upgrades/v2-to-v6.ts","../src/cli/checksum.ts","../src/cli/extend.ts","../src/cli/migrate.ts","../src/cli/wrangler.ts","../src/cli/executor.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadSnapshotJson } from \"../db/catalog.js\";\nimport type { SchemaSnapshot } from \"../db/snapshot.js\";\nimport { findPackageRoot } from \"../package-root.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { runExtend } from \"./extend.js\";\nimport { coreVersionFromPackage, runMigrate, type MigrateOptions } from \"./migrate.js\";\nimport { createWranglerExecutor, readD1DatabaseName, type RunCommand } from \"./wrangler.js\";\nimport type { MigrationExecutor } from \"./executor.js\";\n\nexport type CliIo = {\n cwd?: string;\n stdout?: (message: string) => void;\n stderr?: (message: string) => void;\n executor?: MigrationExecutor;\n runCommand?: RunCommand;\n};\n\nexport function parseArgs(argv: string[]): {\n command: string | null;\n flags: Record<string, string | boolean>;\n} {\n const flags: Record<string, string | boolean> = {};\n let command: string | null = null;\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i];\n if (!arg) continue;\n if (arg.startsWith(\"--\")) {\n const eq = arg.indexOf(\"=\");\n if (eq > 0) {\n flags[arg.slice(2, eq)] = arg.slice(eq + 1);\n continue;\n }\n const name = arg.slice(2);\n const next = argv[i + 1];\n if (next && !next.startsWith(\"--\") && name !== \"dry-run\" && name !== \"adopt\" && name !== \"repair\" && name !== \"remote\" && name !== \"local\") {\n flags[name] = next;\n i += 1;\n } else {\n flags[name] = true;\n }\n continue;\n }\n if (!command) command = arg;\n }\n return { command, flags };\n}\n\nfunction usage(): string {\n return `Usage:\n umec migrate [--dry-run] [--local|--remote] [--adopt] [--repair] [--database NAME]\n umec doctor [--local|--remote] [--database NAME]\n umec extend [--key NAME] [--type boolean|string|number]`;\n}\n\nexport async function runCli(argv: string[], io: CliIo = {}): Promise<number> {\n const cwd = io.cwd ?? process.cwd();\n const stdout = io.stdout ?? ((message) => console.log(message));\n const stderr = io.stderr ?? ((message) => console.error(message));\n const { command, flags } = parseArgs(argv);\n\n if (!command || command === \"help\" || flags.help) {\n stdout(usage());\n return command ? 0 : 1;\n }\n\n const snapshot = loadSnapshotJson() as SchemaSnapshot;\n const remote = flags.remote === true;\n const database = typeof flags.database === \"string\" ? flags.database : readD1DatabaseName(cwd);\n\n const executor =\n io.executor ??\n (command === \"extend\" || (command === \"migrate\" && flags[\"dry-run\"] === true)\n ? undefined\n : database\n ? createWranglerExecutor({ cwd, database, remote, runCommand: io.runCommand })\n : undefined);\n\n if (command === \"migrate\") {\n if (flags[\"dry-run\"] === true && !io.executor) {\n const migrations = (await import(\"../db/catalog.js\")).listCoreMigrations();\n stdout(\"dry-run (no D1 connection)\");\n stdout(\"ensure umec_schema_version / umec_migrations\");\n for (const migration of migrations) stdout(`apply core/${migration.name}`);\n stdout(`would set umec_schema_version.version = ${snapshot.version}`);\n return 0;\n }\n if (!executor) {\n stderr(\"wrangler.jsonc の d1_databases[0].database_name が見つかりません。--database を指定してください。\");\n return 1;\n }\n const options: MigrateOptions = {\n cwd,\n executor,\n snapshot,\n dryRun: flags[\"dry-run\"] === true,\n adopt: flags.adopt === true,\n repair: flags.repair === true,\n coreVersion: coreVersionFromPackage(),\n print: stdout,\n };\n const result = await runMigrate(options);\n for (const warning of result.warnings) stdout(`warn: ${warning}`);\n if (result.error) stderr(result.error);\n return result.exitCode;\n }\n\n if (command === \"doctor\") {\n const result = await runDoctor({\n cwd,\n executor,\n snapshot,\n print: stdout,\n });\n return result.exitCode;\n }\n\n if (command === \"extend\") {\n const result = runExtend({\n cwd,\n key: typeof flags.key === \"string\" ? flags.key : undefined,\n type: typeof flags.type === \"string\" ? flags.type : undefined,\n print: stdout,\n });\n if (result.error) stderr(result.error);\n return result.exitCode;\n }\n\n stderr(usage());\n return 1;\n}\n\nfunction isDirectRun(): boolean {\n const invoked = process.argv[1];\n if (!invoked) return false;\n return /(?:^|[\\\\/])cli(?:\\.js)?$/.test(invoked) || invoked.includes(`${join(\"dist\", \"cli\")}`);\n}\n\nif (isDirectRun()) {\n const pkg = JSON.parse(readFileSync(join(findPackageRoot(), \"package.json\"), \"utf8\")) as { version: string };\n if (process.argv.includes(\"--version\") || process.argv.includes(\"-V\")) {\n console.log(pkg.version);\n process.exit(0);\n }\n runCli(process.argv.slice(2)).then(\n (code) => process.exit(code),\n (error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n },\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { upgradeV2toV6 } from \"../../schema/upgrades/v2-to-v6.js\";\nimport { currentSchemaVersion, listCoreMigrations } from \"../db/catalog.js\";\nimport { classifyDrift } from \"../db/drift.js\";\nimport { introspectSnapshot } from \"../db/introspect.js\";\nimport type { SchemaSnapshot } from \"../db/snapshot.js\";\nimport { sha256File } from \"./checksum.js\";\nimport type { MigrationExecutor } from \"./executor.js\";\nimport type { Printer } from \"./migrate.js\";\n\nexport type DoctorOptions = {\n cwd: string;\n executor?: MigrationExecutor;\n snapshot: SchemaSnapshot;\n print?: Printer;\n};\n\nexport type DoctorResult = {\n exitCode: number;\n lines: string[];\n};\n\nexport async function runDoctor(options: DoctorOptions): Promise<DoctorResult> {\n const print = options.print ?? (() => {});\n const lines: string[] = [];\n const installed = currentSchemaVersion();\n let exitCode = 0;\n\n const say = (line: string) => {\n lines.push(line);\n print(line);\n };\n\n say(`installed schema version: ${installed}`);\n\n if (!options.executor) {\n say(\"no database executor; offline checks only\");\n } else {\n try {\n const version = await options.executor.first<{ version: number; core_version: string }>(\n \"SELECT version, core_version FROM umec_schema_version WHERE id = 1\",\n );\n if (!version) {\n say(\"umec_schema_version: missing (run umec migrate)\");\n } else {\n say(`database schema version: ${version.version} (core ${version.core_version})`);\n if (version.version > installed) {\n exitCode = 1;\n say(\n `DB は schema v${version.version}。インストール中の @umec/core は v${installed} までしか知らない。戻すには wrangler d1 time-travel restore --bookmark=<記録済み> のあと同じ core バージョンを入れ直すこと。down migration は無い。`,\n );\n }\n }\n } catch {\n say(\"umec_schema_version: unreadable (run umec migrate)\");\n }\n\n const actual = await introspectViaExecutor(options.executor, options.snapshot.version);\n const drift = classifyDrift(options.snapshot, actual);\n for (const finding of drift.compatible) say(`warn: ${finding.message}`);\n for (const finding of drift.incompatible) {\n exitCode = 1;\n say(`error: ${finding.message}`);\n }\n if (await upgradeV2toV6.canApply(options.executor)) {\n exitCode = 1;\n say(\"error: orders は event_id PK の旧スキーマです。umec migrate --repair を実行してください。\");\n }\n\n const applied = await options.executor.all<{ name: string; checksum: string }>(\n \"SELECT name, checksum FROM umec_migrations\",\n ).catch(() => []);\n const appliedByName = new Map(applied.map((row) => [row.name, row.checksum]));\n for (const migration of listCoreMigrations()) {\n const expected = sha256File(migration.path);\n const got = appliedByName.get(migration.name);\n if (got && got !== expected) {\n exitCode = 1;\n say(`error: checksum mismatch ${migration.name}`);\n }\n }\n }\n\n const extensionsPath = join(options.cwd, \"src/config/extensions.ts\");\n if (!existsSync(extensionsPath)) {\n say(\"warn: src/config/extensions.ts がありません。拡張は umec extend で extras_json に足してください。\");\n }\n\n return { exitCode, lines };\n}\n\nasync function introspectViaExecutor(executor: MigrationExecutor, version: number) {\n const db = {\n prepare(query: string) {\n return {\n bind(...values: unknown[]) {\n this._params = values;\n return this;\n },\n _params: [] as unknown[],\n async first<T>() {\n return executor.first<T>(query, this._params);\n },\n async all<T>() {\n return { results: await executor.all<T>(query, this._params) };\n },\n async run() {\n const result = await executor.run(query, this._params);\n return { meta: { changes: result.changes } };\n },\n };\n },\n async batch() {\n return [];\n },\n };\n return introspectSnapshot(db, version);\n}\n","import type { UpgradeExecutor, UpgradeModule } from \"./types.js\";\n\nexport const UPGRADE_PAGE_SIZE = 500;\n\nexport const LEGACY_0002_SQL = `CREATE TABLE IF NOT EXISTS orders (\n event_id TEXT PRIMARY KEY NOT NULL,\n session_id TEXT NOT NULL,\n amount_total INTEGER NOT NULL,\n currency TEXT NOT NULL,\n customer_email TEXT NOT NULL,\n run_id TEXT,\n created_at INTEGER NOT NULL\n);\n`;\n\nexport const V6_ORDERS_DDL = `CREATE TABLE orders_new (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL,\n name TEXT,\n phone TEXT,\n items_json TEXT NOT NULL,\n amount INTEGER NOT NULL,\n shipping INTEGER,\n address_json TEXT,\n payment_intent TEXT,\n custom_fields_json TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n run_id TEXT,\n email_status TEXT CHECK (email_status IN ('sent', 'failed')),\n created_at INTEGER NOT NULL,\n shipped_at INTEGER,\n tracking_number TEXT,\n carrier TEXT CHECK (carrier IN ('yamato', 'sagawa', 'japanpost', 'other') OR carrier IS NULL)\n)`;\n\ntype LegacyOrderRow = {\n event_id: string;\n session_id?: string | null;\n amount_total?: number | null;\n amount?: number | null;\n customer_email?: string | null;\n email?: string | null;\n name?: string | null;\n phone?: string | null;\n items_json?: string | null;\n shipping?: number | null;\n address_json?: string | null;\n payment_intent?: string | null;\n custom_fields_json?: string | null;\n status?: string | null;\n run_id?: string | null;\n email_status?: string | null;\n created_at: number;\n shipped_at?: number | null;\n tracking_number?: string | null;\n carrier?: string | null;\n};\n\ntype TableInfoRow = {\n name: string;\n pk: number;\n};\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNullableString(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction asNullableNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nexport async function detectLegacyOrdersPk(db: UpgradeExecutor): Promise<boolean> {\n const columns = await db.all<TableInfoRow>(\"PRAGMA table_info(orders)\");\n if (columns.length === 0) return false;\n const eventId = columns.find((column) => column.name === \"event_id\");\n return eventId != null && eventId.pk === 1;\n}\n\nexport function mapLegacyOrder(row: LegacyOrderRow): {\n id: string;\n email: string;\n name: string | null;\n phone: string | null;\n items_json: string;\n amount: number;\n shipping: number | null;\n address_json: string | null;\n payment_intent: string | null;\n custom_fields_json: string | null;\n status: string;\n run_id: string | null;\n email_status: string | null;\n created_at: number;\n shipped_at: number | null;\n tracking_number: string | null;\n carrier: string | null;\n} {\n const sessionId = asNullableString(row.session_id);\n const eventId = asString(row.event_id);\n return {\n id: sessionId && sessionId.length > 0 ? sessionId : eventId,\n email: asString(row.customer_email ?? row.email),\n name: asNullableString(row.name),\n phone: asNullableString(row.phone),\n items_json: asNullableString(row.items_json) ?? \"[]\",\n amount: asNumber(row.amount_total ?? row.amount),\n shipping: asNullableNumber(row.shipping),\n address_json: asNullableString(row.address_json),\n payment_intent: asNullableString(row.payment_intent),\n custom_fields_json: asNullableString(row.custom_fields_json),\n status: asNullableString(row.status) ?? \"pending\",\n run_id: asNullableString(row.run_id),\n email_status: asNullableString(row.email_status),\n created_at: asNumber(row.created_at),\n shipped_at: asNullableNumber(row.shipped_at),\n tracking_number: asNullableString(row.tracking_number),\n carrier: asNullableString(row.carrier),\n };\n}\n\nexport async function applyV2toV6(db: UpgradeExecutor): Promise<void> {\n if (!(await detectLegacyOrdersPk(db))) {\n throw new Error(\"v2-to-v6: orders.event_id primary key not found; refuse to rebuild\");\n }\n\n await db.exec(\"DROP TABLE IF EXISTS orders_new\");\n await db.exec(V6_ORDERS_DDL);\n\n let cursor: string | null = null;\n for (;;) {\n const pageSql = cursor\n ? \"SELECT * FROM orders WHERE event_id > ? ORDER BY event_id LIMIT ?\"\n : \"SELECT * FROM orders ORDER BY event_id LIMIT ?\";\n const pageParams = cursor ? [cursor, UPGRADE_PAGE_SIZE] : [UPGRADE_PAGE_SIZE];\n const rows: LegacyOrderRow[] = await db.all<LegacyOrderRow>(pageSql, pageParams);\n if (rows.length === 0) break;\n\n for (const row of rows) {\n const mapped = mapLegacyOrder(row);\n await db.run(\n `INSERT INTO orders_new (\n id, email, name, phone, items_json, amount, shipping, address_json,\n payment_intent, custom_fields_json, status, run_id, email_status,\n created_at, shipped_at, tracking_number, carrier\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n mapped.id,\n mapped.email,\n mapped.name,\n mapped.phone,\n mapped.items_json,\n mapped.amount,\n mapped.shipping,\n mapped.address_json,\n mapped.payment_intent,\n mapped.custom_fields_json,\n mapped.status,\n mapped.run_id,\n mapped.email_status,\n mapped.created_at,\n mapped.shipped_at,\n mapped.tracking_number,\n mapped.carrier,\n ],\n );\n }\n\n const last: LegacyOrderRow | undefined = rows[rows.length - 1];\n if (!last) break;\n cursor = last.event_id;\n if (rows.length < UPGRADE_PAGE_SIZE) break;\n }\n\n const oldCount = await db.first<{ n: number }>(\"SELECT COUNT(*) AS n FROM orders\");\n const newCount = await db.first<{ n: number }>(\"SELECT COUNT(*) AS n FROM orders_new\");\n const expected = oldCount?.n ?? -1;\n const copied = newCount?.n ?? -2;\n if (expected !== copied) {\n throw new Error(\n `v2-to-v6: COUNT mismatch orders=${expected} orders_new=${copied}. DROP skipped. Restore from Time Travel bookmark.`,\n );\n }\n\n await db.exec(\"DROP TABLE orders\");\n await db.exec(\"ALTER TABLE orders_new RENAME TO orders\");\n await db.exec(\"CREATE INDEX IF NOT EXISTS orders_payment_intent_idx ON orders(payment_intent)\");\n}\n\nexport const upgradeV2toV6: UpgradeModule = {\n name: \"v2-to-v6\",\n fromVersion: 2,\n toVersion: 6,\n description: \"Rebuild orders from event_id PK (v2) to id PK (v6)\",\n replacesChecksums: [\"ca6ec5c885f715a3ae65a7101787d66750ed831370dc2ecde0636cfc3cf83e24\"],\n canApply: detectLegacyOrdersPk,\n apply: applyV2toV6,\n};\n","import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\n\nexport function sha256Bytes(contents: Buffer | string): string {\n return createHash(\"sha256\").update(contents).digest(\"hex\");\n}\n\nexport function sha256File(path: string): string {\n return sha256Bytes(readFileSync(path));\n}\n\nexport function loadFrozenChecksums(path: string): Record<string, string> {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, string>;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Printer } from \"./migrate.js\";\n\nconst EXTENSION_TYPES = {\n boolean: \"z.boolean().optional()\",\n string: \"z.string().optional()\",\n number: \"z.number().optional()\",\n} as const;\n\nexport type ExtendType = keyof typeof EXTENSION_TYPES;\n\nexport type ExtendOptions = {\n cwd: string;\n key?: string;\n type?: string;\n print?: Printer;\n};\n\nconst STUB = `import { z } from \"zod\";\n\nexport const orderExtensionSchema = z.object({\n});\n\nexport type OrderExtension = z.infer<typeof orderExtensionSchema>;\n`;\n\nfunction isExtendType(value: string): value is ExtendType {\n return value in EXTENSION_TYPES;\n}\n\nexport function runExtend(options: ExtendOptions): { exitCode: number; path: string; error?: string } {\n const print = options.print ?? (() => {});\n const path = join(options.cwd, \"src/config/extensions.ts\");\n mkdirSync(dirname(path), { recursive: true });\n\n if (!existsSync(path)) {\n writeFileSync(path, STUB);\n print(`created ${path}`);\n }\n\n const key = options.key;\n if (!key) {\n print(\"拡張は orders.extras_json に Zod で足す。orders を ALTER しないこと。\");\n print(`編集ファイル: ${path}`);\n return { exitCode: 0, path };\n }\n\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n return { exitCode: 1, path, error: `invalid extras key: ${key}` };\n }\n\n const typeName = options.type ?? \"string\";\n if (!isExtendType(typeName)) {\n return { exitCode: 1, path, error: `unsupported type ${typeName} (boolean|string|number)` };\n }\n\n let source = readFileSync(path, \"utf8\");\n if (new RegExp(`\\\\b${key}:`).test(source)) {\n print(`${key} already exists in ${path}`);\n return { exitCode: 0, path };\n }\n\n if (!source.includes(\"orderExtensionSchema\")) {\n return { exitCode: 1, path, error: \"orderExtensionSchema not found in extensions.ts\" };\n }\n\n source = source.replace(\n /export const orderExtensionSchema = z\\.object\\(\\{\\n/,\n `export const orderExtensionSchema = z.object({\\n ${key}: ${EXTENSION_TYPES[typeName]},\\n`,\n );\n writeFileSync(path, source);\n print(`added ${key}: ${typeName} to extras_json via ${path}`);\n print(\"orders テーブルを ALTER しないこと。予約列 extras_json だけを使う。\");\n return { exitCode: 0, path };\n}\n","import { readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { upgradeV2toV6 } from \"../../schema/upgrades/v2-to-v6.js\";\nimport type { UpgradeModule } from \"../../schema/upgrades/types.js\";\nimport { currentSchemaVersion, listCoreMigrations } from \"../db/catalog.js\";\nimport { classifyDrift, type DriftFinding } from \"../db/drift.js\";\nimport { introspectSnapshot } from \"../db/introspect.js\";\nimport { TRACKING_TABLES_SQL } from \"../db/schema-version.js\";\nimport { CORE_TABLES, type SchemaSnapshot } from \"../db/snapshot.js\";\nimport { sha256File } from \"./checksum.js\";\nimport type { MigrationExecutor } from \"./executor.js\";\nimport { findPackageRoot } from \"../package-root.js\";\n\nexport const CORE_UPGRADES: UpgradeModule[] = [upgradeV2toV6];\n\nexport type Printer = (message: string) => void;\n\nexport type MigrateOptions = {\n cwd: string;\n executor: MigrationExecutor;\n snapshot: SchemaSnapshot;\n dryRun?: boolean;\n adopt?: boolean;\n repair?: boolean;\n coreVersion: string;\n now?: number;\n print?: Printer;\n};\n\nexport type MigrateResult = {\n exitCode: number;\n applied: string[];\n warnings: string[];\n error?: string;\n bookmark?: string | null;\n};\n\ntype AppliedRow = { name: string; checksum: string; kind: string };\n\nasync function ensureTracking(executor: MigrationExecutor, dryRun: boolean, print: Printer): Promise<void> {\n print(\"ensure umec_schema_version / umec_migrations\");\n if (dryRun) return;\n await executor.applySql(TRACKING_TABLES_SQL);\n}\n\nasync function readApplied(executor: MigrationExecutor): Promise<AppliedRow[]> {\n try {\n return await executor.all<AppliedRow>(\"SELECT name, checksum, kind FROM umec_migrations\");\n } catch {\n return [];\n }\n}\n\nasync function readVersion(executor: MigrationExecutor): Promise<number | null> {\n try {\n const row = await executor.first<{ version: number }>(\n \"SELECT version FROM umec_schema_version WHERE id = 1\",\n );\n return row?.version ?? null;\n } catch {\n return null;\n }\n}\n\nasync function recordMigration(\n executor: MigrationExecutor,\n name: string,\n checksum: string,\n kind: \"sql\" | \"upgrade\",\n now: number,\n): Promise<void> {\n await executor.run(\n `INSERT INTO umec_migrations (name, checksum, kind, applied_at) VALUES (?, ?, ?, ?)\n ON CONFLICT(name) DO UPDATE SET checksum = excluded.checksum, kind = excluded.kind, applied_at = excluded.applied_at`,\n [name, checksum, kind, now],\n );\n}\n\nasync function writeVersion(\n executor: MigrationExecutor,\n version: number,\n coreVersion: string,\n now: number,\n bookmark: string | null,\n): Promise<void> {\n await executor.run(\n `INSERT INTO umec_schema_version (id, version, core_version, applied_at, time_travel_bookmark)\n VALUES (1, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n version = excluded.version,\n core_version = excluded.core_version,\n applied_at = excluded.applied_at,\n time_travel_bookmark = excluded.time_travel_bookmark`,\n [version, coreVersion, now, bookmark],\n );\n}\n\nfunction listLocalMigrations(cwd: string): { name: string; path: string; sql: string }[] {\n const dir = join(cwd, \"migrations\", \"local\");\n try {\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".sql\"))\n .sort()\n .map((name) => ({\n name: `local/${name}`,\n path: join(dir, name),\n sql: readFileSync(join(dir, name), \"utf8\"),\n }));\n } catch {\n return [];\n }\n}\n\nasync function adoptD1History(\n executor: MigrationExecutor,\n now: number,\n print: Printer,\n): Promise<{ adopted: string[]; warnings: string[] }> {\n const warnings: string[] = [];\n let names: string[] = [];\n try {\n const rows = await executor.all<{ name: string }>(\"SELECT name FROM d1_migrations\");\n names = rows.map((row) => row.name);\n } catch {\n throw new Error(\"d1_migrations が見つかりません。--adopt は wrangler 管理下の既存 D1 向けです。\");\n }\n\n const core = listCoreMigrations();\n const byFile = new Map(core.map((migration) => [migration.name, migration]));\n const adopted: string[] = [];\n const legacy = await upgradeV2toV6.canApply(executor);\n\n for (const rawName of names) {\n const fileName = rawName.split(\"/\").pop() ?? rawName;\n const migration = byFile.get(fileName);\n if (!migration) {\n warnings.push(`d1_migrations の ${rawName} は core に無いのでスキップ`);\n continue;\n }\n const checksum =\n fileName === \"0002_orders.sql\" && legacy\n ? (upgradeV2toV6.replacesChecksums[0] ?? sha256File(migration.path))\n : sha256File(migration.path);\n await recordMigration(executor, migration.name, checksum, \"sql\", now);\n adopted.push(migration.name);\n print(`adopt ${migration.name}`);\n }\n\n return { adopted, warnings };\n}\n\nasync function snapshotFromExecutor(\n executor: MigrationExecutor,\n version: number,\n): Promise<SchemaSnapshot> {\n const db = {\n prepare(query: string) {\n return {\n bind(...values: unknown[]) {\n this._params = values;\n return this;\n },\n _params: [] as unknown[],\n async first<T>() {\n return executor.first<T>(query, this._params);\n },\n async all<T>() {\n const results = await executor.all<T>(query, this._params);\n return { results };\n },\n async run() {\n const result = await executor.run(query, this._params);\n return { meta: { changes: result.changes } };\n },\n };\n },\n async batch() {\n return [];\n },\n };\n return introspectSnapshot(db, version);\n}\n\nexport async function runMigrate(options: MigrateOptions): Promise<MigrateResult> {\n const print = options.print ?? (() => {});\n const dryRun = options.dryRun === true;\n const now = options.now ?? Date.now();\n const applied: string[] = [];\n const warnings: string[] = [];\n const installedVersion = currentSchemaVersion();\n\n try {\n await ensureTracking(options.executor, dryRun, print);\n\n const dbVersion = dryRun ? null : await readVersion(options.executor);\n if (dbVersion != null && dbVersion > installedVersion) {\n return {\n exitCode: 1,\n applied,\n warnings,\n error: `DB は schema v${dbVersion}。インストール中の @umec/core は v${installedVersion} までしか知らない。戻すには wrangler d1 time-travel restore --bookmark=<記録済み> のあと同じ core バージョンを入れ直すこと。down migration は無い。`,\n };\n }\n\n if (options.adopt) {\n print(\"adopt d1_migrations → umec_migrations\");\n if (dryRun) {\n return { exitCode: 0, applied: [\"--adopt\"], warnings };\n }\n const result = await adoptD1History(options.executor, now, print);\n applied.push(...result.adopted);\n warnings.push(...result.warnings);\n const bookmark = await options.executor.captureBookmark();\n const maxAdopted = result.adopted.reduce((max, name) => Math.max(max, Number(name.slice(0, 4)) || 0), 0);\n await writeVersion(options.executor, maxAdopted, options.coreVersion, now, bookmark);\n return { exitCode: 0, applied, warnings, bookmark };\n }\n\n if (!dryRun) {\n const actual = await snapshotFromExecutor(options.executor, options.snapshot.version);\n const fresh = CORE_TABLES.every((table) => !actual.tables[table]);\n if (!fresh) {\n const alreadyForDrift = await readApplied(options.executor);\n const pendingSql = listCoreMigrations()\n .filter((migration) => !alreadyForDrift.some((row) => row.name === migration.name))\n .map((migration) => migration.sql)\n .join(\"\\n\");\n const drift = classifyDrift(options.snapshot, actual);\n for (const finding of drift.compatible) {\n warnings.push(finding.message);\n print(`warn: ${finding.message}`);\n }\n const blocking = drift.incompatible.filter((finding) => !pendingMigrationFixes(pendingSql, finding));\n const repairable = options.repair && (await upgradeV2toV6.canApply(options.executor));\n if (blocking.length > 0 && !repairable) {\n const details = blocking.map((finding) => finding.message).join(\"; \");\n const hint = (await upgradeV2toV6.canApply(options.executor))\n ? \" umec migrate --repair で v2-to-v6 を提案できます。\"\n : \"\";\n return {\n exitCode: 1,\n applied,\n warnings,\n error: `非互換 drift のため migrate を拒否: ${details}.${hint}`,\n };\n }\n }\n }\n\n const already = dryRun ? [] : await readApplied(options.executor);\n const alreadyByName = new Map(already.map((row) => [row.name, row]));\n const coreMigrations = listCoreMigrations();\n\n for (const migration of coreMigrations) {\n const currentHash = sha256File(migration.path);\n const recorded = alreadyByName.get(migration.name);\n if (recorded && recorded.checksum !== currentHash) {\n const knownLegacy = CORE_UPGRADES.some((upgrade) => upgrade.replacesChecksums.includes(recorded.checksum));\n const canRepair = options.repair && knownLegacy && (await upgradeV2toV6.canApply(options.executor));\n if (!canRepair) {\n return {\n exitCode: 1,\n applied,\n warnings,\n error: `公開済み migration ${migration.name} の checksum が食い違っています。in-place 改変は禁止です。${knownLegacy ? \"umec migrate --repair を使ってください。\" : \"\"}`,\n };\n }\n }\n }\n\n let bookmark: string | null = null;\n if (!dryRun) {\n bookmark = await options.executor.captureBookmark();\n print(bookmark ? `time-travel bookmark ${bookmark}` : \"time-travel bookmark unavailable\");\n }\n\n if (options.repair) {\n for (const upgrade of CORE_UPGRADES) {\n const needed = dryRun ? true : await upgrade.canApply(options.executor);\n if (!needed) continue;\n print(`upgrade ${upgrade.name} (${upgrade.fromVersion} → ${upgrade.toVersion})`);\n if (dryRun) {\n applied.push(upgrade.name);\n continue;\n }\n await upgrade.apply(options.executor);\n await recordMigration(options.executor, upgrade.name, `upgrade:${upgrade.name}`, \"upgrade\", now);\n applied.push(upgrade.name);\n alreadyByName.set(upgrade.name, { name: upgrade.name, checksum: `upgrade:${upgrade.name}`, kind: \"upgrade\" });\n // upgradeV2toV6 bakes 0002 (PK rebuild) and 0005 (tracking_number/carrier\n // ALTER) into a single orders_new DDL (V6_ORDERS_DDL). Both must be marked\n // applied — in the DB *and* in alreadyByName, which the normal loop below\n // reads from — so it doesn't re-run 0005's ALTER against columns that\n // already exist. Do not add anything else here:\n // - 0003/0004/0006 create unrelated tables (IF NOT EXISTS) that\n // V6_ORDERS_DDL never touches — they still need to run normally.\n // - 0007 (extras_json) postdates this upgrade's toVersion (6) and is\n // NOT part of V6_ORDERS_DDL — it must also still run normally.\n // (real remote-D1 repro: runrun 2026-08-19)\n for (const supersededName of [\"0002_orders.sql\", \"0005_orders_tracking.sql\"]) {\n const superseded = coreMigrations.find((migration) => migration.name === supersededName);\n if (!superseded) {\n throw new Error(`upgradeV2toV6 supersedes unknown migration ${supersededName} — schema/migrations/ drifted`);\n }\n const checksum = sha256File(superseded.path);\n await recordMigration(options.executor, superseded.name, checksum, \"sql\", now);\n alreadyByName.set(superseded.name, { name: superseded.name, checksum, kind: \"sql\" });\n }\n }\n }\n\n for (const migration of coreMigrations) {\n if (alreadyByName.get(migration.name)?.checksum === sha256File(migration.path)) continue;\n if (alreadyByName.has(migration.name) && !options.repair) continue;\n print(`apply core/${migration.name}`);\n if (dryRun) {\n applied.push(migration.name);\n continue;\n }\n await options.executor.applySql(migration.sql);\n await recordMigration(options.executor, migration.name, sha256File(migration.path), \"sql\", now);\n applied.push(migration.name);\n }\n\n for (const local of listLocalMigrations(options.cwd)) {\n const hash = sha256File(local.path);\n if (alreadyByName.get(local.name)?.checksum === hash) continue;\n print(`apply ${local.name}`);\n if (dryRun) {\n applied.push(local.name);\n continue;\n }\n await options.executor.applySql(local.sql);\n await recordMigration(options.executor, local.name, hash, \"sql\", now);\n applied.push(local.name);\n }\n\n if (!dryRun) {\n await writeVersion(options.executor, installedVersion, options.coreVersion, now, bookmark);\n } else {\n print(`would set umec_schema_version.version = ${installedVersion}`);\n }\n\n return { exitCode: 0, applied, warnings, bookmark };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { exitCode: 1, applied, warnings, error: message };\n }\n}\n\nexport function pendingMigrationFixes(pendingSql: string, finding: DriftFinding): boolean {\n if (finding.message.includes(`required table \"${finding.table}\" is missing`)) {\n return new RegExp(`CREATE TABLE(?: IF NOT EXISTS)?\\\\s+${finding.table}\\\\b`, \"i\").test(pendingSql);\n }\n const missingColumn = finding.message.match(/required column \"([^.\"]+)\\.([^\"]+)\" is missing/);\n if (missingColumn?.[1] && missingColumn[2]) {\n // Scope to the owning table — an unrelated ALTER TABLE elsewhere in pendingSql\n // that happens to ADD COLUMN the same name must not count as a fix (qoder\n // review, 2026-08-20: \"inventory.sku\" could be false-matched by an unrelated\n // \"ALTER TABLE orders ADD COLUMN sku\").\n const [, table, column] = missingColumn;\n return new RegExp(`ALTER TABLE\\\\s+${table}\\\\s+ADD COLUMN\\\\s+${column}\\\\b`, \"i\").test(pendingSql);\n }\n return false;\n}\n\nexport function coreVersionFromPackage(root = findPackageRoot()): string {\n const pkg = JSON.parse(readFileSync(join(root, \"package.json\"), \"utf8\")) as { version: string };\n return pkg.version;\n}\n","import { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { bindSql, type MigrationExecutor } from \"./executor.js\";\n\nexport type WranglerRunResult = {\n code: number;\n stdout: string;\n stderr: string;\n};\n\nexport type RunCommand = (command: string, args: string[], cwd: string) => Promise<WranglerRunResult>;\n\nexport function defaultRunCommand(command: string, args: string[], cwd: string): Promise<WranglerRunResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({ code: code ?? 1, stdout, stderr });\n });\n });\n}\n\nexport function parseJsonc(text: string): unknown {\n const stripped = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/^\\s*\\/\\/.*$/gm, \"\");\n return JSON.parse(stripped);\n}\n\nexport function readD1DatabaseName(cwd: string, override?: string): string | null {\n if (override) return override;\n const path = join(cwd, \"wrangler.jsonc\");\n try {\n const parsed = parseJsonc(readFileSync(path, \"utf8\")) as {\n d1_databases?: Array<{ database_name?: string }>;\n };\n return parsed.d1_databases?.[0]?.database_name ?? null;\n } catch {\n return null;\n }\n}\n\nfunction parseExecuteJson(stdout: string): { results: unknown[]; changes: number } {\n const trimmed = stdout.trim();\n if (!trimmed) return { results: [], changes: 0 };\n const start = trimmed.indexOf(\"[\");\n const objStart = trimmed.indexOf(\"{\");\n const cut =\n start >= 0 && (objStart < 0 || start < objStart)\n ? trimmed.slice(start)\n : objStart >= 0\n ? trimmed.slice(objStart)\n : trimmed;\n const parsed: unknown = JSON.parse(cut);\n const rows = Array.isArray(parsed) ? parsed : [parsed];\n const first = rows[0] as { results?: unknown[]; meta?: { changes?: number } } | undefined;\n return {\n results: first?.results ?? [],\n changes: first?.meta?.changes ?? 0,\n };\n}\n\nexport function createWranglerExecutor(options: {\n cwd: string;\n database: string;\n remote: boolean;\n runCommand?: RunCommand;\n}): MigrationExecutor {\n const runCommand = options.runCommand ?? defaultRunCommand;\n const location = options.remote ? \"--remote\" : \"--local\";\n\n const execute = async (sql: string) => {\n const result = await runCommand(\n \"wrangler\",\n [\"d1\", \"execute\", options.database, location, \"--json\", \"--command\", sql],\n options.cwd,\n );\n if (result.code !== 0) {\n throw new Error(result.stderr || result.stdout || `wrangler d1 execute failed (${result.code})`);\n }\n return parseExecuteJson(result.stdout);\n };\n\n return {\n async exec(sql: string) {\n await execute(sql);\n },\n async applySql(sql: string) {\n const { splitSqlStatements } = await import(\"../db/sql.js\");\n for (const statement of splitSqlStatements(sql)) {\n await execute(statement);\n }\n },\n async all<T>(sql: string, params: unknown[] = []) {\n const result = await execute(bindSql(sql, params));\n return result.results as T[];\n },\n async first<T>(sql: string, params: unknown[] = []) {\n const result = await execute(bindSql(sql, params));\n return (result.results[0] as T | undefined) ?? null;\n },\n async run(sql: string, params: unknown[] = []) {\n const result = await execute(bindSql(sql, params));\n return { changes: result.changes };\n },\n async captureBookmark() {\n const result = await runCommand(\n \"wrangler\",\n [\"d1\", \"time-travel\", \"info\", options.database, \"--json\"],\n options.cwd,\n );\n if (result.code !== 0) return null;\n try {\n const parsed = JSON.parse(result.stdout) as { bookmark?: string };\n return parsed.bookmark ?? null;\n } catch {\n return null;\n }\n },\n };\n}\n","import type { UpgradeExecutor } from \"../../schema/upgrades/types.js\";\nimport type { ShopDatabase } from \"../db/d1.js\";\nimport { splitSqlStatements } from \"../db/sql.js\";\n\nexport type MigrationExecutor = UpgradeExecutor & {\n applySql(sql: string): Promise<void>;\n captureBookmark(): Promise<string | null>;\n};\n\nexport function sqlLiteral(value: unknown): string {\n if (value === null || value === undefined) return \"NULL\";\n if (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n if (typeof value === \"string\") return `'${value.replaceAll(\"'\", \"''\")}'`;\n throw new Error(`Unsupported SQL bind: ${typeof value}`);\n}\n\nexport function bindSql(sql: string, params: unknown[] = []): string {\n let index = 0;\n return sql.replaceAll(\"?\", () => {\n if (index >= params.length) throw new Error(\"Not enough SQL bind parameters\");\n return sqlLiteral(params[index++]);\n });\n}\n\nexport function executorFromDatabase(\n db: ShopDatabase,\n captureBookmark: () => Promise<string | null> = async () => null,\n): MigrationExecutor {\n return {\n async exec(sql: string) {\n await db.prepare(sql).run();\n },\n async applySql(sql: string) {\n for (const statement of splitSqlStatements(sql)) {\n await db.prepare(statement).run();\n }\n },\n async all<T>(sql: string, params: unknown[] = []) {\n const statement = db.prepare(sql);\n if (params.length > 0) statement.bind(...params);\n const result = await statement.all<T>();\n return result.results ?? [];\n },\n async first<T>(sql: string, params: unknown[] = []) {\n const statement = db.prepare(sql);\n if (params.length > 0) statement.bind(...params);\n return statement.first<T>();\n },\n async run(sql: string, params: unknown[] = []) {\n const statement = db.prepare(sql);\n if (params.length > 0) statement.bind(...params);\n const result = await statement.run();\n return { changes: result.meta.changes };\n },\n captureBookmark,\n };\n}\n"],"mappings":"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","names":["readFileSync","join","existsSync","readFileSync","join","readFileSync","join","join","readFileSync","bookmark","readFileSync","join","join","readFileSync","splitSqlStatements","join","readFileSync"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/doctor.ts","../schema/upgrades/v2-to-v6.ts","../src/cli/checksum.ts","../src/cli/extend.ts","../src/cli/migrate.ts","../src/cli/registry.ts","../src/cli/template-doctor.ts","../src/cli/wrangler.ts","../src/cli/executor.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadSnapshotJson } from \"../db/catalog.js\";\nimport type { SchemaSnapshot } from \"../db/snapshot.js\";\nimport { findPackageRoot } from \"../package-root.js\";\nimport { runDoctor } from \"./doctor.js\";\nimport { runExtend } from \"./extend.js\";\nimport { coreVersionFromPackage, runMigrate, type MigrateOptions } from \"./migrate.js\";\nimport { runRegistryAdd, runRegistryDiff, runRegistryList } from \"./registry.js\";\nimport { runTemplateDoctor } from \"./template-doctor.js\";\nimport { createWranglerExecutor, readD1DatabaseName, type RunCommand } from \"./wrangler.js\";\nimport type { MigrationExecutor } from \"./executor.js\";\n\nconst BOOLEAN_FLAGS = new Set([\n \"dry-run\",\n \"adopt\",\n \"repair\",\n \"remote\",\n \"local\",\n \"template\",\n \"json\",\n \"help\",\n \"force\",\n \"list\",\n]);\n\nexport type CliIo = {\n cwd?: string;\n stdout?: (message: string) => void;\n stderr?: (message: string) => void;\n executor?: MigrationExecutor;\n runCommand?: RunCommand;\n registryRoot?: string;\n coreVersion?: string;\n adminVersion?: string | null;\n now?: number;\n};\n\nexport function parseArgs(argv: string[]): {\n command: string | null;\n flags: Record<string, string | boolean>;\n positionals: string[];\n} {\n const flags: Record<string, string | boolean> = {};\n const positionals: string[] = [];\n let command: string | null = null;\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i];\n if (!arg) continue;\n if (arg.startsWith(\"--\")) {\n const eq = arg.indexOf(\"=\");\n if (eq > 0) {\n flags[arg.slice(2, eq)] = arg.slice(eq + 1);\n continue;\n }\n const name = arg.slice(2);\n const next = argv[i + 1];\n if (next && !next.startsWith(\"--\") && !BOOLEAN_FLAGS.has(name)) {\n flags[name] = next;\n i += 1;\n } else {\n flags[name] = true;\n }\n continue;\n }\n if (!command) command = arg;\n else positionals.push(arg);\n }\n return { command, flags, positionals };\n}\n\nfunction usage(): string {\n return `Usage:\n umec migrate [--dry-run] [--local|--remote] [--adopt] [--repair] [--database NAME]\n umec doctor [--local|--remote] [--database NAME]\n umec doctor --template --manifest <path-or-url> [--json]\n umec add --list [--json]\n umec add <item-id> [--force] [--json]\n umec diff <item-id> [--json]\n umec extend [--key NAME] [--type boolean|string|number]`;\n}\n\nexport async function runCli(argv: string[], io: CliIo = {}): Promise<number> {\n const cwd = io.cwd ?? process.cwd();\n const stdout = io.stdout ?? ((message) => console.log(message));\n const stderr = io.stderr ?? ((message) => console.error(message));\n const { command, flags, positionals } = parseArgs(argv);\n\n if (!command || command === \"help\" || flags.help) {\n stdout(usage());\n return command ? 0 : 1;\n }\n\n if (command === \"add\" || command === \"diff\") {\n if (command === \"add\" && flags.list === true) {\n if (positionals.length > 0) {\n stderr(\"umec add --list は item-id を取りません。\");\n return 1;\n }\n const listed = await runRegistryList({\n cwd,\n json: flags.json === true,\n print: stdout,\n registryRoot: io.registryRoot,\n });\n if (listed.error) stderr(listed.error);\n return listed.exitCode;\n }\n if (positionals.length > 1) {\n stderr(`umec ${command} は item-id を1つだけ受け取ります。`);\n return 1;\n }\n const result =\n command === \"add\"\n ? await runRegistryAdd({\n cwd,\n itemId: positionals[0],\n force: flags.force === true,\n json: flags.json === true,\n print: stdout,\n registryRoot: io.registryRoot,\n coreVersion: io.coreVersion,\n adminVersion: io.adminVersion,\n now: io.now,\n })\n : await runRegistryDiff({\n cwd,\n itemId: positionals[0],\n json: flags.json === true,\n print: stdout,\n registryRoot: io.registryRoot,\n });\n if (result.error) stderr(result.error);\n return result.exitCode;\n }\n\n if (command === \"doctor\" && flags.template === true) {\n const manifest = flags.manifest;\n if (typeof manifest !== \"string\" || manifest.length === 0) {\n stderr(\"umec doctor --template には --manifest <path-or-url> が必要です。\");\n return 1;\n }\n const result = await runTemplateDoctor({\n cwd,\n manifest,\n json: flags.json === true,\n print: stdout,\n });\n if (result.error) stderr(result.error);\n return result.exitCode;\n }\n\n const snapshot = loadSnapshotJson() as SchemaSnapshot;\n const remote = flags.remote === true;\n const database = typeof flags.database === \"string\" ? flags.database : readD1DatabaseName(cwd);\n\n const executor =\n io.executor ??\n (command === \"extend\" || (command === \"migrate\" && flags[\"dry-run\"] === true)\n ? undefined\n : database\n ? createWranglerExecutor({ cwd, database, remote, runCommand: io.runCommand })\n : undefined);\n\n if (command === \"migrate\") {\n if (flags[\"dry-run\"] === true && !io.executor) {\n const migrations = (await import(\"../db/catalog.js\")).listCoreMigrations();\n stdout(\"dry-run (no D1 connection)\");\n stdout(\"ensure umec_schema_version / umec_migrations\");\n for (const migration of migrations) stdout(`apply core/${migration.name}`);\n stdout(`would set umec_schema_version.version = ${snapshot.version}`);\n return 0;\n }\n if (!executor) {\n stderr(\"wrangler.jsonc の d1_databases[0].database_name が見つかりません。--database を指定してください。\");\n return 1;\n }\n const options: MigrateOptions = {\n cwd,\n executor,\n snapshot,\n dryRun: flags[\"dry-run\"] === true,\n adopt: flags.adopt === true,\n repair: flags.repair === true,\n coreVersion: coreVersionFromPackage(),\n print: stdout,\n };\n const result = await runMigrate(options);\n for (const warning of result.warnings) stdout(`warn: ${warning}`);\n if (result.error) stderr(result.error);\n return result.exitCode;\n }\n\n if (command === \"doctor\") {\n const result = await runDoctor({\n cwd,\n executor,\n snapshot,\n print: stdout,\n });\n return result.exitCode;\n }\n\n if (command === \"extend\") {\n const result = runExtend({\n cwd,\n key: typeof flags.key === \"string\" ? flags.key : undefined,\n type: typeof flags.type === \"string\" ? flags.type : undefined,\n print: stdout,\n });\n if (result.error) stderr(result.error);\n return result.exitCode;\n }\n\n stderr(usage());\n return 1;\n}\n\nfunction isDirectRun(): boolean {\n const invoked = process.argv[1];\n if (!invoked) return false;\n return /(?:^|[\\\\/])cli(?:\\.js)?$/.test(invoked) || invoked.includes(`${join(\"dist\", \"cli\")}`);\n}\n\nif (isDirectRun()) {\n const pkg = JSON.parse(readFileSync(join(findPackageRoot(), \"package.json\"), \"utf8\")) as { version: string };\n if (process.argv.includes(\"--version\") || process.argv.includes(\"-V\")) {\n console.log(pkg.version);\n process.exit(0);\n }\n runCli(process.argv.slice(2)).then(\n (code) => process.exit(code),\n (error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n },\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { upgradeV2toV6 } from \"../../schema/upgrades/v2-to-v6.js\";\nimport { currentSchemaVersion, listCoreMigrations } from \"../db/catalog.js\";\nimport { classifyDrift } from \"../db/drift.js\";\nimport { introspectSnapshot } from \"../db/introspect.js\";\nimport type { SchemaSnapshot } from \"../db/snapshot.js\";\nimport { sha256File } from \"./checksum.js\";\nimport type { MigrationExecutor } from \"./executor.js\";\nimport type { Printer } from \"./migrate.js\";\n\nexport type DoctorOptions = {\n cwd: string;\n executor?: MigrationExecutor;\n snapshot: SchemaSnapshot;\n print?: Printer;\n};\n\nexport type DoctorResult = {\n exitCode: number;\n lines: string[];\n};\n\nexport async function runDoctor(options: DoctorOptions): Promise<DoctorResult> {\n const print = options.print ?? (() => {});\n const lines: string[] = [];\n const installed = currentSchemaVersion();\n let exitCode = 0;\n\n const say = (line: string) => {\n lines.push(line);\n print(line);\n };\n\n say(`installed schema version: ${installed}`);\n\n if (!options.executor) {\n say(\"no database executor; offline checks only\");\n } else {\n try {\n const version = await options.executor.first<{ version: number; core_version: string }>(\n \"SELECT version, core_version FROM umec_schema_version WHERE id = 1\",\n );\n if (!version) {\n say(\"umec_schema_version: missing (run umec migrate)\");\n } else {\n say(`database schema version: ${version.version} (core ${version.core_version})`);\n if (version.version > installed) {\n exitCode = 1;\n say(\n `DB は schema v${version.version}。インストール中の @umec/core は v${installed} までしか知らない。戻すには wrangler d1 time-travel restore --bookmark=<記録済み> のあと同じ core バージョンを入れ直すこと。down migration は無い。`,\n );\n }\n }\n } catch {\n say(\"umec_schema_version: unreadable (run umec migrate)\");\n }\n\n const actual = await introspectViaExecutor(options.executor, options.snapshot.version);\n const drift = classifyDrift(options.snapshot, actual);\n for (const finding of drift.compatible) say(`warn: ${finding.message}`);\n for (const finding of drift.incompatible) {\n exitCode = 1;\n say(`error: ${finding.message}`);\n }\n if (await upgradeV2toV6.canApply(options.executor)) {\n exitCode = 1;\n say(\"error: orders は event_id PK の旧スキーマです。umec migrate --repair を実行してください。\");\n }\n\n const applied = await options.executor.all<{ name: string; checksum: string }>(\n \"SELECT name, checksum FROM umec_migrations\",\n ).catch(() => []);\n const appliedByName = new Map(applied.map((row) => [row.name, row.checksum]));\n for (const migration of listCoreMigrations()) {\n const expected = sha256File(migration.path);\n const got = appliedByName.get(migration.name);\n if (got && got !== expected) {\n exitCode = 1;\n say(`error: checksum mismatch ${migration.name}`);\n }\n }\n }\n\n const extensionsPath = join(options.cwd, \"src/config/extensions.ts\");\n if (!existsSync(extensionsPath)) {\n say(\"warn: src/config/extensions.ts がありません。拡張は umec extend で extras_json に足してください。\");\n }\n\n return { exitCode, lines };\n}\n\nasync function introspectViaExecutor(executor: MigrationExecutor, version: number) {\n const db = {\n prepare(query: string) {\n return {\n bind(...values: unknown[]) {\n this._params = values;\n return this;\n },\n _params: [] as unknown[],\n async first<T>() {\n return executor.first<T>(query, this._params);\n },\n async all<T>() {\n return { results: await executor.all<T>(query, this._params) };\n },\n async run() {\n const result = await executor.run(query, this._params);\n return { meta: { changes: result.changes } };\n },\n };\n },\n async batch() {\n return [];\n },\n };\n return introspectSnapshot(db, version);\n}\n","import type { UpgradeExecutor, UpgradeModule } from \"./types.js\";\n\nexport const UPGRADE_PAGE_SIZE = 500;\n\nexport const LEGACY_0002_SQL = `CREATE TABLE IF NOT EXISTS orders (\n event_id TEXT PRIMARY KEY NOT NULL,\n session_id TEXT NOT NULL,\n amount_total INTEGER NOT NULL,\n currency TEXT NOT NULL,\n customer_email TEXT NOT NULL,\n run_id TEXT,\n created_at INTEGER NOT NULL\n);\n`;\n\nexport const V6_ORDERS_DDL = `CREATE TABLE orders_new (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL,\n name TEXT,\n phone TEXT,\n items_json TEXT NOT NULL,\n amount INTEGER NOT NULL,\n shipping INTEGER,\n address_json TEXT,\n payment_intent TEXT,\n custom_fields_json TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n run_id TEXT,\n email_status TEXT CHECK (email_status IN ('sent', 'failed')),\n created_at INTEGER NOT NULL,\n shipped_at INTEGER,\n tracking_number TEXT,\n carrier TEXT CHECK (carrier IN ('yamato', 'sagawa', 'japanpost', 'other') OR carrier IS NULL)\n)`;\n\ntype LegacyOrderRow = {\n event_id: string;\n session_id?: string | null;\n amount_total?: number | null;\n amount?: number | null;\n customer_email?: string | null;\n email?: string | null;\n name?: string | null;\n phone?: string | null;\n items_json?: string | null;\n shipping?: number | null;\n address_json?: string | null;\n payment_intent?: string | null;\n custom_fields_json?: string | null;\n status?: string | null;\n run_id?: string | null;\n email_status?: string | null;\n created_at: number;\n shipped_at?: number | null;\n tracking_number?: string | null;\n carrier?: string | null;\n};\n\ntype TableInfoRow = {\n name: string;\n pk: number;\n};\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNullableString(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction asNullableNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nexport async function detectLegacyOrdersPk(db: UpgradeExecutor): Promise<boolean> {\n const columns = await db.all<TableInfoRow>(\"PRAGMA table_info(orders)\");\n if (columns.length === 0) return false;\n const eventId = columns.find((column) => column.name === \"event_id\");\n return eventId != null && eventId.pk === 1;\n}\n\nexport function mapLegacyOrder(row: LegacyOrderRow): {\n id: string;\n email: string;\n name: string | null;\n phone: string | null;\n items_json: string;\n amount: number;\n shipping: number | null;\n address_json: string | null;\n payment_intent: string | null;\n custom_fields_json: string | null;\n status: string;\n run_id: string | null;\n email_status: string | null;\n created_at: number;\n shipped_at: number | null;\n tracking_number: string | null;\n carrier: string | null;\n} {\n const sessionId = asNullableString(row.session_id);\n const eventId = asString(row.event_id);\n return {\n id: sessionId && sessionId.length > 0 ? sessionId : eventId,\n email: asString(row.customer_email ?? row.email),\n name: asNullableString(row.name),\n phone: asNullableString(row.phone),\n items_json: asNullableString(row.items_json) ?? \"[]\",\n amount: asNumber(row.amount_total ?? row.amount),\n shipping: asNullableNumber(row.shipping),\n address_json: asNullableString(row.address_json),\n payment_intent: asNullableString(row.payment_intent),\n custom_fields_json: asNullableString(row.custom_fields_json),\n status: asNullableString(row.status) ?? \"pending\",\n run_id: asNullableString(row.run_id),\n email_status: asNullableString(row.email_status),\n created_at: asNumber(row.created_at),\n shipped_at: asNullableNumber(row.shipped_at),\n tracking_number: asNullableString(row.tracking_number),\n carrier: asNullableString(row.carrier),\n };\n}\n\nexport async function applyV2toV6(db: UpgradeExecutor): Promise<void> {\n if (!(await detectLegacyOrdersPk(db))) {\n throw new Error(\"v2-to-v6: orders.event_id primary key not found; refuse to rebuild\");\n }\n\n await db.exec(\"DROP TABLE IF EXISTS orders_new\");\n await db.exec(V6_ORDERS_DDL);\n\n let cursor: string | null = null;\n for (;;) {\n const pageSql = cursor\n ? \"SELECT * FROM orders WHERE event_id > ? ORDER BY event_id LIMIT ?\"\n : \"SELECT * FROM orders ORDER BY event_id LIMIT ?\";\n const pageParams = cursor ? [cursor, UPGRADE_PAGE_SIZE] : [UPGRADE_PAGE_SIZE];\n const rows: LegacyOrderRow[] = await db.all<LegacyOrderRow>(pageSql, pageParams);\n if (rows.length === 0) break;\n\n for (const row of rows) {\n const mapped = mapLegacyOrder(row);\n await db.run(\n `INSERT INTO orders_new (\n id, email, name, phone, items_json, amount, shipping, address_json,\n payment_intent, custom_fields_json, status, run_id, email_status,\n created_at, shipped_at, tracking_number, carrier\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n mapped.id,\n mapped.email,\n mapped.name,\n mapped.phone,\n mapped.items_json,\n mapped.amount,\n mapped.shipping,\n mapped.address_json,\n mapped.payment_intent,\n mapped.custom_fields_json,\n mapped.status,\n mapped.run_id,\n mapped.email_status,\n mapped.created_at,\n mapped.shipped_at,\n mapped.tracking_number,\n mapped.carrier,\n ],\n );\n }\n\n const last: LegacyOrderRow | undefined = rows[rows.length - 1];\n if (!last) break;\n cursor = last.event_id;\n if (rows.length < UPGRADE_PAGE_SIZE) break;\n }\n\n const oldCount = await db.first<{ n: number }>(\"SELECT COUNT(*) AS n FROM orders\");\n const newCount = await db.first<{ n: number }>(\"SELECT COUNT(*) AS n FROM orders_new\");\n const expected = oldCount?.n ?? -1;\n const copied = newCount?.n ?? -2;\n if (expected !== copied) {\n throw new Error(\n `v2-to-v6: COUNT mismatch orders=${expected} orders_new=${copied}. DROP skipped. Restore from Time Travel bookmark.`,\n );\n }\n\n await db.exec(\"DROP TABLE orders\");\n await db.exec(\"ALTER TABLE orders_new RENAME TO orders\");\n await db.exec(\"CREATE INDEX IF NOT EXISTS orders_payment_intent_idx ON orders(payment_intent)\");\n}\n\nexport const upgradeV2toV6: UpgradeModule = {\n name: \"v2-to-v6\",\n fromVersion: 2,\n toVersion: 6,\n description: \"Rebuild orders from event_id PK (v2) to id PK (v6)\",\n replacesChecksums: [\"ca6ec5c885f715a3ae65a7101787d66750ed831370dc2ecde0636cfc3cf83e24\"],\n canApply: detectLegacyOrdersPk,\n apply: applyV2toV6,\n};\n","import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\n\nexport function sha256Bytes(contents: Buffer | string): string {\n return createHash(\"sha256\").update(contents).digest(\"hex\");\n}\n\nexport function sha256File(path: string): string {\n return sha256Bytes(readFileSync(path));\n}\n\nexport function loadFrozenChecksums(path: string): Record<string, string> {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, string>;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Printer } from \"./migrate.js\";\n\nconst EXTENSION_TYPES = {\n boolean: \"z.boolean().optional()\",\n string: \"z.string().optional()\",\n number: \"z.number().optional()\",\n} as const;\n\nexport type ExtendType = keyof typeof EXTENSION_TYPES;\n\nexport type ExtendOptions = {\n cwd: string;\n key?: string;\n type?: string;\n print?: Printer;\n};\n\nconst STUB = `import { z } from \"zod\";\n\nexport const orderExtensionSchema = z.object({\n});\n\nexport type OrderExtension = z.infer<typeof orderExtensionSchema>;\n`;\n\nfunction isExtendType(value: string): value is ExtendType {\n return value in EXTENSION_TYPES;\n}\n\nexport function runExtend(options: ExtendOptions): { exitCode: number; path: string; error?: string } {\n const print = options.print ?? (() => {});\n const path = join(options.cwd, \"src/config/extensions.ts\");\n mkdirSync(dirname(path), { recursive: true });\n\n if (!existsSync(path)) {\n writeFileSync(path, STUB);\n print(`created ${path}`);\n }\n\n const key = options.key;\n if (!key) {\n print(\"拡張は orders.extras_json に Zod で足す。orders を ALTER しないこと。\");\n print(`編集ファイル: ${path}`);\n return { exitCode: 0, path };\n }\n\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n return { exitCode: 1, path, error: `invalid extras key: ${key}` };\n }\n\n const typeName = options.type ?? \"string\";\n if (!isExtendType(typeName)) {\n return { exitCode: 1, path, error: `unsupported type ${typeName} (boolean|string|number)` };\n }\n\n let source = readFileSync(path, \"utf8\");\n if (new RegExp(`\\\\b${key}:`).test(source)) {\n print(`${key} already exists in ${path}`);\n return { exitCode: 0, path };\n }\n\n if (!source.includes(\"orderExtensionSchema\")) {\n return { exitCode: 1, path, error: \"orderExtensionSchema not found in extensions.ts\" };\n }\n\n source = source.replace(\n /export const orderExtensionSchema = z\\.object\\(\\{\\n/,\n `export const orderExtensionSchema = z.object({\\n ${key}: ${EXTENSION_TYPES[typeName]},\\n`,\n );\n writeFileSync(path, source);\n print(`added ${key}: ${typeName} to extras_json via ${path}`);\n print(\"orders テーブルを ALTER しないこと。予約列 extras_json だけを使う。\");\n return { exitCode: 0, path };\n}\n","import { readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { upgradeV2toV6 } from \"../../schema/upgrades/v2-to-v6.js\";\nimport type { UpgradeModule } from \"../../schema/upgrades/types.js\";\nimport { currentSchemaVersion, listCoreMigrations } from \"../db/catalog.js\";\nimport { classifyDrift, type DriftFinding } from \"../db/drift.js\";\nimport { introspectSnapshot } from \"../db/introspect.js\";\nimport { TRACKING_TABLES_SQL } from \"../db/schema-version.js\";\nimport { CORE_TABLES, type SchemaSnapshot } from \"../db/snapshot.js\";\nimport { sha256File } from \"./checksum.js\";\nimport type { MigrationExecutor } from \"./executor.js\";\nimport { findPackageRoot } from \"../package-root.js\";\n\nexport const CORE_UPGRADES: UpgradeModule[] = [upgradeV2toV6];\n\nexport type Printer = (message: string) => void;\n\nexport type MigrateOptions = {\n cwd: string;\n executor: MigrationExecutor;\n snapshot: SchemaSnapshot;\n dryRun?: boolean;\n adopt?: boolean;\n repair?: boolean;\n coreVersion: string;\n now?: number;\n print?: Printer;\n};\n\nexport type MigrateResult = {\n exitCode: number;\n applied: string[];\n warnings: string[];\n error?: string;\n bookmark?: string | null;\n};\n\ntype AppliedRow = { name: string; checksum: string; kind: string };\n\nasync function ensureTracking(executor: MigrationExecutor, dryRun: boolean, print: Printer): Promise<void> {\n print(\"ensure umec_schema_version / umec_migrations\");\n if (dryRun) return;\n await executor.applySql(TRACKING_TABLES_SQL);\n}\n\nasync function readApplied(executor: MigrationExecutor): Promise<AppliedRow[]> {\n try {\n return await executor.all<AppliedRow>(\"SELECT name, checksum, kind FROM umec_migrations\");\n } catch {\n return [];\n }\n}\n\nasync function readVersion(executor: MigrationExecutor): Promise<number | null> {\n try {\n const row = await executor.first<{ version: number }>(\n \"SELECT version FROM umec_schema_version WHERE id = 1\",\n );\n return row?.version ?? null;\n } catch {\n return null;\n }\n}\n\nasync function recordMigration(\n executor: MigrationExecutor,\n name: string,\n checksum: string,\n kind: \"sql\" | \"upgrade\",\n now: number,\n): Promise<void> {\n await executor.run(\n `INSERT INTO umec_migrations (name, checksum, kind, applied_at) VALUES (?, ?, ?, ?)\n ON CONFLICT(name) DO UPDATE SET checksum = excluded.checksum, kind = excluded.kind, applied_at = excluded.applied_at`,\n [name, checksum, kind, now],\n );\n}\n\nasync function writeVersion(\n executor: MigrationExecutor,\n version: number,\n coreVersion: string,\n now: number,\n bookmark: string | null,\n): Promise<void> {\n await executor.run(\n `INSERT INTO umec_schema_version (id, version, core_version, applied_at, time_travel_bookmark)\n VALUES (1, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n version = excluded.version,\n core_version = excluded.core_version,\n applied_at = excluded.applied_at,\n time_travel_bookmark = excluded.time_travel_bookmark`,\n [version, coreVersion, now, bookmark],\n );\n}\n\nfunction listLocalMigrations(cwd: string): { name: string; path: string; sql: string }[] {\n const dir = join(cwd, \"migrations\", \"local\");\n try {\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".sql\"))\n .sort()\n .map((name) => ({\n name: `local/${name}`,\n path: join(dir, name),\n sql: readFileSync(join(dir, name), \"utf8\"),\n }));\n } catch {\n return [];\n }\n}\n\nasync function adoptD1History(\n executor: MigrationExecutor,\n now: number,\n print: Printer,\n): Promise<{ adopted: string[]; warnings: string[] }> {\n const warnings: string[] = [];\n let names: string[] = [];\n try {\n const rows = await executor.all<{ name: string }>(\"SELECT name FROM d1_migrations\");\n names = rows.map((row) => row.name);\n } catch {\n throw new Error(\"d1_migrations が見つかりません。--adopt は wrangler 管理下の既存 D1 向けです。\");\n }\n\n const core = listCoreMigrations();\n const byFile = new Map(core.map((migration) => [migration.name, migration]));\n const adopted: string[] = [];\n const legacy = await upgradeV2toV6.canApply(executor);\n\n for (const rawName of names) {\n const fileName = rawName.split(\"/\").pop() ?? rawName;\n const migration = byFile.get(fileName);\n if (!migration) {\n warnings.push(`d1_migrations の ${rawName} は core に無いのでスキップ`);\n continue;\n }\n const checksum =\n fileName === \"0002_orders.sql\" && legacy\n ? (upgradeV2toV6.replacesChecksums[0] ?? sha256File(migration.path))\n : sha256File(migration.path);\n await recordMigration(executor, migration.name, checksum, \"sql\", now);\n adopted.push(migration.name);\n print(`adopt ${migration.name}`);\n }\n\n return { adopted, warnings };\n}\n\nasync function snapshotFromExecutor(\n executor: MigrationExecutor,\n version: number,\n): Promise<SchemaSnapshot> {\n const db = {\n prepare(query: string) {\n return {\n bind(...values: unknown[]) {\n this._params = values;\n return this;\n },\n _params: [] as unknown[],\n async first<T>() {\n return executor.first<T>(query, this._params);\n },\n async all<T>() {\n const results = await executor.all<T>(query, this._params);\n return { results };\n },\n async run() {\n const result = await executor.run(query, this._params);\n return { meta: { changes: result.changes } };\n },\n };\n },\n async batch() {\n return [];\n },\n };\n return introspectSnapshot(db, version);\n}\n\nexport async function runMigrate(options: MigrateOptions): Promise<MigrateResult> {\n const print = options.print ?? (() => {});\n const dryRun = options.dryRun === true;\n const now = options.now ?? Date.now();\n const applied: string[] = [];\n const warnings: string[] = [];\n const installedVersion = currentSchemaVersion();\n\n try {\n await ensureTracking(options.executor, dryRun, print);\n\n const dbVersion = dryRun ? null : await readVersion(options.executor);\n if (dbVersion != null && dbVersion > installedVersion) {\n return {\n exitCode: 1,\n applied,\n warnings,\n error: `DB は schema v${dbVersion}。インストール中の @umec/core は v${installedVersion} までしか知らない。戻すには wrangler d1 time-travel restore --bookmark=<記録済み> のあと同じ core バージョンを入れ直すこと。down migration は無い。`,\n };\n }\n\n if (options.adopt) {\n print(\"adopt d1_migrations → umec_migrations\");\n if (dryRun) {\n return { exitCode: 0, applied: [\"--adopt\"], warnings };\n }\n const result = await adoptD1History(options.executor, now, print);\n applied.push(...result.adopted);\n warnings.push(...result.warnings);\n const bookmark = await options.executor.captureBookmark();\n const maxAdopted = result.adopted.reduce((max, name) => Math.max(max, Number(name.slice(0, 4)) || 0), 0);\n await writeVersion(options.executor, maxAdopted, options.coreVersion, now, bookmark);\n return { exitCode: 0, applied, warnings, bookmark };\n }\n\n if (!dryRun) {\n const actual = await snapshotFromExecutor(options.executor, options.snapshot.version);\n const fresh = CORE_TABLES.every((table) => !actual.tables[table]);\n if (!fresh) {\n const alreadyForDrift = await readApplied(options.executor);\n const pendingSql = listCoreMigrations()\n .filter((migration) => !alreadyForDrift.some((row) => row.name === migration.name))\n .map((migration) => migration.sql)\n .join(\"\\n\");\n const drift = classifyDrift(options.snapshot, actual);\n for (const finding of drift.compatible) {\n warnings.push(finding.message);\n print(`warn: ${finding.message}`);\n }\n const blocking = drift.incompatible.filter((finding) => !pendingMigrationFixes(pendingSql, finding));\n const repairable = options.repair && (await upgradeV2toV6.canApply(options.executor));\n if (blocking.length > 0 && !repairable) {\n const details = blocking.map((finding) => finding.message).join(\"; \");\n const hint = (await upgradeV2toV6.canApply(options.executor))\n ? \" umec migrate --repair で v2-to-v6 を提案できます。\"\n : \"\";\n return {\n exitCode: 1,\n applied,\n warnings,\n error: `非互換 drift のため migrate を拒否: ${details}.${hint}`,\n };\n }\n }\n }\n\n const already = dryRun ? [] : await readApplied(options.executor);\n const alreadyByName = new Map(already.map((row) => [row.name, row]));\n const coreMigrations = listCoreMigrations();\n\n for (const migration of coreMigrations) {\n const currentHash = sha256File(migration.path);\n const recorded = alreadyByName.get(migration.name);\n if (recorded && recorded.checksum !== currentHash) {\n const knownLegacy = CORE_UPGRADES.some((upgrade) => upgrade.replacesChecksums.includes(recorded.checksum));\n const canRepair = options.repair && knownLegacy && (await upgradeV2toV6.canApply(options.executor));\n if (!canRepair) {\n return {\n exitCode: 1,\n applied,\n warnings,\n error: `公開済み migration ${migration.name} の checksum が食い違っています。in-place 改変は禁止です。${knownLegacy ? \"umec migrate --repair を使ってください。\" : \"\"}`,\n };\n }\n }\n }\n\n let bookmark: string | null = null;\n if (!dryRun) {\n bookmark = await options.executor.captureBookmark();\n print(bookmark ? `time-travel bookmark ${bookmark}` : \"time-travel bookmark unavailable\");\n }\n\n if (options.repair) {\n for (const upgrade of CORE_UPGRADES) {\n const legacyPresent = dryRun ? true : await upgrade.canApply(options.executor);\n if (legacyPresent) {\n print(`upgrade ${upgrade.name} (${upgrade.fromVersion} → ${upgrade.toVersion})`);\n if (dryRun) {\n applied.push(upgrade.name);\n continue;\n }\n await upgrade.apply(options.executor);\n await recordMigration(options.executor, upgrade.name, `upgrade:${upgrade.name}`, \"upgrade\", now);\n applied.push(upgrade.name);\n alreadyByName.set(upgrade.name, { name: upgrade.name, checksum: `upgrade:${upgrade.name}`, kind: \"upgrade\" });\n }\n // dryRun is always true here only via the legacyPresent branch above,\n // which already `continue`s — so reaching this point means dryRun is\n // false and we have a real executor to write through.\n // upgradeV2toV6 bakes 0002 (PK rebuild) and 0005 (tracking_number/carrier\n // ALTER) into a single orders_new DDL (V6_ORDERS_DDL). Both must be marked\n // applied — in the DB *and* in alreadyByName, which the normal loop below\n // reads from — so it doesn't re-run 0005's ALTER against columns that\n // already exist.\n //\n // This runs whenever orders is no longer in the legacy shape — which is\n // true either because we just fixed it above, or because a *previous*\n // repair attempt already ran the DDL but was interrupted (crashed,\n // network error, core updated mid-retry) before recording 0005. Gating\n // this only on `legacyPresent` (the original design) misses that second\n // case: canApply() reads the live schema, sees orders is already\n // rebuilt, reports false, and the whole block — including the supersede\n // bookkeeping — gets skipped, leaving 0005 permanently unrecorded even\n // though its effect is already live. The normal loop below then tries\n // to re-run 0005's ALTER forever (real remote-D1 repro, 2026-08-19: a\n // retry after a failed repair reproduced the original bug via this\n // path). recordMigration() is an upsert with the migration's real\n // checksum, so calling it here when nothing was actually missing is a\n // harmless no-op.\n //\n // Do not add 0003/0004/0006 here — they create unrelated tables\n // (IF NOT EXISTS) that V6_ORDERS_DDL never touches and still need to\n // run normally. Same for 0007 (extras_json): it postdates this\n // upgrade's toVersion (6) and isn't part of V6_ORDERS_DDL.\n for (const supersededName of [\"0002_orders.sql\", \"0005_orders_tracking.sql\"]) {\n const superseded = coreMigrations.find((migration) => migration.name === supersededName);\n if (!superseded) {\n throw new Error(`upgradeV2toV6 supersedes unknown migration ${supersededName} — schema/migrations/ drifted`);\n }\n const checksum = sha256File(superseded.path);\n await recordMigration(options.executor, superseded.name, checksum, \"sql\", now);\n alreadyByName.set(superseded.name, { name: superseded.name, checksum, kind: \"sql\" });\n }\n }\n }\n\n for (const migration of coreMigrations) {\n if (alreadyByName.get(migration.name)?.checksum === sha256File(migration.path)) continue;\n if (alreadyByName.has(migration.name) && !options.repair) continue;\n print(`apply core/${migration.name}`);\n if (dryRun) {\n applied.push(migration.name);\n continue;\n }\n await options.executor.applySql(migration.sql);\n await recordMigration(options.executor, migration.name, sha256File(migration.path), \"sql\", now);\n applied.push(migration.name);\n }\n\n for (const local of listLocalMigrations(options.cwd)) {\n const hash = sha256File(local.path);\n if (alreadyByName.get(local.name)?.checksum === hash) continue;\n print(`apply ${local.name}`);\n if (dryRun) {\n applied.push(local.name);\n continue;\n }\n await options.executor.applySql(local.sql);\n await recordMigration(options.executor, local.name, hash, \"sql\", now);\n applied.push(local.name);\n }\n\n if (!dryRun) {\n await writeVersion(options.executor, installedVersion, options.coreVersion, now, bookmark);\n } else {\n print(`would set umec_schema_version.version = ${installedVersion}`);\n }\n\n return { exitCode: 0, applied, warnings, bookmark };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { exitCode: 1, applied, warnings, error: message };\n }\n}\n\nexport function pendingMigrationFixes(pendingSql: string, finding: DriftFinding): boolean {\n if (finding.message.includes(`required table \"${finding.table}\" is missing`)) {\n return new RegExp(`CREATE TABLE(?: IF NOT EXISTS)?\\\\s+${finding.table}\\\\b`, \"i\").test(pendingSql);\n }\n const missingColumn = finding.message.match(/required column \"([^.\"]+)\\.([^\"]+)\" is missing/);\n if (missingColumn?.[1] && missingColumn[2]) {\n // Scope to the owning table — an unrelated ALTER TABLE elsewhere in pendingSql\n // that happens to ADD COLUMN the same name must not count as a fix\n // (a finding for \"inventory.sku\" could otherwise be false-matched by an\n // unrelated \"ALTER TABLE orders ADD COLUMN sku\").\n const [, table, column] = missingColumn;\n return new RegExp(`ALTER TABLE\\\\s+${table}\\\\s+ADD COLUMN\\\\s+${column}\\\\b`, \"i\").test(pendingSql);\n }\n return false;\n}\n\nexport function coreVersionFromPackage(root = findPackageRoot()): string {\n const pkg = JSON.parse(readFileSync(join(root, \"package.json\"), \"utf8\")) as { version: string };\n return pkg.version;\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { findPackageRoot } from \"../package-root.js\";\nimport { sha256File } from \"./checksum.js\";\nimport { coreVersionFromPackage, type Printer } from \"./migrate.js\";\nimport { isSafeRelPath, resolveInstancePath } from \"./template-doctor.js\";\n\nexport const REGISTRY_RISKS = [\"low\", \"medium\", \"high\"] as const;\nexport type RegistryRisk = (typeof REGISTRY_RISKS)[number];\n\nexport const REGISTRY_FILE_STATUSES = [\"match\", \"modified\", \"missing\"] as const;\nexport type RegistryFileStatus = (typeof REGISTRY_FILE_STATUSES)[number];\n\nexport const INSTALLED_RECORD_REL = \".umec/installed-registry-items.json\";\n\nconst ITEM_ID = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\nconst SEMVER = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/;\n\nexport type RegistryRequires = {\n core?: string;\n admin?: string;\n items?: string[];\n};\n\nexport type RegistryFile = {\n path: string;\n sourcePath: string;\n sha256: string;\n};\n\nexport type RegistryItem = {\n id: string;\n version: string;\n title: string;\n risk: RegistryRisk;\n requires: RegistryRequires;\n touches: string[];\n files: RegistryFile[];\n dir: string;\n manifestPath: string;\n};\n\nexport type RegistryFileFinding = {\n path: string;\n status: RegistryFileStatus;\n expected?: string;\n actual?: string;\n};\n\nexport type InstalledRegistryItem = {\n id: string;\n version: string;\n appliedAt: string;\n};\n\nexport type InstalledRegistryRecord = {\n schemaVersion: 1;\n items: InstalledRegistryItem[];\n};\n\nexport type RegistryCommandResult = {\n exitCode: number;\n lines: string[];\n error?: string;\n};\n\nexport type RegistryIoOptions = {\n cwd: string;\n json?: boolean;\n print?: Printer;\n registryRoot?: string;\n};\n\nexport type RegistryListOptions = RegistryIoOptions;\n\nexport type RegistryAddOptions = RegistryIoOptions & {\n itemId?: string;\n force?: boolean;\n coreVersion?: string;\n adminVersion?: string | null;\n now?: number;\n};\n\nexport type RegistryDiffOptions = RegistryIoOptions & {\n itemId?: string;\n};\n\ntype SemVer = {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isRisk(value: unknown): value is RegistryRisk {\n return value === \"low\" || value === \"medium\" || value === \"high\";\n}\n\nexport function isRegistryItemId(value: string): boolean {\n return ITEM_ID.test(value);\n}\n\nexport function defaultRegistryRoot(root = findPackageRoot()): string {\n return join(root, \"registry\");\n}\n\nfunction toPosix(rel: string): string {\n return rel.split(sep).join(\"/\");\n}\n\nfunction stripInlineComment(line: string): string {\n let quote: '\"' | \"'\" | null = null;\n for (let i = 0; i < line.length; i += 1) {\n const char = line[i];\n if (quote) {\n if (char === quote && line[i - 1] !== \"\\\\\") quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"#\") return line.slice(0, i).trimEnd();\n }\n return line;\n}\n\nfunction splitTopLevel(input: string, sep: string): string[] {\n const parts: string[] = [];\n let buf = \"\";\n let depthBrace = 0;\n let depthBracket = 0;\n let quote: '\"' | \"'\" | null = null;\n for (let i = 0; i < input.length; i += 1) {\n const char = input[i] ?? \"\";\n if (quote) {\n buf += char;\n if (char === quote && input[i - 1] !== \"\\\\\") quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n buf += char;\n continue;\n }\n if (char === \"{\") depthBrace += 1;\n if (char === \"}\") depthBrace -= 1;\n if (char === \"[\") depthBracket += 1;\n if (char === \"]\") depthBracket -= 1;\n if (char === sep && depthBrace === 0 && depthBracket === 0) {\n if (buf.trim()) parts.push(buf.trim());\n buf = \"\";\n continue;\n }\n buf += char;\n }\n if (buf.trim()) parts.push(buf.trim());\n return parts;\n}\n\nfunction splitKeyValue(input: string): [string, string] | null {\n let quote: '\"' | \"'\" | null = null;\n for (let i = 0; i < input.length; i += 1) {\n const char = input[i];\n if (quote) {\n if (char === quote) quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \":\") return [input.slice(0, i).trim(), input.slice(i + 1).trim()];\n }\n return null;\n}\n\nfunction unquote(input: string): string {\n if (\n (input.startsWith('\"') && input.endsWith('\"') && input.length >= 2) ||\n (input.startsWith(\"'\") && input.endsWith(\"'\") && input.length >= 2)\n ) {\n return input.slice(1, -1);\n }\n return input;\n}\n\nfunction parseYamlValue(raw: string): unknown {\n const value = raw.trim();\n if (value === \"\") return \"\";\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"null\") return null;\n if (value.startsWith(\"{\") && value.endsWith(\"}\")) {\n const entries = splitTopLevel(value.slice(1, -1), \",\");\n const record: Record<string, unknown> = {};\n for (const entry of entries) {\n const kv = splitKeyValue(entry);\n if (!kv) throw new Error(`frontmatter の object が不正です: ${entry}`);\n record[unquote(kv[0])] = parseYamlValue(kv[1]);\n }\n return record;\n }\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n return splitTopLevel(value.slice(1, -1), \",\").map((entry) => parseYamlValue(entry));\n }\n return unquote(value);\n}\n\nexport function parseFrontmatter(text: string): { data: Record<string, unknown>; body: string } {\n const match = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/.exec(text);\n if (!match) throw new Error(\"manifest.md に YAML frontmatter がありません。\");\n const data: Record<string, unknown> = {};\n for (const rawLine of match[1].split(/\\r?\\n/)) {\n const line = stripInlineComment(rawLine).trim();\n if (!line) continue;\n const kv = splitKeyValue(line);\n if (!kv || !kv[0]) throw new Error(`frontmatter の行が不正です: ${rawLine}`);\n data[kv[0]] = parseYamlValue(kv[1]);\n }\n return { data, body: match[2] };\n}\n\nfunction parseStringArray(value: unknown, field: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\" || entry.length === 0)) {\n throw new Error(`${field} は文字列の配列である必要があります。`);\n }\n return value;\n}\n\nfunction parseRequires(value: unknown): RegistryRequires {\n if (value === undefined) return {};\n if (!isRecord(value)) throw new Error(\"requires は object である必要があります。\");\n const requires: RegistryRequires = {};\n for (const key of Object.keys(value)) {\n if (key !== \"core\" && key !== \"admin\" && key !== \"items\") {\n throw new Error(`requires.${key} には未対応です(対応: core, admin, items)。`);\n }\n }\n if (value.core !== undefined) {\n if (typeof value.core !== \"string\" || value.core.length === 0) {\n throw new Error(\"requires.core はバージョン範囲の文字列である必要があります。\");\n }\n requires.core = value.core;\n }\n if (value.admin !== undefined) {\n if (typeof value.admin !== \"string\" || value.admin.length === 0) {\n throw new Error(\"requires.admin はバージョン範囲の文字列である必要があります。\");\n }\n requires.admin = value.admin;\n }\n if (value.items !== undefined) {\n requires.items = parseStringArray(value.items, \"requires.items\");\n for (const id of requires.items) {\n if (!isRegistryItemId(id)) throw new Error(`requires.items の id が不正です: ${id}`);\n }\n }\n return requires;\n}\n\nfunction parseSemVer(input: string): SemVer | null {\n const match = SEMVER.exec(input.trim());\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split(\".\") : [],\n };\n}\n\nfunction compareIdentifier(a: string, b: string): number {\n const aNum = /^\\d+$/.test(a);\n const bNum = /^\\d+$/.test(b);\n if (aNum && bNum) return Number(a) - Number(b);\n if (aNum !== bNum) return aNum ? -1 : 1;\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareSemVer(a: SemVer, b: SemVer): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n if (a.patch !== b.patch) return a.patch - b.patch;\n if (a.prerelease.length === 0 && b.prerelease.length === 0) return 0;\n if (a.prerelease.length === 0) return 1;\n if (b.prerelease.length === 0) return -1;\n const n = Math.max(a.prerelease.length, b.prerelease.length);\n for (let i = 0; i < n; i += 1) {\n const left = a.prerelease[i];\n const right = b.prerelease[i];\n if (left === undefined) return -1;\n if (right === undefined) return 1;\n const cmp = compareIdentifier(left, right);\n if (cmp !== 0) return cmp;\n }\n return 0;\n}\n\nexport function satisfiesVersionRange(version: string, range: string): boolean {\n const parsed = parseSemVer(version);\n if (!parsed) throw new Error(`バージョンが不正です: ${version}`);\n const trimmed = range.trim();\n const operators = [\">=\", \"<=\", \">\", \"<\", \"=\"] as const;\n const operator = operators.find((item) => trimmed.startsWith(item));\n const spec = operator ? trimmed.slice(operator.length).trim() : trimmed;\n const target = parseSemVer(spec);\n if (!target) throw new Error(`バージョン範囲が不正です: ${range}`);\n const cmp = compareSemVer(parsed, target);\n if (operator === \">=\") return cmp >= 0;\n if (operator === \">\") return cmp > 0;\n if (operator === \"<=\") return cmp <= 0;\n if (operator === \"<\") return cmp < 0;\n return cmp === 0;\n}\n\nfunction titleFromBody(body: string, fallback: string): string {\n const heading = /^#\\s+(.+)$/m.exec(body);\n const title = heading?.[1]?.trim();\n return title && title.length > 0 ? title : fallback;\n}\n\nfunction listFilesRecursive(root: string): string[] {\n const out: string[] = [];\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \".DS_Store\" || entry.name.startsWith(\".\")) continue;\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n continue;\n }\n if (!entry.isFile()) continue;\n const rel = toPosix(relative(root, full));\n if (!isSafeRelPath(rel)) throw new Error(`registry の path が不正です: ${rel}`);\n out.push(rel);\n }\n };\n walk(root);\n out.sort();\n return out;\n}\n\nfunction loadItemFiles(itemDir: string): RegistryFile[] {\n const filesRoot = join(itemDir, \"files\");\n if (!existsSync(filesRoot) || !statSync(filesRoot).isDirectory()) {\n throw new Error(\"files/ がありません。\");\n }\n const paths = listFilesRecursive(filesRoot);\n if (paths.length === 0) throw new Error(\"files/ が空です。\");\n return paths.map((path) => {\n const sourcePath = join(filesRoot, ...path.split(\"/\"));\n return { path, sourcePath, sha256: sha256File(sourcePath) };\n });\n}\n\nexport function parseRegistryManifest(text: string): Omit<RegistryItem, \"files\" | \"dir\" | \"manifestPath\"> {\n const { data, body } = parseFrontmatter(text);\n if (typeof data.id !== \"string\" || !isRegistryItemId(data.id)) {\n throw new Error(`manifest.md の id が不正です: ${String(data.id)}`);\n }\n if (typeof data.version !== \"string\" || !parseSemVer(data.version)) {\n throw new Error(`manifest.md の version が不正です: ${String(data.version)}`);\n }\n if (!isRisk(data.risk)) {\n throw new Error(`manifest.md の risk が不正です: ${String(data.risk)}`);\n }\n return {\n id: data.id,\n version: data.version,\n title: titleFromBody(body, data.id),\n risk: data.risk,\n requires: parseRequires(data.requires),\n touches: parseStringArray(data.touches, \"touches\"),\n };\n}\n\nexport function loadRegistryItem(registryRoot: string, itemId: string): RegistryItem {\n if (!isRegistryItemId(itemId)) {\n throw new Error(`registry item id が不正です: ${itemId}`);\n }\n const dir = resolve(registryRoot, itemId);\n const rel = relative(resolve(registryRoot), dir);\n if (!rel || rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel) || rel.includes(sep)) {\n throw new Error(`registry item id が不正です: ${itemId}`);\n }\n const manifestPath = join(dir, \"manifest.md\");\n if (!existsSync(dir) || !statSync(dir).isDirectory() || !existsSync(manifestPath) || !statSync(manifestPath).isFile()) {\n throw new Error(`registry item が見つかりません: ${itemId}`);\n }\n const parsed = parseRegistryManifest(readFileSync(manifestPath, \"utf8\"));\n if (parsed.id !== itemId) {\n throw new Error(`manifest.md の id (${parsed.id}) がディレクトリ名 (${itemId}) と一致しません。`);\n }\n return {\n ...parsed,\n files: loadItemFiles(dir),\n dir,\n manifestPath,\n };\n}\n\nexport function listRegistryItems(registryRoot: string): RegistryItem[] {\n if (!existsSync(registryRoot)) return [];\n if (!statSync(registryRoot).isDirectory()) {\n throw new Error(`registry ディレクトリが不正です: ${registryRoot}`);\n }\n const ids = readdirSync(registryRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !entry.name.startsWith(\".\") && existsSync(join(registryRoot, entry.name, \"manifest.md\")))\n .map((entry) => entry.name)\n .sort();\n return ids.map((id) => loadRegistryItem(registryRoot, id));\n}\n\nfunction catalogEntry(item: RegistryItem) {\n return {\n id: item.id,\n version: item.version,\n title: item.title,\n risk: item.risk,\n requires: item.requires,\n touches: item.touches,\n };\n}\n\nfunction formatRequires(requires: RegistryRequires): string {\n const parts: string[] = [];\n if (requires.core) parts.push(`core ${requires.core}`);\n if (requires.admin) parts.push(`admin ${requires.admin}`);\n if (requires.items?.length) parts.push(`items ${requires.items.join(\", \")}`);\n return parts.length > 0 ? parts.join(\"; \") : \"(none)\";\n}\n\nfunction sayResult(print: Printer, lines: string[], line: string): void {\n lines.push(line);\n print(line);\n}\n\nfunction finishJson(print: Printer, lines: string[], payload: unknown, exitCode: number): RegistryCommandResult {\n sayResult(print, lines, JSON.stringify(payload, null, 2));\n return { exitCode, lines };\n}\n\nfunction finishError(options: { json?: boolean; print: Printer; lines: string[] }, error: string, extra: Record<string, unknown> = {}): RegistryCommandResult {\n if (options.json) return finishJson(options.print, options.lines, { ok: false, error, ...extra }, 1);\n return { exitCode: 1, lines: options.lines, error };\n}\n\nexport function readCustomerPackageVersion(cwd: string, packageName: string): string | null {\n const path = join(cwd, \"node_modules\", ...packageName.split(\"/\"), \"package.json\");\n if (!existsSync(path) || !statSync(path).isFile()) return null;\n try {\n const pkg = JSON.parse(readFileSync(path, \"utf8\")) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : null;\n } catch {\n return null;\n }\n}\n\nexport function readInstalledRecord(cwd: string): InstalledRegistryRecord {\n const path = resolveInstancePath(cwd, INSTALLED_RECORD_REL);\n if (!path || !existsSync(path) || !statSync(path).isFile()) {\n return { schemaVersion: 1, items: [] };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n throw new Error(`${INSTALLED_RECORD_REL} の JSON が不正です。`);\n }\n if (!isRecord(parsed) || parsed.schemaVersion !== 1 || !Array.isArray(parsed.items)) {\n throw new Error(`${INSTALLED_RECORD_REL} の schemaVersion は 1 のみ対応しています。`);\n }\n const items: InstalledRegistryItem[] = [];\n for (const entry of parsed.items) {\n if (!isRecord(entry)) throw new Error(`${INSTALLED_RECORD_REL} の items が不正です。`);\n if (typeof entry.id !== \"string\" || !isRegistryItemId(entry.id)) {\n throw new Error(`${INSTALLED_RECORD_REL} の id が不正です: ${String(entry.id)}`);\n }\n if (typeof entry.version !== \"string\" || !parseSemVer(entry.version)) {\n throw new Error(`${INSTALLED_RECORD_REL} の version が不正です: ${entry.id}`);\n }\n if (typeof entry.appliedAt !== \"string\" || entry.appliedAt.length === 0) {\n throw new Error(`${INSTALLED_RECORD_REL} の appliedAt が不正です: ${entry.id}`);\n }\n items.push({ id: entry.id, version: entry.version, appliedAt: entry.appliedAt });\n }\n return { schemaVersion: 1, items };\n}\n\nexport function writeInstalledRecord(cwd: string, record: InstalledRegistryRecord): string {\n const path = resolveInstancePath(cwd, INSTALLED_RECORD_REL);\n if (!path) throw new Error(`${INSTALLED_RECORD_REL} を書き込めません。`);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(record, null, 2)}\\n`);\n return INSTALLED_RECORD_REL;\n}\n\nfunction upsertInstalledItem(record: InstalledRegistryRecord, item: InstalledRegistryItem): InstalledRegistryRecord {\n const items = record.items.slice();\n const index = items.findIndex((entry) => entry.id === item.id);\n if (index >= 0) items[index] = item;\n else items.push(item);\n return { schemaVersion: 1, items };\n}\n\nexport function classifyRegistryFiles(cwd: string, files: RegistryFile[]): RegistryFileFinding[] {\n return files.map((file) => {\n const resolved = resolveInstancePath(cwd, file.path);\n if (!resolved || !existsSync(resolved) || !statSync(resolved).isFile()) {\n return { path: file.path, status: \"missing\", expected: file.sha256 };\n }\n const actual = sha256File(resolved);\n if (actual === file.sha256) return { path: file.path, status: \"match\", actual };\n return { path: file.path, status: \"modified\", expected: file.sha256, actual };\n });\n}\n\nfunction unmetRequires(input: {\n item: RegistryItem;\n coreVersion: string;\n adminVersion: string | null;\n installed: InstalledRegistryRecord;\n}): string[] {\n const messages: string[] = [];\n const { item } = input;\n if (item.requires.core) {\n try {\n if (!satisfiesVersionRange(input.coreVersion, item.requires.core)) {\n messages.push(\n `@umec/core ${item.requires.core} が必要です(現在 ${input.coreVersion})。pnpm update @umec/core を実行してください。`,\n );\n }\n } catch (error) {\n messages.push(error instanceof Error ? error.message : String(error));\n }\n }\n if (item.requires.admin) {\n if (!input.adminVersion) {\n messages.push(\n `@umec/admin ${item.requires.admin} が必要です。先に @umec/admin をインストールしてください。`,\n );\n } else {\n try {\n if (!satisfiesVersionRange(input.adminVersion, item.requires.admin)) {\n messages.push(\n `@umec/admin ${item.requires.admin} が必要です(現在 ${input.adminVersion})。`,\n );\n }\n } catch (error) {\n messages.push(error instanceof Error ? error.message : String(error));\n }\n }\n }\n for (const requiredId of item.requires.items ?? []) {\n if (!input.installed.items.some((entry) => entry.id === requiredId)) {\n messages.push(`先に umec add ${requiredId} を実行してください。`);\n }\n }\n return messages;\n}\n\nexport async function runRegistryList(options: RegistryListOptions): Promise<RegistryCommandResult> {\n const print = options.print ?? (() => {});\n const lines: string[] = [];\n try {\n const registryRoot = options.registryRoot ?? defaultRegistryRoot();\n const items = listRegistryItems(registryRoot).map(catalogEntry);\n if (options.json) {\n return finishJson(print, lines, { schemaVersion: 1, items }, 0);\n }\n if (items.length === 0) {\n sayResult(print, lines, \"(no registry items)\");\n return { exitCode: 0, lines };\n }\n for (const item of items) {\n sayResult(print, lines, `${item.id} ${item.version} ${item.risk}`);\n sayResult(print, lines, ` ${item.title}`);\n sayResult(print, lines, ` requires: ${formatRequires(item.requires)}`);\n }\n return { exitCode: 0, lines };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return finishError({ json: options.json, print, lines }, message);\n }\n}\n\nexport async function runRegistryAdd(options: RegistryAddOptions): Promise<RegistryCommandResult> {\n const print = options.print ?? (() => {});\n const lines: string[] = [];\n const itemId = options.itemId;\n if (!itemId) {\n return finishError({ json: options.json, print, lines }, \"umec add には <item-id> または --list が必要です。\");\n }\n\n try {\n const registryRoot = options.registryRoot ?? defaultRegistryRoot();\n const item = loadRegistryItem(registryRoot, itemId);\n const installed = readInstalledRecord(options.cwd);\n const coreVersion = options.coreVersion ?? coreVersionFromPackage();\n const adminVersion =\n options.adminVersion !== undefined\n ? options.adminVersion\n : readCustomerPackageVersion(options.cwd, \"@umec/admin\");\n const unmet = unmetRequires({ item, coreVersion, adminVersion, installed });\n if (unmet.length > 0) {\n return finishError(\n { json: options.json, print, lines },\n unmet.join(\"\\n\"),\n { id: item.id, version: item.version, unmet },\n );\n }\n\n const findings = classifyRegistryFiles(options.cwd, item.files);\n const modified = findings.filter((file) => file.status === \"modified\");\n if (modified.length > 0 && options.force !== true) {\n const error = `改変済みのファイルがあるため ${item.id} を書き込みません。umec diff ${item.id} で差分を確認し、上書きする場合は umec add ${item.id} --force を実行してください。`;\n if (options.json) {\n return finishJson(\n print,\n lines,\n { ok: false, id: item.id, version: item.version, error, files: findings },\n 1,\n );\n }\n for (const file of modified) sayResult(print, lines, `modified: ${file.path}`);\n return { exitCode: 1, lines, error };\n }\n\n const written: string[] = [];\n const unchanged: string[] = [];\n for (const file of item.files) {\n const dest = resolveInstancePath(options.cwd, file.path);\n if (!dest) throw new Error(`書き込み先が不正です: ${file.path}`);\n if (existsSync(dest) && !statSync(dest).isFile()) {\n throw new Error(`${file.path} はファイルではないため書き込めません。`);\n }\n const finding = findings.find((entry) => entry.path === file.path);\n if (finding?.status === \"match\") {\n unchanged.push(file.path);\n continue;\n }\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(dest, readFileSync(file.sourcePath));\n written.push(file.path);\n }\n\n const appliedAt = new Date(options.now ?? Date.now()).toISOString();\n const record = upsertInstalledItem(installed, { id: item.id, version: item.version, appliedAt });\n writeInstalledRecord(options.cwd, record);\n\n if (options.json) {\n return finishJson(\n print,\n lines,\n {\n ok: true,\n id: item.id,\n version: item.version,\n written,\n unchanged,\n record: INSTALLED_RECORD_REL,\n appliedAt,\n },\n 0,\n );\n }\n sayResult(print, lines, `applied ${item.id}@${item.version}`);\n for (const path of written) sayResult(print, lines, `wrote ${path}`);\n for (const path of unchanged) sayResult(print, lines, `unchanged ${path}`);\n sayResult(print, lines, `recorded ${INSTALLED_RECORD_REL}`);\n return { exitCode: 0, lines };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return finishError({ json: options.json, print, lines }, message, itemId ? { id: itemId } : {});\n }\n}\n\nfunction formatDiffReport(item: RegistryItem, files: RegistryFileFinding[]): string[] {\n const counts = {\n match: files.filter((file) => file.status === \"match\").length,\n modified: files.filter((file) => file.status === \"modified\").length,\n missing: files.filter((file) => file.status === \"missing\").length,\n };\n const lines = [\n `registry item: ${item.id} ${item.version}`,\n `match: ${counts.match}`,\n `modified: ${counts.modified}`,\n `missing: ${counts.missing}`,\n ];\n for (const file of files) {\n if (file.status === \"match\") continue;\n lines.push(`${file.status}: ${file.path}`);\n }\n return lines;\n}\n\nexport async function runRegistryDiff(options: RegistryDiffOptions): Promise<RegistryCommandResult> {\n const print = options.print ?? (() => {});\n const lines: string[] = [];\n const itemId = options.itemId;\n if (!itemId) {\n return finishError({ json: options.json, print, lines }, \"umec diff には <item-id> が必要です。\");\n }\n\n try {\n const registryRoot = options.registryRoot ?? defaultRegistryRoot();\n const item = loadRegistryItem(registryRoot, itemId);\n const files = classifyRegistryFiles(options.cwd, item.files);\n const ok = files.every((file) => file.status === \"match\");\n const counts = {\n match: files.filter((file) => file.status === \"match\").length,\n modified: files.filter((file) => file.status === \"modified\").length,\n missing: files.filter((file) => file.status === \"missing\").length,\n };\n if (options.json) {\n return finishJson(\n print,\n lines,\n {\n schemaVersion: 1,\n ok,\n id: item.id,\n version: item.version,\n title: item.title,\n counts,\n files,\n },\n ok ? 0 : 1,\n );\n }\n for (const line of formatDiffReport(item, files)) sayResult(print, lines, line);\n return { exitCode: ok ? 0 : 1, lines };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return finishError({ json: options.json, print, lines }, message, { id: itemId });\n }\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { sha256File } from \"./checksum.js\";\nimport type { Printer } from \"./migrate.js\";\n\nexport const TEMPLATE_ZONES = [\"managed\", \"brand\", \"generated\"] as const;\nexport type TemplateZone = (typeof TEMPLATE_ZONES)[number];\n\nexport type TemplateManifestFile = {\n path: string;\n sha256: string;\n zone: TemplateZone;\n};\n\nexport type TemplateManifest = {\n schemaVersion: 1;\n templateVersion: string;\n generatedAt: string;\n files: TemplateManifestFile[];\n};\n\nexport type TemplateFileStatus = \"match\" | \"modified\" | \"missing\" | \"untracked\";\n\nexport type TemplateFinding = {\n path: string;\n status: TemplateFileStatus;\n zone?: TemplateZone;\n expected?: string;\n actual?: string;\n};\n\nexport type TemplateDoctorReport = {\n schemaVersion: 1;\n templateVersion: string;\n generatedAt: string;\n manifest: string;\n ok: boolean;\n counts: {\n match: number;\n modified: number;\n missing: number;\n untracked: number;\n };\n files: TemplateFinding[];\n};\n\nexport type ManifestFetcher = (\n input: string,\n init?: { signal?: AbortSignal },\n) => Promise<{\n ok: boolean;\n status: number;\n text: () => Promise<string>;\n}>;\n\nexport type TemplateDoctorOptions = {\n cwd: string;\n manifest: string;\n json?: boolean;\n print?: Printer;\n fetch?: ManifestFetcher;\n};\n\nexport type TemplateDoctorResult = {\n exitCode: number;\n lines: string[];\n report?: TemplateDoctorReport;\n error?: string;\n};\n\nconst SHA256_HEX = /^[0-9a-f]{64}$/;\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \".astro\",\n \".wrangler\",\n \"coverage\",\n \".output\",\n \".cache\",\n \".pnpm-store\",\n]);\n\nfunction isZone(value: unknown): value is TemplateZone {\n return value === \"managed\" || value === \"brand\" || value === \"generated\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isHttpsUrl(value: string): boolean {\n return /^https:\\/\\//i.test(value);\n}\n\nexport function isSafeRelPath(posixPath: string): boolean {\n if (!posixPath || posixPath.startsWith(\"/\") || posixPath.includes(\"\\\\\") || posixPath.includes(\"\\0\")) {\n return false;\n }\n const parts = posixPath.split(\"/\");\n return parts.every((part) => part !== \"\" && part !== \".\" && part !== \"..\");\n}\n\nexport function resolveInstancePath(cwd: string, posixPath: string): string | null {\n if (!isSafeRelPath(posixPath)) return null;\n const resolved = resolve(cwd, ...posixPath.split(\"/\"));\n const rel = relative(resolve(cwd), resolved);\n if (!rel || rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) return null;\n return resolved;\n}\n\nexport function parseTemplateManifest(text: string): TemplateManifest {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new Error(\"manifest の JSON が不正です。\");\n }\n if (!isRecord(parsed)) throw new Error(\"manifest の JSON が不正です。\");\n if (parsed.schemaVersion !== 1) {\n throw new Error(`manifest schemaVersion ${String(parsed.schemaVersion)} には未対応です(対応: 1)。`);\n }\n if (typeof parsed.templateVersion !== \"string\" || parsed.templateVersion.length === 0) {\n throw new Error(\"manifest.templateVersion が必要です。\");\n }\n if (typeof parsed.generatedAt !== \"string\" || parsed.generatedAt.length === 0) {\n throw new Error(\"manifest.generatedAt が必要です。\");\n }\n if (!Array.isArray(parsed.files)) {\n throw new Error(\"manifest.files が必要です。\");\n }\n\n const files: TemplateManifestFile[] = [];\n const seen = new Set<string>();\n for (const entry of parsed.files) {\n if (!isRecord(entry)) throw new Error(\"manifest.files の要素が不正です。\");\n if (typeof entry.path !== \"string\" || !isSafeRelPath(entry.path)) {\n throw new Error(`manifest の path が不正です: ${String(entry.path)}`);\n }\n if (seen.has(entry.path)) {\n throw new Error(`manifest の path が重複しています: ${entry.path}`);\n }\n if (typeof entry.sha256 !== \"string\" || !SHA256_HEX.test(entry.sha256.toLowerCase())) {\n throw new Error(`manifest の sha256 が不正です: ${entry.path}`);\n }\n if (!isZone(entry.zone)) {\n throw new Error(`manifest の zone が不正です: ${entry.path} (${String(entry.zone)})`);\n }\n seen.add(entry.path);\n files.push({\n path: entry.path,\n sha256: entry.sha256.toLowerCase(),\n zone: entry.zone,\n });\n }\n\n return {\n schemaVersion: 1,\n templateVersion: parsed.templateVersion,\n generatedAt: parsed.generatedAt,\n files,\n };\n}\n\nexport async function loadManifestText(\n source: string,\n cwd: string,\n fetchImpl: ManifestFetcher = globalThis.fetch,\n): Promise<{ text: string; origin: string }> {\n if (isHttpsUrl(source)) {\n const response = await fetchImpl(source, { signal: AbortSignal.timeout(15_000) });\n if (!response.ok) {\n throw new Error(`manifest を取得できません (${response.status}): ${source}`);\n }\n return { text: await response.text(), origin: source };\n }\n if (/^https?:\\/\\//i.test(source)) {\n throw new Error(\"manifest URL は https:// のみ受け付けます。\");\n }\n\n const path = isAbsolute(source) ? source : resolve(cwd, source);\n if (!existsSync(path) || !statSync(path).isFile()) {\n throw new Error(`manifest が見つかりません: ${source}`);\n }\n return { text: readFileSync(path, \"utf8\"), origin: path };\n}\n\nfunction toPosix(rel: string): string {\n return rel.split(sep).join(\"/\");\n}\n\nexport function listInstanceFiles(cwd: string): string[] {\n const root = resolve(cwd);\n const out: string[] = [];\n\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \".DS_Store\") continue;\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name) || entry.name.startsWith(\".\")) continue;\n walk(full);\n continue;\n }\n if (!entry.isFile()) continue;\n out.push(toPosix(relative(root, full)));\n }\n };\n\n walk(root);\n out.sort();\n return out;\n}\n\nexport function classifyTemplate(input: {\n cwd: string;\n manifest: TemplateManifest;\n origin: string;\n}): TemplateDoctorReport {\n const files: TemplateFinding[] = [];\n const tracked = new Set(input.manifest.files.map((file) => file.path));\n\n for (const entry of input.manifest.files) {\n if (entry.zone === \"generated\") continue;\n const resolved = resolveInstancePath(input.cwd, entry.path);\n if (!resolved || !existsSync(resolved) || !statSync(resolved).isFile()) {\n files.push({ path: entry.path, status: \"missing\", zone: entry.zone, expected: entry.sha256 });\n continue;\n }\n const actual = sha256File(resolved);\n if (actual === entry.sha256) {\n files.push({ path: entry.path, status: \"match\", zone: entry.zone, actual });\n } else {\n files.push({\n path: entry.path,\n status: \"modified\",\n zone: entry.zone,\n expected: entry.sha256,\n actual,\n });\n }\n }\n\n for (const path of listInstanceFiles(input.cwd)) {\n if (tracked.has(path)) continue;\n files.push({ path, status: \"untracked\" });\n }\n\n const counts = {\n match: files.filter((file) => file.status === \"match\").length,\n modified: files.filter((file) => file.status === \"modified\").length,\n missing: files.filter((file) => file.status === \"missing\").length,\n untracked: files.filter((file) => file.status === \"untracked\").length,\n };\n const ok = !files.some(\n (file) => file.zone === \"managed\" && (file.status === \"modified\" || file.status === \"missing\"),\n );\n\n return {\n schemaVersion: 1,\n templateVersion: input.manifest.templateVersion,\n generatedAt: input.manifest.generatedAt,\n manifest: input.origin,\n ok,\n counts,\n files,\n };\n}\n\nexport function formatTemplateReport(report: TemplateDoctorReport): string[] {\n const lines = [\n `template version: ${report.templateVersion}`,\n `generated at: ${report.generatedAt}`,\n `match: ${report.counts.match}`,\n `modified: ${report.counts.modified}`,\n `missing: ${report.counts.missing}`,\n `untracked: ${report.counts.untracked}`,\n ];\n for (const file of report.files) {\n if (file.status === \"match\") continue;\n if (file.status === \"untracked\") {\n lines.push(`untracked: ${file.path}`);\n continue;\n }\n if (file.zone === \"managed\" && (file.status === \"modified\" || file.status === \"missing\")) {\n lines.push(`error: ${file.status} managed ${file.path}`);\n continue;\n }\n lines.push(`${file.status} ${file.zone} ${file.path}`);\n }\n return lines;\n}\n\nexport async function runTemplateDoctor(options: TemplateDoctorOptions): Promise<TemplateDoctorResult> {\n const print = options.print ?? (() => {});\n const lines: string[] = [];\n const say = (line: string) => {\n lines.push(line);\n print(line);\n };\n\n try {\n const loaded = await loadManifestText(options.manifest, options.cwd, options.fetch);\n const manifest = parseTemplateManifest(loaded.text);\n const report = classifyTemplate({\n cwd: options.cwd,\n manifest,\n origin: loaded.origin,\n });\n if (options.json) {\n say(JSON.stringify(report, null, 2));\n } else {\n for (const line of formatTemplateReport(report)) say(line);\n }\n return { exitCode: report.ok ? 0 : 1, lines, report };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { exitCode: 1, lines, error: message };\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { bindSql, type MigrationExecutor } from \"./executor.js\";\n\nexport type WranglerRunResult = {\n code: number;\n stdout: string;\n stderr: string;\n};\n\nexport type RunCommand = (command: string, args: string[], cwd: string) => Promise<WranglerRunResult>;\n\nexport function defaultRunCommand(command: string, args: string[], cwd: string): Promise<WranglerRunResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({ code: code ?? 1, stdout, stderr });\n });\n });\n}\n\nexport function parseJsonc(text: string): unknown {\n const stripped = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/^\\s*\\/\\/.*$/gm, \"\");\n return JSON.parse(stripped);\n}\n\nexport function readD1DatabaseName(cwd: string, override?: string): string | null {\n if (override) return override;\n const path = join(cwd, \"wrangler.jsonc\");\n try {\n const parsed = parseJsonc(readFileSync(path, \"utf8\")) as {\n d1_databases?: Array<{ database_name?: string }>;\n };\n return parsed.d1_databases?.[0]?.database_name ?? null;\n } catch {\n return null;\n }\n}\n\nfunction parseExecuteJson(stdout: string): { results: unknown[]; changes: number } {\n const trimmed = stdout.trim();\n if (!trimmed) return { results: [], changes: 0 };\n const start = trimmed.indexOf(\"[\");\n const objStart = trimmed.indexOf(\"{\");\n const cut =\n start >= 0 && (objStart < 0 || start < objStart)\n ? trimmed.slice(start)\n : objStart >= 0\n ? trimmed.slice(objStart)\n : trimmed;\n const parsed: unknown = JSON.parse(cut);\n const rows = Array.isArray(parsed) ? parsed : [parsed];\n const first = rows[0] as { results?: unknown[]; meta?: { changes?: number } } | undefined;\n return {\n results: first?.results ?? [],\n changes: first?.meta?.changes ?? 0,\n };\n}\n\nexport function createWranglerExecutor(options: {\n cwd: string;\n database: string;\n remote: boolean;\n runCommand?: RunCommand;\n}): MigrationExecutor {\n const runCommand = options.runCommand ?? defaultRunCommand;\n const location = options.remote ? \"--remote\" : \"--local\";\n\n const execute = async (sql: string) => {\n // Use --command=<value> (not two separate argv entries) so a value that\n // itself starts with \"--\" (e.g. a SQL statement led by a \"-- comment\"\n // line, which is idiomatic at the top of every migration file) is never\n // mistaken by wrangler's own argument parser for another flag.\n const result = await runCommand(\n \"wrangler\",\n [\"d1\", \"execute\", options.database, location, \"--json\", `--command=${sql}`],\n options.cwd,\n );\n if (result.code !== 0) {\n throw new Error(result.stderr || result.stdout || `wrangler d1 execute failed (${result.code})`);\n }\n return parseExecuteJson(result.stdout);\n };\n\n return {\n async exec(sql: string) {\n await execute(sql);\n },\n async applySql(sql: string) {\n const { splitSqlStatements } = await import(\"../db/sql.js\");\n for (const statement of splitSqlStatements(sql)) {\n await execute(statement);\n }\n },\n async all<T>(sql: string, params: unknown[] = []) {\n const result = await execute(bindSql(sql, params));\n return result.results as T[];\n },\n async first<T>(sql: string, params: unknown[] = []) {\n const result = await execute(bindSql(sql, params));\n return (result.results[0] as T | undefined) ?? null;\n },\n async run(sql: string, params: unknown[] = []) {\n const result = await execute(bindSql(sql, params));\n return { changes: result.changes };\n },\n async captureBookmark() {\n const result = await runCommand(\n \"wrangler\",\n [\"d1\", \"time-travel\", \"info\", options.database, \"--json\"],\n options.cwd,\n );\n if (result.code !== 0) return null;\n try {\n const parsed = JSON.parse(result.stdout) as { bookmark?: string };\n return parsed.bookmark ?? null;\n } catch {\n return null;\n }\n },\n };\n}\n","import type { UpgradeExecutor } from \"../../schema/upgrades/types.js\";\nimport type { ShopDatabase } from \"../db/d1.js\";\nimport { splitSqlStatements } from \"../db/sql.js\";\n\nexport type MigrationExecutor = UpgradeExecutor & {\n applySql(sql: string): Promise<void>;\n captureBookmark(): Promise<string | null>;\n};\n\nexport function sqlLiteral(value: unknown): string {\n if (value === null || value === undefined) return \"NULL\";\n if (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n if (typeof value === \"string\") return `'${value.replaceAll(\"'\", \"''\")}'`;\n throw new Error(`Unsupported SQL bind: ${typeof value}`);\n}\n\nexport function bindSql(sql: string, params: unknown[] = []): string {\n let index = 0;\n return sql.replaceAll(\"?\", () => {\n if (index >= params.length) throw new Error(\"Not enough SQL bind parameters\");\n return sqlLiteral(params[index++]);\n });\n}\n\nexport function executorFromDatabase(\n db: ShopDatabase,\n captureBookmark: () => Promise<string | null> = async () => null,\n): MigrationExecutor {\n return {\n async exec(sql: string) {\n await db.prepare(sql).run();\n },\n async applySql(sql: string) {\n for (const statement of splitSqlStatements(sql)) {\n await db.prepare(statement).run();\n }\n },\n async all<T>(sql: string, params: unknown[] = []) {\n const statement = db.prepare(sql);\n if (params.length > 0) statement.bind(...params);\n const result = await statement.all<T>();\n return result.results ?? [];\n },\n async first<T>(sql: string, params: unknown[] = []) {\n const statement = db.prepare(sql);\n if (params.length > 0) statement.bind(...params);\n return statement.first<T>();\n },\n async run(sql: string, params: unknown[] = []) {\n const statement = db.prepare(sql);\n if (params.length > 0) statement.bind(...params);\n const result = await statement.run();\n return { changes: result.meta.changes };\n },\n captureBookmark,\n };\n}\n"],"mappings":"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","names":["readFileSync","join","existsSync","readFileSync","join","readFileSync","join","join","readFileSync","bookmark","existsSync","mkdirSync","readdirSync","readFileSync","statSync","writeFileSync","dirname","isAbsolute","join","relative","resolve","sep","existsSync","readdirSync","readFileSync","join","existsSync","readFileSync","readdirSync","join","isRecord","join","toPosix","sep","readdirSync","relative","existsSync","statSync","resolve","isAbsolute","readFileSync","mkdirSync","dirname","writeFileSync","readFileSync","join","resolve","join","readFileSync","splitSqlStatements","join","readFileSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umec/core",
3
- "version": "0.1.0-alpha.10",
3
+ "version": "0.1.0-alpha.12",
4
4
  "description": "Headless EC logic for umec — config schema and shared handlers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -62,7 +62,8 @@
62
62
  },
63
63
  "files": [
64
64
  "dist",
65
- "schema"
65
+ "schema",
66
+ "registry"
66
67
  ],
67
68
  "scripts": {
68
69
  "build": "tsup",
@@ -0,0 +1,23 @@
1
+ -- Instance-owned additive table for 特商法 disclosure requests (PaF-1).
2
+ -- Not a core-owned table. Apply via `umec migrate` (local migrations_dir).
3
+ CREATE TABLE disclosure_requests (
4
+ id TEXT PRIMARY KEY, -- 請求番号(nanoid 等。画面・メールに記載)
5
+ requester_email TEXT NOT NULL,
6
+ status TEXT NOT NULL DEFAULT 'received'
7
+ CHECK (status IN ('received', 'disclosed')),
8
+ received_at INTEGER NOT NULL, -- 受付日時(Unixミリ秒。既存規約に合わせる)
9
+ disclosed_at INTEGER, -- 開示日時(証跡の核心。autoでは受付とほぼ同時)
10
+ disclosure_email_id TEXT, -- Resend 開示メール id(NULL=未開示/リトライ中)
11
+ send_attempts INTEGER NOT NULL DEFAULT 0,
12
+ receipt_email_id TEXT, -- (将来用。受領確認を分離する場合)
13
+ operator_notified_at INTEGER,
14
+ ip_hash TEXT, -- sha256(ip + env salt)。レート制限用
15
+ user_agent TEXT,
16
+ created_at INTEGER NOT NULL
17
+ );
18
+ CREATE INDEX idx_disclosure_requests_status_received
19
+ ON disclosure_requests(status, received_at);
20
+ CREATE INDEX idx_disclosure_requests_email
21
+ ON disclosure_requests(requester_email);
22
+ CREATE INDEX idx_disclosure_requests_undisclosed
23
+ ON disclosure_requests(disclosure_email_id) WHERE disclosure_email_id IS NULL;