jorgex-stack 1.2.0 → 1.2.1
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/README.md +4 -4
- package/dist/cli.js +2 -2
- package/package.json +1 -1
- package/stack/skills/diagnose/SKILL.md +31 -8
- package/stack/skills/mcp-builder/LICENSE.txt +2 -2
- package/stack/skills/playwright-cli/SKILL.md +2 -2
- package/stack/skills/playwright-cli/references/test-generation.md +3 -3
- package/stack/skills/skill-creator/LICENSE.txt +2 -2
- package/stack/skills/supabase/SKILL.md +35 -9
- package/stack/skills/supabase-postgres-best-practices/SKILL.md +1 -1
- package/stack/skills/tdd/SKILL.md +4 -0
- package/stack/skills/to-issues/SKILL.md +15 -1
- package/upstreams.json +19 -17
package/README.md
CHANGED
|
@@ -99,7 +99,7 @@ Programmatic mode does **not** provide:
|
|
|
99
99
|
|
|
100
100
|
Browser automation is opt-in and explicit. The legacy `agent-browser` integration has been removed; rely on the two surfaces below.
|
|
101
101
|
|
|
102
|
-
- **Playwright CLI** (recommended): `@playwright/cli@0.1.
|
|
102
|
+
- **Playwright CLI** (recommended): `@playwright/cli@0.1.18` plus a vendored skill that ships pinned with the stack. The skill is loaded on demand, contributes no permanent MCP schemas, and declares `allowed-tools: Bash(playwright-cli:*)` only (no `Bash(pnpm:*)`). This is the skill's declaration, not a security boundary: effective permissions still come from the adapter/runtime, and OpenCode/full-bash may expose broader Bash or other capabilities. See [docs/references/browser-automation.md](docs/references/browser-automation.md) for the full lifecycle, the security profile and troubleshooting.
|
|
103
103
|
- **Chrome DevTools MCP** (advanced diagnostics, opt-in): exposes ~29 tools and ~5,800–7,700 tokens of schemas in full mode. Disabled by default, selected per runtime, version-pinned, and launched with a fixed argv `pnpm dlx chrome-devtools-mcp@1.6.0 --isolated --redact-network-headers --no-performance-crux --no-usage-statistics`. `--isolated` starts Chrome with an ephemeral, isolated profile that is deleted when Chrome closes (no persistent dedicated profile, no shared cookies/extensions/sessions with your personal Chrome); `--redact-network-headers` redacts sensitive headers in captured network traffic, but not request/response bodies, which may contain tokens or PII. Avoid authenticated sessions or sensitive data, or disable network capture manually outside the stack when needed. `--no-performance-crux` disables CrUX reporting; `--no-usage-statistics` disables telemetry. `--slim` and Playwright MCP are intentionally excluded.
|
|
104
104
|
|
|
105
105
|
Setup that respects the zero-secrets, pnpm-only and explicit-consent rules:
|
|
@@ -116,13 +116,13 @@ pnpm dlx jorgex-stack install --devtools
|
|
|
116
116
|
pnpm dlx jorgex-stack install --no-devtools
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
Under the hood, `--playwright` runs two `pnpm` argv-only plans back to back: `pnpm add --global @playwright/cli@0.1.
|
|
119
|
+
Under the hood, `--playwright` runs two `pnpm` argv-only plans back to back: `pnpm add --global @playwright/cli@0.1.18` (the package) and then `pnpm dlx @playwright/cli@0.1.18 install-browser` (the browser binary cache). Removal is `pnpm remove --global @playwright/cli` (no version suffix). If installation fails, the error identifies the failed phase — global package, browser download, or preference persistence — and recommends `jorgex-stack install --playwright`; the preference is not marked enabled unless the complete plan succeeds.
|
|
120
120
|
|
|
121
121
|
Daily operation:
|
|
122
122
|
|
|
123
123
|
- `sync` reconciles configuration without installing global tools or browsers; if Playwright is enabled but the binary or browser cache is `missing`, it warns and points to `install --playwright`; if the cache is `unreadable`, the warning includes its resolved path and filesystem error code. The cache probe retains the path for both states and an error code when the filesystem provides one. Under `--target-dir`, `sync`/`install`/`uninstall` never read or write the real browser state (`~/.jorgex-stack/playwright-cli.json` and `~/.jorgex-stack/devtools-mcp.json` are untouched, `detectPlaywrightCli()` is not called, no MCP ownership is persisted).
|
|
124
124
|
- `doctor` reports the Playwright CLI state (`disabled`, `healthy`, `missing:package`, `missing:browser`, `unreadable`, `broken`, `outdated`) without opening sites or repairing state. An `unreadable` browser cache includes its exact path and filesystem error code so permissions or another local cause can be investigated. If either preference file is corrupt, doctor prints the exact path and the remedy (`Corrige o borra ese archivo antes de reintentar`) before any other browser check; in that case `install`/`uninstall`/`update`/`update --check` will abort with exit 1 until the file is fixed, so the corruption cannot be reconciled destructively.
|
|
125
|
-
- `update --check` only inspects Playwright CLI when its preference is `enabled` (a binary appearing in `PATH` is not consent). It compares the installed version against the approved pin `0.1.
|
|
125
|
+
- `update --check` only inspects Playwright CLI when its preference is `enabled` (a binary appearing in `PATH` is not consent). It compares the installed version against the approved pin `0.1.18` — it does not consult npm latest, and a Playwright CLI binary-only update does not require `sync` afterwards.
|
|
126
126
|
- `uninstall` preserves the global `@playwright/cli` package and all browser data by default; `--remove-playwright` removes the package only (never the browser cache, profiles, cookies, storage state, traces, screenshots or videos). If `pnpm remove --global @playwright/cli` exits non-zero, `uninstall` reports the failure instead of a success outro. For DevTools MCP, ownership is released only after the corresponding unmerge is applied; if no unmerge action is written, the ownership marker is preserved for a later retry.
|
|
127
127
|
- `install`/`sync` also inject (and `disable`/`uninstall` remove) a marked section `<!-- jorgex:browser -->` in `AGENTS.md` (OpenCode, Codex) or `CLAUDE.md` (Claude Code): the section only contains Playwright guidance when its setup succeeded, and DevTools guidance only in the runtimes that selected it; the rest of the file outside the markers is preserved. `--target-dir` never reads the real preferences, so by default no section is emitted in target-dir runs — but explicit flags like `--devtools` simulate the MCP entry (and the corresponding DevTools block of the section) inside the temp target without touching the real global state, and `install --dry-run --playwright` projects the Playwright section into the plan preview without installing anything. If the post-setup reconciliation of the system prompt leaves the section in a partial state, the CLI exits non-zero and recommends `jorgex-stack sync` to repair it; the package and the preference stay installed. See [docs/references/browser-automation.md](docs/references/browser-automation.md) §2.7 for the full lifecycle.
|
|
128
128
|
|
|
@@ -132,7 +132,7 @@ Daily operation:
|
|
|
132
132
|
|
|
133
133
|
1. **Stack** (jorgex-stack): detects whether it is a git clone or a global install, then offers an update with confirmation.
|
|
134
134
|
2. **Engram** (binary): detects the installed version and offers an update through the **native channel** (brew -> `go install` -> release URL). Nothing needs to be stopped: as in upstream macOS/Linux, live processes keep using the old version until clients restart; on Windows, the in-use `.exe` is rotated by rename before installation. **Automatic DB backup before updating**. The database and memories are never touched.
|
|
135
|
-
3. **Playwright CLI** (only when explicitly enabled): compares the detected binary with the approved bundle pin and offers to realign it with explicit confirmation. The realignment re-applies **both** plans — `pnpm add --global @playwright/cli@0.1.
|
|
135
|
+
3. **Playwright CLI** (only when explicitly enabled): compares the detected binary with the approved bundle pin and offers to realign it with explicit confirmation. The realignment re-applies **both** plans — `pnpm add --global @playwright/cli@0.1.18` (package) and `pnpm dlx @playwright/cli@0.1.18 install-browser` (browser cache) — and fails closed if either step returns non-zero. The error identifies whether the package-update or browser-download phase failed and recommends `jorgex-stack install --playwright` to retry both; a Playwright update does not require `sync`.
|
|
136
136
|
4. **Vendored skills** (maintainer only): third-party skills ship **pinned** with the stack version, so the installed package never reaches out to their upstreams. Only when running from a git clone (`pnpm cli update`) does `update` scan the upstreams in `upstreams.json`, download to a temp directory, **show a mandatory diff**, and ask for confirmation. A moved upstream is only a candidate until that review is accepted and a deliberate re-pin is made for a future release; it is never treated as an accepted official update automatically. Skills with local changes (`modified: true`) warn and require double confirmation.
|
|
137
137
|
|
|
138
138
|
Usage:
|
package/dist/cli.js
CHANGED
|
@@ -1654,7 +1654,7 @@ import { execFileSync as execFileSync2 } from "child_process";
|
|
|
1654
1654
|
var PLAYWRIGHT_CLI = {
|
|
1655
1655
|
packageName: "@playwright/cli",
|
|
1656
1656
|
bin: "playwright-cli",
|
|
1657
|
-
version: "0.1.
|
|
1657
|
+
version: "0.1.18",
|
|
1658
1658
|
browserInstallAction: "install-browser"
|
|
1659
1659
|
};
|
|
1660
1660
|
var PNPM_GLOBAL_BIN_REMEDY = "Ejecuta 'pnpm setup', abre una terminal nueva y reintenta. El stack no modifica PNPM_HOME ni PATH.";
|
|
@@ -3286,7 +3286,7 @@ async function runInteractiveUpdate(localVersion, yes, dryRun = false, includeBr
|
|
|
3286
3286
|
updateItems.push({
|
|
3287
3287
|
value: "playwright-cli",
|
|
3288
3288
|
label: `Playwright CLI: ${current} \u2192 pin aprobado`,
|
|
3289
|
-
hint: "pnpm add --global @playwright/cli@0.1.
|
|
3289
|
+
hint: "pnpm add --global @playwright/cli@0.1.18"
|
|
3290
3290
|
});
|
|
3291
3291
|
}
|
|
3292
3292
|
}
|
package/package.json
CHANGED
|
@@ -9,9 +9,15 @@ A discipline for hard bugs. Skip phases only when explicitly justified.
|
|
|
9
9
|
|
|
10
10
|
When exploring the codebase, use the project's domain glossary to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.
|
|
11
11
|
|
|
12
|
+
## Redact
|
|
13
|
+
|
|
14
|
+
This skill has you show commands, outputs and captured artifacts. **Redact every secret first**: write `<REDACTED>` in its place. Build loops against env vars, so the credential stays in the environment rather than in what you show. Captured artifacts can carry auth headers: quote only the lines that carry the signal.
|
|
15
|
+
|
|
16
|
+
If the redacted output is not enough to diagnose the bug, say so and ask the user.
|
|
17
|
+
|
|
12
18
|
## Phase 1 — Build a feedback loop
|
|
13
19
|
|
|
14
|
-
**This is the skill.** Everything else is mechanical. If you have a fast, deterministic, agent-runnable pass/fail signal for the bug
|
|
20
|
+
**This is the skill.** Everything else is mechanical. If you have a **tight**, fast, deterministic, agent-runnable pass/fail signal for the bug — one that goes red on _this_ bug — you will find the cause; bisection, hypothesis-testing, and instrumentation all just consume that signal. If you don't have one, no amount of staring at code will save you.
|
|
15
21
|
|
|
16
22
|
Spend disproportionate effort here. **Be aggressive. Be creative. Refuse to give up.**
|
|
17
23
|
|
|
@@ -30,15 +36,15 @@ Spend disproportionate effort here. **Be aggressive. Be creative. Refuse to give
|
|
|
30
36
|
|
|
31
37
|
Build the right feedback loop, and the bug is 90% fixed.
|
|
32
38
|
|
|
33
|
-
###
|
|
39
|
+
### Tighten the loop
|
|
34
40
|
|
|
35
|
-
Treat the loop as a product. Once you have _a_ loop,
|
|
41
|
+
Treat the loop as a product. Once you have _a_ loop, **tighten it**:
|
|
36
42
|
|
|
37
43
|
- Can I make it faster? (Cache setup, skip unrelated init, narrow the test scope.)
|
|
38
44
|
- Can I make the signal sharper? (Assert on the specific symptom, not "didn't crash".)
|
|
39
45
|
- Can I make it more deterministic? (Pin time, seed RNG, isolate filesystem, freeze network.)
|
|
40
46
|
|
|
41
|
-
A 30-second flaky loop is barely better than no loop
|
|
47
|
+
A 30-second flaky loop is barely better than no loop; a 2-second deterministic one is tight, a debugging superpower.
|
|
42
48
|
|
|
43
49
|
### Non-deterministic bugs
|
|
44
50
|
|
|
@@ -46,11 +52,20 @@ The goal is not a clean repro but a **higher reproduction rate**. Loop the trigg
|
|
|
46
52
|
|
|
47
53
|
### When you genuinely cannot build a loop
|
|
48
54
|
|
|
49
|
-
Stop and say so explicitly. List what you tried. Ask the user for: (a) access to whatever environment reproduces it, (b) a captured artifact (HAR file, log dump, core dump, screen recording with timestamps), or (c) permission to add temporary production instrumentation. Do **not** proceed to hypothesise without a loop.
|
|
55
|
+
Stop and say so explicitly. List what you tried. Ask the user for: (a) access to whatever environment reproduces it, (b) a **redacted** captured artifact (HAR file, log dump, core dump, screen recording with timestamps), or (c) permission to add temporary production instrumentation. Do **not** proceed to hypothesise without a loop.
|
|
56
|
+
|
|
57
|
+
### Completion criterion: a tight loop that goes red
|
|
58
|
+
|
|
59
|
+
Phase 1 is done when the loop is **tight** and **red-capable**: you can name **one command** (a script path, a test invocation, a curl) that you have **already run at least once** (show the invocation and its output, redacted), and that is:
|
|
50
60
|
|
|
51
|
-
|
|
61
|
+
- [ ] **Red-capable**: it drives the actual bug code path and asserts the **user's exact symptom**, so it can go red on this bug and green once fixed. Not "runs without erroring"; it must be able to **catch this specific bug**.
|
|
62
|
+
- [ ] **Deterministic**: same verdict every run (flaky bugs: a pinned, high reproduction rate, per above).
|
|
63
|
+
- [ ] **Fast**: seconds, not minutes.
|
|
64
|
+
- [ ] **Agent-runnable**: you can run it unattended; a human in the loop only via `scripts/hitl-loop.template.sh`.
|
|
52
65
|
|
|
53
|
-
|
|
66
|
+
If you catch yourself reading code to build a theory before this command exists, **stop: jumping straight to a hypothesis is the exact failure this skill prevents.** No red-capable command, no Phase 2.
|
|
67
|
+
|
|
68
|
+
## Phase 2 — Reproduce + minimise
|
|
54
69
|
|
|
55
70
|
Run the loop. Watch the bug appear.
|
|
56
71
|
|
|
@@ -60,7 +75,15 @@ Confirm:
|
|
|
60
75
|
- [ ] The failure is reproducible across multiple runs (or, for non-deterministic bugs, reproducible at a high enough rate to debug against).
|
|
61
76
|
- [ ] You have captured the exact symptom (error message, wrong output, slow timing) so later phases can verify the fix actually addresses it.
|
|
62
77
|
|
|
63
|
-
|
|
78
|
+
### Minimise
|
|
79
|
+
|
|
80
|
+
Once it's red, shrink the repro to the **smallest scenario that still goes red**. Cut inputs, callers, config, data, and steps **one at a time**, re-running the loop after each cut, and keep only what's load-bearing for the failure.
|
|
81
|
+
|
|
82
|
+
Why bother: a minimal repro shrinks the hypothesis space in Phase 3 (fewer moving parts left to suspect) and becomes the clean regression test in Phase 5.
|
|
83
|
+
|
|
84
|
+
Done when **every remaining element is load-bearing**: removing any one of them makes the loop go green.
|
|
85
|
+
|
|
86
|
+
Do not proceed until you have reproduced **and minimised**.
|
|
64
87
|
|
|
65
88
|
## Phase 3 — Hypothesise
|
|
66
89
|
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
same "printed page" as the copyright notice for easier
|
|
188
188
|
identification within third-party archives.
|
|
189
189
|
|
|
190
|
-
Copyright
|
|
190
|
+
Copyright 2026 Anthropic, PBC.
|
|
191
191
|
|
|
192
192
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
193
|
you may not use this file except in compliance with the License.
|
|
@@ -199,4 +199,4 @@
|
|
|
199
199
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
200
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
201
|
See the License for the specific language governing permissions and
|
|
202
|
-
limitations under the License.
|
|
202
|
+
limitations under the License.
|
|
@@ -345,13 +345,13 @@ playwright-cli kill-all
|
|
|
345
345
|
If the global `playwright-cli` command is not available, use the pinned release with pnpm:
|
|
346
346
|
|
|
347
347
|
```bash
|
|
348
|
-
pnpm dlx @playwright/cli@0.1.
|
|
348
|
+
pnpm dlx @playwright/cli@0.1.18 --version
|
|
349
349
|
```
|
|
350
350
|
|
|
351
351
|
For a global command, install the pinned release:
|
|
352
352
|
|
|
353
353
|
```bash
|
|
354
|
-
pnpm add --global @playwright/cli@0.1.
|
|
354
|
+
pnpm add --global @playwright/cli@0.1.18
|
|
355
355
|
```
|
|
356
356
|
|
|
357
357
|
## Example: Form submission
|
|
@@ -289,12 +289,12 @@ Goal: take a spec file and produce Playwright test files. Optionally update the
|
|
|
289
289
|
|
|
290
290
|
### 2.2 Generate one scenario
|
|
291
291
|
|
|
292
|
-
For each target scenario, in sequence
|
|
292
|
+
For each target scenario, run the CLI actions in sequence within its own seed session. Never run actions in parallel within one attached session; a seed session is single-threaded.
|
|
293
293
|
|
|
294
294
|
```bash
|
|
295
295
|
PLAYWRIGHT_HTML_OPEN=never pnpm exec playwright test <seed-file> --debug=cli # background
|
|
296
296
|
playwright-cli attach tw-XXXX
|
|
297
|
-
|
|
297
|
+
playwright-cli resume
|
|
298
298
|
```
|
|
299
299
|
|
|
300
300
|
**Do not** just open the app url with playwright-cli, always go through the test to capture any custom setup done there.
|
|
@@ -348,7 +348,7 @@ Rules:
|
|
|
348
348
|
|
|
349
349
|
### 2.3 Generate multiple scenarios
|
|
350
350
|
|
|
351
|
-
Loop 2.2 over the targeted scenarios
|
|
351
|
+
Loop 2.2 over the targeted scenarios, restarting the seed between each so every test starts from a clean page. Scenarios may run in parallel only when each has its own seed process and unique generated session name; never share a session or attach two scenario flows to the same seed. When isolation is uncertain, run scenarios serially. Stop every test run before moving on.
|
|
352
352
|
|
|
353
353
|
### 2.4 Run generated tests
|
|
354
354
|
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
same "printed page" as the copyright notice for easier
|
|
188
188
|
identification within third-party archives.
|
|
189
189
|
|
|
190
|
-
Copyright
|
|
190
|
+
Copyright 2026 Anthropic, PBC.
|
|
191
191
|
|
|
192
192
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
193
|
you may not use this file except in compliance with the License.
|
|
@@ -199,4 +199,4 @@
|
|
|
199
199
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
200
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
201
|
See the License for the specific language governing permissions and
|
|
202
|
-
limitations under the License.
|
|
202
|
+
limitations under the License.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: supabase
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use for any Supabase task: Database, Auth, Edge Functions, Realtime, Storage, Vectors, Cron, Queues, clients, CLI/MCP, schema/migrations/declarative schemas, RLS/security, debugging, errors, troubleshooting, or logs."
|
|
4
4
|
metadata:
|
|
5
5
|
author: supabase
|
|
6
6
|
version: "0.1.2"
|
|
@@ -88,7 +88,7 @@ supabase <group> <command> --help # Flags for a specific command
|
|
|
88
88
|
|
|
89
89
|
- `supabase db query` requires **CLI v2.79.0+** → use MCP `execute_sql` or `psql` as fallback
|
|
90
90
|
- `supabase db advisors` requires **CLI v2.81.3+** → use MCP `get_advisors` as fallback
|
|
91
|
-
-
|
|
91
|
+
- In imperative migration projects, create new hand-authored migration files with `supabase migration new <name>` first. Never invent a migration filename or rely on memory for the expected format. Declarative schema projects generate migrations from `supabase/schemas/`; see "Making and Committing Schema Changes" below.
|
|
92
92
|
|
|
93
93
|
**Version check and upgrade:** Run `supabase --version` to check. For CLI changelogs and version-specific features, consult the [CLI documentation](https://supabase.com/docs/reference/cli/introduction) or [GitHub releases](https://github.com/supabase/cli/releases).
|
|
94
94
|
|
|
@@ -118,16 +118,42 @@ Before implementing any Supabase feature, find the relevant documentation. Use t
|
|
|
118
118
|
|
|
119
119
|
## Making and Committing Schema Changes
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
Choose one project-level schema workflow before editing. Do not mix declarative schema files and hand-authored migrations for the same change.
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
### Option A: Declarative schemas
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
Use this when `supabase/schemas/` exists or `[db.migrations].schema_paths` is configured. The schema files are the source of truth; do not make the change directly in Studio, the SQL editor, or through `execute_sql`.
|
|
126
126
|
|
|
127
|
-
1.
|
|
128
|
-
2.
|
|
129
|
-
3.
|
|
130
|
-
4.
|
|
127
|
+
1. Edit the desired state in `supabase/schemas/`.
|
|
128
|
+
2. Generate a migration from that state → `supabase db diff -f <descriptive-name>`.
|
|
129
|
+
3. Review the generated migration for one incremental change and any destructive SQL.
|
|
130
|
+
4. Verify the full chain → `supabase db reset` (or apply pending migrations to a running local database with `supabase migration up`).
|
|
131
|
+
5. Commit the schema files and generated migration together.
|
|
132
|
+
|
|
133
|
+
`supabase db diff` does not read the live database. Changes made directly to a database are not captured by the declarative diff. DML and other documented schema-diff limitations belong in a versioned imperative migration instead. See the [Declarative database schemas guide](https://supabase.com/docs/guides/local-development/declarative-database-schemas).
|
|
134
|
+
|
|
135
|
+
### Option B: Imperative migrations
|
|
136
|
+
|
|
137
|
+
Use this when the project does not use declarative schemas.
|
|
138
|
+
|
|
139
|
+
1. Create the migration → `supabase migration new <descriptive-name>`.
|
|
140
|
+
2. Add the SQL to the generated file; never invent a migration filename or rely on memory for its format.
|
|
141
|
+
3. Verify the full chain → `supabase db reset` (or use `supabase migration up` when applying pending migrations to a running local database).
|
|
142
|
+
4. Run advisors, review the Security Checklist above when applicable, and commit the migration.
|
|
143
|
+
|
|
144
|
+
For an interactive experiment, target the local development database explicitly (for example, use `supabase db query` in the local project). Do not use the stack's default remote Supabase MCP for local iteration. If a local DDL experiment is the intended change, capture it with `supabase db diff -f <descriptive-name>` and review the migration; DML must be written explicitly into a versioned imperative migration because schema diff does not capture it. Otherwise reset or discard the experiment before starting the migration. Do not use `supabase db pull` for local changes. `supabase db pull` is for pulling a linked remote schema into a local migration.
|
|
145
|
+
|
|
146
|
+
Do NOT use `apply_migration` to change a local database schema — it writes a migration history entry on every call, which prevents iterative work and can leave the migration history inconsistent. If you use it, you are stuck with whatever SQL you passed on the first try.
|
|
147
|
+
|
|
148
|
+
When a migration is ready, `supabase db advisors` (CLI v2.81.3+) or MCP `get_advisors` can check the resulting database. Fix findings before committing, then use `supabase migration list --local` when you need to compare local and remote migration history.
|
|
149
|
+
|
|
150
|
+
## Debugging
|
|
151
|
+
|
|
152
|
+
When you get an error on a Supabase-related request, for example an error code from the Supabase REST API, Postgres database, or PostgREST, an empty result, getting blocked by RLS unexpectedly, or an error from a Supabase service like Auth, Realtime, Edge Functions, or Storage, you **must** fetch Supabase's [Monitoring and Debugging](https://supabase.com/docs/guides/monitoring-and-debugging.md) documentation before diagnosing or proposing a fix, rather than working from memory. The same docs also cover performance optimizations, such as slow queries and missing indexes.
|
|
153
|
+
|
|
154
|
+
If the documentation or MCP is unavailable (offline or unauthenticated), explicitly label the result as an **offline fallback**. Use only checked-in guidance, local project evidence, and commands confirmed with `supabase --help`; do not guess version-specific behavior or run an unverified mutation. If the available evidence is insufficient, stop and ask for the missing context.
|
|
155
|
+
|
|
156
|
+
Before inspecting, querying, or sharing logs and errors, redact API keys, access tokens, JWTs, cookies, authorization headers, connection strings, and sensitive request or user payloads. Never print or paste secrets.
|
|
131
157
|
|
|
132
158
|
## Reference Guides
|
|
133
159
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: supabase-postgres-best-practices
|
|
3
|
-
description:
|
|
3
|
+
description: "Use for Postgres work: schema design, migrations, declarative schemas, RLS, queries, performance, indexes, locks, triggers, functions, jobs, pgvector, imports/restores, or diagnosing timeouts and connection issues."
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
6
|
author: supabase
|
|
@@ -47,6 +47,10 @@ Use the cheapest seam that can fail for the real regression:
|
|
|
47
47
|
|
|
48
48
|
“Integration-style” is not inherently stronger. A broad test full of mocks may be weaker than a focused rule test, while a regex over SQL text is weaker than executing the database behavior it claims to protect.
|
|
49
49
|
|
|
50
|
+
## Anti-pattern: tautological tests
|
|
51
|
+
|
|
52
|
+
Do not let an assertion recompute the expected value the way the code does (`expect(add(a, b)).toBe(a + b)`, a snapshot derived by hand the same way, or a constant asserted equal to itself). It passes by construction and can never disagree with the code. Expected values must come from an independent source of truth: a known-good literal, a worked example, or the spec.
|
|
53
|
+
|
|
50
54
|
## Anti-pattern: horizontal slices
|
|
51
55
|
|
|
52
56
|
Do not write all tests first and then all implementation. This outruns what has been learned and encourages tests of imagined shapes.
|
|
@@ -19,6 +19,8 @@ Work from whatever is already in the conversation context. If the user passes an
|
|
|
19
19
|
|
|
20
20
|
If you have not already explored the codebase, do so to understand the current state of the code. Issue titles and descriptions should use the project's domain glossary vocabulary, and respect ADRs in the area you're touching.
|
|
21
21
|
|
|
22
|
+
Look for opportunities to prefactor the code to make the implementation easier. If a prefactoring is useful but optional, record it explicitly in the plan; if selected, publish it as its own issue before the slices that depend on it. "Make the change easy, then make the easy change."
|
|
23
|
+
|
|
22
24
|
### 3. Draft vertical slices
|
|
23
25
|
|
|
24
26
|
Break the plan into **tracer bullet** issues. Each issue is a thin vertical slice that cuts through ALL integration layers end-to-end, NOT a horizontal slice of one layer.
|
|
@@ -28,9 +30,21 @@ Slices may be 'HITL' or 'AFK'. HITL slices require human interaction, such as an
|
|
|
28
30
|
<vertical-slice-rules>
|
|
29
31
|
- Each slice delivers a narrow but COMPLETE path through every layer (schema, API, UI, tests)
|
|
30
32
|
- A completed slice is demoable or verifiable on its own
|
|
33
|
+
- Each slice is sized to fit in a single fresh context window
|
|
31
34
|
- Prefer many thin slices over few thick ones
|
|
35
|
+
- Any selected prefactoring should be completed first and block the dependent slices
|
|
32
36
|
</vertical-slice-rules>
|
|
33
37
|
|
|
38
|
+
Give each issue its **blocking edges**: the other issues that must complete before it can start. An issue with no blockers can start immediately. Keep the same edges in the project plan and the issue tracker.
|
|
39
|
+
|
|
40
|
+
**Wide refactors are the exception to vertical slicing.** A **wide refactor** is one mechanical change (for example, renaming a column or retyping a shared symbol) whose **blast radius** fans across the codebase, so a single edit breaks many call sites at once and no vertical slice can land green. Sequence it as **expand–contract**:
|
|
41
|
+
|
|
42
|
+
1. **Expand:** add the new form beside the old so nothing breaks.
|
|
43
|
+
2. **Migrate:** move call sites in batches sized by blast radius (for example, per package or directory), each as its own issue blocked by the expand issue, keeping the project green batch to batch while the old form still exists.
|
|
44
|
+
3. **Contract:** delete the old form once no caller remains, in an issue blocked by every migration batch.
|
|
45
|
+
|
|
46
|
+
When even the migration batches cannot stay green alone, keep the sequence but use an integration branch that all batches block, followed by a final integrate-and-verify issue; green is promised only there.
|
|
47
|
+
|
|
34
48
|
### 4. Quiz the user
|
|
35
49
|
|
|
36
50
|
Present the proposed breakdown as a numbered list. For each slice, show:
|
|
@@ -43,7 +57,7 @@ Present the proposed breakdown as a numbered list. For each slice, show:
|
|
|
43
57
|
Ask the user:
|
|
44
58
|
|
|
45
59
|
- Does the granularity feel right? (too coarse / too fine)
|
|
46
|
-
- Are the
|
|
60
|
+
- Are the blocking edges correct: does each slice only depend on issues that genuinely gate it?
|
|
47
61
|
- Should any slices be merged or split further?
|
|
48
62
|
- Are the correct slices marked as HITL and AFK?
|
|
49
63
|
|
package/upstreams.json
CHANGED
|
@@ -14,49 +14,51 @@
|
|
|
14
14
|
"path": "skills/playwright-cli",
|
|
15
15
|
"package": "@playwright/cli",
|
|
16
16
|
"binary": "playwright-cli",
|
|
17
|
-
"version": "0.1.
|
|
18
|
-
"commit": "
|
|
17
|
+
"version": "0.1.18",
|
|
18
|
+
"commit": "2f85a94b7b885dbf4a5d34462f253a8746a690c9",
|
|
19
19
|
"license": "Apache-2.0",
|
|
20
|
-
"modified": true
|
|
20
|
+
"modified": true,
|
|
21
|
+
"note": "bundle release firmado 0.1.18 en ca196c297169a494ee5517584883eada60dc8d0e; el pin commit es el HEAD revisado del repo"
|
|
21
22
|
},
|
|
22
23
|
"deploy-to-vercel": {
|
|
23
24
|
"source": "github:vercel-labs/agent-skills",
|
|
24
25
|
"path": "skills/deploy-to-vercel",
|
|
25
26
|
"version": "3.0.0",
|
|
26
|
-
"commit": "
|
|
27
|
+
"commit": "dd089a8c752c966dee8bf0f27cb625ba193ffd9e",
|
|
27
28
|
"modified": true,
|
|
28
29
|
"note": "por diseño empaqueta el proyecto entero (tarball) y lo sube a un endpoint de Vercel para desplegarlo; excluye .env/.env.*/.git/node_modules"
|
|
29
30
|
},
|
|
30
31
|
"diagnose": {
|
|
31
32
|
"source": "github:mattpocock/skills",
|
|
32
33
|
"path": "skills/engineering/diagnosing-bugs",
|
|
33
|
-
"commit": "
|
|
34
|
-
"
|
|
34
|
+
"commit": "5b15a47f2d7150f545fbcacbfe381787fc0230dc",
|
|
35
|
+
"modified": true,
|
|
36
|
+
"note": "upstream renombró la carpeta diagnose → diagnosing-bugs; mantenemos el nombre y las adaptaciones locales sobre el HEAD revisado"
|
|
35
37
|
},
|
|
36
38
|
"find-skills": {
|
|
37
39
|
"source": "github:vercel-labs/skills",
|
|
38
40
|
"path": "skills/find-skills",
|
|
39
|
-
"commit": "
|
|
41
|
+
"commit": "435076e78988e1e6ec40d00b0b1d76bdbbc5419a",
|
|
40
42
|
"modified": true,
|
|
41
43
|
"note": "la copia vendorizada se limita a descubrir skills; no acepta ni ejecuta instalación, actualización o inicialización de contenido upstream"
|
|
42
44
|
},
|
|
43
45
|
"mcp-builder": {
|
|
44
46
|
"source": "github:anthropics/skills",
|
|
45
47
|
"path": "skills/mcp-builder",
|
|
46
|
-
"commit": "
|
|
48
|
+
"commit": "3b3fad96af16a10759d930941b4520ba0c40edae",
|
|
47
49
|
"license": "Apache-2.0",
|
|
48
50
|
"modified": true
|
|
49
51
|
},
|
|
50
52
|
"react-doctor": {
|
|
51
53
|
"source": "github:millionco/react-doctor",
|
|
52
54
|
"path": "skills/react-doctor",
|
|
53
|
-
"commit": "
|
|
55
|
+
"commit": "e183c3519010599d929ed14d99a18bf1f8f8a44c",
|
|
54
56
|
"modified": true
|
|
55
57
|
},
|
|
56
58
|
"skill-creator": {
|
|
57
59
|
"source": "github:anthropics/skills",
|
|
58
60
|
"path": "skills/skill-creator",
|
|
59
|
-
"commit": "
|
|
61
|
+
"commit": "3b3fad96af16a10759d930941b4520ba0c40edae",
|
|
60
62
|
"license": "Apache-2.0",
|
|
61
63
|
"modified": true
|
|
62
64
|
},
|
|
@@ -64,35 +66,35 @@
|
|
|
64
66
|
"source": "github:supabase/agent-skills",
|
|
65
67
|
"path": "skills/supabase",
|
|
66
68
|
"version": "0.1.2",
|
|
67
|
-
"commit": "
|
|
69
|
+
"commit": "8331f910845103c08d51f6ca1d86ebb7d1f745e3",
|
|
68
70
|
"modified": true
|
|
69
71
|
},
|
|
70
72
|
"supabase-postgres-best-practices": {
|
|
71
73
|
"source": "github:supabase/agent-skills",
|
|
72
74
|
"path": "skills/supabase-postgres-best-practices",
|
|
73
|
-
"commit": "
|
|
75
|
+
"commit": "8331f910845103c08d51f6ca1d86ebb7d1f745e3",
|
|
74
76
|
"license": "MIT",
|
|
75
77
|
"modified": true
|
|
76
78
|
},
|
|
77
79
|
"tdd": {
|
|
78
80
|
"source": "github:mattpocock/skills",
|
|
79
81
|
"path": "skills/engineering/tdd",
|
|
80
|
-
"commit": "
|
|
82
|
+
"commit": "5b15a47f2d7150f545fbcacbfe381787fc0230dc",
|
|
81
83
|
"modified": true
|
|
82
84
|
},
|
|
83
85
|
"to-issues": {
|
|
84
86
|
"source": "github:mattpocock/skills",
|
|
85
87
|
"path": "skills/engineering/to-tickets",
|
|
86
|
-
"commit": "
|
|
88
|
+
"commit": "5b15a47f2d7150f545fbcacbfe381787fc0230dc",
|
|
87
89
|
"modified": true,
|
|
88
|
-
"note": "upstream renombró to-issues → to-tickets; conservamos el nombre
|
|
90
|
+
"note": "upstream renombró to-issues → to-tickets; conservamos el nombre y las adaptaciones locales sobre el HEAD revisado"
|
|
89
91
|
},
|
|
90
92
|
"to-prd": {
|
|
91
93
|
"source": "github:mattpocock/skills",
|
|
92
94
|
"path": "skills/engineering/to-spec",
|
|
93
|
-
"commit": "
|
|
95
|
+
"commit": "5b15a47f2d7150f545fbcacbfe381787fc0230dc",
|
|
94
96
|
"modified": true,
|
|
95
|
-
"note": "upstream renombró to-prd → to-spec; conservamos el
|
|
97
|
+
"note": "upstream renombró to-prd → to-spec; conservamos el contrato D9 v2 local sobre el HEAD revisado"
|
|
96
98
|
}
|
|
97
99
|
}
|
|
98
100
|
}
|