@ai-matrx/records 0.71.3 → 0.72.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog — @ai-matrx/records
2
2
 
3
+ ## 0.72.0
4
+
5
+ `footprintOf` counts every agent an install copies — the template's own plus `extraAgents` — and the
6
+ workflows it creates (`TemplateFootprint.workflows`, new). The card line now says "4 agents · 1 workflow"
7
+ where it said "1 agent" for a template that made four.
8
+ Consumer action: a gallery that lists footprint parts may show `workflows` (matrx-frontend
9
+ `features/make/gallery/catalogue.ts` does). Declared cards on live were recomputed 2026-10-05.
10
+
11
+ ## 0.71.4
12
+
13
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
14
+ `git diff npm/records/v0.71.3..npm/records/v0.71.4 -- apps/shared/records`).
15
+ No source changes intended and no consumer action required.
16
+
3
17
  ## 0.71.3
4
18
 
5
19
  Automatic changed-only republish (docs/metadata drift since the last tag — see
@@ -8,10 +22,14 @@ No source changes intended and no consumer action required.
8
22
 
9
23
  ## 0.71.2
10
24
 
11
- The value-access refusal mirror (`core/validation.ts`) says what the live store says ("visibility and
12
- access belong to a Field and to a Record…"); this drift and a template name clash kept 0.71.1 off npm.
25
+ The value-access refusal mirror (`core/validation.ts`) and the live store (`custom.value_envelope_refusal`,
26
+ migration `t13_value_envelope_refusal_says_access`) both say "access belongs to a Field and to a Record…"
27
+ (T-13 wording); this drift and a template name clash kept 0.71.1 off npm.
13
28
  Template validator: cross-file text rule indexed once per template (library check ~36 s), a walk's
14
29
  submitted form row takes column defaults, a list link may hold no more records than the store allows.
30
+ G1 gate: a published template is held against the other published templates only, so a new draft that
31
+ reuses a published template's person or words is reported on the draft (and refused by
32
+ `templates:publish verify`) instead of turning the published one red and holding the release.
15
33
  No consumer action.
16
34
 
17
35
  ## 0.71.1
@@ -444,8 +444,10 @@ function footprintOf(spec) {
444
444
  ...dimensions ? [counted(dimensions, ["dimension set", "dimension sets"])] : [],
445
445
  ...TEMPLATE_EXTRA_KINDS.filter((k) => extras[k]).map((k) => counted(extras[k] ?? 0, EXTRA_WORDS[k]))
446
446
  ];
447
- const agents = spec.agent ? 1 : 0;
448
- if (agents) parts.push("1 agent");
447
+ const agents = (spec.agent ? 1 : 0) + (spec.extraAgents?.length ?? 0);
448
+ if (agents) parts.push(counted(agents, ["agent", "agents"]));
449
+ const workflows = spec.workflows?.length ?? 0;
450
+ if (workflows) parts.push(counted(workflows, ["workflow", "workflows"]));
449
451
  return {
450
452
  tables,
451
453
  sharedBlocks: spec.sharedBlocks?.length ?? 0,
@@ -454,6 +456,7 @@ function footprintOf(spec) {
454
456
  dimensions,
455
457
  extras,
456
458
  agents,
459
+ workflows,
457
460
  opensOutsideSignIn: (extras.portal ?? 0) > 0,
458
461
  line: parts.join(" \xB7 ")
459
462
  };
@@ -3597,6 +3600,10 @@ function validateTemplate(raw, options = {}) {
3597
3600
  const tz = raw.business?.timezone || "UTC";
3598
3601
  const tablesRaw = allTables(raw);
3599
3602
  const ISO_DAY = /\b\d{4}-\d{2}-\d{2}\b/;
3603
+ for (const table of tablesRaw) {
3604
+ const tf = table.fields.find((f) => f.key === table.titleField);
3605
+ if (tf && tf.default !== void 0) say(`tables (${table.token}).fields (${tf.key})`, `"${tf.label}" names each ${table.labelSingular.toLowerCase()}, so it takes no default; ask it on the form instead.`);
3606
+ }
3600
3607
  for (const table of tablesRaw) {
3601
3608
  for (const f of table.fields.filter((x) => isRelation(x) && x.parityType !== "attachment")) {
3602
3609
  const max = f.relationMax ?? (f.multi ? STORE_LIST_RELATION_MAX : 1);