scitex-todo 0.2.1__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 (212) hide show
  1. scitex_todo-0.2.1/.env.example +14 -0
  2. scitex_todo-0.2.1/.github/workflows/cla.yml +33 -0
  3. scitex_todo-0.2.1/.github/workflows/import-smoke-on-ubuntu-py3-12.yml +33 -0
  4. scitex_todo-0.2.1/.github/workflows/pypi-publish-and-github-release-on-tag.yml +174 -0
  5. scitex_todo-0.2.1/.github/workflows/pytest-matrix-on-ubuntu-py3-11-3-12-3-13.yml +43 -0
  6. scitex_todo-0.2.1/.github/workflows/rtd-sphinx-build-on-ubuntu-latest.yml +50 -0
  7. scitex_todo-0.2.1/.github/workflows/scitex-dev-quality-audit-on-ubuntu-latest.yml +31 -0
  8. scitex_todo-0.2.1/.gitignore +52 -0
  9. scitex_todo-0.2.1/.readthedocs.yaml +24 -0
  10. scitex_todo-0.2.1/.scitex/dev/config.yaml +2 -0
  11. scitex_todo-0.2.1/.scitex/todo/runtime/.gitkeep +0 -0
  12. scitex_todo-0.2.1/.scitex/todo/runtime/README.md +2 -0
  13. scitex_todo-0.2.1/CHANGELOG.md +61 -0
  14. scitex_todo-0.2.1/CLA.md +80 -0
  15. scitex_todo-0.2.1/CONTRIBUTING.md +69 -0
  16. scitex_todo-0.2.1/LICENSE +661 -0
  17. scitex_todo-0.2.1/PKG-INFO +286 -0
  18. scitex_todo-0.2.1/README.md +230 -0
  19. scitex_todo-0.2.1/docs/roadmap.md +65 -0
  20. scitex_todo-0.2.1/docs/scitex-icon-navy-inverted.png +0 -0
  21. scitex_todo-0.2.1/docs/scitex-logo-blue-cropped.png +0 -0
  22. scitex_todo-0.2.1/docs/sphinx/_static/.gitkeep +0 -0
  23. scitex_todo-0.2.1/docs/sphinx/api/scitex_todo.rst +7 -0
  24. scitex_todo-0.2.1/docs/sphinx/cli_reference.rst +42 -0
  25. scitex_todo-0.2.1/docs/sphinx/conf.py +105 -0
  26. scitex_todo-0.2.1/docs/sphinx/index.rst +89 -0
  27. scitex_todo-0.2.1/docs/sphinx/installation.rst +49 -0
  28. scitex_todo-0.2.1/docs/sphinx/quickstart.rst +86 -0
  29. scitex_todo-0.2.1/docs/sphinx/requirements.txt +5 -0
  30. scitex_todo-0.2.1/examples/00_run_all.sh +12 -0
  31. scitex_todo-0.2.1/examples/01_render_graph.py +27 -0
  32. scitex_todo-0.2.1/pyproject.toml +107 -0
  33. scitex_todo-0.2.1/src/scitex_todo/__init__.py +60 -0
  34. scitex_todo-0.2.1/src/scitex_todo/__main__.py +12 -0
  35. scitex_todo-0.2.1/src/scitex_todo/_cli/__init__.py +20 -0
  36. scitex_todo-0.2.1/src/scitex_todo/_cli/_completion.py +114 -0
  37. scitex_todo-0.2.1/src/scitex_todo/_cli/_introspect.py +124 -0
  38. scitex_todo-0.2.1/src/scitex_todo/_cli/_main.py +248 -0
  39. scitex_todo-0.2.1/src/scitex_todo/_cli/_skills.py +187 -0
  40. scitex_todo-0.2.1/src/scitex_todo/_django/__init__.py +26 -0
  41. scitex_todo-0.2.1/src/scitex_todo/_django/apps.py +23 -0
  42. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/.gitignore +3 -0
  43. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/eslint.config.js +16 -0
  44. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/index.html +14 -0
  45. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/package-lock.json +3166 -0
  46. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/package.json +27 -0
  47. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/public/favicon.svg +12 -0
  48. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/AutoRefresh.tsx +97 -0
  49. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/ContextMenu.tsx +220 -0
  50. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/DrillHistory.tsx +66 -0
  51. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/EdgeKindMenu.tsx +84 -0
  52. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/GraphView.tsx +675 -0
  53. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/InhibitionEdge.tsx +140 -0
  54. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/KeyboardShortcuts.tsx +95 -0
  55. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/NodeDetailPanel.tsx +435 -0
  56. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/TableView.tsx +188 -0
  57. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/Toast.tsx +50 -0
  58. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/TodoBoard.tsx +327 -0
  59. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/api/client.ts +137 -0
  60. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/bridge/MountPoint.ts +54 -0
  61. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/bridge/bridge-init.ts +23 -0
  62. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/clipboard.ts +87 -0
  63. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/exportBoard.ts +142 -0
  64. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/layout.ts +290 -0
  65. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/persist.ts +86 -0
  66. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/store/useBoardStore.ts +496 -0
  67. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/styles/board.css +1273 -0
  68. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/styles/detail.css +217 -0
  69. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/types/board.ts +48 -0
  70. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/src/useTheme.ts +32 -0
  71. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/tsconfig.json +20 -0
  72. scitex_todo-0.2.1/src/scitex_todo/_django/frontend/vite.config.ts +32 -0
  73. scitex_todo-0.2.1/src/scitex_todo/_django/handlers/__init__.py +41 -0
  74. scitex_todo-0.2.1/src/scitex_todo/_django/handlers/crud.py +428 -0
  75. scitex_todo-0.2.1/src/scitex_todo/_django/handlers/graph.py +109 -0
  76. scitex_todo-0.2.1/src/scitex_todo/_django/handlers/priority.py +89 -0
  77. scitex_todo-0.2.1/src/scitex_todo/_django/management/__init__.py +0 -0
  78. scitex_todo-0.2.1/src/scitex_todo/_django/management/commands/__init__.py +0 -0
  79. scitex_todo-0.2.1/src/scitex_todo/_django/management/commands/scitex_todo_board.py +61 -0
  80. scitex_todo-0.2.1/src/scitex_todo/_django/manifest.json +32 -0
  81. scitex_todo-0.2.1/src/scitex_todo/_django/services.py +85 -0
  82. scitex_todo-0.2.1/src/scitex_todo/_django/settings.py +76 -0
  83. scitex_todo-0.2.1/src/scitex_todo/_django/static/scitex_todo/.vite/manifest.json +11 -0
  84. scitex_todo-0.2.1/src/scitex_todo/_django/static/scitex_todo/assets/index.css +1 -0
  85. scitex_todo-0.2.1/src/scitex_todo/_django/static/scitex_todo/assets/index.js +82 -0
  86. scitex_todo-0.2.1/src/scitex_todo/_django/static/scitex_todo/favicon.svg +12 -0
  87. scitex_todo-0.2.1/src/scitex_todo/_django/static/scitex_todo/index.html +15 -0
  88. scitex_todo-0.2.1/src/scitex_todo/_django/templates/scitex_todo/standalone.html +26 -0
  89. scitex_todo-0.2.1/src/scitex_todo/_django/urls.py +20 -0
  90. scitex_todo-0.2.1/src/scitex_todo/_django/views.py +155 -0
  91. scitex_todo-0.2.1/src/scitex_todo/_mermaid.py +121 -0
  92. scitex_todo-0.2.1/src/scitex_todo/_model.py +266 -0
  93. scitex_todo-0.2.1/src/scitex_todo/_paths.py +98 -0
  94. scitex_todo-0.2.1/src/scitex_todo/_render.py +185 -0
  95. scitex_todo-0.2.1/src/scitex_todo/_skills/scitex-todo/01_installation.md +46 -0
  96. scitex_todo-0.2.1/src/scitex_todo/_skills/scitex-todo/02_quick-start.md +45 -0
  97. scitex_todo-0.2.1/src/scitex_todo/_skills/scitex-todo/03_python-api.md +80 -0
  98. scitex_todo-0.2.1/src/scitex_todo/_skills/scitex-todo/04_cli-reference.md +42 -0
  99. scitex_todo-0.2.1/src/scitex_todo/_skills/scitex-todo/10_campaign-tracking.md +75 -0
  100. scitex_todo-0.2.1/src/scitex_todo/_skills/scitex-todo/20_env-vars.md +36 -0
  101. scitex_todo-0.2.1/src/scitex_todo/_skills/scitex-todo/SKILL.md +48 -0
  102. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.buildinfo +4 -0
  103. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.doctrees/__intersphinx_cache__/python_objects.inv +0 -0
  104. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.doctrees/api/scitex_todo.doctree +0 -0
  105. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.doctrees/cli_reference.doctree +0 -0
  106. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.doctrees/environment.pickle +0 -0
  107. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.doctrees/index.doctree +0 -0
  108. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.doctrees/installation.doctree +0 -0
  109. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/.doctrees/quickstart.doctree +0 -0
  110. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_modules/index.html +142 -0
  111. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_modules/scitex_todo/_mermaid.html +263 -0
  112. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_modules/scitex_todo/_model.html +414 -0
  113. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_modules/scitex_todo/_paths.html +243 -0
  114. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_modules/scitex_todo/_render.html +339 -0
  115. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_sources/api/scitex_todo.rst.txt +7 -0
  116. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_sources/cli_reference.rst.txt +42 -0
  117. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_sources/index.rst.txt +89 -0
  118. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_sources/installation.rst.txt +49 -0
  119. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_sources/quickstart.rst.txt +86 -0
  120. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  121. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/base-stemmer.js +476 -0
  122. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/basic.css +906 -0
  123. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/check-solid.svg +4 -0
  124. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/clipboard.min.js +7 -0
  125. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/copy-button.svg +5 -0
  126. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/copybutton.css +94 -0
  127. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/copybutton.js +248 -0
  128. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/copybutton_funcs.js +73 -0
  129. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/badge_only.css +1 -0
  130. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  131. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  132. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  133. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  134. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  135. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  136. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  137. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  138. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  139. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-bold-italic.woff +0 -0
  140. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  141. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-bold.woff +0 -0
  142. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-bold.woff2 +0 -0
  143. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-normal-italic.woff +0 -0
  144. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  145. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-normal.woff +0 -0
  146. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/fonts/lato-normal.woff2 +0 -0
  147. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/css/theme.css +4 -0
  148. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/doctools.js +150 -0
  149. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/documentation_options.js +13 -0
  150. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/english-stemmer.js +1066 -0
  151. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/file.png +0 -0
  152. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bold.eot +0 -0
  153. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bold.ttf +0 -0
  154. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bold.woff +0 -0
  155. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  156. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  157. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  158. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  159. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  160. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-italic.eot +0 -0
  161. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-italic.ttf +0 -0
  162. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-italic.woff +0 -0
  163. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  164. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-regular.eot +0 -0
  165. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-regular.ttf +0 -0
  166. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-regular.woff +0 -0
  167. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  168. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  169. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  170. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  171. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  172. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  173. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  174. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  175. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  176. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/jquery.js +2 -0
  177. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/js/badge_only.js +1 -0
  178. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/js/theme.js +1 -0
  179. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/js/versions.js +228 -0
  180. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/language_data.js +13 -0
  181. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/minus.png +0 -0
  182. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/plus.png +0 -0
  183. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/pygments.css +75 -0
  184. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/searchtools.js +693 -0
  185. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/_static/sphinx_highlight.js +159 -0
  186. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/api/scitex_todo.html +379 -0
  187. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/cli_reference.html +200 -0
  188. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/genindex.html +235 -0
  189. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/index.html +261 -0
  190. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/installation.html +200 -0
  191. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/objects.inv +0 -0
  192. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/py-modindex.html +161 -0
  193. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/quickstart.html +240 -0
  194. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/search.html +158 -0
  195. scitex_todo-0.2.1/src/scitex_todo/_sphinx_html/searchindex.js +1 -0
  196. scitex_todo-0.2.1/src/scitex_todo/examples/tasks.yaml +92 -0
  197. scitex_todo-0.2.1/tests/examples/test_01_render_graph.py +36 -0
  198. scitex_todo-0.2.1/tests/integration/test_cross_package_imports.py +54 -0
  199. scitex_todo-0.2.1/tests/scitex_todo/_cli/test__completion.py +36 -0
  200. scitex_todo-0.2.1/tests/scitex_todo/_cli/test__introspect.py +51 -0
  201. scitex_todo-0.2.1/tests/scitex_todo/_cli/test__main.py +83 -0
  202. scitex_todo-0.2.1/tests/scitex_todo/_cli/test__skills.py +48 -0
  203. scitex_todo-0.2.1/tests/scitex_todo/_django/conftest.py +24 -0
  204. scitex_todo-0.2.1/tests/scitex_todo/_django/handlers/test_crud.py +386 -0
  205. scitex_todo-0.2.1/tests/scitex_todo/_django/handlers/test_priority.py +298 -0
  206. scitex_todo-0.2.1/tests/scitex_todo/_django/management/commands/test_scitex_todo_board.py +91 -0
  207. scitex_todo-0.2.1/tests/scitex_todo/_django/test_apps.py +32 -0
  208. scitex_todo-0.2.1/tests/scitex_todo/_django/test_views.py +308 -0
  209. scitex_todo-0.2.1/tests/scitex_todo/test__mermaid.py +84 -0
  210. scitex_todo-0.2.1/tests/scitex_todo/test__model.py +382 -0
  211. scitex_todo-0.2.1/tests/scitex_todo/test__paths.py +93 -0
  212. scitex_todo-0.2.1/tests/scitex_todo/test__render.py +37 -0
@@ -0,0 +1,14 @@
1
+ # scitex-todo environment variables
2
+ #
3
+ # Copy this file to `.env` (gitignored) and edit values for your setup.
4
+ # CLI flags always override env vars when both are given. Variables follow
5
+ # the SciTeX ecosystem convention: SCITEX_<MODULE>_<NAME>.
6
+ #
7
+ # Local state (per the SciTeX local-state convention) is read from:
8
+ # ~/.scitex/todo/ user-global task store
9
+ # <proj-root>/.scitex/todo/ project-local task store (preferred)
10
+
11
+ # Absolute path to the canonical tasks.yaml task store. When set, it wins
12
+ # over the project/user/bundled fallback chain (but a `--tasks` CLI flag
13
+ # still overrides it).
14
+ # SCITEX_TODO_TASKS=/abs/path/to/tasks.yaml
@@ -0,0 +1,33 @@
1
+ name: CLA Assistant
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+ pull_request_target:
7
+ types: [opened, closed, synchronize]
8
+
9
+ permissions:
10
+ actions: write
11
+ contents: write
12
+ pull-requests: write
13
+ statuses: write
14
+
15
+ jobs:
16
+ CLAssistant:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: CLA Assistant
20
+ uses: contributor-assistant/github-action@v2.6.1
21
+ env:
22
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
23
+ PERSONAL_ACCESS_TOKEN: ${{ secrets.CLA_PERSONAL_ACCESS_TOKEN }}
24
+ with:
25
+ path-to-signatures: "signatures/cla.json"
26
+ path-to-document: "https://github.com/ywatanabe1989/scitex-todo/blob/main/CLA.md"
27
+ branch: "cla-signatures"
28
+ allowlist: bot*,ywatanabe1989
29
+ custom-allsigned-prcomment: |
30
+ Thank you for signing the SciTeX CLA. Your contribution can now be reviewed.
31
+ custom-notsigned-prcomment: |
32
+ Please sign the [SciTeX CLA](https://github.com/ywatanabe1989/scitex-todo/blob/main/CLA.md) before your contribution can be merged.
33
+ Comment `I have read and agree to the SciTeX CLA.` to sign.
@@ -0,0 +1,33 @@
1
+ name: import-smoke
2
+
3
+ # Confirms the bare package (no extras) is `pip install -e .`-able and
4
+ # `import scitex_todo` succeeds — catches `[project] dependencies` drift the
5
+ # test matrix masks because it installs `[all,dev]`.
6
+
7
+ on:
8
+ push:
9
+ branches: [main, develop]
10
+ pull_request:
11
+ branches: [main, develop]
12
+ schedule:
13
+ - cron: "0 7 * * *" # nightly 07:00 UTC
14
+ workflow_dispatch:
15
+
16
+ jobs:
17
+ install-check:
18
+ name: import-smoke-on-ubuntu-py3-12
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Install (no extras)
26
+ run: |
27
+ python -m venv .venv
28
+ .venv/bin/pip install --upgrade pip
29
+ .venv/bin/pip install -e .
30
+ - name: Import smoke
31
+ run: .venv/bin/python -c "import scitex_todo; print(scitex_todo.__version__)"
32
+ - name: CLI smoke
33
+ run: .venv/bin/scitex-todo --version
@@ -0,0 +1,174 @@
1
+ name: release
2
+
3
+ # Tag-driven release pipeline:
4
+ #
5
+ # git tag vX.Y.Z && git push origin vX.Y.Z
6
+ #
7
+ # 1. test — matrix pytest on the tagged commit; halts the pipeline on
8
+ # failure (nothing publishes until tests are green).
9
+ # 2. build — wheel + sdist, uploaded as a workflow artifact.
10
+ # 3. publish — PyPI via OIDC trusted publisher (no long-lived secret).
11
+ # 4. release — GitHub Release with CHANGELOG notes + artifacts.
12
+ # 5. sync-main — open/admin-merge a develop->main PR so main equals the
13
+ # latest released commit.
14
+
15
+ on:
16
+ push:
17
+ tags: ['v*']
18
+ workflow_dispatch:
19
+ inputs:
20
+ version:
21
+ description: 'Tag to publish (e.g. v0.2.0) — must already exist on the repo'
22
+ required: true
23
+ type: string
24
+
25
+ jobs:
26
+ test:
27
+ runs-on: ubuntu-latest
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ python-version: ["3.11", "3.12", "3.13"]
32
+ steps:
33
+ - name: Resolve version
34
+ id: ver
35
+ run: |
36
+ if [ "${{ github.event_name }}" = "push" ]; then
37
+ v="${GITHUB_REF#refs/tags/}"
38
+ else
39
+ v="${{ inputs.version }}"
40
+ fi
41
+ echo "version=$v" >> "$GITHUB_OUTPUT"
42
+ - uses: actions/checkout@v4
43
+ with:
44
+ ref: ${{ steps.ver.outputs.version }}
45
+ fetch-depth: 0
46
+ - uses: actions/setup-python@v5
47
+ with:
48
+ python-version: ${{ matrix.python-version }}
49
+ - name: Install (best-effort fallback chain)
50
+ run: |
51
+ python -m pip install --upgrade pip
52
+ pip install -e ".[all,dev]" || pip install -e ".[dev]" || pip install -e .
53
+ - name: Run pytest
54
+ run: |
55
+ if [ -d tests ]; then
56
+ pytest tests/ -x
57
+ else
58
+ echo "no tests/ directory — skipping pytest"
59
+ fi
60
+
61
+ build:
62
+ needs: test
63
+ runs-on: ubuntu-latest
64
+ outputs:
65
+ version: ${{ steps.ver.outputs.version }}
66
+ steps:
67
+ - name: Resolve version
68
+ id: ver
69
+ run: |
70
+ if [ "${{ github.event_name }}" = "push" ]; then
71
+ v="${GITHUB_REF#refs/tags/}"
72
+ else
73
+ v="${{ inputs.version }}"
74
+ fi
75
+ echo "version=$v" >> "$GITHUB_OUTPUT"
76
+ - uses: actions/checkout@v4
77
+ with:
78
+ ref: ${{ steps.ver.outputs.version }}
79
+ fetch-depth: 0
80
+ - uses: actions/setup-python@v5
81
+ with:
82
+ python-version: "3.12"
83
+ - name: Install build tools
84
+ run: pip install build
85
+ - name: Build distribution
86
+ run: python -m build
87
+ - uses: actions/upload-artifact@v4
88
+ with:
89
+ name: dist
90
+ path: dist/
91
+
92
+ publish:
93
+ needs: build
94
+ runs-on: ubuntu-latest
95
+ environment:
96
+ name: pypi
97
+ url: https://pypi.org/p/scitex-todo
98
+ permissions:
99
+ id-token: write
100
+ steps:
101
+ - uses: actions/download-artifact@v4
102
+ with:
103
+ name: dist
104
+ path: dist
105
+ - uses: pypa/gh-action-pypi-publish@release/v1
106
+
107
+ release:
108
+ needs: [build, publish]
109
+ runs-on: ubuntu-latest
110
+ permissions:
111
+ contents: write
112
+ steps:
113
+ - uses: actions/checkout@v4
114
+ with:
115
+ ref: ${{ needs.build.outputs.version }}
116
+ - uses: actions/download-artifact@v4
117
+ with:
118
+ name: dist
119
+ path: dist
120
+ - name: Extract release notes from CHANGELOG.md
121
+ run: |
122
+ VERSION="${{ needs.build.outputs.version }}"
123
+ VERSION="${VERSION#v}"
124
+ awk -v v="$VERSION" '
125
+ $0 ~ "^## \\[" v "\\]" {p=1; next}
126
+ p && /^## \[/ {exit}
127
+ p
128
+ ' CHANGELOG.md > release-notes.md || true
129
+ if [ ! -s release-notes.md ]; then
130
+ echo "Release v${VERSION}. See CHANGELOG.md for details." > release-notes.md
131
+ fi
132
+ - name: Create GitHub Release
133
+ env:
134
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
135
+ run: |
136
+ gh release create "${{ needs.build.outputs.version }}" \
137
+ --title "${{ needs.build.outputs.version }}" \
138
+ --notes-file release-notes.md \
139
+ dist/*
140
+
141
+ sync-main:
142
+ needs: publish
143
+ runs-on: ubuntu-latest
144
+ permissions:
145
+ contents: write
146
+ pull-requests: write
147
+ steps:
148
+ - uses: actions/checkout@v4
149
+ with:
150
+ fetch-depth: 0
151
+ ref: develop
152
+ - name: Open develop->main PR if diverged
153
+ env:
154
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
155
+ run: |
156
+ set -e
157
+ git fetch origin main
158
+ AHEAD=$(git rev-list --count origin/main..origin/develop)
159
+ if [ "$AHEAD" -eq 0 ]; then
160
+ echo "main already up-to-date with develop."
161
+ exit 0
162
+ fi
163
+ EXISTING=$(gh pr list --base main --head develop --state open --json number --jq '.[0].number // empty')
164
+ if [ -z "$EXISTING" ]; then
165
+ PR_URL=$(gh pr create --base main --head develop \
166
+ --title "release: sync main with develop" \
167
+ --body "Auto-opened by the release pipeline so main equals the latest released commit.")
168
+ EXISTING=$(echo "$PR_URL" | grep -oE '[0-9]+$')
169
+ echo "Created PR #${EXISTING}"
170
+ else
171
+ echo "Reusing existing PR #${EXISTING}"
172
+ fi
173
+ gh pr merge "$EXISTING" --merge --admin \
174
+ || echo "Admin merge unavailable; PR left open for manual merge."
@@ -0,0 +1,43 @@
1
+ name: tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main, develop]
8
+ schedule:
9
+ - cron: "0 7 * * *" # nightly 07:00 UTC
10
+ workflow_dispatch:
11
+
12
+ jobs:
13
+ test:
14
+ name: pytest-matrix-on-ubuntu-py${{ matrix.python-version }}
15
+ runs-on: ubuntu-latest
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ python-version: ["3.11", "3.12", "3.13"]
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - name: Set up Python ${{ matrix.python-version }}
23
+ uses: actions/setup-python@v5
24
+ with:
25
+ python-version: ${{ matrix.python-version }}
26
+ - name: Install dependencies
27
+ run: |
28
+ python -m pip install --upgrade pip
29
+ # Fallback chain: prefer [all,dev] so the Django board paths get
30
+ # exercised. The web extra pulls unpublished sibling packages
31
+ # (scitex-app/scitex-ui), so fall back to [dev] then a bare editable
32
+ # install — the board tests skip cleanly when Django is absent.
33
+ pip install -e ".[all,dev]" || pip install -e ".[dev]" || pip install -e .
34
+ - name: Run tests
35
+ run: |
36
+ pytest tests/ --cov=src/scitex_todo --cov-report=xml --cov-report=term
37
+ - name: Upload coverage to Codecov
38
+ if: always() && matrix.python-version == '3.12'
39
+ uses: codecov/codecov-action@v5
40
+ with:
41
+ token: ${{ secrets.CODECOV_TOKEN }}
42
+ files: ./coverage.xml
43
+ fail_ci_if_error: false
@@ -0,0 +1,50 @@
1
+ name: docs
2
+
3
+ # Builds the Sphinx docs with warnings-as-errors so a broken docstring,
4
+ # cross-reference, or toctree entry fails the PR before it can reach Read
5
+ # the Docs. Mirrors the RTD build (docs/sphinx/conf.py).
6
+
7
+ on:
8
+ push:
9
+ branches: [main, develop]
10
+ pull_request:
11
+ branches: [main, develop]
12
+ workflow_dispatch:
13
+
14
+ permissions:
15
+ contents: write
16
+
17
+ jobs:
18
+ rtd-sphinx-build-on-ubuntu-latest:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Install package + docs deps
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ pip install -e .
29
+ pip install -r docs/sphinx/requirements.txt
30
+ - name: Build HTML (warnings as errors)
31
+ run: |
32
+ python -m sphinx -b html -W --keep-going \
33
+ docs/sphinx docs/sphinx/_build/html
34
+ - name: Refresh in-wheel _sphinx_html (main/develop only)
35
+ if: github.event_name == 'push'
36
+ run: |
37
+ rm -rf src/scitex_todo/_sphinx_html
38
+ cp -rf docs/sphinx/_build/html src/scitex_todo/_sphinx_html
39
+ # scitex-cloud serves docs from this in-wheel dir (PS-121).
40
+ if [ -n "$(git status --porcelain src/scitex_todo/_sphinx_html)" ]; then
41
+ git config user.name "github-actions[bot]"
42
+ git config user.email "github-actions[bot]@users.noreply.github.com"
43
+ git add src/scitex_todo/_sphinx_html
44
+ # The commit-message marker keeps this from triggering itself.
45
+ git commit -m "docs(build): refresh _sphinx_html [skip-docs-rebuild]"
46
+ git push || echo "push rejected (branch moved); skipping refresh commit"
47
+ else
48
+ echo "_sphinx_html already current."
49
+ fi
50
+ continue-on-error: true
@@ -0,0 +1,31 @@
1
+ name: quality
2
+
3
+ # Per-repo SciTeX quality audit. Installs the package + scitex-dev and runs
4
+ # `scitex-dev ecosystem audit-all` against this checkout (CLI, MCP, skills,
5
+ # Python-API, and project-structure conformance).
6
+
7
+ on:
8
+ push:
9
+ branches: [main, develop]
10
+ pull_request:
11
+ branches: [main, develop]
12
+ schedule:
13
+ - cron: "0 8 * * *" # 08:00 UTC, after the 07:00 test runs
14
+ workflow_dispatch:
15
+
16
+ jobs:
17
+ audit:
18
+ runs-on: ubuntu-latest
19
+ timeout-minutes: 15
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Install package + scitex-dev
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ pip install -e .
29
+ pip install scitex-dev
30
+ - name: Run scitex-dev audit-all
31
+ run: scitex-dev ecosystem audit-all scitex-todo --no-version-check
@@ -0,0 +1,52 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.so
5
+ *.egg-info/
6
+ *.egg
7
+ dist/
8
+ build/
9
+ .eggs/
10
+ *.whl
11
+ .venv/
12
+ venv/
13
+ env/
14
+ .env
15
+ .tox/
16
+ .pytest_cache/
17
+ .mypy_cache/
18
+ .ruff_cache/
19
+ .coverage
20
+ .coverage.*
21
+ htmlcov/
22
+ *.swp
23
+ *.swo
24
+ *~
25
+ .DS_Store
26
+ .idea/
27
+ .vscode/
28
+
29
+ # Agent scratch + local git worktrees — never committed.
30
+ GITIGNORED/
31
+ .worktrees/
32
+
33
+ # Rendered task graphs — generated artifacts, never committed.
34
+ tasks.png
35
+ *.tasks.png
36
+
37
+ # Sphinx build output (RTD builds from source; local HTML is throwaway).
38
+ docs/sphinx/_build/
39
+
40
+ # scitex-todo local state: ignore everything under .scitex/ except the
41
+ # tracked dev/config.yaml (audit whitelist) and the runtime seed files.
42
+ .scitex/*
43
+ !.scitex/dev/
44
+ .scitex/dev/*
45
+ !.scitex/dev/config.yaml
46
+ # Track the todo runtime dir's seed files; ignore its actual contents.
47
+ !.scitex/todo/
48
+ .scitex/todo/*
49
+ !.scitex/todo/runtime/
50
+ .scitex/todo/runtime/*
51
+ !.scitex/todo/runtime/.gitkeep
52
+ !.scitex/todo/runtime/README.md
@@ -0,0 +1,24 @@
1
+ # Read the Docs configuration. https://docs.readthedocs.io/en/stable/config-file/v2.html
2
+ version: 2
3
+
4
+ build:
5
+ os: ubuntu-22.04
6
+ tools:
7
+ python: "3.11"
8
+
9
+ sphinx:
10
+ configuration: docs/sphinx/conf.py
11
+ fail_on_warning: false
12
+
13
+ formats:
14
+ - pdf
15
+ - epub
16
+
17
+ python:
18
+ install:
19
+ # The package itself (web/docs extras pull Django + Sphinx). The board
20
+ # deps (scitex-app/scitex-ui) are mocked in conf.py, so a bare install
21
+ # plus the docs requirements is enough to build the API docs.
22
+ - method: pip
23
+ path: .
24
+ - requirements: docs/sphinx/requirements.txt
@@ -0,0 +1,2 @@
1
+ # scitex-dev audit config — tracked so CI applies the same whitelist as local.
2
+ # Add root-whitelist entries here if a non-conventional top-level file is needed.
File without changes
@@ -0,0 +1,2 @@
1
+ scitex-todo runtime state lives here (rendered PNGs, caches). Gitignored —
2
+ only .gitkeep + this README are tracked. See the SciTeX local-state convention.
@@ -0,0 +1,61 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/), and the project adheres to
5
+ [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [0.2.0] - 2026-05-27
8
+
9
+ ### Added
10
+ - Web board (read-only React-Flow dependency graph) served by Django:
11
+ `scitex-todo board` (needs the `[web]` extra). Nodes colored by status,
12
+ `depends_on` arrows, `blocks` inhibition edges, clickable cards, and
13
+ nested-graph drill-down via a new `parent` task field.
14
+ - Drag-reorder write path: the board's `POST /priority` handler persists a new
15
+ ordering back to the YAML store (preserving comments via ruamel) — the first
16
+ agent↔user GUI write surface. `save_tasks` is now public.
17
+ - §1a CLI introspection: `list-python-apis` (with the additive `-v/-vv/-vvv`
18
+ ladder) and `mcp list-tools`, both with `--json`.
19
+ - Shell completion: `install-shell-completion` / `print-shell-completion`
20
+ (bash/zsh/fish) using the static cache-file pattern.
21
+ - Agent skills: bundled `_skills/scitex-todo/` (installation, quick-start,
22
+ python-api, cli-reference, env-vars) plus a self-contained
23
+ `skills {list, get, install}` CLI group.
24
+ - `python -m scitex_todo` entry point; `.env.example`; `examples/` with a
25
+ matching `tests/examples/` smoke test; cross-package integration gate.
26
+
27
+ ### Changed
28
+ - **CLI verbs renamed** to noun-verb compounds (audit §1): `render` →
29
+ `render-graph`, `list` → `list-tasks` (now with `--json`). Added top-level
30
+ `--help-recursive` and `--json`.
31
+ - `_cli.py` split into a focused `_cli/` package (`_main`, `_introspect`,
32
+ `_completion`, `_skills`).
33
+ - README rebuilt to the canonical SciTeX layout (logo, badges, Problem/Solution,
34
+ Architecture diagram, Interfaces, footer); `docs/roadmap.md` refreshed.
35
+ - Added GitHub Actions: `tests`, `import-smoke`, `quality`, tag-driven
36
+ `release` (PyPI via OIDC + GitHub Release), and the CLA gate.
37
+ - Test suite reorganized to mirror `src/` and to satisfy the test-quality rules
38
+ (one assertion per test, AAA markers).
39
+
40
+ [0.2.0]: https://github.com/ywatanabe1989/scitex-todo/releases/tag/v0.2.0
41
+
42
+ ## [0.1.0] - 2026-05-22
43
+
44
+ ### Added
45
+ - Canonical YAML task store: top-level `tasks:` list with `id` / `title` /
46
+ `status` (required) and optional `repo` / `depends_on` / `blocks` / `note`.
47
+ - `load_tasks` — validating loader (`TaskValidationError` on missing id/title,
48
+ duplicate id, or invalid status). Statuses: `goal`, `pending`,
49
+ `in_progress`, `blocked`, `done`, `deferred`, `failed`.
50
+ - Mermaid adapter: `build_mermaid` renders `flowchart TB` with `depends_on`
51
+ arrows, `blocks` inhibition edges (`-- blocks --x`), and per-status colors
52
+ (goal = gold `#ffe082`).
53
+ - Renderer: `render` (mmdc-first with auto-discovered puppeteer/playwright
54
+ chromium and `--no-sandbox`; `kroki.io` fallback).
55
+ - Task-store path resolution following the SciTeX local-state convention:
56
+ explicit path -> `$SCITEX_TODO_TASKS` -> project `.scitex/todo/tasks.yaml`
57
+ -> user `~/.scitex/todo/tasks.yaml` -> bundled generic example.
58
+ - CLI `scitex-todo` (Click, noun-verb): `render`, `list`.
59
+ - Bundled generic example task store at `scitex_todo/examples/tasks.yaml`.
60
+
61
+ [0.1.0]: https://github.com/ywatanabe1989/scitex-todo/releases/tag/v0.1.0
@@ -0,0 +1,80 @@
1
+ # SciTeX Contributor License Agreement (CLA)
2
+
3
+ Version 1.0 -- Effective 2026-03-12
4
+
5
+ ## Purpose
6
+
7
+ SciTeX is licensed under AGPL-3.0 and follows a dual-licensing model:
8
+
9
+ - **Researchers and individuals**: Free forever under AGPL-3.0.
10
+ - **Enterprises and institutions**: Commercial license available upon request.
11
+
12
+ To maintain the ability to offer dual licensing and ensure the long-term
13
+ sustainability of the project, we ask contributors to sign this CLA before
14
+ their first contribution is merged.
15
+
16
+ ## Agreement
17
+
18
+ By submitting a pull request or other contribution to any SciTeX repository,
19
+ you agree to the following terms:
20
+
21
+ ### 1. You retain copyright
22
+
23
+ You retain full copyright ownership of your contributions.
24
+
25
+ ### 2. You grant a broad license to the project
26
+
27
+ You grant Yusuke Watanabe, and any successor entity operating the SciTeX
28
+ project (the "Project Lead"), a perpetual, worldwide, non-exclusive,
29
+ royalty-free, irrevocable license to:
30
+
31
+ - Use, reproduce, modify, and distribute your contributions.
32
+ - Sublicense your contributions under alternative licenses, including
33
+ dual-licensing for institutional and commercial use, for the purpose of
34
+ sustaining the SciTeX project.
35
+
36
+ ### 3. You confirm originality
37
+
38
+ You confirm that:
39
+
40
+ - Your contributions are your original work.
41
+ - You have the legal right to grant the above license.
42
+ - Your contributions do not infringe on third-party rights.
43
+
44
+ If any portion is based on existing work, you have disclosed the source and
45
+ confirmed its license is compatible with AGPL-3.0.
46
+
47
+ ### 4. No obligation
48
+
49
+ This agreement does not create any obligation for the Project Lead to use,
50
+ merge, or maintain your contributions.
51
+
52
+ ## How to sign
53
+
54
+ When you open your first pull request, the CLA Assistant bot will ask you to
55
+ sign electronically. This is a one-time process per contributor.
56
+
57
+ Alternatively, you may sign by adding the following statement to your pull
58
+ request description:
59
+
60
+ > I have read and agree to the [SciTeX CLA](CLA.md).
61
+
62
+ ## Why a CLA?
63
+
64
+ SciTeX aims to be free for researchers forever. A CLA ensures the project can:
65
+
66
+ - Offer institutional/campus licenses to universities and companies.
67
+ - Change licenses if needed to protect the community (e.g., against
68
+ proprietary forks).
69
+ - Provide legal clarity for institutions adopting SciTeX.
70
+
71
+ Revenue from commercial licensing accrues to the Project Lead and is used to
72
+ sustain the SciTeX project.
73
+
74
+ This is the same approach used by MongoDB, Elasticsearch, and many other
75
+ successful open-source projects with dual-licensing models.
76
+
77
+ ## Questions
78
+
79
+ If you have questions about this CLA, please open an issue or contact
80
+ ywatanabe@scitex.ai.
@@ -0,0 +1,69 @@
1
+ # Contributing to scitex-todo
2
+
3
+ Thank you for your interest in contributing to SciTeX. This guide covers the
4
+ process for reporting issues, suggesting features, and submitting code.
5
+
6
+ ## Contributor License Agreement
7
+
8
+ Before your first contribution can be merged, you must agree to the
9
+ [SciTeX CLA](CLA.md). This is a one-time process. The CLA ensures that:
10
+
11
+ - You retain copyright of your work.
12
+ - The project can continue to offer dual licensing (free for researchers,
13
+ commercial for enterprises).
14
+
15
+ See [CLA.md](CLA.md) for full details.
16
+
17
+ ## Reporting Issues
18
+
19
+ - Search [existing issues](https://github.com/ywatanabe1989/scitex-todo/issues)
20
+ before opening a new one.
21
+ - Include a minimal reproducible example when reporting bugs.
22
+ - Specify your Python version, OS, and `scitex-todo` version.
23
+
24
+ ## Development Setup
25
+
26
+ ```bash
27
+ git clone git@github.com:ywatanabe1989/scitex-todo.git
28
+ cd scitex-todo
29
+ pip install -e ".[dev]"
30
+ ```
31
+
32
+ ## Branch Workflow
33
+
34
+ - `main` -- stable releases only. Do not push directly.
35
+ - `develop` -- integration branch. PRs target here.
36
+ - Feature branches -- create from `develop`, name as `feature/<description>`.
37
+
38
+ ```bash
39
+ git checkout develop
40
+ git checkout -b feature/my-change
41
+ # ... make changes ...
42
+ git push origin feature/my-change
43
+ # Open PR targeting develop
44
+ ```
45
+
46
+ ## Code Style
47
+
48
+ - Follow existing conventions in the codebase.
49
+ - Use `_` prefix for internal/private modules and functions.
50
+ - Keep files under 512 lines.
51
+ - Run tests before submitting:
52
+
53
+ ```bash
54
+ pytest tests/ -x -q
55
+ ```
56
+
57
+ ## Pull Request Process
58
+
59
+ 1. Ensure your branch is up to date with `develop`.
60
+ 2. Write tests for new functionality.
61
+ 3. Run the test suite and confirm all tests pass.
62
+ 4. Open a PR targeting `develop` with a clear description.
63
+ 5. The CLA bot will check your CLA status on your first PR.
64
+
65
+ ## License
66
+
67
+ By contributing, you agree to the terms of the [CLA](CLA.md), which includes
68
+ licensing under AGPL-3.0 (see [LICENSE](LICENSE)) and the dual-licensing
69
+ provisions described therein.