woods 1.6.1 → 2.0.0.beta2

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 (274) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2035 -0
  3. data/CONTRIBUTING.md +253 -87
  4. data/README.md +161 -513
  5. data/SECURITY.md +92 -0
  6. data/assets/woods-wordmark-white-with-bg.png +0 -0
  7. data/docs/AGENT_GUIDE.md +204 -0
  8. data/docs/AGENT_SETUP.md +205 -0
  9. data/docs/BACKEND_MATRIX.md +470 -0
  10. data/docs/CONFIGURATION_REFERENCE.md +655 -0
  11. data/docs/CONSOLE_MCP_SETUP.md +829 -0
  12. data/docs/DOCKER_SETUP.md +454 -0
  13. data/docs/EMBEDDING_MODELS.md +136 -0
  14. data/docs/EVALUATION.md +91 -0
  15. data/docs/EXTRACTOR_REFERENCE.md +765 -0
  16. data/docs/FAQ.md +544 -0
  17. data/docs/GETTING_STARTED.md +183 -0
  18. data/docs/INCREMENTAL_EXTRACTION.md +455 -0
  19. data/docs/INTERNALS.md +418 -0
  20. data/docs/MCP_HTTP_TRANSPORT.md +144 -0
  21. data/docs/MCP_SERVERS.md +231 -0
  22. data/docs/MCP_TOOL_COOKBOOK.md +987 -0
  23. data/docs/MCP_WORKTREE_SETUP.md +127 -0
  24. data/docs/NOTION_INTEGRATION.md +283 -0
  25. data/docs/OBSIDIAN_INTEGRATION.md +170 -0
  26. data/docs/PUBLISHED_INDEX.md +213 -0
  27. data/docs/README.md +94 -0
  28. data/docs/RETRIEVAL_GUIDE.md +267 -0
  29. data/docs/TOKEN_BENCHMARK.md +68 -0
  30. data/docs/TROUBLESHOOTING.md +841 -0
  31. data/docs/UNBLOCKED_INTEGRATION.md +279 -0
  32. data/docs/UPGRADING_TO_2.md +321 -0
  33. data/docs/WATCH_DAEMON.md +667 -0
  34. data/docs/WHY_WOODS.md +219 -0
  35. data/exe/woods-console +40 -4
  36. data/exe/woods-console-mcp +21 -35
  37. data/exe/woods-mcp +20 -7
  38. data/exe/woods-mcp-http +80 -11
  39. data/exe/woods-mcp-start +57 -52
  40. data/lib/generators/woods/install_generator.rb +6 -5
  41. data/lib/generators/woods/pgvector_generator.rb +6 -3
  42. data/lib/generators/woods/templates/add_pgvector_to_woods.rb.erb +29 -9
  43. data/lib/generators/woods/templates/create_woods_tables.rb.erb +5 -1
  44. data/lib/generators/woods/templates/woods.rb.tt +49 -28
  45. data/lib/tasks/woods.rake +622 -168
  46. data/lib/tasks/woods_checks.rake +107 -0
  47. data/lib/tasks/woods_evaluation.rake +164 -80
  48. data/lib/woods/ast/call_site_extractor.rb +6 -15
  49. data/lib/woods/ast/method_extractor.rb +19 -9
  50. data/lib/woods/ast/parser.rb +54 -8
  51. data/lib/woods/atomic_file.rb +171 -2
  52. data/lib/woods/builder.rb +310 -22
  53. data/lib/woods/cache/cache_middleware.rb +7 -2
  54. data/lib/woods/cache/cache_store.rb +9 -1
  55. data/lib/woods/cache/solid_cache_store.rb +6 -4
  56. data/lib/woods/change_set.rb +88 -0
  57. data/lib/woods/checks/generation_resolution.rb +34 -0
  58. data/lib/woods/checks/moved_messages.rb +186 -0
  59. data/lib/woods/chunking/semantic_chunker.rb +160 -18
  60. data/lib/woods/console/audit_logger.rb +12 -3
  61. data/lib/woods/console/bridge_protocol.rb +3 -16
  62. data/lib/woods/console/connection_manager.rb +51 -136
  63. data/lib/woods/console/dispatch_pipeline.rb +42 -12
  64. data/lib/woods/console/embedded_executor.rb +806 -149
  65. data/lib/woods/console/eval_guard.rb +27 -20
  66. data/lib/woods/console/input_contract.rb +78 -0
  67. data/lib/woods/console/model_validator.rb +29 -1
  68. data/lib/woods/console/rack_middleware.rb +65 -42
  69. data/lib/woods/console/redactor.rb +26 -8
  70. data/lib/woods/console/safe_context.rb +58 -10
  71. data/lib/woods/console/scope_predicate_parser.rb +41 -0
  72. data/lib/woods/console/server.rb +119 -247
  73. data/lib/woods/console/sql_noise_stripper.rb +125 -16
  74. data/lib/woods/console/sql_table_scanner.rb +82 -22
  75. data/lib/woods/console/sql_validator.rb +459 -29
  76. data/lib/woods/console/table_gate.rb +2 -2
  77. data/lib/woods/console/tool_specs.rb +463 -90
  78. data/lib/woods/console/tools/tier1.rb +1 -5
  79. data/lib/woods/console/tools/tier4.rb +18 -9
  80. data/lib/woods/coordination/lock_heartbeat.rb +103 -0
  81. data/lib/woods/coordination/pipeline_lock.rb +263 -53
  82. data/lib/woods/db/migrations/007_typed_snapshot_units.rb +45 -0
  83. data/lib/woods/db/migrator.rb +3 -9
  84. data/lib/woods/db/schema_version.rb +47 -2
  85. data/lib/woods/dependency_graph.rb +898 -64
  86. data/lib/woods/embedding/fake.rb +138 -0
  87. data/lib/woods/embedding/indexer.rb +832 -40
  88. data/lib/woods/embedding/openai.rb +77 -19
  89. data/lib/woods/embedding/provider.rb +189 -11
  90. data/lib/woods/embedding/text_preparer.rb +1 -1
  91. data/lib/woods/embedding/token_counter.rb +0 -7
  92. data/lib/woods/evaluation/ablation_agent_payload.rb +38 -0
  93. data/lib/woods/evaluation/ablation_executor.rb +67 -0
  94. data/lib/woods/evaluation/ablation_provenance.rb +38 -0
  95. data/lib/woods/evaluation/ablation_report_writer.rb +43 -0
  96. data/lib/woods/evaluation/ablation_runner.rb +173 -0
  97. data/lib/woods/evaluation/ablation_summary.rb +65 -0
  98. data/lib/woods/evaluation/ablation_task.rb +66 -0
  99. data/lib/woods/evaluation/ablation_task_set.rb +77 -0
  100. data/lib/woods/evaluation/ablation_timed_executor.rb +91 -0
  101. data/lib/woods/evaluation/ablation_worktree.rb +71 -0
  102. data/lib/woods/evaluation/baseline.rb +60 -0
  103. data/lib/woods/evaluation/baseline_runner.rb +11 -3
  104. data/lib/woods/evaluation/evaluator.rb +41 -8
  105. data/lib/woods/evaluation/query_set.rb +79 -13
  106. data/lib/woods/evaluation/report_generator.rb +20 -1
  107. data/lib/woods/export/unit_facts.rb +0 -11
  108. data/lib/woods/extracted_unit.rb +22 -63
  109. data/lib/woods/extractor.rb +2783 -238
  110. data/lib/woods/extractors/action_cable_extractor.rb +9 -4
  111. data/lib/woods/extractors/ast_source_extraction.rb +20 -2
  112. data/lib/woods/extractors/caching_extractor.rb +46 -12
  113. data/lib/woods/extractors/callback_analyzer.rb +39 -9
  114. data/lib/woods/extractors/component_discovery.rb +123 -0
  115. data/lib/woods/extractors/concern_extractor.rb +17 -3
  116. data/lib/woods/extractors/controller_extractor.rb +389 -29
  117. data/lib/woods/extractors/decorator_extractor.rb +7 -14
  118. data/lib/woods/extractors/engine_extractor.rb +53 -8
  119. data/lib/woods/extractors/event_extractor.rb +55 -4
  120. data/lib/woods/extractors/factory_extractor.rb +49 -11
  121. data/lib/woods/extractors/graphql_extractor.rb +162 -66
  122. data/lib/woods/extractors/i18n_extractor.rb +6 -1
  123. data/lib/woods/extractors/job_extractor.rb +51 -21
  124. data/lib/woods/extractors/lib_extractor.rb +23 -17
  125. data/lib/woods/extractors/line_neutralizer.rb +171 -0
  126. data/lib/woods/extractors/mailer_extractor.rb +9 -1
  127. data/lib/woods/extractors/manager_extractor.rb +19 -2
  128. data/lib/woods/extractors/migration_extractor.rb +22 -11
  129. data/lib/woods/extractors/model_extractor.rb +292 -57
  130. data/lib/woods/extractors/package_extractor.rb +154 -0
  131. data/lib/woods/extractors/phlex_extractor.rb +18 -3
  132. data/lib/woods/extractors/policy_extractor.rb +6 -5
  133. data/lib/woods/extractors/poro_extractor.rb +13 -14
  134. data/lib/woods/extractors/pundit_extractor.rb +3 -3
  135. data/lib/woods/extractors/rails_source_extractor.rb +24 -7
  136. data/lib/woods/extractors/rake_task_extractor.rb +158 -30
  137. data/lib/woods/extractors/reference_patterns.rb +38 -0
  138. data/lib/woods/extractors/route_extractor.rb +58 -2
  139. data/lib/woods/extractors/scheduled_job_extractor.rb +51 -35
  140. data/lib/woods/extractors/serializer_extractor.rb +3 -4
  141. data/lib/woods/extractors/service_extractor.rb +11 -1
  142. data/lib/woods/extractors/shared_dependency_scanner.rb +24 -34
  143. data/lib/woods/extractors/shared_utility_methods.rb +36 -6
  144. data/lib/woods/extractors/source_nesting.rb +560 -0
  145. data/lib/woods/extractors/state_machine_extractor.rb +30 -18
  146. data/lib/woods/extractors/test_mapping_extractor.rb +26 -9
  147. data/lib/woods/extractors/view_component_extractor.rb +28 -3
  148. data/lib/woods/extractors/view_engines/erb.rb +17 -3
  149. data/lib/woods/feedback/gap_detector.rb +9 -3
  150. data/lib/woods/feedback/store.rb +7 -1
  151. data/lib/woods/filename_utils.rb +29 -1
  152. data/lib/woods/flow_analysis/operation_extractor.rb +22 -10
  153. data/lib/woods/flow_assembler.rb +147 -26
  154. data/lib/woods/flow_document.rb +1 -0
  155. data/lib/woods/flow_precomputer.rb +175 -22
  156. data/lib/woods/gem_mapper.rb +285 -0
  157. data/lib/woods/generation.rb +185 -0
  158. data/lib/woods/git_command.rb +38 -0
  159. data/lib/woods/git_provenance.rb +16 -2
  160. data/lib/woods/graph_analyzer.rb +564 -87
  161. data/lib/woods/index_artifact.rb +93 -23
  162. data/lib/woods/mcp/bearer_auth.rb +102 -13
  163. data/lib/woods/mcp/bootstrap_state.rb +77 -0
  164. data/lib/woods/mcp/bootstrapper.rb +582 -77
  165. data/lib/woods/mcp/config_resolver.rb +66 -6
  166. data/lib/woods/mcp/errors.rb +60 -0
  167. data/lib/woods/mcp/index_reader.rb +836 -117
  168. data/lib/woods/mcp/index_reader_pinning.rb +78 -0
  169. data/lib/woods/mcp/origin_guard.rb +66 -7
  170. data/lib/woods/mcp/protocol_policy.rb +98 -0
  171. data/lib/woods/mcp/provider_probe.rb +45 -6
  172. data/lib/woods/mcp/renderers/markdown_renderer.rb +72 -4
  173. data/lib/woods/mcp/renderers/plain_renderer.rb +54 -6
  174. data/lib/woods/mcp/server.rb +898 -152
  175. data/lib/woods/mcp/tasks/extension.rb +196 -0
  176. data/lib/woods/mcp/tasks/request_capture.rb +45 -0
  177. data/lib/woods/mcp/tasks/store.rb +518 -0
  178. data/lib/woods/mcp/tool_contract.rb +171 -0
  179. data/lib/woods/mcp/tool_response_renderer.rb +7 -0
  180. data/lib/woods/model_name_cache.rb +19 -1
  181. data/lib/woods/notion/client.rb +132 -36
  182. data/lib/woods/notion/exporter.rb +456 -61
  183. data/lib/woods/notion/mappers/column_mapper.rb +34 -5
  184. data/lib/woods/notion/mappers/migration_mapper.rb +32 -8
  185. data/lib/woods/notion/mappers/model_mapper.rb +21 -6
  186. data/lib/woods/notion/mappers/shared.rb +45 -3
  187. data/lib/woods/notion/sync_manifest.rb +258 -0
  188. data/lib/woods/obsidian/errors.rb +6 -0
  189. data/lib/woods/obsidian/name_mapper.rb +40 -24
  190. data/lib/woods/obsidian/vault_exporter.rb +103 -36
  191. data/lib/woods/operator/pipeline_guard.rb +118 -21
  192. data/lib/woods/operator/status_reporter.rb +20 -3
  193. data/lib/woods/path_dispatcher.rb +276 -0
  194. data/lib/woods/payload_store.rb +236 -0
  195. data/lib/woods/published_index/edge_shaper.rb +61 -0
  196. data/lib/woods/published_index/generation_catalog.rb +72 -0
  197. data/lib/woods/published_index/typed_unit_reader.rb +48 -0
  198. data/lib/woods/published_index.rb +287 -0
  199. data/lib/woods/railtie.rb +69 -30
  200. data/lib/woods/railtie_support.rb +167 -0
  201. data/lib/woods/release.rb +12 -0
  202. data/lib/woods/reload_policy.rb +206 -0
  203. data/lib/woods/resilience/circuit_breaker.rb +47 -8
  204. data/lib/woods/resilience/index_validator.rb +296 -10
  205. data/lib/woods/resilience/retryable_provider.rb +71 -6
  206. data/lib/woods/resolved_config.rb +55 -11
  207. data/lib/woods/retrieval/context_assembler.rb +132 -40
  208. data/lib/woods/retrieval/query_classifier.rb +26 -8
  209. data/lib/woods/retrieval/ranker.rb +193 -28
  210. data/lib/woods/retrieval/search_executor.rb +206 -39
  211. data/lib/woods/retriever.rb +317 -71
  212. data/lib/woods/retry_after.rb +22 -2
  213. data/lib/woods/ruby_analyzer/class_analyzer.rb +10 -14
  214. data/lib/woods/ruby_analyzer/fqn_builder.rb +2 -0
  215. data/lib/woods/ruby_analyzer/mermaid_renderer.rb +14 -4
  216. data/lib/woods/ruby_analyzer/method_analyzer.rb +1 -1
  217. data/lib/woods/ruby_analyzer/trace_enricher.rb +3 -0
  218. data/lib/woods/ruby_analyzer.rb +21 -5
  219. data/lib/woods/session_tracer/file_store.rb +138 -19
  220. data/lib/woods/session_tracer/middleware.rb +1 -2
  221. data/lib/woods/session_tracer/redis_store.rb +122 -12
  222. data/lib/woods/session_tracer/session_flow_assembler.rb +57 -17
  223. data/lib/woods/session_tracer/session_flow_document.rb +56 -14
  224. data/lib/woods/session_tracer/solid_cache_coordination.rb +192 -0
  225. data/lib/woods/session_tracer/solid_cache_store.rb +560 -91
  226. data/lib/woods/session_tracer/store.rb +14 -1
  227. data/lib/woods/storage/metadata_store.rb +230 -26
  228. data/lib/woods/storage/pgvector.rb +180 -22
  229. data/lib/woods/storage/qdrant.rb +367 -41
  230. data/lib/woods/storage/snapshotter/metadata.rb +79 -16
  231. data/lib/woods/storage/snapshotter/vector.rb +128 -17
  232. data/lib/woods/storage/snapshotter.rb +23 -5
  233. data/lib/woods/storage/vector_store.rb +49 -8
  234. data/lib/woods/storage_identity.rb +28 -0
  235. data/lib/woods/tasks.rb +53 -2
  236. data/lib/woods/temporal/json_snapshot_store.rb +112 -42
  237. data/lib/woods/temporal/snapshot_store.rb +139 -42
  238. data/lib/woods/unblocked/client.rb +119 -17
  239. data/lib/woods/unblocked/document_builder.rb +34 -2
  240. data/lib/woods/unblocked/exporter.rb +63 -27
  241. data/lib/woods/unblocked/rate_limiter.rb +23 -9
  242. data/lib/woods/unblocked/sync_manifest.rb +16 -8
  243. data/lib/woods/update_check.rb +24 -1
  244. data/lib/woods/util/uuid5.rb +124 -0
  245. data/lib/woods/version.rb +1 -1
  246. data/lib/woods/watch/daemon.rb +1345 -0
  247. data/lib/woods/watch/listen_watcher.rb +81 -0
  248. data/lib/woods/watch/polling_watcher.rb +137 -0
  249. data/lib/woods/watch/status.rb +169 -0
  250. data/lib/woods/watch/tree_scan.rb +163 -0
  251. data/lib/woods/watch/watcher.rb +100 -0
  252. data/lib/woods.rb +138 -9
  253. data/plugin/.claude-plugin/plugin.json +18 -0
  254. data/plugin/hooks/hooks.json +29 -0
  255. data/plugin/hooks/woods-post-edit.sh +226 -0
  256. data/plugin/hooks/woods-session-start.sh +77 -0
  257. data/plugin/skills/woods-agent-enable/SKILL.md +51 -0
  258. data/plugin/skills/woods-diagnose/SKILL.md +75 -0
  259. data/plugin/skills/woods-investigate/SKILL.md +39 -0
  260. data/plugin/skills/woods-mcp-config/SKILL.md +101 -0
  261. data/plugin/skills/woods-setup/SKILL.md +99 -0
  262. metadata +134 -23
  263. data/lib/woods/console/adapters/cache_adapter.rb +0 -58
  264. data/lib/woods/console/adapters/good_job_adapter.rb +0 -33
  265. data/lib/woods/console/adapters/job_adapter.rb +0 -74
  266. data/lib/woods/console/adapters/sidekiq_adapter.rb +0 -33
  267. data/lib/woods/console/adapters/solid_queue_adapter.rb +0 -33
  268. data/lib/woods/console/bridge.rb +0 -210
  269. data/lib/woods/formatting/claude_adapter.rb +0 -98
  270. data/lib/woods/formatting/generic_adapter.rb +0 -56
  271. data/lib/woods/formatting/gpt_adapter.rb +0 -64
  272. data/lib/woods/notion/mapper.rb +0 -40
  273. data/lib/woods/observability/health_check.rb +0 -79
  274. data/lib/woods/observability/instrumentation.rb +0 -34
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: woods
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 2.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leah Armstrong
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-07-22 00:00:00.000000000 Z
11
+ date: 2026-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mcp
@@ -16,34 +16,60 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.2
19
+ version: '1.2'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '1.0'
22
+ version: '2.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.9.2
29
+ version: '1.2'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '1.0'
32
+ version: '2.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: json
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 2.19.9
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '3'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 2.19.9
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3'
33
53
  - !ruby/object:Gem::Dependency
34
54
  name: msgpack
35
55
  requirement: !ruby/object:Gem::Requirement
36
56
  requirements:
37
57
  - - ">="
38
58
  - !ruby/object:Gem::Version
39
- version: '1.5'
59
+ version: 1.8.2
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2'
40
63
  type: :runtime
41
64
  prerelease: false
42
65
  version_requirements: !ruby/object:Gem::Requirement
43
66
  requirements:
44
67
  - - ">="
45
68
  - !ruby/object:Gem::Version
46
- version: '1.5'
69
+ version: 1.8.2
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '2'
47
73
  - !ruby/object:Gem::Dependency
48
74
  name: prism
49
75
  requirement: !ruby/object:Gem::Requirement
@@ -65,6 +91,9 @@ dependencies:
65
91
  - - ">="
66
92
  - !ruby/object:Gem::Version
67
93
  version: '6.0'
94
+ - - "<"
95
+ - !ruby/object:Gem::Version
96
+ version: '9'
68
97
  type: :runtime
69
98
  prerelease: false
70
99
  version_requirements: !ruby/object:Gem::Requirement
@@ -72,6 +101,9 @@ dependencies:
72
101
  - - ">="
73
102
  - !ruby/object:Gem::Version
74
103
  version: '6.0'
104
+ - - "<"
105
+ - !ruby/object:Gem::Version
106
+ version: '9'
75
107
  description: |
76
108
  Woods extracts structured data from Rails applications for use in
77
109
  AI-assisted development tooling. It provides version-specific context by
@@ -94,6 +126,36 @@ files:
94
126
  - CONTRIBUTING.md
95
127
  - LICENSE.txt
96
128
  - README.md
129
+ - SECURITY.md
130
+ - assets/woods-wordmark-white-with-bg.png
131
+ - docs/AGENT_GUIDE.md
132
+ - docs/AGENT_SETUP.md
133
+ - docs/BACKEND_MATRIX.md
134
+ - docs/CONFIGURATION_REFERENCE.md
135
+ - docs/CONSOLE_MCP_SETUP.md
136
+ - docs/DOCKER_SETUP.md
137
+ - docs/EMBEDDING_MODELS.md
138
+ - docs/EVALUATION.md
139
+ - docs/EXTRACTOR_REFERENCE.md
140
+ - docs/FAQ.md
141
+ - docs/GETTING_STARTED.md
142
+ - docs/INCREMENTAL_EXTRACTION.md
143
+ - docs/INTERNALS.md
144
+ - docs/MCP_HTTP_TRANSPORT.md
145
+ - docs/MCP_SERVERS.md
146
+ - docs/MCP_TOOL_COOKBOOK.md
147
+ - docs/MCP_WORKTREE_SETUP.md
148
+ - docs/NOTION_INTEGRATION.md
149
+ - docs/OBSIDIAN_INTEGRATION.md
150
+ - docs/PUBLISHED_INDEX.md
151
+ - docs/README.md
152
+ - docs/RETRIEVAL_GUIDE.md
153
+ - docs/TOKEN_BENCHMARK.md
154
+ - docs/TROUBLESHOOTING.md
155
+ - docs/UNBLOCKED_INTEGRATION.md
156
+ - docs/UPGRADING_TO_2.md
157
+ - docs/WATCH_DAEMON.md
158
+ - docs/WHY_WOODS.md
97
159
  - exe/woods-console
98
160
  - exe/woods-console-mcp
99
161
  - exe/woods-mcp
@@ -105,6 +167,7 @@ files:
105
167
  - lib/generators/woods/templates/create_woods_tables.rb.erb
106
168
  - lib/generators/woods/templates/woods.rb.tt
107
169
  - lib/tasks/woods.rake
170
+ - lib/tasks/woods_checks.rake
108
171
  - lib/tasks/woods_evaluation.rake
109
172
  - lib/woods.rb
110
173
  - lib/woods/ast.rb
@@ -118,15 +181,12 @@ files:
118
181
  - lib/woods/cache/cache_store.rb
119
182
  - lib/woods/cache/redis_cache_store.rb
120
183
  - lib/woods/cache/solid_cache_store.rb
184
+ - lib/woods/change_set.rb
185
+ - lib/woods/checks/generation_resolution.rb
186
+ - lib/woods/checks/moved_messages.rb
121
187
  - lib/woods/chunking/chunk.rb
122
188
  - lib/woods/chunking/semantic_chunker.rb
123
- - lib/woods/console/adapters/cache_adapter.rb
124
- - lib/woods/console/adapters/good_job_adapter.rb
125
- - lib/woods/console/adapters/job_adapter.rb
126
- - lib/woods/console/adapters/sidekiq_adapter.rb
127
- - lib/woods/console/adapters/solid_queue_adapter.rb
128
189
  - lib/woods/console/audit_logger.rb
129
- - lib/woods/console/bridge.rb
130
190
  - lib/woods/console/bridge_protocol.rb
131
191
  - lib/woods/console/confirmation.rb
132
192
  - lib/woods/console/connection_manager.rb
@@ -136,6 +196,7 @@ files:
136
196
  - lib/woods/console/dispatch_pipeline.rb
137
197
  - lib/woods/console/embedded_executor.rb
138
198
  - lib/woods/console/eval_guard.rb
199
+ - lib/woods/console/input_contract.rb
139
200
  - lib/woods/console/model_validator.rb
140
201
  - lib/woods/console/rack_middleware.rb
141
202
  - lib/woods/console/redactor.rb
@@ -152,6 +213,7 @@ files:
152
213
  - lib/woods/console/tools/tier2.rb
153
214
  - lib/woods/console/tools/tier3.rb
154
215
  - lib/woods/console/tools/tier4.rb
216
+ - lib/woods/coordination/lock_heartbeat.rb
155
217
  - lib/woods/coordination/pipeline_lock.rb
156
218
  - lib/woods/cost_model.rb
157
219
  - lib/woods/cost_model/embedding_cost.rb
@@ -164,14 +226,27 @@ files:
164
226
  - lib/woods/db/migrations/004_create_snapshots.rb
165
227
  - lib/woods/db/migrations/005_create_snapshot_units.rb
166
228
  - lib/woods/db/migrations/006_rename_tables.rb
229
+ - lib/woods/db/migrations/007_typed_snapshot_units.rb
167
230
  - lib/woods/db/migrator.rb
168
231
  - lib/woods/db/schema_version.rb
169
232
  - lib/woods/dependency_graph.rb
233
+ - lib/woods/embedding/fake.rb
170
234
  - lib/woods/embedding/indexer.rb
171
235
  - lib/woods/embedding/openai.rb
172
236
  - lib/woods/embedding/provider.rb
173
237
  - lib/woods/embedding/text_preparer.rb
174
238
  - lib/woods/embedding/token_counter.rb
239
+ - lib/woods/evaluation/ablation_agent_payload.rb
240
+ - lib/woods/evaluation/ablation_executor.rb
241
+ - lib/woods/evaluation/ablation_provenance.rb
242
+ - lib/woods/evaluation/ablation_report_writer.rb
243
+ - lib/woods/evaluation/ablation_runner.rb
244
+ - lib/woods/evaluation/ablation_summary.rb
245
+ - lib/woods/evaluation/ablation_task.rb
246
+ - lib/woods/evaluation/ablation_task_set.rb
247
+ - lib/woods/evaluation/ablation_timed_executor.rb
248
+ - lib/woods/evaluation/ablation_worktree.rb
249
+ - lib/woods/evaluation/baseline.rb
175
250
  - lib/woods/evaluation/baseline_runner.rb
176
251
  - lib/woods/evaluation/evaluator.rb
177
252
  - lib/woods/evaluation/metrics.rb
@@ -185,6 +260,7 @@ files:
185
260
  - lib/woods/extractors/behavioral_profile.rb
186
261
  - lib/woods/extractors/caching_extractor.rb
187
262
  - lib/woods/extractors/callback_analyzer.rb
263
+ - lib/woods/extractors/component_discovery.rb
188
264
  - lib/woods/extractors/concern_extractor.rb
189
265
  - lib/woods/extractors/configuration_extractor.rb
190
266
  - lib/woods/extractors/controller_extractor.rb
@@ -197,17 +273,20 @@ files:
197
273
  - lib/woods/extractors/i18n_extractor.rb
198
274
  - lib/woods/extractors/job_extractor.rb
199
275
  - lib/woods/extractors/lib_extractor.rb
276
+ - lib/woods/extractors/line_neutralizer.rb
200
277
  - lib/woods/extractors/mailer_extractor.rb
201
278
  - lib/woods/extractors/manager_extractor.rb
202
279
  - lib/woods/extractors/middleware_extractor.rb
203
280
  - lib/woods/extractors/migration_extractor.rb
204
281
  - lib/woods/extractors/model_extractor.rb
282
+ - lib/woods/extractors/package_extractor.rb
205
283
  - lib/woods/extractors/phlex_extractor.rb
206
284
  - lib/woods/extractors/policy_extractor.rb
207
285
  - lib/woods/extractors/poro_extractor.rb
208
286
  - lib/woods/extractors/pundit_extractor.rb
209
287
  - lib/woods/extractors/rails_source_extractor.rb
210
288
  - lib/woods/extractors/rake_task_extractor.rb
289
+ - lib/woods/extractors/reference_patterns.rb
211
290
  - lib/woods/extractors/route_extractor.rb
212
291
  - lib/woods/extractors/route_helper_resolver.rb
213
292
  - lib/woods/extractors/scheduled_job_extractor.rb
@@ -215,6 +294,7 @@ files:
215
294
  - lib/woods/extractors/service_extractor.rb
216
295
  - lib/woods/extractors/shared_dependency_scanner.rb
217
296
  - lib/woods/extractors/shared_utility_methods.rb
297
+ - lib/woods/extractors/source_nesting.rb
218
298
  - lib/woods/extractors/state_machine_extractor.rb
219
299
  - lib/woods/extractors/test_mapping_extractor.rb
220
300
  - lib/woods/extractors/validator_extractor.rb
@@ -231,10 +311,10 @@ files:
231
311
  - lib/woods/flow_document.rb
232
312
  - lib/woods/flow_precomputer.rb
233
313
  - lib/woods/formatting/base.rb
234
- - lib/woods/formatting/claude_adapter.rb
235
- - lib/woods/formatting/generic_adapter.rb
236
- - lib/woods/formatting/gpt_adapter.rb
237
314
  - lib/woods/formatting/human_adapter.rb
315
+ - lib/woods/gem_mapper.rb
316
+ - lib/woods/generation.rb
317
+ - lib/woods/git_command.rb
238
318
  - lib/woods/git_provenance.rb
239
319
  - lib/woods/graph_analyzer.rb
240
320
  - lib/woods/index_artifact.rb
@@ -244,26 +324,30 @@ files:
244
324
  - lib/woods/mcp/config_resolver.rb
245
325
  - lib/woods/mcp/errors.rb
246
326
  - lib/woods/mcp/index_reader.rb
327
+ - lib/woods/mcp/index_reader_pinning.rb
247
328
  - lib/woods/mcp/origin_guard.rb
329
+ - lib/woods/mcp/protocol_policy.rb
248
330
  - lib/woods/mcp/provider_probe.rb
249
331
  - lib/woods/mcp/renderers/claude_renderer.rb
250
332
  - lib/woods/mcp/renderers/json_renderer.rb
251
333
  - lib/woods/mcp/renderers/markdown_renderer.rb
252
334
  - lib/woods/mcp/renderers/plain_renderer.rb
253
335
  - lib/woods/mcp/server.rb
336
+ - lib/woods/mcp/tasks/extension.rb
337
+ - lib/woods/mcp/tasks/request_capture.rb
338
+ - lib/woods/mcp/tasks/store.rb
339
+ - lib/woods/mcp/tool_contract.rb
254
340
  - lib/woods/mcp/tool_response_renderer.rb
255
341
  - lib/woods/mcp/version_aware_tool_dispatch.rb
256
342
  - lib/woods/model_name_cache.rb
257
343
  - lib/woods/notion/client.rb
258
344
  - lib/woods/notion/exporter.rb
259
- - lib/woods/notion/mapper.rb
260
345
  - lib/woods/notion/mappers/column_mapper.rb
261
346
  - lib/woods/notion/mappers/migration_mapper.rb
262
347
  - lib/woods/notion/mappers/model_mapper.rb
263
348
  - lib/woods/notion/mappers/shared.rb
264
349
  - lib/woods/notion/rate_limiter.rb
265
- - lib/woods/observability/health_check.rb
266
- - lib/woods/observability/instrumentation.rb
350
+ - lib/woods/notion/sync_manifest.rb
267
351
  - lib/woods/observability/structured_logger.rb
268
352
  - lib/woods/obsidian/errors.rb
269
353
  - lib/woods/obsidian/name_mapper.rb
@@ -273,7 +357,16 @@ files:
273
357
  - lib/woods/operator/error_escalator.rb
274
358
  - lib/woods/operator/pipeline_guard.rb
275
359
  - lib/woods/operator/status_reporter.rb
360
+ - lib/woods/path_dispatcher.rb
361
+ - lib/woods/payload_store.rb
362
+ - lib/woods/published_index.rb
363
+ - lib/woods/published_index/edge_shaper.rb
364
+ - lib/woods/published_index/generation_catalog.rb
365
+ - lib/woods/published_index/typed_unit_reader.rb
276
366
  - lib/woods/railtie.rb
367
+ - lib/woods/railtie_support.rb
368
+ - lib/woods/release.rb
369
+ - lib/woods/reload_policy.rb
277
370
  - lib/woods/resilience/circuit_breaker.rb
278
371
  - lib/woods/resilience/index_validator.rb
279
372
  - lib/woods/resilience/retryable_provider.rb
@@ -296,6 +389,7 @@ files:
296
389
  - lib/woods/session_tracer/redis_store.rb
297
390
  - lib/woods/session_tracer/session_flow_assembler.rb
298
391
  - lib/woods/session_tracer/session_flow_document.rb
392
+ - lib/woods/session_tracer/solid_cache_coordination.rb
299
393
  - lib/woods/session_tracer/solid_cache_store.rb
300
394
  - lib/woods/session_tracer/store.rb
301
395
  - lib/woods/storage/graph_store.rb
@@ -307,6 +401,7 @@ files:
307
401
  - lib/woods/storage/snapshotter/metadata.rb
308
402
  - lib/woods/storage/snapshotter/vector.rb
309
403
  - lib/woods/storage/vector_store.rb
404
+ - lib/woods/storage_identity.rb
310
405
  - lib/woods/tasks.rb
311
406
  - lib/woods/temporal/json_snapshot_store.rb
312
407
  - lib/woods/temporal/snapshot_store.rb
@@ -318,16 +413,32 @@ files:
318
413
  - lib/woods/unblocked/sync_manifest.rb
319
414
  - lib/woods/update_check.rb
320
415
  - lib/woods/util/host_guard.rb
416
+ - lib/woods/util/uuid5.rb
321
417
  - lib/woods/version.rb
418
+ - lib/woods/watch/daemon.rb
419
+ - lib/woods/watch/listen_watcher.rb
420
+ - lib/woods/watch/polling_watcher.rb
421
+ - lib/woods/watch/status.rb
422
+ - lib/woods/watch/tree_scan.rb
423
+ - lib/woods/watch/watcher.rb
424
+ - plugin/.claude-plugin/plugin.json
425
+ - plugin/hooks/hooks.json
426
+ - plugin/hooks/woods-post-edit.sh
427
+ - plugin/hooks/woods-session-start.sh
428
+ - plugin/skills/woods-agent-enable/SKILL.md
429
+ - plugin/skills/woods-diagnose/SKILL.md
430
+ - plugin/skills/woods-investigate/SKILL.md
431
+ - plugin/skills/woods-mcp-config/SKILL.md
432
+ - plugin/skills/woods-setup/SKILL.md
322
433
  homepage: https://github.com/lost-in-the/woods
323
434
  licenses:
324
435
  - MIT
325
436
  metadata:
326
437
  homepage_uri: https://github.com/lost-in-the/woods
327
- source_code_uri: https://github.com/lost-in-the/woods/tree/main
328
- changelog_uri: https://github.com/lost-in-the/woods/blob/main/CHANGELOG.md
438
+ source_code_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta2
439
+ changelog_uri: https://github.com/lost-in-the/woods/blob/v2.0.0.beta2/CHANGELOG.md
329
440
  bug_tracker_uri: https://github.com/lost-in-the/woods/issues
330
- documentation_uri: https://github.com/lost-in-the/woods/tree/main/docs
441
+ documentation_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta2/docs
331
442
  rubygems_mfa_required: 'true'
332
443
  post_install_message:
333
444
  rdoc_options: []
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Woods
4
- module Console
5
- module Adapters
6
- # Cache adapter that auto-detects the active cache store.
7
- #
8
- # Supports Redis, Solid Cache, memory, and file cache stores.
9
- # Detection checks Rails.cache class name first, then falls back
10
- # to checking for SolidCache constant.
11
- #
12
- # @example
13
- # CacheAdapter.detect # => :redis
14
- # CacheAdapter.stats # => { tool: 'cache_stats', params: {} }
15
- #
16
- module CacheAdapter
17
- STORE_PATTERNS = {
18
- 'RedisCacheStore' => :redis,
19
- 'MemoryStore' => :memory,
20
- 'FileStore' => :file
21
- }.freeze
22
-
23
- module_function
24
-
25
- # Detect the active cache store backend.
26
- #
27
- # @return [Symbol] One of :redis, :solid_cache, :memory, :file, :unknown
28
- def detect
29
- if defined?(::Rails) && ::Rails.respond_to?(:cache) && ::Rails.cache
30
- class_name = ::Rails.cache.class.name.to_s
31
- STORE_PATTERNS.each do |pattern, backend|
32
- return backend if class_name.include?(pattern)
33
- end
34
- end
35
-
36
- return :solid_cache if defined?(::SolidCache)
37
-
38
- :unknown
39
- end
40
-
41
- # Get cache store statistics.
42
- #
43
- # @param namespace [String, nil] Cache namespace filter
44
- # @return [Hash] Bridge request
45
- def stats(namespace: nil)
46
- { tool: 'cache_stats', params: { namespace: namespace }.compact }
47
- end
48
-
49
- # Get cache store info (backend type, configuration).
50
- #
51
- # @return [Hash] Bridge request
52
- def info
53
- { tool: 'cache_info', params: {} }
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'job_adapter'
4
-
5
- module Woods
6
- module Console
7
- module Adapters
8
- # Job backend adapter for GoodJob.
9
- #
10
- # Builds bridge requests for GoodJob queue stats, failure listing,
11
- # job lookup, scheduled jobs, and retry operations.
12
- #
13
- # @example
14
- # adapter = GoodJobAdapter.new
15
- # adapter.queue_stats # => { tool: 'good_job_queue_stats', params: {} }
16
- #
17
- class GoodJobAdapter < JobAdapter
18
- # Check if GoodJob is available in the current environment.
19
- #
20
- # @return [Boolean]
21
- def self.available?
22
- !!defined?(::GoodJob)
23
- end
24
-
25
- private
26
-
27
- def prefix
28
- 'good_job'
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Woods
4
- module Console
5
- module Adapters
6
- # Base class for job backend adapters.
7
- #
8
- # Subclasses implement `self.available?` and a private `prefix` method.
9
- # The prefix is used to build bridge tool names (e.g., "sidekiq_queue_stats").
10
- #
11
- # @example
12
- # class MyAdapter < JobAdapter
13
- # def self.available? = !!defined?(::MyQueue)
14
- # private
15
- # def prefix = 'my_queue'
16
- # end
17
- #
18
- class JobAdapter
19
- # Get queue statistics (sizes, latencies).
20
- #
21
- # @return [Hash] Bridge request
22
- def queue_stats
23
- { tool: "#{prefix}_queue_stats", params: {} }
24
- end
25
-
26
- # List recent job failures.
27
- #
28
- # @param limit [Integer] Max failures (default: 10, max: 100)
29
- # @return [Hash] Bridge request
30
- def recent_failures(limit: 10)
31
- limit = [limit, 100].min
32
- { tool: "#{prefix}_recent_failures", params: { limit: limit } }
33
- end
34
-
35
- # Find a job by its ID.
36
- #
37
- # A nil id is dropped from the bridge request so downstream tools see
38
- # a missing parameter rather than an explicit `nil` — symmetric with
39
- # `CacheAdapter.stats(namespace: nil)`.
40
- #
41
- # @param id [Object, nil] Job ID
42
- # @return [Hash] Bridge request
43
- def find_job(id:)
44
- { tool: "#{prefix}_find_job", params: { id: id }.compact }
45
- end
46
-
47
- # List scheduled jobs.
48
- #
49
- # @param limit [Integer] Max jobs (default: 20, max: 100)
50
- # @return [Hash] Bridge request
51
- def scheduled_jobs(limit: 20)
52
- limit = [limit, 100].min
53
- { tool: "#{prefix}_scheduled_jobs", params: { limit: limit } }
54
- end
55
-
56
- # Retry a failed job.
57
- #
58
- # A nil id is dropped from the bridge request — see #find_job.
59
- #
60
- # @param id [Object, nil] Job ID
61
- # @return [Hash] Bridge request
62
- def retry_job(id:)
63
- { tool: "#{prefix}_retry_job", params: { id: id }.compact }
64
- end
65
-
66
- private
67
-
68
- def prefix
69
- raise NotImplementedError, "#{self.class}#prefix must be implemented"
70
- end
71
- end
72
- end
73
- end
74
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'job_adapter'
4
-
5
- module Woods
6
- module Console
7
- module Adapters
8
- # Job backend adapter for Sidekiq.
9
- #
10
- # Builds bridge requests for Sidekiq queue stats, failure listing,
11
- # job lookup, scheduled jobs, and retry operations.
12
- #
13
- # @example
14
- # adapter = SidekiqAdapter.new
15
- # adapter.queue_stats # => { tool: 'sidekiq_queue_stats', params: {} }
16
- #
17
- class SidekiqAdapter < JobAdapter
18
- # Check if Sidekiq is available in the current environment.
19
- #
20
- # @return [Boolean]
21
- def self.available?
22
- !!defined?(::Sidekiq)
23
- end
24
-
25
- private
26
-
27
- def prefix
28
- 'sidekiq'
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'job_adapter'
4
-
5
- module Woods
6
- module Console
7
- module Adapters
8
- # Job backend adapter for Solid Queue.
9
- #
10
- # Builds bridge requests for Solid Queue job stats, failure listing,
11
- # job lookup, scheduled jobs, and retry operations.
12
- #
13
- # @example
14
- # adapter = SolidQueueAdapter.new
15
- # adapter.queue_stats # => { tool: 'solid_queue_queue_stats', params: {} }
16
- #
17
- class SolidQueueAdapter < JobAdapter
18
- # Check if Solid Queue is available in the current environment.
19
- #
20
- # @return [Boolean]
21
- def self.available?
22
- !!defined?(::SolidQueue)
23
- end
24
-
25
- private
26
-
27
- def prefix
28
- 'solid_queue'
29
- end
30
- end
31
- end
32
- end
33
- end