@bitcobblers/wod-wiki-tools 0.37.2137 → 0.37.2139

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.
Files changed (58) hide show
  1. package/dist/bin/wod.cjs +224 -231
  2. package/dist/bin/wod.cjs.map +1 -1
  3. package/dist/bin/wod.mjs +4 -4
  4. package/dist/{chunk-NATJMTAW.mjs → chunk-CVFMFD7D.mjs} +109 -187
  5. package/dist/chunk-CVFMFD7D.mjs.map +1 -0
  6. package/dist/{chunk-GBBJBDLS.mjs → chunk-HRFOKCYI.mjs} +116 -42
  7. package/dist/chunk-HRFOKCYI.mjs.map +1 -0
  8. package/dist/{chunk-CYKNTEGY.mjs → chunk-IWT7U3WX.mjs} +8 -3
  9. package/dist/chunk-IWT7U3WX.mjs.map +1 -0
  10. package/dist/{chunk-SQAI6B4P.mjs → chunk-JUBKCRNV.mjs} +3 -3
  11. package/dist/chunk-JUBKCRNV.mjs.map +1 -0
  12. package/dist/{chunk-MA6BBTWC.mjs → chunk-RWNL6APX.mjs} +3 -3
  13. package/dist/{chunk-MA6BBTWC.mjs.map → chunk-RWNL6APX.mjs.map} +1 -1
  14. package/dist/compiler-OXEXGIZG.mjs +9 -0
  15. package/dist/{compiler-B77PITYH.mjs.map → compiler-OXEXGIZG.mjs.map} +1 -1
  16. package/dist/index.cjs +224 -231
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.mjs +5 -5
  19. package/dist/{scaffoldCatalog-LQOUCJ4X.mjs → scaffoldCatalog-OIU4FEKJ.mjs} +3 -3
  20. package/dist/{scaffoldCatalog-LQOUCJ4X.mjs.map → scaffoldCatalog-OIU4FEKJ.mjs.map} +1 -1
  21. package/dist/{server-JXECWS4A.mjs → server-2DVBA35J.mjs} +4 -4
  22. package/dist/{server-JXECWS4A.mjs.map → server-2DVBA35J.mjs.map} +1 -1
  23. package/dist/web/playground/assets/main-2qCz3_0z.js +194 -0
  24. package/dist/web/playground/assets/main-BUcjhK2w.css +2 -0
  25. package/dist/web/playground/assets/{statementBuilderFlow-BL8OKlcb.js → statementBuilderFlow-DKhL-YLz.js} +2 -2
  26. package/dist/web/playground/assets/{vendor-CTANVdPW.js → vendor-DaJxNU_W.js} +19 -19
  27. package/dist/web/playground/assets/{vendor-codemirror-BlXDdJID.js → vendor-codemirror-BtDM22HA.js} +8 -8
  28. package/dist/web/playground/index.html +4 -4
  29. package/dist/web/playground/seed/core/chunks/canvas.a45c409e.json +1 -0
  30. package/dist/web/playground/seed/core/chunks/efforts.e68f2093.json +1 -0
  31. package/dist/web/playground/seed/core/chunks/equipment.c4fb1d64.json +1 -0
  32. package/dist/web/playground/seed/core/chunks/{template.e5e0e82d.json → template.0120276c.json} +1 -1
  33. package/dist/web/playground/seed/core/manifest.json +24 -10
  34. package/dist/web/playground/seed/core/report.html +15 -13
  35. package/dist/web/server/assets/main-BUcjhK2w.css +2 -0
  36. package/dist/web/server/assets/main-DxsZ-yOz.js +193 -0
  37. package/dist/web/server/assets/{statementBuilderFlow-xqsK_3T8.js → statementBuilderFlow-CI5vrd60.js} +2 -2
  38. package/dist/web/server/assets/{vendor-CTANVdPW.js → vendor-DaJxNU_W.js} +19 -19
  39. package/dist/web/server/assets/{vendor-codemirror-BlXDdJID.js → vendor-codemirror-BtDM22HA.js} +8 -8
  40. package/dist/web/server/index.html +4 -4
  41. package/dist/web/server/seed/core/chunks/canvas.a45c409e.json +1 -0
  42. package/dist/web/server/seed/core/chunks/efforts.e68f2093.json +1 -0
  43. package/dist/web/server/seed/core/chunks/equipment.c4fb1d64.json +1 -0
  44. package/dist/web/server/seed/core/chunks/{template.e5e0e82d.json → template.0120276c.json} +1 -1
  45. package/dist/web/server/seed/core/manifest.json +24 -10
  46. package/dist/web/server/seed/core/report.html +14 -12
  47. package/package.json +6 -6
  48. package/dist/chunk-CYKNTEGY.mjs.map +0 -1
  49. package/dist/chunk-GBBJBDLS.mjs.map +0 -1
  50. package/dist/chunk-NATJMTAW.mjs.map +0 -1
  51. package/dist/chunk-SQAI6B4P.mjs.map +0 -1
  52. package/dist/compiler-B77PITYH.mjs +0 -9
  53. package/dist/web/playground/assets/main-CFDrblxn.css +0 -2
  54. package/dist/web/playground/assets/main-OGIV1avF.js +0 -188
  55. package/dist/web/playground/seed/core/chunks/canvas.a2e32d8c.json +0 -1
  56. package/dist/web/server/assets/main-BdUrlkaF.js +0 -187
  57. package/dist/web/server/assets/main-CFDrblxn.css +0 -2
  58. package/dist/web/server/seed/core/chunks/canvas.a2e32d8c.json +0 -1
@@ -1,12 +1,12 @@
1
1
  import { createRequire } from 'module';
2
- import { compileSeedRow, SEED_SCHEMA, writeBuildReport } from './chunk-NATJMTAW.mjs';
3
- import { VERSION } from './chunk-SQAI6B4P.mjs';
4
- import { openCliDb, nodeFs, sqliteIndexStore, sqliteEffortStore, sqliteBlockStore, sqliteNoteStore, sqliteEventStore, getNoteBundle, getSessionBundle, getEffortBySlug, listTagsByType, nodePath, loadSql, uuid5, CLI_UUID_NAMESPACE, nodeCrypto, stableNoteId, randomId } from './chunk-CYKNTEGY.mjs';
2
+ import { compileSeedRow, SEED_SCHEMA, writeBuildReport } from './chunk-CVFMFD7D.mjs';
3
+ import { VERSION } from './chunk-JUBKCRNV.mjs';
4
+ import { openCliDb, nodeFs, sqliteIndexStore, sqliteEffortStore, sqliteBlockStore, sqliteNoteStore, sqliteEventStore, getNoteBundle, getSessionBundle, getEffortBySlug, getEquipmentBySlug, listTagsByType, nodePath, loadSql, uuid5, CLI_UUID_NAMESPACE, nodeCrypto, stableNoteId, randomId } from './chunk-IWT7U3WX.mjs';
5
5
  import { __require } from './chunk-6L5ZDZJ7.mjs';
6
- import { createParser, frozenNow, createCompiler, createMockClock, RuntimeStack, EventBus, ScriptRuntime, createAnalyticsEngineForBlock, StartSessionAction, NextEvent, toStoredOutputStatement, bundledEfforts, parseScript } from '@bitcobblers/wod-wiki-lang';
7
- import { buildStatementTree, createIRFile, registerLanguagePack, extractNoteIdentity, extractTypedTags, composeNoteMarkdown, sessionToCsv, effortToMarkdown, equipmentToCsv, markdownToEffort, csvToEquipmentLabels, csvToSessionRows, isIRFile, inMemoryEventStore, readFrontmatterMeta, assertSeedManifest, seedMetaKey, SEED_SCHEMA as SEED_SCHEMA$1, emptySeedMeta, CANVAS_CHUNK_ID, assertSeedRows, seedNoteId, applySeedChunk } from '@bitcobblers/wod-wiki-engine';
6
+ import { createParser, frozenNow, createCompiler, createMockClock, RuntimeStack, EventBus, ScriptRuntime, createAnalyticsEngineForBlock, StartSessionAction, NextEvent, toStoredOutputStatement, bundledEfforts, parseEffortFile, parseEquipmentFile, createReferenceIndex, parseScript, extractStatementRefs } from '@bitcobblers/wod-wiki-lang';
7
+ import { buildStatementTree, createIRFile, registerLanguagePack, extractNoteIdentity, extractTypedTags, composeNoteMarkdown, sessionToCsv, effortToMarkdown, equipmentToMarkdown, equipmentToCsv, csvToEquipmentLabels, csvToSessionRows, isIRFile, inMemoryEventStore, readFrontmatterMeta, assertSeedManifest, seedMetaKey, SEED_SCHEMA as SEED_SCHEMA$1, emptySeedMeta, CANVAS_CHUNK_ID, assertSeedRows, seedNoteId, applySeedChunk } from '@bitcobblers/wod-wiki-engine';
8
8
  import { toEventRows, toSummaryEventRows, parseQuery, QueryService, isPipelineQuery, isFindQuery, catalogOfItem } from '@bitcobblers/wod-wiki-wql';
9
- import { validateNoteBlocks, parseDocumentSections, blockContentId, reconcileNoteBlocks, KNOWN_SECTION_WIDGETS } from '@bitcobblers/wod-wiki-core';
9
+ import { validateNoteBlocks, parseDocumentSections, blockContentId, reconcileNoteBlocks, KNOWN_SECTION_WIDGETS, MetricType } from '@bitcobblers/wod-wiki-core';
10
10
  import { rowsEqual } from '@bitcobblers/wod-wiki-storage';
11
11
 
12
12
  if (typeof globalThis.require === 'undefined') {
@@ -924,23 +924,7 @@ ${escapeCsvField(data.parsed.metric)},${data.scalar},${escapeCsvField(data.unit
924
924
  return lines.join("\n");
925
925
  }
926
926
  var registeredWidgets = KNOWN_SECTION_WIDGETS;
927
- var saveStores = ["notes", "block_revisions", "block_index", "block_efforts", "tags", "note_tags", "sessions"];
928
- function extractEffortSlugs(statements) {
929
- const slugs = /* @__PURE__ */ new Set();
930
- for (const statement of statements) {
931
- if (statement.exerciseId) {
932
- slugs.add(statement.exerciseId);
933
- } else {
934
- const effortMetric = statement.metrics?.getMetric?.("effort");
935
- const effort = effortMetric && "effort" in effortMetric ? effortMetric.effort : void 0;
936
- if (typeof effort === "string") {
937
- const slug = effort.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
938
- if (slug) slugs.add(slug);
939
- }
940
- }
941
- }
942
- return [...slugs];
943
- }
927
+ var saveStores = ["notes", "block_revisions", "block_index", "block_efforts", "block_equipment", "efforts", "equipment", "tags", "note_tags", "sessions"];
944
928
  function titleFromLabel(sourceLabel) {
945
929
  if (!sourceLabel || sourceLabel === "-") return "stdin";
946
930
  const stem = sourceLabel.split("/").pop() ?? sourceLabel;
@@ -1012,9 +996,19 @@ async function saveSource(db, options, startTime) {
1012
996
  };
1013
997
  const priorRows = await tx.readonly("block_index").getAllFromIndex("by-note", noteId);
1014
998
  const priorEfforts = await tx.readonly("block_efforts").getAllFromIndex("by-note", noteId);
999
+ const priorEquipment = await tx.readonly("block_equipment").getAllFromIndex("by-note", noteId);
1000
+ const storedEfforts = await tx.readonly("efforts").getAll();
1001
+ const effortsBySlug = /* @__PURE__ */ new Map();
1002
+ for (const effort of bundledEfforts) effortsBySlug.set(effort.slug, effort);
1003
+ for (const effort of storedEfforts) effortsBySlug.set(effort.slug, effort);
1004
+ const referenceIndex = createReferenceIndex({
1005
+ efforts: [...effortsBySlug.values()],
1006
+ equipment: await tx.readonly("equipment").getAll()
1007
+ });
1015
1008
  const priorById = new Map(priorRows.map((row) => [row.id, row]));
1016
1009
  const nextRows = [];
1017
1010
  const nextEfforts = [];
1011
+ const nextEquipment = [];
1018
1012
  for (const [position, block] of Object.values(blocks).sort((a, b) => a.from - b.from).entries()) {
1019
1013
  const id = `${noteId}:${block.id}`;
1020
1014
  const prior = priorById.get(id);
@@ -1040,7 +1034,20 @@ async function saveSource(db, options, startTime) {
1040
1034
  ...note.sourceId ? { sourceId: note.sourceId } : {}
1041
1035
  });
1042
1036
  if (block.kind === "wod") {
1043
- for (const effortSlug of extractEffortSlugs(parseScript(body, { sport: block.sport, dialect: block.dialect }).statements)) {
1037
+ const statements = parseScript(body, { sport: block.sport, dialect: block.dialect, references: referenceIndex }).statements;
1038
+ const refs = extractStatementRefs(statements);
1039
+ const effortSlugs = new Set(refs.efforts);
1040
+ if (effortSlugs.size === 0) {
1041
+ for (const s of statements) {
1042
+ const m = s.metrics?.getMetric?.(MetricType.Effort);
1043
+ const val = typeof m?.value === "string" ? m.value : m && "effort" in m ? String(m.effort) : "";
1044
+ const slug = val.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
1045
+ if (slug && !["rest", "amrap", "emom", "tabata", "for-time"].includes(slug)) {
1046
+ effortSlugs.add(slug);
1047
+ }
1048
+ }
1049
+ }
1050
+ for (const effortSlug of effortSlugs) {
1044
1051
  const effortId = `${noteId}:${block.id}:${effortSlug}`;
1045
1052
  const previous = priorEfforts.find((row) => row.id === effortId);
1046
1053
  nextEfforts.push({
@@ -1053,12 +1060,26 @@ async function saveSource(db, options, startTime) {
1053
1060
  createdAt: previous?.createdAt ?? now
1054
1061
  });
1055
1062
  }
1063
+ for (const equipmentSlug of refs.equipment) {
1064
+ const equipmentId = `${noteId}:${block.id}:${equipmentSlug}`;
1065
+ const previous = priorEquipment.find((row) => row.id === equipmentId);
1066
+ nextEquipment.push({
1067
+ ...previous,
1068
+ id: equipmentId,
1069
+ noteId,
1070
+ blockId: block.id,
1071
+ blockContentId: fingerprint,
1072
+ equipmentSlug,
1073
+ createdAt: previous?.createdAt ?? now
1074
+ });
1075
+ }
1056
1076
  }
1057
1077
  }
1058
1078
  if (!rowsEqual(existing, note)) await tx.readwrite("notes").put(note);
1059
1079
  if (revisions.length) await tx.readwrite("block_revisions").putMany(revisions);
1060
1080
  await diffProjection(tx, "block_index", priorRows, nextRows);
1061
1081
  await diffProjection(tx, "block_efforts", priorEfforts, nextEfforts);
1082
+ await diffProjection(tx, "block_equipment", priorEquipment, nextEquipment);
1062
1083
  const tags = await saveTags(tx, noteId, options.tags, now);
1063
1084
  let session;
1064
1085
  let revision;
@@ -1094,6 +1115,7 @@ async function diffProjection(tx, store, previous, next) {
1094
1115
  if (!rowsEqual(old.get(row.id), row)) {
1095
1116
  if (store === "block_index" && "blockVersion" in row) await tx.readwrite("block_index").put(row);
1096
1117
  if (store === "block_efforts" && "effortSlug" in row) await tx.readwrite("block_efforts").put(row);
1118
+ if (store === "block_equipment" && "equipmentSlug" in row) await tx.readwrite("block_equipment").put(row);
1097
1119
  }
1098
1120
  }
1099
1121
  }
@@ -1185,6 +1207,12 @@ async function persistEffort(db, effort) {
1185
1207
  await sql.putRow(tx, sql.storeDefinition("efforts"), effort);
1186
1208
  });
1187
1209
  }
1210
+ async function persistEquipment(db, equipment) {
1211
+ const sql = await loadSql();
1212
+ await db.db.transaction(async (tx) => {
1213
+ await sql.putRow(tx, sql.storeDefinition("equipment"), equipment);
1214
+ });
1215
+ }
1188
1216
  async function persistTypedTags(db, labels, type) {
1189
1217
  return db.storage.transaction(["tags"], "readwrite", async (tx) => {
1190
1218
  let added = 0;
@@ -1207,17 +1235,18 @@ async function importSeedDir(db, dir, sourceId) {
1207
1235
  const source = sourceId || path.basename(dir);
1208
1236
  const manifest = assertSeedManifest(JSON.parse(fs.readFileSync(path.resolve(dir, "manifest.json"), "utf-8")));
1209
1237
  const key = seedMetaKey(source);
1210
- let expected = await db.storage.readonly("meta").get(key);
1211
- if (expected && expected.schema !== SEED_SCHEMA$1) throw new Error("Incompatible seed checkpoint; recreate storage");
1238
+ const stored = await db.storage.readonly("meta").get(key);
1239
+ let expected = stored?.schema === SEED_SCHEMA$1 ? stored : void 0;
1212
1240
  let meta = expected ?? emptySeedMeta(key);
1213
1241
  if (manifest.version < meta.seedVersion) throw new Error("Seed manifest is older than stored checkpoint");
1214
- const summary = { sourceId: source, version: manifest.version, notes: 0, efforts: 0, blocks: 0, blockEfforts: 0, deleted: 0, skippedUserOwned: 0 };
1242
+ const summary = { sourceId: source, version: manifest.version, notes: 0, efforts: 0, equipment: 0, blocks: 0, blockEfforts: 0, deleted: 0, skippedUserOwned: 0 };
1215
1243
  const metadataChanged = manifest.version !== meta.seedVersion || manifest.builtAt !== meta.builtAt;
1216
1244
  const plan = manifest.chunks.filter((c) => metadataChanged || meta.chunks[c.id]?.sha256 !== c.sha256);
1217
1245
  plan.sort((a, b) => Number(b.id === CANVAS_CHUNK_ID) - Number(a.id === CANVAS_CHUNK_ID));
1218
1246
  const accumulate = (result) => {
1219
1247
  summary.notes += result.totalNotes;
1220
1248
  summary.efforts += result.totalEfforts;
1249
+ summary.equipment += result.totalEquipment;
1221
1250
  summary.blocks += result.totalBlocks;
1222
1251
  summary.deleted += result.deleted;
1223
1252
  summary.skippedUserOwned += result.skippedUserOwned;
@@ -1287,6 +1316,7 @@ async function publishCatalogSeed(db, options) {
1287
1316
  }
1288
1317
  const allIndexRows = await db.storage.readonly("block_index").getAll();
1289
1318
  const allEffortRows = await db.storage.readonly("block_efforts").getAll();
1319
+ const allEquipmentRows = await db.storage.readonly("block_equipment").getAll();
1290
1320
  const indexByNote = /* @__PURE__ */ new Map();
1291
1321
  for (const row of allIndexRows) {
1292
1322
  const list = indexByNote.get(row.noteId) ?? [];
@@ -1299,6 +1329,12 @@ async function publishCatalogSeed(db, options) {
1299
1329
  list.push(row);
1300
1330
  effortsByNote.set(row.noteId, list);
1301
1331
  }
1332
+ const equipmentByNote = /* @__PURE__ */ new Map();
1333
+ for (const row of allEquipmentRows) {
1334
+ const list = equipmentByNote.get(row.noteId) ?? [];
1335
+ list.push(row);
1336
+ equipmentByNote.set(row.noteId, list);
1337
+ }
1302
1338
  const outDir = path.resolve(process.cwd(), options.outDir);
1303
1339
  const chunksDir = path.join(outDir, "chunks");
1304
1340
  fs.mkdirSync(chunksDir, { recursive: true });
@@ -1313,6 +1349,7 @@ async function publishCatalogSeed(db, options) {
1313
1349
  const notePath = note.sourcePath ?? `markdown/collections/${catalogName}/${stem}.md`;
1314
1350
  const noteBlockIndex = indexByNote.get(note.id) ?? [];
1315
1351
  const noteBlockEfforts = effortsByNote.get(note.id) ?? [];
1352
+ const noteBlockEquipment = equipmentByNote.get(note.id) ?? [];
1316
1353
  const blockIndex = noteBlockIndex.length > 0 ? noteBlockIndex.map((b) => ({
1317
1354
  ...b,
1318
1355
  isStatic: true,
@@ -1332,12 +1369,18 @@ async function publishCatalogSeed(db, options) {
1332
1369
  isStatic: true,
1333
1370
  sourcePath: e.sourcePath ?? notePath
1334
1371
  }));
1372
+ const blockEquipment = noteBlockEquipment.map((e) => ({
1373
+ ...e,
1374
+ isStatic: true,
1375
+ sourcePath: e.sourcePath ?? notePath
1376
+ }));
1335
1377
  chunkRows.push({
1336
1378
  path: notePath,
1337
1379
  content: note.rawContent,
1338
1380
  blocks: note.blocks,
1339
1381
  blockIndex,
1340
- blockEfforts
1382
+ blockEfforts,
1383
+ blockEquipment
1341
1384
  });
1342
1385
  }
1343
1386
  const chunkId = `collection.${catalogName}`;
@@ -1806,7 +1849,7 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
1806
1849
  writeErr("[wod init-catalog] Error: Missing catalog name (a single new directory name)");
1807
1850
  return 1;
1808
1851
  }
1809
- const { scaffoldCatalog } = await import('./scaffoldCatalog-LQOUCJ4X.mjs');
1852
+ const { scaffoldCatalog } = await import('./scaffoldCatalog-OIU4FEKJ.mjs');
1810
1853
  try {
1811
1854
  const result = scaffoldCatalog(parsed.target);
1812
1855
  writeOut(`[wod init-catalog] Created ${result.dir} (${result.files.length} files)`);
@@ -2017,7 +2060,9 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
2017
2060
  writeErr(`[wod ${verb}] Effort not found in ${db.path}: ${id}`);
2018
2061
  return 1;
2019
2062
  }
2020
- const markdown = effortToMarkdown(effort);
2063
+ const ownerNoteId = typeof effort.ownerNoteId === "string" ? effort.ownerNoteId : `effort/${effort.slug}`;
2064
+ const owner = await db.storage.readonly("notes").get(ownerNoteId);
2065
+ const markdown = owner?.rawContent ?? effortToMarkdown(effort);
2021
2066
  const target = parsed.output && parsed.output !== "-" ? parsed.output : `${id}.md`;
2022
2067
  if (parsed.output === "-") {
2023
2068
  writeOut(markdown);
@@ -2026,15 +2071,29 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
2026
2071
  }
2027
2072
  writeOut(`[wod ${verb}] effort ${id} \u2192 ${target}`);
2028
2073
  } else {
2029
- const labels = (await listTagsByType(db.db, "equipment")).map((t) => t.label).sort();
2030
- const csv = equipmentToCsv(labels);
2031
- const target = parsed.output && parsed.output !== "-" ? parsed.output : "equipment.csv";
2032
- if (parsed.output === "-") {
2033
- writeOut(csv);
2074
+ const equipment = id ? await getEquipmentBySlug(db.db, targetId) : void 0;
2075
+ if (equipment) {
2076
+ const ownerNoteId = typeof equipment.ownerNoteId === "string" ? equipment.ownerNoteId : `equipment/${equipment.slug}`;
2077
+ const owner = await db.storage.readonly("notes").get(ownerNoteId);
2078
+ const markdown = owner?.rawContent ?? equipmentToMarkdown(equipment);
2079
+ const target = parsed.output && parsed.output !== "-" ? parsed.output : `${id}.md`;
2080
+ if (parsed.output === "-") {
2081
+ writeOut(markdown);
2082
+ } else {
2083
+ nodeFs().writeFileSync(target, markdown, "utf-8");
2084
+ }
2085
+ writeOut(`[wod ${verb}] equipment ${id} \u2192 ${target}`);
2034
2086
  } else {
2035
- nodeFs().writeFileSync(target, csv, "utf-8");
2087
+ const labels = (await listTagsByType(db.db, "equipment")).map((t) => t.label).sort();
2088
+ const csv = equipmentToCsv(labels);
2089
+ const target = parsed.output && parsed.output !== "-" ? parsed.output : "equipment.csv";
2090
+ if (parsed.output === "-") {
2091
+ writeOut(csv);
2092
+ } else {
2093
+ nodeFs().writeFileSync(target, csv, "utf-8");
2094
+ }
2095
+ writeOut(`[wod ${verb}] equipment \u2192 ${target} (${labels.length} labels)`);
2036
2096
  }
2037
- writeOut(`[wod ${verb}] equipment \u2192 ${target} (${labels.length} labels)`);
2038
2097
  }
2039
2098
  } finally {
2040
2099
  await db.close();
@@ -2076,7 +2135,7 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
2076
2135
  return 0;
2077
2136
  }
2078
2137
  if (kind === "effort") {
2079
- const effort = markdownToEffort(fs.readFileSync(file, "utf-8"));
2138
+ const effort = parseEffortFile(fs.readFileSync(file, "utf-8"));
2080
2139
  if (!effort) {
2081
2140
  writeErr(`[wod import] Unparseable effort file (need frontmatter id/slug/label + numeric baseAttributes.met): ${file}`);
2082
2141
  return 1;
@@ -2090,6 +2149,21 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
2090
2149
  }
2091
2150
  return 0;
2092
2151
  }
2152
+ if (kind === "equipment" && /\.md$/i.test(file)) {
2153
+ const equipment = parseEquipmentFile(fs.readFileSync(file, "utf-8"));
2154
+ if (!equipment) {
2155
+ writeErr(`[wod import] Unparseable equipment file (need frontmatter type: equipment + id/slug/label): ${file}`);
2156
+ return 1;
2157
+ }
2158
+ const db2 = await openCliDb(cliDb());
2159
+ try {
2160
+ await persistEquipment(db2, { ...equipment, registrySource: "user" });
2161
+ writeOut(`[wod import] equipment ${equipment.slug} \u2014 ${equipment.label} \u2192 ${db2.path}`);
2162
+ } finally {
2163
+ await db2.close();
2164
+ }
2165
+ return 0;
2166
+ }
2093
2167
  if (kind === "equipment") {
2094
2168
  const labels = csvToEquipmentLabels(fs.readFileSync(file, "utf-8"));
2095
2169
  if (labels.length === 0) {
@@ -2144,7 +2218,7 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
2144
2218
  writeErr(`[wod build] No markdown/ corpus under ${root} \u2014 run from the content repo root (or pass its directory).`);
2145
2219
  return 1;
2146
2220
  }
2147
- const { generateSeed } = await import('./compiler-B77PITYH.mjs');
2221
+ const { generateSeed } = await import('./compiler-OXEXGIZG.mjs');
2148
2222
  try {
2149
2223
  const result = generateSeed({
2150
2224
  corpusRoot: root,
@@ -2214,7 +2288,7 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
2214
2288
  }
2215
2289
  if (parsed.subcommand === "server" || parsed.subcommand === "serve" || parsed.subcommand === "playground") {
2216
2290
  const mode = parsed.subcommand === "playground" ? "playground" : "server";
2217
- const { runCliServer } = await import('./server-JXECWS4A.mjs');
2291
+ const { runCliServer } = await import('./server-2DVBA35J.mjs');
2218
2292
  const options = { env: cliEnv() };
2219
2293
  if (mode === "server") options.database = cliDb();
2220
2294
  if (parsed.host !== void 0) options.host = parsed.host;
@@ -2240,5 +2314,5 @@ async function cliMain(argv = process.argv.slice(2), io = {}) {
2240
2314
  }
2241
2315
 
2242
2316
  export { PackLoadError, ParseSyntaxError, WqlSyntaxError, cliMain, formatExecutionOutput, formatParseOutput, formatQueryOutput, loadCliEnvironment, loadLanguagePack, loadQueryData, parseCliArgs, readStdin, resolveDatabaseConfig, runExecution, runParse, runQueryCli };
2243
- //# sourceMappingURL=chunk-GBBJBDLS.mjs.map
2244
- //# sourceMappingURL=chunk-GBBJBDLS.mjs.map
2317
+ //# sourceMappingURL=chunk-HRFOKCYI.mjs.map
2318
+ //# sourceMappingURL=chunk-HRFOKCYI.mjs.map