quonfig 0.0.10 → 0.0.11
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/CHANGELOG.md +26 -0
- data/lib/quonfig/sse_config_client.rb +1 -1
- data/lib/quonfig/version.rb +5 -0
- data/lib/quonfig.rb +2 -1
- data/quonfig.gemspec +30 -165
- metadata +28 -183
- data/.claude/rules/constitution.md +0 -81
- data/.claude/rules/git-safety.md +0 -11
- data/.claude/rules/issue-tracking.md +0 -13
- data/.claude/rules/testing-workflow.md +0 -28
- data/.envrc.sample +0 -3
- data/.github/CODEOWNERS +0 -2
- data/.github/pull_request_template.md +0 -8
- data/.github/workflows/release.yml +0 -49
- data/.github/workflows/ruby.yml +0 -60
- data/.github/workflows/test.yaml +0 -40
- data/.rubocop.yml +0 -13
- data/.tool-versions +0 -1
- data/CLAUDE.md +0 -29
- data/CODEOWNERS +0 -1
- data/Gemfile +0 -26
- data/Gemfile.lock +0 -177
- data/Rakefile +0 -64
- data/VERSION +0 -1
- data/dev/allocation_stats +0 -60
- data/dev/benchmark +0 -40
- data/dev/console +0 -12
- data/dev/script_setup.rb +0 -18
- data/test/fixtures/datafile.json +0 -87
- data/test/integration/test_context_precedence.rb +0 -112
- data/test/integration/test_datadir_environment.rb +0 -54
- data/test/integration/test_dev_overrides.rb +0 -40
- data/test/integration/test_enabled.rb +0 -478
- data/test/integration/test_enabled_with_contexts.rb +0 -64
- data/test/integration/test_get.rb +0 -136
- data/test/integration/test_get_feature_flag.rb +0 -28
- data/test/integration/test_get_or_raise.rb +0 -60
- data/test/integration/test_get_weighted_values.rb +0 -34
- data/test/integration/test_helpers.rb +0 -667
- data/test/integration/test_helpers_test.rb +0 -73
- data/test/integration/test_post.rb +0 -44
- data/test/integration/test_telemetry.rb +0 -170
- data/test/support/common_helpers.rb +0 -106
- data/test/support/mock_base_client.rb +0 -27
- data/test/support/mock_config_loader.rb +0 -1
- data/test/test_bound_client.rb +0 -109
- data/test/test_caching_http_connection.rb +0 -218
- data/test/test_client.rb +0 -255
- data/test/test_client_network_mode.rb +0 -136
- data/test/test_client_telemetry.rb +0 -175
- data/test/test_config_loader.rb +0 -70
- data/test/test_context.rb +0 -139
- data/test/test_context_shape.rb +0 -37
- data/test/test_context_shape_aggregator.rb +0 -126
- data/test/test_datadir.rb +0 -203
- data/test/test_details_getters.rb +0 -242
- data/test/test_dev_context.rb +0 -163
- data/test/test_duration.rb +0 -37
- data/test/test_encryption.rb +0 -16
- data/test/test_evaluation_summaries_aggregator.rb +0 -180
- data/test/test_evaluator.rb +0 -285
- data/test/test_example_contexts_aggregator.rb +0 -119
- data/test/test_exponential_backoff.rb +0 -44
- data/test/test_fixed_size_hash.rb +0 -119
- data/test/test_helper.rb +0 -17
- data/test/test_http_connection.rb +0 -81
- data/test/test_internal_logger.rb +0 -34
- data/test/test_options.rb +0 -198
- data/test/test_rate_limit_cache.rb +0 -44
- data/test/test_reason.rb +0 -79
- data/test/test_rename.rb +0 -65
- data/test/test_resolver.rb +0 -291
- data/test/test_semantic_logger_filter.rb +0 -144
- data/test/test_semver.rb +0 -108
- data/test/test_should_log.rb +0 -186
- data/test/test_sse_config_client.rb +0 -297
- data/test/test_stdlib_formatter.rb +0 -195
- data/test/test_telemetry_reporter.rb +0 -209
- data/test/test_typed_getters.rb +0 -131
- data/test/test_types.rb +0 -141
- data/test/test_weighted_value_resolver.rb +0 -84
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 57f0f18dd1441f5471db495f868e1f14444dc9836038dd181260ec5adeb48bd5
|
|
4
|
+
data.tar.gz: f4cab0b5a07924424163ea4c8148cc1f93752caea78d827bdc426e6463477a40
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6695efb0125ed9092bca70cbb3fb0edd1a6b115174c7d50e8aeb7f0148628e21883fba714caf0945b8fa22b6b22346d7cd09d5884cf30d61ce6de67caa097272
|
|
7
|
+
data.tar.gz: 9985c30b27ec8fba439e107ca7d4175809358c2e8e0d2fbd9c22db53b9dfa2bd4af6c1c35b413130ab4e53b0fe7a0a62f1c1584ddfd710ab2c526e71939480a5
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.0.11 - 2026-05-02
|
|
4
|
+
|
|
5
|
+
- **Fix (telemetry): SSE clientName attribution.** The SSE client was sending
|
|
6
|
+
`X-Quonfig-SDK-Version: sdk-ruby-<version>`, which the api-telemetry parser
|
|
7
|
+
splits on the first dash, so it landed as `clientName="sdk"`,
|
|
8
|
+
`clientVersion="ruby-<version>"`. Now sends `ruby-<version>` to match
|
|
9
|
+
`http_connection.rb`, so both transports attribute consistently as
|
|
10
|
+
`clientName="ruby"`.
|
|
11
|
+
- **Release plumbing: drop juwelier, tag-triggered publish.** The gem is now
|
|
12
|
+
built from a hand-written `quonfig.gemspec` that reads the version from
|
|
13
|
+
`Quonfig::VERSION` (in `lib/quonfig/version.rb`) and lists shipped files
|
|
14
|
+
explicitly. The `release.yml` workflow now fires on `v*` tag pushes, not
|
|
15
|
+
every successful main build, and refuses to publish unless the tag matches
|
|
16
|
+
`Quonfig::VERSION`. Together these eliminate the gemspec-vs-VERSION drift
|
|
17
|
+
that prevented the original 0.0.11 publish (gem built as 0.0.10 internally
|
|
18
|
+
while filename said 0.0.11) and the manifest-drift bug from qfg-e588.
|
|
19
|
+
|
|
3
20
|
## 0.0.10 - 2026-05-01
|
|
4
21
|
|
|
5
22
|
- **BREAKING (env): `QUONFIG_TELEMETRY_URL` and `QUONFIG_API_URLS` env vars
|
|
@@ -16,6 +33,15 @@
|
|
|
16
33
|
`telemetry_url:` kwarg (was previously documented but not wired up).
|
|
17
34
|
- **Default `api_urls` now includes secondary.** Was `[primary]`, now
|
|
18
35
|
`[primary, secondary]` to match every other SDK and provide failover.
|
|
36
|
+
- **Release plumbing: pre-publish smoke check (qfg-e588).** The Rakefile
|
|
37
|
+
`:release` task and the `release.yml` workflow now run
|
|
38
|
+
`scripts/smoke_check.sh` after `gem build` and before `gem push`. The
|
|
39
|
+
script installs the freshly built `.gem` into a sandbox `GEM_HOME` and
|
|
40
|
+
shells out to `ruby -rquonfig -e 'puts Quonfig::VERSION'`. If the
|
|
41
|
+
require fails or the version mismatches, the publish aborts. This is
|
|
42
|
+
the prevention measure for qfg-e588, where 0.0.9 was published with a
|
|
43
|
+
stale gemspec manifest missing `lib/quonfig/evaluation_details.rb` and
|
|
44
|
+
every consumer hit `LoadError` at install time.
|
|
19
45
|
|
|
20
46
|
## 0.0.8 - 2026-04-26
|
|
21
47
|
|
data/lib/quonfig.rb
CHANGED
data/quonfig.gemspec
CHANGED
|
@@ -1,171 +1,36 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: quonfig 0.0.10 ruby lib
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'lib/quonfig/version'
|
|
6
4
|
|
|
7
5
|
Gem::Specification.new do |s|
|
|
8
|
-
s.name
|
|
9
|
-
s.version
|
|
6
|
+
s.name = 'quonfig'
|
|
7
|
+
s.version = Quonfig::VERSION
|
|
8
|
+
s.authors = ['Jeff Dwyer']
|
|
9
|
+
s.email = 'jeff@quonfig.com'
|
|
10
|
+
s.summary = 'Quonfig Ruby SDK'
|
|
11
|
+
s.description = 'Quonfig — feature flags and live config, stored as files in git.'
|
|
12
|
+
s.homepage = 'https://github.com/quonfig/sdk-ruby'
|
|
13
|
+
s.license = 'MIT'
|
|
14
|
+
s.required_ruby_version = '>= 3.0'
|
|
10
15
|
|
|
11
|
-
s.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
s.email = "jeff@quonfig.com".freeze
|
|
17
|
-
s.extra_rdoc_files = [
|
|
18
|
-
"CHANGELOG.md",
|
|
19
|
-
"LICENSE.txt",
|
|
20
|
-
"README.md"
|
|
21
|
-
]
|
|
22
|
-
s.files = [
|
|
23
|
-
".claude/rules/constitution.md",
|
|
24
|
-
".claude/rules/git-safety.md",
|
|
25
|
-
".claude/rules/issue-tracking.md",
|
|
26
|
-
".claude/rules/testing-workflow.md",
|
|
27
|
-
".envrc.sample",
|
|
28
|
-
".github/CODEOWNERS",
|
|
29
|
-
".github/pull_request_template.md",
|
|
30
|
-
".github/workflows/release.yml",
|
|
31
|
-
".github/workflows/ruby.yml",
|
|
32
|
-
".github/workflows/test.yaml",
|
|
33
|
-
".rubocop.yml",
|
|
34
|
-
".tool-versions",
|
|
35
|
-
"CHANGELOG.md",
|
|
36
|
-
"CLAUDE.md",
|
|
37
|
-
"CODEOWNERS",
|
|
38
|
-
"Gemfile",
|
|
39
|
-
"Gemfile.lock",
|
|
40
|
-
"LICENSE.txt",
|
|
41
|
-
"README.md",
|
|
42
|
-
"Rakefile",
|
|
43
|
-
"VERSION",
|
|
44
|
-
"dev/allocation_stats",
|
|
45
|
-
"dev/benchmark",
|
|
46
|
-
"dev/console",
|
|
47
|
-
"dev/script_setup.rb",
|
|
48
|
-
"lib/quonfig.rb",
|
|
49
|
-
"lib/quonfig/bound_client.rb",
|
|
50
|
-
"lib/quonfig/caching_http_connection.rb",
|
|
51
|
-
"lib/quonfig/client.rb",
|
|
52
|
-
"lib/quonfig/config_envelope.rb",
|
|
53
|
-
"lib/quonfig/config_loader.rb",
|
|
54
|
-
"lib/quonfig/config_store.rb",
|
|
55
|
-
"lib/quonfig/context.rb",
|
|
56
|
-
"lib/quonfig/datadir.rb",
|
|
57
|
-
"lib/quonfig/dev_context.rb",
|
|
58
|
-
"lib/quonfig/duration.rb",
|
|
59
|
-
"lib/quonfig/encryption.rb",
|
|
60
|
-
"lib/quonfig/error.rb",
|
|
61
|
-
"lib/quonfig/errors/decryption_error.rb",
|
|
62
|
-
"lib/quonfig/errors/env_var_parse_error.rb",
|
|
63
|
-
"lib/quonfig/errors/initialization_timeout_error.rb",
|
|
64
|
-
"lib/quonfig/errors/invalid_environment_error.rb",
|
|
65
|
-
"lib/quonfig/errors/invalid_sdk_key_error.rb",
|
|
66
|
-
"lib/quonfig/errors/missing_default_error.rb",
|
|
67
|
-
"lib/quonfig/errors/missing_env_var_error.rb",
|
|
68
|
-
"lib/quonfig/errors/missing_environment_error.rb",
|
|
69
|
-
"lib/quonfig/errors/type_mismatch_error.rb",
|
|
70
|
-
"lib/quonfig/errors/uninitialized_error.rb",
|
|
71
|
-
"lib/quonfig/evaluation.rb",
|
|
72
|
-
"lib/quonfig/evaluation_details.rb",
|
|
73
|
-
"lib/quonfig/evaluator.rb",
|
|
74
|
-
"lib/quonfig/exponential_backoff.rb",
|
|
75
|
-
"lib/quonfig/fixed_size_hash.rb",
|
|
76
|
-
"lib/quonfig/http_connection.rb",
|
|
77
|
-
"lib/quonfig/internal_logger.rb",
|
|
78
|
-
"lib/quonfig/murmer3.rb",
|
|
79
|
-
"lib/quonfig/options.rb",
|
|
80
|
-
"lib/quonfig/periodic_sync.rb",
|
|
81
|
-
"lib/quonfig/quonfig.rb",
|
|
82
|
-
"lib/quonfig/rate_limit_cache.rb",
|
|
83
|
-
"lib/quonfig/reason.rb",
|
|
84
|
-
"lib/quonfig/resolver.rb",
|
|
85
|
-
"lib/quonfig/semantic_logger_filter.rb",
|
|
86
|
-
"lib/quonfig/semver.rb",
|
|
87
|
-
"lib/quonfig/sse_config_client.rb",
|
|
88
|
-
"lib/quonfig/stdlib_formatter.rb",
|
|
89
|
-
"lib/quonfig/telemetry/context_shape.rb",
|
|
90
|
-
"lib/quonfig/telemetry/context_shape_aggregator.rb",
|
|
91
|
-
"lib/quonfig/telemetry/evaluation_summaries_aggregator.rb",
|
|
92
|
-
"lib/quonfig/telemetry/example_contexts_aggregator.rb",
|
|
93
|
-
"lib/quonfig/telemetry/telemetry_reporter.rb",
|
|
94
|
-
"lib/quonfig/time_helpers.rb",
|
|
95
|
-
"lib/quonfig/types.rb",
|
|
96
|
-
"lib/quonfig/weighted_value_resolver.rb",
|
|
97
|
-
"quonfig.gemspec",
|
|
98
|
-
"test/fixtures/datafile.json",
|
|
99
|
-
"test/integration/test_context_precedence.rb",
|
|
100
|
-
"test/integration/test_datadir_environment.rb",
|
|
101
|
-
"test/integration/test_dev_overrides.rb",
|
|
102
|
-
"test/integration/test_enabled.rb",
|
|
103
|
-
"test/integration/test_enabled_with_contexts.rb",
|
|
104
|
-
"test/integration/test_get.rb",
|
|
105
|
-
"test/integration/test_get_feature_flag.rb",
|
|
106
|
-
"test/integration/test_get_or_raise.rb",
|
|
107
|
-
"test/integration/test_get_weighted_values.rb",
|
|
108
|
-
"test/integration/test_helpers.rb",
|
|
109
|
-
"test/integration/test_helpers_test.rb",
|
|
110
|
-
"test/integration/test_post.rb",
|
|
111
|
-
"test/integration/test_telemetry.rb",
|
|
112
|
-
"test/support/common_helpers.rb",
|
|
113
|
-
"test/support/mock_base_client.rb",
|
|
114
|
-
"test/support/mock_config_loader.rb",
|
|
115
|
-
"test/test_bound_client.rb",
|
|
116
|
-
"test/test_caching_http_connection.rb",
|
|
117
|
-
"test/test_client.rb",
|
|
118
|
-
"test/test_client_network_mode.rb",
|
|
119
|
-
"test/test_client_telemetry.rb",
|
|
120
|
-
"test/test_config_loader.rb",
|
|
121
|
-
"test/test_context.rb",
|
|
122
|
-
"test/test_context_shape.rb",
|
|
123
|
-
"test/test_context_shape_aggregator.rb",
|
|
124
|
-
"test/test_datadir.rb",
|
|
125
|
-
"test/test_details_getters.rb",
|
|
126
|
-
"test/test_dev_context.rb",
|
|
127
|
-
"test/test_duration.rb",
|
|
128
|
-
"test/test_encryption.rb",
|
|
129
|
-
"test/test_evaluation_summaries_aggregator.rb",
|
|
130
|
-
"test/test_evaluator.rb",
|
|
131
|
-
"test/test_example_contexts_aggregator.rb",
|
|
132
|
-
"test/test_exponential_backoff.rb",
|
|
133
|
-
"test/test_fixed_size_hash.rb",
|
|
134
|
-
"test/test_helper.rb",
|
|
135
|
-
"test/test_http_connection.rb",
|
|
136
|
-
"test/test_internal_logger.rb",
|
|
137
|
-
"test/test_options.rb",
|
|
138
|
-
"test/test_rate_limit_cache.rb",
|
|
139
|
-
"test/test_reason.rb",
|
|
140
|
-
"test/test_rename.rb",
|
|
141
|
-
"test/test_resolver.rb",
|
|
142
|
-
"test/test_semantic_logger_filter.rb",
|
|
143
|
-
"test/test_semver.rb",
|
|
144
|
-
"test/test_should_log.rb",
|
|
145
|
-
"test/test_sse_config_client.rb",
|
|
146
|
-
"test/test_stdlib_formatter.rb",
|
|
147
|
-
"test/test_telemetry_reporter.rb",
|
|
148
|
-
"test/test_typed_getters.rb",
|
|
149
|
-
"test/test_types.rb",
|
|
150
|
-
"test/test_weighted_value_resolver.rb"
|
|
151
|
-
]
|
|
152
|
-
s.homepage = "https://github.com/quonfig/sdk-ruby".freeze
|
|
153
|
-
s.licenses = ["MIT".freeze]
|
|
154
|
-
s.rubygems_version = "3.5.22".freeze
|
|
155
|
-
s.summary = "Quonfig Ruby SDK".freeze
|
|
16
|
+
s.metadata = {
|
|
17
|
+
'source_code_uri' => 'https://github.com/quonfig/sdk-ruby',
|
|
18
|
+
'changelog_uri' => 'https://github.com/quonfig/sdk-ruby/blob/main/CHANGELOG.md',
|
|
19
|
+
'rubygems_mfa_required' => 'true'
|
|
20
|
+
}
|
|
156
21
|
|
|
157
|
-
s.
|
|
22
|
+
s.require_paths = ['lib']
|
|
23
|
+
s.files = Dir['lib/**/*.rb'] + %w[
|
|
24
|
+
CHANGELOG.md
|
|
25
|
+
LICENSE.txt
|
|
26
|
+
README.md
|
|
27
|
+
quonfig.gemspec
|
|
28
|
+
]
|
|
29
|
+
s.extra_rdoc_files = %w[CHANGELOG.md LICENSE.txt README.md]
|
|
158
30
|
|
|
159
|
-
s.add_runtime_dependency
|
|
160
|
-
s.add_runtime_dependency
|
|
161
|
-
s.add_runtime_dependency
|
|
162
|
-
s.add_runtime_dependency
|
|
163
|
-
s.add_runtime_dependency
|
|
164
|
-
s.add_development_dependency(%q<allocation_stats>.freeze, [">= 0".freeze])
|
|
165
|
-
s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0".freeze])
|
|
166
|
-
s.add_development_dependency(%q<bundler>.freeze, [">= 0".freeze])
|
|
167
|
-
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9".freeze])
|
|
168
|
-
s.add_development_dependency(%q<rdoc>.freeze, [">= 0".freeze])
|
|
169
|
-
s.add_development_dependency(%q<simplecov>.freeze, [">= 0".freeze])
|
|
31
|
+
s.add_runtime_dependency 'activesupport', '>= 4'
|
|
32
|
+
s.add_runtime_dependency 'concurrent-ruby', '~> 1.0', '>= 1.0.5'
|
|
33
|
+
s.add_runtime_dependency 'faraday', '>= 1.0'
|
|
34
|
+
s.add_runtime_dependency 'ld-eventsource', '>= 2.0'
|
|
35
|
+
s.add_runtime_dependency 'uuid', '>= 2.0'
|
|
170
36
|
end
|
|
171
|
-
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: quonfig
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.11
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jeff Dwyer
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-05-
|
|
11
|
+
date: 2026-05-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: activesupport
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '4'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '4'
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: concurrent-ruby
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -36,140 +50,42 @@ dependencies:
|
|
|
36
50
|
requirements:
|
|
37
51
|
- - ">="
|
|
38
52
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '0'
|
|
53
|
+
version: '1.0'
|
|
40
54
|
type: :runtime
|
|
41
55
|
prerelease: false
|
|
42
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
43
57
|
requirements:
|
|
44
58
|
- - ">="
|
|
45
59
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '0'
|
|
60
|
+
version: '1.0'
|
|
47
61
|
- !ruby/object:Gem::Dependency
|
|
48
62
|
name: ld-eventsource
|
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
|
50
64
|
requirements:
|
|
51
65
|
- - ">="
|
|
52
66
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '0'
|
|
67
|
+
version: '2.0'
|
|
54
68
|
type: :runtime
|
|
55
69
|
prerelease: false
|
|
56
70
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
71
|
requirements:
|
|
58
72
|
- - ">="
|
|
59
73
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '0'
|
|
74
|
+
version: '2.0'
|
|
61
75
|
- !ruby/object:Gem::Dependency
|
|
62
76
|
name: uuid
|
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
|
64
78
|
requirements:
|
|
65
79
|
- - ">="
|
|
66
80
|
- !ruby/object:Gem::Version
|
|
67
|
-
version: '0'
|
|
68
|
-
type: :runtime
|
|
69
|
-
prerelease: false
|
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
71
|
-
requirements:
|
|
72
|
-
- - ">="
|
|
73
|
-
- !ruby/object:Gem::Version
|
|
74
|
-
version: '0'
|
|
75
|
-
- !ruby/object:Gem::Dependency
|
|
76
|
-
name: activesupport
|
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
|
78
|
-
requirements:
|
|
79
|
-
- - ">="
|
|
80
|
-
- !ruby/object:Gem::Version
|
|
81
|
-
version: '4'
|
|
81
|
+
version: '2.0'
|
|
82
82
|
type: :runtime
|
|
83
83
|
prerelease: false
|
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
|
85
85
|
requirements:
|
|
86
86
|
- - ">="
|
|
87
87
|
- !ruby/object:Gem::Version
|
|
88
|
-
version: '
|
|
89
|
-
- !ruby/object:Gem::Dependency
|
|
90
|
-
name: allocation_stats
|
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
|
92
|
-
requirements:
|
|
93
|
-
- - ">="
|
|
94
|
-
- !ruby/object:Gem::Version
|
|
95
|
-
version: '0'
|
|
96
|
-
type: :development
|
|
97
|
-
prerelease: false
|
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
99
|
-
requirements:
|
|
100
|
-
- - ">="
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0'
|
|
103
|
-
- !ruby/object:Gem::Dependency
|
|
104
|
-
name: benchmark-ips
|
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
|
106
|
-
requirements:
|
|
107
|
-
- - ">="
|
|
108
|
-
- !ruby/object:Gem::Version
|
|
109
|
-
version: '0'
|
|
110
|
-
type: :development
|
|
111
|
-
prerelease: false
|
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
113
|
-
requirements:
|
|
114
|
-
- - ">="
|
|
115
|
-
- !ruby/object:Gem::Version
|
|
116
|
-
version: '0'
|
|
117
|
-
- !ruby/object:Gem::Dependency
|
|
118
|
-
name: bundler
|
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
|
120
|
-
requirements:
|
|
121
|
-
- - ">="
|
|
122
|
-
- !ruby/object:Gem::Version
|
|
123
|
-
version: '0'
|
|
124
|
-
type: :development
|
|
125
|
-
prerelease: false
|
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
127
|
-
requirements:
|
|
128
|
-
- - ">="
|
|
129
|
-
- !ruby/object:Gem::Version
|
|
130
|
-
version: '0'
|
|
131
|
-
- !ruby/object:Gem::Dependency
|
|
132
|
-
name: juwelier
|
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
|
134
|
-
requirements:
|
|
135
|
-
- - "~>"
|
|
136
|
-
- !ruby/object:Gem::Version
|
|
137
|
-
version: 2.4.9
|
|
138
|
-
type: :development
|
|
139
|
-
prerelease: false
|
|
140
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
141
|
-
requirements:
|
|
142
|
-
- - "~>"
|
|
143
|
-
- !ruby/object:Gem::Version
|
|
144
|
-
version: 2.4.9
|
|
145
|
-
- !ruby/object:Gem::Dependency
|
|
146
|
-
name: rdoc
|
|
147
|
-
requirement: !ruby/object:Gem::Requirement
|
|
148
|
-
requirements:
|
|
149
|
-
- - ">="
|
|
150
|
-
- !ruby/object:Gem::Version
|
|
151
|
-
version: '0'
|
|
152
|
-
type: :development
|
|
153
|
-
prerelease: false
|
|
154
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
155
|
-
requirements:
|
|
156
|
-
- - ">="
|
|
157
|
-
- !ruby/object:Gem::Version
|
|
158
|
-
version: '0'
|
|
159
|
-
- !ruby/object:Gem::Dependency
|
|
160
|
-
name: simplecov
|
|
161
|
-
requirement: !ruby/object:Gem::Requirement
|
|
162
|
-
requirements:
|
|
163
|
-
- - ">="
|
|
164
|
-
- !ruby/object:Gem::Version
|
|
165
|
-
version: '0'
|
|
166
|
-
type: :development
|
|
167
|
-
prerelease: false
|
|
168
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
-
requirements:
|
|
170
|
-
- - ">="
|
|
171
|
-
- !ruby/object:Gem::Version
|
|
172
|
-
version: '0'
|
|
88
|
+
version: '2.0'
|
|
173
89
|
description: Quonfig — feature flags and live config, stored as files in git.
|
|
174
90
|
email: jeff@quonfig.com
|
|
175
91
|
executables: []
|
|
@@ -179,31 +95,9 @@ extra_rdoc_files:
|
|
|
179
95
|
- LICENSE.txt
|
|
180
96
|
- README.md
|
|
181
97
|
files:
|
|
182
|
-
- ".claude/rules/constitution.md"
|
|
183
|
-
- ".claude/rules/git-safety.md"
|
|
184
|
-
- ".claude/rules/issue-tracking.md"
|
|
185
|
-
- ".claude/rules/testing-workflow.md"
|
|
186
|
-
- ".envrc.sample"
|
|
187
|
-
- ".github/CODEOWNERS"
|
|
188
|
-
- ".github/pull_request_template.md"
|
|
189
|
-
- ".github/workflows/release.yml"
|
|
190
|
-
- ".github/workflows/ruby.yml"
|
|
191
|
-
- ".github/workflows/test.yaml"
|
|
192
|
-
- ".rubocop.yml"
|
|
193
|
-
- ".tool-versions"
|
|
194
98
|
- CHANGELOG.md
|
|
195
|
-
- CLAUDE.md
|
|
196
|
-
- CODEOWNERS
|
|
197
|
-
- Gemfile
|
|
198
|
-
- Gemfile.lock
|
|
199
99
|
- LICENSE.txt
|
|
200
100
|
- README.md
|
|
201
|
-
- Rakefile
|
|
202
|
-
- VERSION
|
|
203
|
-
- dev/allocation_stats
|
|
204
|
-
- dev/benchmark
|
|
205
|
-
- dev/console
|
|
206
|
-
- dev/script_setup.rb
|
|
207
101
|
- lib/quonfig.rb
|
|
208
102
|
- lib/quonfig/bound_client.rb
|
|
209
103
|
- lib/quonfig/caching_http_connection.rb
|
|
@@ -252,65 +146,16 @@ files:
|
|
|
252
146
|
- lib/quonfig/telemetry/telemetry_reporter.rb
|
|
253
147
|
- lib/quonfig/time_helpers.rb
|
|
254
148
|
- lib/quonfig/types.rb
|
|
149
|
+
- lib/quonfig/version.rb
|
|
255
150
|
- lib/quonfig/weighted_value_resolver.rb
|
|
256
151
|
- quonfig.gemspec
|
|
257
|
-
- test/fixtures/datafile.json
|
|
258
|
-
- test/integration/test_context_precedence.rb
|
|
259
|
-
- test/integration/test_datadir_environment.rb
|
|
260
|
-
- test/integration/test_dev_overrides.rb
|
|
261
|
-
- test/integration/test_enabled.rb
|
|
262
|
-
- test/integration/test_enabled_with_contexts.rb
|
|
263
|
-
- test/integration/test_get.rb
|
|
264
|
-
- test/integration/test_get_feature_flag.rb
|
|
265
|
-
- test/integration/test_get_or_raise.rb
|
|
266
|
-
- test/integration/test_get_weighted_values.rb
|
|
267
|
-
- test/integration/test_helpers.rb
|
|
268
|
-
- test/integration/test_helpers_test.rb
|
|
269
|
-
- test/integration/test_post.rb
|
|
270
|
-
- test/integration/test_telemetry.rb
|
|
271
|
-
- test/support/common_helpers.rb
|
|
272
|
-
- test/support/mock_base_client.rb
|
|
273
|
-
- test/support/mock_config_loader.rb
|
|
274
|
-
- test/test_bound_client.rb
|
|
275
|
-
- test/test_caching_http_connection.rb
|
|
276
|
-
- test/test_client.rb
|
|
277
|
-
- test/test_client_network_mode.rb
|
|
278
|
-
- test/test_client_telemetry.rb
|
|
279
|
-
- test/test_config_loader.rb
|
|
280
|
-
- test/test_context.rb
|
|
281
|
-
- test/test_context_shape.rb
|
|
282
|
-
- test/test_context_shape_aggregator.rb
|
|
283
|
-
- test/test_datadir.rb
|
|
284
|
-
- test/test_details_getters.rb
|
|
285
|
-
- test/test_dev_context.rb
|
|
286
|
-
- test/test_duration.rb
|
|
287
|
-
- test/test_encryption.rb
|
|
288
|
-
- test/test_evaluation_summaries_aggregator.rb
|
|
289
|
-
- test/test_evaluator.rb
|
|
290
|
-
- test/test_example_contexts_aggregator.rb
|
|
291
|
-
- test/test_exponential_backoff.rb
|
|
292
|
-
- test/test_fixed_size_hash.rb
|
|
293
|
-
- test/test_helper.rb
|
|
294
|
-
- test/test_http_connection.rb
|
|
295
|
-
- test/test_internal_logger.rb
|
|
296
|
-
- test/test_options.rb
|
|
297
|
-
- test/test_rate_limit_cache.rb
|
|
298
|
-
- test/test_reason.rb
|
|
299
|
-
- test/test_rename.rb
|
|
300
|
-
- test/test_resolver.rb
|
|
301
|
-
- test/test_semantic_logger_filter.rb
|
|
302
|
-
- test/test_semver.rb
|
|
303
|
-
- test/test_should_log.rb
|
|
304
|
-
- test/test_sse_config_client.rb
|
|
305
|
-
- test/test_stdlib_formatter.rb
|
|
306
|
-
- test/test_telemetry_reporter.rb
|
|
307
|
-
- test/test_typed_getters.rb
|
|
308
|
-
- test/test_types.rb
|
|
309
|
-
- test/test_weighted_value_resolver.rb
|
|
310
152
|
homepage: https://github.com/quonfig/sdk-ruby
|
|
311
153
|
licenses:
|
|
312
154
|
- MIT
|
|
313
|
-
metadata:
|
|
155
|
+
metadata:
|
|
156
|
+
source_code_uri: https://github.com/quonfig/sdk-ruby
|
|
157
|
+
changelog_uri: https://github.com/quonfig/sdk-ruby/blob/main/CHANGELOG.md
|
|
158
|
+
rubygems_mfa_required: 'true'
|
|
314
159
|
post_install_message:
|
|
315
160
|
rdoc_options: []
|
|
316
161
|
require_paths:
|
|
@@ -319,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
319
164
|
requirements:
|
|
320
165
|
- - ">="
|
|
321
166
|
- !ruby/object:Gem::Version
|
|
322
|
-
version: '0'
|
|
167
|
+
version: '3.0'
|
|
323
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
324
169
|
requirements:
|
|
325
170
|
- - ">="
|
|
@@ -1,81 +0,0 @@
|
|
|
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
|
data/.claude/rules/git-safety.md
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
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.
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|