rodauth-tools 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +93 -0
  3. data/.gitlint +9 -0
  4. data/.markdownlint-cli2.jsonc +26 -0
  5. data/.pre-commit-config.yaml +46 -0
  6. data/.rubocop.yml +18 -0
  7. data/.rubocop_todo.yml +243 -0
  8. data/CHANGELOG.md +81 -0
  9. data/CLAUDE.md +262 -0
  10. data/CODE_OF_CONDUCT.md +132 -0
  11. data/CONTRIBUTING.md +111 -0
  12. data/Gemfile +35 -0
  13. data/Gemfile.lock +356 -0
  14. data/LICENSE.txt +21 -0
  15. data/README.md +339 -0
  16. data/Rakefile +8 -0
  17. data/lib/rodauth/features/external_identity.rb +946 -0
  18. data/lib/rodauth/features/hmac_secret_guard.rb +119 -0
  19. data/lib/rodauth/features/jwt_secret_guard.rb +120 -0
  20. data/lib/rodauth/features/table_guard.rb +937 -0
  21. data/lib/rodauth/sequel_generator.rb +531 -0
  22. data/lib/rodauth/table_inspector.rb +124 -0
  23. data/lib/rodauth/template_inspector.rb +134 -0
  24. data/lib/rodauth/tools/console_helpers.rb +158 -0
  25. data/lib/rodauth/tools/migration/sequel/account_expiration.erb +9 -0
  26. data/lib/rodauth/tools/migration/sequel/active_sessions.erb +10 -0
  27. data/lib/rodauth/tools/migration/sequel/audit_logging.erb +12 -0
  28. data/lib/rodauth/tools/migration/sequel/base.erb +41 -0
  29. data/lib/rodauth/tools/migration/sequel/disallow_password_reuse.erb +8 -0
  30. data/lib/rodauth/tools/migration/sequel/email_auth.erb +17 -0
  31. data/lib/rodauth/tools/migration/sequel/jwt_refresh.erb +18 -0
  32. data/lib/rodauth/tools/migration/sequel/lockout.erb +21 -0
  33. data/lib/rodauth/tools/migration/sequel/otp.erb +9 -0
  34. data/lib/rodauth/tools/migration/sequel/otp_unlock.erb +8 -0
  35. data/lib/rodauth/tools/migration/sequel/password_expiration.erb +7 -0
  36. data/lib/rodauth/tools/migration/sequel/recovery_codes.erb +8 -0
  37. data/lib/rodauth/tools/migration/sequel/remember.erb +16 -0
  38. data/lib/rodauth/tools/migration/sequel/reset_password.erb +17 -0
  39. data/lib/rodauth/tools/migration/sequel/single_session.erb +7 -0
  40. data/lib/rodauth/tools/migration/sequel/sms_codes.erb +10 -0
  41. data/lib/rodauth/tools/migration/sequel/verify_account.erb +9 -0
  42. data/lib/rodauth/tools/migration/sequel/verify_login_change.erb +17 -0
  43. data/lib/rodauth/tools/migration/sequel/webauthn.erb +15 -0
  44. data/lib/rodauth/tools/migration.rb +188 -0
  45. data/lib/rodauth/tools/version.rb +9 -0
  46. data/lib/rodauth/tools.rb +29 -0
  47. data/package-lock.json +500 -0
  48. data/package.json +11 -0
  49. data/rodauth-tools.gemspec +40 -0
  50. metadata +136 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 49ed411752d1850001a89d8be7260feef6e8b4dae04547100d75bde5c80d1afd
4
+ data.tar.gz: ce7e4e431d01a64f4e6a8f1847795a1df7caa529895b0aa12568543668aaca71
5
+ SHA512:
6
+ metadata.gz: 76cec388e98fb42c5413d25ac99ee8db3351db79f6c68c57abee7049286738b7242b0afa0527bc3c1df2066d002c667687d6089fc54a20a1a3df5553d52ffee8
7
+ data.tar.gz: 3eface17b5e1d077bb93498c793af35d9554d9e42bf72511eb7c9569ad84fd5a2cfaf7eee84c9c91b9af5d9672ef111bee01e1bd5dbe65c4434b76df3e10c845
data/.gitignore ADDED
@@ -0,0 +1,93 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ # Globs
14
+ *.env
15
+ *.log
16
+ *.rdb
17
+ *.txt
18
+ *.rdoc
19
+ .*.json
20
+ .byebug*
21
+ .ruby-version
22
+ spoom_*
23
+ .commit_hash.txt
24
+ *.sublime-*
25
+ .yardoc
26
+ npm-debug.log*
27
+ yarn-debug.log*
28
+ yarn-error.log*
29
+ pnpm-debug.log*
30
+
31
+ # Directories
32
+ .certs/
33
+ .claude
34
+ .continue/
35
+ .devcontainer
36
+ .history
37
+ .pnpm/
38
+ .pnpm-store/
39
+ .prompts/
40
+ .prompts*
41
+ .pytest_cache/
42
+ .ruby-lsp/
43
+ .serena
44
+ .vscode/
45
+ .idea/
46
+ .cache/
47
+ .temp/
48
+ .zed/
49
+ .appendonlydir/
50
+ .bundle/
51
+ .rspec
52
+ .rspec_status
53
+ appendonlydir/
54
+ data/
55
+ doc/
56
+ node_modules/
57
+ vendor/
58
+ log/
59
+ tmp/
60
+ coverage/
61
+ dist/
62
+ public/web/dist/
63
+ public/doc
64
+ !tests/data
65
+
66
+ # Files
67
+ .DS_Store
68
+ !.pr_agent.toml
69
+ .github/*md
70
+ .eslintcache
71
+ .claude
72
+ .rspec*
73
+ .qodo
74
+ .continuerc.json
75
+ .mcp.json
76
+ bin/bundle
77
+ bin/rspec
78
+ bin/rubocop
79
+ !fly.toml
80
+ support/schemas/
81
+ tsconfig.tsbuildinfo
82
+ *.db
83
+
84
+
85
+ # Environment files
86
+ .env*
87
+ !.env.example
88
+
89
+ # Playwright paths
90
+ test-results/
91
+ playwright-report/
92
+ blob-report/
93
+ playwright/.cache/
data/.gitlint ADDED
@@ -0,0 +1,9 @@
1
+ [general]
2
+ ignore=body-is-missing
3
+ contrib=contrib-title-conventional-commits
4
+
5
+ [title-max-length]
6
+ line-length=72
7
+
8
+ [contrib-title-conventional-commits]
9
+ types=feat,fix,docs,style,refactor,perf,test,build,ci,chore,revert
@@ -0,0 +1,26 @@
1
+ // Configuration for markdownlint-cli2
2
+ {
3
+ // Markdownlint rules configuration
4
+ "config": {
5
+ "default": true,
6
+ "MD003": { "style": "atx" },
7
+ "MD004": { "style": "dash" },
8
+ "MD007": { "indent": 2 },
9
+ "MD009": { "br_spaces": 2 },
10
+ "MD013": false,
11
+ "MD024": { "siblings_only": true },
12
+ "MD025": true,
13
+ "MD033": false,
14
+ "MD041": false,
15
+ "MD046": { "style": "fenced" },
16
+ "MD048": { "style": "backtick" },
17
+ },
18
+
19
+ // Automatically fix violations when possible
20
+ "fix": true,
21
+
22
+ // Files/directories to ignore
23
+ // Note: When run via pre-commit, only staged files are checked.
24
+ // The globs pattern is not needed as pre-commit passes filenames automatically.
25
+ "ignores": ["node_modules", ".serena"],
26
+ }
@@ -0,0 +1,46 @@
1
+ # See https://pre-commit.com for more information
2
+ # See https://pre-commit.com/hooks.html for more hooks
3
+ repos:
4
+ # General file checks
5
+ - repo: https://github.com/pre-commit/pre-commit-hooks
6
+ rev: v5.0.0
7
+ hooks:
8
+ - id: trailing-whitespace
9
+ args: [--markdown-linebreak-ext=md]
10
+ - id: end-of-file-fixer
11
+ - id: check-yaml
12
+ - id: check-added-large-files
13
+ args: [--maxkb=500]
14
+ - id: check-merge-conflict
15
+ - id: check-case-conflict
16
+ - id: mixed-line-ending
17
+ args: [--fix=lf]
18
+ - id: detect-private-key
19
+
20
+ # Security checks
21
+ - repo: local
22
+ hooks:
23
+ - id: bundler-audit
24
+ name: bundler-audit
25
+ entry: bash -c 'eval "$(rbenv init - bash)" && bundle exec bundler-audit "$@"' --
26
+ language: system
27
+ args: [--update]
28
+ types: [ruby]
29
+ pass_filenames: false
30
+
31
+ # Markdown linting
32
+ - repo: https://github.com/DavidAnson/markdownlint-cli2
33
+ rev: v0.18.1
34
+ hooks:
35
+ - id: markdownlint-cli2
36
+ args: [--fix, --config, .markdownlint-cli2.jsonc]
37
+
38
+ # Commit message checks
39
+ #
40
+ # Prefix must be one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore
41
+ #
42
+ - repo: https://github.com/jorisroovers/gitlint
43
+ rev: v0.19.1
44
+ hooks:
45
+ - id: gitlint
46
+ stages: [commit-msg]
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ # .rubocop.yml
4
+
5
+ plugins:
6
+ - rubocop-rake
7
+ - rubocop-rspec
8
+
9
+ AllCops:
10
+ TargetRubyVersion: 3.2
11
+ NewCops: enable
12
+ SuggestExtensions: false
13
+
14
+ Style/StringLiterals:
15
+ EnforcedStyle: single_quotes
16
+
17
+ Style/StringLiteralsInInterpolation:
18
+ EnforcedStyle: double_quotes
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,243 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2025-11-25 21:51:07 UTC using RuboCop version 1.81.7.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 4
10
+ # Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches, IgnoreDuplicateElseBranch.
11
+ Lint/DuplicateBranch:
12
+ Exclude:
13
+ - 'lib/rodauth/sequel_generator.rb'
14
+
15
+ # Offense count: 1
16
+ Lint/NoReturnInBeginEndBlocks:
17
+ Exclude:
18
+ - 'lib/rodauth/features/external_identity.rb'
19
+
20
+ # Offense count: 6
21
+ # This cop supports unsafe autocorrection (--autocorrect-all).
22
+ # Configuration parameters: AllowedMethods, InferNonNilReceiver, AdditionalNilMethods.
23
+ # AllowedMethods: instance_of?, kind_of?, is_a?, eql?, respond_to?, equal?
24
+ # AdditionalNilMethods: present?, blank?, try, try!
25
+ Lint/RedundantSafeNavigation:
26
+ Exclude:
27
+ - 'lib/rodauth/features/table_guard.rb'
28
+
29
+ # Offense count: 2
30
+ # This cop supports safe autocorrection (--autocorrect).
31
+ # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods, NotImplementedExceptions.
32
+ # NotImplementedExceptions: NotImplementedError
33
+ Lint/UnusedMethodArgument:
34
+ Exclude:
35
+ - 'lib/rodauth/sequel_generator.rb'
36
+
37
+ # Offense count: 1
38
+ # This cop supports unsafe autocorrection (--autocorrect-all).
39
+ Lint/UselessMethodDefinition:
40
+ Exclude:
41
+ - 'lib/rodauth/features/table_guard.rb'
42
+
43
+ # Offense count: 21
44
+ # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
45
+ Metrics/AbcSize:
46
+ Max: 87
47
+
48
+ # Offense count: 5
49
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
50
+ # AllowedMethods: refine
51
+ Metrics/BlockLength:
52
+ Max: 509
53
+
54
+ # Offense count: 1
55
+ # Configuration parameters: CountComments, CountAsOne.
56
+ Metrics/ClassLength:
57
+ Max: 289
58
+
59
+ # Offense count: 10
60
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
61
+ Metrics/CyclomaticComplexity:
62
+ Max: 22
63
+
64
+ # Offense count: 41
65
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
66
+ Metrics/MethodLength:
67
+ Max: 64
68
+
69
+ # Offense count: 3
70
+ # Configuration parameters: CountComments, CountAsOne.
71
+ Metrics/ModuleLength:
72
+ Max: 511
73
+
74
+ # Offense count: 10
75
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
76
+ Metrics/PerceivedComplexity:
77
+ Max: 18
78
+
79
+ # Offense count: 2
80
+ Naming/AccessorMethodName:
81
+ Exclude:
82
+ - 'lib/rodauth/features/table_guard.rb'
83
+ - 'lib/rodauth/template_inspector.rb'
84
+
85
+ # Offense count: 2
86
+ # Configuration parameters: Mode, AllowedMethods, AllowedPatterns, AllowBangMethods, WaywardPredicates.
87
+ # AllowedMethods: call
88
+ # WaywardPredicates: nonzero?
89
+ Naming/PredicateMethod:
90
+ Exclude:
91
+ - 'lib/rodauth/features/external_identity.rb'
92
+
93
+ # Offense count: 9
94
+ # Configuration parameters: Prefixes, AllowedPatterns.
95
+ # Prefixes: when, with, without
96
+ RSpec/ContextWording:
97
+ Exclude:
98
+ - 'spec/rodauth/features/external_identity/external_identity_spec.rb'
99
+
100
+ # Offense count: 5
101
+ # Configuration parameters: IgnoredMetadata.
102
+ RSpec/DescribeClass:
103
+ Exclude:
104
+ - '**/spec/features/**/*'
105
+ - '**/spec/requests/**/*'
106
+ - '**/spec/routing/**/*'
107
+ - '**/spec/system/**/*'
108
+ - '**/spec/views/**/*'
109
+ - 'spec/rodauth/features/external_identity/external_identity_spec.rb'
110
+ - 'spec/rodauth/features/external_identity_autocreate_integration_spec.rb'
111
+ - 'spec/rodauth/features/table_guard/table_guard_integration_spec.rb'
112
+ - 'spec/rodauth/features/table_guard/table_guard_simple_spec.rb'
113
+ - 'spec/rodauth/features/table_guard/table_guard_spec.rb'
114
+
115
+ # Offense count: 58
116
+ # This cop supports unsafe autocorrection (--autocorrect-all).
117
+ RSpec/EmptyExampleGroup:
118
+ Exclude:
119
+ - 'spec/rodauth/features/table_guard/table_guard_spec.rb'
120
+ - 'spec/rodauth/sequel_generator_spec.rb'
121
+ - 'spec/rodauth/table_inspector_spec.rb'
122
+ - 'spec/rodauth/tools/console_helpers_spec.rb'
123
+
124
+ # Offense count: 180
125
+ # Configuration parameters: CountAsOne.
126
+ RSpec/ExampleLength:
127
+ Max: 34
128
+
129
+ # Offense count: 72
130
+ RSpec/MultipleExpectations:
131
+ Max: 8
132
+
133
+ # Offense count: 1
134
+ # Configuration parameters: CustomTransform, IgnoreMethods, IgnoreMetadata, InflectorPath, EnforcedInflector.
135
+ # SupportedInflectors: default, active_support
136
+ RSpec/SpecFilePathFormat:
137
+ Exclude:
138
+ - '**/spec/routing/**/*'
139
+ - 'spec/rodauth/rack_spec.rb'
140
+
141
+ # Offense count: 1
142
+ Security/Eval:
143
+ Exclude:
144
+ - 'lib/rodauth/tools/migration.rb'
145
+
146
+ # Offense count: 1
147
+ Style/DocumentDynamicEvalDefinition:
148
+ Exclude:
149
+ - 'lib/rodauth/tools/migration.rb'
150
+
151
+ # Offense count: 4
152
+ # Configuration parameters: AllowedConstants.
153
+ Style/Documentation:
154
+ Exclude:
155
+ - 'spec/**/*'
156
+ - 'test/**/*'
157
+ - 'lib/rodauth/features/external_identity.rb'
158
+ - 'lib/rodauth/features/hmac_secret_guard.rb'
159
+ - 'lib/rodauth/features/jwt_secret_guard.rb'
160
+ - 'lib/rodauth/features/table_guard.rb'
161
+
162
+ # Offense count: 1
163
+ # This cop supports unsafe autocorrection (--autocorrect-all).
164
+ # Configuration parameters: AllowedReceivers.
165
+ # AllowedReceivers: Thread.current
166
+ Style/HashEachMethods:
167
+ Exclude:
168
+ - 'lib/rodauth/features/external_identity.rb'
169
+
170
+ # Offense count: 5
171
+ # This cop supports safe autocorrection (--autocorrect).
172
+ Style/IfUnlessModifier:
173
+ Exclude:
174
+ - 'lib/rodauth/features/external_identity.rb'
175
+ - 'lib/rodauth/features/table_guard.rb'
176
+ - 'lib/rodauth/sequel_generator.rb'
177
+
178
+ # Offense count: 8
179
+ Style/MultilineBlockChain:
180
+ Exclude:
181
+ - 'spec/rodauth/features/external_identity/external_identity_spec.rb'
182
+ - 'spec/rodauth/features/external_identity_autocreate_integration_spec.rb'
183
+ - 'spec/rodauth/features/hmac_secret_guard/hmac_secret_guard_spec.rb'
184
+ - 'spec/rodauth/features/jwt_secret_guard/jwt_secret_guard_spec.rb'
185
+ - 'spec/rodauth/features/table_guard/table_guard_integration_spec.rb'
186
+ - 'spec/rodauth/features/table_guard/table_guard_simple_spec.rb'
187
+
188
+ # Offense count: 3
189
+ # This cop supports unsafe autocorrection (--autocorrect-all).
190
+ # Configuration parameters: EnforcedStyle, AllowedMethods, AllowedPatterns.
191
+ # SupportedStyles: predicate, comparison
192
+ Style/NumericPredicate:
193
+ Exclude:
194
+ - 'spec/**/*'
195
+ - 'lib/rodauth/features/table_guard.rb'
196
+
197
+ # Offense count: 5
198
+ # This cop supports unsafe autocorrection (--autocorrect-all).
199
+ # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
200
+ # AllowedMethods: present?, blank?, presence, try, try!
201
+ Style/SafeNavigation:
202
+ Exclude:
203
+ - 'spec/rodauth/features/external_identity/external_identity_spec.rb'
204
+ - 'spec/rodauth/features/external_identity_autocreate_integration_spec.rb'
205
+ - 'spec/rodauth/features/hmac_secret_guard/hmac_secret_guard_spec.rb'
206
+ - 'spec/rodauth/features/jwt_secret_guard/jwt_secret_guard_spec.rb'
207
+ - 'spec/rodauth/features/table_guard/table_guard_simple_spec.rb'
208
+
209
+ # Offense count: 1
210
+ # This cop supports unsafe autocorrection (--autocorrect-all).
211
+ Style/SingleArgumentDig:
212
+ Exclude:
213
+ - 'lib/rodauth/features/external_identity.rb'
214
+
215
+ # Offense count: 5
216
+ # This cop supports unsafe autocorrection (--autocorrect-all).
217
+ # Configuration parameters: Mode.
218
+ Style/StringConcatenation:
219
+ Exclude:
220
+ - 'examples/sinatra-table-guard/app.rb'
221
+ - 'examples/sinatra-table-guard/console.rb'
222
+ - 'lib/rodauth/sequel_generator.rb'
223
+
224
+ # Offense count: 60
225
+ # This cop supports unsafe autocorrection (--autocorrect-all).
226
+ # Configuration parameters: AllowMethodsWithArguments, AllowedMethods, AllowedPatterns, AllowComments.
227
+ # AllowedMethods: define_method
228
+ Style/SymbolProc:
229
+ Exclude:
230
+ - 'spec/rodauth/features/external_identity/external_identity_spec.rb'
231
+ - 'spec/rodauth/features/external_identity_autocreate_integration_spec.rb'
232
+ - 'spec/rodauth/features/hmac_secret_guard/hmac_secret_guard_spec.rb'
233
+ - 'spec/rodauth/features/jwt_secret_guard/jwt_secret_guard_spec.rb'
234
+ - 'spec/rodauth/features/table_guard/table_guard_integration_spec.rb'
235
+ - 'spec/rodauth/features/table_guard/table_guard_simple_spec.rb'
236
+ - 'try/features/external_identity_try.rb'
237
+
238
+ # Offense count: 3
239
+ # This cop supports safe autocorrection (--autocorrect).
240
+ # Configuration parameters: AllowHeredoc, AllowURI, AllowQualifiedName, URISchemes, IgnoreCopDirectives, AllowedPatterns, SplitStrings.
241
+ # URISchemes: http, https
242
+ Layout/LineLength:
243
+ Max: 170
data/CHANGELOG.md ADDED
@@ -0,0 +1,81 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.3.0] - 2025-11-25
9
+
10
+ ### Added
11
+
12
+ - **External Identity Layer 2 API** - Extended configuration options for external identity columns:
13
+ - `before_create_account` callback for auto-generating IDs during account creation
14
+ - `formatter` for normalizing values before storage
15
+ - `validator` for validating values before storage
16
+ - `verifier` for checking external service connectivity
17
+ - `handshake` for OAuth state verification flows
18
+ - **TemplateInspector module** - Extracts table names directly from ERB templates to solve the "hidden tables" problem where templates create tables without corresponding `*_table` methods
19
+ - **SequelGenerator** - Generates Sequel migration code for missing Rodauth tables with:
20
+ - ALTER TABLE support for adding missing columns
21
+ - Integration with TemplateInspector for complete table discovery
22
+ - Sequel column options support (types, constraints)
23
+ - **Table Guard column-level tracking** - Validates both tables AND columns exist for enabled features
24
+ - Comprehensive test coverage for new features
25
+
26
+ ### Changed
27
+
28
+ - ERB templates now aligned with Rodauth README Sequel examples
29
+ - Removed hardcoded feature mappings from TableInspector in favor of dynamic discovery
30
+ - File headers standardized with path comments and `frozen_string_literal`
31
+
32
+ ### Fixed
33
+
34
+ - DROP statement generation now uses TemplateInspector for complete table list
35
+ - `account_select` override behavior corrected for external identity columns
36
+ - Column type mapping for Class constants in migrations
37
+
38
+ ## [0.2.0] - 2025-10-28
39
+
40
+ ### Changed
41
+
42
+ - Reordered features in README.md by common use case (table_guard first)
43
+ - Improved project status messaging and clarified this is a reference implementation
44
+ - Enhanced installation instructions with multiple options
45
+ - Updated documentation cross-references and fixed broken links
46
+ - Improved example documentation with expected output and learning outcomes
47
+
48
+ ### Added
49
+
50
+ - Quick Start section to README.md showing immediate value
51
+ - CHANGELOG.md to track project changes
52
+ - Expected output examples in sinatra-table-guard documentation
53
+ - Detailed "What you'll learn" sections in examples
54
+
55
+ ### Fixed
56
+
57
+ - Broken link from `docs/integration.md` to `docs/rodauth-integration.md`
58
+ - Missing context about project purpose and use cases
59
+
60
+ ## [0.1.0] - 2025-10-15
61
+
62
+ ### Added
63
+
64
+ - Table Guard feature for database table validation
65
+ - External Identity feature for tracking external service IDs
66
+ - HMAC Secret Guard feature for automatic secret validation
67
+ - JWT Secret Guard feature for automatic JWT secret validation
68
+ - Sequel migration generator for 19 Rodauth features
69
+ - Interactive console with helper methods
70
+ - Comprehensive test suite with RSpec
71
+ - Documentation for all features
72
+ - Sinatra example application
73
+
74
+ ### Changed
75
+
76
+ - Namespace changed from `Rodauth::Rack::Generators::Migration` to `Rodauth::Tools::Migration`
77
+ - Evolution from Rack adapter to framework-agnostic utilities
78
+
79
+ [0.3.0]: https://github.com/delano/rodauth-tools/compare/v0.2.0...v0.3.0
80
+ [0.2.0]: https://github.com/delano/rodauth-tools/compare/v0.1.0...v0.2.0
81
+ [0.1.0]: https://github.com/delano/rodauth-tools/releases/tag/v0.1.0