reanimator 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +207 -0
- data/LICENSE.txt +21 -0
- data/README.md +483 -0
- data/SECURITY.md +32 -0
- data/exe/reanimator +6 -0
- data/lib/reanimator/acceptance_criterion.rb +75 -0
- data/lib/reanimator/agent_connection.rb +62 -0
- data/lib/reanimator/agent_profile.rb +51 -0
- data/lib/reanimator/agents/adapter.rb +49 -0
- data/lib/reanimator/agents/capability.rb +29 -0
- data/lib/reanimator/agents/constraints.rb +57 -0
- data/lib/reanimator/agents/hosted.rb +38 -0
- data/lib/reanimator/agents/local.rb +46 -0
- data/lib/reanimator/agents/patch.rb +60 -0
- data/lib/reanimator/agents/repair_task.rb +51 -0
- data/lib/reanimator/agents/result.rb +42 -0
- data/lib/reanimator/agents/strategies/arithmetic_fix.rb +51 -0
- data/lib/reanimator/agents/strategies/base.rb +26 -0
- data/lib/reanimator/agents.rb +38 -0
- data/lib/reanimator/autonomy_level.rb +41 -0
- data/lib/reanimator/baseline.rb +106 -0
- data/lib/reanimator/baseline_runner.rb +81 -0
- data/lib/reanimator/bounded_command.rb +87 -0
- data/lib/reanimator/classifier.rb +89 -0
- data/lib/reanimator/cli.rb +273 -0
- data/lib/reanimator/cohort.rb +61 -0
- data/lib/reanimator/commissioning/fixture.rb +69 -0
- data/lib/reanimator/commissioning/report.rb +45 -0
- data/lib/reanimator/commissioning/test.rb +145 -0
- data/lib/reanimator/confidence.rb +66 -0
- data/lib/reanimator/configuration.rb +35 -0
- data/lib/reanimator/contract_file.rb +116 -0
- data/lib/reanimator/contract_snapshot.rb +188 -0
- data/lib/reanimator/criteria_stack.rb +91 -0
- data/lib/reanimator/criterion_result.rb +70 -0
- data/lib/reanimator/detectors/base.rb +49 -0
- data/lib/reanimator/detectors/bundler.rb +68 -0
- data/lib/reanimator/detectors/commands.rb +112 -0
- data/lib/reanimator/detectors/fork.rb +25 -0
- data/lib/reanimator/detectors/github_actions.rb +68 -0
- data/lib/reanimator/detectors/operational_proof.rb +48 -0
- data/lib/reanimator/detectors/rails_app.rb +51 -0
- data/lib/reanimator/detectors/relationships.rb +46 -0
- data/lib/reanimator/detectors/ruby_gem.rb +40 -0
- data/lib/reanimator/detectors/security_controls.rb +36 -0
- data/lib/reanimator/discovered_fact.rb +99 -0
- data/lib/reanimator/discovery.rb +48 -0
- data/lib/reanimator/discovery_result.rb +89 -0
- data/lib/reanimator/drift_detector.rb +227 -0
- data/lib/reanimator/drift_report.rb +86 -0
- data/lib/reanimator/effective_contract.rb +108 -0
- data/lib/reanimator/effective_policy_resolver.rb +116 -0
- data/lib/reanimator/errors.rb +21 -0
- data/lib/reanimator/evaluators/base.rb +55 -0
- data/lib/reanimator/evaluators/command.rb +34 -0
- data/lib/reanimator/evaluators/documentation_check.rb +25 -0
- data/lib/reanimator/evaluators/http_smoke.rb +19 -0
- data/lib/reanimator/evaluators/repository_integrity.rb +22 -0
- data/lib/reanimator/evaluators/security_evidence.rb +24 -0
- data/lib/reanimator/evaluators/support_matrix.rb +25 -0
- data/lib/reanimator/evaluators.rb +41 -0
- data/lib/reanimator/family/gate.rb +40 -0
- data/lib/reanimator/family/gate_result.rb +46 -0
- data/lib/reanimator/family/gate_runner.rb +91 -0
- data/lib/reanimator/family.rb +89 -0
- data/lib/reanimator/family_inference.rb +113 -0
- data/lib/reanimator/git.rb +72 -0
- data/lib/reanimator/isolation.rb +36 -0
- data/lib/reanimator/language_inference.rb +43 -0
- data/lib/reanimator/lifecycle_intent.rb +93 -0
- data/lib/reanimator/obligation.rb +35 -0
- data/lib/reanimator/permission_model.rb +61 -0
- data/lib/reanimator/portfolio.rb +68 -0
- data/lib/reanimator/portfolio_drift.rb +120 -0
- data/lib/reanimator/profile_inference.rb +37 -0
- data/lib/reanimator/profiles.rb +110 -0
- data/lib/reanimator/proof_of_life.rb +45 -0
- data/lib/reanimator/proposed_change.rb +55 -0
- data/lib/reanimator/provenance.rb +39 -0
- data/lib/reanimator/relationship.rb +62 -0
- data/lib/reanimator/repair_run.rb +146 -0
- data/lib/reanimator/reports/agents.rb +28 -0
- data/lib/reanimator/reports/baseline.rb +73 -0
- data/lib/reanimator/reports/commissioning.rb +48 -0
- data/lib/reanimator/reports/contract.rb +70 -0
- data/lib/reanimator/reports/discovery.rb +38 -0
- data/lib/reanimator/reports/drift.rb +63 -0
- data/lib/reanimator/reports/families.rb +41 -0
- data/lib/reanimator/reports/family_gates.rb +41 -0
- data/lib/reanimator/reports/github_check.rb +45 -0
- data/lib/reanimator/reports/inventory.rb +37 -0
- data/lib/reanimator/reports/permissions.rb +32 -0
- data/lib/reanimator/reports/portfolio_baseline.rb +68 -0
- data/lib/reanimator/reports/portfolio_drift.rb +107 -0
- data/lib/reanimator/reports/run.rb +52 -0
- data/lib/reanimator/reports/snapshot.rb +58 -0
- data/lib/reanimator/reports.rb +36 -0
- data/lib/reanimator/repository.rb +96 -0
- data/lib/reanimator/repository_metadata.rb +78 -0
- data/lib/reanimator/repository_state.rb +48 -0
- data/lib/reanimator/routing/decision.rb +35 -0
- data/lib/reanimator/routing/router.rb +122 -0
- data/lib/reanimator/run.rb +48 -0
- data/lib/reanimator/safety_floor.rb +81 -0
- data/lib/reanimator/security_control.rb +87 -0
- data/lib/reanimator/security_posture.rb +80 -0
- data/lib/reanimator/snapshot_store.rb +78 -0
- data/lib/reanimator/task_class.rb +63 -0
- data/lib/reanimator/version.rb +5 -0
- data/lib/reanimator/vitality_profile.rb +44 -0
- data/lib/reanimator/waiver.rb +74 -0
- data/lib/reanimator.rb +214 -0
- metadata +262 -0
data/lib/reanimator.rb
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "logger"
|
|
4
|
+
require "zeitwerk"
|
|
5
|
+
|
|
6
|
+
# Zeitwerk is the single code loader for the gem: every constant under
|
|
7
|
+
# Reanimator:: is autoloaded on first reference, including the CLI, so a
|
|
8
|
+
# library consumer (or a future GitHub App host) never pays for Thor or the
|
|
9
|
+
# tty-* UI stack at require time. Files must not require_relative their
|
|
10
|
+
# siblings - reference the constant and let the loader resolve it.
|
|
11
|
+
loader = Zeitwerk::Loader.for_gem
|
|
12
|
+
loader.inflector.inflect(
|
|
13
|
+
"cli" => "CLI",
|
|
14
|
+
"github_actions" => "GitHubActions",
|
|
15
|
+
"github_check" => "GitHubCheck"
|
|
16
|
+
)
|
|
17
|
+
# errors.rb intentionally defines the whole error family in one file, so it is
|
|
18
|
+
# required directly rather than autoloaded one-constant-per-file.
|
|
19
|
+
loader.ignore("#{__dir__}/reanimator/errors.rb")
|
|
20
|
+
# The interactive surface is loaded on demand (exe/reanimator), never eager.
|
|
21
|
+
loader.do_not_eager_load("#{__dir__}/reanimator/cli.rb")
|
|
22
|
+
loader.setup
|
|
23
|
+
|
|
24
|
+
require_relative "reanimator/errors"
|
|
25
|
+
|
|
26
|
+
# Reanimator turns repository intent into a verified, low-friction
|
|
27
|
+
# stewardship contract. The public promise, echoed throughout this library, is
|
|
28
|
+
# that the first successful run proves something useful *without changing a
|
|
29
|
+
# single line of code*: it observes, discovers, resolves an effective
|
|
30
|
+
# contract, and measures a read-only baseline before any coding agent or write
|
|
31
|
+
# permission is involved.
|
|
32
|
+
#
|
|
33
|
+
# The module methods below are the "80% path" - a maintainer can go from a
|
|
34
|
+
# path on disk to a proof-of-life report in one call.
|
|
35
|
+
module Reanimator
|
|
36
|
+
class << self
|
|
37
|
+
attr_writer :configuration
|
|
38
|
+
attr_accessor :logger
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Quiet by default. The CLI raises verbosity for interactive use; library
|
|
42
|
+
# consumers opt in via Reanimator.logger.level=.
|
|
43
|
+
self.logger ||= Logger.new($stdout, level: Logger::WARN)
|
|
44
|
+
|
|
45
|
+
# @return [Configuration] the process-wide configuration
|
|
46
|
+
def self.configuration
|
|
47
|
+
@configuration ||= Configuration.new
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @yieldparam config [Configuration]
|
|
51
|
+
# @return [Configuration]
|
|
52
|
+
def self.configure
|
|
53
|
+
yield(configuration) if block_given?
|
|
54
|
+
configuration
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Classify a set of repository paths into lifecycle cohorts.
|
|
58
|
+
#
|
|
59
|
+
# @param paths [Array<String>] repository roots on disk
|
|
60
|
+
# @return [Portfolio] the classified portfolio
|
|
61
|
+
def self.inventory(paths)
|
|
62
|
+
Portfolio.scan(Array(paths))
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Run every detector over a repository and return its discovered facts.
|
|
66
|
+
#
|
|
67
|
+
# @param path [String] repository root on disk
|
|
68
|
+
# @return [DiscoveryResult]
|
|
69
|
+
def self.discover(path)
|
|
70
|
+
Discovery.new(Repository.at(path)).run
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Resolve the effective vitality contract for a repository: discovery plus
|
|
74
|
+
# the inferred (or declared) profile plus any .reanimator.yml overrides,
|
|
75
|
+
# all clamped by the non-bypassable safety floor.
|
|
76
|
+
#
|
|
77
|
+
# @param path [String] repository root on disk
|
|
78
|
+
# @param intent [Symbol, nil] override the inferred lifecycle intent
|
|
79
|
+
# @return [EffectiveContract]
|
|
80
|
+
def self.contract(path, intent: nil)
|
|
81
|
+
repository = Repository.at(path)
|
|
82
|
+
repository.intent = intent if intent
|
|
83
|
+
EffectivePolicyResolver.new(repository).resolve
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Measure a read-only proof-of-life baseline for a repository.
|
|
87
|
+
#
|
|
88
|
+
# @param path [String] repository root on disk
|
|
89
|
+
# @param execute [Boolean] actually run discovered checks (bounded,
|
|
90
|
+
# read-only) rather than only planning them
|
|
91
|
+
# @param intent [Symbol, nil] override the inferred lifecycle intent
|
|
92
|
+
# @return [Baseline]
|
|
93
|
+
def self.baseline(path, execute: false, intent: nil)
|
|
94
|
+
BaselineRunner.new(contract(path, intent: intent), execute: execute).run
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Capture the contract a repository resolves to right now, in a form that can
|
|
98
|
+
# be recorded and compared later.
|
|
99
|
+
#
|
|
100
|
+
# @param path [String] repository root on disk
|
|
101
|
+
# @param intent [Symbol, nil] override the inferred lifecycle intent
|
|
102
|
+
# @return [ContractSnapshot]
|
|
103
|
+
def self.snapshot(path, intent: nil)
|
|
104
|
+
ContractSnapshot.of(contract(path, intent: intent))
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Detect configuration drift (section 06): compare the contract a repository
|
|
108
|
+
# resolves to now against a previously recorded snapshot, classifying each
|
|
109
|
+
# difference as a policy change (a human should look) or a benign one.
|
|
110
|
+
#
|
|
111
|
+
# @param path [String] repository root on disk
|
|
112
|
+
# @param since [String, ContractSnapshot] a recorded snapshot, or a path to one
|
|
113
|
+
# @param intent [Symbol, nil] override the inferred lifecycle intent
|
|
114
|
+
# @return [DriftReport]
|
|
115
|
+
def self.drift(path, since:, intent: nil)
|
|
116
|
+
previous = since.is_a?(ContractSnapshot) ? since : ContractSnapshot.load(since.to_s)
|
|
117
|
+
DriftDetector.between(previous, snapshot(path, intent: intent))
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Detect configuration drift across several repositories at once. Each
|
|
121
|
+
# repository is compared against its own recorded snapshot - its committed
|
|
122
|
+
# `.reanimator-snapshot.json`, or a file in `snapshots` keyed by
|
|
123
|
+
# repository - and the result is a triage list rather than one verdict.
|
|
124
|
+
#
|
|
125
|
+
# @param paths [Array<String>] repository roots on disk
|
|
126
|
+
# @param snapshots [String, nil] a directory of recorded snapshots, for
|
|
127
|
+
# repositories you cannot commit a file into
|
|
128
|
+
# @param record [Boolean] also write each repository's current snapshot
|
|
129
|
+
# @param intent [Symbol, nil] override the inferred lifecycle intent
|
|
130
|
+
# @param name [String] portfolio name for the report header
|
|
131
|
+
# @return [PortfolioDrift]
|
|
132
|
+
def self.portfolio_drift(paths, snapshots: nil, record: false, intent: nil, name: "portfolio")
|
|
133
|
+
PortfolioDrift.scan(
|
|
134
|
+
paths, store: SnapshotStore.new(directory: snapshots),
|
|
135
|
+
record: record, intent: intent, name: name
|
|
136
|
+
)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Default environment-variable names where each hosted provider's credentials
|
|
140
|
+
# would live. Credentials are never read from a repository (section 08).
|
|
141
|
+
CREDENTIAL_REFS = {
|
|
142
|
+
codex: "OPENAI_ACCESS_TOKEN",
|
|
143
|
+
claude: "ANTHROPIC_API_KEY",
|
|
144
|
+
amp: "AMP_API_KEY"
|
|
145
|
+
}.freeze
|
|
146
|
+
|
|
147
|
+
# Commission a coding agent: prove it can plan and patch a synthetic repair on
|
|
148
|
+
# a disposable fixture, graded independently, without any repository write.
|
|
149
|
+
#
|
|
150
|
+
# @param provider [Symbol] :local (default), :codex, :claude, or :amp
|
|
151
|
+
# @return [Commissioning::Report]
|
|
152
|
+
def self.commission(provider: :local, **connection_options)
|
|
153
|
+
connection =
|
|
154
|
+
if provider.to_sym == :local
|
|
155
|
+
AgentConnection.local(**connection_options)
|
|
156
|
+
else
|
|
157
|
+
AgentConnection.new(
|
|
158
|
+
provider: provider, credentials_ref: CREDENTIAL_REFS[provider.to_sym], **connection_options
|
|
159
|
+
)
|
|
160
|
+
end
|
|
161
|
+
Commissioning::Test.new(Agents.for(connection)).run
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Attempt one bounded repair for a repository's first failing required
|
|
165
|
+
# criterion. Read-only with respect to the repository: the result is a
|
|
166
|
+
# recorded {Run} whose most eventful outcome is a *proposed* draft PR, never a
|
|
167
|
+
# write or submission.
|
|
168
|
+
#
|
|
169
|
+
# @param path [String] repository root on disk
|
|
170
|
+
# @param provider [Symbol] agent provider (:local by default)
|
|
171
|
+
# @param task_class [Symbol] the task class governing autonomy (section 11)
|
|
172
|
+
# @return [Run]
|
|
173
|
+
def self.repair(path, provider: :local, task_class: :patch_dependency)
|
|
174
|
+
RepairRun.new(contract(path), provider: provider, task_class: task_class).run
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Infer the compatibility graph for a set of repository paths: which
|
|
178
|
+
# repositories must stay alive together, and what proves each edge.
|
|
179
|
+
#
|
|
180
|
+
# @param paths [Array<String>]
|
|
181
|
+
# @return [Array<Family>]
|
|
182
|
+
def self.families(paths)
|
|
183
|
+
FamilyInference.call(inventory(paths))
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Evaluate cross-repository gates for the inferred families. Read-only by
|
|
187
|
+
# default: each downstream check only runs when execution is requested, and
|
|
188
|
+
# then in a disposable copy of the downstream repository.
|
|
189
|
+
#
|
|
190
|
+
# @param paths [Array<String>]
|
|
191
|
+
# @param family [Symbol, String, nil] limit to one family id
|
|
192
|
+
# @param execute [Boolean]
|
|
193
|
+
# @return [Array<Array(Family, Array<Family::GateResult>)>]
|
|
194
|
+
def self.family_gates(paths, family: nil, execute: false)
|
|
195
|
+
found = families(paths)
|
|
196
|
+
found = found.select { |f| f.id == family.to_sym } if family
|
|
197
|
+
found.map { |f| [f, Family::GateRunner.new(f, execute: execute).run] }
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Adapters for every built-in provider, with default connections - the roster
|
|
201
|
+
# the CLI lists with availability.
|
|
202
|
+
# @return [Array<Agents::Adapter>]
|
|
203
|
+
def self.adapters
|
|
204
|
+
Agents.providers.map do |provider|
|
|
205
|
+
connection =
|
|
206
|
+
if provider == :local
|
|
207
|
+
AgentConnection.local
|
|
208
|
+
else
|
|
209
|
+
AgentConnection.new(provider: provider, credentials_ref: CREDENTIAL_REFS[provider])
|
|
210
|
+
end
|
|
211
|
+
Agents.for(connection)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: reanimator
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Valentino Stoll
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-10-28 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: zeitwerk
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.6'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.6'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: thor
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.3'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.3'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: pastel
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0.8'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0.8'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: tty-table
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0.12'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.12'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: tty-box
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0.7'
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0.7'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: psych
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '5.0'
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ">="
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '5.0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: logger
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
description: Reanimator reads a repository, infers what "healthy" means for it, and
|
|
112
|
+
proves that health without changing a single line of code. It classifies lifecycle
|
|
113
|
+
intent, discovers a vitality contract from evidence, resolves an effective policy,
|
|
114
|
+
and produces a read-only proof-of-life baseline - before any coding agent or write
|
|
115
|
+
permission is ever involved.
|
|
116
|
+
email:
|
|
117
|
+
- v@codenamev.com
|
|
118
|
+
executables:
|
|
119
|
+
- reanimator
|
|
120
|
+
extensions: []
|
|
121
|
+
extra_rdoc_files: []
|
|
122
|
+
files:
|
|
123
|
+
- CHANGELOG.md
|
|
124
|
+
- LICENSE.txt
|
|
125
|
+
- README.md
|
|
126
|
+
- SECURITY.md
|
|
127
|
+
- exe/reanimator
|
|
128
|
+
- lib/reanimator.rb
|
|
129
|
+
- lib/reanimator/acceptance_criterion.rb
|
|
130
|
+
- lib/reanimator/agent_connection.rb
|
|
131
|
+
- lib/reanimator/agent_profile.rb
|
|
132
|
+
- lib/reanimator/agents.rb
|
|
133
|
+
- lib/reanimator/agents/adapter.rb
|
|
134
|
+
- lib/reanimator/agents/capability.rb
|
|
135
|
+
- lib/reanimator/agents/constraints.rb
|
|
136
|
+
- lib/reanimator/agents/hosted.rb
|
|
137
|
+
- lib/reanimator/agents/local.rb
|
|
138
|
+
- lib/reanimator/agents/patch.rb
|
|
139
|
+
- lib/reanimator/agents/repair_task.rb
|
|
140
|
+
- lib/reanimator/agents/result.rb
|
|
141
|
+
- lib/reanimator/agents/strategies/arithmetic_fix.rb
|
|
142
|
+
- lib/reanimator/agents/strategies/base.rb
|
|
143
|
+
- lib/reanimator/autonomy_level.rb
|
|
144
|
+
- lib/reanimator/baseline.rb
|
|
145
|
+
- lib/reanimator/baseline_runner.rb
|
|
146
|
+
- lib/reanimator/bounded_command.rb
|
|
147
|
+
- lib/reanimator/classifier.rb
|
|
148
|
+
- lib/reanimator/cli.rb
|
|
149
|
+
- lib/reanimator/cohort.rb
|
|
150
|
+
- lib/reanimator/commissioning/fixture.rb
|
|
151
|
+
- lib/reanimator/commissioning/report.rb
|
|
152
|
+
- lib/reanimator/commissioning/test.rb
|
|
153
|
+
- lib/reanimator/confidence.rb
|
|
154
|
+
- lib/reanimator/configuration.rb
|
|
155
|
+
- lib/reanimator/contract_file.rb
|
|
156
|
+
- lib/reanimator/contract_snapshot.rb
|
|
157
|
+
- lib/reanimator/criteria_stack.rb
|
|
158
|
+
- lib/reanimator/criterion_result.rb
|
|
159
|
+
- lib/reanimator/detectors/base.rb
|
|
160
|
+
- lib/reanimator/detectors/bundler.rb
|
|
161
|
+
- lib/reanimator/detectors/commands.rb
|
|
162
|
+
- lib/reanimator/detectors/fork.rb
|
|
163
|
+
- lib/reanimator/detectors/github_actions.rb
|
|
164
|
+
- lib/reanimator/detectors/operational_proof.rb
|
|
165
|
+
- lib/reanimator/detectors/rails_app.rb
|
|
166
|
+
- lib/reanimator/detectors/relationships.rb
|
|
167
|
+
- lib/reanimator/detectors/ruby_gem.rb
|
|
168
|
+
- lib/reanimator/detectors/security_controls.rb
|
|
169
|
+
- lib/reanimator/discovered_fact.rb
|
|
170
|
+
- lib/reanimator/discovery.rb
|
|
171
|
+
- lib/reanimator/discovery_result.rb
|
|
172
|
+
- lib/reanimator/drift_detector.rb
|
|
173
|
+
- lib/reanimator/drift_report.rb
|
|
174
|
+
- lib/reanimator/effective_contract.rb
|
|
175
|
+
- lib/reanimator/effective_policy_resolver.rb
|
|
176
|
+
- lib/reanimator/errors.rb
|
|
177
|
+
- lib/reanimator/evaluators.rb
|
|
178
|
+
- lib/reanimator/evaluators/base.rb
|
|
179
|
+
- lib/reanimator/evaluators/command.rb
|
|
180
|
+
- lib/reanimator/evaluators/documentation_check.rb
|
|
181
|
+
- lib/reanimator/evaluators/http_smoke.rb
|
|
182
|
+
- lib/reanimator/evaluators/repository_integrity.rb
|
|
183
|
+
- lib/reanimator/evaluators/security_evidence.rb
|
|
184
|
+
- lib/reanimator/evaluators/support_matrix.rb
|
|
185
|
+
- lib/reanimator/family.rb
|
|
186
|
+
- lib/reanimator/family/gate.rb
|
|
187
|
+
- lib/reanimator/family/gate_result.rb
|
|
188
|
+
- lib/reanimator/family/gate_runner.rb
|
|
189
|
+
- lib/reanimator/family_inference.rb
|
|
190
|
+
- lib/reanimator/git.rb
|
|
191
|
+
- lib/reanimator/isolation.rb
|
|
192
|
+
- lib/reanimator/language_inference.rb
|
|
193
|
+
- lib/reanimator/lifecycle_intent.rb
|
|
194
|
+
- lib/reanimator/obligation.rb
|
|
195
|
+
- lib/reanimator/permission_model.rb
|
|
196
|
+
- lib/reanimator/portfolio.rb
|
|
197
|
+
- lib/reanimator/portfolio_drift.rb
|
|
198
|
+
- lib/reanimator/profile_inference.rb
|
|
199
|
+
- lib/reanimator/profiles.rb
|
|
200
|
+
- lib/reanimator/proof_of_life.rb
|
|
201
|
+
- lib/reanimator/proposed_change.rb
|
|
202
|
+
- lib/reanimator/provenance.rb
|
|
203
|
+
- lib/reanimator/relationship.rb
|
|
204
|
+
- lib/reanimator/repair_run.rb
|
|
205
|
+
- lib/reanimator/reports.rb
|
|
206
|
+
- lib/reanimator/reports/agents.rb
|
|
207
|
+
- lib/reanimator/reports/baseline.rb
|
|
208
|
+
- lib/reanimator/reports/commissioning.rb
|
|
209
|
+
- lib/reanimator/reports/contract.rb
|
|
210
|
+
- lib/reanimator/reports/discovery.rb
|
|
211
|
+
- lib/reanimator/reports/drift.rb
|
|
212
|
+
- lib/reanimator/reports/families.rb
|
|
213
|
+
- lib/reanimator/reports/family_gates.rb
|
|
214
|
+
- lib/reanimator/reports/github_check.rb
|
|
215
|
+
- lib/reanimator/reports/inventory.rb
|
|
216
|
+
- lib/reanimator/reports/permissions.rb
|
|
217
|
+
- lib/reanimator/reports/portfolio_baseline.rb
|
|
218
|
+
- lib/reanimator/reports/portfolio_drift.rb
|
|
219
|
+
- lib/reanimator/reports/run.rb
|
|
220
|
+
- lib/reanimator/reports/snapshot.rb
|
|
221
|
+
- lib/reanimator/repository.rb
|
|
222
|
+
- lib/reanimator/repository_metadata.rb
|
|
223
|
+
- lib/reanimator/repository_state.rb
|
|
224
|
+
- lib/reanimator/routing/decision.rb
|
|
225
|
+
- lib/reanimator/routing/router.rb
|
|
226
|
+
- lib/reanimator/run.rb
|
|
227
|
+
- lib/reanimator/safety_floor.rb
|
|
228
|
+
- lib/reanimator/security_control.rb
|
|
229
|
+
- lib/reanimator/security_posture.rb
|
|
230
|
+
- lib/reanimator/snapshot_store.rb
|
|
231
|
+
- lib/reanimator/task_class.rb
|
|
232
|
+
- lib/reanimator/version.rb
|
|
233
|
+
- lib/reanimator/vitality_profile.rb
|
|
234
|
+
- lib/reanimator/waiver.rb
|
|
235
|
+
homepage: https://github.com/Autogenetica/reanimator
|
|
236
|
+
licenses:
|
|
237
|
+
- MIT
|
|
238
|
+
metadata:
|
|
239
|
+
homepage_uri: https://github.com/Autogenetica/reanimator
|
|
240
|
+
changelog_uri: https://github.com/Autogenetica/reanimator/blob/main/CHANGELOG.md
|
|
241
|
+
bug_tracker_uri: https://github.com/Autogenetica/reanimator/issues
|
|
242
|
+
rubygems_mfa_required: 'true'
|
|
243
|
+
post_install_message:
|
|
244
|
+
rdoc_options: []
|
|
245
|
+
require_paths:
|
|
246
|
+
- lib
|
|
247
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
248
|
+
requirements:
|
|
249
|
+
- - ">="
|
|
250
|
+
- !ruby/object:Gem::Version
|
|
251
|
+
version: 3.3.0
|
|
252
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
253
|
+
requirements:
|
|
254
|
+
- - ">="
|
|
255
|
+
- !ruby/object:Gem::Version
|
|
256
|
+
version: '0'
|
|
257
|
+
requirements: []
|
|
258
|
+
rubygems_version: 3.5.22
|
|
259
|
+
signing_key:
|
|
260
|
+
specification_version: 4
|
|
261
|
+
summary: Turn repository intent into a verified, low-friction stewardship contract.
|
|
262
|
+
test_files: []
|