omdev 0.0.54__tar.gz → 0.0.55__tar.gz

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 (598) hide show
  1. {omdev-0.0.54/omdev.egg-info → omdev-0.0.55}/PKG-INFO +12 -12
  2. {omdev-0.0.54 → omdev-0.0.55}/omdev/.om-manifests.json +14 -26
  3. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/cli.py +26 -0
  4. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/depsets/system.toml +6 -3
  5. omdev-0.0.55/omdev/dockerdev/secrets.py +160 -0
  6. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/aborting.py +3 -2
  7. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/pulling.py +3 -3
  8. {omdev-0.0.54 → omdev-0.0.55}/omdev/home/secretinject.py +46 -26
  9. omdev-0.0.55/omdev/js/vendor/README.md +116 -0
  10. omdev-0.0.55/omdev/js/vendor/TODO.md +39 -0
  11. omdev-0.0.55/omdev/js/vendor/__init__.py +100 -0
  12. {omdev-0.0.54/omdev/tui/diff → omdev-0.0.55/omdev/js/vendor}/__main__.py +1 -1
  13. omdev-0.0.55/omdev/js/vendor/_dataclasses.py +4834 -0
  14. omdev-0.0.55/omdev/js/vendor/archives.py +133 -0
  15. omdev-0.0.55/omdev/js/vendor/cli.py +163 -0
  16. omdev-0.0.55/omdev/js/vendor/downloads.py +91 -0
  17. omdev-0.0.55/omdev/js/vendor/exports.py +180 -0
  18. omdev-0.0.55/omdev/js/vendor/generation.py +182 -0
  19. omdev-0.0.55/omdev/js/vendor/licenses.py +45 -0
  20. omdev-0.0.55/omdev/js/vendor/manifests.py +226 -0
  21. omdev-0.0.55/omdev/js/vendor/models.py +257 -0
  22. omdev-0.0.55/omdev/js/vendor/modules.py +167 -0
  23. omdev-0.0.55/omdev/js/vendor/operations.py +161 -0
  24. omdev-0.0.55/omdev/js/vendor/outputs.py +125 -0
  25. omdev-0.0.55/omdev/js/vendor/parsing.py +436 -0
  26. omdev-0.0.55/omdev/js/vendor/registry.py +157 -0
  27. omdev-0.0.55/omdev/js/vendor/resolution.py +193 -0
  28. omdev-0.0.55/omdev/js/vendor/semver.py +322 -0
  29. omdev-0.0.55/omdev/js/vendor/verification.py +218 -0
  30. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/__init__.py +1 -0
  31. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/_dataclasses.py +34 -34
  32. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/_dataclasses.py +10 -10
  33. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/lib/io/pipelines.py +1 -4
  34. omdev-0.0.55/omdev/specs/irc/__init__.py +9 -0
  35. omdev-0.0.55/omdev/specs/irc/_dataclasses.py +5296 -0
  36. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/numerics/formats.py +1 -1
  37. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/numerics/types.py +1 -1
  38. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/message.py +2 -1
  39. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/nuh.py +2 -1
  40. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/docker.py +30 -0
  41. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/git/cli.py +2 -2
  42. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/shell.py +12 -0
  43. {omdev-0.0.54 → omdev-0.0.55/omdev.egg-info}/PKG-INFO +12 -12
  44. {omdev-0.0.54 → omdev-0.0.55}/omdev.egg-info/SOURCES.txt +101 -88
  45. {omdev-0.0.54 → omdev-0.0.55}/omdev.egg-info/requires.txt +11 -11
  46. {omdev-0.0.54 → omdev-0.0.55}/pyproject.toml +12 -12
  47. omdev-0.0.54/omdev/git/status.py +0 -311
  48. omdev-0.0.54/omdev/tools/diff.py +0 -29
  49. omdev-0.0.54/omdev/tui/diff/LICENSE +0 -21
  50. omdev-0.0.54/omdev/tui/diff/README.md +0 -9
  51. omdev-0.0.54/omdev/tui/diff/__init__.py +0 -20
  52. omdev-0.0.54/omdev/tui/diff/cli.py +0 -64
  53. omdev-0.0.54/omdev/tui/diff/rendering.py +0 -539
  54. omdev-0.0.54/omdev/tui/diff/terminal.py +0 -32
  55. omdev-0.0.54/omdev/tui/diff/themes.py +0 -80
  56. omdev-0.0.54/omdev/tui/minitui/tty/__init__.py +0 -0
  57. {omdev-0.0.54 → omdev-0.0.55}/LICENSE +0 -0
  58. {omdev-0.0.54 → omdev-0.0.55}/MANIFEST.in +0 -0
  59. {omdev-0.0.54 → omdev-0.0.55}/README.md +0 -0
  60. {omdev-0.0.54 → omdev-0.0.55}/omdev/README.md +0 -0
  61. {omdev-0.0.54 → omdev-0.0.55}/omdev/__about__.py +0 -0
  62. {omdev-0.0.54 → omdev-0.0.55}/omdev/__init__.py +0 -0
  63. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/__init__.py +0 -0
  64. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/__main__.py +0 -0
  65. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/cli/__init__.py +0 -0
  66. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/cli/main.py +0 -0
  67. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/__init__.py +0 -0
  68. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/gen.py +0 -0
  69. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/imports.py +0 -0
  70. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/manifests.py +0 -0
  71. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/resources.py +0 -0
  72. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/srcfiles.py +0 -0
  73. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/strip.py +0 -0
  74. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/types.py +0 -0
  75. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/gen/typing.py +0 -0
  76. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/info.py +0 -0
  77. {omdev-0.0.54 → omdev-0.0.55}/omdev/amalg/sources.py +0 -0
  78. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/__init__.py +0 -0
  79. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/__init__.py +0 -0
  80. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/cache.py +0 -0
  81. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/contexts.py +0 -0
  82. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/currents.py +0 -0
  83. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/fns.py +0 -0
  84. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/resolvers.py +0 -0
  85. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/storage.py +0 -0
  86. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/compute/types.py +0 -0
  87. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/data/__init__.py +0 -0
  88. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/data/actions.py +0 -0
  89. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/data/cache.py +0 -0
  90. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/data/consts.py +0 -0
  91. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/data/defaults.py +0 -0
  92. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/data/manifests.py +0 -0
  93. {omdev-0.0.54 → omdev-0.0.55}/omdev/cache/data/specs.py +0 -0
  94. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/__init__.py +0 -0
  95. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/darwin/__init__.py +0 -0
  96. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/darwin/aps.py +0 -0
  97. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/darwin/ax.py +0 -0
  98. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/darwin/cf.py +0 -0
  99. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/darwin/cg.py +0 -0
  100. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/linux/__init__.py +0 -0
  101. {omdev-0.0.54 → omdev-0.0.55}/omdev/capi/linux/x11.py +0 -0
  102. {omdev-0.0.54 → omdev-0.0.55}/omdev/cc/__init__.py +0 -0
  103. {omdev-0.0.54 → omdev-0.0.55}/omdev/cc/__main__.py +0 -0
  104. {omdev-0.0.54 → omdev-0.0.55}/omdev/cc/cdeps.py +0 -0
  105. {omdev-0.0.54 → omdev-0.0.55}/omdev/cc/cdeps.toml +0 -0
  106. {omdev-0.0.54 → omdev-0.0.55}/omdev/cc/cli.py +0 -0
  107. {omdev-0.0.54 → omdev-0.0.55}/omdev/cc/srclangs.py +0 -0
  108. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/__init__.py +0 -0
  109. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_boilerplate.cc +0 -0
  110. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/LICENSE +0 -0
  111. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/__init__.py +0 -0
  112. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/build_ext.py +0 -0
  113. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  114. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  115. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/compilers/options.py +0 -0
  116. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  117. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/dir_util.py +0 -0
  118. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/errors.py +0 -0
  119. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/extension.py +0 -0
  120. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/file_util.py +0 -0
  121. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/modified.py +0 -0
  122. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/spawn.py +0 -0
  123. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/sysconfig.py +0 -0
  124. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/util.py +0 -0
  125. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/_distutils/version.py +0 -0
  126. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/build.py +0 -0
  127. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/cmake.py +0 -0
  128. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/configs.py +0 -0
  129. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/importhook.py +0 -0
  130. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/magic.py +0 -0
  131. {omdev-0.0.54 → omdev-0.0.55}/omdev/cexts/scan.py +0 -0
  132. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/__init__.py +0 -0
  133. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/__main__.py +0 -0
  134. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/cache.py +0 -0
  135. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/ci.py +0 -0
  136. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/cli.py +0 -0
  137. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/compose.py +0 -0
  138. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/consts.py +0 -0
  139. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/__init__.py +0 -0
  140. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/buildcaching.py +0 -0
  141. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/cache.py +0 -0
  142. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  143. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/cacheserved/cache.py +0 -0
  144. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  145. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/cmds.py +0 -0
  146. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/dataserver.py +0 -0
  147. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/imagepulling.py +0 -0
  148. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/inject.py +0 -0
  149. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/packing.py +0 -0
  150. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/repositories.py +0 -0
  151. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/docker/utils.py +0 -0
  152. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/__init__.py +0 -0
  153. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/__init__.py +0 -0
  154. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/clients.py +0 -0
  155. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/v1/__init__.py +0 -0
  156. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/v1/api.py +0 -0
  157. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/v1/client.py +0 -0
  158. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/v2/__init__.py +0 -0
  159. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/v2/api.py +0 -0
  160. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/v2/azure.py +0 -0
  161. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/api/v2/client.py +0 -0
  162. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/bootstrap.py +0 -0
  163. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/cache.py +0 -0
  164. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/cli.py +0 -0
  165. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/env.py +0 -0
  166. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/github/inject.py +0 -0
  167. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/inject.py +0 -0
  168. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/requirements.py +0 -0
  169. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/shell.py +0 -0
  170. {omdev-0.0.54 → omdev-0.0.55}/omdev/ci/utils.py +0 -0
  171. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/__init__.py +0 -0
  172. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/__main__.py +0 -0
  173. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/_pathhack.py +0 -0
  174. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/clicli.py +0 -0
  175. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/install.py +0 -0
  176. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/main.py +0 -0
  177. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/managers.py +0 -0
  178. {omdev-0.0.54 → omdev-0.0.55}/omdev/cli/types.py +0 -0
  179. {omdev-0.0.54 → omdev-0.0.55}/omdev/clipboard/__init__.py +0 -0
  180. {omdev-0.0.54 → omdev-0.0.55}/omdev/clipboard/capi/__init__.py +0 -0
  181. {omdev-0.0.54 → omdev-0.0.55}/omdev/clipboard/capi/darwin_cf.py +0 -0
  182. {omdev-0.0.54 → omdev-0.0.55}/omdev/clipboard/capi/linux_x11.py +0 -0
  183. {omdev-0.0.54 → omdev-0.0.55}/omdev/clipboard/commands.py +0 -0
  184. {omdev-0.0.54 → omdev-0.0.55}/omdev/clipboard/platform.py +0 -0
  185. {omdev-0.0.54 → omdev-0.0.55}/omdev/clipboard/types.py +0 -0
  186. {omdev-0.0.54 → omdev-0.0.55}/omdev/cmake.py +0 -0
  187. {omdev-0.0.54 → omdev-0.0.55}/omdev/cmdlog/__init__.py +0 -0
  188. {omdev-0.0.54 → omdev-0.0.55}/omdev/cmdlog/__main__.py +0 -0
  189. {omdev-0.0.54 → omdev-0.0.55}/omdev/cmdlog/_cmdlog.py +0 -0
  190. {omdev-0.0.54 → omdev-0.0.55}/omdev/cmdlog/cli.py +0 -0
  191. {omdev-0.0.54 → omdev-0.0.55}/omdev/cmdlog/cmdlog.py +0 -0
  192. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataclasses/__init__.py +0 -0
  193. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataclasses/__main__.py +0 -0
  194. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataclasses/_dumping.py +0 -0
  195. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataclasses/_template.py +0 -0
  196. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataclasses/cli.py +0 -0
  197. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataclasses/codegen.py +0 -0
  198. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataclasses/dumping.py +0 -0
  199. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataserver/__init__.py +0 -0
  200. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataserver/handlers.py +0 -0
  201. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataserver/http.py +0 -0
  202. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataserver/routes.py +0 -0
  203. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataserver/server.py +0 -0
  204. {omdev-0.0.54 → omdev-0.0.55}/omdev/dataserver/targets.py +0 -0
  205. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/__init__.py +0 -0
  206. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/__main__.py +0 -0
  207. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/build.py +0 -0
  208. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/config.py +0 -0
  209. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/config.toml +0 -0
  210. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/content.py +0 -0
  211. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/discovery.py +0 -0
  212. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/gen.py +0 -0
  213. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/helpers.py +0 -0
  214. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/ops.py +0 -0
  215. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/rendering.py +0 -0
  216. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/.python-versions.json +0 -0
  217. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/configs/.gdbinit +0 -0
  218. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/configs/.sqliterc +0 -0
  219. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/configs/.tmux.conf +0 -0
  220. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/configs/.vimrc +0 -0
  221. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/depsets/python.toml +0 -0
  222. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/depsets/x11.toml +0 -0
  223. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/apt.sh +0 -0
  224. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/chgrp.sh +0 -0
  225. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/docker.sh +0 -0
  226. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/firefox.sh +0 -0
  227. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/go.sh +0 -0
  228. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/jdk.sh +0 -0
  229. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/man.sh +0 -0
  230. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/nvm.sh +0 -0
  231. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/om.sh +0 -0
  232. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/pyenv.sh +0 -0
  233. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/rbenv.sh +0 -0
  234. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/rust.sh +0 -0
  235. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/sshd.sh +0 -0
  236. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/user.sh +0 -0
  237. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/uv.sh +0 -0
  238. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/vcpkg.sh +0 -0
  239. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/workdir.sh +0 -0
  240. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/fragments/zig.sh +0 -0
  241. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/scripts/install-claude +0 -0
  242. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/scripts/install-codex +0 -0
  243. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/scripts/install-pi +0 -0
  244. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/scripts/run-dbus +0 -0
  245. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/scripts/run-mysql +0 -0
  246. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/scripts/run-postgres +0 -0
  247. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/resources/shift-uid.sh +0 -0
  248. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/run.py +0 -0
  249. {omdev-0.0.54 → omdev-0.0.55}/omdev/dockerdev/utils.py +0 -0
  250. {omdev-0.0.54/omdev/git → omdev-0.0.55/omdev/gha}/__init__.py +0 -0
  251. /omdev-0.0.54/omdev/scripts/ghajunit.py → /omdev-0.0.55/omdev/gha/junit.py +0 -0
  252. {omdev-0.0.54/omdev/git/vendor → omdev-0.0.55/omdev/git}/__init__.py +0 -0
  253. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/magic.py +0 -0
  254. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/revisions.py +0 -0
  255. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/shallow.py +0 -0
  256. {omdev-0.0.54/omdev/home → omdev-0.0.55/omdev/git/vendor}/__init__.py +0 -0
  257. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/diffing.py +0 -0
  258. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/errors.py +0 -0
  259. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/journals.py +0 -0
  260. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/merging.py +0 -0
  261. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/paths.py +0 -0
  262. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/runners.py +0 -0
  263. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/specs.py +0 -0
  264. {omdev-0.0.54 → omdev-0.0.55}/omdev/git/vendor/upstreams.py +0 -0
  265. {omdev-0.0.54/omdev/interp/providers → omdev-0.0.55/omdev/home}/__init__.py +0 -0
  266. {omdev-0.0.54 → omdev-0.0.55}/omdev/home/__main__.py +0 -0
  267. {omdev-0.0.54 → omdev-0.0.55}/omdev/home/cli.py +0 -0
  268. {omdev-0.0.54 → omdev-0.0.55}/omdev/home/paths.py +0 -0
  269. {omdev-0.0.54 → omdev-0.0.55}/omdev/home/secrets.py +0 -0
  270. {omdev-0.0.54 → omdev-0.0.55}/omdev/home/shadow.py +0 -0
  271. {omdev-0.0.54 → omdev-0.0.55}/omdev/imgur.py +0 -0
  272. {omdev-0.0.54 → omdev-0.0.55}/omdev/intellij/__init__.py +0 -0
  273. {omdev-0.0.54 → omdev-0.0.55}/omdev/intellij/cli.py +0 -0
  274. {omdev-0.0.54 → omdev-0.0.55}/omdev/intellij/ides.py +0 -0
  275. {omdev-0.0.54 → omdev-0.0.55}/omdev/intellij/open.py +0 -0
  276. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/__init__.py +0 -0
  277. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/__main__.py +0 -0
  278. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/cli.py +0 -0
  279. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/default.py +0 -0
  280. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/inject.py +0 -0
  281. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/inspect.py +0 -0
  282. {omdev-0.0.54/omdev/interp/pyenv → omdev-0.0.55/omdev/interp/providers}/__init__.py +0 -0
  283. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/providers/base.py +0 -0
  284. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/providers/inject.py +0 -0
  285. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/providers/running.py +0 -0
  286. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/providers/standalone.py +0 -0
  287. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/providers/system.py +0 -0
  288. {omdev-0.0.54/omdev/interp/uv → omdev-0.0.55/omdev/interp/pyenv}/__init__.py +0 -0
  289. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/pyenv/inject.py +0 -0
  290. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/pyenv/install.py +0 -0
  291. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/pyenv/provider.py +0 -0
  292. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/pyenv/pyenv.py +0 -0
  293. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/resolvers.py +0 -0
  294. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/types.py +0 -0
  295. {omdev-0.0.54/omdev/java → omdev-0.0.55/omdev/interp/uv}/__init__.py +0 -0
  296. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/uv/inject.py +0 -0
  297. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/uv/provider.py +0 -0
  298. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/uv/uv.py +0 -0
  299. {omdev-0.0.54 → omdev-0.0.55}/omdev/interp/venvs.py +0 -0
  300. {omdev-0.0.54/omdev/js → omdev-0.0.55/omdev/java}/__init__.py +0 -0
  301. {omdev-0.0.54 → omdev-0.0.55}/omdev/java/__main__.py +0 -0
  302. {omdev-0.0.54 → omdev-0.0.55}/omdev/java/cli.py +0 -0
  303. {omdev-0.0.54 → omdev-0.0.55}/omdev/java/pomgen.py +0 -0
  304. {omdev-0.0.54 → omdev-0.0.55}/omdev/java/utils.py +0 -0
  305. {omdev-0.0.54 → omdev-0.0.55}/omdev/java/xml.py +0 -0
  306. {omdev-0.0.54/omdev/manifests → omdev-0.0.55/omdev/js}/__init__.py +0 -0
  307. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/LICENSE +0 -0
  308. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/TODO.md +0 -0
  309. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/__init__.py +0 -0
  310. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_pyqjsng.c +0 -0
  311. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_pyqjsng.pyi +0 -0
  312. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/LICENSE +0 -0
  313. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/builtin-array-fromasync.h +0 -0
  314. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/builtin-iterator-zip-keyed.h +0 -0
  315. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/builtin-iterator-zip.h +0 -0
  316. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/cutils.h +0 -0
  317. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/dtoa.c +0 -0
  318. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/dtoa.h +0 -0
  319. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/libregexp-opcode.h +0 -0
  320. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/libregexp.c +0 -0
  321. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/libregexp.h +0 -0
  322. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/libunicode-table.h +0 -0
  323. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/libunicode.c +0 -0
  324. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/libunicode.h +0 -0
  325. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/list.h +0 -0
  326. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/quickjs-atom.h +0 -0
  327. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/quickjs-c-atomics.h +0 -0
  328. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/quickjs-libc.c +0 -0
  329. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/quickjs-libc.h +0 -0
  330. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/quickjs-opcode.h +0 -0
  331. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/quickjs.c +0 -0
  332. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/_quickjs/quickjs.h +0 -0
  333. {omdev-0.0.54 → omdev-0.0.55}/omdev/js/quickjs/snapshots.py +0 -0
  334. {omdev-0.0.54 → omdev-0.0.55}/omdev/magic/__init__.py +0 -0
  335. {omdev-0.0.54 → omdev-0.0.55}/omdev/magic/__main__.py +0 -0
  336. {omdev-0.0.54 → omdev-0.0.55}/omdev/magic/cli.py +0 -0
  337. {omdev-0.0.54 → omdev-0.0.55}/omdev/magic/find.py +0 -0
  338. {omdev-0.0.54 → omdev-0.0.55}/omdev/magic/magic.py +0 -0
  339. {omdev-0.0.54 → omdev-0.0.55}/omdev/magic/prepare.py +0 -0
  340. {omdev-0.0.54 → omdev-0.0.55}/omdev/magic/styles.py +0 -0
  341. {omdev-0.0.54/omdev/mypy → omdev-0.0.55/omdev/manifests}/__init__.py +0 -0
  342. {omdev-0.0.54 → omdev-0.0.55}/omdev/manifests/__main__.py +0 -0
  343. {omdev-0.0.54 → omdev-0.0.55}/omdev/manifests/_dumping.py +0 -0
  344. {omdev-0.0.54 → omdev-0.0.55}/omdev/manifests/building.py +0 -0
  345. {omdev-0.0.54 → omdev-0.0.55}/omdev/manifests/dumping.py +0 -0
  346. {omdev-0.0.54 → omdev-0.0.55}/omdev/manifests/main.py +0 -0
  347. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/README.md +0 -0
  348. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/_devdocs/design.md +0 -0
  349. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/_devdocs/dev_00_initial.md +0 -0
  350. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/_devdocs/dev_01_parity_push.md +0 -0
  351. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/_devdocs/intro.md +0 -0
  352. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/_devdocs/requirements.md +0 -0
  353. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/_devdocs/research.md +0 -0
  354. {omdev-0.0.54/omdev/packaging → omdev-0.0.55/omdev/minitui/controls}/__init__.py +0 -0
  355. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/base.py +0 -0
  356. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/cards.py +0 -0
  357. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/history.py +0 -0
  358. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/markdown.py +0 -0
  359. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/spinners.py +0 -0
  360. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/stacks.py +0 -0
  361. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/static.py +0 -0
  362. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/status.py +0 -0
  363. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/suggestions.py +0 -0
  364. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/controls/textarea.py +0 -0
  365. {omdev-0.0.54/omdev/precheck → omdev-0.0.55/omdev/minitui/docs}/__init__.py +0 -0
  366. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/docs/cursors.py +0 -0
  367. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/docs/documents.py +0 -0
  368. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/docs/edits.py +0 -0
  369. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/docs/highlighting.py +0 -0
  370. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/docs/positions.py +0 -0
  371. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/docs/searching.py +0 -0
  372. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/docs/treesitter.py +0 -0
  373. {omdev-0.0.54/omdev/py/asts → omdev-0.0.55/omdev/minitui/events}/__init__.py +0 -0
  374. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/events/keymaps.py +0 -0
  375. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/events/keys.py +0 -0
  376. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/events/parsing.py +0 -0
  377. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/events/types.py +0 -0
  378. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/events/xterm.py +0 -0
  379. {omdev-0.0.54/omdev/py/scripts → omdev-0.0.55/omdev/minitui/runtime}/__init__.py +0 -0
  380. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/runtime/asyncio.py +0 -0
  381. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/runtime/base.py +0 -0
  382. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/runtime/jobcontrol.py +0 -0
  383. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/runtime/sync.py +0 -0
  384. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/runtime/timers.py +0 -0
  385. {omdev-0.0.54/omdev/py/tokens → omdev-0.0.55/omdev/minitui/screens}/__init__.py +0 -0
  386. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/screens/cells.py +0 -0
  387. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/screens/diffs.py +0 -0
  388. {omdev-0.0.54/omdev/py/tools → omdev-0.0.55/omdev/minitui/surfaces}/__init__.py +0 -0
  389. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/surfaces/alts.py +0 -0
  390. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/surfaces/base.py +0 -0
  391. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/surfaces/inlines.py +0 -0
  392. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/surfaces/writers.py +0 -0
  393. {omdev-0.0.54/omdev/pyproject/tools → omdev-0.0.55/omdev/minitui/text}/__init__.py +0 -0
  394. {omdev-0.0.54/omdev/pyright → omdev-0.0.55/omdev/minitui/text/markdown}/__init__.py +0 -0
  395. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/markdown/backends.py +0 -0
  396. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/markdown/base.py +0 -0
  397. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/markdown/flattening.py +0 -0
  398. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/markdown/markdownit.py +0 -0
  399. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/markdown/pdcmark.py +0 -0
  400. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/parts.py +0 -0
  401. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/rendering.py +0 -0
  402. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/segments.py +0 -0
  403. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/styles.py +0 -0
  404. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/themes.py +0 -0
  405. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/text/wrap.py +0 -0
  406. {omdev-0.0.54/omdev/rs → omdev-0.0.55/omdev/minitui/tty}/__init__.py +0 -0
  407. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/tty/terminals.py +0 -0
  408. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/__init__.py +0 -0
  409. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/engine.py +0 -0
  410. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/modes.py +0 -0
  411. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/motions.py +0 -0
  412. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/options.py +0 -0
  413. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/parsing.py +0 -0
  414. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/registers.py +0 -0
  415. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/scans.py +0 -0
  416. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/status.py +0 -0
  417. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/substitutes.py +0 -0
  418. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev}/minitui/vim/textobjs.py +0 -0
  419. {omdev-0.0.54/omdev/scripts/lib → omdev-0.0.55/omdev/mypy}/__init__.py +0 -0
  420. {omdev-0.0.54 → omdev-0.0.55}/omdev/mypy/debug.py +0 -0
  421. {omdev-0.0.54 → omdev-0.0.55}/omdev/mypy/report.py +0 -0
  422. {omdev-0.0.54/omdev/scripts/lib/formats → omdev-0.0.55/omdev/packaging}/__init__.py +0 -0
  423. {omdev-0.0.54 → omdev-0.0.55}/omdev/packaging/marshal.py +0 -0
  424. {omdev-0.0.54 → omdev-0.0.55}/omdev/packaging/names.py +0 -0
  425. {omdev-0.0.54 → omdev-0.0.55}/omdev/packaging/requirements.py +0 -0
  426. {omdev-0.0.54 → omdev-0.0.55}/omdev/packaging/revisions.py +0 -0
  427. {omdev-0.0.54 → omdev-0.0.55}/omdev/packaging/specifiers.py +0 -0
  428. {omdev-0.0.54 → omdev-0.0.55}/omdev/packaging/versions.py +0 -0
  429. {omdev-0.0.54 → omdev-0.0.55}/omdev/packaging/wheelfile.py +0 -0
  430. {omdev-0.0.54 → omdev-0.0.55}/omdev/pip.py +0 -0
  431. {omdev-0.0.54/omdev/scripts/lib/io → omdev-0.0.55/omdev/precheck}/__init__.py +0 -0
  432. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/__main__.py +0 -0
  433. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/base.py +0 -0
  434. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/blanklines.py +0 -0
  435. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/caches.py +0 -0
  436. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/git.py +0 -0
  437. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/imports.py +0 -0
  438. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/lite.py +0 -0
  439. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/main.py +0 -0
  440. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/manifests.py +0 -0
  441. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/scripts.py +0 -0
  442. {omdev-0.0.54 → omdev-0.0.55}/omdev/precheck/unicode.py +0 -0
  443. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/__init__.py +0 -0
  444. {omdev-0.0.54/omdev/specs → omdev-0.0.55/omdev/py/asts}/__init__.py +0 -0
  445. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/asts/parents.py +0 -0
  446. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/asts/toplevel.py +0 -0
  447. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/asts/visitors.py +0 -0
  448. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/attrdocs.py +0 -0
  449. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/bracepy.py +0 -0
  450. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/classdot.py +0 -0
  451. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/LICENSE +0 -0
  452. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/__init__.py +0 -0
  453. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/attrdoc.py +0 -0
  454. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/common.py +0 -0
  455. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/epydoc.py +0 -0
  456. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/google.py +0 -0
  457. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/numpydoc.py +0 -0
  458. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/parser.py +0 -0
  459. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/docstrings/rest.py +0 -0
  460. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/findimports.py +0 -0
  461. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/reprs.py +0 -0
  462. {omdev-0.0.54/omdev/specs/irc → omdev-0.0.55/omdev/py/scripts}/__init__.py +0 -0
  463. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/scripts/bumpversion.py +0 -0
  464. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/scripts/importtrace.py +0 -0
  465. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/srcheaders.py +0 -0
  466. {omdev-0.0.54/omdev/specs/irc/messages → omdev-0.0.55/omdev/py/tokens}/__init__.py +0 -0
  467. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/tokens/all.py +0 -0
  468. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/tokens/tokenizert.py +0 -0
  469. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/tokens/utils.py +0 -0
  470. {omdev-0.0.54/omdev/specs/irc/numerics → omdev-0.0.55/omdev/py/tools}/__init__.py +0 -0
  471. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/tools/fixdocstrings.py +0 -0
  472. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/tools/importscan.py +0 -0
  473. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/tools/mkrelimp.py +0 -0
  474. {omdev-0.0.54 → omdev-0.0.55}/omdev/py/tools/pipdepup.py +0 -0
  475. {omdev-0.0.54 → omdev-0.0.55}/omdev/py.typed +0 -0
  476. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/__init__.py +0 -0
  477. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/__main__.py +0 -0
  478. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/cli.py +0 -0
  479. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/configs.py +0 -0
  480. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/inject.py +0 -0
  481. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/pkg.py +0 -0
  482. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/reqs.py +0 -0
  483. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/resources/dockerdev.sh +0 -0
  484. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/resources/python.sh +0 -0
  485. {omdev-0.0.54/omdev/specs/jsonschema → omdev-0.0.55/omdev/pyproject/tools}/__init__.py +0 -0
  486. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/tools/aboutdeps.py +0 -0
  487. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/tools/buildrs.py +0 -0
  488. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/tools/pyversions.py +0 -0
  489. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/venvs.py +0 -0
  490. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyproject/versions.py +0 -0
  491. {omdev-0.0.54/omdev/specs/oci → omdev-0.0.55/omdev/pyright}/__init__.py +0 -0
  492. {omdev-0.0.54 → omdev-0.0.55}/omdev/pyright/report.py +0 -0
  493. {omdev-0.0.54 → omdev-0.0.55}/omdev/qr/LICENSE +0 -0
  494. {omdev-0.0.54 → omdev-0.0.55}/omdev/qr/__init__.py +0 -0
  495. {omdev-0.0.54 → omdev-0.0.55}/omdev/qr/consts.py +0 -0
  496. {omdev-0.0.54 → omdev-0.0.55}/omdev/qr/encoding.py +0 -0
  497. {omdev-0.0.54 → omdev-0.0.55}/omdev/qr/segments.py +0 -0
  498. {omdev-0.0.54 → omdev-0.0.55}/omdev/qr/utils.py +0 -0
  499. {omdev-0.0.54 → omdev-0.0.55}/omdev/qr/writers.py +0 -0
  500. {omdev-0.0.54/omdev/specs/oci/pack → omdev-0.0.55/omdev/rs}/__init__.py +0 -0
  501. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/__init__.py +0 -0
  502. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/ci.py +0 -0
  503. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/interp.py +0 -0
  504. {omdev-0.0.54/omdev/tools/git → omdev-0.0.55/omdev/scripts/lib}/__init__.py +0 -0
  505. {omdev-0.0.54/omdev/tools/json → omdev-0.0.55/omdev/scripts/lib/formats}/__init__.py +0 -0
  506. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/lib/formats/goyaml.py +0 -0
  507. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/lib/inject.py +0 -0
  508. {omdev-0.0.54/omdev/tools/jsonview → omdev-0.0.55/omdev/scripts/lib/io}/__init__.py +0 -0
  509. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/lib/io/streambufs.py +0 -0
  510. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/lib/logs.py +0 -0
  511. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/lib/marshal.py +0 -0
  512. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/pidfiles.py +0 -0
  513. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/pyproject.py +0 -0
  514. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/slowcat.py +0 -0
  515. {omdev-0.0.54 → omdev-0.0.55}/omdev/scripts/tmpexec.py +0 -0
  516. {omdev-0.0.54/omdev/tools/pawk → omdev-0.0.55/omdev/specs}/__init__.py +0 -0
  517. {omdev-0.0.54/omdev/tui → omdev-0.0.55/omdev/specs/irc/messages}/__init__.py +0 -0
  518. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/messages/base.py +0 -0
  519. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/messages/formats.py +0 -0
  520. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/messages/messages.py +0 -0
  521. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/messages/parsing.py +0 -0
  522. {omdev-0.0.54/omdev/tui/minitui/controls → omdev-0.0.55/omdev/specs/irc/numerics}/__init__.py +0 -0
  523. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/numerics/numerics.py +0 -0
  524. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/LICENSE +0 -0
  525. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/__init__.py +0 -0
  526. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/consts.py +0 -0
  527. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/errors.py +0 -0
  528. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/parsing.py +0 -0
  529. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/rendering.py +0 -0
  530. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/tags.py +0 -0
  531. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/irc/protocol/utils.py +0 -0
  532. {omdev-0.0.54/omdev/tui/minitui/docs → omdev-0.0.55/omdev/specs/jsonschema}/__init__.py +0 -0
  533. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/__init__.py +0 -0
  534. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/__main__.py +0 -0
  535. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/analysis.py +0 -0
  536. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/cli.py +0 -0
  537. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/config.py +0 -0
  538. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/errors.py +0 -0
  539. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/generator.py +0 -0
  540. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/ir.py +0 -0
  541. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/names.py +0 -0
  542. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/rendering.py +0 -0
  543. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/transforms.py +0 -0
  544. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/jsonschema/codegen/typing.py +0 -0
  545. {omdev-0.0.54/omdev/tui/minitui/events → omdev-0.0.55/omdev/specs/oci}/__init__.py +0 -0
  546. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/building.py +0 -0
  547. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/compression.py +0 -0
  548. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/data.py +0 -0
  549. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/datarefs.py +0 -0
  550. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/dataserver.py +0 -0
  551. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/loading.py +0 -0
  552. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/media.py +0 -0
  553. {omdev-0.0.54/omdev/tui/minitui/runtime → omdev-0.0.55/omdev/specs/oci/pack}/__init__.py +0 -0
  554. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/pack/packing.py +0 -0
  555. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/pack/repositories.py +0 -0
  556. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/pack/unpacking.py +0 -0
  557. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/repositories.py +0 -0
  558. {omdev-0.0.54 → omdev-0.0.55}/omdev/specs/oci/tars.py +0 -0
  559. {omdev-0.0.54 → omdev-0.0.55}/omdev/tagstrings.py +0 -0
  560. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/__init__.py +0 -0
  561. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/cloc.py +0 -0
  562. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/doc.py +0 -0
  563. {omdev-0.0.54/omdev/tui/minitui/screens → omdev-0.0.55/omdev/tools/git}/__init__.py +0 -0
  564. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/git/__main__.py +0 -0
  565. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/git/cloning.py +0 -0
  566. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/git/consts.py +0 -0
  567. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/git/messages.py +0 -0
  568. {omdev-0.0.54/omdev/tui/minitui/surfaces → omdev-0.0.55/omdev/tools/json}/__init__.py +0 -0
  569. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/json/__main__.py +0 -0
  570. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/json/cli.py +0 -0
  571. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/json/formats.py +0 -0
  572. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/json/io.py +0 -0
  573. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/json/parsing.py +0 -0
  574. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/json/processing.py +0 -0
  575. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/json/rendering.py +0 -0
  576. {omdev-0.0.54/omdev/tui/minitui/text → omdev-0.0.55/omdev/tools/jsonview}/__init__.py +0 -0
  577. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/jsonview/__main__.py +0 -0
  578. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/jsonview/cli.py +0 -0
  579. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  580. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/jsonview/resources/jsonview.html.j2 +0 -0
  581. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  582. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/linehisto.py +0 -0
  583. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/mkenv.py +0 -0
  584. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/notebook.py +0 -0
  585. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/ocr.py +0 -0
  586. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/pawk/README.md +0 -0
  587. {omdev-0.0.54/omdev/tui/minitui/text/markdown → omdev-0.0.55/omdev/tools/pawk}/__init__.py +0 -0
  588. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/pawk/__main__.py +0 -0
  589. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/pawk/pawk.py +0 -0
  590. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/pip.py +0 -0
  591. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/prof.py +0 -0
  592. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/qr.py +0 -0
  593. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/shadow.py +0 -0
  594. {omdev-0.0.54 → omdev-0.0.55}/omdev/tools/sqlrepl.py +0 -0
  595. {omdev-0.0.54 → omdev-0.0.55}/omdev.egg-info/dependency_links.txt +0 -0
  596. {omdev-0.0.54 → omdev-0.0.55}/omdev.egg-info/entry_points.txt +0 -0
  597. {omdev-0.0.54 → omdev-0.0.55}/omdev.egg-info/top_level.txt +0 -0
  598. {omdev-0.0.54 → omdev-0.0.55}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.54
3
+ Version: 0.0.55
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,11 +14,11 @@ Classifier: Programming Language :: Python :: 3.15
14
14
  Requires-Python: >=3.14
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omcore==0.0.54
17
+ Requires-Dist: omcore==0.0.55
18
18
  Provides-Extra: ominfra
19
- Requires-Dist: ominfra==0.0.54; extra == "ominfra"
19
+ Requires-Dist: ominfra==0.0.55; extra == "ominfra"
20
20
  Provides-Extra: omllm
21
- Requires-Dist: omllm==0.0.54; extra == "omllm"
21
+ Requires-Dist: omllm==0.0.55; extra == "omllm"
22
22
  Provides-Extra: black
23
23
  Requires-Dist: black~=26.5; extra == "black"
24
24
  Provides-Extra: c
@@ -59,14 +59,14 @@ Requires-Dist: tree-sitter-toml~=0.7; extra == "tui-syntax"
59
59
  Requires-Dist: tree-sitter-xml~=0.7; extra == "tui-syntax"
60
60
  Requires-Dist: tree-sitter-yaml~=0.7; extra == "tui-syntax"
61
61
  Provides-Extra: cext
62
- Requires-Dist: omdev-cext==0.0.54; extra == "cext"
62
+ Requires-Dist: omdev-cext==0.0.55; extra == "cext"
63
63
  Provides-Extra: rs
64
- Requires-Dist: omdev-rs==0.0.54; extra == "rs"
64
+ Requires-Dist: omdev-rs==0.0.55; extra == "rs"
65
65
  Provides-Extra: cli
66
- Requires-Dist: omdev-cli==0.0.54; extra == "cli"
66
+ Requires-Dist: omdev-cli==0.0.55; extra == "cli"
67
67
  Provides-Extra: all
68
- Requires-Dist: ominfra==0.0.54; extra == "all"
69
- Requires-Dist: omllm==0.0.54; extra == "all"
68
+ Requires-Dist: ominfra==0.0.55; extra == "all"
69
+ Requires-Dist: omllm==0.0.55; extra == "all"
70
70
  Requires-Dist: black~=26.5; extra == "all"
71
71
  Requires-Dist: pycparser~=3.0; extra == "all"
72
72
  Requires-Dist: pcpp~=1.30; extra == "all"
@@ -95,9 +95,9 @@ Requires-Dist: tree-sitter-sql~=0.3; extra == "all"
95
95
  Requires-Dist: tree-sitter-toml~=0.7; extra == "all"
96
96
  Requires-Dist: tree-sitter-xml~=0.7; extra == "all"
97
97
  Requires-Dist: tree-sitter-yaml~=0.7; extra == "all"
98
- Requires-Dist: omdev-cext==0.0.54; extra == "all"
99
- Requires-Dist: omdev-rs==0.0.54; extra == "all"
100
- Requires-Dist: omdev-cli==0.0.54; extra == "all"
98
+ Requires-Dist: omdev-cext==0.0.55; extra == "all"
99
+ Requires-Dist: omdev-rs==0.0.55; extra == "all"
100
+ Requires-Dist: omdev-cli==0.0.55; extra == "all"
101
101
  Dynamic: license-file
102
102
 
103
103
  # Overview
@@ -148,6 +148,18 @@
148
148
  }
149
149
  }
150
150
  },
151
+ {
152
+ "module": ".js.vendor.__main__",
153
+ "attr": "_CLI_MODULE",
154
+ "file": "omdev/js/vendor/__main__.py",
155
+ "line": 4,
156
+ "value": {
157
+ "!.cli.types.CliModule": {
158
+ "name": "jsvendor",
159
+ "module": "omdev.js.vendor.__main__"
160
+ }
161
+ }
162
+ },
151
163
  {
152
164
  "module": ".magic.__main__",
153
165
  "attr": "_CLI_MODULE",
@@ -339,18 +351,6 @@
339
351
  }
340
352
  }
341
353
  },
342
- {
343
- "module": ".tools.diff",
344
- "attr": "_CLI_MODULE",
345
- "file": "omdev/tools/diff.py",
346
- "line": 24,
347
- "value": {
348
- "!.cli.types.CliModule": {
349
- "name": "diff",
350
- "module": "omdev.tools.diff"
351
- }
352
- }
353
- },
354
354
  {
355
355
  "module": ".tools.doc",
356
356
  "attr": "_CLI_MODULE",
@@ -367,7 +367,7 @@
367
367
  "module": ".tools.docker",
368
368
  "attr": "_CLI_MODULE",
369
369
  "file": "omdev/tools/docker.py",
370
- "line": 288,
370
+ "line": 318,
371
371
  "value": {
372
372
  "!.cli.types.CliModule": {
373
373
  "name": "docker",
@@ -550,7 +550,7 @@
550
550
  "module": ".tools.shell",
551
551
  "attr": "_CLI_MODULE",
552
552
  "file": "omdev/tools/shell.py",
553
- "line": 241,
553
+ "line": 253,
554
554
  "value": {
555
555
  "!.cli.types.CliModule": {
556
556
  "name": [
@@ -572,17 +572,5 @@
572
572
  "module": "omdev.tools.sqlrepl"
573
573
  }
574
574
  }
575
- },
576
- {
577
- "module": ".tui.diff.__main__",
578
- "attr": "_CLI_MODULE",
579
- "file": "omdev/tui/diff/__main__.py",
580
- "line": 4,
581
- "value": {
582
- "!.cli.types.CliModule": {
583
- "name": "tui/diff",
584
- "module": "omdev.tui.diff.__main__"
585
- }
586
- }
587
575
  }
588
576
  ]
@@ -168,6 +168,32 @@ class Cli(ap.Cli):
168
168
 
169
169
  print(out.decode(), end='')
170
170
 
171
+ #
172
+
173
+ @ap.cmd(
174
+ ap.arg('container-id'),
175
+ ap.arg('secret', nargs='+'),
176
+ ap.arg('-f', '--secrets-file'),
177
+ )
178
+ def inject_secret(self) -> None:
179
+ secrets: list[str | tuple[str, str]] = []
180
+ for s in self.args.secret:
181
+ if '=' in s:
182
+ k, v = s.split('=')
183
+ secrets.append((k, v))
184
+ else:
185
+ secrets.append(s)
186
+
187
+ #
188
+
189
+ from .secrets import inject_dockerdev_secrets
190
+
191
+ inject_dockerdev_secrets(
192
+ self.args.container_id,
193
+ secrets,
194
+ secrets_file=self.args.secrets_file,
195
+ )
196
+
171
197
 
172
198
  def _main() -> None:
173
199
  Cli().cli_run_and_exit()
@@ -75,7 +75,6 @@ deps = [
75
75
  'bubblewrap',
76
76
 
77
77
  # data formats
78
- 'jq',
79
78
  'libxml2-dev',
80
79
  'libxslt-dev',
81
80
  'libyaml-dev',
@@ -91,15 +90,19 @@ deps = [
91
90
  'redis',
92
91
  'sqlite3',
93
92
 
94
- # terminal UX & interactive tools
93
+ # standard terminal tools
95
94
  'btop',
96
95
  'htop',
97
96
  'less',
98
97
  'moreutils',
99
98
  'ncdu',
99
+ 'tmux',
100
+
101
+ # third-party terminal tools
102
+ 'fd-find',
103
+ 'jq',
100
104
  'ripgrep',
101
105
  'silversearcher-ag',
102
- 'tmux',
103
106
 
104
107
  # shells
105
108
  'tcsh',
@@ -0,0 +1,160 @@
1
+ import inspect
2
+ import json
3
+ import os.path
4
+ import subprocess
5
+ import typing as ta
6
+
7
+ from omcore import check
8
+ from omcore import lang
9
+ from omcore.os.pyremote.bestpython import get_best_python_sh
10
+ from omcore.os.pyremote.core import pyremote
11
+ from omcore.secrets import all as sec
12
+ from omcore.subprocesses.wrap import subprocess_maybe_shell_wrap_exec
13
+
14
+ from ..home import secretinject
15
+ from ..home.paths import DEFAULT_HOME_DIR
16
+ from ..home.paths import HomePaths
17
+ from ..home.secretinject import inject_secrets
18
+ from ..home.secrets import DEFAULT_INJECTED_SECRETS_FILE_NAME
19
+ from ..home.secrets import load_secrets
20
+ from .run import LABEL_PREFIX
21
+
22
+
23
+ ##
24
+
25
+
26
+ def _remote_main() -> None:
27
+ prt = pyremote.bootstrap_finalize() # noqa
28
+
29
+ #
30
+
31
+ import json
32
+
33
+ args = json.loads(prt.input.read().decode('utf-8'))
34
+
35
+ #
36
+
37
+ inject_secrets(
38
+ os.path.expanduser(args['file_path']),
39
+ args['update'],
40
+ make_dirs=True,
41
+ )
42
+
43
+ #
44
+
45
+ raise SystemExit(0)
46
+
47
+
48
+ def _check_container_id(container_id: str) -> None:
49
+ out = subprocess.check_output([
50
+ 'docker',
51
+ 'ps',
52
+ f'--filter=id={container_id}',
53
+ f'--filter=label={LABEL_PREFIX}',
54
+ '--format=json',
55
+ ]).decode('utf-8')
56
+
57
+ lines = out.strip().splitlines()
58
+ line = check.single(lines)
59
+
60
+ dct = json.loads(line)
61
+
62
+ check.equal(dct['ID'], container_id)
63
+
64
+
65
+ def _inject_update(
66
+ container_id: str,
67
+ secrets_file: str,
68
+ update: ta.Mapping[str, ta.Any],
69
+ ) -> None:
70
+ _check_container_id(container_id)
71
+
72
+ #
73
+
74
+ args_dct = {
75
+ 'file_path': secrets_file,
76
+ 'update': update,
77
+ }
78
+
79
+ args_bytes = json.dumps(args_dct).encode('utf-8')
80
+
81
+ #
82
+
83
+ payload_src = '\n\n'.join([
84
+ inspect.getsource(secretinject),
85
+ check.not_none(pyremote.get_core_source()),
86
+ inspect.getsource(_remote_main),
87
+ '_remote_main()',
88
+ ])
89
+
90
+ #
91
+
92
+ proc = subprocess.Popen(
93
+ subprocess_maybe_shell_wrap_exec(
94
+ 'docker',
95
+ 'exec',
96
+ '-i',
97
+ container_id,
98
+ 'sh',
99
+ '-c',
100
+ get_best_python_sh(),
101
+ '--',
102
+ '-c',
103
+ pyremote.build_bootstrap_source('pyrthing'),
104
+ ),
105
+ stdin=subprocess.PIPE,
106
+ stdout=subprocess.PIPE,
107
+ )
108
+
109
+ stdin = check.not_none(proc.stdin)
110
+ stdout = check.not_none(proc.stdout)
111
+
112
+ #
113
+
114
+ pbr = pyremote.make_driver( # noqa
115
+ payload_src,
116
+ ).run(stdout, stdin)
117
+
118
+ stdin.write(args_bytes)
119
+ stdin.close()
120
+
121
+ proc.wait()
122
+
123
+
124
+ def inject_dockerdev_secrets(
125
+ container_id: str,
126
+ secrets: lang.SequenceNotStr[str | tuple[str, ta.Any]],
127
+ *,
128
+ secrets_file: str | None = None,
129
+ ) -> None:
130
+ if secrets_file is None:
131
+ secrets_file = os.path.join(
132
+ DEFAULT_HOME_DIR,
133
+ HomePaths.config_subdir,
134
+ DEFAULT_INJECTED_SECRETS_FILE_NAME,
135
+ )
136
+
137
+ #
138
+
139
+ loaded_secrets: sec.Secrets | None = None
140
+
141
+ update: dict[str, ta.Any] = {}
142
+
143
+ for o in secrets:
144
+ if isinstance(o, str):
145
+ if loaded_secrets is None:
146
+ loaded_secrets = load_secrets()
147
+
148
+ update[o] = loaded_secrets.get(o).reveal()
149
+
150
+ else:
151
+ k, v = o
152
+ update[k] = v
153
+
154
+ #
155
+
156
+ _inject_update(
157
+ container_id,
158
+ secrets_file,
159
+ update,
160
+ )
@@ -1,8 +1,9 @@
1
1
  import os
2
2
  import os.path
3
3
 
4
- from ..status import GitStatusState
5
- from ..status import get_git_status
4
+ from omcore.git.status import GitStatusState
5
+ from omcore.git.status import get_git_status
6
+
6
7
  from .errors import GitVendorNoMergeInProgressError
7
8
  from .journals import GitVendorJournal
8
9
  from .journals import delete_vendor_journal
@@ -4,10 +4,10 @@ import typing as ta
4
4
 
5
5
  from omcore import check
6
6
  from omcore import dataclasses as dc
7
+ from omcore.git.status import GitStatusItem
8
+ from omcore.git.status import GitStatusState
9
+ from omcore.git.status import get_git_status
7
10
 
8
- from ..status import GitStatusItem
9
- from ..status import GitStatusState
10
- from ..status import get_git_status
11
11
  from .errors import GitVendorDirtyError
12
12
  from .errors import GitVendorMergeInProgressError
13
13
  from .errors import GitVendorSubprocessError
@@ -38,7 +38,6 @@ How the lock and the atomic replace are combined:
38
38
 
39
39
  Exit status: 0 ok, 1 error, 2 usage, 3 lock timeout.
40
40
  """
41
- import argparse
42
41
  import collections
43
42
  import errno
44
43
  import fcntl
@@ -46,7 +45,6 @@ import json
46
45
  import os
47
46
  import random
48
47
  import stat
49
- import sys
50
48
  import tempfile
51
49
  import time
52
50
  import typing as ta
@@ -54,6 +52,8 @@ import typing as ta
54
52
 
55
53
  ##
56
54
 
55
+ # seconds
56
+ DEFAULT_TIMEOUT = 30.0
57
57
 
58
58
  # seconds; jittered so waiters don't wake in lockstep
59
59
  POLL_MIN = 0.005
@@ -62,7 +62,8 @@ POLL_MAX = 0.05
62
62
  # mode for a file we create; existing files keep theirs
63
63
  NEW_FILE_MODE = 0o600
64
64
 
65
- JsonObject = ta.OrderedDict[str, ta.Any] # ta.TypeAlias
65
+ JsonObject = ta.Mapping[str, ta.Any] # ta.TypeAlias
66
+ OrderedJsonObject = ta.OrderedDict[str, ta.Any] # ta.TypeAlias
66
67
 
67
68
 
68
69
  def write_all(fd: int, data: bytes) -> None:
@@ -125,14 +126,14 @@ def write_temp(
125
126
  return tmp
126
127
 
127
128
 
128
- def parse_object(text: str) -> JsonObject:
129
+ def parse_object(text: str) -> OrderedJsonObject:
129
130
  data = json.loads(text, object_pairs_hook=collections.OrderedDict)
130
131
  if not isinstance(data, collections.OrderedDict):
131
132
  raise ValueError('top-level JSON value is not an object') # noqa
132
133
  return data
133
134
 
134
135
 
135
- def load(raw: bytes) -> JsonObject:
136
+ def load(raw: bytes) -> OrderedJsonObject:
136
137
  text = raw.decode('utf-8')
137
138
  if not text.strip():
138
139
  return collections.OrderedDict() # tolerate an empty/whitespace-only file (e.g. `touch`ed)
@@ -152,16 +153,16 @@ def values_equal(a: ta.Any, b: ta.Any) -> bool:
152
153
 
153
154
 
154
155
  def merge(
155
- existing: JsonObject,
156
- update: JsonObject,
157
- ) -> ta.Tuple[JsonObject, bool]:
156
+ existing: OrderedJsonObject,
157
+ update: OrderedJsonObject,
158
+ ) -> ta.Tuple[OrderedJsonObject, bool]:
158
159
  """
159
160
  Shallowly apply `update` to `existing`: a None value removes the key, any other value replaces it wholesale. Returns
160
161
  the merged object -- keys not in `update` first, in their existing order, then every key set by `update` in `update`
161
162
  order, even if its value is unchanged -- and whether the result differs from `existing` at all.
162
163
  """
163
164
 
164
- merged: JsonObject = collections.OrderedDict(
165
+ merged: OrderedJsonObject = collections.OrderedDict(
165
166
  (k, v) for k, v in existing.items() if k not in update
166
167
  )
167
168
  merged.update((k, v) for k, v in update.items() if v is not None)
@@ -172,7 +173,7 @@ def try_create(
172
173
  path: str,
173
174
  dirname: str,
174
175
  basename: str,
175
- data: JsonObject,
176
+ data: OrderedJsonObject,
176
177
  ) -> bool:
177
178
  """Atomically create `path` with `data` iff it does not exist. True on success."""
178
179
 
@@ -206,24 +207,33 @@ def try_create(
206
207
  return True
207
208
 
208
209
 
209
- def inject(
210
- path: str,
210
+ def inject_secrets(
211
+ file_path: str,
211
212
  update: JsonObject,
212
- timeout: float,
213
+ *,
214
+ make_dirs: bool = False,
215
+ timeout: float = DEFAULT_TIMEOUT,
213
216
  ) -> None:
214
- path = os.path.realpath(path) # operate on the real file if `path` is a symlink
215
- dirname, basename = os.path.split(path)
217
+ if not isinstance(update, collections.OrderedDict):
218
+ update = collections.OrderedDict(update)
219
+
220
+ file_path = os.path.realpath(file_path) # operate on the real file if `path` is a symlink
221
+ dirname, basename = os.path.split(file_path)
222
+
223
+ if make_dirs:
224
+ os.makedirs(dirname, exist_ok=True)
225
+
216
226
  deadline = time.monotonic() + timeout
217
227
 
218
228
  while True:
219
229
  try:
220
- fd = os.open(path, os.O_RDONLY)
230
+ fd = os.open(file_path, os.O_RDONLY)
221
231
 
222
232
  except FileNotFoundError:
223
233
  merged, _ = merge(collections.OrderedDict(), update)
224
234
 
225
235
  if try_create(
226
- path,
236
+ file_path,
227
237
  dirname,
228
238
  basename,
229
239
  merged,
@@ -237,28 +247,28 @@ def inject(
237
247
  fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
238
248
  except BlockingIOError:
239
249
  if time.monotonic() >= deadline:
240
- raise TimeoutError(f'timed out waiting for lock on {path}') from None
250
+ raise TimeoutError(f'timed out waiting for lock on {file_path}') from None
241
251
  time.sleep(random.uniform(POLL_MIN, POLL_MAX))
242
252
  continue
243
253
 
244
- # We hold a lock on *an* inode. Make sure it is still the one at `path`: a concurrent writer may have
254
+ # We hold a lock on *an* inode. Make sure it is still the one at `file_path`: a concurrent writer may have
245
255
  # rename()d a new file over it while we waited.
246
256
  st = os.fstat(fd)
247
257
 
248
258
  try:
249
- cur = os.stat(path)
259
+ cur = os.stat(file_path)
250
260
  except FileNotFoundError:
251
261
  continue # deleted underneath us; go recreate
252
262
 
253
263
  if (st.st_dev, st.st_ino) != (cur.st_dev, cur.st_ino):
254
264
  continue # stale inode; retry against the current file
255
265
  if not stat.S_ISREG(st.st_mode):
256
- raise OSError(errno.EINVAL, 'not a regular file', path)
266
+ raise OSError(errno.EINVAL, 'not a regular file', file_path)
257
267
 
258
268
  try:
259
269
  existing = load(read_all(fd))
260
270
  except ValueError as e:
261
- raise ValueError(f'{path}: {e}') from None
271
+ raise ValueError(f'{file_path}: {e}') from None
262
272
 
263
273
  merged, changed = merge(existing, update)
264
274
  if not changed:
@@ -273,7 +283,7 @@ def inject(
273
283
  )
274
284
 
275
285
  try:
276
- os.rename(tmp, path) # atomic replace, done while holding the lock
286
+ os.rename(tmp, file_path) # atomic replace, done while holding the lock
277
287
  except BaseException:
278
288
  os.unlink(tmp)
279
289
  raise
@@ -286,6 +296,8 @@ def inject(
286
296
 
287
297
 
288
298
  def main(argv: ta.Any = None) -> int:
299
+ import argparse
300
+
289
301
  ap = argparse.ArgumentParser(
290
302
  description='Atomically upsert keys into a JSON object file; the update is a JSON object read from stdin.',
291
303
  )
@@ -297,7 +309,7 @@ def main(argv: ta.Any = None) -> int:
297
309
  ap.add_argument(
298
310
  '--timeout',
299
311
  type=float,
300
- default=30.0,
312
+ default=DEFAULT_TIMEOUT,
301
313
  help='max seconds to wait for the lock (default: 30)',
302
314
  )
303
315
  ap.add_argument(
@@ -307,6 +319,10 @@ def main(argv: ta.Any = None) -> int:
307
319
 
308
320
  args = ap.parse_args(argv)
309
321
 
322
+ #
323
+
324
+ import sys
325
+
310
326
  try:
311
327
  update = parse_object(sys.stdin.buffer.read().decode('utf-8'))
312
328
  except ValueError as e: # covers UnicodeDecodeError and json.JSONDecodeError
@@ -314,7 +330,11 @@ def main(argv: ta.Any = None) -> int:
314
330
  return 1
315
331
 
316
332
  try:
317
- inject(args.file, update, args.timeout)
333
+ inject_secrets(
334
+ args.file,
335
+ update,
336
+ timeout=args.timeout,
337
+ )
318
338
  except TimeoutError as e:
319
339
  print(f'error: {e}', file=sys.stderr)
320
340
  return 3
@@ -327,4 +347,4 @@ def main(argv: ta.Any = None) -> int:
327
347
 
328
348
 
329
349
  if __name__ == '__main__':
330
- sys.exit(main())
350
+ raise SystemExit(main())