rubik 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.
Files changed (523) hide show
  1. checksums.yaml +7 -0
  2. data/ATTRIBUTION.md +139 -0
  3. data/CHANGELOG.md +236 -0
  4. data/LICENSE +21 -0
  5. data/README.md +269 -0
  6. data/bin/rubik +82 -0
  7. data/lib/rubik/adapter/base.rb +195 -0
  8. data/lib/rubik/adapter/c.rb +36 -0
  9. data/lib/rubik/adapter/crystal.rb +78 -0
  10. data/lib/rubik/adapter/generic.rb +86 -0
  11. data/lib/rubik/adapter/go.rb +36 -0
  12. data/lib/rubik/adapter/node.rb +146 -0
  13. data/lib/rubik/adapter/process.rb +78 -0
  14. data/lib/rubik/adapter/python.rb +30 -0
  15. data/lib/rubik/adapter/registry.rb +81 -0
  16. data/lib/rubik/adapter/ruby.rb +30 -0
  17. data/lib/rubik/adapter/rust.rb +36 -0
  18. data/lib/rubik/adapter/zig.rb +36 -0
  19. data/lib/rubik/adapter.rb +18 -0
  20. data/lib/rubik/ast/body_loader.rb +19 -0
  21. data/lib/rubik/ast/c_extractor.rb +114 -0
  22. data/lib/rubik/ast/cache_store.rb +191 -0
  23. data/lib/rubik/ast/extractor.rb +59 -0
  24. data/lib/rubik/ast/fallback_cleaner.rb +145 -0
  25. data/lib/rubik/ast/go_extractor.rb +148 -0
  26. data/lib/rubik/ast/graph.rb +272 -0
  27. data/lib/rubik/ast/python_extractor.rb +120 -0
  28. data/lib/rubik/ast/ruby_extractor.rb +260 -0
  29. data/lib/rubik/ast/rust_extractor.rb +127 -0
  30. data/lib/rubik/ast/symbol.rb +103 -0
  31. data/lib/rubik/ast/treesitter/base_walker.rb +109 -0
  32. data/lib/rubik/ast/treesitter/c_walker.rb +122 -0
  33. data/lib/rubik/ast/treesitter/go_walker.rb +120 -0
  34. data/lib/rubik/ast/treesitter/python_walker.rb +107 -0
  35. data/lib/rubik/ast/treesitter/rust_walker.rb +130 -0
  36. data/lib/rubik/ast/treesitter/typescript_walker.rb +182 -0
  37. data/lib/rubik/ast/treesitter/zig_walker.rb +109 -0
  38. data/lib/rubik/ast/treesitter_extractor.rb +93 -0
  39. data/lib/rubik/ast/typescript_extractor.rb +283 -0
  40. data/lib/rubik/ast/zig_extractor.rb +116 -0
  41. data/lib/rubik/ast.rb +13 -0
  42. data/lib/rubik/benchmark/runner.rb +224 -0
  43. data/lib/rubik/benchmark/synth_repo.rb +59 -0
  44. data/lib/rubik/benchmark.rb +9 -0
  45. data/lib/rubik/buffer/diff.rb +43 -0
  46. data/lib/rubik/buffer/manager.rb +427 -0
  47. data/lib/rubik/buffer/path_validator.rb +60 -0
  48. data/lib/rubik/buffer/snapshot.rb +99 -0
  49. data/lib/rubik/buffer.rb +10 -0
  50. data/lib/rubik/coeffects.rb +129 -0
  51. data/lib/rubik/concurrency/boundary.rb +74 -0
  52. data/lib/rubik/concurrency/dns_pool.rb +68 -0
  53. data/lib/rubik/concurrency/errors.rb +17 -0
  54. data/lib/rubik/concurrency/event_loop.rb +441 -0
  55. data/lib/rubik/concurrency/join.rb +55 -0
  56. data/lib/rubik/concurrency/process_waiter.rb +55 -0
  57. data/lib/rubik/concurrency/scheduler.rb +84 -0
  58. data/lib/rubik/concurrency/timers.rb +109 -0
  59. data/lib/rubik/concurrency.rb +132 -0
  60. data/lib/rubik/config/deep_ops.rb +80 -0
  61. data/lib/rubik/config/defaults.rb +248 -0
  62. data/lib/rubik/config/model_catalog.rb +93 -0
  63. data/lib/rubik/config/store.rb +155 -0
  64. data/lib/rubik/config.rb +216 -0
  65. data/lib/rubik/context/git_info.rb +84 -0
  66. data/lib/rubik/context/git_lister.rb +37 -0
  67. data/lib/rubik/context/index.rb +134 -0
  68. data/lib/rubik/context/repo_context_reader.rb +121 -0
  69. data/lib/rubik/context/scanner.rb +439 -0
  70. data/lib/rubik/context.rb +11 -0
  71. data/lib/rubik/diagnostics/collector.rb +200 -0
  72. data/lib/rubik/diagnostics/entry.rb +60 -0
  73. data/lib/rubik/diagnostics/parser.rb +107 -0
  74. data/lib/rubik/diagnostics.rb +10 -0
  75. data/lib/rubik/event_bus.rb +56 -0
  76. data/lib/rubik/kernel/dispatcher.rb +171 -0
  77. data/lib/rubik/kernel/dmesg.rb +116 -0
  78. data/lib/rubik/kernel/init.rb +177 -0
  79. data/lib/rubik/kernel/record.rb +85 -0
  80. data/lib/rubik/kernel/unit.rb +160 -0
  81. data/lib/rubik/llm/anthropic.rb +202 -0
  82. data/lib/rubik/llm/chunk_assembler.rb +285 -0
  83. data/lib/rubik/llm/client.rb +526 -0
  84. data/lib/rubik/llm/formatter.rb +450 -0
  85. data/lib/rubik/llm/message_sanitizer.rb +87 -0
  86. data/lib/rubik/llm/ollama.rb +167 -0
  87. data/lib/rubik/llm/openai.rb +21 -0
  88. data/lib/rubik/llm/openai_compatible.rb +216 -0
  89. data/lib/rubik/llm/provider.rb +125 -0
  90. data/lib/rubik/llm/registry.rb +336 -0
  91. data/lib/rubik/llm/router.rb +100 -0
  92. data/lib/rubik/llm.rb +18 -0
  93. data/lib/rubik/log.rb +38 -0
  94. data/lib/rubik/lsp/client.rb +475 -0
  95. data/lib/rubik/lsp/manager.rb +366 -0
  96. data/lib/rubik/lsp.rb +9 -0
  97. data/lib/rubik/mcp/boot_lifecycle.rb +114 -0
  98. data/lib/rubik/mcp/client.rb +169 -0
  99. data/lib/rubik/mcp/errors.rb +11 -0
  100. data/lib/rubik/mcp/manager.rb +619 -0
  101. data/lib/rubik/mcp/proxy_tool.rb +104 -0
  102. data/lib/rubik/mcp/transport/stdio.rb +255 -0
  103. data/lib/rubik/mcp.rb +12 -0
  104. data/lib/rubik/orchestrator/activity_log.rb +75 -0
  105. data/lib/rubik/orchestrator/auto_apply.rb +166 -0
  106. data/lib/rubik/orchestrator/budget_manager.rb +97 -0
  107. data/lib/rubik/orchestrator/continuation_manager.rb +161 -0
  108. data/lib/rubik/orchestrator/finish_message_selector.rb +55 -0
  109. data/lib/rubik/orchestrator/goal_ledger/drift.rb +71 -0
  110. data/lib/rubik/orchestrator/goal_ledger/ledger.rb +399 -0
  111. data/lib/rubik/orchestrator/goal_ledger/observation_projection.rb +179 -0
  112. data/lib/rubik/orchestrator/goal_ledger/patch.rb +268 -0
  113. data/lib/rubik/orchestrator/goal_ledger/schema.rb +123 -0
  114. data/lib/rubik/orchestrator/goal_ledger/validator.rb +361 -0
  115. data/lib/rubik/orchestrator/goal_ledger/verifier.rb +129 -0
  116. data/lib/rubik/orchestrator/goal_ledger/verify_spec.rb +50 -0
  117. data/lib/rubik/orchestrator/goal_ledger.rb +65 -0
  118. data/lib/rubik/orchestrator/goal_state.rb +184 -0
  119. data/lib/rubik/orchestrator/goal_wait.rb +125 -0
  120. data/lib/rubik/orchestrator/loop.rb +388 -0
  121. data/lib/rubik/orchestrator/lsp_feedback.rb +55 -0
  122. data/lib/rubik/orchestrator/maestro_gate.rb +65 -0
  123. data/lib/rubik/orchestrator/provider_recovery.rb +90 -0
  124. data/lib/rubik/orchestrator/provider_resolver.rb +69 -0
  125. data/lib/rubik/orchestrator/shell_deps.rb +85 -0
  126. data/lib/rubik/orchestrator/step_executor.rb +328 -0
  127. data/lib/rubik/orchestrator/stream_manager.rb +118 -0
  128. data/lib/rubik/orchestrator/subagent/activation.rb +65 -0
  129. data/lib/rubik/orchestrator/subagent/budget.rb +108 -0
  130. data/lib/rubik/orchestrator/subagent/completion.rb +61 -0
  131. data/lib/rubik/orchestrator/subagent/concurrency_gate.rb +37 -0
  132. data/lib/rubik/orchestrator/subagent/conversation_id.rb +67 -0
  133. data/lib/rubik/orchestrator/subagent/dependency.rb +398 -0
  134. data/lib/rubik/orchestrator/subagent/instance.rb +384 -0
  135. data/lib/rubik/orchestrator/subagent/lifecycle.rb +118 -0
  136. data/lib/rubik/orchestrator/subagent/messaging.rb +61 -0
  137. data/lib/rubik/orchestrator/subagent/narration.rb +125 -0
  138. data/lib/rubik/orchestrator/subagent/notices.rb +209 -0
  139. data/lib/rubik/orchestrator/subagent/questioner.rb +80 -0
  140. data/lib/rubik/orchestrator/subagent/reaper.rb +98 -0
  141. data/lib/rubik/orchestrator/subagent/resilience.rb +70 -0
  142. data/lib/rubik/orchestrator/subagent/reuse.rb +127 -0
  143. data/lib/rubik/orchestrator/subagent/scoped_registry.rb +79 -0
  144. data/lib/rubik/orchestrator/subagent/step_runner.rb +240 -0
  145. data/lib/rubik/orchestrator/subagent/storage_id.rb +26 -0
  146. data/lib/rubik/orchestrator/subagent/supervisor.rb +327 -0
  147. data/lib/rubik/orchestrator/subagent/transcript_formatter.rb +141 -0
  148. data/lib/rubik/orchestrator/subagent/type_registry.rb +199 -0
  149. data/lib/rubik/orchestrator/subagent_notice_inbox.rb +80 -0
  150. data/lib/rubik/orchestrator/tool_call_id.rb +47 -0
  151. data/lib/rubik/orchestrator/tool_circuit_breaker.rb +91 -0
  152. data/lib/rubik/orchestrator/tool_history.rb +39 -0
  153. data/lib/rubik/orchestrator/turn_executor/subagent_channel.rb +102 -0
  154. data/lib/rubik/orchestrator/turn_executor/user_channel.rb +172 -0
  155. data/lib/rubik/orchestrator/turn_executor.rb +376 -0
  156. data/lib/rubik/orchestrator.rb +11 -0
  157. data/lib/rubik/platform/filesystem.rb +64 -0
  158. data/lib/rubik/platform/io_drain.rb +53 -0
  159. data/lib/rubik/platform/path.rb +210 -0
  160. data/lib/rubik/platform/process.rb +38 -0
  161. data/lib/rubik/platform/sanitize.rb +157 -0
  162. data/lib/rubik/platform.rb +113 -0
  163. data/lib/rubik/plugin/dsl.rb +51 -0
  164. data/lib/rubik/plugin/manager.rb +247 -0
  165. data/lib/rubik/plugin/storage.rb +195 -0
  166. data/lib/rubik/plugin.rb +10 -0
  167. data/lib/rubik/prompt/context_builder.rb +377 -0
  168. data/lib/rubik/prompt/context_compactor.rb +326 -0
  169. data/lib/rubik/prompt/conversation_rows.rb +74 -0
  170. data/lib/rubik/prompt/doctrine.rb +160 -0
  171. data/lib/rubik/prompt/emergency_compactor.rb +81 -0
  172. data/lib/rubik/prompt/services.rb +60 -0
  173. data/lib/rubik/prompt/token_estimator.rb +63 -0
  174. data/lib/rubik/prompt/tool_teachings.rb +78 -0
  175. data/lib/rubik/prompt.rb +13 -0
  176. data/lib/rubik/repair/loop.rb +95 -0
  177. data/lib/rubik/repair.rb +8 -0
  178. data/lib/rubik/repl/ast_warmup.rb +129 -0
  179. data/lib/rubik/repl/command_context.rb +214 -0
  180. data/lib/rubik/repl/command_parser.rb +48 -0
  181. data/lib/rubik/repl/commands/agent.rb +30 -0
  182. data/lib/rubik/repl/commands/agent_context.rb +289 -0
  183. data/lib/rubik/repl/commands/agent_execution.rb +342 -0
  184. data/lib/rubik/repl/commands/agent_models.rb +212 -0
  185. data/lib/rubik/repl/commands/agent_providers.rb +232 -0
  186. data/lib/rubik/repl/commands/base.rb +55 -0
  187. data/lib/rubik/repl/commands/buffer.rb +124 -0
  188. data/lib/rubik/repl/commands/dmesg.rb +87 -0
  189. data/lib/rubik/repl/commands/lsp.rb +235 -0
  190. data/lib/rubik/repl/commands/mcp.rb +194 -0
  191. data/lib/rubik/repl/commands/plugins.rb +208 -0
  192. data/lib/rubik/repl/commands/pruner.rb +71 -0
  193. data/lib/rubik/repl/commands/session.rb +183 -0
  194. data/lib/rubik/repl/commands/skills.rb +111 -0
  195. data/lib/rubik/repl/commands/storage.rb +85 -0
  196. data/lib/rubik/repl/commands/subagents.rb +195 -0
  197. data/lib/rubik/repl/commands/system.rb +85 -0
  198. data/lib/rubik/repl/commands/tasks.rb +120 -0
  199. data/lib/rubik/repl/commands/workspace.rb +443 -0
  200. data/lib/rubik/repl/commands.rb +44 -0
  201. data/lib/rubik/repl/composition.rb +32 -0
  202. data/lib/rubik/repl/config_wiring.rb +142 -0
  203. data/lib/rubik/repl/confirmations.rb +56 -0
  204. data/lib/rubik/repl/hooks.rb +47 -0
  205. data/lib/rubik/repl/input_execution.rb +323 -0
  206. data/lib/rubik/repl/input_loop.rb +213 -0
  207. data/lib/rubik/repl/interrupt_handler.rb +217 -0
  208. data/lib/rubik/repl/lifecycle.rb +410 -0
  209. data/lib/rubik/repl/paste_support.rb +88 -0
  210. data/lib/rubik/repl/pending_notice_queue.rb +60 -0
  211. data/lib/rubik/repl/presentation.rb +132 -0
  212. data/lib/rubik/repl/pruner/brief.rb +101 -0
  213. data/lib/rubik/repl/pruner/gate.rb +279 -0
  214. data/lib/rubik/repl/pruner/harness.rb +236 -0
  215. data/lib/rubik/repl/pruner/rules.rb +316 -0
  216. data/lib/rubik/repl/pruner/service.rb +82 -0
  217. data/lib/rubik/repl/pruner.rb +39 -0
  218. data/lib/rubik/repl/service_catalog.rb +374 -0
  219. data/lib/rubik/repl/setup_factories.rb +66 -0
  220. data/lib/rubik/repl/shell.rb +231 -0
  221. data/lib/rubik/repl/step_formatter.rb +324 -0
  222. data/lib/rubik/repl/tee_io.rb +105 -0
  223. data/lib/rubik/repl/terminal_guard.rb +157 -0
  224. data/lib/rubik/repl/turn_recorder.rb +234 -0
  225. data/lib/rubik/repl.rb +14 -0
  226. data/lib/rubik/runtime/ast_service.rb +78 -0
  227. data/lib/rubik/runtime/context.rb +335 -0
  228. data/lib/rubik/runtime/diagnostic_engine.rb +188 -0
  229. data/lib/rubik/runtime/discovery.rb +342 -0
  230. data/lib/rubik/runtime/fiber.rb +142 -0
  231. data/lib/rubik/runtime/fiber_ordering.rb +52 -0
  232. data/lib/rubik/runtime/fiber_retry_gate.rb +84 -0
  233. data/lib/rubik/runtime/index_service.rb +58 -0
  234. data/lib/rubik/runtime/loop_service.rb +73 -0
  235. data/lib/rubik/runtime/manager.rb +241 -0
  236. data/lib/rubik/runtime/overlay_storage.rb +481 -0
  237. data/lib/rubik/runtime/service_definition.rb +54 -0
  238. data/lib/rubik/runtime/service_registration.rb +33 -0
  239. data/lib/rubik/runtime/task_manager.rb +302 -0
  240. data/lib/rubik/runtime.rb +19 -0
  241. data/lib/rubik/sandbox/driver/base.rb +30 -0
  242. data/lib/rubik/sandbox/driver/bubblewrap.rb +111 -0
  243. data/lib/rubik/sandbox/driver/docker.rb +113 -0
  244. data/lib/rubik/sandbox/driver/podman.rb +98 -0
  245. data/lib/rubik/sandbox/driver/process.rb +190 -0
  246. data/lib/rubik/sandbox/driver.rb +91 -0
  247. data/lib/rubik/sandbox/runner.rb +218 -0
  248. data/lib/rubik/sandbox/shell_resolver.rb +178 -0
  249. data/lib/rubik/sandbox.rb +8 -0
  250. data/lib/rubik/security/blocked_guidance.rb +187 -0
  251. data/lib/rubik/security/classifier/classifier.rb +440 -0
  252. data/lib/rubik/security/classifier/commands/agent-browser.yaml +9 -0
  253. data/lib/rubik/security/classifier/commands/apt.yaml +25 -0
  254. data/lib/rubik/security/classifier/commands/awk.yaml +10 -0
  255. data/lib/rubik/security/classifier/commands/basename.yaml +7 -0
  256. data/lib/rubik/security/classifier/commands/bash-classify.yaml +8 -0
  257. data/lib/rubik/security/classifier/commands/bash.yaml +20 -0
  258. data/lib/rubik/security/classifier/commands/black.yaml +12 -0
  259. data/lib/rubik/security/classifier/commands/brew.yaml +31 -0
  260. data/lib/rubik/security/classifier/commands/builtin.yaml +8 -0
  261. data/lib/rubik/security/classifier/commands/cargo.yaml +114 -0
  262. data/lib/rubik/security/classifier/commands/cat.yaml +7 -0
  263. data/lib/rubik/security/classifier/commands/chgrp.yaml +10 -0
  264. data/lib/rubik/security/classifier/commands/chmod.yaml +10 -0
  265. data/lib/rubik/security/classifier/commands/chown.yaml +10 -0
  266. data/lib/rubik/security/classifier/commands/column.yaml +7 -0
  267. data/lib/rubik/security/classifier/commands/comm.yaml +7 -0
  268. data/lib/rubik/security/classifier/commands/command.yaml +12 -0
  269. data/lib/rubik/security/classifier/commands/cp.yaml +7 -0
  270. data/lib/rubik/security/classifier/commands/crystal.yaml +63 -0
  271. data/lib/rubik/security/classifier/commands/curl.yaml +30 -0
  272. data/lib/rubik/security/classifier/commands/cut.yaml +7 -0
  273. data/lib/rubik/security/classifier/commands/date.yaml +10 -0
  274. data/lib/rubik/security/classifier/commands/df.yaml +7 -0
  275. data/lib/rubik/security/classifier/commands/diff.yaml +7 -0
  276. data/lib/rubik/security/classifier/commands/dig.yaml +7 -0
  277. data/lib/rubik/security/classifier/commands/dirname.yaml +7 -0
  278. data/lib/rubik/security/classifier/commands/docker.yaml +177 -0
  279. data/lib/rubik/security/classifier/commands/du.yaml +7 -0
  280. data/lib/rubik/security/classifier/commands/echo.yaml +7 -0
  281. data/lib/rubik/security/classifier/commands/env.yaml +15 -0
  282. data/lib/rubik/security/classifier/commands/eslint.yaml +12 -0
  283. data/lib/rubik/security/classifier/commands/eval.yaml +8 -0
  284. data/lib/rubik/security/classifier/commands/exec.yaml +12 -0
  285. data/lib/rubik/security/classifier/commands/expand.yaml +7 -0
  286. data/lib/rubik/security/classifier/commands/false.yaml +7 -0
  287. data/lib/rubik/security/classifier/commands/file.yaml +7 -0
  288. data/lib/rubik/security/classifier/commands/find.yaml +25 -0
  289. data/lib/rubik/security/classifier/commands/fmt.yaml +7 -0
  290. data/lib/rubik/security/classifier/commands/fold.yaml +7 -0
  291. data/lib/rubik/security/classifier/commands/free.yaml +7 -0
  292. data/lib/rubik/security/classifier/commands/gawk.yaml +10 -0
  293. data/lib/rubik/security/classifier/commands/gcloud.yaml +979 -0
  294. data/lib/rubik/security/classifier/commands/gh.yaml +615 -0
  295. data/lib/rubik/security/classifier/commands/git.yaml +524 -0
  296. data/lib/rubik/security/classifier/commands/glab-discussion.yaml +21 -0
  297. data/lib/rubik/security/classifier/commands/glab.yaml +807 -0
  298. data/lib/rubik/security/classifier/commands/go.yaml +44 -0
  299. data/lib/rubik/security/classifier/commands/gog.yaml +983 -0
  300. data/lib/rubik/security/classifier/commands/gradle.yaml +92 -0
  301. data/lib/rubik/security/classifier/commands/gradlew.yaml +92 -0
  302. data/lib/rubik/security/classifier/commands/grep.yaml +7 -0
  303. data/lib/rubik/security/classifier/commands/groups.yaml +7 -0
  304. data/lib/rubik/security/classifier/commands/gunzip.yaml +8 -0
  305. data/lib/rubik/security/classifier/commands/gws.yaml +211 -0
  306. data/lib/rubik/security/classifier/commands/gzip.yaml +7 -0
  307. data/lib/rubik/security/classifier/commands/hadolint.yaml +9 -0
  308. data/lib/rubik/security/classifier/commands/halt.yaml +8 -0
  309. data/lib/rubik/security/classifier/commands/head.yaml +7 -0
  310. data/lib/rubik/security/classifier/commands/helm.yaml +129 -0
  311. data/lib/rubik/security/classifier/commands/hostname.yaml +7 -0
  312. data/lib/rubik/security/classifier/commands/id.yaml +7 -0
  313. data/lib/rubik/security/classifier/commands/install.yaml +7 -0
  314. data/lib/rubik/security/classifier/commands/isort.yaml +14 -0
  315. data/lib/rubik/security/classifier/commands/java.yaml +35 -0
  316. data/lib/rubik/security/classifier/commands/javac.yaml +39 -0
  317. data/lib/rubik/security/classifier/commands/join.yaml +7 -0
  318. data/lib/rubik/security/classifier/commands/journalctl.yaml +14 -0
  319. data/lib/rubik/security/classifier/commands/jq.yaml +7 -0
  320. data/lib/rubik/security/classifier/commands/kill.yaml +7 -0
  321. data/lib/rubik/security/classifier/commands/killall.yaml +7 -0
  322. data/lib/rubik/security/classifier/commands/kubectl.yaml +211 -0
  323. data/lib/rubik/security/classifier/commands/less.yaml +7 -0
  324. data/lib/rubik/security/classifier/commands/ln.yaml +7 -0
  325. data/lib/rubik/security/classifier/commands/ls.yaml +7 -0
  326. data/lib/rubik/security/classifier/commands/make.yaml +21 -0
  327. data/lib/rubik/security/classifier/commands/md5sum.yaml +7 -0
  328. data/lib/rubik/security/classifier/commands/mise.yaml +579 -0
  329. data/lib/rubik/security/classifier/commands/mkdir.yaml +8 -0
  330. data/lib/rubik/security/classifier/commands/more.yaml +7 -0
  331. data/lib/rubik/security/classifier/commands/mv.yaml +7 -0
  332. data/lib/rubik/security/classifier/commands/mvn.yaml +83 -0
  333. data/lib/rubik/security/classifier/commands/mvnw.yaml +83 -0
  334. data/lib/rubik/security/classifier/commands/mypy.yaml +9 -0
  335. data/lib/rubik/security/classifier/commands/netstat.yaml +7 -0
  336. data/lib/rubik/security/classifier/commands/nice.yaml +11 -0
  337. data/lib/rubik/security/classifier/commands/nl.yaml +7 -0
  338. data/lib/rubik/security/classifier/commands/node.yaml +20 -0
  339. data/lib/rubik/security/classifier/commands/nohup.yaml +9 -0
  340. data/lib/rubik/security/classifier/commands/npm.yaml +71 -0
  341. data/lib/rubik/security/classifier/commands/npx.yaml +42 -0
  342. data/lib/rubik/security/classifier/commands/nslookup.yaml +7 -0
  343. data/lib/rubik/security/classifier/commands/paste.yaml +7 -0
  344. data/lib/rubik/security/classifier/commands/ping.yaml +7 -0
  345. data/lib/rubik/security/classifier/commands/pip.yaml +33 -0
  346. data/lib/rubik/security/classifier/commands/pip3.yaml +33 -0
  347. data/lib/rubik/security/classifier/commands/pipx.yaml +33 -0
  348. data/lib/rubik/security/classifier/commands/pkill.yaml +7 -0
  349. data/lib/rubik/security/classifier/commands/pnpm.yaml +346 -0
  350. data/lib/rubik/security/classifier/commands/poetry.yaml +97 -0
  351. data/lib/rubik/security/classifier/commands/poweroff.yaml +8 -0
  352. data/lib/rubik/security/classifier/commands/prettier.yaml +13 -0
  353. data/lib/rubik/security/classifier/commands/printenv.yaml +7 -0
  354. data/lib/rubik/security/classifier/commands/printf.yaml +7 -0
  355. data/lib/rubik/security/classifier/commands/ps.yaml +7 -0
  356. data/lib/rubik/security/classifier/commands/pup.yaml +882 -0
  357. data/lib/rubik/security/classifier/commands/pwd.yaml +7 -0
  358. data/lib/rubik/security/classifier/commands/pytest.yaml +7 -0
  359. data/lib/rubik/security/classifier/commands/python.yaml +9 -0
  360. data/lib/rubik/security/classifier/commands/python3.yaml +9 -0
  361. data/lib/rubik/security/classifier/commands/read.yaml +7 -0
  362. data/lib/rubik/security/classifier/commands/readlink.yaml +7 -0
  363. data/lib/rubik/security/classifier/commands/realpath.yaml +7 -0
  364. data/lib/rubik/security/classifier/commands/reboot.yaml +8 -0
  365. data/lib/rubik/security/classifier/commands/rev.yaml +7 -0
  366. data/lib/rubik/security/classifier/commands/rg.yaml +7 -0
  367. data/lib/rubik/security/classifier/commands/rm.yaml +8 -0
  368. data/lib/rubik/security/classifier/commands/rsync.yaml +12 -0
  369. data/lib/rubik/security/classifier/commands/rtk.yaml +140 -0
  370. data/lib/rubik/security/classifier/commands/ruff.yaml +29 -0
  371. data/lib/rubik/security/classifier/commands/rustfmt.yaml +14 -0
  372. data/lib/rubik/security/classifier/commands/scp.yaml +7 -0
  373. data/lib/rubik/security/classifier/commands/sed.yaml +14 -0
  374. data/lib/rubik/security/classifier/commands/seq.yaml +7 -0
  375. data/lib/rubik/security/classifier/commands/sh.yaml +14 -0
  376. data/lib/rubik/security/classifier/commands/sha1sum.yaml +7 -0
  377. data/lib/rubik/security/classifier/commands/sha256sum.yaml +7 -0
  378. data/lib/rubik/security/classifier/commands/shellcheck.yaml +10 -0
  379. data/lib/rubik/security/classifier/commands/shutdown.yaml +8 -0
  380. data/lib/rubik/security/classifier/commands/slack.yaml +113 -0
  381. data/lib/rubik/security/classifier/commands/sleep.yaml +8 -0
  382. data/lib/rubik/security/classifier/commands/snip.yaml +79 -0
  383. data/lib/rubik/security/classifier/commands/sort.yaml +10 -0
  384. data/lib/rubik/security/classifier/commands/ss.yaml +7 -0
  385. data/lib/rubik/security/classifier/commands/ssh.yaml +41 -0
  386. data/lib/rubik/security/classifier/commands/stat.yaml +7 -0
  387. data/lib/rubik/security/classifier/commands/stdbuf.yaml +15 -0
  388. data/lib/rubik/security/classifier/commands/strace.yaml +20 -0
  389. data/lib/rubik/security/classifier/commands/strings.yaml +11 -0
  390. data/lib/rubik/security/classifier/commands/sudo.yaml +24 -0
  391. data/lib/rubik/security/classifier/commands/systemctl.yaml +58 -0
  392. data/lib/rubik/security/classifier/commands/systemd-run.yaml +30 -0
  393. data/lib/rubik/security/classifier/commands/tac.yaml +7 -0
  394. data/lib/rubik/security/classifier/commands/tail.yaml +7 -0
  395. data/lib/rubik/security/classifier/commands/tar.yaml +25 -0
  396. data/lib/rubik/security/classifier/commands/tee.yaml +8 -0
  397. data/lib/rubik/security/classifier/commands/terraform.yaml +70 -0
  398. data/lib/rubik/security/classifier/commands/test.yaml +7 -0
  399. data/lib/rubik/security/classifier/commands/time.yaml +8 -0
  400. data/lib/rubik/security/classifier/commands/timeout.yaml +18 -0
  401. data/lib/rubik/security/classifier/commands/top.yaml +7 -0
  402. data/lib/rubik/security/classifier/commands/touch.yaml +8 -0
  403. data/lib/rubik/security/classifier/commands/tr.yaml +7 -0
  404. data/lib/rubik/security/classifier/commands/traceroute.yaml +7 -0
  405. data/lib/rubik/security/classifier/commands/true.yaml +7 -0
  406. data/lib/rubik/security/classifier/commands/tsc.yaml +16 -0
  407. data/lib/rubik/security/classifier/commands/type.yaml +7 -0
  408. data/lib/rubik/security/classifier/commands/uname.yaml +7 -0
  409. data/lib/rubik/security/classifier/commands/unexpand.yaml +7 -0
  410. data/lib/rubik/security/classifier/commands/uniq.yaml +7 -0
  411. data/lib/rubik/security/classifier/commands/unzip.yaml +10 -0
  412. data/lib/rubik/security/classifier/commands/uptime.yaml +7 -0
  413. data/lib/rubik/security/classifier/commands/uv.yaml +156 -0
  414. data/lib/rubik/security/classifier/commands/wait.yaml +11 -0
  415. data/lib/rubik/security/classifier/commands/wc.yaml +7 -0
  416. data/lib/rubik/security/classifier/commands/wget.yaml +7 -0
  417. data/lib/rubik/security/classifier/commands/whereis.yaml +7 -0
  418. data/lib/rubik/security/classifier/commands/which.yaml +7 -0
  419. data/lib/rubik/security/classifier/commands/whoami.yaml +7 -0
  420. data/lib/rubik/security/classifier/commands/xargs.yaml +26 -0
  421. data/lib/rubik/security/classifier/commands/xmllint.yaml +7 -0
  422. data/lib/rubik/security/classifier/commands/yarn.yaml +72 -0
  423. data/lib/rubik/security/classifier/commands/yes.yaml +7 -0
  424. data/lib/rubik/security/classifier/commands/yq.yaml +10 -0
  425. data/lib/rubik/security/classifier/commands/zip.yaml +8 -0
  426. data/lib/rubik/security/classifier/commands/zsh.yaml +14 -0
  427. data/lib/rubik/security/classifier/database.rb +216 -0
  428. data/lib/rubik/security/classifier/matcher/delegation.rb +190 -0
  429. data/lib/rubik/security/classifier/matcher/options.rb +245 -0
  430. data/lib/rubik/security/classifier/matcher/subcommands.rb +103 -0
  431. data/lib/rubik/security/classifier/matcher.rb +249 -0
  432. data/lib/rubik/security/classifier/models.rb +170 -0
  433. data/lib/rubik/security/classifier/parser.rb +23 -0
  434. data/lib/rubik/security/classifier/parsers/bash.rb +280 -0
  435. data/lib/rubik/security/classifier/parsers/bash_extractors.rb +221 -0
  436. data/lib/rubik/security/classifier/parsers/powershell.rb +185 -0
  437. data/lib/rubik/security/classifier/pwsh_rules.rb +224 -0
  438. data/lib/rubik/security/classifier.rb +25 -0
  439. data/lib/rubik/security/errors.rb +39 -0
  440. data/lib/rubik/security/guard.rb +954 -0
  441. data/lib/rubik/security/redactor.rb +89 -0
  442. data/lib/rubik/security.rb +11 -0
  443. data/lib/rubik/session/manager.rb +331 -0
  444. data/lib/rubik/session/recorder.rb +149 -0
  445. data/lib/rubik/session/replayer.rb +65 -0
  446. data/lib/rubik/session.rb +10 -0
  447. data/lib/rubik/skills/frontmatter.rb +41 -0
  448. data/lib/rubik/skills/manager.rb +223 -0
  449. data/lib/rubik/skills/registry.rb +64 -0
  450. data/lib/rubik/skills/skill.rb +33 -0
  451. data/lib/rubik/skills/storage.rb +77 -0
  452. data/lib/rubik/skills/validator.rb +116 -0
  453. data/lib/rubik/skills.rb +20 -0
  454. data/lib/rubik/storage/folding.rb +23 -0
  455. data/lib/rubik/storage/layout.rb +145 -0
  456. data/lib/rubik/storage/render.rb +97 -0
  457. data/lib/rubik/storage/service.rb +42 -0
  458. data/lib/rubik/storage/store.rb +514 -0
  459. data/lib/rubik/storage/transcript_indexer.rb +116 -0
  460. data/lib/rubik/storage/uri_reader.rb +168 -0
  461. data/lib/rubik/storage/vakanuvis/annal_writer.rb +92 -0
  462. data/lib/rubik/storage/vakanuvis/distill_gate.rb +323 -0
  463. data/lib/rubik/storage/vakanuvis/gate.rb +250 -0
  464. data/lib/rubik/storage/vakanuvis/harness.rb +421 -0
  465. data/lib/rubik/storage/vakanuvis/memory_steward.rb +163 -0
  466. data/lib/rubik/storage/vakanuvis/service.rb +69 -0
  467. data/lib/rubik/storage/vakanuvis/vocabulary.rb +99 -0
  468. data/lib/rubik/storage/vakanuvis/wiki_skeleton.rb +67 -0
  469. data/lib/rubik/storage/vakanuvis.rb +77 -0
  470. data/lib/rubik/storage.rb +29 -0
  471. data/lib/rubik/tools/base.rb +107 -0
  472. data/lib/rubik/tools/builtins/dmesg.rb +74 -0
  473. data/lib/rubik/tools/builtins/exec.rb +293 -0
  474. data/lib/rubik/tools/builtins/files.rb +354 -0
  475. data/lib/rubik/tools/builtins/goal_ledger.rb +89 -0
  476. data/lib/rubik/tools/builtins/grep.rb +281 -0
  477. data/lib/rubik/tools/builtins/interactive.rb +175 -0
  478. data/lib/rubik/tools/builtins/lifecycle.rb +359 -0
  479. data/lib/rubik/tools/builtins/lsp.rb +283 -0
  480. data/lib/rubik/tools/builtins/pruner.rb +88 -0
  481. data/lib/rubik/tools/builtins/runtime.rb +120 -0
  482. data/lib/rubik/tools/builtins/send_message.rb +109 -0
  483. data/lib/rubik/tools/builtins/show_file.rb +84 -0
  484. data/lib/rubik/tools/builtins/skill.rb +72 -0
  485. data/lib/rubik/tools/builtins/storage.rb +232 -0
  486. data/lib/rubik/tools/builtins/subagent.rb +356 -0
  487. data/lib/rubik/tools/builtins/subagent_lifecycle.rb +72 -0
  488. data/lib/rubik/tools/builtins/symbols.rb +209 -0
  489. data/lib/rubik/tools/builtins/synthesis.rb +314 -0
  490. data/lib/rubik/tools/builtins/task.rb +168 -0
  491. data/lib/rubik/tools/builtins/unsynthesize.rb +111 -0
  492. data/lib/rubik/tools/builtins/vakanuvis.rb +161 -0
  493. data/lib/rubik/tools/builtins.rb +30 -0
  494. data/lib/rubik/tools/catalog.rb +70 -0
  495. data/lib/rubik/tools/declaration.rb +90 -0
  496. data/lib/rubik/tools/diagnostic_reporter.rb +283 -0
  497. data/lib/rubik/tools/fuzzy_matcher.rb +172 -0
  498. data/lib/rubik/tools/native_search.rb +180 -0
  499. data/lib/rubik/tools/output.rb +54 -0
  500. data/lib/rubik/tools/preflight_runner.rb +209 -0
  501. data/lib/rubik/tools/registry.rb +247 -0
  502. data/lib/rubik/tools/result.rb +71 -0
  503. data/lib/rubik/tools/services.rb +96 -0
  504. data/lib/rubik/tools/truncator.rb +78 -0
  505. data/lib/rubik/tools/uri_resolver.rb +195 -0
  506. data/lib/rubik/tools.rb +14 -0
  507. data/lib/rubik/ui/approvals.rb +52 -0
  508. data/lib/rubik/ui/banner.rb +43 -0
  509. data/lib/rubik/ui/capability.rb +122 -0
  510. data/lib/rubik/ui/dialog.rb +106 -0
  511. data/lib/rubik/ui/diff_viewer.rb +78 -0
  512. data/lib/rubik/ui/frame.rb +95 -0
  513. data/lib/rubik/ui/markdown_stream.rb +107 -0
  514. data/lib/rubik/ui/panel.rb +98 -0
  515. data/lib/rubik/ui/renderer.rb +206 -0
  516. data/lib/rubik/ui/spinner.rb +120 -0
  517. data/lib/rubik/ui/statusline.rb +134 -0
  518. data/lib/rubik/ui/theme.rb +118 -0
  519. data/lib/rubik/ui.rb +57 -0
  520. data/lib/rubik/uris.rb +101 -0
  521. data/lib/rubik/version.rb +5 -0
  522. data/lib/rubik.rb +65 -0
  523. metadata +770 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4d73f60e02ac1d3902de40f910cb600612f5685c7e7a7ef2b7736b91567c14d8
4
+ data.tar.gz: ecf9501583c3e5c480efe0ad5093ba4dc8a5d91be08b33292503ee0b6f414e2f
5
+ SHA512:
6
+ metadata.gz: ccdb0699c44357cfe03c15ff0755293b38fca1e8b25daa1a7c47458f770242ce91c87ec723df61463931306a096a1d811dee35dd7404bb1033701276e2a81b8b
7
+ data.tar.gz: 21ec55890b5ba261f9cbb97b78fe7a87b07a9bc998e01ff4af52e7353935407a12003efcfae499af7c44004103b792aa42c85ee46fd5f647dc09b97842585015
data/ATTRIBUTION.md ADDED
@@ -0,0 +1,139 @@
1
+ # 📜 Open Source Attributions & Third-Party Notices
2
+
3
+ Rubik is built on the shoulders of giants. This document acknowledges and credits the open-source projects, academic research, and engineering communities whose code, ideas, and tools made Rubik possible.
4
+
5
+ ---
6
+
7
+ ## 🍴 1. Forked & Ported Projects
8
+
9
+ ### bash-classify
10
+ - **Original Project:** [`bash-classify`](https://github.com/fprochazka/bash-classify)
11
+ - **Original Author:** Filip Procházka ([@fprochazka](https://github.com/fprochazka))
12
+ - **Original Language:** Python
13
+ - **License:** MIT License
14
+ - **Rubik Integration:**
15
+ - Ported to pure Ruby under [`lib/rubik/security/classifier/`](lib/rubik/security/classifier/).
16
+ - Includes the comprehensive command database (175 popular CLI tool definition YAML files under [`lib/rubik/security/classifier/commands/`](lib/rubik/security/classifier/commands/)).
17
+ - Adapted to use `tree-sitter` for AST parsing, and extended with first-class **PowerShell** (`pwsh`) cmdlet risk classification and execution policy checking.
18
+
19
+ ```
20
+ MIT License
21
+
22
+ Copyright (c) 2025 Filip Prochazka
23
+
24
+ Permission is hereby granted, free of charge, to any person obtaining a copy
25
+ of this software and associated documentation files (the "Software"), to deal
26
+ in the Software without restriction, including without limitation the rights
27
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
28
+ copies of the Software, and to permit persons to whom the Software is
29
+ furnished to do so, subject to the following conditions:
30
+
31
+ The above copyright notice and this permission notice shall be included in all
32
+ copies or substantial portions of the Software.
33
+
34
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
37
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
38
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
39
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
40
+ SOFTWARE.
41
+ ```
42
+
43
+ ---
44
+
45
+ ## 🏛️ 2. Theoretical & Architectural Foundations
46
+
47
+ ### Spatiotemporal Composability
48
+ - **Paper:** *"A Programming Paradigm for Spatiotemporal Composability"*
49
+ - **Authors:** Yifan Shi (Peking University, DeepSeek-AI), Wei Zhang (Peking University), Tianyi Cui (DeepSeek-AI)
50
+ - **Reference Architecture:** Cordis / Cordiverse Meta-Framework
51
+ - **Rubik Implementation:**
52
+ - Theoretical backbone codified in [`AGENTS.md`](AGENTS.md).
53
+ - **Temporal Composability:** Monoidal LIFO Inverse Accumulator ($\Omega$) implemented in [`Rubik::Runtime::Context`](lib/rubik/runtime/context.rb).
54
+ - **Spatial Composability:** Reactive Coeffect Dependency DAG ($\Sigma \vdash C : \tau$) implemented in [`Rubik::Runtime::ComponentFiber`](lib/rubik/runtime/fiber.rb) and [`Rubik::Runtime::Manager`](lib/rubik/runtime/manager.rb).
55
+ - Zero-downtime hot reloading, atomic rollback on activation failure, and leak-free lifecycle management.
56
+
57
+ ---
58
+
59
+ ## 🌳 3. AST Parsing & Multi-Language Ecosystem
60
+
61
+ ### Tree-sitter
62
+ - **Project:** [`tree-sitter`](https://github.com/tree-sitter/tree-sitter)
63
+ - **Authors:** Max Brunsfeld and the Tree-sitter Authors
64
+ - **License:** MIT License
65
+ - **Usage:** Fast, incremental, robust concrete syntax tree parsing for multi-language semantic code intelligence, symbol extraction, and command security analysis.
66
+
67
+ ### tree_sitter_language_pack
68
+ - **Project:** [`tree-sitter-language-pack`](https://github.com/xberg-io/tree-sitter-language-pack)
69
+ - **Maintainer:** xberg-io
70
+ - **License:** MIT License
71
+ - **Grammars Leveraged:**
72
+ - `tree-sitter-bash`
73
+ - `tree-sitter-powershell`
74
+ - `tree-sitter-ruby`
75
+ - `tree-sitter-python`
76
+ - `tree-sitter-go`
77
+ - `tree-sitter-rust`
78
+ - `tree-sitter-c`
79
+ - `tree-sitter-zig`
80
+ - `tree-sitter-typescript` / `tree-sitter-javascript`
81
+
82
+ ---
83
+
84
+ ## 🛡️ 4. Operating System Sandboxing & Isolation
85
+
86
+ ### Bubblewrap (`bwrap`)
87
+ - **Project:** [`bubblewrap`](https://github.com/containers/bubblewrap)
88
+ - **Authors:** Project Atomic / Flatpak / GNOME contributors
89
+ - **License:** LGPL-2.0-or-later
90
+ - **Rubik Integration:**
91
+ - [`Rubik::Sandbox::Driver::BubblewrapDriver`](lib/rubik/sandbox/driver/bubblewrap.rb) utilizes unprivileged user namespaces (`CLONE_NEWUSER`, `CLONE_NEWNET`, `CLONE_NEWPID`) for hardware-enforced filesystem and network confinement without requiring root privileges.
92
+
93
+ ### Container Runtimes (Docker & Podman)
94
+ - **Projects:** [`moby/moby` (Docker Engine)](https://github.com/moby/moby) · [`containers/podman`](https://github.com/containers/podman)
95
+ - **Licenses:** Apache-2.0 (Docker/Moby) · GPL-2.0-or-later (Podman; libpod)
96
+ - **Rubik Integration:**
97
+ - [`Rubik::Sandbox::Driver::DockerDriver`](lib/rubik/sandbox/driver/docker.rb) and [`Rubik::Sandbox::Driver::PodmanDriver`](lib/rubik/sandbox/driver/podman.rb) drive these engines as **external CLI tools only** (no source code incorporated): workspace bind-mounts, memory/CPU/pids limits, and default network-off confinement.
98
+ - [`Rubik::Sandbox::Driver::ProcessDriver`](lib/rubik/sandbox/driver/process.rb) provides the always-available direct host fallback when no kernel-level sandbox is present.
99
+
100
+ ---
101
+
102
+ ## 💎 5. Open Source Ruby Gems & Libraries
103
+
104
+ | Gem | Author / Maintainer | License | Role in Rubik |
105
+ | :--- | :--- | :--- | :--- |
106
+ | **`diff-lcs`** | Austin Ziegler | MIT / Artistic / GPL | Longest Common Subsequence unified diff generation and hunk merging ([`Rubik::Buffer::Diff`](lib/rubik/buffer/diff.rb)). |
107
+ | **`tty-prompt`** | Piotr Murach | MIT | Interactive command-line select dialogs, multi-choice prompts, and questionnaires. |
108
+ | **`tty-spinner`** | Piotr Murach | MIT | Managed non-blocking lifecycle spinners and progress indication. |
109
+ | **`tty-markdown`** | Piotr Murach | MIT | Terminal ANSI/colorized Markdown rendering in the interactive REPL. |
110
+ | **`tty-which`** | Piotr Murach | MIT | Cross-platform executable binary locator. |
111
+ | **`pastel`** | Piotr Murach | MIT | Clean, chainable ANSI terminal coloring and theme painting. |
112
+ | **`strings-ansi`** | Piotr Murach | MIT | ANSI-aware string truncation and alignment for REPL formatters. |
113
+ | **`reline`** | Hiroshi SHIBATA & Ruby Team | Ruby License / BSD-2-Clause | Line-editing, history navigation, autocompletion hooks, and headless terminal adaptation. |
114
+ | **`prism`** | Kevin Newton & Ruby Core Team | MIT | High-performance Ruby parsing and AST extraction ([`Rubik::AST::RubyExtractor`](lib/rubik/ast/ruby_extractor.rb)). |
115
+ | **`minitest`** | Ryan Davis & seattlerb | MIT | Fast, modular test suite powering Rubik's 1,690+ unit, integration, and contract tests. |
116
+ | **`rubocop`** | Bozhidar Batsov & contributors | MIT | Static code analysis, style enforcement, and architectural hygiene gates. |
117
+ | **`benchmark`, `logger`, `pstore`, `reline`, `fiddle`** | Ruby core / rubygems teams | Ruby License / BSD-2-Clause | Ruby stdlib gems pinned explicitly in `rubik.gemspec` as they are unbundled from the default set in Ruby 3.4/3.5. |
118
+
119
+ ---
120
+
121
+ ## 🌐 6. Industry Specifications & Open Protocols
122
+
123
+ - **Language Server Protocol (LSP):**
124
+ - Specification by Microsoft Corporation (licensed under MIT / CC BY 4.0).
125
+ - Powering Rubik's cross-language diagnostics, symbol outlines, and jump-to-definition.
126
+ - **Model Context Protocol (MCP):**
127
+ - Specification and reference architecture by Anthropic, PBC (licensed under MIT License).
128
+ - Powering Rubik's dynamic multi-server tool discovery, stdio transport, and spatiotemporal tool isolation.
129
+ - **Server-Sent Events (SSE):**
130
+ - W3C Recommendation standard for streaming real-time LLM token responses and event telemetry.
131
+ - **Semantic Versioning 2.0.0:**
132
+ - Specification by Tom Preston-Werner (CC BY 3.0).
133
+
134
+ ---
135
+
136
+ ## ⚖️ 7. License of Rubik
137
+
138
+ Rubik itself is licensed under the **MIT License**.
139
+ See the [`LICENSE`](LICENSE) file for the full license text.
data/CHANGELOG.md ADDED
@@ -0,0 +1,236 @@
1
+ # Changelog
2
+
3
+ All notable changes to Rubik are documented here. 0.1.0 is the first packaged
4
+ release; its section is the thematic roll-up of the pre-gem history (485
5
+ commits, 2026-08-23 → 2026-10-09, see `git log`).
6
+
7
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
8
+
9
+ ## Unreleased
10
+
11
+ ### Added
12
+
13
+ - **Vakanüvis recall + write hardening** (issues #99/#100): `storage put`
14
+ now rejects non-string tags instead of silently stringifying booleans
15
+ into tag lists; search folds queries and haystacks with a Turkish-aware
16
+ I-class rule (ı/İ now match ASCII I text both ways) and ranks matches
17
+ with a deterministic field-tier bonus (title > tags > body, BM25 still
18
+ primary); an empty keyword-AND recall degrades honestly — top-3
19
+ OR-relaxed fallback matches plus a matching-transcript count hint;
20
+ `record` accepts first-class `tags` and deterministically auto-repairs
21
+ a missing `Keywords:` line; `forget` retires note refs (annal.*)
22
+ besides memory cards; digest compiles supersede byte-identical or
23
+ same-title duplicate pages instead of opening twins; a manual wiki
24
+ delete rebuilds the home index immediately; and two new chronicler
25
+ actions — `topics` (cold-start orientation over recorded cards) and
26
+ `digest_status` (queued vs in-flight digest visibility).
27
+
28
+ - **Structured goal ledger** (`orchestrator/goal_ledger/`, `goal.ledger.*`,
29
+ default ON — SKILL.state adaptation): the `!goal` loop now keeps a
30
+ rev-guarded ΔΣ state ledger (objective, tasks, findings, decisions,
31
+ open questions, environment notes) that the maestro patches through the
32
+ root-only `update_goal_ledger` tool (RFC 6902 subset; classified
33
+ `syntax/schema/conflict` feedback with a bounded retry budget). The
34
+ current Σ is pinned through every compaction tier and re-injected each
35
+ step; every accepted revision appends a storage row (`goal-ledger`
36
+ ref). Re-verification (`goal.ledger.verify`): declarative FS verify
37
+ specs are re-checked at step boundaries — failures flip tasks to
38
+ `stale` via an internal rev-bumping mutation (a stale-rev `:conflict`
39
+ is the drift signal) and ride a silent `:ledger_drift` event plus a
40
+ bounded drift note. Observation projection
41
+ (`goal.ledger.observe_projection`): at compaction time, banked tool
42
+ results get per-row `<absorbed_into_ledger>` tombstones (rows are
43
+ never dropped; the last `observe_window` turns stay raw). All three
44
+ knobs ship ON with explicit opt-out; `goal.*` config is operator-only.
45
+
46
+ - **Context pruner** (`repl/pruner/`, via `subagents.pruner.*` — shipped
47
+ DEFAULT OFF on 2026-10-09, then enabled by DEFAULT on 2026-10-10, see
48
+ Changed below):
49
+ a semi-deterministic cleaner for the ROOT (maestro) conversation window,
50
+ modeled on the Vakanüvis two-plane design. An LLM "Context Pruner"
51
+ subagent proposes a keep/drop/summarize plan from a deterministic unit
52
+ snapshot; the harness validates it against strict invariants (goal
53
+ pinning, tool-use pairing, head/tail bands, target token budget) and
54
+ applies it atomically at the next turn boundary — never mid-turn, never
55
+ from a background thread. Surfaces: the `prune_context` tool
56
+ (root-only, coeffect-gated, invisible while the knob is off), the
57
+ `!prune [now|status]` command, auto-scheduling on `:turn_finished`
58
+ gated by `trigger_ratio`/`min_turns_between`. The deterministic
59
+ compaction stack is unchanged and remains the safety net; subagent
60
+ pruning stays fully deterministic and untouched.
61
+
62
+ ### Changed
63
+
64
+ - **The root window pruner is enabled by default** (`subagents.pruner.enabled`
65
+ `false` → `true`, 2026-10-10 user decision). Every root session now boots the
66
+ pruner harness: the `prune_context` tool and `!prune` command are on, and the
67
+ LLM pruner auto-fires at `trigger_ratio` once the window estimate crosses it
68
+ (budget still bounded by `max_steps`/`min_turns_between`; the deterministic
69
+ compaction stack remains the safety net and subagent channels stay untouched).
70
+ The knob remains as an explicit opt-out kill-switch
71
+ (`subagents.pruner.enabled: false`); the `RUBIK_TEST=1` suite armor is
72
+ unchanged, so scripted tests keep the pruner unbound unless
73
+ `RUBIK_PRUNER_FORCE=1`.
74
+
75
+ - **Subagent transcript health package**: the durable subagent transcript
76
+ is now an operational log, not a verbatim history dump. (1) The runtime-
77
+ assembled system prompt (history row 1) serializes as a meta stub —
78
+ `[assembled system prompt omitted] prompt_sha256=<first 16 hex>` — for
79
+ builtin archetypes, whose prompts are reconstructible from defaults;
80
+ custom types (`synthesize_tool`) and caller-provided `system_prompt:` keep
81
+ the verbatim copy, since they are the single record anywhere. A frozen
82
+ prompt blob was a config+version derivative with neither recorded;
83
+ the provenance hash makes it verifiable and drift-detectable instead.
84
+ (2) Redaction parity with root session logs: every durable row passes the
85
+ same `Rubik::Security::Redactor` masker (text patterns + secret-shaped
86
+ keys), so a secret echoed in tool output or args no longer lands raw in
87
+ the storage-absorbed transcript; in-memory history stays raw for provider
88
+ wire fidelity. (3) Transcript index entities are task+result centric
89
+ instead of "first 40 JSONL lines": system-prompt boilerplate no longer
90
+ pollutes the BM25 corpus and the final result is now searchable ("which
91
+ subagent reported red?"); failed instances still get a body (task + state
92
+ line) and the upsert/dedupe/canonical-link contract is unchanged.
93
+
94
+ ### Fixed
95
+
96
+ - **REPL wake-loop**: subagent notices stranded at turn end re-armed the
97
+ reactive wake (synthetic Enter), so a steady subagent stream chained
98
+ autonomous maestro turns forever — the prompt never returned and the cycle
99
+ survived Ctrl+C, because the interrupted turn's own ensure block re-armed
100
+ the wake. Settlement invariant: an autonomous notice turn never spawns
101
+ another one, and an interrupted turn settles the wake debt; the
102
+ model-channel no-loss delivery is unchanged.
103
+
104
+ ## [0.1.0] - 2026-10-09
105
+
106
+ First rubygems.org release of the `rubik` gem. Linux and macOS install out of
107
+ the box; **Windows** needs the Rust GNU toolchain because
108
+ `tree_sitter_language_pack` publishes no Windows prebuilt — see the README
109
+ installation section.
110
+
111
+ ### Added
112
+
113
+ - **Vakanüvis v2 pipeline** (plan `_plan/vakanuvis-v2-2026-10-06.md`, from the
114
+ vue-hakedis review `note.2.6af8197f2600ea57`): the chronicler's compile
115
+ pipeline is now card-first and recall-aware.
116
+ - `Store#search_ranked` — BM25-lite relevance ranking for recall (same
117
+ token-AND candidate gate as `search`; df free from the filter pass,
118
+ bytesize length normalization, tf scanned only over matches; ties break
119
+ `updated_at` desc then `[type,row]`). `search`'s `[type,row]` contract is
120
+ untouched; ranking lives in the recall presentation layer only. New rake
121
+ bench metric measures the ranked/plain add-on ratio (1.44x measured).
122
+ - Card-first distiller brief: memory cards head the source list (capped,
123
+ honest empty state), the session annal is demoted to an event index, and
124
+ the content policy bans "turn N" narratives/raw measurements, requires a
125
+ one-sentence opener (doubles as the home-index line), `Last verified:`,
126
+ and a bilingual `Keywords:` line (recall is keyword-AND; a TR query
127
+ cannot find an EN page without shared vocabulary). Harvest stamps
128
+ `links['verified_session']` as the deterministic staleness trace.
129
+ - Source discipline: `job[:transcript_uris]` (previously declared but never
130
+ populated) now snapshots completed-only, non-vakanuvis transcripts
131
+ (newest 8); the brief fences the list as out-of-scope beyond it.
132
+ - Recall smoke test: proposals may end with up to 5 `CHECK: <query>` lines;
133
+ the harness runs them through real recall semantics after each compile,
134
+ writes recall-gap note cards on misses, surfaces them in the next brief
135
+ as Keywords-enrichment requests, and supersedes the gap note on a clean
136
+ pass (self-healing; Plane 1 never edits distilled prose).
137
+ - Dirty-guarded batch spawning (durable-content footprint instead of raw
138
+ event counts — pure turn traffic no longer burns a distiller) and digest
139
+ dedupe ("already queued" receipt for in-flight targets). The wiki home
140
+ index now carries a one-line summary per page.
141
+
142
+ ### Changed
143
+
144
+ - **Storage reads are UTF-8-pinned and cached**: store file reads
145
+ (`load_records`, meta/index, transcript excerpts) force UTF-8 with scrub
146
+ instead of trusting the process external encoding — non-ASCII recall
147
+ queries no longer risk `Encoding::CompatibilityError` on non-UTF-8 Windows
148
+ locales (TR cp1254/cp857). `Store#search`/`list` accept a type ARRAY,
149
+ and parsed records plus search haystacks are memoized behind an
150
+ mtime-validated cache (writes drop it; external edits self-heal). Measured
151
+ 123 ms → 14 ms per warm scoped query on a synthetic 1150-row/1 MB store.
152
+
153
+ - **Silent concurrency via Fiber Scheduler** (`Rubik::Concurrency`): a
154
+ pure-stdlib `Fiber::Scheduler` event loop (`IO.select` + monotonic timer
155
+ heap + self-pipe cross-thread wakeups) with a thread-scoped `silently` /
156
+ `map(enum, concurrency:)` boundary. Plain blocking I/O call sites —
157
+ Net::HTTP, sleep backoffs, Open3 pipe reads/writes, Mutex/CV waits,
158
+ Thread#join — interleave cooperatively on one thread with ZERO changes at
159
+ the call sites (thousands of concurrent ops; I/O concurrency, not CPU
160
+ parallelism). Handles the Ruby 3.3/4.0 scheduler protocol drift
161
+ (`fiber(&blk)` creation handoff, io_read/io_write buffer contracts) and
162
+ Windows realities (no `IO#nonblock=`; `Fiber.blocking`-wrapped
163
+ nonblocking primitives). Escape hatch: `RUBIK_FIBER_SCHEDULER=off`
164
+ degrades every boundary to sequential execution.
165
+
166
+ - **MCP config boot overlaps server connect phases**:
167
+ `Manager#load_from_config` now runs the slow I/O half (spawn +
168
+ initialize + tools/list) of every configured server concurrently through
169
+ the concurrency boundary while registration and state application stay
170
+ sequential in config order. Boot wall clock goes sum(per-server) →
171
+ max(per-server); one hung server no longer delays the rest. Per-server
172
+ failure isolation, warning text, and tool registration order are
173
+ byte-identical to the sequential path (`RUBIK_FIBER_SCHEDULER=off`
174
+ restores it). Tests can inject fakes via `Manager.new(client_factory:)`.
175
+
176
+ ### Highlights
177
+
178
+ - **Self-evolving tool runtime**: synthesized tools with fail-closed AST
179
+ security gates, hot reload, and unsynthesize; skills and MCP tools join the
180
+ same coeffect-gated registry.
181
+ - **Spatiotemporal runtime**: revertible-effect `Context` (LIFO Ω unwind,
182
+ atomic rollback, deferred-signal drain), topological fiber reconciliation,
183
+ reactive provide/unprovide, and a kernel event bus with dmesg telemetry
184
+ (Plans 102–107).
185
+ - **Subagent hierarchy**: init-0 orchestration contexts, step budgets with
186
+ pause/resume negotiation, wait protocol with reactive event-bus wakeups,
187
+ process-unique transcript ids, and budget transparency (Plans 94–96, 109).
188
+ - **Security gate hardening**: command classifier with fail-closed unknown
189
+ handling, symlink-resolved critical-write block, TOCTOU-closed atomic
190
+ writes, unified guard policy, secret redaction, and sandbox process
191
+ isolation (Plan 108, 111).
192
+
193
+ ### Added
194
+
195
+ - Agent loop: token budget autonomy with auto-continuation, wait hints,
196
+ reactive wakeups, and structured failure notices (Plan 90, 109).
197
+ - Kernel: deterministic event dispatcher, kworker queue, monotonic dmesg ring
198
+ buffer with `!dmesg` (Plans 102–104).
199
+ - Tools: `ask_question` interactive dialog (Plan 92), async background task
200
+ manager with `manage_task` (Plan 93), native search with rg fallback,
201
+ AST-backed symbols, LSP diagnostics surfacing.
202
+ - REPL: `!paste` mode with burst join (Plan 91), per-dispatch CommandContext,
203
+ session prune, command usage synopses, non-blocking prompt with terminal
204
+ guard (Plan 105).
205
+ - Config: typed model/provider catalog CRUD (`upsert_provider_model`,
206
+ `set_model_spec`, …) with uniform persist-failure outcome hashes; modular
207
+ Config (defaults/deep_ops/store/model_catalog mixins).
208
+ - Testing: shared scripted agent-loop harness, slow-file quarantine with
209
+ measured profiling, parallel worker task (N=4 stable).
210
+
211
+ ### Fixed
212
+
213
+ - Security: classify env-assignment payloads as inner commands; expression-
214
+ exclusive dangerous-AST sentinel; normalize paths and canonicalize Windows
215
+ allowlists; keep delegated redirects classified.
216
+ - Runtime: per-fiber dispose isolation with LIFO unwind; complete context
217
+ drain before re-raising interrupts; post-dispose registration guard;
218
+ task-tree teardown via `kill_all` inverse.
219
+ - LLM: jittered retries, idle-reset stream timeouts, honest blocked-guidance
220
+ reasons, overflow-pattern hardening.
221
+ - Buffer: resolved containment enforced at both sanitize and apply
222
+ boundaries; rename-only atomic writes; apply-failure surfacing.
223
+ - LSP: robust header framing with response TTL and cancellation; Windows byte
224
+ framing; reader-loop error isolation.
225
+ - Config/REPL: silent-persist gaps closed — blocked deletions surfaced,
226
+ persist failures reported instead of silent success.
227
+
228
+ ### Performance
229
+
230
+ - AST: sub-second mtime plus content-hash cache keys; persistent lazy
231
+ indexing (Plan 39); background warmup with teardown joins.
232
+ - Context: serialized index mutations, snapshot-outside-lock reconcile,
233
+ streaming-first truncation.
234
+
235
+ [Unreleased]: https://github.com/ozgurulukir/rubik/compare/v0.1.0...HEAD
236
+ [0.1.0]: https://github.com/ozgurulukir/rubik/releases/tag/v0.1.0
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Özgür Ulukır, Rubik Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.