aminet-browser
Aminet search and browse: full-text search, category tree navigation, architecture filtering, package detail, and curated…
Emit Postgres.sql and SQLite.sql from a single schema spec so tools work across both drivers without duplicating DDL by hand. Use when designing a schema that needs to support both shared Postgres deployments and zero-config SQLite. Reduces two-file sync burden to a single
Claude Code
$ npx -y skills add Tibsfox/gsd-skill-creator --skill portable-schema-generator --agent claude-code
Codex
$ npx skills add Tibsfox/gsd-skill-creator --skill portable-schema-generator -a codex -y
Cursor
$ npx skills add Tibsfox/gsd-skill-creator --skill portable-schema-generator -a cursor -y
Gemini CLI
$ npx skills add Tibsfox/gsd-skill-creator --skill portable-schema-generator -a gemini-cli -y
GitHub Copilot
$ npx skills add Tibsfox/gsd-skill-creator --skill portable-schema-generator -a github-copilot -y
OpenCode
$ npx skills add Tibsfox/gsd-skill-creator --skill portable-schema-generator -a opencode -y
Windsurf
$ npx skills add Tibsfox/gsd-skill-creator --skill portable-schema-generator -a windsurf -y
name: portable-schema-generator description: "Emit Postgres.sql and SQLite.sql from a single schema spec so tools work across both drivers without duplicating DDL by hand. Use when designing a schema that needs to support both shared Postgres deployments and zero-config SQLite. Reduces two-file sync burden to a single source edit." format: 2025-10-02 version: 1.0.0 status: ACTIVE updated: 2026-04-17 triggers: - designing a schema that needs to support both shared Postgres deployments and zero-config SQLite
Two-driver schemas mean two migration files. Hand-keeping them in sync drifts fast. This skill captures the translation rules and the minimal tooling that keeps them aligned.
while shared-infra deployments keep Postgres
diff-copying
| Concern | Postgres | SQLite | |---------|----------|--------| | Schemas | `CREATE SCHEMA foo; SET search_path TO foo` | Namespace-flat — prefix names instead | | Autoincrement | `BIGSERIAL PRIMARY KEY` | `INTEGER PRIMARY KEY AUTOINCREMENT` | | Timestamps | `TIMESTAMPTZ DEFAULT now()` | `TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))` | | Booleans | `BOOLEAN` | `INTEGER` (0/1) | | Enums via CHECK | `CHECK (col IN ('a','b'))` | Same — both support inline CHECK | | Foreign keys | On by default | `PRAGMA foreign_keys = ON` required at connect | | Updated-at trigger | `CREATE TRIGGER ... EXECUTE FUNCTION touch_updated_at()` | `CREATE TRIGGER ... BEGIN UPDATE ... END` | | Cascading drops | `ON DELETE CASCADE` | Same, but only enforced with `foreign_keys = ON` | | Reserved-word casing | Case-insensitive | Case-insensitive, but be consistent |
When authoring the Postgres version first:
1. **Strip schema prefix** for SQLite — `CREATE SCHEMA IF NOT EXISTS foo;` and `SET search_path` are removed. Keep bare table names. 2. **Replace `BIGSERIAL`** with `INTEGER PRIMARY KEY AUTOINCREMENT`. 3. **Replace `TIMESTAMPTZ`** with `TEXT`; default becomes `(strftime('%Y-%m-%dT%H:%M:%fZ','now'))`. 4. **Replace `BOOLEAN`** with `INTEGER` (values 0/1 at insert time — use an adapter coercion). 5. **Drop `RESTART IDENTITY`** on truncates (SQLite uses `DELETE FROM sqlite_sequence WHERE name = 'table'` instead). 6. **Rewrite function-style triggers** to inline `BEGIN ... END` trigger bodies.
migrations/<feature>/ 001-init.postgres.sql 001-init.sqlite.sql 002-next.postgres.sql 002-next.sqlite.sql
Numbered pairs. The adapter picks the right one based on `cfg.db.driver`.
The query adapter at runtime should:
Reference implementation: `tools/release-history/db.mjs` in this repo.
1. Author the Postgres version first (richer type system reduces ambiguity). 2. Translate row-by-row using the rules above into the SQLite version. 3. Test both: apply each migration to a disposable DB, run schema-check script against the adapter. 4. Commit both files together; never commit one without the other.
both will fail.
See `migrations/release-history/001-init.postgres.sql` and `migrations/release-history/001-init.sqlite.sql`. Six tables (release, feature, metric, retrospective, lesson, publish_target). Same semantics, driver-idiomatic DDL.
An adaptive learning and coprocessor architecture for Claude Code, built as an extension to GSD (open-gsd)
Aminet search and browse: full-text search, category tree navigation, architecture filtering, package detail, and curated…
FS-UAE emulator configuration and launch: hardware profiles, ROM management, WHDLoad integration, config generation, and state…
Manages Aminet INDEX infrastructure: fetch, parse, cache, and incremental update of ~84,000-entry package database. Use when…
Aminet package installation: LhA/LZX extraction, Amiga filesystem mapping, dependency detection, install tracking, and scan gate…
Selective Aminet package mirroring: single-package fetch, integrity verification, mirror state tracking, bulk download, and sync…
Multi-layer virus scanning for Aminet packages. Signature-based detection, heuristic hunk analysis, boot block scanning,…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.