decision_agent 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +0 -0
  3. data/README.md +3 -2
  4. data/lib/decision_agent/ab_testing/ab_test.rb +0 -0
  5. data/lib/decision_agent/ab_testing/ab_test_assignment.rb +0 -0
  6. data/lib/decision_agent/ab_testing/ab_test_manager.rb +0 -0
  7. data/lib/decision_agent/ab_testing/ab_testing_agent.rb +0 -0
  8. data/lib/decision_agent/ab_testing/storage/activerecord_adapter.rb +0 -3
  9. data/lib/decision_agent/ab_testing/storage/adapter.rb +0 -0
  10. data/lib/decision_agent/ab_testing/storage/memory_adapter.rb +0 -0
  11. data/lib/decision_agent/agent.rb +0 -0
  12. data/lib/decision_agent/audit/adapter.rb +0 -0
  13. data/lib/decision_agent/audit/logger_adapter.rb +0 -0
  14. data/lib/decision_agent/audit/null_adapter.rb +0 -0
  15. data/lib/decision_agent/auth/access_audit_logger.rb +0 -0
  16. data/lib/decision_agent/auth/authenticator.rb +0 -0
  17. data/lib/decision_agent/auth/password_reset_manager.rb +0 -0
  18. data/lib/decision_agent/auth/password_reset_token.rb +0 -0
  19. data/lib/decision_agent/auth/permission.rb +0 -0
  20. data/lib/decision_agent/auth/permission_checker.rb +0 -0
  21. data/lib/decision_agent/auth/rbac_adapter.rb +0 -0
  22. data/lib/decision_agent/auth/rbac_config.rb +0 -0
  23. data/lib/decision_agent/auth/role.rb +0 -0
  24. data/lib/decision_agent/auth/session.rb +0 -0
  25. data/lib/decision_agent/auth/session_manager.rb +0 -0
  26. data/lib/decision_agent/auth/user.rb +0 -0
  27. data/lib/decision_agent/context.rb +0 -0
  28. data/lib/decision_agent/decision.rb +0 -0
  29. data/lib/decision_agent/dmn/adapter.rb +0 -0
  30. data/lib/decision_agent/dmn/cache.rb +0 -0
  31. data/lib/decision_agent/dmn/decision_graph.rb +0 -0
  32. data/lib/decision_agent/dmn/decision_tree.rb +0 -0
  33. data/lib/decision_agent/dmn/errors.rb +0 -0
  34. data/lib/decision_agent/dmn/exporter.rb +41 -2
  35. data/lib/decision_agent/dmn/feel/evaluator.rb +0 -4
  36. data/lib/decision_agent/dmn/feel/functions.rb +0 -0
  37. data/lib/decision_agent/dmn/feel/parser.rb +0 -0
  38. data/lib/decision_agent/dmn/feel/simple_parser.rb +0 -0
  39. data/lib/decision_agent/dmn/feel/transformer.rb +0 -0
  40. data/lib/decision_agent/dmn/feel/types.rb +0 -0
  41. data/lib/decision_agent/dmn/importer.rb +0 -0
  42. data/lib/decision_agent/dmn/model.rb +0 -0
  43. data/lib/decision_agent/dmn/parser.rb +0 -0
  44. data/lib/decision_agent/dmn/testing.rb +0 -4
  45. data/lib/decision_agent/dmn/validator.rb +3 -7
  46. data/lib/decision_agent/dmn/versioning.rb +41 -15
  47. data/lib/decision_agent/dmn/visualizer.rb +0 -0
  48. data/lib/decision_agent/dsl/condition_evaluator.rb +0 -0
  49. data/lib/decision_agent/dsl/helpers/cache_helpers.rb +0 -0
  50. data/lib/decision_agent/dsl/helpers/comparison_helpers.rb +0 -0
  51. data/lib/decision_agent/dsl/helpers/date_helpers.rb +0 -0
  52. data/lib/decision_agent/dsl/helpers/geospatial_helpers.rb +0 -0
  53. data/lib/decision_agent/dsl/helpers/operator_evaluation_helpers.rb +0 -0
  54. data/lib/decision_agent/dsl/helpers/parameter_parsing_helpers.rb +0 -0
  55. data/lib/decision_agent/dsl/helpers/template_helpers.rb +0 -0
  56. data/lib/decision_agent/dsl/helpers/utility_helpers.rb +0 -0
  57. data/lib/decision_agent/dsl/operators/base.rb +2 -2
  58. data/lib/decision_agent/dsl/operators/basic_comparison_operators.rb +0 -0
  59. data/lib/decision_agent/dsl/operators/collection_operators.rb +0 -0
  60. data/lib/decision_agent/dsl/operators/date_arithmetic_operators.rb +0 -0
  61. data/lib/decision_agent/dsl/operators/date_time_operators.rb +1 -1
  62. data/lib/decision_agent/dsl/operators/duration_operators.rb +0 -0
  63. data/lib/decision_agent/dsl/operators/financial_operators.rb +0 -0
  64. data/lib/decision_agent/dsl/operators/geospatial_operators.rb +0 -0
  65. data/lib/decision_agent/dsl/operators/mathematical_operators.rb +0 -0
  66. data/lib/decision_agent/dsl/operators/moving_window_operators.rb +0 -0
  67. data/lib/decision_agent/dsl/operators/numeric_operators.rb +0 -0
  68. data/lib/decision_agent/dsl/operators/rate_operators.rb +0 -0
  69. data/lib/decision_agent/dsl/operators/statistical_aggregations.rb +0 -0
  70. data/lib/decision_agent/dsl/operators/string_aggregations.rb +0 -0
  71. data/lib/decision_agent/dsl/operators/string_operators.rb +0 -0
  72. data/lib/decision_agent/dsl/operators/time_component_operators.rb +0 -0
  73. data/lib/decision_agent/dsl/rule_parser.rb +0 -0
  74. data/lib/decision_agent/dsl/schema_validator.rb +0 -0
  75. data/lib/decision_agent/errors.rb +0 -0
  76. data/lib/decision_agent/evaluation.rb +0 -0
  77. data/lib/decision_agent/evaluation_validator.rb +0 -0
  78. data/lib/decision_agent/evaluators/base.rb +0 -0
  79. data/lib/decision_agent/evaluators/dmn_evaluator.rb +0 -0
  80. data/lib/decision_agent/evaluators/json_rule_evaluator.rb +26 -24
  81. data/lib/decision_agent/evaluators/static_evaluator.rb +0 -0
  82. data/lib/decision_agent/explainability/condition_trace.rb +0 -0
  83. data/lib/decision_agent/explainability/explainability_result.rb +0 -0
  84. data/lib/decision_agent/explainability/rule_trace.rb +0 -0
  85. data/lib/decision_agent/explainability/trace_collector.rb +0 -0
  86. data/lib/decision_agent/monitoring/alert_manager.rb +0 -0
  87. data/lib/decision_agent/monitoring/dashboard/public/dashboard.css +0 -0
  88. data/lib/decision_agent/monitoring/dashboard/public/dashboard.js +0 -0
  89. data/lib/decision_agent/monitoring/dashboard/public/index.html +0 -0
  90. data/lib/decision_agent/monitoring/dashboard_server.rb +0 -0
  91. data/lib/decision_agent/monitoring/metrics_collector.rb +0 -0
  92. data/lib/decision_agent/monitoring/monitored_agent.rb +0 -0
  93. data/lib/decision_agent/monitoring/prometheus_exporter.rb +0 -0
  94. data/lib/decision_agent/monitoring/storage/activerecord_adapter.rb +0 -0
  95. data/lib/decision_agent/monitoring/storage/base_adapter.rb +0 -0
  96. data/lib/decision_agent/monitoring/storage/memory_adapter.rb +1 -1
  97. data/lib/decision_agent/replay/replay.rb +0 -0
  98. data/lib/decision_agent/scoring/base.rb +0 -0
  99. data/lib/decision_agent/scoring/consensus.rb +0 -0
  100. data/lib/decision_agent/scoring/max_weight.rb +0 -0
  101. data/lib/decision_agent/scoring/threshold.rb +0 -0
  102. data/lib/decision_agent/scoring/weighted_average.rb +0 -0
  103. data/lib/decision_agent/simulation/errors.rb +0 -0
  104. data/lib/decision_agent/simulation/impact_analyzer.rb +0 -2
  105. data/lib/decision_agent/simulation/monte_carlo_simulator.rb +0 -2
  106. data/lib/decision_agent/simulation/replay_engine.rb +0 -2
  107. data/lib/decision_agent/simulation/scenario_engine.rb +0 -0
  108. data/lib/decision_agent/simulation/scenario_library.rb +0 -0
  109. data/lib/decision_agent/simulation/shadow_test_engine.rb +0 -0
  110. data/lib/decision_agent/simulation/what_if_analyzer.rb +0 -2
  111. data/lib/decision_agent/simulation.rb +0 -0
  112. data/lib/decision_agent/testing/batch_test_importer.rb +0 -4
  113. data/lib/decision_agent/testing/batch_test_runner.rb +0 -2
  114. data/lib/decision_agent/testing/test_coverage_analyzer.rb +0 -0
  115. data/lib/decision_agent/testing/test_result_comparator.rb +54 -63
  116. data/lib/decision_agent/testing/test_scenario.rb +0 -0
  117. data/lib/decision_agent/version.rb +1 -1
  118. data/lib/decision_agent/versioning/activerecord_adapter.rb +64 -2
  119. data/lib/decision_agent/versioning/adapter.rb +33 -0
  120. data/lib/decision_agent/versioning/file_storage_adapter.rb +77 -7
  121. data/lib/decision_agent/versioning/version_manager.rb +40 -2
  122. data/lib/decision_agent/web/dmn_editor/serialization.rb +0 -0
  123. data/lib/decision_agent/web/dmn_editor/xml_builder.rb +0 -0
  124. data/lib/decision_agent/web/dmn_editor.rb +0 -6
  125. data/lib/decision_agent/web/middleware/auth_middleware.rb +0 -0
  126. data/lib/decision_agent/web/middleware/permission_middleware.rb +0 -0
  127. data/lib/decision_agent/web/public/app.js +0 -0
  128. data/lib/decision_agent/web/public/batch_testing.html +0 -0
  129. data/lib/decision_agent/web/public/dmn-editor.css +0 -0
  130. data/lib/decision_agent/web/public/dmn-editor.html +0 -0
  131. data/lib/decision_agent/web/public/dmn-editor.js +5 -0
  132. data/lib/decision_agent/web/public/index.html +0 -0
  133. data/lib/decision_agent/web/public/login.html +0 -0
  134. data/lib/decision_agent/web/public/sample_batch.csv +0 -0
  135. data/lib/decision_agent/web/public/sample_impact.csv +0 -0
  136. data/lib/decision_agent/web/public/sample_replay.csv +0 -0
  137. data/lib/decision_agent/web/public/sample_rules.json +0 -0
  138. data/lib/decision_agent/web/public/sample_shadow.csv +0 -0
  139. data/lib/decision_agent/web/public/sample_whatif.csv +0 -0
  140. data/lib/decision_agent/web/public/simulation.html +0 -0
  141. data/lib/decision_agent/web/public/simulation_impact.html +0 -0
  142. data/lib/decision_agent/web/public/simulation_replay.html +0 -0
  143. data/lib/decision_agent/web/public/simulation_shadow.html +0 -0
  144. data/lib/decision_agent/web/public/simulation_whatif.html +0 -0
  145. data/lib/decision_agent/web/public/styles.css +0 -0
  146. data/lib/decision_agent/web/public/users.html +0 -0
  147. data/lib/decision_agent/web/rack_helpers.rb +0 -0
  148. data/lib/decision_agent/web/rack_request_helpers.rb +0 -0
  149. data/lib/decision_agent/web/server.rb +8 -2
  150. data/lib/decision_agent.rb +0 -0
  151. data/lib/generators/decision_agent/install/install_generator.rb +0 -0
  152. data/lib/generators/decision_agent/install/templates/README +0 -0
  153. data/lib/generators/decision_agent/install/templates/ab_test_assignment_model.rb +0 -0
  154. data/lib/generators/decision_agent/install/templates/ab_test_model.rb +0 -0
  155. data/lib/generators/decision_agent/install/templates/ab_testing_migration.rb +0 -0
  156. data/lib/generators/decision_agent/install/templates/ab_testing_tasks.rake +0 -0
  157. data/lib/generators/decision_agent/install/templates/decision_agent_tasks.rake +0 -0
  158. data/lib/generators/decision_agent/install/templates/decision_log.rb +0 -0
  159. data/lib/generators/decision_agent/install/templates/error_metric.rb +0 -0
  160. data/lib/generators/decision_agent/install/templates/evaluation_metric.rb +0 -0
  161. data/lib/generators/decision_agent/install/templates/migration.rb +14 -0
  162. data/lib/generators/decision_agent/install/templates/monitoring_migration.rb +0 -2
  163. data/lib/generators/decision_agent/install/templates/performance_metric.rb +0 -0
  164. data/lib/generators/decision_agent/install/templates/rule.rb +0 -0
  165. data/lib/generators/decision_agent/install/templates/rule_version.rb +0 -0
  166. data/lib/generators/decision_agent/install/templates/rule_version_tag.rb +23 -0
  167. data/lib/generators/decision_agent/install/templates/versioning_migration.rb +44 -0
  168. data/lib/generators/decision_agent/monitoring_migration/monitoring_migration_generator.rb +67 -0
  169. data/lib/generators/decision_agent/versioning_migration/versioning_migration_generator.rb +57 -0
  170. metadata +10 -3
File without changes
File without changes
File without changes
File without changes
@@ -216,6 +216,11 @@ function renderModelEditor() {
216
216
  async function addDecision(e) {
217
217
  e.preventDefault();
218
218
 
219
+ if (!state.currentModel) {
220
+ showNotification('Please select or create a model first', 'error');
221
+ return;
222
+ }
223
+
219
224
  const decisionId = document.getElementById('decision-id-input').value;
220
225
  const name = document.getElementById('decision-name-input').value;
221
226
  const type = document.getElementById('decision-type-select').value;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -46,7 +46,6 @@ require_relative "../versioning/version_manager"
46
46
 
47
47
  module DecisionAgent
48
48
  module Web
49
- # rubocop:disable Metrics/ClassLength
50
49
  # Framework-agnostic Rack application - works with any Rack-compatible server
51
50
  class Server
52
51
  include RackHelpers
@@ -1210,6 +1209,14 @@ module DecisionAgent
1210
1209
  filename = file_param[:filename] || file_param["filename"] || "uploaded_file"
1211
1210
  file_extension = File.extname(filename).downcase
1212
1211
 
1212
+ # Validate file type before processing
1213
+ allowed_extensions = %w[.csv .xlsx .xls]
1214
+ unless allowed_extensions.include?(file_extension)
1215
+ ctx.status(422)
1216
+ ctx.json({ error: "Unsupported file type '#{file_extension}'. Allowed types: .csv, .xlsx, .xls" })
1217
+ next
1218
+ end
1219
+
1213
1220
  # Create temporary file
1214
1221
  temp_file = Tempfile.new(["batch_test", file_extension])
1215
1222
  temp_file.binmode
@@ -2493,6 +2500,5 @@ module DecisionAgent
2493
2500
  )
2494
2501
  end
2495
2502
  end
2496
- # rubocop:enable Metrics/ClassLength
2497
2503
  end
2498
2504
  end
File without changes
@@ -35,5 +35,19 @@ class CreateDecisionAgentTables < ActiveRecord::Migration[7.0]
35
35
  # unique: true,
36
36
  # where: "status = 'active'",
37
37
  # name: 'index_rule_versions_one_active_per_rule'
38
+
39
+ # Version tags table — named pointers to specific versions (unique per model + name)
40
+ # NOTE: version_id is intentionally NOT a foreign key so tags survive version deletion
41
+ create_table :rule_version_tags do |t|
42
+ t.string :model_id, null: false
43
+ t.string :name, null: false
44
+ t.bigint :version_id, null: false
45
+ t.timestamps
46
+ end
47
+
48
+ # ✅ CRITICAL: Unique constraint — one tag name per model
49
+ add_index :rule_version_tags, %i[model_id name], unique: true
50
+ # Index for efficient tag listing per model
51
+ add_index :rule_version_tags, :model_id
38
52
  end
39
53
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class CreateDecisionAgentMonitoringTables < ActiveRecord::Migration[7.0]
4
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
5
4
  def change
6
5
  # Decision logs table
7
6
  create_table :decision_logs do |t|
@@ -105,5 +104,4 @@ class CreateDecisionAgentMonitoringTables < ActiveRecord::Migration[7.0]
105
104
  # PARTITION BY RANGE (created_at);
106
105
  # SQL
107
106
  end
108
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
109
107
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Stores named tags that point to a specific RuleVersion.
4
+ # A tag is a mutable pointer (re-pointing updates the existing row) but
5
+ # the content of the target version is immutable.
6
+ #
7
+ # version_id is stored as a plain integer without a foreign-key constraint
8
+ # so that tags survive the deletion of the version they originally pointed to.
9
+ class RuleVersionTag < ApplicationRecord
10
+ validates :model_id, presence: true
11
+ validates :name, presence: true
12
+ validates :version_id, presence: true
13
+ validates :name, uniqueness: { scope: :model_id, message: "already exists for this model" }
14
+
15
+ scope :for_model, ->(model_id) { where(model_id: model_id) }
16
+ scope :sorted_by_name, -> { order(name: :asc) }
17
+
18
+ # Resolve the version this tag currently points to.
19
+ # Returns nil if the version has been deleted.
20
+ def version
21
+ RuleVersion.find_by(id: version_id)
22
+ end
23
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateDecisionAgentVersioningTables < ActiveRecord::Migration[7.0]
4
+ def change
5
+ # Rule versions table — stores the full content of each version as JSON
6
+ create_table :rule_versions do |t|
7
+ t.string :rule_id, null: false, index: true
8
+ t.integer :version_number, null: false
9
+ t.text :content, null: false # JSON rule definition
10
+ t.string :created_by, null: false, default: "system"
11
+ t.text :changelog
12
+ t.string :status, null: false, default: "draft" # draft, active, archived
13
+ t.timestamps
14
+ end
15
+
16
+ # ✅ CRITICAL: Unique constraint prevents duplicate version numbers per rule.
17
+ # This protects against race conditions in concurrent version creation.
18
+ add_index :rule_versions, %i[rule_id version_number], unique: true
19
+
20
+ # Index for efficient queries by rule_id and status
21
+ add_index :rule_versions, %i[rule_id status]
22
+
23
+ # Optional: Partial unique index for PostgreSQL to enforce one active version per rule
24
+ # Uncomment if using PostgreSQL:
25
+ # add_index :rule_versions, [:rule_id, :status],
26
+ # unique: true,
27
+ # where: "status = 'active'",
28
+ # name: 'index_rule_versions_one_active_per_rule'
29
+
30
+ # Version tags table — named pointers to specific versions (unique per model + name).
31
+ # version_id is intentionally NOT a foreign key so tags survive version deletion.
32
+ create_table :rule_version_tags do |t|
33
+ t.string :model_id, null: false
34
+ t.string :name, null: false
35
+ t.bigint :version_id, null: false
36
+ t.timestamps
37
+ end
38
+
39
+ # ✅ CRITICAL: Unique constraint — one tag name per model
40
+ add_index :rule_version_tags, %i[model_id name], unique: true
41
+ # Index for efficient tag listing per model
42
+ add_index :rule_version_tags, :model_id
43
+ end
44
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "rails/generators/migration"
5
+
6
+ module DecisionAgent
7
+ module Generators
8
+ # Standalone generator that installs only the monitoring tables and models.
9
+ #
10
+ # Usage:
11
+ # rails generate decision_agent:monitoring_migration
12
+ #
13
+ # This is a focused alternative to the full install generator's --monitoring
14
+ # flag. It generates:
15
+ # - db/migrate/create_decision_agent_monitoring_tables.rb
16
+ # - app/models/decision_log.rb
17
+ # - app/models/evaluation_metric.rb
18
+ # - app/models/performance_metric.rb
19
+ # - app/models/error_metric.rb
20
+ # - lib/tasks/decision_agent.rake
21
+ class MonitoringMigrationGenerator < Rails::Generators::Base
22
+ include Rails::Generators::Migration
23
+
24
+ source_root File.expand_path("../../install/templates", __dir__)
25
+
26
+ desc "Generates the DecisionAgent monitoring migration and ActiveRecord models"
27
+
28
+ def self.next_migration_number(dirname)
29
+ next_migration_number = current_migration_number(dirname) + 1
30
+ ActiveRecord::Migration.next_migration_number(next_migration_number)
31
+ end
32
+
33
+ def copy_migration
34
+ migration_template "monitoring_migration.rb",
35
+ "db/migrate/create_decision_agent_monitoring_tables.rb",
36
+ migration_version: migration_version
37
+ end
38
+
39
+ def copy_models
40
+ copy_file "decision_log.rb", "app/models/decision_log.rb"
41
+ copy_file "evaluation_metric.rb", "app/models/evaluation_metric.rb"
42
+ copy_file "performance_metric.rb", "app/models/performance_metric.rb"
43
+ copy_file "error_metric.rb", "app/models/error_metric.rb"
44
+ end
45
+
46
+ def copy_rake_tasks
47
+ copy_file "decision_agent_tasks.rake", "lib/tasks/decision_agent.rake"
48
+ end
49
+
50
+ def show_readme
51
+ say "\n"
52
+ say "DecisionAgent monitoring tables generated successfully!", :green
53
+ say "\nNext steps:"
54
+ say " 1. Run migrations: rails db:migrate"
55
+ say " 2. Verify models: DecisionLog, EvaluationMetric, PerformanceMetric, ErrorMetric"
56
+ say " 3. Use the adapter: DecisionAgent::Monitoring::Storage::ActiveRecordAdapter.new"
57
+ say "\nSee docs/PERSISTENT_MONITORING.md for configuration and query examples."
58
+ end
59
+
60
+ private
61
+
62
+ def migration_version
63
+ "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "rails/generators/migration"
5
+
6
+ module DecisionAgent
7
+ module Generators
8
+ # Standalone generator that installs only the versioning tables and models.
9
+ #
10
+ # Usage:
11
+ # rails generate decision_agent:versioning_migration
12
+ #
13
+ # This is a focused alternative to the full install generator. It generates:
14
+ # - db/migrate/create_decision_agent_versioning_tables.rb
15
+ # - app/models/rule_version.rb
16
+ # - app/models/rule_version_tag.rb
17
+ class VersioningMigrationGenerator < Rails::Generators::Base
18
+ include Rails::Generators::Migration
19
+
20
+ source_root File.expand_path("../../install/templates", __dir__)
21
+
22
+ desc "Generates the DecisionAgent versioning migration and ActiveRecord models"
23
+
24
+ def self.next_migration_number(dirname)
25
+ next_migration_number = current_migration_number(dirname) + 1
26
+ ActiveRecord::Migration.next_migration_number(next_migration_number)
27
+ end
28
+
29
+ def copy_migration
30
+ migration_template "versioning_migration.rb",
31
+ "db/migrate/create_decision_agent_versioning_tables.rb",
32
+ migration_version: migration_version
33
+ end
34
+
35
+ def copy_models
36
+ copy_file "rule_version.rb", "app/models/rule_version.rb"
37
+ copy_file "rule_version_tag.rb", "app/models/rule_version_tag.rb"
38
+ end
39
+
40
+ def show_readme
41
+ say "\n"
42
+ say "DecisionAgent versioning tables generated successfully!", :green
43
+ say "\nNext steps:"
44
+ say " 1. Run migrations: rails db:migrate"
45
+ say " 2. Verify models: RuleVersion, RuleVersionTag"
46
+ say " 3. Use the adapter: DecisionAgent::Versioning::ActiveRecordAdapter.new"
47
+ say "\nSee docs/VERSIONING.md for configuration and usage examples."
48
+ end
49
+
50
+ private
51
+
52
+ def migration_version
53
+ "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
54
+ end
55
+ end
56
+ end
57
+ end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decision_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Aswin
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-04-10 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: bcrypt
@@ -372,6 +373,10 @@ files:
372
373
  - lib/generators/decision_agent/install/templates/performance_metric.rb
373
374
  - lib/generators/decision_agent/install/templates/rule.rb
374
375
  - lib/generators/decision_agent/install/templates/rule_version.rb
376
+ - lib/generators/decision_agent/install/templates/rule_version_tag.rb
377
+ - lib/generators/decision_agent/install/templates/versioning_migration.rb
378
+ - lib/generators/decision_agent/monitoring_migration/monitoring_migration_generator.rb
379
+ - lib/generators/decision_agent/versioning_migration/versioning_migration_generator.rb
375
380
  homepage: https://github.com/samaswin/decision_agent
376
381
  licenses:
377
382
  - MIT
@@ -381,6 +386,7 @@ metadata:
381
386
  changelog_uri: https://github.com/samaswin/decision_agent/blob/main/docs/CHANGELOG.md
382
387
  github_repo: https://github.com/samaswin/decision_agent
383
388
  rubygems_mfa_required: 'true'
389
+ post_install_message:
384
390
  rdoc_options: []
385
391
  require_paths:
386
392
  - lib
@@ -395,7 +401,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
395
401
  - !ruby/object:Gem::Version
396
402
  version: '0'
397
403
  requirements: []
398
- rubygems_version: 4.0.3
404
+ rubygems_version: 3.5.16
405
+ signing_key:
399
406
  specification_version: 4
400
407
  summary: Deterministic, explainable, auditable decision engine for Ruby
401
408
  test_files: []