@alpaca-software/40kdc-data 0.5.12 → 0.5.15
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/abilities-resolver/resolver.d.ts.map +1 -1
- package/dist/abilities-resolver/resolver.js +6 -2
- package/dist/abilities-resolver/resolver.js.map +1 -1
- package/dist/audit-coverage.d.ts.map +1 -1
- package/dist/audit-coverage.js +90 -1
- package/dist/audit-coverage.js.map +1 -1
- package/dist/audit-phrasing.d.ts +64 -0
- package/dist/audit-phrasing.d.ts.map +1 -0
- package/dist/audit-phrasing.js +208 -0
- package/dist/audit-phrasing.js.map +1 -0
- package/dist/author-input-pack.d.ts +27 -0
- package/dist/author-input-pack.d.ts.map +1 -0
- package/dist/author-input-pack.js +198 -0
- package/dist/author-input-pack.js.map +1 -0
- package/dist/build-share-registry.d.ts +2 -0
- package/dist/build-share-registry.d.ts.map +1 -0
- package/dist/build-share-registry.js +115 -0
- package/dist/build-share-registry.js.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen-data.js +23 -0
- package/dist/codegen-data.js.map +1 -1
- package/dist/commands/translate.d.ts.map +1 -1
- package/dist/commands/translate.js +2 -5
- package/dist/commands/translate.js.map +1 -1
- package/dist/commands/validate-all.d.ts.map +1 -1
- package/dist/commands/validate-all.js +8 -3
- package/dist/commands/validate-all.js.map +1 -1
- package/dist/data/bundle.generated.js +1 -1
- package/dist/data/bundle.generated.js.map +1 -1
- package/dist/data/dataset.d.ts +33 -1
- package/dist/data/dataset.d.ts.map +1 -1
- package/dist/data/dataset.js +107 -1
- package/dist/data/dataset.js.map +1 -1
- package/dist/data/index.d.ts +5 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +5 -1
- package/dist/data/index.js.map +1 -1
- package/dist/data/roster-resolve.d.ts +16 -1
- package/dist/data/roster-resolve.d.ts.map +1 -1
- package/dist/data/roster-resolve.js +19 -0
- package/dist/data/roster-resolve.js.map +1 -1
- package/dist/data/types.d.ts +3 -1
- package/dist/data/types.d.ts.map +1 -1
- package/dist/data/types.js +1 -0
- package/dist/data/types.js.map +1 -1
- package/dist/extract-faction-pack.d.ts +16 -11
- package/dist/extract-faction-pack.d.ts.map +1 -1
- package/dist/extract-faction-pack.js +24 -80
- package/dist/extract-faction-pack.js.map +1 -1
- package/dist/gen-conformance.js +162 -0
- package/dist/gen-conformance.js.map +1 -1
- package/dist/generated.d.ts +129 -0
- package/dist/generated.d.ts.map +1 -1
- package/dist/generated.js.map +1 -1
- package/dist/import/gw-headerless.d.ts +70 -0
- package/dist/import/gw-headerless.d.ts.map +1 -0
- package/dist/import/gw-headerless.js +343 -0
- package/dist/import/gw-headerless.js.map +1 -0
- package/dist/import/import-roster.d.ts.map +1 -1
- package/dist/import/import-roster.js +8 -0
- package/dist/import/import-roster.js.map +1 -1
- package/dist/integrity.d.ts +32 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +120 -0
- package/dist/integrity.js.map +1 -0
- package/dist/merge-faction-pack.d.ts +2 -0
- package/dist/merge-faction-pack.d.ts.map +1 -0
- package/dist/merge-faction-pack.js +157 -0
- package/dist/merge-faction-pack.js.map +1 -0
- package/dist/pack-blocks.d.ts +32 -0
- package/dist/pack-blocks.d.ts.map +1 -0
- package/dist/pack-blocks.js +99 -0
- package/dist/pack-blocks.js.map +1 -0
- package/dist/report.d.ts +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +2 -2
- package/dist/report.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +42 -0
- package/dist/runner.js.map +1 -1
- package/dist/seed-detachment-abilities.d.ts +2 -0
- package/dist/seed-detachment-abilities.d.ts.map +1 -0
- package/dist/seed-detachment-abilities.js +137 -0
- package/dist/seed-detachment-abilities.js.map +1 -0
- package/dist/share/codec.d.ts +83 -0
- package/dist/share/codec.d.ts.map +1 -0
- package/dist/share/codec.js +230 -0
- package/dist/share/codec.js.map +1 -0
- package/dist/share/index.d.ts +30 -0
- package/dist/share/index.d.ts.map +1 -0
- package/dist/share/index.js +36 -0
- package/dist/share/index.js.map +1 -0
- package/dist/share/registry.d.ts +42 -0
- package/dist/share/registry.d.ts.map +1 -0
- package/dist/share/registry.generated.d.ts +4 -0
- package/dist/share/registry.generated.d.ts.map +1 -0
- package/dist/share/registry.generated.js +4 -0
- package/dist/share/registry.generated.js.map +1 -0
- package/dist/share/registry.js +68 -0
- package/dist/share/registry.js.map +1 -0
- package/dist/translate/condition.d.ts +1 -0
- package/dist/translate/condition.d.ts.map +1 -1
- package/dist/translate/condition.js +101 -7
- package/dist/translate/condition.js.map +1 -1
- package/dist/translate/effect.d.ts +28 -20
- package/dist/translate/effect.d.ts.map +1 -1
- package/dist/translate/effect.js +483 -114
- package/dist/translate/effect.js.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +1 -0
- package/dist/validate.js.map +1 -1
- package/package.json +4 -1
- package/schemas/core/allied-rule.schema.json +115 -0
- package/schemas/core/detachment.schema.json +44 -1
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * NDJSON conformance runner — the TypeScript implementation of the wire\n * protocol in `conformance/RUNNER_PROTOCOL.md`. Each line on stdin is a JSON\n * request `{op, args?}`; each line on stdout is a JSON response\n * `{ok: true, value}` or `{ok: false, error_kind, error_payload?}`.\n *\n * This file exports {@link processRequest} so vitest can drive the runner\n * in-process without spawning a child; the bottom `if (isCliMain())` block\n * wires the same dispatcher to real stdin/stdout for the cross-impl differ.\n *\n * The runner is a *thin* wrapper over the existing public API — it is not the\n * canonical way to use the package. Library consumers should import the\n * functions directly; the runner exists to give the cross-implementation\n * differ a uniform interface across language ports.\n */\nimport { createInterface } from \"node:readline\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport process from \"node:process\";\n\nimport { Dataset } from \"./data/dataset.js\";\nimport { normalizeName } from \"./data/normalize.js\";\nimport { maximalLoadout } from \"./data/loadout.js\";\nimport { exportRoster, type ExportFormat } from \"./export/index.js\";\nimport { importRoster, tryImportRoster, REGISTERED_ADAPTERS } from \"./import/import-roster.js\";\nimport { selectAdapter } from \"./import/adapter.js\";\nimport { createValidator } from \"./schema-loader.js\";\nimport { attributeStages, crunch, type Buff, type EngineContext, type EngineInput } from \"./cruncher/index.js\";\nimport { compareCell, loadoutCell, type ComparePhase, type LoadoutLine } from \"./compare.js\";\nimport { describeScoringCard, describeAbility, type ScoringMode, type Effect, type AbilityScope, type AbilityAppliesTo } from \"./translate/index.js\";\nimport { unitMatchesAppliesTo } from \"./scope.js\";\nimport {\n awardsOf,\n scoreTurn,\n scoreCap,\n scoreSecondaryEvent,\n scorePrimaryEvent,\n emptyPlayerGame,\n addToHand,\n scoreSecondary,\n removeScore,\n setPrimary,\n playerPrimary,\n playerSecondary,\n playerTotal,\n wtcResult,\n type AssertedAward,\n type PlayerGame,\n} from \"./scoring/index.js\";\nimport type { SecondaryCard } from \"./generated.js\";\nimport {\n resolveLayout,\n TerrainResolveError,\n keystoneMeasurements,\n TerrainKeystoneError,\n BOARD_INCHES,\n} from \"./terrain/index.js\";\nimport type { TerrainTemplate, TerrainLayout } from \"./terrain/resolve.js\";\nimport type Ajv from \"ajv\";\n\n// -----------------------------------------------------------------------------\n// Constants — spec version and implementation identity.\n// -----------------------------------------------------------------------------\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction loadSpecVersion(): number {\n // The corpus lives at repo-root/conformance/. Walk up from tools/src/ until\n // we find it so the runner works both from source (tsx) and from dist/.\n for (const candidate of [\n join(__dirname, \"../../conformance/SPEC_VERSION\"),\n join(__dirname, \"../../../conformance/SPEC_VERSION\"),\n ]) {\n try {\n return Number.parseInt(readFileSync(candidate, \"utf8\").trim(), 10);\n } catch {\n // try next\n }\n }\n throw new Error(\"could not locate conformance/SPEC_VERSION\");\n}\n\nfunction loadImplVersion(): string {\n for (const candidate of [\n join(__dirname, \"../package.json\"),\n join(__dirname, \"../../package.json\"),\n ]) {\n try {\n return (JSON.parse(readFileSync(candidate, \"utf8\")) as { version: string }).version;\n } catch {\n // try next\n }\n }\n return \"unknown\";\n}\n\nconst SPEC_VERSION = loadSpecVersion();\nconst IMPL_VERSION = loadImplVersion();\nconst IMPL_NAME = \"ts\";\n\n// -----------------------------------------------------------------------------\n// Error envelope helpers and the closed `error_kind` enum.\n// -----------------------------------------------------------------------------\n\nexport type RunnerResponse =\n | { ok: true; value: unknown }\n | { ok: false; error_kind: ErrorKind; error_payload?: unknown };\n\nconst ERROR_KINDS = [\n \"INVALID_INPUT\",\n \"UNKNOWN_OP\",\n \"UNKNOWN_ENTITY\",\n \"IMPORT_FAILED\",\n \"EXPORT_FAILED\",\n \"VALIDATION_ERROR\",\n \"CRUNCH_ERROR\",\n \"INTERNAL_ERROR\",\n] as const;\ntype ErrorKind = (typeof ERROR_KINDS)[number];\n\nfunction ok(value: unknown): RunnerResponse {\n return { ok: true, value };\n}\nfunction err(kind: ErrorKind, payload?: unknown): RunnerResponse {\n return payload === undefined\n ? { ok: false, error_kind: kind }\n : { ok: false, error_kind: kind, error_payload: payload };\n}\n\n// -----------------------------------------------------------------------------\n// Runner state — init must be the first request; subsequent ops fail with\n// INVALID_INPUT until init succeeds. Dataset and validator are lazy.\n// -----------------------------------------------------------------------------\n\nexport interface RunnerState {\n initialized: boolean;\n locale: string;\n tz: string;\n seed: number;\n dataset?: Dataset;\n validator?: Ajv;\n}\n\nexport function createRunnerState(): RunnerState {\n return { initialized: false, locale: \"C\", tz: \"UTC\", seed: 0 };\n}\n\nfunction getDataset(state: RunnerState): Dataset {\n if (!state.dataset) state.dataset = Dataset.embedded();\n return state.dataset;\n}\n\nfunction getValidator(state: RunnerState): Ajv {\n if (!state.validator) state.validator = createValidator();\n return state.validator;\n}\n\n// -----------------------------------------------------------------------------\n// Op handlers.\n// -----------------------------------------------------------------------------\n\nfunction handleInit(state: RunnerState, args: unknown): RunnerResponse {\n if (state.initialized) {\n return err(\"INVALID_INPUT\", { detail: \"init called twice\" });\n }\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"init args must be an object\" });\n }\n const a = args as { spec_version?: unknown; locale?: unknown; tz?: unknown; seed?: unknown };\n if (a.spec_version !== SPEC_VERSION) {\n return err(\"INVALID_INPUT\", {\n detail: `spec_version mismatch: runner=${SPEC_VERSION}, request=${String(a.spec_version)}`,\n });\n }\n if (a.locale !== \"C\") {\n return err(\"INVALID_INPUT\", { detail: `unsupported locale: ${String(a.locale)} (only \"C\")` });\n }\n if (a.tz !== \"UTC\") {\n return err(\"INVALID_INPUT\", { detail: `unsupported tz: ${String(a.tz)} (only \"UTC\")` });\n }\n if (typeof a.seed !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"seed must be a number\" });\n }\n state.initialized = true;\n state.locale = a.locale;\n state.tz = a.tz;\n state.seed = a.seed;\n return ok({ impl: IMPL_NAME, spec_version: SPEC_VERSION, impl_version: IMPL_VERSION });\n}\n\nfunction handleNormalize(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"normalize args must be an object\" });\n }\n const a = args as { input?: unknown };\n if (typeof a.input !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"normalize.input must be a string\" });\n }\n return ok(normalizeName(a.input));\n}\n\nfunction handleImport(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"import args must be an object\" });\n }\n const a = args as { format?: unknown; input?: unknown };\n if (typeof a.input !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"import.input must be a string\" });\n }\n try {\n // The wire protocol carries every input as a string: JSON payloads come\n // through as the JSON text, text payloads come through as-is. The import\n // pipeline decides which by attempting to parse JSON first.\n const trimmed = a.input.trimStart();\n let decoded: unknown;\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n decoded = JSON.parse(a.input);\n } catch {\n decoded = a.input;\n }\n } else {\n decoded = a.input;\n }\n const roster = importRoster(decoded, { dataset: getDataset(state) });\n return ok(roster);\n } catch (e) {\n return err(\"IMPORT_FAILED\", { detail: (e as Error).message, format: a.format ?? null });\n }\n}\n\nfunction handleTryImport(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"try_import args must be an object\" });\n }\n const a = args as { input?: unknown };\n if (typeof a.input !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"try_import.input must be a string\" });\n }\n const result = tryImportRoster(a.input, { dataset: getDataset(state) });\n if (!result.ok) {\n return err(\"IMPORT_FAILED\", { reason: result.reason, message: result.message });\n }\n return ok({ format: result.format, roster: result.roster });\n}\n\nconst EXPORT_FORMATS: ExportFormat[] = [\n \"newrecruit-json\",\n \"newrecruit-wtc-compact\",\n \"newrecruit-wtc-full\",\n \"newrecruit-simple\",\n \"roster-json\",\n \"rosterizer\",\n];\n\nfunction handleExport(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"export args must be an object\" });\n }\n const a = args as { format?: unknown; roster?: unknown };\n if (typeof a.format !== \"string\" || !EXPORT_FORMATS.includes(a.format as ExportFormat)) {\n return err(\"INVALID_INPUT\", { detail: `unknown export format: ${String(a.format)}` });\n }\n if (typeof a.roster !== \"object\" || a.roster === null) {\n return err(\"INVALID_INPUT\", { detail: \"export.roster must be an object\" });\n }\n try {\n // We assume the caller passes the canonical resolved Roster shape; if they\n // pass something the serializer can't handle, this throws.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ok(exportRoster(a.roster as any, a.format as ExportFormat));\n } catch (e) {\n return err(\"EXPORT_FAILED\", { detail: (e as Error).message });\n }\n}\n\n/**\n * Canonical string encoding of a base size for cross-impl comparison (mirrors the\n * string-encoding used by `maximal_loadout`). Returns null for an absent base.\n * round 32 → \"round:32\"\n * oval 75×42 → \"oval:75x42\"\n * small flyer → \"flying-base:small:draft\"\n * hull (draft) → \"hull:draft\"\n */\nexport function encodeBase(\n b:\n | { shape: string; diameter?: number; width?: number; length?: number; size?: string; draft?: boolean }\n | null\n | undefined,\n): string | null {\n if (!b) return null;\n const parts: string[] = [b.shape];\n if (b.shape === \"round\" && b.diameter != null) parts.push(String(b.diameter));\n else if (b.shape === \"oval\" && b.width != null && b.length != null) parts.push(`${b.width}x${b.length}`);\n else if (b.shape === \"flying-base\" && b.size) parts.push(b.size);\n if (b.draft) parts.push(\"draft\");\n return parts.join(\":\");\n}\n\nfunction handleLinkedQuery(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"linked_query args must be an object\" });\n }\n const a = args as { query?: unknown; input?: unknown };\n if (typeof a.query !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"linked_query.query must be a string\" });\n }\n const ds = getDataset(state);\n const input = (a.input ?? {}) as Record<string, string>;\n try {\n switch (a.query) {\n case \"find_unit\":\n return ok(ds.units.find(input.query ?? \"\")?.id ?? null);\n case \"find_weapon\":\n return ok(ds.weapons.find(input.query ?? \"\")?.id ?? null);\n case \"find_faction\":\n return ok(ds.factions.find(input.query ?? \"\")?.id ?? null);\n case \"find_ability\":\n return ok(ds.abilities.find(input.query ?? \"\")?.id ?? null);\n case \"abilities_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.abilities.map((x) => x.id));\n }\n case \"weapons_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.weapons.map((x) => x.id));\n }\n case \"wargear_options_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.wargearOptions.map((x) => x.id));\n }\n case \"maximal_loadout\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n const modelCount = Number(input.modelCount);\n const lo = maximalLoadout(u.raw, modelCount, ds.wargearOptionsOf(u.raw));\n // Encode the id→count map as sorted \"id:count\" strings for set compare.\n return ok([...lo.counts].map(([id, n]) => `${id}:${n}`).sort());\n }\n case \"phases_of\": {\n const ab = ds.abilities.get(input.abilityId);\n if (!ab) return err(\"UNKNOWN_ENTITY\", { kind: \"ability\", id: input.abilityId });\n return ok([...ab.phases]);\n }\n case \"faction_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.faction?.id ?? null);\n }\n case \"base_size_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(encodeBase(u.raw.base_size_mm));\n }\n case \"model_bases_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n const comp = ds.unitCompositions.find((c) => c.unit_id === input.unitId);\n // Ordered \"modelName=encodedBase\" pairs in declared model order.\n return ok((comp?.models ?? []).map((m) => `${m.name}=${encodeBase(m.base_size_mm) ?? \"none\"}`));\n }\n case \"abilities_of_faction\":\n return ok(ds.abilities.byFaction(input.factionId).map((x) => x.id));\n case \"weapons_of_faction\": {\n const f = ds.factions.get(input.factionId);\n if (!f) return err(\"UNKNOWN_ENTITY\", { kind: \"faction\", id: input.factionId });\n return ok(f.weapons.map((x) => x.id));\n }\n default:\n return err(\"INVALID_INPUT\", { detail: `unknown linked_query: ${a.query}` });\n }\n } catch (e) {\n return err(\"INTERNAL_ERROR\", { detail: (e as Error).message });\n }\n}\n\nconst VALIDATOR_TARGETS: Record<string, string> = {\n unit: \"https://40kdc.dev/schemas/core/unit.schema.json\",\n weapon: \"https://40kdc.dev/schemas/core/weapon.schema.json\",\n faction: \"https://40kdc.dev/schemas/core/faction.schema.json\",\n ability: \"https://40kdc.dev/schemas/enrichment/ability-dsl/ability.schema.json\",\n wargear: \"https://40kdc.dev/schemas/core/wargear.schema.json\",\n \"wargear-option\": \"https://40kdc.dev/schemas/core/wargear-option.schema.json\",\n};\n\nfunction ajvKeywordToCode(keyword: string): string {\n switch (keyword) {\n case \"required\":\n return \"REQUIRED_MISSING\";\n case \"type\":\n return \"TYPE_MISMATCH\";\n case \"enum\":\n return \"ENUM_VIOLATION\";\n case \"pattern\":\n case \"format\":\n return \"PATTERN_MISMATCH\";\n case \"minimum\":\n case \"maximum\":\n case \"exclusiveMinimum\":\n case \"exclusiveMaximum\":\n case \"minLength\":\n case \"maxLength\":\n case \"minItems\":\n case \"maxItems\":\n return \"RANGE_VIOLATION\";\n case \"additionalProperties\":\n return \"ADDITIONAL_PROPERTY\";\n case \"uniqueItems\":\n return \"UNIQUE_VIOLATION\";\n default:\n return `UNMAPPED:${keyword}`;\n }\n}\n\nfunction handleValidate(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"validate args must be an object\" });\n }\n const a = args as { target?: unknown; value?: unknown };\n if (typeof a.target !== \"string\" || !(a.target in VALIDATOR_TARGETS)) {\n return err(\"INVALID_INPUT\", { detail: `unknown validator target: ${String(a.target)}` });\n }\n let validate;\n try {\n validate = getValidator(state).getSchema(VALIDATOR_TARGETS[a.target]);\n } catch (e) {\n return err(\"VALIDATION_ERROR\", { detail: (e as Error).message });\n }\n if (!validate) {\n return err(\"VALIDATION_ERROR\", { detail: `schema not loaded: ${a.target}` });\n }\n validate(a.value);\n const raw = validate.errors ?? [];\n const seen = new Set<string>();\n const out: { path: string; code: string }[] = [];\n for (const e of raw) {\n const code = ajvKeywordToCode(e.keyword);\n if (code.startsWith(\"UNMAPPED:\")) continue;\n const path =\n e.keyword === \"required\"\n ? `${e.instancePath}/${(e.params as { missingProperty?: string }).missingProperty ?? \"\"}`\n : e.instancePath;\n const key = `${path}|${code}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push({ path, code });\n }\n return ok(out);\n}\n\ninterface CrunchArgs {\n attacker?: { weaponId?: string; profileIndex?: number };\n modelsFiring?: number;\n target?: { unitId?: string; profileIndex?: number; modelCount?: number };\n context?: EngineContext;\n buffs?: Buff[];\n}\n\n/**\n * Validate the wire-shape `crunch`/`attribution` args and assemble the\n * {@link EngineInput} both ops share, or return a typed runner error. The two\n * ops have identical inputs — separating this lets each handler stay tiny and\n * keeps the validation contract in one place.\n */\nfunction buildEngineInput(\n state: RunnerState,\n a: CrunchArgs,\n opName: string,\n): { ok: true; input: EngineInput } | { ok: false; response: RunnerResponse } {\n if (!a.attacker?.weaponId || typeof a.attacker.profileIndex !== \"number\") {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.attacker.weaponId/profileIndex required` }) };\n }\n if (!a.target?.unitId || typeof a.target.profileIndex !== \"number\") {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.target.unitId/profileIndex required` }) };\n }\n if (typeof a.modelsFiring !== \"number\") {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.modelsFiring required` }) };\n }\n if (!a.context) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.context required` }) };\n }\n const ds = getDataset(state);\n const weapon = ds.weapons.get(a.attacker.weaponId);\n if (!weapon) return { ok: false, response: err(\"UNKNOWN_ENTITY\", { kind: \"weapon\", id: a.attacker.weaponId }) };\n const unit = ds.units.get(a.target.unitId);\n if (!unit) return { ok: false, response: err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: a.target.unitId }) };\n const input: EngineInput = {\n attacker: { weapon: weapon.raw, profileIndex: a.attacker.profileIndex },\n target: {\n unit: unit.raw,\n profileIndex: a.target.profileIndex,\n ...(a.target.modelCount !== undefined ? { modelCount: a.target.modelCount } : {}),\n },\n modelsFiring: a.modelsFiring,\n buffs: a.buffs ?? [],\n context: a.context,\n };\n return { ok: true, input };\n}\n\nfunction handleCrunch(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"crunch args must be an object\" });\n }\n const built = buildEngineInput(state, args as CrunchArgs, \"crunch\");\n if (!built.ok) return built.response;\n try {\n // Canonical wire shape: stages array only. `resolved` is impl-internal\n // (TS/Rust shape diverges); per-stage `detail` strings aren't byte-equal\n // across impls. The differ compares per-stage `expected` with 5e-4\n // tolerance — that's the cross-impl contract.\n const out = crunch(built.input, getDataset(state));\n return ok({ stages: out.stages.map((s) => ({ name: s.name, expected: s.expected })) });\n } catch (e) {\n return err(\"CRUNCH_ERROR\", { detail: (e as Error).message });\n }\n}\n\nfunction handleAttribution(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"attribution args must be an object\" });\n }\n const a = args as CrunchArgs & { epsilon?: number };\n const built = buildEngineInput(state, a, \"attribution\");\n if (!built.ok) return built.response;\n try {\n const opts = typeof a.epsilon === \"number\" ? { epsilon: a.epsilon } : undefined;\n // Drop `detail` from the wire (impl-specific formatting). Keep all\n // numeric fields and the kind-tagged BuffSource shape that's already\n // serde-compatible.\n const stages = attributeStages(built.input, getDataset(state), opts);\n return ok(\n stages.map((s) => ({\n name: s.name,\n expected: s.expected,\n baseline: s.baseline,\n lifts: s.lifts,\n residual: s.residual,\n intrinsics: s.intrinsics,\n })),\n );\n } catch (e) {\n return err(\"CRUNCH_ERROR\", { detail: (e as Error).message });\n }\n}\n\nfunction handleCompare(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"compare args must be an object\" });\n }\n const a = args as {\n attacker?: {\n factionId?: unknown;\n unitId?: unknown;\n weaponId?: unknown;\n profileIndex?: unknown;\n };\n targetProfileId?: unknown;\n distance?: unknown;\n phase?: unknown;\n modelsFiring?: unknown;\n };\n const at = a.attacker ?? {};\n if (\n typeof at.factionId !== \"string\" ||\n typeof at.unitId !== \"string\" ||\n typeof at.weaponId !== \"string\" ||\n typeof at.profileIndex !== \"number\" ||\n typeof a.targetProfileId !== \"string\" ||\n typeof a.distance !== \"number\" ||\n (a.phase !== \"shooting\" && a.phase !== \"fight\")\n ) {\n return err(\"INVALID_INPUT\", { detail: \"compare: malformed attacker/target/distance/phase\" });\n }\n try {\n const cell = compareCell(getDataset(state), {\n factionId: at.factionId,\n unitId: at.unitId,\n weaponId: at.weaponId,\n profileIndex: at.profileIndex,\n targetProfileId: a.targetProfileId,\n distance: a.distance,\n phase: a.phase as ComparePhase,\n modelsFiring: typeof a.modelsFiring === \"number\" ? a.modelsFiring : 1,\n });\n return ok(cell);\n } catch (e) {\n return err(\"UNKNOWN_ENTITY\", { detail: (e as Error).message });\n }\n}\n\nfunction handleLoadout(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"loadout args must be an object\" });\n }\n const a = args as {\n lines?: unknown;\n targetProfileId?: unknown;\n distance?: unknown;\n phase?: unknown;\n };\n if (\n !Array.isArray(a.lines) ||\n typeof a.targetProfileId !== \"string\" ||\n typeof a.distance !== \"number\" ||\n (a.phase !== \"shooting\" && a.phase !== \"fight\")\n ) {\n return err(\"INVALID_INPUT\", { detail: \"loadout: malformed lines/target/distance/phase\" });\n }\n try {\n const cell = loadoutCell(getDataset(state), {\n lines: a.lines as LoadoutLine[],\n targetProfileId: a.targetProfileId,\n distance: a.distance,\n phase: a.phase as ComparePhase,\n });\n return ok(cell);\n } catch (e) {\n return err(\"UNKNOWN_ENTITY\", { detail: (e as Error).message });\n }\n}\n\nfunction handleTranslateScoring(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"translate_scoring args must be an object\" });\n }\n const a = args as { cardId?: unknown };\n if (typeof a.cardId !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"translate_scoring.cardId must be a string\" });\n }\n const card = getDataset(state).missionCards.get(a.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: a.cardId });\n return ok({ awards: describeScoringCard(card) });\n}\n\nfunction handleTranslateEffect(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"translate_effect args must be an object\" });\n }\n const a = args as { effect?: unknown; scope?: unknown; applies_to?: unknown };\n if (typeof a.effect !== \"object\" || a.effect === null) {\n return err(\"INVALID_INPUT\", { detail: \"translate_effect.effect must be an object\" });\n }\n const scope =\n typeof a.scope === \"object\" && a.scope !== null ? (a.scope as AbilityScope) : undefined;\n const appliesTo =\n typeof a.applies_to === \"object\" && a.applies_to !== null\n ? (a.applies_to as AbilityAppliesTo)\n : undefined;\n return ok({\n text: describeAbility({\n effect: a.effect as Effect,\n ...(scope ? { scope } : {}),\n ...(appliesTo ? { applies_to: appliesTo } : {}),\n }),\n });\n}\n\nfunction handleMatchAppliesTo(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"match_applies_to args must be an object\" });\n }\n const a = args as { applies_to?: unknown; units?: unknown };\n if (!Array.isArray(a.units)) {\n return err(\"INVALID_INPUT\", { detail: \"match_applies_to.units must be an array\" });\n }\n const filter =\n typeof a.applies_to === \"object\" && a.applies_to !== null\n ? (a.applies_to as AbilityAppliesTo)\n : undefined;\n const matchedIds: string[] = [];\n for (const u of a.units as Array<{ id?: unknown; keywords?: unknown; faction_keywords?: unknown }>) {\n if (unitMatchesAppliesTo(filter, {\n keywords: Array.isArray(u.keywords) ? (u.keywords as string[]) : undefined,\n faction_keywords: Array.isArray(u.faction_keywords) ? (u.faction_keywords as string[]) : undefined,\n })) {\n matchedIds.push(String(u.id));\n }\n }\n return ok({ matchedIds });\n}\n\n// -----------------------------------------------------------------------------\n// Scoring engine ops. Awards are referenced by index into the card's `awards`\n// array (never serialized over the wire) so both impls reconstruct the same\n// `AssertedAward` from the shared embedded dataset.\n// -----------------------------------------------------------------------------\n\nfunction isScoringMode(v: unknown): v is ScoringMode {\n return v === \"fixed\" || v === \"tactical\";\n}\n\ninterface AssertionRef {\n index: number;\n count?: number;\n}\n\n/**\n * Resolve `[{index, count?}]` against a card's `awards`, or return a typed\n * error. The index addresses the full `awards` array (approach filtering only\n * affects the cap, not which indices are valid).\n */\nfunction resolveAsserted(\n card: SecondaryCard,\n asserted: unknown,\n): { ok: true; value: AssertedAward[] } | { ok: false; response: RunnerResponse } {\n if (!Array.isArray(asserted)) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: \"asserted must be an array\" }) };\n }\n const awards = awardsOf(card);\n const out: AssertedAward[] = [];\n for (const raw of asserted) {\n if (typeof raw !== \"object\" || raw === null) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: \"asserted entry must be an object\" }) };\n }\n const a = raw as AssertionRef;\n if (typeof a.index !== \"number\" || a.index < 0 || a.index >= awards.length) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `asserted.index out of range: ${String(a.index)}` }) };\n }\n out.push(a.count === undefined ? { award: awards[a.index] } : { award: awards[a.index], count: a.count });\n }\n return { ok: true, value: out };\n}\n\nfunction handleScoreEvent(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"score_event args must be an object\" });\n }\n const a = args as { cardId?: unknown; approach?: unknown; asserted?: unknown; roundCap?: unknown };\n if (typeof a.cardId !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"score_event.cardId must be a string\" });\n }\n if (!isScoringMode(a.approach)) {\n return err(\"INVALID_INPUT\", { detail: \"score_event.approach must be 'fixed' or 'tactical'\" });\n }\n const card = getDataset(state).missionCards.get(a.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: a.cardId });\n const resolved = resolveAsserted(card, a.asserted);\n if (!resolved.ok) return resolved.response;\n\n const turn = scoreTurn(resolved.value);\n const cap = scoreCap(card, a.approach);\n const banked = scoreSecondaryEvent(resolved.value, card, a.approach);\n const value: { turn: number; cap: number | null; banked: number; primaryBanked?: number } = {\n turn,\n // Infinity (uncapped fixed) has no JSON form — null means \"no cap\".\n cap: cap === Infinity ? null : cap,\n banked,\n };\n if (typeof a.roundCap === \"number\") {\n value.primaryBanked = scorePrimaryEvent(resolved.value, a.roundCap);\n }\n return ok(value);\n}\n\ntype ScoreStateOp =\n | { kind: \"draw\"; cardId?: unknown }\n | { kind: \"score-secondary\"; cardId?: unknown; round?: unknown; asserted?: unknown }\n | { kind: \"score-primary\"; cardId?: unknown; round?: unknown; asserted?: unknown; roundCap?: unknown; gameCap?: unknown }\n | { kind: \"set-primary\"; round?: unknown; vp?: unknown; roundCap?: unknown; gameCap?: unknown }\n | { kind: \"remove-score\"; index?: unknown };\n\nfunction optionalCaps(o: { roundCap?: unknown; gameCap?: unknown }): { roundCap?: number; gameCap?: number } {\n const caps: { roundCap?: number; gameCap?: number } = {};\n if (typeof o.roundCap === \"number\") caps.roundCap = o.roundCap;\n if (typeof o.gameCap === \"number\") caps.gameCap = o.gameCap;\n return caps;\n}\n\nfunction handleScoreState(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"score_state args must be an object\" });\n }\n const a = args as { approach?: unknown; ops?: unknown };\n if (!isScoringMode(a.approach)) {\n return err(\"INVALID_INPUT\", { detail: \"score_state.approach must be 'fixed' or 'tactical'\" });\n }\n if (!Array.isArray(a.ops)) {\n return err(\"INVALID_INPUT\", { detail: \"score_state.ops must be an array\" });\n }\n let pg: PlayerGame = emptyPlayerGame(a.approach);\n const ds = getDataset(state);\n for (const raw of a.ops as ScoreStateOp[]) {\n switch (raw.kind) {\n case \"draw\": {\n if (typeof raw.cardId !== \"string\") return err(\"INVALID_INPUT\", { detail: \"draw.cardId must be a string\" });\n pg = addToHand(pg, raw.cardId);\n break;\n }\n case \"score-secondary\": {\n if (typeof raw.cardId !== \"string\" || typeof raw.round !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"score-secondary needs cardId and round\" });\n }\n const card = ds.missionCards.get(raw.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: raw.cardId });\n const resolved = resolveAsserted(card, raw.asserted);\n if (!resolved.ok) return resolved.response;\n const vp = scoreSecondaryEvent(resolved.value, card, pg.approach);\n pg = scoreSecondary(pg, raw.round, raw.cardId, vp);\n break;\n }\n case \"score-primary\": {\n if (typeof raw.cardId !== \"string\" || typeof raw.round !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"score-primary needs cardId and round\" });\n }\n const card = ds.missionCards.get(raw.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: raw.cardId });\n const resolved = resolveAsserted(card, raw.asserted);\n if (!resolved.ok) return resolved.response;\n // The app path: compute the round's raw total, then clamp on store.\n pg = setPrimary(pg, raw.round, scoreTurn(resolved.value), optionalCaps(raw));\n break;\n }\n case \"set-primary\": {\n if (typeof raw.round !== \"number\" || typeof raw.vp !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"set-primary needs round and vp\" });\n }\n pg = setPrimary(pg, raw.round, raw.vp, optionalCaps(raw));\n break;\n }\n case \"remove-score\": {\n if (typeof raw.index !== \"number\") return err(\"INVALID_INPUT\", { detail: \"remove-score needs index\" });\n pg = removeScore(pg, raw.index);\n break;\n }\n default:\n return err(\"INVALID_INPUT\", { detail: `unknown score_state op kind: ${String((raw as { kind?: unknown }).kind)}` });\n }\n }\n return ok({\n rounds: pg.rounds,\n handIds: pg.handIds,\n log: pg.log,\n primary: playerPrimary(pg),\n secondary: playerSecondary(pg),\n total: playerTotal(pg),\n });\n}\n\nfunction handleWtcResult(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"wtc_result args must be an object\" });\n }\n const a = args as { a?: unknown; b?: unknown };\n if (typeof a.a !== \"number\" || typeof a.b !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"wtc_result needs numeric a and b\" });\n }\n return ok(wtcResult(a.a, a.b));\n}\n\nfunction handleResolveTerrain(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"resolve_terrain args must be an object\" });\n }\n const a = args as { layout?: unknown; templates?: unknown };\n if (typeof a.layout !== \"object\" || a.layout === null) {\n return err(\"INVALID_INPUT\", { detail: \"resolve_terrain.layout must be an object\" });\n }\n const templates = a.templates ?? [];\n if (!Array.isArray(templates)) {\n return err(\"INVALID_INPUT\", { detail: \"resolve_terrain.templates must be an array\" });\n }\n try {\n const pieces = resolveLayout(a.layout as TerrainLayout, templates as TerrainTemplate[]);\n return ok({ pieces });\n } catch (e) {\n if (e instanceof TerrainResolveError) {\n return err(\"INVALID_INPUT\", { detail: e.message });\n }\n return err(\"INTERNAL_ERROR\", { detail: (e as Error).message });\n }\n}\n\nfunction handleKeystones(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"keystones args must be an object\" });\n }\n const a = args as { layout?: unknown; templates?: unknown; board?: unknown };\n if (typeof a.layout !== \"object\" || a.layout === null) {\n return err(\"INVALID_INPUT\", { detail: \"keystones.layout must be an object\" });\n }\n const templates = a.templates ?? [];\n if (!Array.isArray(templates)) {\n return err(\"INVALID_INPUT\", { detail: \"keystones.templates must be an array\" });\n }\n let board: { width: number; height: number } = BOARD_INCHES;\n if (a.board !== undefined) {\n const b = a.board as { width?: unknown; height?: unknown } | null;\n if (typeof b !== \"object\" || b === null || typeof b.width !== \"number\" || typeof b.height !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"keystones.board must be {width, height}\" });\n }\n board = { width: b.width, height: b.height };\n }\n try {\n const measurements = keystoneMeasurements(\n a.layout as TerrainLayout,\n templates as TerrainTemplate[],\n board,\n );\n return ok({ measurements });\n } catch (e) {\n if (e instanceof TerrainKeystoneError || e instanceof TerrainResolveError) {\n return err(\"INVALID_INPUT\", { detail: e.message });\n }\n return err(\"INTERNAL_ERROR\", { detail: (e as Error).message });\n }\n}\n\n// -----------------------------------------------------------------------------\n// Dispatcher and per-line entry point.\n// -----------------------------------------------------------------------------\n\n/**\n * Apply one decoded request to the runner state and return the response. Used\n * directly by tests; the CLI loop wraps it with line parsing.\n */\nexport function dispatch(state: RunnerState, req: { op: string; args?: unknown }): RunnerResponse {\n if (!state.initialized && req.op !== \"init\") {\n return err(\"INVALID_INPUT\", { detail: \"must init before any other op\" });\n }\n switch (req.op) {\n case \"init\":\n return handleInit(state, req.args);\n case \"version\":\n return ok({ impl: IMPL_NAME, spec_version: SPEC_VERSION, impl_version: IMPL_VERSION });\n case \"normalize\":\n return handleNormalize(req.args);\n case \"import\":\n return handleImport(state, req.args);\n case \"try_import\":\n return handleTryImport(state, req.args);\n case \"export\":\n return handleExport(req.args);\n case \"linked_query\":\n return handleLinkedQuery(state, req.args);\n case \"validate\":\n return handleValidate(state, req.args);\n case \"crunch\":\n return handleCrunch(state, req.args);\n case \"compare\":\n return handleCompare(state, req.args);\n case \"loadout\":\n return handleLoadout(state, req.args);\n case \"attribution\":\n return handleAttribution(state, req.args);\n case \"translate_scoring\":\n return handleTranslateScoring(state, req.args);\n case \"translate_effect\":\n return handleTranslateEffect(req.args);\n case \"match_applies_to\":\n return handleMatchAppliesTo(req.args);\n case \"score_event\":\n return handleScoreEvent(state, req.args);\n case \"score_state\":\n return handleScoreState(state, req.args);\n case \"wtc_result\":\n return handleWtcResult(req.args);\n case \"resolve_terrain\":\n return handleResolveTerrain(req.args);\n case \"keystones\":\n return handleKeystones(req.args);\n case \"shutdown\":\n return ok(null);\n default:\n return err(\"UNKNOWN_OP\", { op: req.op });\n }\n}\n\n/**\n * Process one line of stdin (one NDJSON request) and return the line that\n * should be written to stdout (one NDJSON response). Returns `null` only on\n * fully-empty input lines, which should be silently ignored.\n */\nexport function processRequest(state: RunnerState, line: string): string | null {\n const trimmed = line.trim();\n if (trimmed === \"\") return null;\n let req: { op?: unknown; args?: unknown };\n try {\n req = JSON.parse(trimmed);\n } catch (e) {\n return JSON.stringify(err(\"INVALID_INPUT\", { detail: `not valid JSON: ${(e as Error).message}` }));\n }\n if (typeof req.op !== \"string\") {\n return JSON.stringify(err(\"INVALID_INPUT\", { detail: \"request must have a string `op` field\" }));\n }\n const response = dispatch(state, { op: req.op, args: req.args });\n return JSON.stringify(response);\n}\n\n// -----------------------------------------------------------------------------\n// CLI: wire stdin/stdout. Only runs when this file is the process entry point.\n// -----------------------------------------------------------------------------\n\nfunction isCliMain(): boolean {\n // process.argv[1] is the path the runtime invoked. With tsx and node both,\n // it points at this file (or its compiled .js form). Comparing absolute\n // paths is the most robust portable check.\n if (!process.argv[1]) return false;\n const entry = process.argv[1];\n const here = fileURLToPath(import.meta.url);\n return entry === here || entry.endsWith(\"/runner.js\") || entry.endsWith(\"/runner.ts\");\n}\n\nasync function runCli(): Promise<void> {\n const state = createRunnerState();\n const rl = createInterface({ input: process.stdin });\n // We must respond on the same tick the request arrives — the differ\n // pipelines requests and expects responses in order. readline preserves\n // line ordering, so processing inside `line` handler is sufficient.\n for await (const line of rl) {\n const out = processRequest(state, line);\n if (out !== null) {\n process.stdout.write(out + \"\\n\");\n }\n // `shutdown` returns `ok(null)`; honor it by exiting after the response\n // is flushed.\n try {\n const req = JSON.parse(line);\n if (req && req.op === \"shutdown\") {\n process.exit(0);\n }\n } catch {\n // already handled above; not a shutdown\n }\n }\n}\n\nif (isCliMain()) {\n runCli().catch((e) => {\n // Last-ditch INTERNAL_ERROR so the differ sees a typed failure rather\n // than an opaque crash.\n process.stdout.write(\n JSON.stringify({\n ok: false,\n error_kind: \"INTERNAL_ERROR\",\n error_payload: { detail: (e as Error).message },\n }) + \"\\n\",\n );\n process.exit(1);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * NDJSON conformance runner — the TypeScript implementation of the wire\n * protocol in `conformance/RUNNER_PROTOCOL.md`. Each line on stdin is a JSON\n * request `{op, args?}`; each line on stdout is a JSON response\n * `{ok: true, value}` or `{ok: false, error_kind, error_payload?}`.\n *\n * This file exports {@link processRequest} so vitest can drive the runner\n * in-process without spawning a child; the bottom `if (isCliMain())` block\n * wires the same dispatcher to real stdin/stdout for the cross-impl differ.\n *\n * The runner is a *thin* wrapper over the existing public API — it is not the\n * canonical way to use the package. Library consumers should import the\n * functions directly; the runner exists to give the cross-implementation\n * differ a uniform interface across language ports.\n */\nimport { createInterface } from \"node:readline\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport process from \"node:process\";\n\nimport { Dataset } from \"./data/dataset.js\";\nimport { normalizeName } from \"./data/normalize.js\";\nimport { maximalLoadout } from \"./data/loadout.js\";\nimport { exportRoster, type ExportFormat } from \"./export/index.js\";\nimport { decodeShareToken, encodeShareToken, type ShareList } from \"./share/index.js\";\nimport { importRoster, tryImportRoster, REGISTERED_ADAPTERS } from \"./import/import-roster.js\";\nimport { selectAdapter } from \"./import/adapter.js\";\nimport { createValidator } from \"./schema-loader.js\";\nimport { attributeStages, crunch, type Buff, type EngineContext, type EngineInput } from \"./cruncher/index.js\";\nimport { compareCell, loadoutCell, type ComparePhase, type LoadoutLine } from \"./compare.js\";\nimport { describeScoringCard, describeAbility, type ScoringMode, type Effect, type AbilityScope, type AbilityAppliesTo } from \"./translate/index.js\";\nimport { unitMatchesAppliesTo } from \"./scope.js\";\nimport {\n awardsOf,\n scoreTurn,\n scoreCap,\n scoreSecondaryEvent,\n scorePrimaryEvent,\n emptyPlayerGame,\n addToHand,\n scoreSecondary,\n removeScore,\n setPrimary,\n playerPrimary,\n playerSecondary,\n playerTotal,\n wtcResult,\n type AssertedAward,\n type PlayerGame,\n} from \"./scoring/index.js\";\nimport type { SecondaryCard } from \"./generated.js\";\nimport {\n resolveLayout,\n TerrainResolveError,\n keystoneMeasurements,\n TerrainKeystoneError,\n BOARD_INCHES,\n} from \"./terrain/index.js\";\nimport type { TerrainTemplate, TerrainLayout } from \"./terrain/resolve.js\";\nimport type Ajv from \"ajv\";\n\n// -----------------------------------------------------------------------------\n// Constants — spec version and implementation identity.\n// -----------------------------------------------------------------------------\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction loadSpecVersion(): number {\n // The corpus lives at repo-root/conformance/. Walk up from tools/src/ until\n // we find it so the runner works both from source (tsx) and from dist/.\n for (const candidate of [\n join(__dirname, \"../../conformance/SPEC_VERSION\"),\n join(__dirname, \"../../../conformance/SPEC_VERSION\"),\n ]) {\n try {\n return Number.parseInt(readFileSync(candidate, \"utf8\").trim(), 10);\n } catch {\n // try next\n }\n }\n throw new Error(\"could not locate conformance/SPEC_VERSION\");\n}\n\nfunction loadImplVersion(): string {\n for (const candidate of [\n join(__dirname, \"../package.json\"),\n join(__dirname, \"../../package.json\"),\n ]) {\n try {\n return (JSON.parse(readFileSync(candidate, \"utf8\")) as { version: string }).version;\n } catch {\n // try next\n }\n }\n return \"unknown\";\n}\n\nconst SPEC_VERSION = loadSpecVersion();\nconst IMPL_VERSION = loadImplVersion();\nconst IMPL_NAME = \"ts\";\n\n// -----------------------------------------------------------------------------\n// Error envelope helpers and the closed `error_kind` enum.\n// -----------------------------------------------------------------------------\n\nexport type RunnerResponse =\n | { ok: true; value: unknown }\n | { ok: false; error_kind: ErrorKind; error_payload?: unknown };\n\nconst ERROR_KINDS = [\n \"INVALID_INPUT\",\n \"UNKNOWN_OP\",\n \"UNKNOWN_ENTITY\",\n \"IMPORT_FAILED\",\n \"EXPORT_FAILED\",\n \"VALIDATION_ERROR\",\n \"CRUNCH_ERROR\",\n \"INTERNAL_ERROR\",\n] as const;\ntype ErrorKind = (typeof ERROR_KINDS)[number];\n\nfunction ok(value: unknown): RunnerResponse {\n return { ok: true, value };\n}\nfunction err(kind: ErrorKind, payload?: unknown): RunnerResponse {\n return payload === undefined\n ? { ok: false, error_kind: kind }\n : { ok: false, error_kind: kind, error_payload: payload };\n}\n\n// -----------------------------------------------------------------------------\n// Runner state — init must be the first request; subsequent ops fail with\n// INVALID_INPUT until init succeeds. Dataset and validator are lazy.\n// -----------------------------------------------------------------------------\n\nexport interface RunnerState {\n initialized: boolean;\n locale: string;\n tz: string;\n seed: number;\n dataset?: Dataset;\n validator?: Ajv;\n}\n\nexport function createRunnerState(): RunnerState {\n return { initialized: false, locale: \"C\", tz: \"UTC\", seed: 0 };\n}\n\nfunction getDataset(state: RunnerState): Dataset {\n if (!state.dataset) state.dataset = Dataset.embedded();\n return state.dataset;\n}\n\nfunction getValidator(state: RunnerState): Ajv {\n if (!state.validator) state.validator = createValidator();\n return state.validator;\n}\n\n// -----------------------------------------------------------------------------\n// Op handlers.\n// -----------------------------------------------------------------------------\n\nfunction handleInit(state: RunnerState, args: unknown): RunnerResponse {\n if (state.initialized) {\n return err(\"INVALID_INPUT\", { detail: \"init called twice\" });\n }\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"init args must be an object\" });\n }\n const a = args as { spec_version?: unknown; locale?: unknown; tz?: unknown; seed?: unknown };\n if (a.spec_version !== SPEC_VERSION) {\n return err(\"INVALID_INPUT\", {\n detail: `spec_version mismatch: runner=${SPEC_VERSION}, request=${String(a.spec_version)}`,\n });\n }\n if (a.locale !== \"C\") {\n return err(\"INVALID_INPUT\", { detail: `unsupported locale: ${String(a.locale)} (only \"C\")` });\n }\n if (a.tz !== \"UTC\") {\n return err(\"INVALID_INPUT\", { detail: `unsupported tz: ${String(a.tz)} (only \"UTC\")` });\n }\n if (typeof a.seed !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"seed must be a number\" });\n }\n state.initialized = true;\n state.locale = a.locale;\n state.tz = a.tz;\n state.seed = a.seed;\n return ok({ impl: IMPL_NAME, spec_version: SPEC_VERSION, impl_version: IMPL_VERSION });\n}\n\nfunction handleNormalize(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"normalize args must be an object\" });\n }\n const a = args as { input?: unknown };\n if (typeof a.input !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"normalize.input must be a string\" });\n }\n return ok(normalizeName(a.input));\n}\n\nfunction handleImport(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"import args must be an object\" });\n }\n const a = args as { format?: unknown; input?: unknown };\n if (typeof a.input !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"import.input must be a string\" });\n }\n try {\n // The wire protocol carries every input as a string: JSON payloads come\n // through as the JSON text, text payloads come through as-is. The import\n // pipeline decides which by attempting to parse JSON first.\n const trimmed = a.input.trimStart();\n let decoded: unknown;\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n decoded = JSON.parse(a.input);\n } catch {\n decoded = a.input;\n }\n } else {\n decoded = a.input;\n }\n const roster = importRoster(decoded, { dataset: getDataset(state) });\n return ok(roster);\n } catch (e) {\n return err(\"IMPORT_FAILED\", { detail: (e as Error).message, format: a.format ?? null });\n }\n}\n\nfunction handleTryImport(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"try_import args must be an object\" });\n }\n const a = args as { input?: unknown };\n if (typeof a.input !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"try_import.input must be a string\" });\n }\n const result = tryImportRoster(a.input, { dataset: getDataset(state) });\n if (!result.ok) {\n return err(\"IMPORT_FAILED\", { reason: result.reason, message: result.message });\n }\n return ok({ format: result.format, roster: result.roster });\n}\n\nconst EXPORT_FORMATS: ExportFormat[] = [\n \"newrecruit-json\",\n \"newrecruit-wtc-compact\",\n \"newrecruit-wtc-full\",\n \"newrecruit-simple\",\n \"roster-json\",\n \"rosterizer\",\n];\n\nfunction handleExport(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"export args must be an object\" });\n }\n const a = args as { format?: unknown; roster?: unknown };\n if (typeof a.format !== \"string\" || !EXPORT_FORMATS.includes(a.format as ExportFormat)) {\n return err(\"INVALID_INPUT\", { detail: `unknown export format: ${String(a.format)}` });\n }\n if (typeof a.roster !== \"object\" || a.roster === null) {\n return err(\"INVALID_INPUT\", { detail: \"export.roster must be an object\" });\n }\n try {\n // We assume the caller passes the canonical resolved Roster shape; if they\n // pass something the serializer can't handle, this throws.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ok(exportRoster(a.roster as any, a.format as ExportFormat));\n } catch (e) {\n return err(\"EXPORT_FAILED\", { detail: (e as Error).message });\n }\n}\n\nfunction handleShareEncode(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"share_encode args must be an object\" });\n }\n const a = args as { list?: unknown };\n if (typeof a.list !== \"object\" || a.list === null) {\n return err(\"INVALID_INPUT\", { detail: \"share_encode.list must be an object\" });\n }\n try {\n return ok(encodeShareToken(a.list as ShareList));\n } catch (e) {\n // An id absent from the embedded registry is the only expected throw.\n return err(\"INVALID_INPUT\", { detail: (e as Error).message });\n }\n}\n\nfunction handleShareDecode(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"share_decode args must be an object\" });\n }\n const a = args as { token?: unknown };\n if (typeof a.token !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"share_decode.token must be a string\" });\n }\n // The DecodeResult ({ ok, list } | { ok, reason }) is the compared value;\n // a malformed/stale token is a normal result, not a protocol error.\n return ok(decodeShareToken(a.token));\n}\n\n/**\n * Canonical string encoding of a base size for cross-impl comparison (mirrors the\n * string-encoding used by `maximal_loadout`). Returns null for an absent base.\n * round 32 → \"round:32\"\n * oval 75×42 → \"oval:75x42\"\n * small flyer → \"flying-base:small:draft\"\n * hull (draft) → \"hull:draft\"\n */\nexport function encodeBase(\n b:\n | { shape: string; diameter?: number; width?: number; length?: number; size?: string; draft?: boolean }\n | null\n | undefined,\n): string | null {\n if (!b) return null;\n const parts: string[] = [b.shape];\n if (b.shape === \"round\" && b.diameter != null) parts.push(String(b.diameter));\n else if (b.shape === \"oval\" && b.width != null && b.length != null) parts.push(`${b.width}x${b.length}`);\n else if (b.shape === \"flying-base\" && b.size) parts.push(b.size);\n if (b.draft) parts.push(\"draft\");\n return parts.join(\":\");\n}\n\nfunction handleLinkedQuery(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"linked_query args must be an object\" });\n }\n const a = args as { query?: unknown; input?: unknown };\n if (typeof a.query !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"linked_query.query must be a string\" });\n }\n const ds = getDataset(state);\n const input = (a.input ?? {}) as Record<string, string>;\n try {\n switch (a.query) {\n case \"find_unit\":\n return ok(ds.units.find(input.query ?? \"\")?.id ?? null);\n case \"find_weapon\":\n return ok(ds.weapons.find(input.query ?? \"\")?.id ?? null);\n case \"find_faction\":\n return ok(ds.factions.find(input.query ?? \"\")?.id ?? null);\n case \"find_ability\":\n return ok(ds.abilities.find(input.query ?? \"\")?.id ?? null);\n case \"abilities_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.abilities.map((x) => x.id));\n }\n case \"weapons_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.weapons.map((x) => x.id));\n }\n case \"wargear_options_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.wargearOptions.map((x) => x.id));\n }\n case \"maximal_loadout\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n const modelCount = Number(input.modelCount);\n const lo = maximalLoadout(u.raw, modelCount, ds.wargearOptionsOf(u.raw));\n // Encode the id→count map as sorted \"id:count\" strings for set compare.\n return ok([...lo.counts].map(([id, n]) => `${id}:${n}`).sort());\n }\n case \"phases_of\": {\n const ab = ds.abilities.get(input.abilityId);\n if (!ab) return err(\"UNKNOWN_ENTITY\", { kind: \"ability\", id: input.abilityId });\n return ok([...ab.phases]);\n }\n case \"faction_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(u.faction?.id ?? null);\n }\n case \"base_size_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n return ok(encodeBase(u.raw.base_size_mm));\n }\n case \"model_bases_of\": {\n const u = ds.units.get(input.unitId);\n if (!u) return err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: input.unitId });\n const comp = ds.unitCompositions.find((c) => c.unit_id === input.unitId);\n // Ordered \"modelName=encodedBase\" pairs in declared model order.\n return ok((comp?.models ?? []).map((m) => `${m.name}=${encodeBase(m.base_size_mm) ?? \"none\"}`));\n }\n case \"abilities_of_faction\":\n return ok(ds.abilities.byFaction(input.factionId).map((x) => x.id));\n case \"weapons_of_faction\": {\n const f = ds.factions.get(input.factionId);\n if (!f) return err(\"UNKNOWN_ENTITY\", { kind: \"faction\", id: input.factionId });\n return ok(f.weapons.map((x) => x.id));\n }\n case \"units_with_keyword\":\n return ok(ds.unitsWithKeyword(input.keyword ?? \"\").map((u) => u.id));\n case \"allies_for\": {\n const raw = (input as Record<string, unknown>).detachmentIds;\n const detachmentIds = Array.isArray(raw) ? (raw as string[]) : [];\n return ok(ds.alliesFor(input.factionId ?? \"\", detachmentIds).map((r) => r.id));\n }\n case \"ally_units_for\":\n return ok(ds.allyUnitsFor(input.ruleId ?? \"\").map((u) => u.id));\n default:\n return err(\"INVALID_INPUT\", { detail: `unknown linked_query: ${a.query}` });\n }\n } catch (e) {\n return err(\"INTERNAL_ERROR\", { detail: (e as Error).message });\n }\n}\n\nconst VALIDATOR_TARGETS: Record<string, string> = {\n unit: \"https://40kdc.dev/schemas/core/unit.schema.json\",\n weapon: \"https://40kdc.dev/schemas/core/weapon.schema.json\",\n faction: \"https://40kdc.dev/schemas/core/faction.schema.json\",\n ability: \"https://40kdc.dev/schemas/enrichment/ability-dsl/ability.schema.json\",\n wargear: \"https://40kdc.dev/schemas/core/wargear.schema.json\",\n \"wargear-option\": \"https://40kdc.dev/schemas/core/wargear-option.schema.json\",\n};\n\nfunction ajvKeywordToCode(keyword: string): string {\n switch (keyword) {\n case \"required\":\n return \"REQUIRED_MISSING\";\n case \"type\":\n return \"TYPE_MISMATCH\";\n case \"enum\":\n return \"ENUM_VIOLATION\";\n case \"pattern\":\n case \"format\":\n return \"PATTERN_MISMATCH\";\n case \"minimum\":\n case \"maximum\":\n case \"exclusiveMinimum\":\n case \"exclusiveMaximum\":\n case \"minLength\":\n case \"maxLength\":\n case \"minItems\":\n case \"maxItems\":\n return \"RANGE_VIOLATION\";\n case \"additionalProperties\":\n return \"ADDITIONAL_PROPERTY\";\n case \"uniqueItems\":\n return \"UNIQUE_VIOLATION\";\n default:\n return `UNMAPPED:${keyword}`;\n }\n}\n\nfunction handleValidate(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"validate args must be an object\" });\n }\n const a = args as { target?: unknown; value?: unknown };\n if (typeof a.target !== \"string\" || !(a.target in VALIDATOR_TARGETS)) {\n return err(\"INVALID_INPUT\", { detail: `unknown validator target: ${String(a.target)}` });\n }\n let validate;\n try {\n validate = getValidator(state).getSchema(VALIDATOR_TARGETS[a.target]);\n } catch (e) {\n return err(\"VALIDATION_ERROR\", { detail: (e as Error).message });\n }\n if (!validate) {\n return err(\"VALIDATION_ERROR\", { detail: `schema not loaded: ${a.target}` });\n }\n validate(a.value);\n const raw = validate.errors ?? [];\n const seen = new Set<string>();\n const out: { path: string; code: string }[] = [];\n for (const e of raw) {\n const code = ajvKeywordToCode(e.keyword);\n if (code.startsWith(\"UNMAPPED:\")) continue;\n const path =\n e.keyword === \"required\"\n ? `${e.instancePath}/${(e.params as { missingProperty?: string }).missingProperty ?? \"\"}`\n : e.instancePath;\n const key = `${path}|${code}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push({ path, code });\n }\n return ok(out);\n}\n\ninterface CrunchArgs {\n attacker?: { weaponId?: string; profileIndex?: number };\n modelsFiring?: number;\n target?: { unitId?: string; profileIndex?: number; modelCount?: number };\n context?: EngineContext;\n buffs?: Buff[];\n}\n\n/**\n * Validate the wire-shape `crunch`/`attribution` args and assemble the\n * {@link EngineInput} both ops share, or return a typed runner error. The two\n * ops have identical inputs — separating this lets each handler stay tiny and\n * keeps the validation contract in one place.\n */\nfunction buildEngineInput(\n state: RunnerState,\n a: CrunchArgs,\n opName: string,\n): { ok: true; input: EngineInput } | { ok: false; response: RunnerResponse } {\n if (!a.attacker?.weaponId || typeof a.attacker.profileIndex !== \"number\") {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.attacker.weaponId/profileIndex required` }) };\n }\n if (!a.target?.unitId || typeof a.target.profileIndex !== \"number\") {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.target.unitId/profileIndex required` }) };\n }\n if (typeof a.modelsFiring !== \"number\") {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.modelsFiring required` }) };\n }\n if (!a.context) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `${opName}.context required` }) };\n }\n const ds = getDataset(state);\n const weapon = ds.weapons.get(a.attacker.weaponId);\n if (!weapon) return { ok: false, response: err(\"UNKNOWN_ENTITY\", { kind: \"weapon\", id: a.attacker.weaponId }) };\n const unit = ds.units.get(a.target.unitId);\n if (!unit) return { ok: false, response: err(\"UNKNOWN_ENTITY\", { kind: \"unit\", id: a.target.unitId }) };\n const input: EngineInput = {\n attacker: { weapon: weapon.raw, profileIndex: a.attacker.profileIndex },\n target: {\n unit: unit.raw,\n profileIndex: a.target.profileIndex,\n ...(a.target.modelCount !== undefined ? { modelCount: a.target.modelCount } : {}),\n },\n modelsFiring: a.modelsFiring,\n buffs: a.buffs ?? [],\n context: a.context,\n };\n return { ok: true, input };\n}\n\nfunction handleCrunch(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"crunch args must be an object\" });\n }\n const built = buildEngineInput(state, args as CrunchArgs, \"crunch\");\n if (!built.ok) return built.response;\n try {\n // Canonical wire shape: stages array only. `resolved` is impl-internal\n // (TS/Rust shape diverges); per-stage `detail` strings aren't byte-equal\n // across impls. The differ compares per-stage `expected` with 5e-4\n // tolerance — that's the cross-impl contract.\n const out = crunch(built.input, getDataset(state));\n return ok({ stages: out.stages.map((s) => ({ name: s.name, expected: s.expected })) });\n } catch (e) {\n return err(\"CRUNCH_ERROR\", { detail: (e as Error).message });\n }\n}\n\nfunction handleAttribution(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"attribution args must be an object\" });\n }\n const a = args as CrunchArgs & { epsilon?: number };\n const built = buildEngineInput(state, a, \"attribution\");\n if (!built.ok) return built.response;\n try {\n const opts = typeof a.epsilon === \"number\" ? { epsilon: a.epsilon } : undefined;\n // Drop `detail` from the wire (impl-specific formatting). Keep all\n // numeric fields and the kind-tagged BuffSource shape that's already\n // serde-compatible.\n const stages = attributeStages(built.input, getDataset(state), opts);\n return ok(\n stages.map((s) => ({\n name: s.name,\n expected: s.expected,\n baseline: s.baseline,\n lifts: s.lifts,\n residual: s.residual,\n intrinsics: s.intrinsics,\n })),\n );\n } catch (e) {\n return err(\"CRUNCH_ERROR\", { detail: (e as Error).message });\n }\n}\n\nfunction handleCompare(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"compare args must be an object\" });\n }\n const a = args as {\n attacker?: {\n factionId?: unknown;\n unitId?: unknown;\n weaponId?: unknown;\n profileIndex?: unknown;\n };\n targetProfileId?: unknown;\n distance?: unknown;\n phase?: unknown;\n modelsFiring?: unknown;\n };\n const at = a.attacker ?? {};\n if (\n typeof at.factionId !== \"string\" ||\n typeof at.unitId !== \"string\" ||\n typeof at.weaponId !== \"string\" ||\n typeof at.profileIndex !== \"number\" ||\n typeof a.targetProfileId !== \"string\" ||\n typeof a.distance !== \"number\" ||\n (a.phase !== \"shooting\" && a.phase !== \"fight\")\n ) {\n return err(\"INVALID_INPUT\", { detail: \"compare: malformed attacker/target/distance/phase\" });\n }\n try {\n const cell = compareCell(getDataset(state), {\n factionId: at.factionId,\n unitId: at.unitId,\n weaponId: at.weaponId,\n profileIndex: at.profileIndex,\n targetProfileId: a.targetProfileId,\n distance: a.distance,\n phase: a.phase as ComparePhase,\n modelsFiring: typeof a.modelsFiring === \"number\" ? a.modelsFiring : 1,\n });\n return ok(cell);\n } catch (e) {\n return err(\"UNKNOWN_ENTITY\", { detail: (e as Error).message });\n }\n}\n\nfunction handleLoadout(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"loadout args must be an object\" });\n }\n const a = args as {\n lines?: unknown;\n targetProfileId?: unknown;\n distance?: unknown;\n phase?: unknown;\n };\n if (\n !Array.isArray(a.lines) ||\n typeof a.targetProfileId !== \"string\" ||\n typeof a.distance !== \"number\" ||\n (a.phase !== \"shooting\" && a.phase !== \"fight\")\n ) {\n return err(\"INVALID_INPUT\", { detail: \"loadout: malformed lines/target/distance/phase\" });\n }\n try {\n const cell = loadoutCell(getDataset(state), {\n lines: a.lines as LoadoutLine[],\n targetProfileId: a.targetProfileId,\n distance: a.distance,\n phase: a.phase as ComparePhase,\n });\n return ok(cell);\n } catch (e) {\n return err(\"UNKNOWN_ENTITY\", { detail: (e as Error).message });\n }\n}\n\nfunction handleTranslateScoring(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"translate_scoring args must be an object\" });\n }\n const a = args as { cardId?: unknown };\n if (typeof a.cardId !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"translate_scoring.cardId must be a string\" });\n }\n const card = getDataset(state).missionCards.get(a.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: a.cardId });\n return ok({ awards: describeScoringCard(card) });\n}\n\nfunction handleTranslateEffect(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"translate_effect args must be an object\" });\n }\n const a = args as { effect?: unknown; scope?: unknown; applies_to?: unknown };\n if (typeof a.effect !== \"object\" || a.effect === null) {\n return err(\"INVALID_INPUT\", { detail: \"translate_effect.effect must be an object\" });\n }\n const scope =\n typeof a.scope === \"object\" && a.scope !== null ? (a.scope as AbilityScope) : undefined;\n const appliesTo =\n typeof a.applies_to === \"object\" && a.applies_to !== null\n ? (a.applies_to as AbilityAppliesTo)\n : undefined;\n return ok({\n text: describeAbility({\n effect: a.effect as Effect,\n ...(scope ? { scope } : {}),\n ...(appliesTo ? { applies_to: appliesTo } : {}),\n }),\n });\n}\n\nfunction handleMatchAppliesTo(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"match_applies_to args must be an object\" });\n }\n const a = args as { applies_to?: unknown; units?: unknown };\n if (!Array.isArray(a.units)) {\n return err(\"INVALID_INPUT\", { detail: \"match_applies_to.units must be an array\" });\n }\n const filter =\n typeof a.applies_to === \"object\" && a.applies_to !== null\n ? (a.applies_to as AbilityAppliesTo)\n : undefined;\n const matchedIds: string[] = [];\n for (const u of a.units as Array<{ id?: unknown; keywords?: unknown; faction_keywords?: unknown }>) {\n if (unitMatchesAppliesTo(filter, {\n keywords: Array.isArray(u.keywords) ? (u.keywords as string[]) : undefined,\n faction_keywords: Array.isArray(u.faction_keywords) ? (u.faction_keywords as string[]) : undefined,\n })) {\n matchedIds.push(String(u.id));\n }\n }\n return ok({ matchedIds });\n}\n\n// -----------------------------------------------------------------------------\n// Scoring engine ops. Awards are referenced by index into the card's `awards`\n// array (never serialized over the wire) so both impls reconstruct the same\n// `AssertedAward` from the shared embedded dataset.\n// -----------------------------------------------------------------------------\n\nfunction isScoringMode(v: unknown): v is ScoringMode {\n return v === \"fixed\" || v === \"tactical\";\n}\n\ninterface AssertionRef {\n index: number;\n count?: number;\n}\n\n/**\n * Resolve `[{index, count?}]` against a card's `awards`, or return a typed\n * error. The index addresses the full `awards` array (approach filtering only\n * affects the cap, not which indices are valid).\n */\nfunction resolveAsserted(\n card: SecondaryCard,\n asserted: unknown,\n): { ok: true; value: AssertedAward[] } | { ok: false; response: RunnerResponse } {\n if (!Array.isArray(asserted)) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: \"asserted must be an array\" }) };\n }\n const awards = awardsOf(card);\n const out: AssertedAward[] = [];\n for (const raw of asserted) {\n if (typeof raw !== \"object\" || raw === null) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: \"asserted entry must be an object\" }) };\n }\n const a = raw as AssertionRef;\n if (typeof a.index !== \"number\" || a.index < 0 || a.index >= awards.length) {\n return { ok: false, response: err(\"INVALID_INPUT\", { detail: `asserted.index out of range: ${String(a.index)}` }) };\n }\n out.push(a.count === undefined ? { award: awards[a.index] } : { award: awards[a.index], count: a.count });\n }\n return { ok: true, value: out };\n}\n\nfunction handleScoreEvent(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"score_event args must be an object\" });\n }\n const a = args as { cardId?: unknown; approach?: unknown; asserted?: unknown; roundCap?: unknown };\n if (typeof a.cardId !== \"string\") {\n return err(\"INVALID_INPUT\", { detail: \"score_event.cardId must be a string\" });\n }\n if (!isScoringMode(a.approach)) {\n return err(\"INVALID_INPUT\", { detail: \"score_event.approach must be 'fixed' or 'tactical'\" });\n }\n const card = getDataset(state).missionCards.get(a.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: a.cardId });\n const resolved = resolveAsserted(card, a.asserted);\n if (!resolved.ok) return resolved.response;\n\n const turn = scoreTurn(resolved.value);\n const cap = scoreCap(card, a.approach);\n const banked = scoreSecondaryEvent(resolved.value, card, a.approach);\n const value: { turn: number; cap: number | null; banked: number; primaryBanked?: number } = {\n turn,\n // Infinity (uncapped fixed) has no JSON form — null means \"no cap\".\n cap: cap === Infinity ? null : cap,\n banked,\n };\n if (typeof a.roundCap === \"number\") {\n value.primaryBanked = scorePrimaryEvent(resolved.value, a.roundCap);\n }\n return ok(value);\n}\n\ntype ScoreStateOp =\n | { kind: \"draw\"; cardId?: unknown }\n | { kind: \"score-secondary\"; cardId?: unknown; round?: unknown; asserted?: unknown }\n | { kind: \"score-primary\"; cardId?: unknown; round?: unknown; asserted?: unknown; roundCap?: unknown; gameCap?: unknown }\n | { kind: \"set-primary\"; round?: unknown; vp?: unknown; roundCap?: unknown; gameCap?: unknown }\n | { kind: \"remove-score\"; index?: unknown };\n\nfunction optionalCaps(o: { roundCap?: unknown; gameCap?: unknown }): { roundCap?: number; gameCap?: number } {\n const caps: { roundCap?: number; gameCap?: number } = {};\n if (typeof o.roundCap === \"number\") caps.roundCap = o.roundCap;\n if (typeof o.gameCap === \"number\") caps.gameCap = o.gameCap;\n return caps;\n}\n\nfunction handleScoreState(state: RunnerState, args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"score_state args must be an object\" });\n }\n const a = args as { approach?: unknown; ops?: unknown };\n if (!isScoringMode(a.approach)) {\n return err(\"INVALID_INPUT\", { detail: \"score_state.approach must be 'fixed' or 'tactical'\" });\n }\n if (!Array.isArray(a.ops)) {\n return err(\"INVALID_INPUT\", { detail: \"score_state.ops must be an array\" });\n }\n let pg: PlayerGame = emptyPlayerGame(a.approach);\n const ds = getDataset(state);\n for (const raw of a.ops as ScoreStateOp[]) {\n switch (raw.kind) {\n case \"draw\": {\n if (typeof raw.cardId !== \"string\") return err(\"INVALID_INPUT\", { detail: \"draw.cardId must be a string\" });\n pg = addToHand(pg, raw.cardId);\n break;\n }\n case \"score-secondary\": {\n if (typeof raw.cardId !== \"string\" || typeof raw.round !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"score-secondary needs cardId and round\" });\n }\n const card = ds.missionCards.get(raw.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: raw.cardId });\n const resolved = resolveAsserted(card, raw.asserted);\n if (!resolved.ok) return resolved.response;\n const vp = scoreSecondaryEvent(resolved.value, card, pg.approach);\n pg = scoreSecondary(pg, raw.round, raw.cardId, vp);\n break;\n }\n case \"score-primary\": {\n if (typeof raw.cardId !== \"string\" || typeof raw.round !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"score-primary needs cardId and round\" });\n }\n const card = ds.missionCards.get(raw.cardId);\n if (!card) return err(\"UNKNOWN_ENTITY\", { kind: \"secondary-card\", id: raw.cardId });\n const resolved = resolveAsserted(card, raw.asserted);\n if (!resolved.ok) return resolved.response;\n // The app path: compute the round's raw total, then clamp on store.\n pg = setPrimary(pg, raw.round, scoreTurn(resolved.value), optionalCaps(raw));\n break;\n }\n case \"set-primary\": {\n if (typeof raw.round !== \"number\" || typeof raw.vp !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"set-primary needs round and vp\" });\n }\n pg = setPrimary(pg, raw.round, raw.vp, optionalCaps(raw));\n break;\n }\n case \"remove-score\": {\n if (typeof raw.index !== \"number\") return err(\"INVALID_INPUT\", { detail: \"remove-score needs index\" });\n pg = removeScore(pg, raw.index);\n break;\n }\n default:\n return err(\"INVALID_INPUT\", { detail: `unknown score_state op kind: ${String((raw as { kind?: unknown }).kind)}` });\n }\n }\n return ok({\n rounds: pg.rounds,\n handIds: pg.handIds,\n log: pg.log,\n primary: playerPrimary(pg),\n secondary: playerSecondary(pg),\n total: playerTotal(pg),\n });\n}\n\nfunction handleWtcResult(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"wtc_result args must be an object\" });\n }\n const a = args as { a?: unknown; b?: unknown };\n if (typeof a.a !== \"number\" || typeof a.b !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"wtc_result needs numeric a and b\" });\n }\n return ok(wtcResult(a.a, a.b));\n}\n\nfunction handleResolveTerrain(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"resolve_terrain args must be an object\" });\n }\n const a = args as { layout?: unknown; templates?: unknown };\n if (typeof a.layout !== \"object\" || a.layout === null) {\n return err(\"INVALID_INPUT\", { detail: \"resolve_terrain.layout must be an object\" });\n }\n const templates = a.templates ?? [];\n if (!Array.isArray(templates)) {\n return err(\"INVALID_INPUT\", { detail: \"resolve_terrain.templates must be an array\" });\n }\n try {\n const pieces = resolveLayout(a.layout as TerrainLayout, templates as TerrainTemplate[]);\n return ok({ pieces });\n } catch (e) {\n if (e instanceof TerrainResolveError) {\n return err(\"INVALID_INPUT\", { detail: e.message });\n }\n return err(\"INTERNAL_ERROR\", { detail: (e as Error).message });\n }\n}\n\nfunction handleKeystones(args: unknown): RunnerResponse {\n if (typeof args !== \"object\" || args === null) {\n return err(\"INVALID_INPUT\", { detail: \"keystones args must be an object\" });\n }\n const a = args as { layout?: unknown; templates?: unknown; board?: unknown };\n if (typeof a.layout !== \"object\" || a.layout === null) {\n return err(\"INVALID_INPUT\", { detail: \"keystones.layout must be an object\" });\n }\n const templates = a.templates ?? [];\n if (!Array.isArray(templates)) {\n return err(\"INVALID_INPUT\", { detail: \"keystones.templates must be an array\" });\n }\n let board: { width: number; height: number } = BOARD_INCHES;\n if (a.board !== undefined) {\n const b = a.board as { width?: unknown; height?: unknown } | null;\n if (typeof b !== \"object\" || b === null || typeof b.width !== \"number\" || typeof b.height !== \"number\") {\n return err(\"INVALID_INPUT\", { detail: \"keystones.board must be {width, height}\" });\n }\n board = { width: b.width, height: b.height };\n }\n try {\n const measurements = keystoneMeasurements(\n a.layout as TerrainLayout,\n templates as TerrainTemplate[],\n board,\n );\n return ok({ measurements });\n } catch (e) {\n if (e instanceof TerrainKeystoneError || e instanceof TerrainResolveError) {\n return err(\"INVALID_INPUT\", { detail: e.message });\n }\n return err(\"INTERNAL_ERROR\", { detail: (e as Error).message });\n }\n}\n\n// -----------------------------------------------------------------------------\n// Dispatcher and per-line entry point.\n// -----------------------------------------------------------------------------\n\n/**\n * Apply one decoded request to the runner state and return the response. Used\n * directly by tests; the CLI loop wraps it with line parsing.\n */\nexport function dispatch(state: RunnerState, req: { op: string; args?: unknown }): RunnerResponse {\n if (!state.initialized && req.op !== \"init\") {\n return err(\"INVALID_INPUT\", { detail: \"must init before any other op\" });\n }\n switch (req.op) {\n case \"init\":\n return handleInit(state, req.args);\n case \"version\":\n return ok({ impl: IMPL_NAME, spec_version: SPEC_VERSION, impl_version: IMPL_VERSION });\n case \"normalize\":\n return handleNormalize(req.args);\n case \"import\":\n return handleImport(state, req.args);\n case \"try_import\":\n return handleTryImport(state, req.args);\n case \"export\":\n return handleExport(req.args);\n case \"linked_query\":\n return handleLinkedQuery(state, req.args);\n case \"validate\":\n return handleValidate(state, req.args);\n case \"crunch\":\n return handleCrunch(state, req.args);\n case \"compare\":\n return handleCompare(state, req.args);\n case \"loadout\":\n return handleLoadout(state, req.args);\n case \"attribution\":\n return handleAttribution(state, req.args);\n case \"translate_scoring\":\n return handleTranslateScoring(state, req.args);\n case \"translate_effect\":\n return handleTranslateEffect(req.args);\n case \"match_applies_to\":\n return handleMatchAppliesTo(req.args);\n case \"score_event\":\n return handleScoreEvent(state, req.args);\n case \"score_state\":\n return handleScoreState(state, req.args);\n case \"wtc_result\":\n return handleWtcResult(req.args);\n case \"resolve_terrain\":\n return handleResolveTerrain(req.args);\n case \"keystones\":\n return handleKeystones(req.args);\n case \"share_encode\":\n return handleShareEncode(req.args);\n case \"share_decode\":\n return handleShareDecode(req.args);\n case \"shutdown\":\n return ok(null);\n default:\n return err(\"UNKNOWN_OP\", { op: req.op });\n }\n}\n\n/**\n * Process one line of stdin (one NDJSON request) and return the line that\n * should be written to stdout (one NDJSON response). Returns `null` only on\n * fully-empty input lines, which should be silently ignored.\n */\nexport function processRequest(state: RunnerState, line: string): string | null {\n const trimmed = line.trim();\n if (trimmed === \"\") return null;\n let req: { op?: unknown; args?: unknown };\n try {\n req = JSON.parse(trimmed);\n } catch (e) {\n return JSON.stringify(err(\"INVALID_INPUT\", { detail: `not valid JSON: ${(e as Error).message}` }));\n }\n if (typeof req.op !== \"string\") {\n return JSON.stringify(err(\"INVALID_INPUT\", { detail: \"request must have a string `op` field\" }));\n }\n const response = dispatch(state, { op: req.op, args: req.args });\n return JSON.stringify(response);\n}\n\n// -----------------------------------------------------------------------------\n// CLI: wire stdin/stdout. Only runs when this file is the process entry point.\n// -----------------------------------------------------------------------------\n\nfunction isCliMain(): boolean {\n // process.argv[1] is the path the runtime invoked. With tsx and node both,\n // it points at this file (or its compiled .js form). Comparing absolute\n // paths is the most robust portable check.\n if (!process.argv[1]) return false;\n const entry = process.argv[1];\n const here = fileURLToPath(import.meta.url);\n return entry === here || entry.endsWith(\"/runner.js\") || entry.endsWith(\"/runner.ts\");\n}\n\nasync function runCli(): Promise<void> {\n const state = createRunnerState();\n const rl = createInterface({ input: process.stdin });\n // We must respond on the same tick the request arrives — the differ\n // pipelines requests and expects responses in order. readline preserves\n // line ordering, so processing inside `line` handler is sufficient.\n for await (const line of rl) {\n const out = processRequest(state, line);\n if (out !== null) {\n process.stdout.write(out + \"\\n\");\n }\n // `shutdown` returns `ok(null)`; honor it by exiting after the response\n // is flushed.\n try {\n const req = JSON.parse(line);\n if (req && req.op === \"shutdown\") {\n process.exit(0);\n }\n } catch {\n // already handled above; not a shutdown\n }\n }\n}\n\nif (isCliMain()) {\n runCli().catch((e) => {\n // Last-ditch INTERNAL_ERROR so the differ sees a typed failure rather\n // than an opaque crash.\n process.stdout.write(\n JSON.stringify({\n ok: false,\n error_kind: \"INTERNAL_ERROR\",\n error_payload: { detail: (e as Error).message },\n }) + \"\\n\",\n );\n process.exit(1);\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-detachment-abilities.d.ts","sourceRoot":"","sources":["../src/seed-detachment-abilities.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seed empty-modifier DSL stubs for new-detachment abilities — the detachment
|
|
3
|
+
* rule, plus every stratagem and enhancement — so they flow through the normal
|
|
4
|
+
* `author-input → author-batch propose/apply` authoring workflow.
|
|
5
|
+
*
|
|
6
|
+
* The authoring pipeline only fleshes stubs that already exist (it iterates
|
|
7
|
+
* `hasEmptyModifier` entries). The faction-pack merge created the *core*
|
|
8
|
+
* stratagem/enhancement entities with `ability_id: null` and left detachment
|
|
9
|
+
* rules unmodelled, so nothing was authorable. This tool closes that gap:
|
|
10
|
+
*
|
|
11
|
+
* - one stub per core stratagem/enhancement (id = the entity id), and the core
|
|
12
|
+
* entity's `ability_id` is wired to it.
|
|
13
|
+
* - one `ability_type:"detachment"` stub per detachment rule (id = a slug of the
|
|
14
|
+
* `detachment_rule_name` from staging), and `detachment.detachment_rule_id`
|
|
15
|
+
* is wired to it.
|
|
16
|
+
*
|
|
17
|
+
* Scope is the faction-pack staging (`faction-pack-input/<faction>.json`, already
|
|
18
|
+
* trimmed to the new detachments). Idempotent: an ability id that already exists
|
|
19
|
+
* is left untouched (so hand-authored rules survive), and an already-wired core
|
|
20
|
+
* entity is skipped. Real mechanics are authored downstream — the stub effect is
|
|
21
|
+
* the empty-modifier placeholder the pipeline recognises. No GW prose is written.
|
|
22
|
+
*
|
|
23
|
+
* Usage: tsx tools/src/seed-detachment-abilities.ts <faction-id>… | --all-xenos
|
|
24
|
+
*/
|
|
25
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
26
|
+
import { resolve } from "node:path";
|
|
27
|
+
import { fileURLToPath } from "node:url";
|
|
28
|
+
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|
29
|
+
const DATA_ROOT = resolve(__dirname, "../../data");
|
|
30
|
+
const XENOS = [
|
|
31
|
+
"orks", "aeldari", "drukhari", "tyranids",
|
|
32
|
+
"genestealer-cults", "necrons", "leagues-of-votann", "tau-empire",
|
|
33
|
+
];
|
|
34
|
+
const GAME_VERSION = { edition: "11th", dataslate: "pre-launch-provisional" };
|
|
35
|
+
const readJson = (p) => JSON.parse(readFileSync(p, "utf-8"));
|
|
36
|
+
const writeJson = (p, v) => writeFileSync(p, JSON.stringify(v, null, 2) + "\n");
|
|
37
|
+
/** kebab-case id slug matching `^[a-z0-9][a-z0-9-]*[a-z0-9]$`. */
|
|
38
|
+
const slug = (s) => s.toLowerCase().normalize("NFKD").replace(/[̀-ͯ]/g, "")
|
|
39
|
+
.replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
40
|
+
function emptyStub(abilityId, name, abilityType, factionId, detachmentId) {
|
|
41
|
+
return {
|
|
42
|
+
ability_id: abilityId,
|
|
43
|
+
name,
|
|
44
|
+
authored_by: "40kdc-community",
|
|
45
|
+
game_version: { ...GAME_VERSION },
|
|
46
|
+
version: "2025-q3",
|
|
47
|
+
supersedes: null,
|
|
48
|
+
unit_ids: [],
|
|
49
|
+
faction_id: factionId,
|
|
50
|
+
detachment_id: detachmentId,
|
|
51
|
+
ability_type: abilityType,
|
|
52
|
+
behavior: "passive",
|
|
53
|
+
effect: { type: "stat-modifier", target: "unit", modifier: {} },
|
|
54
|
+
scope: { range: "unit", duration: "permanent" },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function seedFaction(faction) {
|
|
58
|
+
const stagingPath = resolve(DATA_ROOT, "_audit", "faction-pack-input", `${faction}.json`);
|
|
59
|
+
if (!existsSync(stagingPath)) {
|
|
60
|
+
console.log(`${faction}: no staging file, skipped`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const staging = readJson(stagingPath);
|
|
64
|
+
const dir = resolve(DATA_ROOT, "core", faction);
|
|
65
|
+
const detachments = readJson(resolve(dir, "detachments.json"));
|
|
66
|
+
const stratagems = readJson(resolve(dir, "stratagems.json"));
|
|
67
|
+
const enhancements = readJson(resolve(dir, "enhancements.json"));
|
|
68
|
+
const abilitiesPath = resolve(DATA_ROOT, "enrichment", faction, "abilities.json");
|
|
69
|
+
const abilities = readJson(abilitiesPath);
|
|
70
|
+
const detById = new Map(detachments.map((d) => [d.id, d]));
|
|
71
|
+
const abilityIds = new Set(abilities.map((a) => a.ability_id));
|
|
72
|
+
const stratById = new Map(stratagems.map((s) => [s.id, s]));
|
|
73
|
+
const enhById = new Map(enhancements.map((e) => [e.id, e]));
|
|
74
|
+
let added = 0;
|
|
75
|
+
let wired = 0;
|
|
76
|
+
const ensureStub = (id, name, type, detId) => {
|
|
77
|
+
if (abilityIds.has(id))
|
|
78
|
+
return; // already authored or seeded
|
|
79
|
+
abilities.push(emptyStub(id, name, type, faction, detId));
|
|
80
|
+
abilityIds.add(id);
|
|
81
|
+
added++;
|
|
82
|
+
};
|
|
83
|
+
for (const sd of staging.detachments) {
|
|
84
|
+
const det = detById.get(sd.id);
|
|
85
|
+
if (!det)
|
|
86
|
+
continue;
|
|
87
|
+
// Detachment rule → ability_type "detachment".
|
|
88
|
+
if (sd.detachment_rule_name) {
|
|
89
|
+
let ruleId = slug(sd.detachment_rule_name);
|
|
90
|
+
if (abilityIds.has(ruleId) && det.detachment_rule_id !== ruleId)
|
|
91
|
+
ruleId = `${sd.id}-${ruleId}`;
|
|
92
|
+
ensureStub(ruleId, sd.detachment_rule_name, "detachment", sd.id);
|
|
93
|
+
if (!det.detachment_rule_id) {
|
|
94
|
+
det.detachment_rule_id = ruleId;
|
|
95
|
+
wired++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Stratagems + enhancements → stub per core entity, wire its ability_id.
|
|
99
|
+
for (const s of sd.stratagems ?? []) {
|
|
100
|
+
const core = stratById.get(s.id);
|
|
101
|
+
if (!core)
|
|
102
|
+
continue;
|
|
103
|
+
ensureStub(s.id, core.name, "stratagem", sd.id);
|
|
104
|
+
if (core.ability_id == null) {
|
|
105
|
+
core.ability_id = s.id;
|
|
106
|
+
wired++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const e of sd.enhancements ?? []) {
|
|
110
|
+
const core = enhById.get(e.id);
|
|
111
|
+
if (!core)
|
|
112
|
+
continue;
|
|
113
|
+
ensureStub(e.id, core.name, "enhancement", sd.id);
|
|
114
|
+
if (core.ability_id == null) {
|
|
115
|
+
core.ability_id = e.id;
|
|
116
|
+
wired++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
writeJson(abilitiesPath, abilities);
|
|
121
|
+
writeJson(resolve(dir, "detachments.json"), detachments);
|
|
122
|
+
writeJson(resolve(dir, "stratagems.json"), stratagems);
|
|
123
|
+
writeJson(resolve(dir, "enhancements.json"), enhancements);
|
|
124
|
+
console.log(`${faction}: +${added} stub abilities, wired ${wired} link(s)`);
|
|
125
|
+
}
|
|
126
|
+
function main() {
|
|
127
|
+
const args = process.argv.slice(2);
|
|
128
|
+
const factions = args.includes("--all-xenos") ? XENOS : args;
|
|
129
|
+
if (factions.length === 0) {
|
|
130
|
+
console.error("usage: seed-detachment-abilities.ts <faction-id>… | --all-xenos");
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
for (const f of factions)
|
|
134
|
+
seedFaction(f);
|
|
135
|
+
}
|
|
136
|
+
main();
|
|
137
|
+
//# sourceMappingURL=seed-detachment-abilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-detachment-abilities.js","sourceRoot":"","sources":["../src/seed-detachment-abilities.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Seed empty-modifier DSL stubs for new-detachment abilities — the detachment\n * rule, plus every stratagem and enhancement — so they flow through the normal\n * `author-input → author-batch propose/apply` authoring workflow.\n *\n * The authoring pipeline only fleshes stubs that already exist (it iterates\n * `hasEmptyModifier` entries). The faction-pack merge created the *core*\n * stratagem/enhancement entities with `ability_id: null` and left detachment\n * rules unmodelled, so nothing was authorable. This tool closes that gap:\n *\n * - one stub per core stratagem/enhancement (id = the entity id), and the core\n * entity's `ability_id` is wired to it.\n * - one `ability_type:\"detachment\"` stub per detachment rule (id = a slug of the\n * `detachment_rule_name` from staging), and `detachment.detachment_rule_id`\n * is wired to it.\n *\n * Scope is the faction-pack staging (`faction-pack-input/<faction>.json`, already\n * trimmed to the new detachments). Idempotent: an ability id that already exists\n * is left untouched (so hand-authored rules survive), and an already-wired core\n * entity is skipped. Real mechanics are authored downstream — the stub effect is\n * the empty-modifier placeholder the pipeline recognises. No GW prose is written.\n *\n * Usage: tsx tools/src/seed-detachment-abilities.ts <faction-id>… | --all-xenos\n */\nimport { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = fileURLToPath(new URL(\".\", import.meta.url));\nconst DATA_ROOT = resolve(__dirname, \"../../data\");\n\nconst XENOS = [\n \"orks\", \"aeldari\", \"drukhari\", \"tyranids\",\n \"genestealer-cults\", \"necrons\", \"leagues-of-votann\", \"tau-empire\",\n];\n\nconst GAME_VERSION = { edition: \"11th\", dataslate: \"pre-launch-provisional\" } as const;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Json = any;\nconst readJson = (p: string): Json => JSON.parse(readFileSync(p, \"utf-8\"));\nconst writeJson = (p: string, v: unknown): void => writeFileSync(p, JSON.stringify(v, null, 2) + \"\\n\");\n\n/** kebab-case id slug matching `^[a-z0-9][a-z0-9-]*[a-z0-9]$`. */\nconst slug = (s: string): string =>\n s.toLowerCase().normalize(\"NFKD\").replace(/[̀-ͯ]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n\nfunction emptyStub(\n abilityId: string,\n name: string,\n abilityType: string,\n factionId: string,\n detachmentId: string,\n): Json {\n return {\n ability_id: abilityId,\n name,\n authored_by: \"40kdc-community\",\n game_version: { ...GAME_VERSION },\n version: \"2025-q3\",\n supersedes: null,\n unit_ids: [],\n faction_id: factionId,\n detachment_id: detachmentId,\n ability_type: abilityType,\n behavior: \"passive\",\n effect: { type: \"stat-modifier\", target: \"unit\", modifier: {} },\n scope: { range: \"unit\", duration: \"permanent\" },\n };\n}\n\nfunction seedFaction(faction: string): void {\n const stagingPath = resolve(DATA_ROOT, \"_audit\", \"faction-pack-input\", `${faction}.json`);\n if (!existsSync(stagingPath)) {\n console.log(`${faction}: no staging file, skipped`);\n return;\n }\n const staging = readJson(stagingPath);\n const dir = resolve(DATA_ROOT, \"core\", faction);\n const detachments = readJson(resolve(dir, \"detachments.json\"));\n const stratagems = readJson(resolve(dir, \"stratagems.json\"));\n const enhancements = readJson(resolve(dir, \"enhancements.json\"));\n const abilitiesPath = resolve(DATA_ROOT, \"enrichment\", faction, \"abilities.json\");\n const abilities = readJson(abilitiesPath);\n\n const detById = new Map<string, Json>(detachments.map((d: Json) => [d.id, d]));\n const abilityIds = new Set(abilities.map((a: Json) => a.ability_id as string));\n const stratById = new Map<string, Json>(stratagems.map((s: Json) => [s.id, s]));\n const enhById = new Map<string, Json>(enhancements.map((e: Json) => [e.id, e]));\n\n let added = 0;\n let wired = 0;\n\n const ensureStub = (id: string, name: string, type: string, detId: string): void => {\n if (abilityIds.has(id)) return; // already authored or seeded\n abilities.push(emptyStub(id, name, type, faction, detId));\n abilityIds.add(id);\n added++;\n };\n\n for (const sd of staging.detachments) {\n const det = detById.get(sd.id);\n if (!det) continue;\n\n // Detachment rule → ability_type \"detachment\".\n if (sd.detachment_rule_name) {\n let ruleId = slug(sd.detachment_rule_name);\n if (abilityIds.has(ruleId) && det.detachment_rule_id !== ruleId) ruleId = `${sd.id}-${ruleId}`;\n ensureStub(ruleId, sd.detachment_rule_name, \"detachment\", sd.id);\n if (!det.detachment_rule_id) {\n det.detachment_rule_id = ruleId;\n wired++;\n }\n }\n\n // Stratagems + enhancements → stub per core entity, wire its ability_id.\n for (const s of sd.stratagems ?? []) {\n const core = stratById.get(s.id);\n if (!core) continue;\n ensureStub(s.id, core.name, \"stratagem\", sd.id);\n if (core.ability_id == null) {\n core.ability_id = s.id;\n wired++;\n }\n }\n for (const e of sd.enhancements ?? []) {\n const core = enhById.get(e.id);\n if (!core) continue;\n ensureStub(e.id, core.name, \"enhancement\", sd.id);\n if (core.ability_id == null) {\n core.ability_id = e.id;\n wired++;\n }\n }\n }\n\n writeJson(abilitiesPath, abilities);\n writeJson(resolve(dir, \"detachments.json\"), detachments);\n writeJson(resolve(dir, \"stratagems.json\"), stratagems);\n writeJson(resolve(dir, \"enhancements.json\"), enhancements);\n console.log(`${faction}: +${added} stub abilities, wired ${wired} link(s)`);\n}\n\nfunction main(): void {\n const args = process.argv.slice(2);\n const factions = args.includes(\"--all-xenos\") ? XENOS : args;\n if (factions.length === 0) {\n console.error(\"usage: seed-detachment-abilities.ts <faction-id>… | --all-xenos\");\n process.exit(1);\n }\n for (const f of factions) seedFaction(f);\n}\n\nmain();\n"]}
|