Files
pad/cmd
xarmian 25a21184a2 feat(cli): add --schema flag to pad collection create (TASK-1334) (#482)
* feat(cli): add --schema flag to pad collection create (TASK-1334)

The existing --fields DSL (key:type[:options]) had no syntax for
terminal_options, default, required, computed, suffix, or relation
collection — every CLI-created collection lost those FieldDef
properties even though the model already supports them. Symptom from
BUG-1284: dashboard "active" counts treat published/archived items as
in-progress because the persisted schema has no terminal_options.

Adds a new --schema flag that accepts the full CollectionSchema JSON,
which captures every current and future FieldDef property automatically.
Three input modes:

  --schema '<json>'      inline literal (agent-natural; CLI is agent-first)
  --schema @./path.json  file path
  --schema -             stdin

--fields and --schema are mutually exclusive; --fields keeps working
unchanged for backward compat (no deprecation).

Refactors the inline parser into three testable helpers in main.go:
collectionSchemaJSONFromFlags (orchestrator), readSchemaInputBytes
(input resolver), and parseFieldsDSL (legacy DSL parser preserving the
"first status select gets required+default" heuristic).

Tests: 9 table-style cases in collection_create_schema_test.go covering
all three input modes, the mutually-exclusive guard, malformed JSON,
missing file, fallthrough-to-DSL, both-empty, and a regression test
that verifies terminal_options + computed + suffix + relation.collection
all round-trip through --schema.

Parent: PLAN-1333.

* fix(cli): backfill missing labels in --schema fields per Codex review (round 2)

Codex flagged that the --schema example omitted "label", which the
parser preserved as label:"" — agents constructing JSON could create
collections that render blank field headers in the web UI.

Fix: after unmarshaling --schema input, backfill any FieldDef with an
empty Label using the same Title-Case-of-key heuristic the legacy
--fields DSL applies (e.g. "due_date" → "Due Date"). Explicit labels
are preserved.

Also updated the help-text example to include "label" on the status
field so the canonical shape is visible, plus a tip line documenting
the auto-fill behavior so users know it's safe to omit labels.

Test: TestCollectionSchemaJSONFromFlags_BackfillsMissingLabels covers
auto-fill, multi-word key normalization, and the explicit-label-not-
clobbered case.

Parent: PLAN-1333 / TASK-1334.
2026-05-10 21:21:43 -04:00
..