quonfig 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.claude/rules/constitution.md +81 -0
- data/.claude/rules/git-safety.md +11 -0
- data/.claude/rules/issue-tracking.md +13 -0
- data/.claude/rules/testing-workflow.md +28 -0
- data/.envrc.sample +3 -0
- data/.github/CODEOWNERS +2 -0
- data/.github/pull_request_template.md +8 -0
- data/.github/workflows/push_gem.yml +49 -0
- data/.github/workflows/ruby.yml +60 -0
- data/.github/workflows/test.yaml +40 -0
- data/.rubocop.yml +13 -0
- data/.tool-versions +1 -0
- data/CHANGELOG.md +301 -0
- data/CLAUDE.md +29 -0
- data/CODEOWNERS +1 -0
- data/Gemfile +26 -0
- data/Gemfile.lock +177 -0
- data/LICENSE.txt +20 -0
- data/README.md +213 -0
- data/Rakefile +64 -0
- data/VERSION +1 -0
- data/dev/allocation_stats +60 -0
- data/dev/benchmark +40 -0
- data/dev/console +12 -0
- data/dev/script_setup.rb +18 -0
- data/lib/quonfig/bound_client.rb +71 -0
- data/lib/quonfig/caching_http_connection.rb +95 -0
- data/lib/quonfig/client.rb +221 -0
- data/lib/quonfig/config_envelope.rb +5 -0
- data/lib/quonfig/config_loader.rb +103 -0
- data/lib/quonfig/config_store.rb +42 -0
- data/lib/quonfig/context.rb +101 -0
- data/lib/quonfig/datadir.rb +101 -0
- data/lib/quonfig/duration.rb +58 -0
- data/lib/quonfig/encryption.rb +74 -0
- data/lib/quonfig/error.rb +6 -0
- data/lib/quonfig/errors/env_var_parse_error.rb +11 -0
- data/lib/quonfig/errors/initialization_timeout_error.rb +12 -0
- data/lib/quonfig/errors/invalid_sdk_key_error.rb +19 -0
- data/lib/quonfig/errors/missing_default_error.rb +13 -0
- data/lib/quonfig/errors/missing_env_var_error.rb +11 -0
- data/lib/quonfig/errors/type_mismatch_error.rb +11 -0
- data/lib/quonfig/errors/uninitialized_error.rb +13 -0
- data/lib/quonfig/evaluation.rb +64 -0
- data/lib/quonfig/evaluator.rb +464 -0
- data/lib/quonfig/exponential_backoff.rb +21 -0
- data/lib/quonfig/fixed_size_hash.rb +14 -0
- data/lib/quonfig/http_connection.rb +46 -0
- data/lib/quonfig/internal_logger.rb +173 -0
- data/lib/quonfig/murmer3.rb +50 -0
- data/lib/quonfig/options.rb +194 -0
- data/lib/quonfig/periodic_sync.rb +74 -0
- data/lib/quonfig/quonfig.rb +58 -0
- data/lib/quonfig/rate_limit_cache.rb +41 -0
- data/lib/quonfig/reason.rb +39 -0
- data/lib/quonfig/resolver.rb +42 -0
- data/lib/quonfig/semantic_logger_filter.rb +90 -0
- data/lib/quonfig/semver.rb +132 -0
- data/lib/quonfig/sse_config_client.rb +135 -0
- data/lib/quonfig/time_helpers.rb +7 -0
- data/lib/quonfig/types.rb +56 -0
- data/lib/quonfig/weighted_value_resolver.rb +49 -0
- data/lib/quonfig.rb +57 -0
- data/quonfig.gemspec +149 -0
- data/scripts/generate_integration_tests.rb +362 -0
- data/test/fixtures/datafile.json +87 -0
- data/test/integration/test_context_precedence.rb +194 -0
- data/test/integration/test_datadir_environment.rb +76 -0
- data/test/integration/test_enabled.rb +784 -0
- data/test/integration/test_enabled_with_contexts.rb +94 -0
- data/test/integration/test_get.rb +224 -0
- data/test/integration/test_get_feature_flag.rb +34 -0
- data/test/integration/test_get_or_raise.rb +86 -0
- data/test/integration/test_get_weighted_values.rb +29 -0
- data/test/integration/test_helpers.rb +139 -0
- data/test/integration/test_helpers_test.rb +73 -0
- data/test/integration/test_post.rb +34 -0
- data/test/integration/test_telemetry.rb +114 -0
- data/test/support/common_helpers.rb +106 -0
- data/test/support/mock_base_client.rb +27 -0
- data/test/support/mock_config_loader.rb +1 -0
- data/test/test_bound_client.rb +109 -0
- data/test/test_caching_http_connection.rb +218 -0
- data/test/test_client.rb +255 -0
- data/test/test_config_loader.rb +70 -0
- data/test/test_context.rb +136 -0
- data/test/test_datadir.rb +199 -0
- data/test/test_duration.rb +37 -0
- data/test/test_encryption.rb +16 -0
- data/test/test_evaluator.rb +285 -0
- data/test/test_exponential_backoff.rb +44 -0
- data/test/test_fixed_size_hash.rb +119 -0
- data/test/test_helper.rb +17 -0
- data/test/test_http_connection.rb +79 -0
- data/test/test_internal_logger.rb +34 -0
- data/test/test_options.rb +167 -0
- data/test/test_rate_limit_cache.rb +44 -0
- data/test/test_reason.rb +79 -0
- data/test/test_rename.rb +65 -0
- data/test/test_resolver.rb +144 -0
- data/test/test_semantic_logger_filter.rb +123 -0
- data/test/test_semver.rb +108 -0
- data/test/test_sse_config_client.rb +297 -0
- data/test/test_typed_getters.rb +131 -0
- data/test/test_types.rb +141 -0
- data/test/test_weighted_value_resolver.rb +84 -0
- metadata +311 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 6e8e728d81d4870daabc72a78a69e5f8b3f990fbc168d59cd547b240f150d712
|
|
4
|
+
data.tar.gz: 627a0d2b3b6c9d7ade79a5d44a213d72e2b21ff09f80a4c67b3ee6aec77741f5
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: ba05469db1692fad2c3c778e8e150b7d929b755c77a85e31e393f9d3c52b8d6e0db0ea537381ea2829f0d219d39f4166adf6341c9035fae5af8639de2fdf8b30
|
|
7
|
+
data.tar.gz: 5ee24f2df153046ce6442e9f7cb7494f0ebf45a30a551b6359324679139fb05252bf196890e155eac0bcb5a0d3a4e760d430e0b88c2db94a348fc09b739c1de8
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: constitution
|
|
3
|
+
description: Rules for when agents must stop for human review vs. proceed autonomously. Read before committing significant changes or when uncertain about scope.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Agent Constitution
|
|
7
|
+
|
|
8
|
+
Default rule: **when in doubt, block for human review**. A false positive costs 30 seconds. A false negative can cause real damage.
|
|
9
|
+
|
|
10
|
+
Human-review blocks use the built-in `blocked` status plus the `needs-human` label (bd's custom-status format doesn't accept `blocked:human`). Do NOT call `bd close` on a bead that needs human input — closed beads are invisible to the human review queue.
|
|
11
|
+
|
|
12
|
+
## Auto-Proceed (no human needed)
|
|
13
|
+
|
|
14
|
+
- Bug fixes with passing tests
|
|
15
|
+
- UI copy, labels, and styling changes
|
|
16
|
+
- Test coverage additions
|
|
17
|
+
- Refactoring within a single file that doesn't change public interfaces
|
|
18
|
+
- Docs and comment updates
|
|
19
|
+
- Simulation-discovered bugs with a clear root cause and fix
|
|
20
|
+
- Patch-version dependency bumps
|
|
21
|
+
- Adding new flags/configs to `our-config/` (no schema change)
|
|
22
|
+
- **Data-only edits** to existing configs in `our-config/` — flipping a boolean, editing a value, renaming a label. Changing *what* is stored is a data change; changing *how* it's stored is a schema change.
|
|
23
|
+
- Staging deployments (`fly.staging.toml`)
|
|
24
|
+
|
|
25
|
+
## Stop and Ask (blocked + needs-human)
|
|
26
|
+
|
|
27
|
+
**Push as far as you can before blocking.** The goal is to surface a specific,
|
|
28
|
+
answerable question — not to stop at the first sign of uncertainty. Investigate the
|
|
29
|
+
codebase, try the obvious path, and block only when you hit a concrete fork that
|
|
30
|
+
requires a human judgment call. An agent that does real work and then blocks with a
|
|
31
|
+
precise question is far more valuable than one that blocks immediately.
|
|
32
|
+
|
|
33
|
+
Block when you reach a decision point that touches:
|
|
34
|
+
|
|
35
|
+
- **Storage format** — git repo structure, JSON config schema, Gitea config
|
|
36
|
+
- **SDK-facing API surface** — anything SDK clients call: `api-delivery` endpoints, SSE protocol, SDK public interfaces
|
|
37
|
+
- **Cache or delivery protocol** — how configs are loaded, evicted, or streamed
|
|
38
|
+
- **Auth and access control** — workspace permissions, API keys, OAuth flows
|
|
39
|
+
- **New external dependencies** — adding a package to package.json, go.mod, etc.
|
|
40
|
+
- **Database schema changes** — Drizzle migrations, ClickHouse schema
|
|
41
|
+
- **Multi-service contract changes** — modifying interfaces shared between two or more services
|
|
42
|
+
- **High uncertainty** — you've investigated and the right approach still isn't clear
|
|
43
|
+
|
|
44
|
+
When blocking, be specific: explain exactly what decision is needed, what you've
|
|
45
|
+
already ruled out, and what the options are. Vague blocks ("not sure how to proceed")
|
|
46
|
+
are not acceptable — do more investigation first.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
bd update <id> --status blocked --add-label needs-human
|
|
50
|
+
bd comments add <id> "Blocked: [what the decision is, what you investigated, what the options are]"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
To see the human-review queue: `bd list --label needs-human`. Do NOT call `bd close` on these — the label is what surfaces them.
|
|
54
|
+
|
|
55
|
+
## Never Touch Without Explicit Instruction
|
|
56
|
+
|
|
57
|
+
- Credentials, secrets, `.env` files with real values
|
|
58
|
+
- Live production data or the Gitea service token
|
|
59
|
+
- Anything in `business/`
|
|
60
|
+
- Production fly deployments (`fly.toml` or `fly.production.toml`, not `fly.staging.toml`)
|
|
61
|
+
- The `.beads/` database directly (always use `bd` CLI)
|
|
62
|
+
|
|
63
|
+
## Alpha Phase Rules
|
|
64
|
+
|
|
65
|
+
In alpha it is acceptable to:
|
|
66
|
+
- Deploy to staging without asking
|
|
67
|
+
- Commit directly to main in sub-repos
|
|
68
|
+
- Run simulated user tests against the local dev server
|
|
69
|
+
- File new beads for bugs found during simulation
|
|
70
|
+
|
|
71
|
+
It is NOT acceptable to:
|
|
72
|
+
- Deploy to production without asking
|
|
73
|
+
- Modify `integration-test-data/` YAML without asking
|
|
74
|
+
- Merge breaking changes to SDK public APIs without asking
|
|
75
|
+
|
|
76
|
+
## Daily Digest
|
|
77
|
+
|
|
78
|
+
Append to `digests/YYYY-MM-DD.md` after each completed task:
|
|
79
|
+
- What was done and what tests passed
|
|
80
|
+
- What is blocked and why
|
|
81
|
+
- Any bugs filed by the simulate stage
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Git safety rules applied to all projects in the monorepo
|
|
3
|
+
globs: ["**"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
IMPORTANT: Never force push (`--force` or `--force-with-lease`) to any branch.
|
|
7
|
+
IMPORTANT: Never delete branches without explicit user approval.
|
|
8
|
+
IMPORTANT: Never run `git reset --hard` or `git clean` without explaining what will be lost and getting confirmation first.
|
|
9
|
+
IMPORTANT: Always commit work-in-progress before any context switch so nothing is lost.
|
|
10
|
+
IMPORTANT: Keep commits small and well-scoped so anything can be easily reverted.
|
|
11
|
+
IMPORTANT: If git blocks an operation, stop and ask — don't force past it.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Issue tracking with beads (bd) for all projects
|
|
3
|
+
globs: ["**"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
IMPORTANT: Do not use Linear for issue tracking. Use beads (`bd`) instead.
|
|
7
|
+
|
|
8
|
+
Quick reference:
|
|
9
|
+
- `bd ready` — find available work
|
|
10
|
+
- `bd show <id>` — view issue details
|
|
11
|
+
- `bd update <id> --status in_progress` — claim work
|
|
12
|
+
- `bd close <id>` — complete work
|
|
13
|
+
- `bd sync` — sync with git
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Testing workflow rules for all code projects
|
|
3
|
+
globs: ["app-quonfig/**", "www-quonfig/**", "ai-starter/**", "api-telemetry/**", "api-delivery/**", "sdk-node/**", "sdk-go/**"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
IMPORTANT: Default to TDD — write the failing test first, run it and confirm it fails (red), then implement until it passes (green). The red→green sequence is the cheapest check that the test is real and that the change actually worked. Paste both the failing and passing output as evidence.
|
|
7
|
+
|
|
8
|
+
IMPORTANT: The goal is **verification**, not test volume. If a change genuinely isn't red/green testable in code (UI polish, infra glue, config-only changes, anything where the test rig would be more complex than the fix), pick one:
|
|
9
|
+
1. **Simulated verification** — drive the real flow (browser automation, live HTTP call, dev server) and paste the evidence it worked.
|
|
10
|
+
2. **Block for human** — `bd update <id> --status blocked --add-label needs-human` with a comment explaining what you tried and why verification needs human hands. Do NOT `bd close` — that hides the bead from the human queue.
|
|
11
|
+
|
|
12
|
+
Never ship with zero verification. Don't build elaborate test scaffolding when the change doesn't warrant it — the form can flex, the evidence cannot.
|
|
13
|
+
|
|
14
|
+
IMPORTANT: Run the relevant test suite before marking a task complete (the file or package you touched, not necessarily the whole repo).
|
|
15
|
+
|
|
16
|
+
## Browser / Chrome DevTools testing (app-quonfig)
|
|
17
|
+
|
|
18
|
+
When any task requires browser testing in app-quonfig, ALWAYS read these skills first:
|
|
19
|
+
- `/user-test-login` — `.claude/skills/user-test-login/SKILL.md`
|
|
20
|
+
- `/user-create-test` — `.claude/skills/user-create-test/SKILL.md`
|
|
21
|
+
|
|
22
|
+
Key points so you don't go off-script:
|
|
23
|
+
- Test accounts live in `app-quonfig/.dev/test-users.json` (gitignored, alias-keyed)
|
|
24
|
+
- The dev-agent login route (`POST /api/dev/login-as`) is the preferred way to sign in headlessly — requires `DEV_AGENT_LOGIN=true` in `.env`
|
|
25
|
+
- Use `isolatedContext` in Chrome MCP when you need a clean session that doesn't share cookies
|
|
26
|
+
- Avoid `@example.com` emails — that domain triggers SSO via the Test Organization
|
|
27
|
+
- Verification codes for new sign-ups come from the WorkOS Events API (see `/user-create-test` for the node snippet)
|
|
28
|
+
- If a test requires a user with a specific state (e.g. pending invite, no org), create a fresh account with `/user-create-test` rather than reusing an existing one
|
data/.envrc.sample
ADDED
data/.github/CODEOWNERS
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
*(Brief overview of what this PR changes and/or why the changes are needed)*
|
|
3
|
+
|
|
4
|
+
## Testing & Validation
|
|
5
|
+
*(Outline the steps needed to be taken to verify the changes.)*
|
|
6
|
+
|
|
7
|
+
## Rollout
|
|
8
|
+
*(Optional section: Provide rollout and rollback procedures, when outside the bounds or requiring additional work beyond standard deployment)*
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Push gem
|
|
3
|
+
|
|
4
|
+
"on":
|
|
5
|
+
workflow_run:
|
|
6
|
+
workflows: ["Ruby"]
|
|
7
|
+
branches: [main]
|
|
8
|
+
types:
|
|
9
|
+
- completed
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
push:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: write
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
with:
|
|
23
|
+
persist-credentials: false
|
|
24
|
+
submodules: recursive
|
|
25
|
+
|
|
26
|
+
- name: Set up Ruby
|
|
27
|
+
uses: ruby/setup-ruby@v1
|
|
28
|
+
with:
|
|
29
|
+
bundler-cache: false
|
|
30
|
+
ruby-version: '3.3'
|
|
31
|
+
|
|
32
|
+
- name: Install runtime dependencies
|
|
33
|
+
run: bundle install --without development --jobs 4 --retry 3
|
|
34
|
+
|
|
35
|
+
- name: Check if version already exists
|
|
36
|
+
id: version-check
|
|
37
|
+
run: |
|
|
38
|
+
VERSION=$(cat VERSION)
|
|
39
|
+
if gem list -r quonfig | grep -q "quonfig ($VERSION)"; then
|
|
40
|
+
echo "version-exists=true" >> $GITHUB_OUTPUT
|
|
41
|
+
echo "Version $VERSION already exists on RubyGems, skipping publish"
|
|
42
|
+
else
|
|
43
|
+
echo "version-exists=false" >> $GITHUB_OUTPUT
|
|
44
|
+
echo "Version $VERSION not found, proceeding with publish"
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
- name: Release gem
|
|
48
|
+
if: steps.version-check.outputs.version-exists == 'false'
|
|
49
|
+
uses: rubygems/release-gem@v1
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
|
2
|
+
# They are provided by a third-party and are governed by
|
|
3
|
+
# separate terms of service, privacy policy, and support
|
|
4
|
+
# documentation.
|
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
|
7
|
+
|
|
8
|
+
name: Ruby
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
push:
|
|
12
|
+
branches: [ "main" ]
|
|
13
|
+
pull_request:
|
|
14
|
+
branches: [ "main" ]
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
test:
|
|
21
|
+
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
strategy:
|
|
24
|
+
fail-fast: false
|
|
25
|
+
matrix:
|
|
26
|
+
ruby-version: ['3.2','3.3','3.4']
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout sdk-ruby
|
|
30
|
+
uses: actions/checkout@v4
|
|
31
|
+
with:
|
|
32
|
+
submodules: recursive
|
|
33
|
+
path: sdk-ruby
|
|
34
|
+
|
|
35
|
+
- name: Checkout integration-test-data
|
|
36
|
+
uses: actions/checkout@v4
|
|
37
|
+
with:
|
|
38
|
+
repository: quonfig/integration-test-data
|
|
39
|
+
path: integration-test-data
|
|
40
|
+
ref: main
|
|
41
|
+
|
|
42
|
+
- name: Set up Ruby
|
|
43
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
|
44
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
|
45
|
+
# uses: ruby/setup-ruby@v1
|
|
46
|
+
# uses: ruby/setup-ruby@2b019609e2b0f1ea1a2bc8ca11cb82ab46ada124
|
|
47
|
+
uses: ruby/setup-ruby@v1
|
|
48
|
+
with:
|
|
49
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
50
|
+
bundler-cache: false # runs 'bundle install' and caches installed gems automatically
|
|
51
|
+
working-directory: sdk-ruby
|
|
52
|
+
- name: Install dependencies
|
|
53
|
+
working-directory: sdk-ruby
|
|
54
|
+
run: bundle install --without development --jobs 4 --retry 3
|
|
55
|
+
- name: Run tests
|
|
56
|
+
working-directory: sdk-ruby
|
|
57
|
+
run: bundle exec rake --trace
|
|
58
|
+
env:
|
|
59
|
+
NOT_A_NUMBER: "abcd"
|
|
60
|
+
IS_A_NUMBER: "1234"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
test:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
strategy:
|
|
11
|
+
fail-fast: false
|
|
12
|
+
matrix:
|
|
13
|
+
ruby-version: ['3.1', '3.2', '3.3']
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout sdk-ruby
|
|
16
|
+
uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
path: sdk-ruby
|
|
19
|
+
|
|
20
|
+
- name: Checkout integration-test-data
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
with:
|
|
23
|
+
repository: quonfig/integration-test-data
|
|
24
|
+
path: integration-test-data
|
|
25
|
+
ref: main
|
|
26
|
+
|
|
27
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
|
28
|
+
uses: ruby/setup-ruby@v1
|
|
29
|
+
with:
|
|
30
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
31
|
+
bundler-cache: true
|
|
32
|
+
working-directory: sdk-ruby
|
|
33
|
+
|
|
34
|
+
- name: Install dependencies
|
|
35
|
+
working-directory: sdk-ruby
|
|
36
|
+
run: bundle install
|
|
37
|
+
|
|
38
|
+
- name: Run tests
|
|
39
|
+
working-directory: sdk-ruby
|
|
40
|
+
run: bundle exec rake test
|
data/.rubocop.yml
ADDED
data/.tool-versions
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby 3.2.7
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.0.2 - 2026-04-22
|
|
4
|
+
|
|
5
|
+
- **Fix:** SSE client now connects to `/api/v2/sse/config` to match the server route and other Quonfig SDKs (was `/api/v2/sse`, which would have failed at runtime against api-delivery). (qfg-uq8)
|
|
6
|
+
- **Test cleanup:** removed two unused Prefab-era integration tests in `test_sse_config_client.rb` that targeted `goatsofreforge.com` and the dead `test/integration_test.rb` helper class. (qfg-9u6)
|
|
7
|
+
|
|
8
|
+
## 0.0.1 - 2026-04-21
|
|
9
|
+
|
|
10
|
+
- **Rename:** gem renamed from `sdk-reforge` to `quonfig`; top-level module `Reforge` → `Quonfig`. First release of the Quonfig Ruby SDK; version reset to `0.0.1` under the new gem name.
|
|
11
|
+
- **Env vars:** canonical names are now `QUONFIG_BACKEND_SDK_KEY`, `QUONFIG_DIR`, `QUONFIG_DATASOURCES`, `QUONFIG_API_URLS`. Legacy `REFORGE_*` / `PREFAB_*` env vars are no longer read.
|
|
12
|
+
- **BREAKING:** option `sources:` renamed to `api_urls:` (matches other Quonfig SDKs). No alias/deprecation — 0.0.x strategy. Env var `QUONFIG_SOURCES` renamed to `QUONFIG_API_URLS`.
|
|
13
|
+
- **BREAKING:** `DEFAULT_API_URLS` is now `['https://primary.quonfig.com']` (was `[primary, secondary]`). SSE stream URLs are derived by prepending `stream.` to each api_url hostname (see `Quonfig::Options.derive_stream_url`).
|
|
14
|
+
- **Requires:** `require 'sdk-reforge'` → `require 'quonfig'`.
|
|
15
|
+
|
|
16
|
+
## 1.12.0 - 2025-10-31
|
|
17
|
+
|
|
18
|
+
- Restore log level functionality with LOG_LEVEL_V2 support
|
|
19
|
+
- Make SemanticLogger optional - SDK now works with or without it
|
|
20
|
+
- Add stdlib Logger support as alternative to SemanticLogger
|
|
21
|
+
- Add InternalLogger that automatically uses SemanticLogger or stdlib Logger
|
|
22
|
+
- Add `logger_key` initialization option for configuring dynamic log levels
|
|
23
|
+
- Add `stdlib_formatter` method for stdlib Logger integration
|
|
24
|
+
|
|
25
|
+
## 1.11.2 - 2025-10-07
|
|
26
|
+
|
|
27
|
+
- Address OpenSSL issue with vulnerability to truncation attack
|
|
28
|
+
|
|
29
|
+
## 1.11.1 - 2025-10-06
|
|
30
|
+
|
|
31
|
+
- quiet logging for SSE reconnections
|
|
32
|
+
- let the SSE::Client handle the Last-Event-ID header
|
|
33
|
+
|
|
34
|
+
## 1.10.0 - 2025-10-02
|
|
35
|
+
|
|
36
|
+
- require `base64` for newest ruby versions
|
|
37
|
+
- look for `REFORGE_BACKEND_SDK_KEY` and `REFORGE_DATAFILE`
|
|
38
|
+
|
|
39
|
+
## 1.9.2 - 2025-10-02
|
|
40
|
+
|
|
41
|
+
- Fix bug in row index calculation for the evaluation summary data
|
|
42
|
+
|
|
43
|
+
## 1.9.1 - 2025-10-01
|
|
44
|
+
|
|
45
|
+
- Fix entrypoint
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
## 1.9.0 - 2025-08-23
|
|
49
|
+
|
|
50
|
+
- Moved to reforge gem name `sdk-reforge`
|
|
51
|
+
- Add automated gem publishing via GitHub Actions trusted publishing
|
|
52
|
+
- Add support for `reforge.current-time` virtual context
|
|
53
|
+
- Dropped the previous implementation of dynamic logging support
|
|
54
|
+
- Removed local file loading based on prefab-envs
|
|
55
|
+
|
|
56
|
+
## 1.8.9 - 2025-04-15
|
|
57
|
+
|
|
58
|
+
- Fix support for virtual context `prefab.current-time` [#229]
|
|
59
|
+
|
|
60
|
+
## 1.8.8 - 2025-02-28
|
|
61
|
+
|
|
62
|
+
- Add conditional fetch support for configurations [#226]
|
|
63
|
+
- Operator support for string starts with, contains [#212]
|
|
64
|
+
- Operator support for regex, semver (protobuf update) [#215]
|
|
65
|
+
- Operator support for date comparison (before/after) [#221]
|
|
66
|
+
- Operator support for numeric comparisons [#220]
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
## 1.8.7 - 2024-10-25
|
|
70
|
+
|
|
71
|
+
- Add option symbolize_json_names [#211]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
## 1.8.6 - 2024-10-07
|
|
75
|
+
|
|
76
|
+
- Fix deprecation warning caused by x_datafile being set by default [#208]
|
|
77
|
+
|
|
78
|
+
## 1.8.5 - 2024-09-27
|
|
79
|
+
|
|
80
|
+
- Fix JS bootstrapping and improve performance [#206]
|
|
81
|
+
- Promote `datafile` from `x_datafile` [#205]
|
|
82
|
+
|
|
83
|
+
## 1.8.4 - 2024-09-19
|
|
84
|
+
|
|
85
|
+
- Use `stream` subdomain for SSE [#203]
|
|
86
|
+
|
|
87
|
+
## 1.8.3 - 2024-09-16
|
|
88
|
+
|
|
89
|
+
- Add JavaScript stub & bootstrapping [#200]
|
|
90
|
+
|
|
91
|
+
## 1.8.2 - 2024-09-03
|
|
92
|
+
|
|
93
|
+
- Forbid bad semantic_logger version [#198]
|
|
94
|
+
|
|
95
|
+
## 1.8.1 - 2024-09-03
|
|
96
|
+
|
|
97
|
+
- Fix SSE reconnection bug [#197]
|
|
98
|
+
|
|
99
|
+
## 1.8.0 - 2024-08-22
|
|
100
|
+
|
|
101
|
+
- Load config from belt and failover to suspenders [#195]
|
|
102
|
+
|
|
103
|
+
## 1.7.2 - 2024-06-24
|
|
104
|
+
|
|
105
|
+
- Support JSON config values [#194]
|
|
106
|
+
|
|
107
|
+
## 1.7.1 - 2024-04-11
|
|
108
|
+
|
|
109
|
+
- Ergonomics [#191]
|
|
110
|
+
|
|
111
|
+
## 1.7.0 - 2024-04-10
|
|
112
|
+
|
|
113
|
+
- Add duration support [#187]
|
|
114
|
+
|
|
115
|
+
## 1.6.2 - 2024-03-29
|
|
116
|
+
|
|
117
|
+
- Fix context telemetry when JIT and Block contexts are combined [#185]
|
|
118
|
+
- Remove logger prefix [#186]
|
|
119
|
+
|
|
120
|
+
## 1.6.1 - 2024-03-28
|
|
121
|
+
|
|
122
|
+
- Performance optimizations [#178]
|
|
123
|
+
- Global context [#182]
|
|
124
|
+
|
|
125
|
+
## 1.6.0 - 2024-03-27
|
|
126
|
+
|
|
127
|
+
- Use semantic_logger for internal logging [#173]
|
|
128
|
+
- Remove Prefab::LoggerClient as a logger for end users [#173]
|
|
129
|
+
- Provide log_filter for end users [#173]
|
|
130
|
+
|
|
131
|
+
## 1.5.1 - 2024-02-22
|
|
132
|
+
|
|
133
|
+
- Fix: Send context shapes by default [#174]
|
|
134
|
+
|
|
135
|
+
## 1.5.0 - 2024-02-12
|
|
136
|
+
|
|
137
|
+
- Fix potential inconsistent Context behavior [#172]
|
|
138
|
+
|
|
139
|
+
## 1.4.5 - 2024-01-31
|
|
140
|
+
|
|
141
|
+
- Refactor out a `should_log?` method [#170]
|
|
142
|
+
|
|
143
|
+
## 1.4.4 - 2024-01-26
|
|
144
|
+
|
|
145
|
+
- Raise when ENV var is missing
|
|
146
|
+
|
|
147
|
+
## 1.4.3 - 2024-01-17
|
|
148
|
+
|
|
149
|
+
- Updated proto definition file
|
|
150
|
+
|
|
151
|
+
## 1.4.2 - 2023-12-14
|
|
152
|
+
|
|
153
|
+
- Use reportable value even for invalid data [#166]
|
|
154
|
+
|
|
155
|
+
## 1.4.1 - 2023-12-08
|
|
156
|
+
|
|
157
|
+
- Include version in `get` request [#165]
|
|
158
|
+
|
|
159
|
+
## 1.4.0 - 2023-11-28
|
|
160
|
+
|
|
161
|
+
- ActiveJob tagged logger issue [#164]
|
|
162
|
+
- Compact Log Format [#163]
|
|
163
|
+
- Tagged Logging [#161]
|
|
164
|
+
- ContextKey logging thread safety [#162]
|
|
165
|
+
|
|
166
|
+
## 1.3.2 - 2023-11-15
|
|
167
|
+
|
|
168
|
+
- Send back cloud.prefab logging telemetry [#160]
|
|
169
|
+
|
|
170
|
+
## 1.3.1 - 2023-11-14
|
|
171
|
+
|
|
172
|
+
- Improve path of rails.controller logging & fix strong param include [#159]
|
|
173
|
+
|
|
174
|
+
## 1.3.0 - 2023-11-13
|
|
175
|
+
|
|
176
|
+
- Less logging when wifi is off and we load from cache [#157]
|
|
177
|
+
- Alpha: Add Provided & Secret Support [#152]
|
|
178
|
+
- Alpha: x_datafile [#156]
|
|
179
|
+
- Add single line action-controller output under rails.controller [#158]
|
|
180
|
+
|
|
181
|
+
## 1.2.1 - 2023-11-01
|
|
182
|
+
|
|
183
|
+
- Update protobuf definitions [#154]
|
|
184
|
+
|
|
185
|
+
## 1.2.0 - 2023-10-30
|
|
186
|
+
|
|
187
|
+
- Add `Prefab.get('key')` style usage after a `Prefab.init()` call [#151]
|
|
188
|
+
- Add `add_context_keys` and `with_context_keys` method for LoggerClient [#145]
|
|
189
|
+
|
|
190
|
+
## 1.1.2 - 2023-10-13
|
|
191
|
+
|
|
192
|
+
- Add `cloud.prefab.client.criteria_evaluator` `debug` logging of evaluations [#150]
|
|
193
|
+
- Add `x_use_local_cache` for local caching [#148]
|
|
194
|
+
- Tests run in RubyMine [#147]
|
|
195
|
+
|
|
196
|
+
## 1.1.1 - 2023-10-11
|
|
197
|
+
|
|
198
|
+
- Migrate happy-path client-initialization logging to `DEBUG` level rather than `INFO` [#144]
|
|
199
|
+
- Add `ConfigClientPresenter` for logging out stats upon successful client initialization [#144]
|
|
200
|
+
- Add support for default context [#146]
|
|
201
|
+
|
|
202
|
+
## 1.1.0 - 2023-09-18
|
|
203
|
+
|
|
204
|
+
- Add support for structured logging [#143]
|
|
205
|
+
- Ability to pass a hash of key/value context pairs to any of the user-facing log methods
|
|
206
|
+
|
|
207
|
+
## 1.0.1 - 2023-08-17
|
|
208
|
+
|
|
209
|
+
- Bug fix for StringList w/ ExampleContextsAggregator [#141]
|
|
210
|
+
|
|
211
|
+
## 1.0.0 - 2023-08-10
|
|
212
|
+
|
|
213
|
+
- Removed EvaluatedKeysAggregator [#137]
|
|
214
|
+
- Change `collect_evaluation_summaries` default to true [#136]
|
|
215
|
+
- Removed some backwards compatibility shims [#133]
|
|
216
|
+
- Standardizing options [#132]
|
|
217
|
+
- Note that the default value for `context_upload_mode` is `:periodic_example` which means example contexts will be collected.
|
|
218
|
+
This enables easy variant override assignment in our UI. More at https://prefab.cloud/blog/feature-flag-variant-assignment/
|
|
219
|
+
|
|
220
|
+
## 0.24.6 - 2023-07-31
|
|
221
|
+
|
|
222
|
+
- Logger Client compatibility [#129]
|
|
223
|
+
- Replace EvaluatedConfigs with ExampleContexts [#128]
|
|
224
|
+
- Add ConfigEvaluationSummaries (opt-in for now) [#123]
|
|
225
|
+
|
|
226
|
+
## 0.24.5 - 2023-07-10
|
|
227
|
+
|
|
228
|
+
- Report Client Version [#121]
|
|
229
|
+
|
|
230
|
+
## [0.24.4] - 2023-07-06
|
|
231
|
+
|
|
232
|
+
- Support Timed Loggers [#119]
|
|
233
|
+
- Added EvaluatedConfigsAggregator (disabled by default) [#118]
|
|
234
|
+
- Added EvaluatedKeysAggregator (disabled by default) [#117]
|
|
235
|
+
- Dropped Ruby 2.6 support [#116]
|
|
236
|
+
- Capture/report context shapes [#115]
|
|
237
|
+
- Added bin/console [#114]
|
|
238
|
+
|
|
239
|
+
## [0.24.3] - 2023-05-15
|
|
240
|
+
|
|
241
|
+
- Add JSON log formatter [#106]
|
|
242
|
+
|
|
243
|
+
# [0.24.2] - 2023-05-12
|
|
244
|
+
|
|
245
|
+
- Fix bug in FF rollout eval consistency [#108]
|
|
246
|
+
- Simplify forking [#107]
|
|
247
|
+
|
|
248
|
+
# [0.24.1] - 2023-04-26
|
|
249
|
+
|
|
250
|
+
- Fix misleading deprecation warning [#105]
|
|
251
|
+
|
|
252
|
+
# [0.24.0] - 2023-04-26
|
|
253
|
+
|
|
254
|
+
- Backwards compatibility for JIT context [#104]
|
|
255
|
+
- Remove upsert [#103]
|
|
256
|
+
- Add resolver presenter and `on_update` callback [#102]
|
|
257
|
+
- Deprecate `lookup_key` and introduce Context [#99]
|
|
258
|
+
|
|
259
|
+
# [0.23.8] - 2023-04-21
|
|
260
|
+
|
|
261
|
+
- Update protobuf [#101]
|
|
262
|
+
|
|
263
|
+
# [0.23.7] - 2023-04-21
|
|
264
|
+
|
|
265
|
+
- Guard against ActiveJob not being loaded [#100]
|
|
266
|
+
|
|
267
|
+
# [0.23.6] - 2023-04-17
|
|
268
|
+
|
|
269
|
+
- Fix bug in FF rollout eval consistency [#98]
|
|
270
|
+
- Add tests for block-form of logging [#96]
|
|
271
|
+
|
|
272
|
+
# [0.23.5] - 2023-04-13
|
|
273
|
+
|
|
274
|
+
- Cast the value to string when checking presence in string list [#95]
|
|
275
|
+
|
|
276
|
+
# [0.23.4] - 2023-04-12
|
|
277
|
+
|
|
278
|
+
- Remove GRPC [#93]
|
|
279
|
+
|
|
280
|
+
# [0.23.3] - 2023-04-07
|
|
281
|
+
|
|
282
|
+
- Use exponential backoff for log level uploading [#92]
|
|
283
|
+
|
|
284
|
+
# [0.23.2] - 2023-04-04
|
|
285
|
+
|
|
286
|
+
- Move log collection logs from INFO to DEBUG [#91]
|
|
287
|
+
- Fix: Handle trailing slash in PREFAB_API_URL [#90]
|
|
288
|
+
|
|
289
|
+
# [0.23.1] - 2023-03-30
|
|
290
|
+
|
|
291
|
+
- ActiveStorage not defined in Rails < 5.2 [#87]
|
|
292
|
+
|
|
293
|
+
# [0.23.0] - 2023-03-28
|
|
294
|
+
|
|
295
|
+
- Convenience for setting Rails.logger [#85]
|
|
296
|
+
- Log evaluation according to rules [#81]
|
|
297
|
+
|
|
298
|
+
# [0.22.0] - 2023-03-15
|
|
299
|
+
|
|
300
|
+
- Report log paths and usages [#79]
|
|
301
|
+
- Accept hash or keyword args in `initialize` [#78]
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Quonfig Ruby SDK
|
|
2
|
+
|
|
3
|
+
Ruby SDK for Quonfig feature flags and configuration.
|
|
4
|
+
|
|
5
|
+
## Build & Test
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bundle install # install dependencies
|
|
9
|
+
bundle exec rake test # run all tests
|
|
10
|
+
bundle exec ruby test/test_FOO.rb # run a single test file
|
|
11
|
+
bundle exec rake # default task — runs tests
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Directory layout
|
|
15
|
+
|
|
16
|
+
- `lib/quonfig/` — SDK source code
|
|
17
|
+
- `test/` — unit tests (one `test_*.rb` per module)
|
|
18
|
+
- `test/integration/` — integration tests driven by shared YAML specs
|
|
19
|
+
|
|
20
|
+
Integration tests require the sibling directory `../../integration-test-data/`
|
|
21
|
+
to exist (cloned from `quonfig/integration-test-data`). Without it the
|
|
22
|
+
integration suite cannot resolve its YAML specs.
|
|
23
|
+
|
|
24
|
+
## Environment variables
|
|
25
|
+
|
|
26
|
+
- `QUONFIG_BACKEND_SDK_KEY` — backend SDK key for authenticated config delivery
|
|
27
|
+
- `QUONFIG_DIR` — path to a local Quonfig workspace (datadir mode)
|
|
28
|
+
- `QUONFIG_ENVIRONMENT` — which environment to evaluate (`production`, `staging`, `development`)
|
|
29
|
+
- `QUONFIG_TELEMETRY_URL` — telemetry ingest endpoint
|
data/CODEOWNERS
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @prefab-cloud/prefabdevs @prefab-cloud/prefabmaintainers @prefab-cloud/prefabadmins
|