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.
- checksums.yaml +4 -4
- data/.beads/.gitignore +54 -0
- data/.beads/.jsonl.lock +0 -0
- data/.beads/.migration-hint-ts +1 -0
- data/.beads/README.md +81 -0
- data/.beads/config.yaml +42 -0
- data/.beads/issues.jsonl +20 -0
- data/.beads/metadata.json +7 -0
- data/.coderabbit.yaml +94 -0
- data/.github/dependabot.yml +18 -0
- data/.github/workflows/dependabot-auto-merge.yml +36 -0
- data/.github/workflows/test.yml +44 -9
- data/AGENTS.md +126 -0
- data/CHANGELOG.md +17 -0
- data/CLAUDE.md +11 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +84 -53
- data/config/platforms/base.csv +5 -0
- data/config/platforms/rdbms/athena.csv +4 -0
- data/config/platforms/rdbms/postgres.csv +3 -0
- data/config/platforms/rdbms/snowflake.csv +1 -0
- data/config/platforms/rdbms/spark.csv +3 -0
- data/lib/sequel/extensions/cold_col.rb +2 -2
- data/lib/sequel/extensions/funky.rb +136 -0
- data/lib/sequel/extensions/make_readyable.rb +0 -2
- data/lib/sequel/extensions/platform.rb +301 -0
- data/lib/sequelizer/options.rb +5 -1
- data/lib/sequelizer/version.rb +1 -1
- data/lib/sequelizer/yaml_config.rb +0 -1
- data/sequelizer.gemspec +10 -7
- data/test/lib/sequel/extensions/test_cold_col.rb +2 -2
- data/test/lib/sequel/extensions/test_make_readyable.rb +0 -1
- data/test/lib/sequel/extensions/test_platform.rb +222 -0
- data/test/lib/sequelizer/test_connection_maker.rb +2 -2
- data/test/lib/sequelizer/test_gemfile_modifier.rb +2 -2
- data/test/lib/sequelizer/test_options.rb +28 -0
- data/test/test_helper.rb +1 -0
- metadata +97 -19
- data/.claude/settings.local.json +0 -64
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f067d6d5a8661d14249493213e942d02a9a9d8b2aca1148915ee02acf5062c1f
|
|
4
|
+
data.tar.gz: eb913ecf490d79fe57fa6d0d8dfb3321703b4e852bd8cac6e2745610cbd48370
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
data/.beads/.jsonl.lock
ADDED
|
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* ⚡
|
data/.beads/config.yaml
ADDED
|
@@ -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
|
data/.beads/issues.jsonl
ADDED
|
@@ -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"}]}
|
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 }}
|
data/.github/workflows/test.yml
CHANGED
|
@@ -1,14 +1,49 @@
|
|
|
1
|
-
name:
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|