softr-vibe-coding 2.4.1 → 2.4.2
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 +3 -0
- package/package.json +1 -1
- package/references/softr-mcp.md +21 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,9 @@ All notable changes to this skill are documented here. Versions follow [Semantic
|
|
|
4
4
|
|
|
5
5
|
Entries from 1.3.1 onward are generated automatically from git commit subjects between version bumps (see `.github/workflows/publish.yml`). Entries before 1.3.1 were backfilled by hand from the existing commit history.
|
|
6
6
|
|
|
7
|
+
## [2.4.2] - 2026-09-01
|
|
8
|
+
- softr-mcp.md: Workflows build/publish loop verified end to end 2026-09-01 (10 production workflows built live via MCP), replacing the not-yet-exercised hedge with build-loop findings: create_workflow instantiates an OLD trigger node version — immediately replace_trigger_node with the same type for current inputs (updateField on SOFTR_TABLES_RECORD_UPDATED only exists at v1.2.0); FILTER conditions set via update_node_inputs inputName "condition" ({operator, conditions} object stored on the outgoing path like the builder); LOOP_ACTION_GROUP loopVariables.items must be a plain array like $.records — [*] projections rejected by the validator, per-item refs inside the loop via {loopActionGroup.<id>:::loopVariables.items.fields.<fieldId>} (bracket form for digit-leading ids); update_node_inputs batches validate against STORED node state so dependent updates split into sequential calls; test-safety doctrine — record-write nodes REAL_ONLY (never test against production), SOFTR_SEND_EMAIL always mode:"mock", triggers/GET_RECORDS REAL_ONLY but read-only-safe. Plus: workspace update_field on SELECT silently drops added choices (echoes old set, no error) — add choices in Studio or let allowToAddNewChoice auto-create on first unknown-label write; joins the allowMultipleEntries silent-ignore
|
|
9
|
+
|
|
7
10
|
## [2.4.1] - 2026-09-01
|
|
8
11
|
- Reconcile the brand pipeline with building-design-md v2.0.0, which now drives dembrandt too. README migration note un-retires the companion: it runs the same dembrandt engine and layers voice & copy register, a resolved fonts block, logo assets, app-pattern scaffolds, and custom-code-header.html on an untouched dembrandt base. references/dembrandt.md legacy note becomes a companion-skill note (v2+ files read natively here; v1.x brand:/source:/extracted: files remain valid). SKILL.md Step 1 offers the fuller foundation alongside its quick raw generation and honours companion-v2 extra sections, preferring a fonts block over computed fontFamily values
|
|
9
12
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "softr-vibe-coding",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.2",
|
|
4
4
|
"description": "Claude Code skill for generating production-ready Softr Vibe Coding blocks (JSX). Installs into ~/.claude/skills/ and auto-updates on each Claude Code session.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"softr-vibe-coding": "./bin/cli.js"
|
package/references/softr-mcp.md
CHANGED
|
@@ -164,21 +164,26 @@ Known limits and behaviors (per official docs):
|
|
|
164
164
|
own copy and generates thumbnails, so backfilling images from another system is one write per record
|
|
165
165
|
with no upload step. Verified 2026-08-26 — see [../datasources/writing.md](../datasources/writing.md#attachment).
|
|
166
166
|
- **`update_field` silently ignores `allowMultipleEntries` nested inside `options`** — it is a TOP-LEVEL
|
|
167
|
-
field property; the call succeeds and changes nothing (verified 2026-08-26; the
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
field property; the call succeeds and changes nothing (verified 2026-08-26; the write surface was
|
|
168
|
+
re-touched live 2026-09-01 and the silent-no-op failure class held — see the SELECT-choices bullet
|
|
169
|
+
below). To flip a LINKED_RECORD
|
|
170
170
|
field between single and multi, `PUT` it via the Tables API with `allowMultipleEntries` at top level —
|
|
171
171
|
and always echo `options.inverseLinkFieldId` in that PUT, because omitting it severs the inverse
|
|
172
172
|
pairing. Full write-up, including the silent on-write clobbering of single-valued link pairs and the
|
|
173
173
|
truthy-`[]` empty-link read shape:
|
|
174
174
|
[../datasources/writing.md](../datasources/writing.md#linked-record-write-traps-verified-live-2026-08-26).
|
|
175
|
+
- **`update_field` on a SELECT field silently drops added choices** — the call succeeds and echoes the
|
|
176
|
+
OLD choice set back, no error (verified live 2026-09-01; the second known silent no-op on this write
|
|
177
|
+
surface, joining the `allowMultipleEntries` finding above). New choices must be added in Studio —
|
|
178
|
+
or, when the field has `allowToAddNewChoice` enabled, the first record write with an unknown label
|
|
179
|
+
auto-creates the choice.
|
|
175
180
|
- Limits: 100 records per `create_records` call, 200 records per read (silently capped, not an error), 2 group-by fields in `aggregate_data`. For big tables prefer a filter or aggregate over paging.
|
|
176
181
|
|
|
177
182
|
Typical Vibe Coding uses: "list every field on `Wigs` with id, name, type, and dropdown options", "what's the option id for `Payment status` = 'Partially paid'?", "show 3 sample records so we know value shapes", "verify the field id in my `q.select()` exists". This eliminates the field-id-typo / wrong-option-uuid class of bugs entirely.
|
|
178
183
|
|
|
179
184
|
## Workflows
|
|
180
185
|
|
|
181
|
-
Softr Workflows are automations built from trigger + action nodes, and the MCP can build, wire, test, and publish them — a **26-tool suite** (roster-verified 2026-08-31;
|
|
186
|
+
Softr Workflows are automations built from trigger + action nodes, and the MCP can build, wire, test, and publish them — a **26-tool suite** (roster-verified 2026-08-31; the full build → wire → test → publish loop **exercised end to end 2026-09-01** — 10 production workflows built live through MCP; see the build-loop findings below):
|
|
182
187
|
|
|
183
188
|
| Group | Tools |
|
|
184
189
|
|---|---|
|
|
@@ -197,9 +202,20 @@ Softr Workflows are automations built from trigger + action nodes, and the MCP c
|
|
|
197
202
|
**Mechanics from the server's own instructions:**
|
|
198
203
|
|
|
199
204
|
- Node inputs can embed **references to another node's runtime output**, a loop's current item, or named date/time tokens.
|
|
200
|
-
- **Test-first is mandated:** every testable node needs a test run before its outputs become referenceable by downstream nodes. Each node carries a `testRunMode` — `REAL_ONLY`, `MOCK_ONLY`, or `MOCK_AND_REAL` — so some nodes can only be tested against real side effects while others mock.
|
|
205
|
+
- **Test-first is mandated:** every testable node needs a test run before its outputs become referenceable by downstream nodes. Each node carries a `testRunMode` — `REAL_ONLY`, `MOCK_ONLY`, or `MOCK_AND_REAL` — so some nodes can only be tested against real side effects while others mock. See the test-safety rules under build-loop findings below before testing anything against a production workspace.
|
|
201
206
|
- **Workflows are workspace-level, not part of an app**: `preview_app` / `publish_app` do not apply. Link a workflow as `https://studio.softr.io/workflow/{workflowId}`.
|
|
202
207
|
|
|
208
|
+
**Build-loop findings (verified live 2026-09-01, first end-to-end production build — 10 workflows):**
|
|
209
|
+
|
|
210
|
+
- **`create_workflow` instantiates an OLD version of the trigger node.** Immediately call `replace_trigger_node` with the **same trigger type** — the replacement lands at the current version with the current inputs. Example: `updateField` on `SOFTR_TABLES_RECORD_UPDATED` (fire only when a specific field changed) only exists at v1.2.0; the version `create_workflow` instantiates doesn't have it.
|
|
211
|
+
- **FILTER node conditions are set via `update_node_inputs` with inputName `"condition"`** — the value is an `{operator, conditions: [...]}` object. The condition is stored on the FILTER node's **outgoing path**, the same way the Studio builder wires it.
|
|
212
|
+
- **`LOOP_ACTION_GROUP`'s `loopVariables.items` must reference a plain array**, e.g. `$.records` — a `[*]` projection (e.g. `$.records[*].fields.X`) is rejected by the validator. Per-item references **inside** the loop use `{loopActionGroup.<id>:::loopVariables.items.fields.<fieldId>}` (use the bracket form for ids that start with a digit).
|
|
213
|
+
- **`update_node_inputs` batches validate against the STORED node state**, not the batch-in-progress — an update that depends on another update in the same batch fails validation. Split dependent updates into sequential calls.
|
|
214
|
+
- **Test-safety rules** (which `testRunMode` means what in practice):
|
|
215
|
+
- Record-**write** nodes (`SOFTR_TABLES_UPDATE_RECORD` etc.) are `REAL_ONLY` — **never test them against a production workspace**; the test performs the real write.
|
|
216
|
+
- `SOFTR_SEND_EMAIL` is `MOCK_AND_REAL` — **always pass `mode: "mock"`**.
|
|
217
|
+
- Triggers and `GET_RECORDS` are `REAL_ONLY` but read-only-safe; a record-updated / enters-view trigger test just samples an existing record.
|
|
218
|
+
|
|
203
219
|
**Why this matters to block work:** Softr Workflows are now the Softr-native answer to the "block writes to its own table, backend cascades the rest" pattern — for **Softr Database backends** what [airtable-automations.md](airtable-automations.md) is for Airtable backends. See the cross-table alternatives in [../datasources/writing.md](../datasources/writing.md#cross-table-operations).
|
|
204
220
|
|
|
205
221
|
## Per-application MCP servers
|