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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/lib/quonfig/sse_config_client.rb +1 -1
  4. data/lib/quonfig/version.rb +5 -0
  5. data/lib/quonfig.rb +2 -1
  6. data/quonfig.gemspec +30 -165
  7. metadata +28 -183
  8. data/.claude/rules/constitution.md +0 -81
  9. data/.claude/rules/git-safety.md +0 -11
  10. data/.claude/rules/issue-tracking.md +0 -13
  11. data/.claude/rules/testing-workflow.md +0 -28
  12. data/.envrc.sample +0 -3
  13. data/.github/CODEOWNERS +0 -2
  14. data/.github/pull_request_template.md +0 -8
  15. data/.github/workflows/release.yml +0 -49
  16. data/.github/workflows/ruby.yml +0 -60
  17. data/.github/workflows/test.yaml +0 -40
  18. data/.rubocop.yml +0 -13
  19. data/.tool-versions +0 -1
  20. data/CLAUDE.md +0 -29
  21. data/CODEOWNERS +0 -1
  22. data/Gemfile +0 -26
  23. data/Gemfile.lock +0 -177
  24. data/Rakefile +0 -64
  25. data/VERSION +0 -1
  26. data/dev/allocation_stats +0 -60
  27. data/dev/benchmark +0 -40
  28. data/dev/console +0 -12
  29. data/dev/script_setup.rb +0 -18
  30. data/test/fixtures/datafile.json +0 -87
  31. data/test/integration/test_context_precedence.rb +0 -112
  32. data/test/integration/test_datadir_environment.rb +0 -54
  33. data/test/integration/test_dev_overrides.rb +0 -40
  34. data/test/integration/test_enabled.rb +0 -478
  35. data/test/integration/test_enabled_with_contexts.rb +0 -64
  36. data/test/integration/test_get.rb +0 -136
  37. data/test/integration/test_get_feature_flag.rb +0 -28
  38. data/test/integration/test_get_or_raise.rb +0 -60
  39. data/test/integration/test_get_weighted_values.rb +0 -34
  40. data/test/integration/test_helpers.rb +0 -667
  41. data/test/integration/test_helpers_test.rb +0 -73
  42. data/test/integration/test_post.rb +0 -44
  43. data/test/integration/test_telemetry.rb +0 -170
  44. data/test/support/common_helpers.rb +0 -106
  45. data/test/support/mock_base_client.rb +0 -27
  46. data/test/support/mock_config_loader.rb +0 -1
  47. data/test/test_bound_client.rb +0 -109
  48. data/test/test_caching_http_connection.rb +0 -218
  49. data/test/test_client.rb +0 -255
  50. data/test/test_client_network_mode.rb +0 -136
  51. data/test/test_client_telemetry.rb +0 -175
  52. data/test/test_config_loader.rb +0 -70
  53. data/test/test_context.rb +0 -139
  54. data/test/test_context_shape.rb +0 -37
  55. data/test/test_context_shape_aggregator.rb +0 -126
  56. data/test/test_datadir.rb +0 -203
  57. data/test/test_details_getters.rb +0 -242
  58. data/test/test_dev_context.rb +0 -163
  59. data/test/test_duration.rb +0 -37
  60. data/test/test_encryption.rb +0 -16
  61. data/test/test_evaluation_summaries_aggregator.rb +0 -180
  62. data/test/test_evaluator.rb +0 -285
  63. data/test/test_example_contexts_aggregator.rb +0 -119
  64. data/test/test_exponential_backoff.rb +0 -44
  65. data/test/test_fixed_size_hash.rb +0 -119
  66. data/test/test_helper.rb +0 -17
  67. data/test/test_http_connection.rb +0 -81
  68. data/test/test_internal_logger.rb +0 -34
  69. data/test/test_options.rb +0 -198
  70. data/test/test_rate_limit_cache.rb +0 -44
  71. data/test/test_reason.rb +0 -79
  72. data/test/test_rename.rb +0 -65
  73. data/test/test_resolver.rb +0 -291
  74. data/test/test_semantic_logger_filter.rb +0 -144
  75. data/test/test_semver.rb +0 -108
  76. data/test/test_should_log.rb +0 -186
  77. data/test/test_sse_config_client.rb +0 -297
  78. data/test/test_stdlib_formatter.rb +0 -195
  79. data/test/test_telemetry_reporter.rb +0 -209
  80. data/test/test_typed_getters.rb +0 -131
  81. data/test/test_types.rb +0 -141
  82. data/test/test_weighted_value_resolver.rb +0 -84
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 94866b65b3e3c4e834897981847da01f350984b2f7126f8259318ba385b8fd77
4
- data.tar.gz: bc173a4300c1475f596921de2a2d24e02e5de648503318491a602c19123dd329
3
+ metadata.gz: 57f0f18dd1441f5471db495f868e1f14444dc9836038dd181260ec5adeb48bd5
4
+ data.tar.gz: f4cab0b5a07924424163ea4c8148cc1f93752caea78d827bdc426e6463477a40
5
5
  SHA512:
6
- metadata.gz: 875265c218e5a465abced6d47563ef7c86ade61ca2d98367059bc800dec55e1148badf58e60b632e468ab565ef5ec80e587b8f0fd045f5300b000f64fe12b909
7
- data.tar.gz: 6725f7b13ac6ba43d0e7903963c5de4b1bbe03f1ae7e51399e4d0cc8877f6ee637ef2850e396e65c8d5c44cac2ee7cfa0b2f1724d390d43746d421d7e465c42a
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
 
@@ -119,7 +119,7 @@ module Quonfig
119
119
  return {
120
120
  'Authorization' => "Basic #{auth_string}",
121
121
  'Accept' => 'text/event-stream',
122
- 'X-Quonfig-SDK-Version' => "sdk-ruby-#{Quonfig::VERSION}"
122
+ 'X-Quonfig-SDK-Version' => "ruby-#{Quonfig::VERSION}"
123
123
  }
124
124
  end
125
125
 
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Quonfig
4
+ VERSION = '0.0.11'
5
+ end
data/lib/quonfig.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'quonfig/version'
4
+
3
5
  module Quonfig
4
6
  NO_DEFAULT_PROVIDED = :no_default_provided
5
- VERSION = File.read(File.dirname(__FILE__) + '/../VERSION').strip
6
7
  end
7
8
 
8
9
  begin
data/quonfig.gemspec CHANGED
@@ -1,171 +1,36 @@
1
- # Generated by juwelier
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
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 = "quonfig".freeze
9
- s.version = "0.0.10".freeze
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.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib".freeze]
13
- s.authors = ["Jeff Dwyer".freeze]
14
- s.date = "2026-05-01"
15
- s.description = "Quonfig \u2014 feature flags and live config, stored as files in git.".freeze
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.specification_version = 4
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(%q<concurrent-ruby>.freeze, ["~> 1.0".freeze, ">= 1.0.5".freeze])
160
- s.add_runtime_dependency(%q<faraday>.freeze, [">= 0".freeze])
161
- s.add_runtime_dependency(%q<ld-eventsource>.freeze, [">= 0".freeze])
162
- s.add_runtime_dependency(%q<uuid>.freeze, [">= 0".freeze])
163
- s.add_runtime_dependency(%q<activesupport>.freeze, [">= 4".freeze])
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.10
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-01 00:00:00.000000000 Z
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: '4'
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
@@ -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