markform 0.1.27 → 0.1.29

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.
@@ -415,8 +415,13 @@ Structured tabular data with typed columns. Uses standard markdown table syntax.
415
415
  | `columnIds` | string[] | Yes | Array of snake_case column identifiers |
416
416
  | `columnLabels` | string[] | No | Display labels (defaults to header row) |
417
417
  | `columnTypes` | (string \| object)[] | No | Column types with optional constraints (defaults to all `string`) |
418
- | `minRows` | number | No | Minimum row count (default: 0) |
419
- | `maxRows` | number | No | Maximum row count (default: unlimited) |
418
+ | `minRows` | number | No | Minimum number of non-empty rows (default: 0) |
419
+ | `maxRows` | number | No | Maximum number of non-empty rows (default: unlimited) |
420
+
421
+ **Empty row handling:** Fully-empty rows (where every cell is empty or skipped) are
422
+ silently dropped during normalization.
423
+ They are never counted toward `minRows`/`maxRows` and do not appear in parsed output.
424
+ A row with at least one non-empty cell is retained.
420
425
 
421
426
  **Column types:**
422
427
 
@@ -445,6 +450,11 @@ Structured tabular data with typed columns. Uses standard markdown table syntax.
445
450
  | `min` / `max` | `number`, `year`, `date` | Value bounds |
446
451
  | `integer` | `number` | Must be integer |
447
452
 
453
+ **Row sparseness warning:** When a non-empty row has more than half of its cells empty
454
+ (e.g., 1 of 3 filled, or 1 of 4 filled; even splits like 2 of 4 don’t trigger this), a
455
+ validation warning is emitted.
456
+ This helps catch cases where an agent produced sparse or incomplete data.
457
+
448
458
  **Sentinel values in cells:** Use `%SKIP%` or `%ABORT%` with optional reasons:
449
459
 
450
460
  ```markdown
@@ -456,8 +456,13 @@ type.
456
456
  | `columnIds` | string[] | Yes | Array of snake_case column identifiers |
457
457
  | `columnLabels` | string[] | No | Array of display labels (backfilled from table header row if omitted) |
458
458
  | `columnTypes` | (string \| object)[] | No | Array of column types with optional constraints (defaults to all `'string'`) |
459
- | `minRows` | number | No | Minimum row count (default: 0) |
460
- | `maxRows` | number | No | Maximum row count (default: unlimited) |
459
+ | `minRows` | number | No | Minimum number of non-empty rows (default: 0) |
460
+ | `maxRows` | number | No | Maximum number of non-empty rows (default: unlimited) |
461
+
462
+ **Empty row handling:** Fully-empty rows (where every cell is empty or skipped) are
463
+ silently dropped during normalization.
464
+ They are never counted toward `minRows`/`maxRows` and do not appear in parsed output.
465
+ A row with at least one non-empty cell is retained.
461
466
 
462
467
  **Column types and validation:**
463
468
 
@@ -488,6 +493,11 @@ columnTypes=[{type: "string", required: true}, "number", "url"]
488
493
  | `max` | `number`, `year`, `date` | Maximum value |
489
494
  | `integer` | `number` | Value must be an integer |
490
495
 
496
+ **Row sparseness warning:** When a non-empty row has more than half of its cells empty
497
+ (e.g., 1 of 3 filled, or 1 of 4 filled; even splits like 2 of 4 don’t trigger this), a
498
+ validation warning is emitted.
499
+ This helps catch cases where an agent produced sparse or incomplete data.
500
+
491
501
  **Example with per-column constraints:**
492
502
  ```md
493
503
  {% field kind="table" id="priority_table" label="Ranked Insights"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markform",
3
- "version": "0.1.27",
3
+ "version": "0.1.29",
4
4
  "description": "Markdown forms for token-friendly workflows",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "author": "Joshua Levy",