sequelizer 0.1.6 → 0.2.0

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.beads/.gitignore +54 -0
  3. data/.beads/.jsonl.lock +0 -0
  4. data/.beads/.migration-hint-ts +1 -0
  5. data/.beads/README.md +81 -0
  6. data/.beads/config.yaml +42 -0
  7. data/.beads/issues.jsonl +20 -0
  8. data/.beads/metadata.json +7 -0
  9. data/.coderabbit.yaml +94 -0
  10. data/.github/dependabot.yml +18 -0
  11. data/.github/workflows/dependabot-auto-merge.yml +36 -0
  12. data/.github/workflows/test.yml +44 -9
  13. data/AGENTS.md +126 -0
  14. data/CHANGELOG.md +17 -0
  15. data/CLAUDE.md +11 -0
  16. data/Gemfile +1 -1
  17. data/Gemfile.lock +84 -53
  18. data/config/platforms/base.csv +5 -0
  19. data/config/platforms/rdbms/athena.csv +4 -0
  20. data/config/platforms/rdbms/postgres.csv +3 -0
  21. data/config/platforms/rdbms/snowflake.csv +1 -0
  22. data/config/platforms/rdbms/spark.csv +3 -0
  23. data/lib/sequel/extensions/cold_col.rb +2 -2
  24. data/lib/sequel/extensions/funky.rb +136 -0
  25. data/lib/sequel/extensions/make_readyable.rb +0 -2
  26. data/lib/sequel/extensions/platform.rb +301 -0
  27. data/lib/sequelizer/options.rb +5 -1
  28. data/lib/sequelizer/version.rb +1 -1
  29. data/lib/sequelizer/yaml_config.rb +0 -1
  30. data/sequelizer.gemspec +10 -7
  31. data/test/lib/sequel/extensions/test_cold_col.rb +2 -2
  32. data/test/lib/sequel/extensions/test_make_readyable.rb +0 -1
  33. data/test/lib/sequel/extensions/test_platform.rb +222 -0
  34. data/test/lib/sequelizer/test_connection_maker.rb +2 -2
  35. data/test/lib/sequelizer/test_gemfile_modifier.rb +2 -2
  36. data/test/lib/sequelizer/test_options.rb +28 -0
  37. data/test/test_helper.rb +1 -0
  38. metadata +97 -19
  39. data/.claude/settings.local.json +0 -64
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd4b9fbda8a56b5f1f9f83787e9fd0abbd76850d30447624ee513669fab9a5ed
4
- data.tar.gz: 51905a6233ab05fb60560b0542f2078de9f26cee1e6a1cb6d7e9cfdd6599b71f
3
+ metadata.gz: f067d6d5a8661d14249493213e942d02a9a9d8b2aca1148915ee02acf5062c1f
4
+ data.tar.gz: eb913ecf490d79fe57fa6d0d8dfb3321703b4e852bd8cac6e2745610cbd48370
5
5
  SHA512:
6
- metadata.gz: a589e19ca1c6a7bc8b3d5ff125becf56f2b19336560286d937210efbbd075785f065ae8cd90cd248d0721bcae2af7cf99449a2ca78c5dc19fc338364db32c23b
7
- data.tar.gz: c697540e63315616982acfaed7a3488dea5abd6482bec1de8402cb6ac208144b0932511fbf39535a65498499e83bcf91bfbab4c530b5ed1a70541889769baa03
6
+ metadata.gz: 34060489fcade8850421f28c0ee062ab6f134fab779b0925ffa55e7078468f7bc4a70bcdc38e9e29fecc4c7a01acdbd11aedf56d315d8e8fa04da0d82692b09e
7
+ data.tar.gz: 635178a3e8c60a531885b2df7e4ad468c8301ea67d55a4d64c7ded78268f66a38e13cc901c5550ca1d00b239539400e3212496a248e388b4d9d632eed6914220
data/.beads/.gitignore ADDED
@@ -0,0 +1,54 @@
1
+ # Dolt database (managed by Dolt, not git)
2
+ dolt/
3
+ dolt-access.lock
4
+
5
+ # Runtime files
6
+ bd.sock
7
+ bd.sock.startlock
8
+ sync-state.json
9
+ last-touched
10
+
11
+ # Local version tracking (prevents upgrade notification spam after git ops)
12
+ .local_version
13
+
14
+ # Worktree redirect file (contains relative path to main repo's .beads/)
15
+ # Must not be committed as paths would be wrong in other clones
16
+ redirect
17
+
18
+ # Sync state (local-only, per-machine)
19
+ # These files are machine-specific and should not be shared across clones
20
+ .sync.lock
21
+ .jsonl.lock
22
+ sync_base.jsonl
23
+ export-state/
24
+
25
+ # Ephemeral store (SQLite - wisps/molecules, intentionally not versioned)
26
+ ephemeral.sqlite3
27
+ ephemeral.sqlite3-journal
28
+ ephemeral.sqlite3-wal
29
+ ephemeral.sqlite3-shm
30
+
31
+ # Legacy files (from pre-Dolt versions)
32
+ *.db
33
+ *.db?*
34
+ *.db-journal
35
+ *.db-wal
36
+ *.db-shm
37
+ db.sqlite
38
+ bd.db
39
+ daemon.lock
40
+ daemon.log
41
+ daemon-*.log.gz
42
+ daemon.pid
43
+ beads.base.jsonl
44
+ beads.base.meta.json
45
+ beads.left.jsonl
46
+ beads.left.meta.json
47
+ beads.right.jsonl
48
+ beads.right.meta.json
49
+
50
+ # NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here.
51
+ # They would override fork protection in .git/info/exclude, allowing
52
+ # contributors to accidentally commit upstream issue databases.
53
+ # The JSONL files (issues.jsonl, interactions.jsonl) and config files
54
+ # are tracked by git by default since no pattern above ignores them.
File without changes
@@ -0,0 +1 @@
1
+ 1771772493
data/.beads/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # Beads - AI-Native Issue Tracking
2
+
3
+ Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
4
+
5
+ ## What is Beads?
6
+
7
+ Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
8
+
9
+ **Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
10
+
11
+ ## Quick Start
12
+
13
+ ### Essential Commands
14
+
15
+ ```bash
16
+ # Create new issues
17
+ bd create "Add user authentication"
18
+
19
+ # View all issues
20
+ bd list
21
+
22
+ # View issue details
23
+ bd show <issue-id>
24
+
25
+ # Update issue status
26
+ bd update <issue-id> --status in_progress
27
+ bd update <issue-id> --status done
28
+
29
+ # Sync with Dolt remote
30
+ bd dolt push
31
+ ```
32
+
33
+ ### Working with Issues
34
+
35
+ Issues in Beads are:
36
+ - **Git-native**: Stored in `.beads/issues.jsonl` and synced like code
37
+ - **AI-friendly**: CLI-first design works perfectly with AI coding agents
38
+ - **Branch-aware**: Issues can follow your branch workflow
39
+ - **Always in sync**: Auto-syncs with your commits
40
+
41
+ ## Why Beads?
42
+
43
+ ✨ **AI-Native Design**
44
+ - Built specifically for AI-assisted development workflows
45
+ - CLI-first interface works seamlessly with AI coding agents
46
+ - No context switching to web UIs
47
+
48
+ 🚀 **Developer Focused**
49
+ - Issues live in your repo, right next to your code
50
+ - Works offline, syncs when you push
51
+ - Fast, lightweight, and stays out of your way
52
+
53
+ 🔧 **Git Integration**
54
+ - Automatic sync with git commits
55
+ - Branch-aware issue tracking
56
+ - Intelligent JSONL merge resolution
57
+
58
+ ## Get Started with Beads
59
+
60
+ Try Beads in your own projects:
61
+
62
+ ```bash
63
+ # Install Beads
64
+ curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
65
+
66
+ # Initialize in your repo
67
+ bd init
68
+
69
+ # Create your first issue
70
+ bd create "Try out Beads"
71
+ ```
72
+
73
+ ## Learn More
74
+
75
+ - **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
76
+ - **Quick Start Guide**: Run `bd quickstart`
77
+ - **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
78
+
79
+ ---
80
+
81
+ *Beads: Issue tracking that moves at the speed of thought* ⚡
@@ -0,0 +1,42 @@
1
+ # Beads Configuration File
2
+ # This file configures default behavior for all bd commands in this repository
3
+ # All settings can also be set via environment variables (BD_* prefix)
4
+ # or overridden with command-line flags
5
+
6
+ # Issue prefix for this repository (used by bd init)
7
+ # If not set, bd init will auto-detect from directory name
8
+ # Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
9
+ # issue-prefix: ""
10
+
11
+ # Use no-db mode: load from JSONL, write back after each command
12
+ # When true, bd will use .beads/issues.jsonl as the source of truth
13
+ # instead of the Dolt database
14
+ # no-db: false
15
+
16
+ # Enable JSON output by default
17
+ # json: false
18
+
19
+ # Default actor for audit trails (overridden by BD_ACTOR or --actor)
20
+ # actor: ""
21
+
22
+ # Export events (audit trail) to .beads/events.jsonl on each flush/sync
23
+ # When enabled, new events are appended incrementally using a high-water mark.
24
+ # Use 'bd export --events' to trigger manually regardless of this setting.
25
+ # events-export: false
26
+
27
+ # Multi-repo configuration (experimental - bd-307)
28
+ # Allows hydrating from multiple repositories and routing writes to the correct JSONL
29
+ # repos:
30
+ # primary: "." # Primary repo (where this database lives)
31
+ # additional: # Additional repos to hydrate from (read-only)
32
+ # - ~/beads-planning # Personal planning repo
33
+ # - ~/work-planning # Work planning repo
34
+
35
+ # Integration settings (access with 'bd config get/set')
36
+ # These are stored in the database, not in this file:
37
+ # - jira.url
38
+ # - jira.project
39
+ # - linear.url
40
+ # - linear.api-key
41
+ # - github.org
42
+ # - github.repo
@@ -0,0 +1,20 @@
1
+ {"id":"sequelizer-2wm","title":"Consolidate JSON aggregation functions from summarb","description":"Move JSON aggregation functions from summarb/rdbms_adapter to sequelizer Platform.\n\nFunctions:\n- json_group_object() - aggregate key-value pairs into JSON object\n- json_object() - create JSON object from arguments\n\nDatabase-specific implementations:\n- PostgreSQL: JSON_OBJECT_AGG\n- DuckDB: JSON_GROUP_OBJECT\n- Athena: MAP_AGG with JSON formatting\n- Snowflake: OBJECT_AGG with TO_JSON","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:05:52.742532408-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:05:52.742532408-08:00","dependencies":[{"issue_id":"sequelizer-2wm","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:12.499777458-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-2wm","depends_on_id":"sequelizer-7xh","type":"blocks","created_at":"2026-01-21T15:06:29.506367806-08:00","created_by":"Ryan Duryea"}]}
2
+ {"id":"sequelizer-45h","title":"Deduplicate cold_col extension (exists in both sequelizer and conceptql)","description":"The cold_col extension exists in both:\n- sequelizer: lib/sequel/extensions/cold_col.rb (CANONICAL)\n- conceptql: lib/sequel/extensions/cold_col.rb (TO BE REMOVED)\n\nActions:\n1. Compare implementations to identify any features in conceptql's version missing from sequelizer\n2. Merge any missing functionality into sequelizer's version\n3. Update conceptql to require 'sequel/extensions/cold_col' from sequelizer gem\n4. Remove conceptql's duplicate copy\n\nSequelizer is the single source of truth for this extension.","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:06:13.821892617-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:07:06.899069011-08:00","dependencies":[{"issue_id":"sequelizer-45h","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:22.041834658-08:00","created_by":"Ryan Duryea"}]}
3
+ {"id":"sequelizer-5kx","title":"Assess and consolidate RDBMS functions from summarb, roobetl, conceptql, t_shank","description":"# RDBMS Function Consolidation Epic\n\n## Overview\nConsolidate database-specific functions, adapters, and Sequel extensions from four projects into sequelizer as the single source of truth.\n\n## Source Projects\n- **summarb**: Statistical functions (mean, median, quantile, variance), JSON aggregation, DuckDB/Athena/Snowflake adapters\n- **roobetl**: Table naming helpers, Sequel extensions (expandable_columns, rangeable_columns, overwrite_view, empty_ctas, extensionable)\n- **conceptql**: RDBMS adapters (Postgres, Spark, Presto), Sequel extensions (cold_col, pg_ctas_explain, pg_vacuum_table)\n- **t_shank**: RDBMS adapters with export prep, date arithmetic, schema discovery, sqls extension\n\n## Consolidation Tiers\n\n### Tier 1 - Core Adapters (HIGH)\n- Unify RDBMS adapter patterns from all four projects\n- Create SequelDB::Adapter system with factory pattern\n- Support: PostgreSQL, Spark, DuckDB, Athena, Snowflake, Impala\n\n### Tier 2 - Sequel Extensions (MEDIUM)\n- pg_ctas_explain, pg_vacuum_table (from conceptql)\n- expandable_columns, rangeable_columns, overwrite_view, empty_ctas (from roobetl)\n- extensionable for SQLite (from roobetl)\n- Deduplicate cold_col (already in both sequelizer and conceptql)\n\n### Tier 3 - Utility Functions (LOWER)\n- Statistical functions (mean, median, quantile, variance)\n- Date arithmetic (date_diff, day_diff, days_between, ymd_date)\n- JSON aggregation (json_group_object, json_object)\n- Table naming helpers with schema/prefix support\n\n## Key Files to Review\n- summarb: lib/summarb/rdbms_adapter.rb + adapters/\n- roobetl: lib/formulas/db_helper.rb + lib/sequel/extensions/\n- conceptql: lib/conceptql/rdbms.rb + lib/conceptql/rdbms/\n- t_shank: lib/t_shank/rdbms_adapter/","status":"open","priority":2,"issue_type":"epic","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:05:21.081935017-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:05:32.766702096-08:00"}
4
+ {"id":"sequelizer-7xh","title":"Unify RDBMS adapter factory pattern across projects","description":"Create unified adapter factory system in sequelizer that consolidates patterns from:\n- summarb: RdbmsAdapter.for(adapter_type, characteristics)\n- conceptql: Rdbms.for(db) \n- t_shank: RdbmsAdapter::Adapter.for(db)\n\nDesign goals:\n1. Single factory: Sequelizer::Adapter.for(db) or Platform.adapter_for(db)\n2. Support all databases: PostgreSQL, Spark, DuckDB, Athena, Snowflake, Impala\n3. Register custom adapters: Sequelizer::Adapter.register(:mydb, MyAdapter)\n4. Provide extension points for project-specific customization\n\nThis is foundational - other consolidation tasks build on this.","status":"open","priority":1,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:06:14.151998552-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:06:14.151998552-08:00","dependencies":[{"issue_id":"sequelizer-7xh","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:22.105549254-08:00","created_by":"Ryan Duryea"}]}
5
+ {"id":"sequelizer-7yh","title":"Implement Platform extension with KVCSV config loading","description":"Create lib/sequel/extensions/platform.rb\n\nCore functionality:\n- Load and stack CSV configs based on database adapter type\n- Provide supports?(feature) and prefers?(feature) methods that read from config\n- Provide hash-style access for arbitrary config values: platform[:interim_schema]\n- Auto-detect RDBMS from db.adapter_scheme and load appropriate CSV stack\n- Register as Sequel extension: Database.register_extension(:platform, Platform)\n\nThe Platform module should:\n1. Define Base class with KVCSV config loading\n2. Define minimal RDBMS subclasses (Postgres, Spark, Snowflake) for function translations\n3. Attach to db as db.platform via self.extended(db)\n\nDepends on: sequelizer-caa (CSV configs)","status":"closed","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T13:42:28.963019559-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:00:09.367686601-08:00","closed_at":"2026-01-21T15:00:09.367686601-08:00","close_reason":"Implemented Platform extension with KVCSV config loading. Includes Base class with supports?/prefers?/[] methods, RDBMS subclasses (Postgres, Spark, Snowflake, Athena) with function translations, auto-detection from adapter scheme, and comprehensive tests. All 161 tests pass.","dependencies":[{"issue_id":"sequelizer-7yh","depends_on_id":"sequelizer-caa","type":"blocks","created_at":"2026-01-21T13:45:26.114596506-08:00","created_by":"Ryan Duryea"}]}
6
+ {"id":"sequelizer-aib","title":"Port CTE extraction logic from ConceptQL","description":"Create lib/sequel/extensions/cte_extraction.rb\n\n**IMPORTANT: This MUST be implemented as a Sequel extension if at all possible.**\n\nPort the CTE extraction logic from ConceptQL's Scope class (lib/conceptql/scope.rb lines 222-340).\n\nComponents to port:\n1. CteExtractor class (Sequel::ASTTransformer subclass)\n2. recursive_extract_ctes method - walks dataset and extracts WITH clauses\n3. recursive_extract_cte_expr method - handles FROM/JOIN expressions\n\nNew components to create:\n1. Extractor class - manages extraction state and collected CTEs\n2. CteExecutor class - wraps query + extracted CTEs, handles temp table lifecycle\n3. DatasetMethods module - adds with_cte_extraction method to datasets\n\nBehavior driven by platform config:\n- prefers_cte: true → return dataset unchanged\n- prefers_cte: false + supports_temp_tables: true → use TEMPORARY tables\n- prefers_cte: false + supports_temp_tables: false → use interim_schema with prefix\n\nHandle platform quirks via config:\n- drop_table_needs_unquoted for Athena\n- interim_schema and interim_prefix for non-temp-table platforms\n\nDepends on: sequelizer-7yh (Platform extension)","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T13:42:47.992907641-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:49:41.416960548-08:00","dependencies":[{"issue_id":"sequelizer-aib","depends_on_id":"sequelizer-7yh","type":"blocks","created_at":"2026-01-21T13:45:26.310298107-08:00","created_by":"Ryan Duryea"}]}
7
+ {"id":"sequelizer-b6t","title":"Integrate existing funky.rb with Platform extension","description":"The current lib/sequel/extensions/funky.rb has partial function translation for Spark and DuckDB.\n\nOptions:\n1. Merge funky.rb functionality into Platform classes\n2. Have Platform delegate to Funky for backward compatibility\n3. Deprecate funky.rb in favor of Platform\n\nRecommended: Option 1 - merge into Platform classes\n\nMove existing functions from FunkySpark and FunkyDuckDB:\n- str_to_date\n- hash\n- make_json_column \n- collect_list\n\nUpdate any code that uses db.funky to use db.platform instead.\n\nThis is optional/low priority - can be done after core implementation works.\n\nDepends on: sequelizer-q0k (function translations)","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T13:43:06.770895284-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T13:43:06.770895284-08:00","dependencies":[{"issue_id":"sequelizer-b6t","depends_on_id":"sequelizer-q0k","type":"blocks","created_at":"2026-01-21T13:45:26.44640022-08:00","created_by":"Ryan Duryea"}]}
8
+ {"id":"sequelizer-bk7","title":"Resolve Dependabot security alert (REXML DoS)","description":"sequelizer has 1 open Dependabot security alert:\n\n- **REXML** — DoS on malformed XML\n\nUpdate the REXML gem or dismiss if the vulnerable code path is not reachable.","status":"closed","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-02-23T06:15:25.755764408-08:00","created_by":"Ryan Duryea","updated_at":"2026-02-23T06:21:59.613944403-08:00","closed_at":"2026-02-23T06:21:59.613944403-08:00","close_reason":"REXML DoS alert (number 2) already resolved — state is 'fixed'. Current rexml version in lockfile exceeds the required 3.4.2 fix.","labels":["security"]}
9
+ {"id":"sequelizer-bt3","title":"Delete stale branches and fix duplicate remote","description":"Two items:\n\n**Stale branches** — clean up leftover branches:\n- `ruby-3.3-upgrade`, `platform-abstraction`, `platform-plan`, `beads` — old branches\n- `github-config-writable`, `feat/writable-github-config` — appears to be duplicate branches for the same feature\n\n**Duplicate remote** — both `origin` and `github` point to the same GitHub URL. Remove the duplicate to avoid confusion.\n\nReview each branch to confirm nothing valuable, then delete from remote.","status":"closed","priority":3,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-02-23T06:15:46.878918771-08:00","created_by":"Ryan Duryea","updated_at":"2026-02-23T06:28:16.793365321-08:00","closed_at":"2026-02-23T06:28:16.793365321-08:00","close_reason":"Deleted 2 stale branches (ruby-3.3-upgrade, github-config-writable). Removed duplicate 'github' remote — only 'origin' remains. Other branches (platform-abstraction, platform-plan, beads, feat/writable-github-config) were already gone.","labels":["chore"]}
10
+ {"id":"sequelizer-caa","title":"Add kvcsv dependency and create base CSV configuration files","description":"Add kvcsv gem to sequelizer.gemspec.\n\nCreate config/platforms/ directory structure:\n- config/platforms/base.csv - conservative defaults for all capabilities\n- config/platforms/rdbms/postgres.csv - PostgreSQL overrides\n- config/platforms/rdbms/spark.csv - Spark overrides \n- config/platforms/rdbms/snowflake.csv - Snowflake overrides\n\nBase CSV should include:\n- supports_cte, supports_temp_tables, supports_temp_views\n- prefers_cte, prefers_parquet\n- drop_table_needs_unquoted, temp_table_needs_schema\n\nReference: complete_platform_feature_matrix.csv in the plans directory","status":"closed","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T13:42:19.847910625-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T13:51:02.223851318-08:00","closed_at":"2026-01-21T13:51:02.223851318-08:00","close_reason":"Added kvcsv dependency to gemspec. Created config/platforms/ directory with base.csv and RDBMS-specific configs for postgres, spark, snowflake, and athena. Verified config loading with KVCSV stacking."}
11
+ {"id":"sequelizer-cxh","title":"Consolidate statistical functions from summarb (mean, median, quantile, variance)","description":"Move statistical aggregation functions from summarb/rdbms_adapter to sequelizer Platform.\n\nFunctions to bring:\n- count_one() - COUNT(1) expression\n- mean() - average calculation (AVG, or MEAN for DuckDB)\n- stddev() - standard deviation\n- variance() - VAR_POP across databases\n- min_date(col) / max_date(col) - date min/max\n- median_date() - PERCENTILE_CONT/MEDIAN per database\n- quantile() - percentile calculations\n\nDatabase-specific implementations exist for: PostgreSQL, DuckDB, Athena, Snowflake\n\nEach function returns a Sequel expression, not raw SQL strings.","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:05:52.424745818-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:49:29.321527212-08:00","dependencies":[{"issue_id":"sequelizer-cxh","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:12.437160726-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-cxh","depends_on_id":"sequelizer-7xh","type":"blocks","created_at":"2026-01-21T15:06:29.43981094-08:00","created_by":"Ryan Duryea"}]}
12
+ {"id":"sequelizer-dfc","title":"Consolidate export preparation functions from t_shank","description":"Move export preparation utilities from t_shank/rdbms_adapter to sequelizer.\n\nFunctions:\n- prep_for_export() - Configure database for export operations\n - PostgreSQL: Set search_path, disable nested loop joins\n - Spark: Create schema, load parquet files\n - Impala: USE database statement\n- create_table_options() - Database-specific CREATE TABLE options\n- ymd_date() - Format date as YYYYMMDD string\n\nThese support data export workflows.","status":"closed","priority":3,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:05:54.129761507-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:07:23.126505375-08:00","closed_at":"2026-01-21T15:07:23.126505375-08:00","close_reason":"Export preparation is t_shank-specific workflow logic, not a general-purpose database utility. Should stay in t_shank.","dependencies":[{"issue_id":"sequelizer-dfc","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:12.790382913-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-dfc","depends_on_id":"sequelizer-7xh","type":"blocks","created_at":"2026-01-21T15:06:29.829026885-08:00","created_by":"Ryan Duryea"}]}
13
+ {"id":"sequelizer-dgk","title":"Consolidate PostgreSQL-specific extensions from conceptql","description":"Move PostgreSQL-specific Sequel extensions from conceptql to sequelizer.\n\nExtensions to migrate:\n- pg_ctas_explain.rb - EXPLAIN ANALYZE for CREATE TABLE AS\n- pg_vacuum_table.rb - VACUUM [ANALYZE] table utility\n\nThese are PostgreSQL-specific utilities for performance tuning and maintenance.","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:05:53.438049627-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:05:53.438049627-08:00","dependencies":[{"issue_id":"sequelizer-dgk","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:12.626381842-08:00","created_by":"Ryan Duryea"}]}
14
+ {"id":"sequelizer-grs","title":"Consolidate Athena alterations extension from summarb","description":"Move Athena-specific Sequel extension from summarb to sequelizer.\n\nExtension: athena_alterations.rb\n- Removes quotes from DROP TABLE statements (Athena requirement)\n- Adds FORMAT clause support to CREATE TABLE\n- Overrides supports_temporary_table?() =\u003e false\n\nThis is needed for AWS Athena/Trino compatibility.","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:06:13.458450383-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:06:13.458450383-08:00","dependencies":[{"issue_id":"sequelizer-grs","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:21.980832983-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-grs","depends_on_id":"sequelizer-7xh","type":"blocks","created_at":"2026-01-21T15:06:29.63295799-08:00","created_by":"Ryan Duryea"}]}
15
+ {"id":"sequelizer-i0e","title":"Consolidate Sequel extensions from roobetl","description":"Move general-purpose Sequel extensions from roobetl to sequelizer.\n\nExtensions to migrate:\n- overwrite_view.rb - create_view! with drop-if-exists\n- empty_ctas.rb - Create empty table from column definitions\n- extensionable.rb - SQLite extension loading (sqlean)\n\nNOT migrating (roobetl-specific):\n- expandable_columns.rb - too tied to roobetl's JSON expansion workflow\n- rangeable_columns.rb - too tied to roobetl's range expansion workflow","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:05:53.058185138-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:07:42.682328415-08:00","dependencies":[{"issue_id":"sequelizer-i0e","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:12.563523323-08:00","created_by":"Ryan Duryea"}]}
16
+ {"id":"sequelizer-ipa","title":"Consolidate schema/database discovery functions","description":"Move database introspection utilities from t_shank to sequelizer Platform.\n\nFunctions:\n- database_list() - Query available schemas/databases\n- bad_name?() - Filter system schemas (template*, information_schema, pg_catalog)\n\nDatabase-specific implementations:\n- PostgreSQL: information_schema query\n- Spark/Impala: SHOW DATABASES","status":"closed","priority":3,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:05:53.825533147-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:49:28.344806036-08:00","closed_at":"2026-01-21T15:49:28.344806036-08:00","close_reason":"Sequel already provides database/schema introspection. T_shank's implementation is project-specific.","dependencies":[{"issue_id":"sequelizer-ipa","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:12.729714599-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-ipa","depends_on_id":"sequelizer-7xh","type":"blocks","created_at":"2026-01-21T15:06:29.764348602-08:00","created_by":"Ryan Duryea"}]}
17
+ {"id":"sequelizer-q0k","title":"Implement platform-specific function translations","description":"Add function translation methods to Platform classes.\n\nFunctions to implement (based on ConceptQL/TShank analysis):\n- date_diff(from, to) - date difference calculation\n- cast_date(expr) - cast to date type\n- str_to_date(value, format) - parse string to date\n- days_between(from, to) - days between dates\n\nPlatform-specific implementations:\n- Postgres: date subtraction syntax, standard casting\n- Spark: reversed datediff args, to_date function\n- Snowflake: datediff with 'day' unit parameter\n\nEach function should return a Sequel expression (Sequel.function, Sequel.lit, etc.), NOT raw SQL strings.\n\nReference existing implementations in:\n- conceptql/lib/conceptql/rdbms/\n- t_shank/lib/t_shank/rdbms_adapter/\n\nDepends on: sequelizer-7yh (Platform extension)","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T13:42:37.68776951-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T13:42:37.68776951-08:00","dependencies":[{"issue_id":"sequelizer-q0k","depends_on_id":"sequelizer-7yh","type":"blocks","created_at":"2026-01-21T13:45:26.241723924-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-q0k","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:05:52.110313514-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-q0k","depends_on_id":"sequelizer-7xh","type":"blocks","created_at":"2026-01-21T15:06:29.569431516-08:00","created_by":"Ryan Duryea"}]}
18
+ {"id":"sequelizer-reb","title":"Consolidate table naming helpers from roobetl","description":"Move table naming utilities from roobetl/db_helper to sequelizer.\n\nFunctions:\n- interim_table_name() - Add prefix and schema qualification\n- source_table_name() - Apply source schema/prefix\n- vocabulary_table_name() - Vocabulary-specific naming\n- target_table_name() - Target table naming with schema\n- table_named_from_settings() - Parse dot-notation table names\n\nThese support ETL workflows with consistent table naming patterns.","status":"closed","priority":3,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:06:13.118094981-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:07:47.923640223-08:00","closed_at":"2026-01-21T15:07:47.923640223-08:00","close_reason":"Table naming helpers are roobetl ETL-workflow-specific. Should stay in roobetl.","dependencies":[{"issue_id":"sequelizer-reb","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:06:21.883321452-08:00","created_by":"Ryan Duryea"}]}
19
+ {"id":"sequelizer-sfe","title":"Add supports_* capability methods to Platform","description":"Add capability-checking methods to Platform that mirror Sequel's supports_* pattern.\n\nMethods to add:\n- supports_temporary_table? - Check KVCSV setting, default varies by adapter\n- supports_materialized? - Materialized view support (Postgres yes, Presto no)\n- Other supports_* as needed\n\nImplementation:\n- Each method checks KVCSV for an explicit setting first\n- Falls back to sensible defaults per adapter type\n- Similar pattern to Sequel::Database#supports_* methods\n\nExample:\n platform.supports_temporary_table? # checks kvcsv['supports_temporary_table'] or defaults\n\nThis provides a consistent interface for capability checking across all adapters.","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T15:49:42.388734927-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T15:49:42.388734927-08:00","dependencies":[{"issue_id":"sequelizer-sfe","depends_on_id":"sequelizer-5kx","type":"blocks","created_at":"2026-01-21T15:49:48.703963987-08:00","created_by":"Ryan Duryea"},{"issue_id":"sequelizer-sfe","depends_on_id":"sequelizer-7xh","type":"blocks","created_at":"2026-01-21T15:49:48.771232148-08:00","created_by":"Ryan Duryea"}]}
20
+ {"id":"sequelizer-ztz","title":"Add comprehensive tests for Platform and CTE extraction","description":"Create tests using Sequel::Mock::Database for SQL generation validation.\n\nTest files to create:\n- test/lib/sequel/extensions/test_platform.rb\n- test/lib/sequel/extensions/test_cte_extraction.rb\n\nPlatform extension tests:\n- Config loading from CSV files\n- Config stacking/override behavior\n- supports?/prefers? methods\n- Function translation returns correct Sequel expressions\n- Auto-detection of RDBMS from adapter\n\nCTE extraction tests:\n- Simple CTE extraction\n- Nested CTE extraction\n- CTE in JOINs\n- CTE in WHERE subqueries\n- CTE in UNION compounds\n- Temp table naming with prefix\n- Interim schema qualification when no temp tables\n- Cleanup on success and failure\n\nUse Mock database to capture SQL without real connections.\nTest across simulated Postgres, Spark, and Athena configurations.\n\nDepends on: sequelizer-aib (CTE extraction)","status":"open","priority":2,"issue_type":"task","owner":"aguynamedryan@gmail.com","created_at":"2026-01-21T13:42:57.006727435-08:00","created_by":"Ryan Duryea","updated_at":"2026-01-21T13:42:57.006727435-08:00","dependencies":[{"issue_id":"sequelizer-ztz","depends_on_id":"sequelizer-aib","type":"blocks","created_at":"2026-01-21T13:45:26.37466602-08:00","created_by":"Ryan Duryea"}]}
@@ -0,0 +1,7 @@
1
+ {
2
+ "database": "dolt",
3
+ "jsonl_export": "issues.jsonl",
4
+ "backend": "dolt",
5
+ "dolt_mode": "server",
6
+ "dolt_database": "beads_sequelizer"
7
+ }
data/.coderabbit.yaml ADDED
@@ -0,0 +1,94 @@
1
+ # CodeRabbit Configuration for sequelizer
2
+ # Docs: https://docs.coderabbit.ai
3
+
4
+ language: "en-US"
5
+ early_access: false
6
+ enable_free_tier: true
7
+
8
+ reviews:
9
+ profile: "chill"
10
+ request_changes_workflow: false
11
+ high_level_summary: true
12
+ high_level_summary_placeholder: "@coderabbitai summary"
13
+ review_status: true
14
+ collapse_walkthrough: false
15
+ sequence_diagrams: true
16
+ poem: false
17
+ path_filters: []
18
+ path_instructions:
19
+ - path: "lib/sequelizer/connection_maker.rb"
20
+ instructions: "This is the core connection factory. Verify all database adapter configurations are handled correctly."
21
+ - path: "lib/sequelizer/sequel_extensions/**"
22
+ instructions: "These extend Sequel ORM functionality. Ensure compatibility with all supported database adapters (PostgreSQL, Impala, Hive2, Athena, Spark)."
23
+ - path: "**/*.rb"
24
+ instructions: "This project uses Sequel ORM exclusively. Never suggest ActiveRecord patterns. All platform-specific code must use the supports_*/prefers_* pattern for feature detection."
25
+ auto_review:
26
+ enabled: true
27
+ ignore_title_keywords:
28
+ - "WIP"
29
+ - "DO NOT MERGE"
30
+ drafts: false
31
+ base_branches:
32
+ - "main"
33
+
34
+ tools:
35
+ rubocop:
36
+ enabled: true
37
+ brakeman:
38
+ enabled: true
39
+ shellcheck:
40
+ enabled: true
41
+ yamllint:
42
+ enabled: true
43
+ gitleaks:
44
+ enabled: true
45
+ # Disable irrelevant tools
46
+ eslint:
47
+ enabled: false
48
+ biome:
49
+ enabled: false
50
+ phpstan:
51
+ enabled: false
52
+ phpmd:
53
+ enabled: false
54
+ phpcs:
55
+ enabled: false
56
+ golangci-lint:
57
+ enabled: false
58
+ swiftlint:
59
+ enabled: false
60
+ ruff:
61
+ enabled: false
62
+ flake8:
63
+ enabled: false
64
+ pylint:
65
+ enabled: false
66
+ clippy:
67
+ enabled: false
68
+ detekt:
69
+ enabled: false
70
+ buf:
71
+ enabled: false
72
+ clang:
73
+ enabled: false
74
+ cppcheck:
75
+ enabled: false
76
+ oxc:
77
+ enabled: false
78
+ fortitudeLint:
79
+ enabled: false
80
+ shopifyThemeCheck:
81
+ enabled: false
82
+ prismaLint:
83
+ enabled: false
84
+
85
+ knowledge_base:
86
+ opt_out: false
87
+ web_search:
88
+ enabled: true
89
+ code_guidelines:
90
+ enabled: true
91
+ filePatterns:
92
+ - "**/CLAUDE.md"
93
+ learnings:
94
+ scope: "auto"
@@ -0,0 +1,18 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ open-pull-requests-limit: 10
8
+ groups:
9
+ minor-and-patch:
10
+ update-types: ["minor", "patch"]
11
+ - package-ecosystem: github-actions
12
+ directory: "/"
13
+ schedule:
14
+ interval: weekly
15
+ open-pull-requests-limit: 10
16
+ groups:
17
+ actions:
18
+ update-types: ["minor", "patch", "major"]
@@ -0,0 +1,36 @@
1
+ name: Dependabot auto-merge
2
+
3
+ on: pull_request
4
+
5
+ permissions:
6
+ contents: write
7
+ pull-requests: write
8
+
9
+ jobs:
10
+ dependabot:
11
+ runs-on: ubuntu-latest
12
+ if: github.actor == 'dependabot[bot]'
13
+ steps:
14
+ - name: Dependabot metadata
15
+ id: metadata
16
+ uses: dependabot/fetch-metadata@v2
17
+ with:
18
+ github-token: "${{ secrets.GITHUB_TOKEN }}"
19
+
20
+ - name: Approve PR
21
+ if: >-
22
+ contains(fromJSON('["version-update:semver-patch", "version-update:semver-minor"]'),
23
+ steps.metadata.outputs.update-type)
24
+ run: gh pr review --approve "$PR_URL"
25
+ env:
26
+ PR_URL: ${{ github.event.pull_request.html_url }}
27
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
28
+
29
+ - name: Enable auto-merge
30
+ if: >-
31
+ contains(fromJSON('["version-update:semver-patch", "version-update:semver-minor"]'),
32
+ steps.metadata.outputs.update-type)
33
+ run: gh pr merge --auto --squash "$PR_URL"
34
+ env:
35
+ PR_URL: ${{ github.event.pull_request.html_url }}
36
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,14 +1,49 @@
1
- name: Run Tests
1
+ name: CI
2
2
  on: [push, pull_request]
3
+ concurrency:
4
+ group: ci-${{ github.ref }}
5
+ cancel-in-progress: true
3
6
  jobs:
7
+ lint:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v6
11
+ - uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: '4.0'
14
+ bundler-cache: true
15
+ - name: Run RuboCop
16
+ run: bundle exec rubocop
17
+
18
+ test:
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ ruby: ['3.2', '3.3', '3.4', '4.0']
24
+ name: Test Ruby ${{ matrix.ruby }}
25
+ steps:
26
+ - uses: actions/checkout@v6
27
+ - uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby }}
30
+ bundler-cache: true
31
+ - name: Run Tests
32
+ run: bundle exec rake test
33
+
4
34
  Run-Tests:
35
+ if: always()
36
+ needs: [lint, test]
5
37
  runs-on: ubuntu-latest
6
38
  steps:
7
- - uses: actions/checkout@v3
8
- - uses: ruby/setup-ruby@v1
9
- with:
10
- ruby-version: '3.2'
11
- bundler-cache: true
12
- -
13
- name: Run Tests
14
- run: bundle exec rake test
39
+ - name: Check CI status
40
+ run: |
41
+ if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
42
+ echo "One or more CI jobs failed"
43
+ exit 1
44
+ fi
45
+ if [[ "${{ contains(needs.*.result, 'cancelled') }}" == "true" ]]; then
46
+ echo "One or more CI jobs were cancelled"
47
+ exit 1
48
+ fi
49
+ echo "All CI jobs passed"
data/AGENTS.md ADDED
@@ -0,0 +1,126 @@
1
+ # Agent Instructions
2
+
3
+ This project uses **bd** (beads) for issue tracking. Run `bd onboard` to get started.
4
+
5
+ ## Quick Reference
6
+
7
+ ```bash
8
+ bd ready # Find available work
9
+ bd show <id> # View issue details
10
+ bd update <id> --status in_progress # Claim work
11
+ bd close <id> # Complete work
12
+ bd sync # Sync with git
13
+ ```
14
+
15
+ <!-- BEGIN BEADS INTEGRATION -->
16
+ ## Issue Tracking with bd (beads)
17
+
18
+ **IMPORTANT**: This project uses **bd (beads)** for ALL issue tracking. Do NOT use markdown TODOs, task lists, or other tracking methods.
19
+
20
+ ### Why bd?
21
+
22
+ - Dependency-aware: Track blockers and relationships between issues
23
+ - Git-friendly: Auto-syncs to JSONL for version control
24
+ - Agent-optimized: JSON output, ready work detection, discovered-from links
25
+ - Prevents duplicate tracking systems and confusion
26
+
27
+ ### Quick Start
28
+
29
+ **Check for ready work:**
30
+
31
+ ```bash
32
+ bd ready --json
33
+ ```
34
+
35
+ **Create new issues:**
36
+
37
+ ```bash
38
+ bd create "Issue title" --description="Detailed context" -t bug|feature|task -p 0-4 --json
39
+ bd create "Issue title" --description="What this issue is about" -p 1 --deps discovered-from:bd-123 --json
40
+ ```
41
+
42
+ **Claim and update:**
43
+
44
+ ```bash
45
+ bd update bd-42 --status in_progress --json
46
+ bd update bd-42 --priority 1 --json
47
+ ```
48
+
49
+ **Complete work:**
50
+
51
+ ```bash
52
+ bd close bd-42 --reason "Completed" --json
53
+ ```
54
+
55
+ ### Issue Types
56
+
57
+ - `bug` - Something broken
58
+ - `feature` - New functionality
59
+ - `task` - Work item (tests, docs, refactoring)
60
+ - `epic` - Large feature with subtasks
61
+ - `chore` - Maintenance (dependencies, tooling)
62
+
63
+ ### Priorities
64
+
65
+ - `0` - Critical (security, data loss, broken builds)
66
+ - `1` - High (major features, important bugs)
67
+ - `2` - Medium (default, nice-to-have)
68
+ - `3` - Low (polish, optimization)
69
+ - `4` - Backlog (future ideas)
70
+
71
+ ### Workflow for AI Agents
72
+
73
+ 1. **Check ready work**: `bd ready` shows unblocked issues
74
+ 2. **Claim your task**: `bd update <id> --status in_progress`
75
+ 3. **Work on it**: Implement, test, document
76
+ 4. **Discover new work?** Create linked issue:
77
+ - `bd create "Found bug" --description="Details about what was found" -p 1 --deps discovered-from:<parent-id>`
78
+ 5. **Complete**: `bd close <id> --reason "Done"`
79
+
80
+ ### Auto-Sync
81
+
82
+ bd automatically syncs with git:
83
+
84
+ - Exports to `.beads/issues.jsonl` after changes (5s debounce)
85
+ - Imports from JSONL when newer (e.g., after `git pull`)
86
+ - No manual export/import needed!
87
+
88
+ ### Important Rules
89
+
90
+ - ✅ Use bd for ALL task tracking
91
+ - ✅ Always use `--json` flag for programmatic use
92
+ - ✅ Link discovered work with `discovered-from` dependencies
93
+ - ✅ Check `bd ready` before asking "what should I work on?"
94
+ - ❌ Do NOT create markdown TODO lists
95
+ - ❌ Do NOT use external issue trackers
96
+ - ❌ Do NOT duplicate tracking systems
97
+
98
+ For more details, see README.md and docs/QUICKSTART.md.
99
+
100
+ <!-- END BEADS INTEGRATION -->
101
+
102
+ ## Landing the Plane (Session Completion)
103
+
104
+ **When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
105
+
106
+ **MANDATORY WORKFLOW:**
107
+
108
+ 1. **File issues for remaining work** - Create issues for anything that needs follow-up
109
+ 2. **Run quality gates** (if code changed) - Tests, linters, builds
110
+ 3. **Update issue status** - Close finished work, update in-progress items
111
+ 4. **PUSH TO REMOTE** - This is MANDATORY:
112
+ ```bash
113
+ git pull --rebase
114
+ bd sync
115
+ git push
116
+ git status # MUST show "up to date with origin"
117
+ ```
118
+ 5. **Clean up** - Clear stashes, prune remote branches
119
+ 6. **Verify** - All changes committed AND pushed
120
+ 7. **Hand off** - Provide context for next session
121
+
122
+ **CRITICAL RULES:**
123
+ - Work is NOT complete until `git push` succeeds
124
+ - NEVER stop before pushing - that leaves work stranded locally
125
+ - NEVER say "ready to push when you are" - YOU must push
126
+ - If push fails, resolve and retry until it succeeds
data/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## 0.2.0
6
+
7
+ ### Added
8
+ - funky Sequel extension for database-specific function abstraction
9
+ - kvcsv as a runtime dependency
10
+ - Platform configuration fixtures in config/platforms/
11
+
12
+ ### Changed
13
+ - Broadened activesupport dependency from ~> 7.0 to >= 7, < 9
14
+ - Broadened hashie dependency from ~> 3.2 to >= 3.2, < 6.0
15
+ - Broadened dotenv dependency from ~> 2.1 to >= 2.1, < 4.0
16
+ - Bumped sequel from 5.93.0 to 5.101.0
17
+ - Added multi-Ruby CI matrix (3.2, 3.3, 3.4, 4.0) with separate lint job
18
+
19
+ ### Fixed
20
+ - Adapter extraction from URL scheme for search_path processing
21
+
5
22
  ## 0.1.6
6
23
 
7
24
  ### Removed
data/CLAUDE.md CHANGED
@@ -207,6 +207,17 @@ This project follows standard Ruby community conventions enforced by RuboCop, em
207
207
  - Great commit messages
208
208
  - Wonderful changelog messages
209
209
 
210
+ ## Platform Abstraction Project (In Planning)
211
+
212
+ There is a separate, planned evolution of this gem documented in `oimnibus/projects/in-development/sequelizer/` with 31 ADRs. That project would add a `Platform` object to `Sequel::Database` instances with `supports_*?`/`prefers_*?` methods for abstracting RDBMS-specific behavior across Postgres, Spark, Athena, and Snowflake. **This is NOT yet implemented in this gem** — the current gem is DB-connection-only. The platform abstraction is entirely in planning documents.
213
+
214
+ ## Agent Rules
215
+
216
+ 1. **NEVER skip, hide, or conditionally disable tests to avoid failures.** If a test fails because a dependency is missing, add the dependency. If a test fails because fixture data is missing, create the fixtures. Wrapping a `require` in `rescue LoadError` and returning early is just as bad as deleting the test. Fix the root cause.
217
+ 2. **NEVER exclude files from coverage to dodge SimpleCov thresholds.** If coverage is low because tests aren't running, make the tests run.
218
+ 3. **Always test locally across all supported Ruby versions before pushing.** Use `MISE_RUBY_VERSION=X.Y mise exec -- bundle exec rake test` for each version in the CI matrix (3.2, 3.3, 3.4, 4.0).
219
+ 4. **Run both `bundle exec rubocop` and `bundle exec rake test` before every push.** No exceptions.
220
+
210
221
  ## Development Memories
211
222
 
212
223
  - Ensure that bundler is used for all ruby/rake related cli invocations