zeocore 0.1.0__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 (468) hide show
  1. zeocore-0.1.0/.gitattributes +16 -0
  2. zeocore-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +26 -0
  3. zeocore-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +18 -0
  4. zeocore-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +11 -0
  5. zeocore-0.1.0/.github/workflows/ci.yml +44 -0
  6. zeocore-0.1.0/.github/workflows/publish.yml +206 -0
  7. zeocore-0.1.0/.gitignore +47 -0
  8. zeocore-0.1.0/.importlinter +54 -0
  9. zeocore-0.1.0/CHANGELOG.md +77 -0
  10. zeocore-0.1.0/CODE_OF_CONDUCT.md +134 -0
  11. zeocore-0.1.0/CONTRIBUTING.md +153 -0
  12. zeocore-0.1.0/GET-STARTED.md +584 -0
  13. zeocore-0.1.0/LICENSE +21 -0
  14. zeocore-0.1.0/Makefile +338 -0
  15. zeocore-0.1.0/PKG-INFO +203 -0
  16. zeocore-0.1.0/README.md +118 -0
  17. zeocore-0.1.0/examples/error_handling.py +132 -0
  18. zeocore-0.1.0/examples/minimal_tool.py +133 -0
  19. zeocore-0.1.0/examples/toolkit_usage.py +372 -0
  20. zeocore-0.1.0/hygiene-grepbans.mk +29 -0
  21. zeocore-0.1.0/pyproject.toml +246 -0
  22. zeocore-0.1.0/src/__init__.py +0 -0
  23. zeocore-0.1.0/src/zeo_core/__init__.py +91 -0
  24. zeocore-0.1.0/src/zeo_core/_dev/__init__.py +0 -0
  25. zeocore-0.1.0/src/zeo_core/_dev/run_local.py +39 -0
  26. zeocore-0.1.0/src/zeo_core/adapters/__init__.py +0 -0
  27. zeocore-0.1.0/src/zeo_core/adapters/http/__init__.py +52 -0
  28. zeocore-0.1.0/src/zeo_core/adapters/http/app.py +144 -0
  29. zeocore-0.1.0/src/zeo_core/adapters/http/auth.py +56 -0
  30. zeocore-0.1.0/src/zeo_core/adapters/http/config.py +21 -0
  31. zeocore-0.1.0/src/zeo_core/adapters/http/dependencies.py +81 -0
  32. zeocore-0.1.0/src/zeo_core/adapters/http/models.py +32 -0
  33. zeocore-0.1.0/src/zeo_core/adapters/http/routes/__init__.py +3 -0
  34. zeocore-0.1.0/src/zeo_core/adapters/http/routes/health.py +19 -0
  35. zeocore-0.1.0/src/zeo_core/adapters/http/routes/jobs.py +170 -0
  36. zeocore-0.1.0/src/zeo_core/adapters/http/routes/operations.py +120 -0
  37. zeocore-0.1.0/src/zeo_core/adapters/http/service.py +20 -0
  38. zeocore-0.1.0/src/zeo_core/adapters/http/util.py +41 -0
  39. zeocore-0.1.0/src/zeo_core/adapters/mcp/__init__.py +0 -0
  40. zeocore-0.1.0/src/zeo_core/config/__init__.py +129 -0
  41. zeocore-0.1.0/src/zeo_core/config/loader.py +288 -0
  42. zeocore-0.1.0/src/zeo_core/config/models.py +159 -0
  43. zeocore-0.1.0/src/zeo_core/config/plugin.py +94 -0
  44. zeocore-0.1.0/src/zeo_core/config/tooling/__init__.py +18 -0
  45. zeocore-0.1.0/src/zeo_core/config/tooling/base.py +19 -0
  46. zeocore-0.1.0/src/zeo_core/config/tooling/loader.py +59 -0
  47. zeocore-0.1.0/src/zeo_core/config/tooling/logger.py +94 -0
  48. zeocore-0.1.0/src/zeo_core/config/utils.py +109 -0
  49. zeocore-0.1.0/src/zeo_core/config_base.py +99 -0
  50. zeocore-0.1.0/src/zeo_core/contracts/EXAMPLES.md +487 -0
  51. zeocore-0.1.0/src/zeo_core/contracts/README.md +126 -0
  52. zeocore-0.1.0/src/zeo_core/contracts/__init__.py +131 -0
  53. zeocore-0.1.0/src/zeo_core/contracts/artifacts/__init__.py +30 -0
  54. zeocore-0.1.0/src/zeo_core/contracts/artifacts/manifest.py +427 -0
  55. zeocore-0.1.0/src/zeo_core/contracts/artifacts/refs.py +350 -0
  56. zeocore-0.1.0/src/zeo_core/contracts/capabilities/__init__.py +38 -0
  57. zeocore-0.1.0/src/zeo_core/contracts/capabilities/contract.py +35 -0
  58. zeocore-0.1.0/src/zeo_core/contracts/capabilities/demo/__init__.py +23 -0
  59. zeocore-0.1.0/src/zeo_core/contracts/capabilities/demo/_impl.py +98 -0
  60. zeocore-0.1.0/src/zeo_core/contracts/capabilities/demo/models.py +38 -0
  61. zeocore-0.1.0/src/zeo_core/contracts/common/__init__.py +62 -0
  62. zeocore-0.1.0/src/zeo_core/contracts/common/enums.py +87 -0
  63. zeocore-0.1.0/src/zeo_core/contracts/common/ids.py +66 -0
  64. zeocore-0.1.0/src/zeo_core/contracts/common/time.py +39 -0
  65. zeocore-0.1.0/src/zeo_core/contracts/common/typing.py +16 -0
  66. zeocore-0.1.0/src/zeo_core/contracts/common/versions.py +14 -0
  67. zeocore-0.1.0/src/zeo_core/contracts/envelopes/__init__.py +16 -0
  68. zeocore-0.1.0/src/zeo_core/contracts/envelopes/error.py +66 -0
  69. zeocore-0.1.0/src/zeo_core/contracts/envelopes/log.py +88 -0
  70. zeocore-0.1.0/src/zeo_core/contracts/envelopes/result.py +344 -0
  71. zeocore-0.1.0/src/zeo_core/core/__init__.py +0 -0
  72. zeocore-0.1.0/src/zeo_core/core/errors/__init__.py +44 -0
  73. zeocore-0.1.0/src/zeo_core/core/errors/base.py +262 -0
  74. zeocore-0.1.0/src/zeo_core/core/errors/handlers.py +139 -0
  75. zeocore-0.1.0/src/zeo_core/core/errors/integration.py +92 -0
  76. zeocore-0.1.0/src/zeo_core/core/fs/ARCHITECTURE.md +447 -0
  77. zeocore-0.1.0/src/zeo_core/core/fs/SERVICE-CONTRACT.md +95 -0
  78. zeocore-0.1.0/src/zeo_core/core/fs/__init__.py +80 -0
  79. zeocore-0.1.0/src/zeo_core/core/fs/_internal/__init__.py +9 -0
  80. zeocore-0.1.0/src/zeo_core/core/fs/_internal/checksums.py +20 -0
  81. zeocore-0.1.0/src/zeo_core/core/fs/_internal/common.py +9 -0
  82. zeocore-0.1.0/src/zeo_core/core/fs/_internal/comparison.py +40 -0
  83. zeocore-0.1.0/src/zeo_core/core/fs/_internal/directory_ops.py +62 -0
  84. zeocore-0.1.0/src/zeo_core/core/fs/_internal/disk.py +43 -0
  85. zeocore-0.1.0/src/zeo_core/core/fs/_internal/file_info.py +52 -0
  86. zeocore-0.1.0/src/zeo_core/core/fs/_internal/file_ops.py +111 -0
  87. zeocore-0.1.0/src/zeo_core/core/fs/_internal/path_ops.py +53 -0
  88. zeocore-0.1.0/src/zeo_core/core/fs/_internal/safe_ops.py +61 -0
  89. zeocore-0.1.0/src/zeo_core/core/fs/_internal/temp.py +28 -0
  90. zeocore-0.1.0/src/zeo_core/core/fs/_ops/__init__.py +3 -0
  91. zeocore-0.1.0/src/zeo_core/core/fs/_ops/base.py +23 -0
  92. zeocore-0.1.0/src/zeo_core/core/fs/_ops/core.py +5 -0
  93. zeocore-0.1.0/src/zeo_core/core/fs/_ops/directory_ops.py +44 -0
  94. zeocore-0.1.0/src/zeo_core/core/fs/_ops/file_info.py +62 -0
  95. zeocore-0.1.0/src/zeo_core/core/fs/_ops/find_ops.py +29 -0
  96. zeocore-0.1.0/src/zeo_core/core/fs/_ops/path_ops.py +37 -0
  97. zeocore-0.1.0/src/zeo_core/core/fs/_ops/read_ops.py +11 -0
  98. zeocore-0.1.0/src/zeo_core/core/fs/_ops/serialization_ops.py +48 -0
  99. zeocore-0.1.0/src/zeo_core/core/fs/_ops/utility_ops.py +64 -0
  100. zeocore-0.1.0/src/zeo_core/core/fs/_ops/write_ops.py +33 -0
  101. zeocore-0.1.0/src/zeo_core/core/fs/exceptions.py +28 -0
  102. zeocore-0.1.0/src/zeo_core/core/fs/normalize.py +185 -0
  103. zeocore-0.1.0/src/zeo_core/core/fs/plugin.py +88 -0
  104. zeocore-0.1.0/src/zeo_core/core/fs/protocols.py +36 -0
  105. zeocore-0.1.0/src/zeo_core/core/fs/results.py +232 -0
  106. zeocore-0.1.0/src/zeo_core/core/fs/service/__init__.py +70 -0
  107. zeocore-0.1.0/src/zeo_core/core/fs/service/base.py +206 -0
  108. zeocore-0.1.0/src/zeo_core/core/fs/service/directory_operations.py +126 -0
  109. zeocore-0.1.0/src/zeo_core/core/fs/service/factory.py +29 -0
  110. zeocore-0.1.0/src/zeo_core/core/fs/service/file_info_operations.py +59 -0
  111. zeocore-0.1.0/src/zeo_core/core/fs/service/file_operations.py +286 -0
  112. zeocore-0.1.0/src/zeo_core/core/fs/service/full_class.py +99 -0
  113. zeocore-0.1.0/src/zeo_core/core/fs/service/path_operations.py +233 -0
  114. zeocore-0.1.0/src/zeo_core/core/fs/service/path_validation.py +249 -0
  115. zeocore-0.1.0/src/zeo_core/core/fs/service/standalone.py +256 -0
  116. zeocore-0.1.0/src/zeo_core/core/fs/service/structured_data.py +130 -0
  117. zeocore-0.1.0/src/zeo_core/core/fs/service/utility_operations.py +387 -0
  118. zeocore-0.1.0/src/zeo_core/core/fs/utils/__init__.py +18 -0
  119. zeocore-0.1.0/src/zeo_core/core/jobs.py +405 -0
  120. zeocore-0.1.0/src/zeo_core/core/logging/__init__.py +11 -0
  121. zeocore-0.1.0/src/zeo_core/core/logging/config.py +145 -0
  122. zeocore-0.1.0/src/zeo_core/core/logging/formatter.py +154 -0
  123. zeocore-0.1.0/src/zeo_core/core/logging/logger.py +22 -0
  124. zeocore-0.1.0/src/zeo_core/core/mime.py +262 -0
  125. zeocore-0.1.0/src/zeo_core/core/paths/__init__.py +49 -0
  126. zeocore-0.1.0/src/zeo_core/core/paths/_internal/__init__.py +0 -0
  127. zeocore-0.1.0/src/zeo_core/core/paths/_internal/context.py +23 -0
  128. zeocore-0.1.0/src/zeo_core/core/paths/_internal/resolver.py +188 -0
  129. zeocore-0.1.0/src/zeo_core/core/paths/_internal/utils.py +292 -0
  130. zeocore-0.1.0/src/zeo_core/core/paths/api/__init__.py +13 -0
  131. zeocore-0.1.0/src/zeo_core/core/paths/api/public/__init__.py +13 -0
  132. zeocore-0.1.0/src/zeo_core/core/paths/api/public/path_utils.py +72 -0
  133. zeocore-0.1.0/src/zeo_core/core/paths/api/public/results.py +54 -0
  134. zeocore-0.1.0/src/zeo_core/core/paths/models.py +161 -0
  135. zeocore-0.1.0/src/zeo_core/core/paths/plugin.py +88 -0
  136. zeocore-0.1.0/src/zeo_core/core/paths/service.py +240 -0
  137. zeocore-0.1.0/src/zeo_core/core/registry.py +275 -0
  138. zeocore-0.1.0/src/zeo_core/core/serialization.py +244 -0
  139. zeocore-0.1.0/src/zeo_core/integrations/__init__.py +6 -0
  140. zeocore-0.1.0/src/zeo_core/integrations/boot.py +49 -0
  141. zeocore-0.1.0/src/zeo_core/integrations/config.py +39 -0
  142. zeocore-0.1.0/src/zeo_core/integrations/core/__init__.py +68 -0
  143. zeocore-0.1.0/src/zeo_core/integrations/core/base.py +372 -0
  144. zeocore-0.1.0/src/zeo_core/integrations/core/protocols.py +213 -0
  145. zeocore-0.1.0/src/zeo_core/integrations/core/registry.py +153 -0
  146. zeocore-0.1.0/src/zeo_core/integrations/core/results.py +217 -0
  147. zeocore-0.1.0/src/zeo_core/integrations/database/__init__.py +0 -0
  148. zeocore-0.1.0/src/zeo_core/integrations/database/bigquery/__init__.py +0 -0
  149. zeocore-0.1.0/src/zeo_core/integrations/database/sqlite/__init__.py +0 -0
  150. zeocore-0.1.0/src/zeo_core/integrations/database/supabase/__init__.py +0 -0
  151. zeocore-0.1.0/src/zeo_core/integrations/github/__init__.py +39 -0
  152. zeocore-0.1.0/src/zeo_core/integrations/github/auth.py +241 -0
  153. zeocore-0.1.0/src/zeo_core/integrations/github/client.py +531 -0
  154. zeocore-0.1.0/src/zeo_core/integrations/github/config.py +209 -0
  155. zeocore-0.1.0/src/zeo_core/integrations/github/models.py +102 -0
  156. zeocore-0.1.0/src/zeo_core/integrations/github/operations/__init__.py +44 -0
  157. zeocore-0.1.0/src/zeo_core/integrations/github/operations/issues.py +184 -0
  158. zeocore-0.1.0/src/zeo_core/integrations/github/operations/pull_requests.py +504 -0
  159. zeocore-0.1.0/src/zeo_core/integrations/github/operations/repositories.py +350 -0
  160. zeocore-0.1.0/src/zeo_core/integrations/github/operations/users.py +50 -0
  161. zeocore-0.1.0/src/zeo_core/integrations/github/protocols.py +51 -0
  162. zeocore-0.1.0/src/zeo_core/integrations/github/service.py +582 -0
  163. zeocore-0.1.0/src/zeo_core/integrations/github/utils/__init__.py +5 -0
  164. zeocore-0.1.0/src/zeo_core/integrations/github/utils/api.py +296 -0
  165. zeocore-0.1.0/src/zeo_core/integrations/google/__init__.py +15 -0
  166. zeocore-0.1.0/src/zeo_core/integrations/google/auth.py +296 -0
  167. zeocore-0.1.0/src/zeo_core/integrations/google/calendar/__init__.py +0 -0
  168. zeocore-0.1.0/src/zeo_core/integrations/google/config.py +381 -0
  169. zeocore-0.1.0/src/zeo_core/integrations/google/drive/__init__.py +29 -0
  170. zeocore-0.1.0/src/zeo_core/integrations/google/drive/models.py +145 -0
  171. zeocore-0.1.0/src/zeo_core/integrations/google/drive/operations/__init__.py +22 -0
  172. zeocore-0.1.0/src/zeo_core/integrations/google/drive/operations/download.py +166 -0
  173. zeocore-0.1.0/src/zeo_core/integrations/google/drive/operations/folder.py +137 -0
  174. zeocore-0.1.0/src/zeo_core/integrations/google/drive/operations/list_files.py +90 -0
  175. zeocore-0.1.0/src/zeo_core/integrations/google/drive/operations/permissions.py +123 -0
  176. zeocore-0.1.0/src/zeo_core/integrations/google/drive/operations/upload.py +210 -0
  177. zeocore-0.1.0/src/zeo_core/integrations/google/drive/protocols.py +179 -0
  178. zeocore-0.1.0/src/zeo_core/integrations/google/drive/service.py +941 -0
  179. zeocore-0.1.0/src/zeo_core/integrations/google/drive/utils/__init__.py +13 -0
  180. zeocore-0.1.0/src/zeo_core/integrations/google/drive/utils/api.py +96 -0
  181. zeocore-0.1.0/src/zeo_core/integrations/google/drive/utils/query.py +94 -0
  182. zeocore-0.1.0/src/zeo_core/integrations/google/mail/__init__.py +26 -0
  183. zeocore-0.1.0/src/zeo_core/integrations/google/mail/config.py +31 -0
  184. zeocore-0.1.0/src/zeo_core/integrations/google/mail/operations/__init__.py +14 -0
  185. zeocore-0.1.0/src/zeo_core/integrations/google/mail/operations/attachments.py +217 -0
  186. zeocore-0.1.0/src/zeo_core/integrations/google/mail/operations/auth.py +43 -0
  187. zeocore-0.1.0/src/zeo_core/integrations/google/mail/operations/email.py +481 -0
  188. zeocore-0.1.0/src/zeo_core/integrations/google/mail/protocols.py +132 -0
  189. zeocore-0.1.0/src/zeo_core/integrations/google/mail/service.py +456 -0
  190. zeocore-0.1.0/src/zeo_core/integrations/google/mail/utils/__init__.py +12 -0
  191. zeocore-0.1.0/src/zeo_core/integrations/google/mail/utils/api.py +111 -0
  192. zeocore-0.1.0/src/zeo_core/integrations/google/serialization.py +26 -0
  193. zeocore-0.1.0/src/zeo_core/integrations/jupytext/__init__.py +0 -0
  194. zeocore-0.1.0/src/zeo_core/integrations/llms/__init__.py +88 -0
  195. zeocore-0.1.0/src/zeo_core/integrations/llms/clients/__init__.py +18 -0
  196. zeocore-0.1.0/src/zeo_core/integrations/llms/clients/anthropic.py +459 -0
  197. zeocore-0.1.0/src/zeo_core/integrations/llms/clients/base.py +257 -0
  198. zeocore-0.1.0/src/zeo_core/integrations/llms/clients/mock.py +123 -0
  199. zeocore-0.1.0/src/zeo_core/integrations/llms/clients/ollama.py +372 -0
  200. zeocore-0.1.0/src/zeo_core/integrations/llms/clients/openai.py +440 -0
  201. zeocore-0.1.0/src/zeo_core/integrations/llms/config.py +268 -0
  202. zeocore-0.1.0/src/zeo_core/integrations/llms/fallback.py +534 -0
  203. zeocore-0.1.0/src/zeo_core/integrations/llms/models.py +203 -0
  204. zeocore-0.1.0/src/zeo_core/integrations/llms/protocols.py +57 -0
  205. zeocore-0.1.0/src/zeo_core/integrations/llms/registry.py +83 -0
  206. zeocore-0.1.0/src/zeo_core/integrations/llms/service/__init__.py +530 -0
  207. zeocore-0.1.0/src/zeo_core/integrations/llms/service/dependencies.py +65 -0
  208. zeocore-0.1.0/src/zeo_core/integrations/llms/service/initialization.py +220 -0
  209. zeocore-0.1.0/src/zeo_core/integrations/llms/service/integration.py +267 -0
  210. zeocore-0.1.0/src/zeo_core/integrations/llms/service/operations.py +110 -0
  211. zeocore-0.1.0/src/zeo_core/integrations/loader.py +169 -0
  212. zeocore-0.1.0/src/zeo_core/integrations/notion/__init__.py +0 -0
  213. zeocore-0.1.0/src/zeo_core/integrations/notion/config.py +10 -0
  214. zeocore-0.1.0/src/zeo_core/integrations/pandoc/__init__.py +44 -0
  215. zeocore-0.1.0/src/zeo_core/integrations/pandoc/config.py +305 -0
  216. zeocore-0.1.0/src/zeo_core/integrations/pandoc/converter.py +473 -0
  217. zeocore-0.1.0/src/zeo_core/integrations/pandoc/models.py +91 -0
  218. zeocore-0.1.0/src/zeo_core/integrations/pandoc/operations/__init__.py +46 -0
  219. zeocore-0.1.0/src/zeo_core/integrations/pandoc/operations/html_to_md.py +587 -0
  220. zeocore-0.1.0/src/zeo_core/integrations/pandoc/operations/md_to_docx.py +469 -0
  221. zeocore-0.1.0/src/zeo_core/integrations/pandoc/operations/utils.py +465 -0
  222. zeocore-0.1.0/src/zeo_core/integrations/pandoc/protocols.py +145 -0
  223. zeocore-0.1.0/src/zeo_core/integrations/pandoc/service.py +557 -0
  224. zeocore-0.1.0/src/zeo_core/modules/__init__.py +124 -0
  225. zeocore-0.1.0/src/zeo_core/modules/discovery.py +930 -0
  226. zeocore-0.1.0/src/zeo_core/modules/protocols.py +401 -0
  227. zeocore-0.1.0/src/zeo_core/modules/registry.py +651 -0
  228. zeocore-0.1.0/src/zeo_core/prompt/__init__.py +34 -0
  229. zeocore-0.1.0/src/zeo_core/prompt/_internal/__init__.py +0 -0
  230. zeocore-0.1.0/src/zeo_core/prompt/_internal/enhancer.py +60 -0
  231. zeocore-0.1.0/src/zeo_core/prompt/_internal/registry.py +54 -0
  232. zeocore-0.1.0/src/zeo_core/prompt/_internal/selector.py +87 -0
  233. zeocore-0.1.0/src/zeo_core/prompt/api/__init__.py +0 -0
  234. zeocore-0.1.0/src/zeo_core/prompt/api/public/__init__.py +0 -0
  235. zeocore-0.1.0/src/zeo_core/prompt/api/public/results.py +49 -0
  236. zeocore-0.1.0/src/zeo_core/prompt/models.py +59 -0
  237. zeocore-0.1.0/src/zeo_core/prompt/packs/__init__.py +0 -0
  238. zeocore-0.1.0/src/zeo_core/prompt/packs/internal/__init__.py +27 -0
  239. zeocore-0.1.0/src/zeo_core/prompt/plugin.py +32 -0
  240. zeocore-0.1.0/src/zeo_core/prompt/service.py +180 -0
  241. zeocore-0.1.0/src/zeo_core/prompt/strategies/__init__.py +5 -0
  242. zeocore-0.1.0/src/zeo_core/prompt/strategies/core.py +814 -0
  243. zeocore-0.1.0/src/zeo_core/py.typed +0 -0
  244. zeocore-0.1.0/src/zeo_core/tools/__init__.py +101 -0
  245. zeocore-0.1.0/src/zeo_core/tools/base.py +175 -0
  246. zeocore-0.1.0/src/zeo_core/tools/context.py +194 -0
  247. zeocore-0.1.0/src/zeo_core/tools/mixins/__init__.py +85 -0
  248. zeocore-0.1.0/src/zeo_core/tools/mixins/env_init.py +211 -0
  249. zeocore-0.1.0/src/zeo_core/tools/mixins/integration_enabled.py +50 -0
  250. zeocore-0.1.0/src/zeo_core/tools/mixins/lifecycle.py +110 -0
  251. zeocore-0.1.0/src/zeo_core/tools/mixins/output_handler.py +32 -0
  252. zeocore-0.1.0/src/zeo_core/tools/protocol.py +64 -0
  253. zeocore-0.1.0/src/zeo_policy.yaml +13 -0
  254. zeocore-0.1.0/tests/README.md +324 -0
  255. zeocore-0.1.0/tests/__init__.py +0 -0
  256. zeocore-0.1.0/tests/conftest.py +346 -0
  257. zeocore-0.1.0/tests/test_adapters/__init__.py +0 -0
  258. zeocore-0.1.0/tests/test_adapters/test_http_adapter.py +555 -0
  259. zeocore-0.1.0/tests/test_cli/__init__.py +0 -0
  260. zeocore-0.1.0/tests/test_config/__init__.py +0 -0
  261. zeocore-0.1.0/tests/test_config/test_config_base.py +217 -0
  262. zeocore-0.1.0/tests/test_config/test_config_plugin.py +130 -0
  263. zeocore-0.1.0/tests/test_config/test_loader.py +361 -0
  264. zeocore-0.1.0/tests/test_config/test_models.py +322 -0
  265. zeocore-0.1.0/tests/test_config/test_utils.py +104 -0
  266. zeocore-0.1.0/tests/test_contracts/__init__.py +5 -0
  267. zeocore-0.1.0/tests/test_contracts/fixtures/artifact_ref_local.json +19 -0
  268. zeocore-0.1.0/tests/test_contracts/fixtures/artifact_ref_s3.json +21 -0
  269. zeocore-0.1.0/tests/test_contracts/fixtures/manifest_error.json +19 -0
  270. zeocore-0.1.0/tests/test_contracts/fixtures/manifest_success.json +56 -0
  271. zeocore-0.1.0/tests/test_contracts/test_artifacts.py +457 -0
  272. zeocore-0.1.0/tests/test_contracts/test_capabilities.py +73 -0
  273. zeocore-0.1.0/tests/test_contracts/test_dependency_boundaries.py +219 -0
  274. zeocore-0.1.0/tests/test_contracts/test_envelopes.py +214 -0
  275. zeocore-0.1.0/tests/test_contracts/test_schema_examples.py +243 -0
  276. zeocore-0.1.0/tests/test_core/__init__.py +0 -0
  277. zeocore-0.1.0/tests/test_core/test_logging/__init__.py +0 -0
  278. zeocore-0.1.0/tests/test_core/test_logging/test_config.py +137 -0
  279. zeocore-0.1.0/tests/test_core/test_mime.py +112 -0
  280. zeocore-0.1.0/tests/test_core/test_registry.py +287 -0
  281. zeocore-0.1.0/tests/test_core/test_serialization.py +238 -0
  282. zeocore-0.1.0/tests/test_dev/__init__.py +0 -0
  283. zeocore-0.1.0/tests/test_dev/test_run_local.py +75 -0
  284. zeocore-0.1.0/tests/test_errors/__init__.py +0 -0
  285. zeocore-0.1.0/tests/test_errors/test_base.py +270 -0
  286. zeocore-0.1.0/tests/test_errors/test_handlers.py +219 -0
  287. zeocore-0.1.0/tests/test_fs/__init__.py +0 -0
  288. zeocore-0.1.0/tests/test_fs/test_api_surface.py +253 -0
  289. zeocore-0.1.0/tests/test_fs/test_architecture.py +111 -0
  290. zeocore-0.1.0/tests/test_fs/test_atomic_wrapping.py +174 -0
  291. zeocore-0.1.0/tests/test_fs/test_operations.py +586 -0
  292. zeocore-0.1.0/tests/test_fs/test_path_utils.py +188 -0
  293. zeocore-0.1.0/tests/test_fs/test_results.py +418 -0
  294. zeocore-0.1.0/tests/test_fs/test_service.py +683 -0
  295. zeocore-0.1.0/tests/test_fs/test_service_mixins_cluster.py +859 -0
  296. zeocore-0.1.0/tests/test_fs/test_standalone.py +350 -0
  297. zeocore-0.1.0/tests/test_fs/test_suite.py +289 -0
  298. zeocore-0.1.0/tests/test_fs/test_utility_operations.py +288 -0
  299. zeocore-0.1.0/tests/test_fs/test_utils.py +868 -0
  300. zeocore-0.1.0/tests/test_helper.py +44 -0
  301. zeocore-0.1.0/tests/test_http/__init__.py +3 -0
  302. zeocore-0.1.0/tests/test_http/conftest.py +155 -0
  303. zeocore-0.1.0/tests/test_http/test_auth.py +131 -0
  304. zeocore-0.1.0/tests/test_http/test_config.py +69 -0
  305. zeocore-0.1.0/tests/test_http/test_integration.py +202 -0
  306. zeocore-0.1.0/tests/test_http/test_jobs.py +362 -0
  307. zeocore-0.1.0/tests/test_http/test_routes_jobs.py +141 -0
  308. zeocore-0.1.0/tests/test_http/test_routes_zeomedia.py +144 -0
  309. zeocore-0.1.0/tests/test_http/test_util.py +25 -0
  310. zeocore-0.1.0/tests/test_integration/__init__.py +0 -0
  311. zeocore-0.1.0/tests/test_integration/test_full_pipeline.py +317 -0
  312. zeocore-0.1.0/tests/test_integrations/__init__.py +0 -0
  313. zeocore-0.1.0/tests/test_integrations/core/__init__.py +0 -0
  314. zeocore-0.1.0/tests/test_integrations/core/base/__init__.py +1 -0
  315. zeocore-0.1.0/tests/test_integrations/core/base/auth_provider_impl.py +35 -0
  316. zeocore-0.1.0/tests/test_integrations/core/base/config_provider_impl.py +25 -0
  317. zeocore-0.1.0/tests/test_integrations/core/base/integration_service_impl.py +21 -0
  318. zeocore-0.1.0/tests/test_integrations/core/base/test_auth_provider.py +221 -0
  319. zeocore-0.1.0/tests/test_integrations/core/base/test_base.py +29 -0
  320. zeocore-0.1.0/tests/test_integrations/core/base/test_config_provider.py +152 -0
  321. zeocore-0.1.0/tests/test_integrations/core/base/test_config_provider_discovery.py +217 -0
  322. zeocore-0.1.0/tests/test_integrations/core/base/test_integration_service.py +164 -0
  323. zeocore-0.1.0/tests/test_integrations/core/base/test_protocols.py +383 -0
  324. zeocore-0.1.0/tests/test_integrations/core/test_get_service.py +138 -0
  325. zeocore-0.1.0/tests/test_integrations/core/test_protocol_inheritance.py +493 -0
  326. zeocore-0.1.0/tests/test_integrations/core/test_protocols.py +369 -0
  327. zeocore-0.1.0/tests/test_integrations/core/test_registry.py +167 -0
  328. zeocore-0.1.0/tests/test_integrations/core/test_results.py +334 -0
  329. zeocore-0.1.0/tests/test_integrations/github/__init__.py +1 -0
  330. zeocore-0.1.0/tests/test_integrations/github/conftest.py +459 -0
  331. zeocore-0.1.0/tests/test_integrations/github/operations/__init__.py +1 -0
  332. zeocore-0.1.0/tests/test_integrations/github/test_api.py +345 -0
  333. zeocore-0.1.0/tests/test_integrations/github/test_auth.py +166 -0
  334. zeocore-0.1.0/tests/test_integrations/github/test_auth_provider.py +538 -0
  335. zeocore-0.1.0/tests/test_integrations/github/test_client.py +615 -0
  336. zeocore-0.1.0/tests/test_integrations/github/test_config.py +183 -0
  337. zeocore-0.1.0/tests/test_integrations/github/test_github_init.py +0 -0
  338. zeocore-0.1.0/tests/test_integrations/github/test_integration.py +281 -0
  339. zeocore-0.1.0/tests/test_integrations/github/test_models.py +257 -0
  340. zeocore-0.1.0/tests/test_integrations/github/test_operations.py +1516 -0
  341. zeocore-0.1.0/tests/test_integrations/github/test_protocols.py +91 -0
  342. zeocore-0.1.0/tests/test_integrations/github/test_service.py +926 -0
  343. zeocore-0.1.0/tests/test_integrations/github/utils/__init__.py +1 -0
  344. zeocore-0.1.0/tests/test_integrations/google/__init__.py +1 -0
  345. zeocore-0.1.0/tests/test_integrations/google/drive/__init__.py +1 -0
  346. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/__init__.py +75 -0
  347. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/base.py +87 -0
  348. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/credentials.py +64 -0
  349. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/download.py +95 -0
  350. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/media.py +139 -0
  351. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/requests.py +104 -0
  352. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/resources.py +329 -0
  353. zeocore-0.1.0/tests/test_integrations/google/drive/mocks/services.py +201 -0
  354. zeocore-0.1.0/tests/test_integrations/google/drive/mocks.py +49 -0
  355. zeocore-0.1.0/tests/test_integrations/google/drive/operations/__init__.py +0 -0
  356. zeocore-0.1.0/tests/test_integrations/google/drive/operations/test_operations_download.py +287 -0
  357. zeocore-0.1.0/tests/test_integrations/google/drive/operations/test_operations_folder.py +270 -0
  358. zeocore-0.1.0/tests/test_integrations/google/drive/operations/test_operations_list_files.py +256 -0
  359. zeocore-0.1.0/tests/test_integrations/google/drive/operations/test_operations_permissions.py +284 -0
  360. zeocore-0.1.0/tests/test_integrations/google/drive/operations/test_operations_resolve_project_path_real_bug.py +132 -0
  361. zeocore-0.1.0/tests/test_integrations/google/drive/operations/test_operations_upload.py +408 -0
  362. zeocore-0.1.0/tests/test_integrations/google/drive/operations/test_operations_upload_mime_type_real_bug.py +137 -0
  363. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive.py +82 -0
  364. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_models.py +126 -0
  365. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_delete.py +70 -0
  366. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_download.py +143 -0
  367. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_error_paths.py +1279 -0
  368. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_files.py +499 -0
  369. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_folders.py +139 -0
  370. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_init.py +243 -0
  371. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_list.py +81 -0
  372. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_permissions.py +139 -0
  373. zeocore-0.1.0/tests/test_integrations/google/drive/test_drive_service_upload.py +160 -0
  374. zeocore-0.1.0/tests/test_integrations/google/drive/test_protocols.py +211 -0
  375. zeocore-0.1.0/tests/test_integrations/google/drive/utils/__init__.py +0 -0
  376. zeocore-0.1.0/tests/test_integrations/google/drive/utils/test_utils_api.py +222 -0
  377. zeocore-0.1.0/tests/test_integrations/google/drive/utils/test_utils_query.py +84 -0
  378. zeocore-0.1.0/tests/test_integrations/google/mail/__init__.py +0 -0
  379. zeocore-0.1.0/tests/test_integrations/google/mail/mocks.py +411 -0
  380. zeocore-0.1.0/tests/test_integrations/google/mail/operations/__init__.py +1 -0
  381. zeocore-0.1.0/tests/test_integrations/google/mail/operations/test_attachments.py +389 -0
  382. zeocore-0.1.0/tests/test_integrations/google/mail/operations/test_auth.py +105 -0
  383. zeocore-0.1.0/tests/test_integrations/google/mail/operations/test_email.py +499 -0
  384. zeocore-0.1.0/tests/test_integrations/google/mail/operations/test_email_message_parts.py +880 -0
  385. zeocore-0.1.0/tests/test_integrations/google/mail/operations/test_handle_attachment_split_path_real_bug.py +235 -0
  386. zeocore-0.1.0/tests/test_integrations/google/mail/test_mail.py +32 -0
  387. zeocore-0.1.0/tests/test_integrations/google/mail/test_mail_service.py +763 -0
  388. zeocore-0.1.0/tests/test_integrations/google/mail/utils/__init__.py +1 -0
  389. zeocore-0.1.0/tests/test_integrations/google/mail/utils/test_api.py +158 -0
  390. zeocore-0.1.0/tests/test_integrations/google/mocks.py +48 -0
  391. zeocore-0.1.0/tests/test_integrations/google/test_auth_provider.py +754 -0
  392. zeocore-0.1.0/tests/test_integrations/google/test_config_provider.py +375 -0
  393. zeocore-0.1.0/tests/test_integrations/google/test_serialization.py +37 -0
  394. zeocore-0.1.0/tests/test_integrations/llms/__init__.py +1 -0
  395. zeocore-0.1.0/tests/test_integrations/llms/clients/__init__.py +1 -0
  396. zeocore-0.1.0/tests/test_integrations/llms/clients/test_anthropic.py +409 -0
  397. zeocore-0.1.0/tests/test_integrations/llms/clients/test_base.py +328 -0
  398. zeocore-0.1.0/tests/test_integrations/llms/clients/test_clients.py +79 -0
  399. zeocore-0.1.0/tests/test_integrations/llms/clients/test_mock.py +171 -0
  400. zeocore-0.1.0/tests/test_integrations/llms/clients/test_ollama.py +245 -0
  401. zeocore-0.1.0/tests/test_integrations/llms/clients/test_openai.py +553 -0
  402. zeocore-0.1.0/tests/test_integrations/llms/mocks/__init__.py +56 -0
  403. zeocore-0.1.0/tests/test_integrations/llms/mocks/anthropic.py +344 -0
  404. zeocore-0.1.0/tests/test_integrations/llms/mocks/base.py +155 -0
  405. zeocore-0.1.0/tests/test_integrations/llms/mocks/clients.py +157 -0
  406. zeocore-0.1.0/tests/test_integrations/llms/mocks/openai.py +274 -0
  407. zeocore-0.1.0/tests/test_integrations/llms/service/__init__.py +0 -0
  408. zeocore-0.1.0/tests/test_integrations/llms/service/test_dependencies.py +70 -0
  409. zeocore-0.1.0/tests/test_integrations/llms/service/test_init_module.py +536 -0
  410. zeocore-0.1.0/tests/test_integrations/llms/service/test_initialization.py +371 -0
  411. zeocore-0.1.0/tests/test_integrations/llms/service/test_integration.py +469 -0
  412. zeocore-0.1.0/tests/test_integrations/llms/service/test_operations.py +327 -0
  413. zeocore-0.1.0/tests/test_integrations/llms/test_config.py +178 -0
  414. zeocore-0.1.0/tests/test_integrations/llms/test_config_provider.py +161 -0
  415. zeocore-0.1.0/tests/test_integrations/llms/test_fallback.py +318 -0
  416. zeocore-0.1.0/tests/test_integrations/llms/test_integration.py +145 -0
  417. zeocore-0.1.0/tests/test_integrations/llms/test_llms.py +42 -0
  418. zeocore-0.1.0/tests/test_integrations/llms/test_models.py +432 -0
  419. zeocore-0.1.0/tests/test_integrations/llms/test_protocols.py +88 -0
  420. zeocore-0.1.0/tests/test_integrations/llms/test_registry.py +191 -0
  421. zeocore-0.1.0/tests/test_integrations/llms/test_service.py +266 -0
  422. zeocore-0.1.0/tests/test_integrations/pandoc/__init__.py +6 -0
  423. zeocore-0.1.0/tests/test_integrations/pandoc/conftest.py +269 -0
  424. zeocore-0.1.0/tests/test_integrations/pandoc/mocks.py +146 -0
  425. zeocore-0.1.0/tests/test_integrations/pandoc/operations/__init__.py +6 -0
  426. zeocore-0.1.0/tests/test_integrations/pandoc/operations/test_html_to_md.py +1115 -0
  427. zeocore-0.1.0/tests/test_integrations/pandoc/operations/test_md_to_docx.py +523 -0
  428. zeocore-0.1.0/tests/test_integrations/pandoc/operations/test_utils.py +242 -0
  429. zeocore-0.1.0/tests/test_integrations/pandoc/operations/test_utils_fix.py +179 -0
  430. zeocore-0.1.0/tests/test_integrations/pandoc/test_config.py +115 -0
  431. zeocore-0.1.0/tests/test_integrations/pandoc/test_converter.py +852 -0
  432. zeocore-0.1.0/tests/test_integrations/pandoc/test_models.py +114 -0
  433. zeocore-0.1.0/tests/test_integrations/pandoc/test_pandoc_integration.py +461 -0
  434. zeocore-0.1.0/tests/test_integrations/pandoc/test_pandoc_integration_edge_cases.py +654 -0
  435. zeocore-0.1.0/tests/test_integrations/pandoc/test_pandoc_integration_full.py +397 -0
  436. zeocore-0.1.0/tests/test_integrations/pandoc/test_pandoc_utils.py +475 -0
  437. zeocore-0.1.0/tests/test_integrations/pandoc/test_service.py +1339 -0
  438. zeocore-0.1.0/tests/test_integrations/test_loader.py +343 -0
  439. zeocore-0.1.0/tests/test_paths/__init__.py +5 -0
  440. zeocore-0.1.0/tests/test_paths/conftest.py +72 -0
  441. zeocore-0.1.0/tests/test_paths/test_api_public_path_utils.py +101 -0
  442. zeocore-0.1.0/tests/test_paths/test_context.py +209 -0
  443. zeocore-0.1.0/tests/test_paths/test_paths_plugin.py +120 -0
  444. zeocore-0.1.0/tests/test_paths/test_resolvers.py +325 -0
  445. zeocore-0.1.0/tests/test_paths/test_service.py +348 -0
  446. zeocore-0.1.0/tests/test_paths/test_utils.py +510 -0
  447. zeocore-0.1.0/tests/test_plugins/__init__.py +0 -0
  448. zeocore-0.1.0/tests/test_plugins/test_discovery.py +582 -0
  449. zeocore-0.1.0/tests/test_plugins/test_explicit_loading.py +708 -0
  450. zeocore-0.1.0/tests/test_plugins/test_protocols.py +432 -0
  451. zeocore-0.1.0/tests/test_plugins/test_registry.py +981 -0
  452. zeocore-0.1.0/tests/test_prompt/__init__.py +7 -0
  453. zeocore-0.1.0/tests/test_prompt/test_enhancer.py +139 -0
  454. zeocore-0.1.0/tests/test_prompt/test_prompt_plugin.py +76 -0
  455. zeocore-0.1.0/tests/test_prompt/test_prompt_smoke.py +32 -0
  456. zeocore-0.1.0/tests/test_prompt/test_registry.py +88 -0
  457. zeocore-0.1.0/tests/test_prompt/test_selector.py +191 -0
  458. zeocore-0.1.0/tests/test_prompt/test_service.py +361 -0
  459. zeocore-0.1.0/tests/test_prompt/test_strategies_core.py +524 -0
  460. zeocore-0.1.0/tests/test_prompt/test_strategy_base.py +113 -0
  461. zeocore-0.1.0/tests/test_tools/__init__.py +6 -0
  462. zeocore-0.1.0/tests/test_tools/conftest.py +69 -0
  463. zeocore-0.1.0/tests/test_tools/mixins/__init__.py +5 -0
  464. zeocore-0.1.0/tests/test_tools/mixins/test_env_init.py +234 -0
  465. zeocore-0.1.0/tests/test_tools/mixins/test_integration_enabled.py +158 -0
  466. zeocore-0.1.0/tests/test_tools/mixins/test_lifecycle.py +141 -0
  467. zeocore-0.1.0/tests/test_tools/mocks.py +360 -0
  468. zeocore-0.1.0/tests/test_tools/test_imports.py +97 -0
@@ -0,0 +1,16 @@
1
+ # Normalize line endings to LF for all text files, regardless of the
2
+ # contributor's platform (Windows checkouts default to CRLF otherwise,
3
+ # which causes noisy whole-file diffs on every edit).
4
+ * text=auto eol=lf
5
+
6
+ # Treat these as binary — never line-ending-normalize, never diff as text.
7
+ *.png binary
8
+ *.jpg binary
9
+ *.jpeg binary
10
+ *.gif binary
11
+ *.ico binary
12
+ *.whl binary
13
+ *.tar.gz binary
14
+
15
+ # Collapse generated/vendored files out of GitHub's diff view by default.
16
+ uv.lock -diff linguist-generated=true
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something isn't working as expected
4
+ title: ""
5
+ labels: bug
6
+ ---
7
+
8
+ **What happened?**
9
+
10
+ <!-- A clear description of the bug. -->
11
+
12
+ **What did you expect to happen?**
13
+
14
+ **How to reproduce**
15
+
16
+ <!-- Minimal steps or code snippet to reproduce the issue. -->
17
+
18
+ **Environment**
19
+
20
+ - zeocore version:
21
+ - Python version:
22
+ - OS:
23
+
24
+ **Anything else?**
25
+
26
+ <!-- Logs, stack traces, screenshots -- whatever's useful. -->
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea or improvement
4
+ title: ""
5
+ labels: enhancement
6
+ ---
7
+
8
+ **What problem does this solve?**
9
+
10
+ <!-- What are you trying to do that zeocore doesn't support well today? -->
11
+
12
+ **Proposed solution**
13
+
14
+ <!-- What would you like to see? A rough API sketch is welcome. -->
15
+
16
+ **Alternatives considered**
17
+
18
+ <!-- Any workarounds you're using now, or other approaches you considered. -->
@@ -0,0 +1,11 @@
1
+ ## What does this PR do?
2
+
3
+ <!-- A short description of the change and why it's needed. -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] I've made the change, with tests
8
+ - [ ] `make verify` passes locally (format-check, lint, mypy strict, arch-check,
9
+ hygiene-check, hygiene-secrets, plugin-boundary, tests + coverage --
10
+ see [CONTRIBUTING.md](../CONTRIBUTING.md))
11
+ - [ ] This PR describes what changed and why
@@ -0,0 +1,44 @@
1
+ name: CI
2
+
3
+ # The doctrine gate, run in CI the same way contributors run it locally:
4
+ # `make verify` (see CONTRIBUTING.md / Makefile). We shell out to the same
5
+ # `make` targets rather than reimplementing each tool invocation in YAML,
6
+ # so local and CI behavior cannot drift apart. The only per-job deviation is
7
+ # selecting the matrix Python version, which has to happen before `make setup`
8
+ # creates the venv -- done via `PYTHON_VERSION=<matrix version>` on the make
9
+ # command line, which overrides the Makefile's own `PYTHON_VERSION := 3.13`
10
+ # default (make command-line assignments win over `:=` in the makefile).
11
+
12
+ on:
13
+ push:
14
+ branches: [main]
15
+ pull_request:
16
+ branches: [main]
17
+
18
+ concurrency:
19
+ group: ci-${{ github.workflow }}-${{ github.ref }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ verify:
24
+ name: verify (py${{ matrix.python-version }})
25
+ runs-on: ubuntu-latest
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
30
+ steps:
31
+ - name: Check out repository
32
+ uses: actions/checkout@v4
33
+
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@v3
36
+ with:
37
+ enable-cache: true
38
+ cache-dependency-glob: "pyproject.toml"
39
+
40
+ - name: make setup (env + install-all + install-dev + install-lint)
41
+ run: make setup PYTHON_VERSION=${{ matrix.python-version }}
42
+
43
+ - name: make verify (format-check, lint, mypy strict, arch-check, hygiene-check, hygiene-secrets, plugin-boundary, tests+coverage)
44
+ run: make verify
@@ -0,0 +1,206 @@
1
+ name: Publish
2
+
3
+ # Two ways to trigger:
4
+ # 1. Push a version tag (`v0.1.0`, matching pyproject.toml's `version`) --
5
+ # publishes straight to real PyPI. This is the release path.
6
+ # 2. Manual dispatch (Actions tab -> Run workflow) with a `target` choice
7
+ # of testpypi / pypi / both -- lets a human stage a real publish
8
+ # attempt against TestPyPI (a real, separate package index with its
9
+ # own trusted-publisher binding) without cutting a tag, and is the
10
+ # right way to first verify PyPI's trusted-publisher link is actually
11
+ # configured correctly before it matters on a real release.
12
+ #
13
+ # Runs the full `make verify` gate first so a broken build can never reach
14
+ # either index even if someone tags/dispatches by mistake, then builds
15
+ # sdist+wheel once and publishes via PyPI Trusted Publishing (OIDC) to
16
+ # whichever index(es) were requested -- no API token stored as a repo
17
+ # secret for either index.
18
+ #
19
+ # One-time setup required on each index's own web UI before this workflow
20
+ # can publish there (not done by this workflow, and not something a CI
21
+ # session has credentials for):
22
+ # - PyPI: https://pypi.org/manage/account/publishing/
23
+ # - TestPyPI: https://test.pypi.org/manage/account/publishing/
24
+ # For each, register a trusted publisher with EXACTLY:
25
+ # - repository owner: zeroemployeeorg
26
+ # - repository name: zeocore
27
+ # - workflow filename: publish.yml (not the full path, just the filename)
28
+ # - environment name: pypi (for the pypi.org publisher) or
29
+ # testpypi (for the test.pypi.org publisher)
30
+ # All four fields are baked into the OIDC token's claims and must match
31
+ # byte-for-byte on PyPI's side -- a mismatch fails with
32
+ # "invalid-publisher: valid token, but no corresponding publisher", which
33
+ # gives no further detail about WHICH field is wrong, so get all four
34
+ # exactly right rather than guessing from the error alone.
35
+ # See https://docs.pypi.org/trusted-publishers/.
36
+
37
+ on:
38
+ workflow_dispatch:
39
+ inputs:
40
+ target:
41
+ description: "Where to publish"
42
+ required: true
43
+ type: choice
44
+ options:
45
+ - testpypi
46
+ - pypi
47
+ - both
48
+ default: testpypi
49
+ push:
50
+ tags:
51
+ - "v*.*.*"
52
+
53
+ permissions:
54
+ contents: read
55
+
56
+ jobs:
57
+ verify:
58
+ name: verify before publish
59
+ runs-on: ubuntu-latest
60
+ steps:
61
+ - name: Check out repository
62
+ uses: actions/checkout@v4
63
+
64
+ - name: Install uv
65
+ uses: astral-sh/setup-uv@v3
66
+ with:
67
+ enable-cache: true
68
+ cache-dependency-glob: "pyproject.toml"
69
+
70
+ - name: make setup
71
+ run: make setup
72
+
73
+ - name: make verify (the doctrine gate -- must pass before publish)
74
+ run: make verify
75
+
76
+ build:
77
+ name: build sdist + wheel
78
+ needs: verify
79
+ runs-on: ubuntu-latest
80
+ steps:
81
+ - name: Check out repository
82
+ uses: actions/checkout@v4
83
+
84
+ - name: Install uv
85
+ uses: astral-sh/setup-uv@v3
86
+ with:
87
+ enable-cache: true
88
+ cache-dependency-glob: "pyproject.toml"
89
+
90
+ - name: make setup
91
+ run: make setup
92
+
93
+ - name: make build (python -m build -> sdist + wheel in dist/)
94
+ run: make build
95
+
96
+ - name: Upload build artifacts
97
+ uses: actions/upload-artifact@v4
98
+ with:
99
+ name: dist
100
+ path: dist/
101
+ if-no-files-found: error
102
+
103
+ publish-testpypi:
104
+ name: publish to TestPyPI (trusted publishing)
105
+ needs: build
106
+ if: >-
107
+ (github.event_name == 'workflow_dispatch' &&
108
+ (github.event.inputs.target == 'testpypi' || github.event.inputs.target == 'both'))
109
+ runs-on: ubuntu-latest
110
+ environment:
111
+ name: testpypi
112
+ url: https://test.pypi.org/project/zeocore/
113
+ permissions:
114
+ id-token: write
115
+ steps:
116
+ - name: Download build artifacts
117
+ uses: actions/download-artifact@v4
118
+ with:
119
+ name: dist
120
+ path: dist/
121
+
122
+ - name: Publish to TestPyPI
123
+ uses: pypa/gh-action-pypi-publish@release/v1
124
+ with:
125
+ repository-url: https://test.pypi.org/legacy/
126
+ verbose: true
127
+ print-hash: true
128
+
129
+ publish-pypi:
130
+ name: publish to PyPI (trusted publishing)
131
+ needs: build
132
+ if: >-
133
+ (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) ||
134
+ (github.event_name == 'workflow_dispatch' &&
135
+ (github.event.inputs.target == 'pypi' || github.event.inputs.target == 'both'))
136
+ runs-on: ubuntu-latest
137
+ environment:
138
+ name: pypi
139
+ url: https://pypi.org/project/zeocore/
140
+ permissions:
141
+ # id-token: write is what makes OIDC / trusted publishing work --
142
+ # no PYPI_API_TOKEN secret needed or wanted.
143
+ id-token: write
144
+ steps:
145
+ - name: Download build artifacts
146
+ uses: actions/download-artifact@v4
147
+ with:
148
+ name: dist
149
+ path: dist/
150
+
151
+ - name: Publish to PyPI
152
+ uses: pypa/gh-action-pypi-publish@release/v1
153
+ with:
154
+ verbose: true
155
+ print-hash: true
156
+
157
+ smoke-test:
158
+ name: smoke-test the published package
159
+ needs: [publish-testpypi, publish-pypi]
160
+ # Runs if EITHER publish job ran and succeeded; skipped entirely (not
161
+ # failed) if a given publish job didn't run because its target wasn't
162
+ # selected -- `always()` plus explicit result checks, since `needs`
163
+ # results for a skipped job read as "success" by default, which would
164
+ # otherwise let this step silently no-op instead of actually verifying
165
+ # anything on a testpypi-only or pypi-only run.
166
+ if: |
167
+ always() &&
168
+ (needs.publish-testpypi.result == 'success' || needs.publish-pypi.result == 'success')
169
+ runs-on: ubuntu-latest
170
+ steps:
171
+ - name: Install uv
172
+ uses: astral-sh/setup-uv@v3
173
+
174
+ - name: Wait for index propagation
175
+ run: sleep 30
176
+
177
+ - name: Install from PyPI and smoke-test
178
+ if: needs.publish-pypi.result == 'success'
179
+ run: |
180
+ uv venv /tmp/smoke-pypi
181
+ uv pip install --python /tmp/smoke-pypi/bin/python zeocore=="${GITHUB_REF_NAME#v}"
182
+ /tmp/smoke-pypi/bin/python -c "
183
+ import zeo_core
184
+ print('installed version:', zeo_core.__version__)
185
+ from zeo_core.tools import BaseZeoTool, ToolContext
186
+ from zeo_core.contracts import CapabilityResult
187
+ print('import OK: BaseZeoTool, ToolContext, CapabilityResult')
188
+ "
189
+ env:
190
+ GITHUB_REF_NAME: ${{ github.ref_name }}
191
+
192
+ - name: Install from TestPyPI and smoke-test
193
+ if: needs.publish-testpypi.result == 'success' && needs.publish-pypi.result != 'success'
194
+ run: |
195
+ uv venv /tmp/smoke-testpypi
196
+ uv pip install --python /tmp/smoke-testpypi/bin/python \
197
+ --index-url https://test.pypi.org/simple/ \
198
+ --extra-index-url https://pypi.org/simple/ \
199
+ zeocore
200
+ /tmp/smoke-testpypi/bin/python -c "
201
+ import zeo_core
202
+ print('installed version:', zeo_core.__version__)
203
+ from zeo_core.tools import BaseZeoTool, ToolContext
204
+ from zeo_core.contracts import CapabilityResult
205
+ print('import OK: BaseZeoTool, ToolContext, CapabilityResult')
206
+ "
@@ -0,0 +1,47 @@
1
+ # Byte-compiled / cache
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Distribution / packaging
7
+ build/
8
+ dist/
9
+ *.egg-info/
10
+ *.egg
11
+ wheels/
12
+ pip-wheel-metadata/
13
+
14
+ # Virtual environments
15
+ .venv/
16
+ venv/
17
+ env/
18
+ ENV/
19
+
20
+ # Test / coverage / type-check caches
21
+ .pytest_cache/
22
+ .mypy_cache/
23
+ .ruff_cache/
24
+ .hypothesis/
25
+ .coverage
26
+ .coverage.*
27
+ coverage.xml
28
+ htmlcov/
29
+
30
+ # Runtime scratch dirs created by zeo_core's fs service
31
+ .zeo/
32
+
33
+ # Editors / OS
34
+ .idea/
35
+ .vscode/
36
+ *.swp
37
+ .DS_Store
38
+
39
+ # Secrets
40
+ .env
41
+ .env.*
42
+ !.env.example
43
+ *.pem
44
+ *.key
45
+
46
+ # Jupyter
47
+ .ipynb_checkpoints/
@@ -0,0 +1,54 @@
1
+ # .importlinter — Tier-1 directional import contracts (Track C)
2
+ # Enforced via `lint-imports` inside `make verify` (wired next). Every contract
3
+ # below targets a REAL module path verified by recon (C-RECON-06..08), not the
4
+ # strategy-doc's vocabulary — e.g. Capability lives at zeo_core.contracts.capabilities,
5
+ # NOT zeo_core.capabilities; a contract against the doc name would resolve to
6
+ # nothing and never fire.
7
+ #
8
+ # Deliberately OMITTED here, recorded for Master (Rev 4):
9
+ # - producer->consumer (zeocore/zeointegrations/zeoplugins): cross-PACKAGE,
10
+ # not resolvable inside the zeocore-only work_repo. Belongs to a monorepo
11
+ # linter, outside Track C's single-work_repo scope (§15).
12
+ # - Plugin -> Tool/Cap: `plugin.py` is a per-subsystem MODULE (core/paths, core/fs,
13
+ # config, prompt), not a package — no import-linter target. Handled as a
14
+ # plugin.py grep-ban instead.
15
+ # - "nothing imports a Tool" as a GLOBAL rule: tools legitimately import their own
16
+ # submodules, so a blanket forbidden would fire on legitimate internal imports.
17
+ # The enforceable core (non-tool layers not importing tools) is expressed below;
18
+ # the broad form needs an allowlist/independence design — Master's call.
19
+
20
+ [importlinter]
21
+ root_package = zeo_core
22
+
23
+ [importlinter:contract:capabilities-not-import-tools]
24
+ name = Capabilities must not import Tools
25
+ type = forbidden
26
+ source_modules =
27
+ zeo_core.contracts.capabilities
28
+ forbidden_modules =
29
+ zeo_core.tools
30
+
31
+ [importlinter:contract:integrations-are-leaves]
32
+ name = Integrations are leaves (no Capability/Tool imports)
33
+ type = forbidden
34
+ source_modules =
35
+ zeo_core.integrations
36
+ forbidden_modules =
37
+ zeo_core.tools
38
+ zeo_core.contracts.capabilities
39
+
40
+ [importlinter:contract:fs-internal-not-import-service]
41
+ name = fs _internal must not import service
42
+ type = forbidden
43
+ source_modules =
44
+ zeo_core.core.fs._internal
45
+ forbidden_modules =
46
+ zeo_core.core.fs.service
47
+
48
+ [importlinter:contract:fs-ops-not-import-results]
49
+ name = fs _ops must not import Result types
50
+ type = forbidden
51
+ source_modules =
52
+ zeo_core.core.fs._ops
53
+ forbidden_modules =
54
+ zeo_core.core.fs.results
@@ -0,0 +1,77 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-08-17
9
+
10
+ Initial extraction from the quackverse monorepo as a standalone,
11
+ MIT-licensed package.
12
+
13
+ ### Added
14
+
15
+ - `zeo_core.tools`: a capability-authoring framework (`BaseZeoTool`,
16
+ `ToolContext`, `ZeoToolProtocol`) with optional mixins
17
+ (`IntegrationEnabledMixin`, `LifecycleMixin`, `ToolEnvInitializerMixin`)
18
+ for writing doctrine-compliant tools.
19
+ - `zeo_core.contracts`: typed data contracts (`CapabilityResult`, artifact
20
+ and manifest models, common enums and IDs).
21
+ - `zeo_core.core`: filesystem operations (`core.fs`), path resolution
22
+ (`core.paths`), a typed error hierarchy (`core.errors`), MIME detection,
23
+ serialization helpers, logging, and an operation registry.
24
+ - `zeo_core.config`: YAML/environment-variable configuration loading and
25
+ per-tool configuration models.
26
+ - `zeo_core.integrations`: adapters for GitHub, Google Drive, Gmail, LLM
27
+ providers (OpenAI, Anthropic), Notion, and Pandoc.
28
+ - `zeo_core.modules`: plugin discovery and explicit-loading registry.
29
+ - `zeo_core.prompt`: prompt template selection and enhancement utilities.
30
+ - `zeo_core.adapters`: an optional FastAPI-based HTTP adapter for exposing
31
+ tools over a REST API.
32
+ - `examples/`: runnable, verified example scripts (`toolkit_usage.py`,
33
+ `minimal_tool.py`, `error_handling.py`).
34
+ - `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md` (Contributor Covenant v2.1).
35
+
36
+ ### Changed
37
+
38
+ - Full mechanical rename from the monorepo's `quack_core` package to
39
+ `zeo_core` (PyPI distribution name: `zeocore`), including class names
40
+ (`Quack*` -> `Zeo*`), environment variable prefixes, and config file
41
+ keys.
42
+ - Fixed a broken version-sourcing path and a production test-detection bug
43
+ found during the extraction (see git history for detail).
44
+
45
+ ### Fixed
46
+
47
+ - CI now runs the full test suite on every supported Python version
48
+ (3.10-3.13) on real GitHub Actions infrastructure. That surfaced three
49
+ real, previously-invisible cross-version bugs (this package's own
50
+ pre-release local development only ever ran on 3.13), all fixed and
51
+ independently verified across every supported version before release:
52
+ - A `pathlib.Path.__init__`/`__new__` split changed in CPython 3.12;
53
+ an autouse test fixture that monkeypatched `Path.__init__` only was
54
+ crashing the entire test suite on 3.10/3.11 with an `INTERNALERROR`.
55
+ Fixed by coercing on both `__new__` and `__init__`, matching whichever
56
+ one actually does the real work on a given Python version.
57
+ - `unittest.mock`'s dotted-string `@patch(...)` target resolution
58
+ changed in 3.11 (`pkgutil.resolve_name` instead of an eager
59
+ `getattr`-walk). Three call sites depended on the newer resolution
60
+ semantics to reach their intended target; on 3.10 they silently
61
+ patched the wrong object, cascading into shared-state pollution across
62
+ unrelated test files.
63
+ - `typing.Protocol.__instancecheck__`'s structural-membership check
64
+ changed in 3.12 (from plain `hasattr` to `inspect.getattr_static`,
65
+ which does not trigger `MagicMock`'s attribute auto-fabrication).
66
+ Five tests asserting that a bare, unconfigured `MagicMock()` does
67
+ *not* satisfy a runtime-checkable protocol passed on 3.12/3.13 but
68
+ failed on 3.10/3.11. Fixed by constructing the mocks with an explicit
69
+ `spec=`, which is version-stable and expresses the real test intent.
70
+
71
+ ### Removed
72
+
73
+ - The `BaseZeoToolPlugin` back-compat alias -- unused outside this repo's
74
+ own test suite, and this package has never had a public release, so no
75
+ back-compat was owed for it.
76
+
77
+ [0.1.0]: https://github.com/zeroemployeeorg/zeocore/releases/tag/v0.1.0
@@ -0,0 +1,134 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic
9
+ status, nationality, personal appearance, race, religion, or sexual identity
10
+ and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the
26
+ overall community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or
31
+ advances of any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political
33
+ attacks
34
+ * Public or private harassment
35
+ * Publishing others' private information, such as a physical or email
36
+ address, without their explicit permission
37
+ * Other conduct which could reasonably be considered inappropriate in a
38
+ professional setting
39
+
40
+ ## Enforcement Responsibilities
41
+
42
+ Community leaders are responsible for clarifying and enforcing our standards
43
+ of acceptable behavior and will take appropriate and fair corrective action
44
+ in response to any behavior that they deem inappropriate, threatening,
45
+ offensive, or harmful.
46
+
47
+ Community leaders have the right and responsibility to remove, edit, or
48
+ reject comments, commits, code, wiki edits, issues, and other contributions
49
+ that are not aligned to this Code of Conduct, and will communicate reasons
50
+ for moderation decisions when appropriate.
51
+
52
+ ## Scope
53
+
54
+ This Code of Conduct applies within all community spaces, and also applies
55
+ when an individual is officially representing the community in public
56
+ spaces. Examples of representing our community include using an official
57
+ e-mail address, posting via an official social media account, or acting as
58
+ an appointed representative at an online or offline event.
59
+
60
+ ## Enforcement
61
+
62
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
63
+ reported to the community leaders responsible for enforcement by opening a
64
+ GitHub issue or contacting the maintainers directly. All complaints will be
65
+ reviewed and investigated promptly and fairly.
66
+
67
+ All community leaders are obligated to respect the privacy and security of
68
+ the reporter of any incident.
69
+
70
+ ## Enforcement Guidelines
71
+
72
+ Community leaders will follow these Community Impact Guidelines in
73
+ determining the consequences for any action they deem in violation of this
74
+ Code of Conduct:
75
+
76
+ ### 1. Correction
77
+
78
+ **Community Impact**: Use of inappropriate language or other behavior deemed
79
+ unprofessional or unwelcome in the community.
80
+
81
+ **Consequence**: A private, written warning from community leaders,
82
+ providing clarity around the nature of the violation and an explanation of
83
+ why the behavior was inappropriate. A public apology may be requested.
84
+
85
+ ### 2. Warning
86
+
87
+ **Community Impact**: A violation through a single incident or series of
88
+ actions.
89
+
90
+ **Consequence**: A warning with consequences for continued behavior. No
91
+ interaction with the people involved, including unsolicited interaction with
92
+ those enforcing the Code of Conduct, for a specified period of time. This
93
+ includes avoiding interactions in community spaces as well as external
94
+ channels like social media. Violating these terms may lead to a temporary or
95
+ permanent ban.
96
+
97
+ ### 3. Temporary Ban
98
+
99
+ **Community Impact**: A serious violation of community standards, including
100
+ sustained inappropriate behavior.
101
+
102
+ **Consequence**: A temporary ban from any sort of interaction or public
103
+ communication with the community for a specified period of time. No public
104
+ or private interaction with the people involved, including unsolicited
105
+ interaction with those enforcing the Code of Conduct, is allowed during this
106
+ period. Violating these terms may lead to a permanent ban.
107
+
108
+ ### 4. Permanent Ban
109
+
110
+ **Community Impact**: Demonstrating a pattern of violation of community
111
+ standards, including sustained inappropriate behavior, harassment of an
112
+ individual, or aggression toward or disparagement of classes of individuals.
113
+
114
+ **Consequence**: A permanent ban from any sort of public interaction within
115
+ the community.
116
+
117
+ ## Attribution
118
+
119
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
120
+ version 2.1, available at
121
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
122
+
123
+ Community Impact Guidelines were inspired by
124
+ [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
125
+
126
+ For answers to common questions about this code of conduct, see the FAQ at
127
+ [https://www.contributor-covenant.org/faq][FAQ]. Translations are available
128
+ at [https://www.contributor-covenant.org/translations][translations].
129
+
130
+ [homepage]: https://www.contributor-covenant.org
131
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
132
+ [Mozilla CoC]: https://github.com/mozilla/diversity
133
+ [FAQ]: https://www.contributor-covenant.org/faq
134
+ [translations]: https://www.contributor-covenant.org/translations