softr-vibe-coding 2.5.1 → 2.5.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/SKILL.md +5 -2
- package/package.json +1 -1
- package/references/anti-patterns.md +1 -1
- package/references/softr-mcp.md +23 -2
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.5.2] - 2026-09-09
|
|
8
|
+
- Permission finding is advisory, not a veto — report severity and leave the call to the builder
|
|
9
|
+
|
|
7
10
|
## [2.5.1] - 2026-09-09
|
|
8
11
|
- The Action-permission reset has a failure mode that leaves blocks publicly writable — verify, never assume
|
|
9
12
|
|
package/SKILL.md
CHANGED
|
@@ -555,8 +555,11 @@ Non-negotiable rules. Most are enforced by the Softr platform (compiler, validat
|
|
|
555
555
|
can itself fail with no fallback (see the array-argument quirk in
|
|
556
556
|
[references/softr-mcp.md](references/softr-mcp.md#the-array-argument-serialization-quirk-and-why-it-is-a-security-issue)).
|
|
557
557
|
A push that returns `errors: null` can still have left public write access on the block.
|
|
558
|
-
**If any action is still `ALL_USERS`,
|
|
559
|
-
in
|
|
558
|
+
**If any action is still `ALL_USERS`, report it WITH its severity and let the builder decide.**
|
|
559
|
+
Check the page's own VIEW permission first (`get_page_permissions`): a page gated to logged-in
|
|
560
|
+
users makes an open action housekeeping, a public page makes it a real hole. Surface the list
|
|
561
|
+
either way -- page, block, action type, data source -- and note that a human sets them on the
|
|
562
|
+
block's Actions tab. Do not unilaterally block a publish; it is not your app.
|
|
560
563
|
22. **Blocks cannot import each other -- cross-block consistency is discipline, not architecture [house]**
|
|
561
564
|
-- Every block compiles standalone. There is no shared module, no design-system import, nothing that
|
|
562
565
|
makes two blocks stay alike. Two blocks that must look the same WILL drift, and the drift usually
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "softr-vibe-coding",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.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"
|
|
@@ -39,7 +39,7 @@ Run through this catalog before delivering any block. Every row is a violation o
|
|
|
39
39
|
| Passing a data hook's options through a variable or wrapper function: `useRecords(buildOpts())` | **Fails to compile** — the options object must be an inline literal at the call site (verified live 2026-08-25; hit in production, fixed by making the wrapper take the hook's *result* instead). Share `q.select` mappings between hooks, never whole options objects |
|
|
40
40
|
| Tightening Actions-tab permissions before the block's final redeploy | Every code recompile **resets the auto-registered Actions to default permissions** (verified live 2026-08-25). Tighten permissions after the LAST redeploy, and re-check after any future one |
|
|
41
41
|
| Assuming a comment-only edit is "safe" and leaves Action permissions alone | There is no cosmetic-edit exemption. Any save recompiles, and every recompile rebuilds the Actions at default visibility — a `search_replace` changing nothing but a code comment resets them exactly like a rewrite (verified live 2026-09-09, on two blocks at once). Re-check after EVERY push, including cosmetic ones |
|
|
42
|
-
| Treating the permission-restore call as done because you issued it | Read the permissions back with `get_vibe_coding_block_settings` and confirm each one changed. `set_vibe_coding_block_action_visibility` can fail outright on the array-argument serialization quirk, and it has **no fallback** — the default for a `genericActions` ADD_RECORD is `ALL_USERS`, so a routine push silently leaves the block publicly writable while returning `errors: null`. Verified live 2026-09-09: four ADD_RECORD actions left open across two blocks.
|
|
42
|
+
| Treating the permission-restore call as done because you issued it | Read the permissions back with `get_vibe_coding_block_settings` and confirm each one changed. `set_vibe_coding_block_action_visibility` can fail outright on the array-argument serialization quirk, and it has **no fallback** — the default for a `genericActions` ADD_RECORD is `ALL_USERS`, so a routine push silently leaves the block publicly writable while returning `errors: null`. Verified live 2026-09-09: four ADD_RECORD actions left open across two blocks. Report the list with its severity — check the page's VIEW permission with `get_page_permissions`, since a logged-in-gated page makes this housekeeping while a public page makes it a real hole — and let the builder decide whether it holds their release. A human sets them on the block's Actions tab |
|
|
43
43
|
| Treating Studio's Actions tab as a separately-managed configuration to keep in sync with code | Actions auto-derive from your `useRecordCreate`/`useRecordUpdate`/`useRecordDelete` + `q.select` on every save. The Actions tab is a read-only inspector; there is no manual delete control. To change an Action, change the code |
|
|
44
44
|
| One alias in a write-side `q.select` referencing a renamed / non-existent Airtable column | Softr's Action parser silently rejects the **entire** create/update Action — not just the bad alias. Symptoms: Studio's Actions tab shows "No actions used in this block yet", `createRecord.enabled` / `updateRecord.enabled` stays `false`, `.mutate()` calls dispatch but resolve immediately to "not yet ready". Every OTHER field in the same `q.select()` is also lost, even the ones that map cleanly. Diagnostic: bisect the `q.select` — strip down to a known-good minimal set, confirm the Action appears in Studio, then add fields back in halves until it drops out. The culprit is in the last half added. Once narrowed to a single field, grep its name against the freshest Airtable schema export to catch the rename / trailing-space / case-mismatch. Verified 2026-05-21: a `"Photos"` column on Wigs was renamed to `"Before Photos"`, the helper that wrote `photos: "Photos"` had its entire Action disabled even though 11 other fields in the same `q.select` were fine. See [datasources/airtable.md](../datasources/airtable.md#maintainability-gotcha) |
|
|
45
45
|
|
package/references/softr-mcp.md
CHANGED
|
@@ -138,8 +138,29 @@ actions open across two blocks.
|
|
|
138
138
|
3. **Read the permissions back with `get_vibe_coding_block_settings` and confirm each one actually
|
|
139
139
|
changed.** A successful-looking sequence is not evidence; the failure is an argument rejection, so
|
|
140
140
|
the call errors rather than lying, but an agent that batches calls can easily miss which one failed.
|
|
141
|
-
4. If any action is still `ALL_USERS`, **
|
|
142
|
-
|
|
141
|
+
4. If any action is still `ALL_USERS`, **report it and let the builder decide.** Check the page's own
|
|
142
|
+
VIEW permission first with `get_page_permissions`, because that is what sets the severity:
|
|
143
|
+
- **Page VIEW is gated** (e.g. `LOGGED_IN_USERS`) — an anonymous visitor cannot load the page at
|
|
144
|
+
all, so exploiting the open action means calling its endpoint directly, and the realistic worst
|
|
145
|
+
case is junk records rather than data exposure or deletion. Housekeeping: worth fixing on the
|
|
146
|
+
next Studio pass, not worth holding a release for.
|
|
147
|
+
- **Page VIEW is `ALL_USERS`** — the action permission is the only gate left. That is a genuine
|
|
148
|
+
hole and deserves to be called one.
|
|
149
|
+
|
|
150
|
+
Report page, block, action type, data source and current group; say which of the two cases applies;
|
|
151
|
+
note that a human sets them on the block's Actions tab in Studio. Then stop — **do not unilaterally
|
|
152
|
+
block the publish.** It is not your app, and the person whose app it is needs the finding and the
|
|
153
|
+
severity, not a veto.
|
|
154
|
+
|
|
155
|
+
One caveat worth stating: page visibility and action permissions are *separate* gates, and whether
|
|
156
|
+
Softr enforces page VIEW on the action endpoint itself is unverified here. The reason to treat a
|
|
157
|
+
gated page as low-severity is the practical difficulty and low blast radius, not a proof that the
|
|
158
|
+
action is unreachable. Say that plainly rather than implying the action is safe.
|
|
159
|
+
|
|
160
|
+
**Calibration matters.** This guidance read "do not publish" in v2.5.1 and immediately fired at
|
|
161
|
+
maximum severity on a logged-in-gated app where the real exposure was junk records. A warning that
|
|
162
|
+
cannot distinguish housekeeping from a breach gets tuned out, and then it is worth nothing on the
|
|
163
|
+
day it matters.
|
|
143
164
|
|
|
144
165
|
Do not improvise around a rejection. `update_vibe_coding_block_settings` is not a substitute: its schema
|
|
145
166
|
is equally empty, it writes far more than one permission, and guessing its payload risks clobbering the
|