feat: module 05 assemble

Cards become JSON data in course/cards (one file per card, validated
against card.schema.json and the catalog); the M5 references load them
via registerCards and interpret effects, replacing content closures.
Adds assemble(base, donor, half), the assemble/buffHand effects with an
injected chooser, Fleshshape as the data-only Expansion Drop, and stages
course/cards in verify-references and start-module.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas Winther
2026-10-29 03:17:21 +01:00
co-authored by Claude Opus 5.5
parent 55fe5a71d7
commit e04dc1a11f
73 changed files with 6010 additions and 9 deletions
+8
View File
@@ -32,6 +32,14 @@ mkdirSync(join(ws, "tests"), { recursive: true });
for (const f of files) cpSync(f, join(ws, "tests", basename(f)));
console.log(`Copied ${files.length} test file(s) for module ${num} into ${join(ws, "tests")}`);
// The course's card data (read by your content from Module 5). Refreshed on every start;
// card files you add yourself are kept.
const cards = join(courseRoot(), "cards");
if (existsSync(cards)) {
cpSync(cards, join(ws, "cards"), { recursive: true });
console.log(`Copied the course card data into ${join(ws, "cards")}`);
}
// Harness additions: module-local note, else the "- M<N>:" line of course/harness.md.
const note = join(mod.path, "harness-adds.md");
let adds = existsSync(note) ? readFileSync(note, "utf8").trim() : "";