gravity-cli 0.9.0__tar.gz → 0.10.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 (285) hide show
  1. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/PKG-INFO +2 -2
  2. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/rules.py +25 -0
  3. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/rules_cases.json +19 -2
  4. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/specs.py +19 -5
  5. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/pyproject.toml +1 -1
  6. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_rules.py +11 -0
  7. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/pyproject.toml +2 -2
  8. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/BUILDER_GUIDE.md +2 -0
  9. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/CHANGELOG.md +4 -0
  10. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/inputs.py +3 -3
  11. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_inputs_memory.py +10 -0
  12. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/uv.lock +2 -2
  13. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.env.example +0 -0
  14. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.github/workflows/ci.yml +0 -0
  15. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.github/workflows/composio-watch.yml +0 -0
  16. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.github/workflows/release.yml +0 -0
  17. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.gitignore +0 -0
  18. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/AGENT_STANDARD.md +0 -0
  19. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/AGENT_STANDARD_V2.md +0 -0
  20. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/LICENSE +0 -0
  21. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/NOTICE +0 -0
  22. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/README.md +0 -0
  23. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/RELEASING.md +0 -0
  24. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/TEMPLATES.md +0 -0
  25. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/LICENSE +0 -0
  26. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/NOTICE +0 -0
  27. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/README.md +0 -0
  28. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/__init__.py +0 -0
  29. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/__main__.py +0 -0
  30. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/built_ins.py +0 -0
  31. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/catalog.py +0 -0
  32. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/catalog.yaml +0 -0
  33. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/catalog_imported.yaml +0 -0
  34. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/contract.py +0 -0
  35. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/cron.py +0 -0
  36. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/describe.py +0 -0
  37. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/errors.py +0 -0
  38. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/export.py +0 -0
  39. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/gen_catalog.py +0 -0
  40. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/gen_vocabulary.py +0 -0
  41. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/instance.py +0 -0
  42. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/manifest.py +0 -0
  43. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/manifest_v2.py +0 -0
  44. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/source_scan.py +0 -0
  45. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/validation.py +0 -0
  46. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/__init__.py +0 -0
  47. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/__main__.py +0 -0
  48. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/capabilities.yaml +0 -0
  49. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/airtable.yaml +0 -0
  50. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/asana.yaml +0 -0
  51. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/browser_tool.yaml +0 -0
  52. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/composio_search.yaml +0 -0
  53. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/dropbox.yaml +0 -0
  54. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/exa.yaml +0 -0
  55. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/excel.yaml +0 -0
  56. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/firecrawl.yaml +0 -0
  57. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/github.yaml +0 -0
  58. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/gmail.yaml +0 -0
  59. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googlecalendar.yaml +0 -0
  60. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googledocs.yaml +0 -0
  61. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googledrive.yaml +0 -0
  62. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googlesheets.yaml +0 -0
  63. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googleslides.yaml +0 -0
  64. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googletasks.yaml +0 -0
  65. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/hackernews.yaml +0 -0
  66. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/hubspot.yaml +0 -0
  67. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/instagram.yaml +0 -0
  68. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/jira.yaml +0 -0
  69. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/linear.yaml +0 -0
  70. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/linkedin.yaml +0 -0
  71. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/microsoft_teams.yaml +0 -0
  72. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/notion.yaml +0 -0
  73. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/outlook.yaml +0 -0
  74. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/perplexityai.yaml +0 -0
  75. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/pinterest.yaml +0 -0
  76. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/reddit.yaml +0 -0
  77. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/slack.yaml +0 -0
  78. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/tavily.yaml +0 -0
  79. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/youtube.yaml +0 -0
  80. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/core_shapes.yaml +0 -0
  81. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/generated_shapes.yaml +0 -0
  82. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/policy.yaml +0 -0
  83. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/airtable.json +0 -0
  84. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/asana.json +0 -0
  85. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/browser_tool.json +0 -0
  86. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/composio_search.json +0 -0
  87. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/dropbox.json +0 -0
  88. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/exa.json +0 -0
  89. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/excel.json +0 -0
  90. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/firecrawl.json +0 -0
  91. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/github.json +0 -0
  92. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/gmail.json +0 -0
  93. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googlecalendar.json +0 -0
  94. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googledocs.json +0 -0
  95. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googledrive.json +0 -0
  96. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googlesheets.json +0 -0
  97. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googleslides.json +0 -0
  98. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googletasks.json +0 -0
  99. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/hackernews.json +0 -0
  100. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/hubspot.json +0 -0
  101. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/instagram.json +0 -0
  102. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/jira.json +0 -0
  103. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/linear.json +0 -0
  104. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/linkedin.json +0 -0
  105. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/microsoft_teams.json +0 -0
  106. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/notion.json +0 -0
  107. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/outlook.json +0 -0
  108. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/perplexityai.json +0 -0
  109. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/pinterest.json +0 -0
  110. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/reddit.json +0 -0
  111. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/slack.json +0 -0
  112. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/tavily.json +0 -0
  113. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/youtube.json +0 -0
  114. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas.py +0 -0
  115. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/ochat.yaml +0 -0
  116. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/ocrm.yaml +0 -0
  117. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/ogh.yaml +0 -0
  118. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/oms.yaml +0 -0
  119. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/oweb.yaml +0 -0
  120. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/owork.yaml +0 -0
  121. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/shared.yaml +0 -0
  122. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/sync.py +0 -0
  123. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/ochat.yaml +0 -0
  124. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/ocrm.yaml +0 -0
  125. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/ogh.yaml +0 -0
  126. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/oms.yaml +0 -0
  127. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/oweb.yaml +0 -0
  128. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/owork.yaml +0 -0
  129. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rchat.yaml +0 -0
  130. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rfiles.yaml +0 -0
  131. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rgh.yaml +0 -0
  132. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rtrack.yaml +0 -0
  133. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rwork.yaml +0 -0
  134. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.yaml +0 -0
  135. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/schema/manifest.schema.json +0 -0
  136. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/conftest.py +0 -0
  137. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/fixtures/demo_manifests.yaml +0 -0
  138. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_accounts.py +0 -0
  139. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_actions_memory.py +0 -0
  140. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_catalog_parity.py +0 -0
  141. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_cron.py +0 -0
  142. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_describe.py +0 -0
  143. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_errors.py +0 -0
  144. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_generated_tables.py +0 -0
  145. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_instance.py +0 -0
  146. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_json_schema.py +0 -0
  147. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_kind_outputs.py +0 -0
  148. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_manifest.py +0 -0
  149. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_manifest_v2.py +0 -0
  150. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_place_maker.py +0 -0
  151. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_slots.py +0 -0
  152. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_source_scan.py +0 -0
  153. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_sync.py +0 -0
  154. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_validation.py +0 -0
  155. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_vocabulary.py +0 -0
  156. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/scripts/composio-watch.sh +0 -0
  157. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/BUILDER_GUIDE_V2.md +0 -0
  158. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/__init__.py +0 -0
  159. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/__main__.py +0 -0
  160. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/_runner_script.py +0 -0
  161. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/api.py +0 -0
  162. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/changelog.py +0 -0
  163. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/cli.py +0 -0
  164. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/__init__.py +0 -0
  165. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/adapt.py +0 -0
  166. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/build.py +0 -0
  167. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/capabilities.py +0 -0
  168. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/changelog.py +0 -0
  169. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/check.py +0 -0
  170. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/connect.py +0 -0
  171. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/dev.py +0 -0
  172. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/docs.py +0 -0
  173. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/guide.py +0 -0
  174. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/help.py +0 -0
  175. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/init.py +0 -0
  176. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/login.py +0 -0
  177. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/memory.py +0 -0
  178. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/push.py +0 -0
  179. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/run.py +0 -0
  180. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/runs.py +0 -0
  181. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/schedule.py +0 -0
  182. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/tools.py +0 -0
  183. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/update.py +0 -0
  184. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/validate.py +0 -0
  185. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/config.py +0 -0
  186. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/dev.py +0 -0
  187. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/dev_page/index.html +0 -0
  188. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/docs/Gravity.agent.md +0 -0
  189. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/docs/Gravity.getting-started.md +0 -0
  190. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/docs/problem-to-agent.md +0 -0
  191. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/localrun.py +0 -0
  192. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/manifest.py +0 -0
  193. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/project.py +0 -0
  194. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/.gitignore +0 -0
  195. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/manifest.yaml +0 -0
  196. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/requirements.txt +0 -0
  197. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/src/agent.py +0 -0
  198. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/.gitignore +0 -0
  199. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/manifest.yaml +0 -0
  200. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/requirements.txt +0 -0
  201. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/src/agent.py +0 -0
  202. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/.gitignore +0 -0
  203. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/manifest.yaml +0 -0
  204. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/requirements.txt +0 -0
  205. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/src/agent.py +0 -0
  206. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/.gitignore +0 -0
  207. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/manifest.yaml +0 -0
  208. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/requirements.txt +0 -0
  209. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/agent.py +0 -0
  210. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/gateway.py +0 -0
  211. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/nodes/agent.py +0 -0
  212. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/prompts.py +0 -0
  213. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/state.py +0 -0
  214. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/.gitignore +0 -0
  215. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/manifest.yaml +0 -0
  216. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/requirements.txt +0 -0
  217. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/src/agent.py +0 -0
  218. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/tests/test_agent.py +0 -0
  219. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/.gitignore +0 -0
  220. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/manifest.yaml +0 -0
  221. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/requirements.txt +0 -0
  222. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/src/agent.py +0 -0
  223. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/tests/test_agent.py +0 -0
  224. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/.gitignore +0 -0
  225. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/manifest.yaml +0 -0
  226. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/requirements.txt +0 -0
  227. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/src/agent.py +0 -0
  228. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/tests/test_agent.py +0 -0
  229. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/.gitignore +0 -0
  230. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/manifest.yaml +0 -0
  231. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/requirements.txt +0 -0
  232. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/__init__.py +0 -0
  233. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/agent.py +0 -0
  234. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/gateway.py +0 -0
  235. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/nodes/__init__.py +0 -0
  236. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/nodes/agent.py +0 -0
  237. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/prompts.py +0 -0
  238. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/state.py +0 -0
  239. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/tests/test_agent.py +0 -0
  240. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/timeline.py +0 -0
  241. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/ui.py +0 -0
  242. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/updater.py +0 -0
  243. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/workspace.py +0 -0
  244. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/manifest.yaml +0 -0
  245. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/requirements.txt +0 -0
  246. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/src/agent.py +0 -0
  247. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/src/summary.py +0 -0
  248. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/tests/test_summary.py +0 -0
  249. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/manifest.yaml +0 -0
  250. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/requirements.txt +0 -0
  251. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/src/agent.py +0 -0
  252. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/src/summary.py +0 -0
  253. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/tests/test_summary.py +0 -0
  254. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/conftest.py +0 -0
  255. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_adapt.py +0 -0
  256. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_agent_guide.py +0 -0
  257. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_agents.py +0 -0
  258. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_api.py +0 -0
  259. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_build_push.py +0 -0
  260. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_changelog.py +0 -0
  261. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_check.py +0 -0
  262. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_connect.py +0 -0
  263. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_connect_v2.py +0 -0
  264. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_dev.py +0 -0
  265. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_dev_v2.py +0 -0
  266. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_gateway_token.py +0 -0
  267. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_localrun.py +0 -0
  268. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_manifest_integration.py +0 -0
  269. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_run.py +0 -0
  270. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_run_v2.py +0 -0
  271. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_runs.py +0 -0
  272. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_schedule.py +0 -0
  273. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_schedule_v2.py +0 -0
  274. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_session.py +0 -0
  275. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_templates.py +0 -0
  276. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_templates_v2.py +0 -0
  277. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_timeline.py +0 -0
  278. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_tools.py +0 -0
  279. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_ui.py +0 -0
  280. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_updater.py +0 -0
  281. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_v2_cli.py +0 -0
  282. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_validate.py +0 -0
  283. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_validate_v2.py +0 -0
  284. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_welcome.py +0 -0
  285. {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_workspace.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gravity-cli
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: gravity cli — init, run, and push python agents to the Gravity marketplace
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
7
7
  License-File: NOTICE
8
8
  Requires-Python: >=3.12
9
- Requires-Dist: gravity-schema==0.9.0
9
+ Requires-Dist: gravity-schema==0.10.0
10
10
  Requires-Dist: httpx>=0.27.0
11
11
  Requires-Dist: keyring>=25.0.0
12
12
  Requires-Dist: python-dotenv>=1.0.0
@@ -14,6 +14,8 @@ would get them: a condition on an input nobody answered and nothing defaulted do
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ import datetime as dt
18
+ import re
17
19
  from typing import Any
18
20
 
19
21
  from .specs import ActionSpec, InputSpec, InputType
@@ -115,8 +117,29 @@ def apply_rules(manifest: Manifest, answers: dict[str, Any]) -> dict[str, Any]:
115
117
  Problem = tuple[str, str] # (the input or choose_one label it is about, what to tell the person)
116
118
 
117
119
 
120
+ DAY = re.compile(r"^\d{4}-\d{2}-\d{2}$")
121
+
122
+
123
+ def _is_day(value: Any) -> bool:
124
+ if not isinstance(value, str) or not DAY.match(value):
125
+ return False
126
+ try:
127
+ dt.date.fromisoformat(value)
128
+ except ValueError:
129
+ return False
130
+ return True
131
+
132
+
118
133
  def _bounds(spec: InputSpec, value: Any) -> str | None:
119
134
  label = spec.label or spec.name
135
+ if spec.many_days and not _blank(value):
136
+ if not isinstance(value, list) or not all(_is_day(v) for v in value):
137
+ return f'"{label}": pick days on the calendar.'
138
+ if spec.min is not None and len(value) < spec.min:
139
+ return f'"{label}": pick at least {spec.min} days.'
140
+ if spec.max is not None and len(value) > spec.max:
141
+ return f'"{label}": pick at most {spec.max} days.'
142
+ return None
120
143
  if spec.type is InputType.MULTI_SELECT and not _blank(value):
121
144
  if not isinstance(value, list) or any(v not in (spec.options or []) for v in value):
122
145
  return f'"{label}": pick from {", ".join(spec.options or [])}.'
@@ -141,6 +164,8 @@ def _check(inputs: list[InputSpec], shown: list[str], answers: dict[str, Any]) -
141
164
  out.append((spec.name, f'"{spec.label or spec.name}" is required.'))
142
165
  elif spec.type is InputType.MULTI_SELECT and spec.min and _blank(value):
143
166
  out.append((spec.name, f'"{spec.label or spec.name}": pick at least {spec.min}.'))
167
+ elif spec.many_days and spec.min and _blank(value):
168
+ out.append((spec.name, f'"{spec.label or spec.name}": pick at least {spec.min} days.'))
144
169
  elif (problem := _bounds(spec, value)) is not None:
145
170
  out.append((spec.name, problem))
146
171
  return out
@@ -11,7 +11,8 @@
11
11
  {"name": "brand_kit", "type": "text", "label": "Brand kit link", "show_if": {"platforms": ["instagram", "youtube"]}},
12
12
  {"name": "contact_source", "type": "static-dropdown", "label": "Contacts from", "options": ["gravity", "hunter", "both"], "default": "gravity"},
13
13
  {"name": "hunter_key", "type": "secret", "label": "Your Hunter API key", "required": true, "show_if": {"contact_source": ["hunter", "both"]}},
14
- {"name": "goal", "type": "action-choice", "label": "What do you want to do first?", "actions": ["find_companies", "write_emails"]}
14
+ {"name": "goal", "type": "action-choice", "label": "What do you want to do first?", "actions": ["find_companies", "write_emails"]},
15
+ {"name": "call_days", "type": "date", "label": "Days for a call", "min": 1, "max": 3, "show_if": {"goal": "write_emails"}}
15
16
  ],
16
17
  "slots": {
17
18
  "deliver": {"label": "Deliver to", "default": "gravity", "adapters": {"gravity": [], "gmail": ["gmail.draft"]}},
@@ -62,6 +63,22 @@
62
63
  {"name": "action choice must be offered",
63
64
  "answers": {"resume_text": "cv", "platforms": ["x"], "goal": "delete_everything"},
64
65
  "visible": ["resume_text", "platforms", "contact_source", "goal"],
65
- "problems": ["goal"]}
66
+ "problems": ["goal"]},
67
+ {"name": "a date with max takes a list of days",
68
+ "answers": {"resume_text": "cv", "platforms": ["x"], "goal": "write_emails", "call_days": ["2026-11-03", "2026-11-05"]},
69
+ "visible": ["resume_text", "platforms", "contact_source", "goal", "call_days"],
70
+ "problems": []},
71
+ {"name": "days must be real calendar days",
72
+ "answers": {"resume_text": "cv", "platforms": ["x"], "goal": "write_emails", "call_days": ["next tuesday", "2026-02-30"]},
73
+ "visible": ["resume_text", "platforms", "contact_source", "goal", "call_days"],
74
+ "problems": ["call_days"]},
75
+ {"name": "no more days than max",
76
+ "answers": {"resume_text": "cv", "platforms": ["x"], "goal": "write_emails", "call_days": ["2026-11-03", "2026-11-04", "2026-11-05", "2026-11-06"]},
77
+ "visible": ["resume_text", "platforms", "contact_source", "goal", "call_days"],
78
+ "problems": ["call_days"]},
79
+ {"name": "min days asks for at least one",
80
+ "answers": {"resume_text": "cv", "platforms": ["x"], "goal": "write_emails"},
81
+ "visible": ["resume_text", "platforms", "contact_source", "goal", "call_days"],
82
+ "problems": ["call_days"]}
66
83
  ]
67
84
  }
@@ -204,7 +204,8 @@ class InputSpec(BaseModel):
204
204
  default: Any | None = None
205
205
  # Asked only when every named earlier input or slot has one of the given values (rules.py).
206
206
  show_if: Annotated[ShowIf | None, Field(max_length=C.MAX_INPUTS)] = None
207
- # multi-select only: how many options may be picked.
207
+ # multi-select: how many options may be picked. date: how many days; with `max` the answer is a list of
208
+ # "YYYY-MM-DD" days, picked on a calendar.
208
209
  min: Annotated[int | None, Field(ge=0, le=C.MAX_OPTIONS)] = None
209
210
  max: Annotated[int | None, Field(ge=1, le=C.MAX_OPTIONS)] = None
210
211
  # action-choice only: the declared actions offered, in order.
@@ -253,14 +254,27 @@ class InputSpec(BaseModel):
253
254
  )
254
255
  return self
255
256
 
257
+ @property
258
+ def many_days(self) -> bool:
259
+ """A date input that takes several days: its answer is a list of "YYYY-MM-DD"."""
260
+ return self.type is InputType.DATE and self.max is not None
261
+
256
262
  @model_validator(mode="after")
257
263
  def _check_choice_fields(self) -> InputSpec:
258
264
  multi = self.type is InputType.MULTI_SELECT
259
- if (self.min is not None or self.max is not None) and not multi:
265
+ if (self.min is not None or self.max is not None) and not (multi or self.type is InputType.DATE):
266
+ raise PydanticCustomError(
267
+ ErrorCode.INVALID_INPUT.value,
268
+ "Input '{value}' sets min or max but is not a multi-select or a date.",
269
+ {"value": self.name, "remediation": "Set type to 'multi-select' or 'date', or remove min and max."},
270
+ )
271
+ days_bounds = self.type is InputType.DATE and (self.min is not None or self.max is not None)
272
+ if days_bounds and (self.max is None or (self.min or 0) > self.max):
260
273
  raise PydanticCustomError(
261
274
  ErrorCode.INVALID_INPUT.value,
262
- "Input '{value}' sets min or max but is not a multi-select.",
263
- {"value": self.name, "remediation": "Set type to 'multi-select', or remove min and max."},
275
+ "Date input '{value}' asks for between {lo} and {hi} days.",
276
+ {"value": self.name, "lo": self.min or 0, "hi": self.max,
277
+ "remediation": "Set `max` (how many days may be picked), and keep min <= max."},
264
278
  )
265
279
  if multi:
266
280
  count = len(self.options or [])
@@ -344,7 +358,7 @@ class InputSpec(BaseModel):
344
358
  },
345
359
  )
346
360
 
347
- expected = _PYTHON_TYPES[self.type]
361
+ expected = (list,) if self.many_days else _PYTHON_TYPES[self.type]
348
362
  # bool is an int subclass, so NUMBER needs this guard.
349
363
  is_bool = isinstance(self.default, bool)
350
364
  ok = (
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gravity-schema"
3
- version = "0.9.0"
3
+ version = "0.10.0"
4
4
  description = "Gravity agent manifest contract — models, validation, and JSON Schema export"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -81,8 +81,19 @@ def test_bad_conditions_are_rejected(bad):
81
81
  {"type": "action-choice"},
82
82
  {"type": "action-choice", "actions": ["not_declared"]},
83
83
  {"type": "multi-select", "options": ["a"], "default": ["b"]},
84
+ {"type": "date", "min": 2},
85
+ {"type": "date", "min": 4, "max": 3},
86
+ {"type": "date", "max": 3, "default": "2026-11-03"},
84
87
  ])
85
88
  def test_bad_choice_inputs_are_rejected(bad):
86
89
  inputs = [{"name": "q", "label": "Q", **bad}]
87
90
  with pytest.raises(ManifestValidationError):
88
91
  validate_manifest(_with(inputs=inputs, choose_one=[]))
92
+
93
+
94
+ def test_a_date_with_max_takes_several_days():
95
+ inputs = [{"name": "days", "label": "Days", "type": "date", "min": 1, "max": 5, "default": ["2026-11-03"]},
96
+ {"name": "deadline", "label": "Deadline", "type": "date"}]
97
+ manifest = validate_manifest(_with(inputs=inputs, choose_one=[]))
98
+ days, deadline = manifest.inputs
99
+ assert days.many_days and not deadline.many_days
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "gravity-cli"
3
- version = "0.9.0"
3
+ version = "0.10.0"
4
4
  description = "gravity cli — init, run, and push python agents to the Gravity marketplace"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
7
7
  license-files = ["LICENSE", "NOTICE"]
8
8
  requires-python = ">=3.12"
9
9
  dependencies = [
10
- "gravity-schema==0.9.0", # released in lockstep: always the same version as this package
10
+ "gravity-schema==0.10.0", # released in lockstep: always the same version as this package
11
11
  "typer>=0.15.0",
12
12
  "httpx>=0.27.0",
13
13
  "rich>=13.9.0",
@@ -93,6 +93,8 @@ inputs: # becomes the user's form; arrives as state[
93
93
  # number, email, url, date and boolean answers are checked on every hosted run: a wrong
94
94
  # form is refused on the question ("Enter one email address"); a url typed as
95
95
  # example.com arrives as https://example.com
96
+ # date: picked on a calendar, arrives as "YYYY-MM-DD". Add `max: 5` (and `min: 1`)
97
+ # to let several days be picked: it arrives as a list ["2026-11-03", "2026-11-05"]
96
98
 
97
99
  permissions:
98
100
  tools: # EVERY tool your code calls, by Gravity name (§7)
@@ -4,6 +4,10 @@ Shown by `gravity update` and `gravity changelog`, and after an update. Each rel
4
4
  then one bullet per change: `- new|improved|fixed: A one-line headline. The detail behind it.`
5
5
  Write it for a builder, not for a maintainer. `tests/test_changelog.py` fails a release that has no entry.
6
6
 
7
+ ## 0.10.0 - 2026-10-27
8
+
9
+ - new: A date input can take several days. Add `max: N` (and `min:`) to a `date` input and the person ticks up to N days on a calendar; your agent gets a list of `"YYYY-MM-DD"` days. `gravity run --input days=2026-11-03,2026-11-05` passes them locally, and every hosted run checks they are real days within your limits.
10
+
7
11
  ## 0.9.0 - 2026-10-26
8
12
 
9
13
  - new: Contract v2 (preview). An agent can declare what it reads (`sources`) and changes (`writes`) as capabilities, and the person picks the app at setup. `gravity init --contract v2` starts one, `gravity capabilities` lists what there is, `gravity check` tries one on your own account, and `gravity run --use name=app` picks the apps for a local run. It needs a gateway that serves v2; v1 agents work exactly as before.
@@ -13,11 +13,11 @@ from . import Problem
13
13
 
14
14
 
15
15
  def _coerce(spec: InputSpec | None, value: Any, many: bool = False) -> Any:
16
- """--input values are text: "a,b" is a list for a multi-select or a multiple slot,
17
- "true"/"false" a boolean for a boolean input (so a show_if on it can hold)."""
16
+ """--input values are text: "a,b" is a list for a multi-select, a date that takes several days or a
17
+ multiple slot, "true"/"false" a boolean for a boolean input (so a show_if on it can hold)."""
18
18
  if not isinstance(value, str):
19
19
  return value
20
- if many or (spec is not None and spec.type is InputType.MULTI_SELECT):
20
+ if many or (spec is not None and (spec.type is InputType.MULTI_SELECT or spec.many_days)):
21
21
  return [v.strip() for v in value.split(",") if v.strip()]
22
22
  if spec is not None and spec.type is InputType.BOOLEAN and value.lower() in ("true", "false", "yes", "no"):
23
23
  return value.lower() in ("true", "yes")
@@ -18,6 +18,7 @@ MANIFEST = {
18
18
  {"name": "destination", "type": "email", "label": "Your email", "required": True, "show_if": {"deliver": "gmail"}},
19
19
  {"name": "platforms", "type": "multi-select", "label": "Where", "options": ["x", "linkedin"], "min": 1},
20
20
  {"name": "loud", "type": "boolean", "label": "Loud"},
21
+ {"name": "call_days", "type": "date", "label": "Days for a call", "max": 3},
21
22
  ],
22
23
  "slots": {"deliver": {"label": "Deliver to", "default": "gravity", "adapters": {"gravity": [], "gmail": []}}},
23
24
  "actions": [
@@ -37,6 +38,15 @@ def test_a_hidden_question_is_dropped_and_lists_and_booleans_are_typed():
37
38
  assert (actions, action_inputs) == (["find"], {})
38
39
 
39
40
 
41
+ def test_a_date_with_max_takes_its_days_as_a_list():
42
+ inputs, _, _ = resolve(M, {"platforms": "x", "call_days": "2026-11-03, 2026-11-05"})
43
+ assert inputs["call_days"] == ["2026-11-03", "2026-11-05"]
44
+ with pytest.raises(Problem, match="pick days on the calendar"):
45
+ resolve(M, {"platforms": "x", "call_days": "next tuesday"})
46
+ with pytest.raises(Problem, match="at most 3 days"):
47
+ resolve(M, {"platforms": "x", "call_days": "2026-11-03,2026-11-04,2026-11-05,2026-11-06"})
48
+
49
+
40
50
  def test_a_visible_required_input_is_still_required():
41
51
  with pytest.raises(Problem) as e:
42
52
  resolve(M, {"deliver": "gmail", "platforms": "x"})
@@ -164,7 +164,7 @@ wheels = [
164
164
 
165
165
  [[package]]
166
166
  name = "gravity-cli"
167
- version = "0.9.0"
167
+ version = "0.10.0"
168
168
  source = { editable = "." }
169
169
  dependencies = [
170
170
  { name = "gravity-schema" },
@@ -201,7 +201,7 @@ dev = [
201
201
 
202
202
  [[package]]
203
203
  name = "gravity-schema"
204
- version = "0.9.0"
204
+ version = "0.10.0"
205
205
  source = { editable = "packages/gravity-schema" }
206
206
  dependencies = [
207
207
  { name = "pydantic" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes