feat: module 10 spellgrid

SpellGrid capstone: Part I's card engine and Part II's grid engine joined at
three seams (rules -> aura data, hazard victims -> one destroy Sequence,
Sequence end -> write text, remove the dead, reparse). Three levels with
scripted solutions, a naive-timing test via a harness-only hook that
reverses the END_OF_PHASE list, CLIs in both tracks, the BATTLECRY IS DOUBLE
Expansion Drop, SpellGrid cards and words in course/cards and the catalog,
level schema cards/hand, and tools staging/copying of module levels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-29 05:01:27 +01:00
1 parent 1f3359cfe2
commit a0cf9be214
96 files changed
+10454 -8

No files matched your search

+10
View File
@@ -66,3 +66,13 @@ test("verify_ts_default_installs_dependencies_first", async () => {
assert.equal(commandFor("ts", { VERIFY_CMD_TS: "true" }), "true");
assert.equal(commandFor("rust", {}), "cargo test");
});
test("verify_stage_copies_module_levels", async () => {
// From Module 10 the tests load puzzle levels from <crate or package root>/levels.
process.env.COURSE_ROOT = root;
const { planVerification, stage } = await import("../verify-references.mjs");
const { existsSync } = await import("node:fs");
const plans = planVerification(moduleDirs(), 3);
assert.ok(existsSync(join(stage(plans[2], "ts"), "levels", "fixture-level.json")));
assert.ok(!existsSync(join(stage(plans[1], "ts"), "levels")));
});