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.
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/PKG-INFO +2 -2
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/rules.py +25 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/rules_cases.json +19 -2
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/specs.py +19 -5
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/pyproject.toml +1 -1
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_rules.py +11 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/pyproject.toml +2 -2
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/BUILDER_GUIDE.md +2 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/CHANGELOG.md +4 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/inputs.py +3 -3
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_inputs_memory.py +10 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/uv.lock +2 -2
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.env.example +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.github/workflows/ci.yml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.github/workflows/composio-watch.yml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.github/workflows/release.yml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/AGENT_STANDARD.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/AGENT_STANDARD_V2.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/LICENSE +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/NOTICE +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/README.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/RELEASING.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/TEMPLATES.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/LICENSE +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/NOTICE +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/README.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/__init__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/__main__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/built_ins.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/catalog.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/catalog.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/catalog_imported.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/contract.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/cron.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/describe.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/errors.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/export.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/gen_catalog.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/gen_vocabulary.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/instance.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/manifest.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/manifest_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/source_scan.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/validation.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/__init__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/__main__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/capabilities.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/airtable.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/asana.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/browser_tool.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/composio_search.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/dropbox.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/exa.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/excel.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/firecrawl.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/github.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/gmail.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googlecalendar.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googledocs.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googledrive.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googlesheets.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googleslides.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/googletasks.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/hackernews.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/hubspot.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/instagram.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/jira.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/linear.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/linkedin.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/microsoft_teams.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/notion.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/outlook.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/perplexityai.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/pinterest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/reddit.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/slack.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/tavily.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/connectors/youtube.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/core_shapes.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/generated_shapes.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/policy.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/airtable.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/asana.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/browser_tool.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/composio_search.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/dropbox.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/exa.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/excel.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/firecrawl.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/github.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/gmail.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googlecalendar.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googledocs.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googledrive.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googlesheets.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googleslides.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/googletasks.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/hackernews.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/hubspot.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/instagram.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/jira.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/linear.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/linkedin.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/microsoft_teams.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/notion.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/outlook.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/perplexityai.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/pinterest.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/reddit.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/slack.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/tavily.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas/youtube.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/schemas.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/ochat.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/ocrm.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/ogh.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/oms.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/oweb.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/owork.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/shapes.d/shared.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/sync.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/ochat.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/ocrm.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/ogh.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/oms.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/oweb.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/owork.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rchat.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rfiles.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rgh.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rtrack.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.d/rwork.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/verbs.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/schema/manifest.schema.json +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/conftest.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/fixtures/demo_manifests.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_accounts.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_actions_memory.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_catalog_parity.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_cron.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_describe.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_errors.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_generated_tables.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_instance.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_json_schema.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_kind_outputs.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_manifest.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_manifest_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_place_maker.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_slots.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_source_scan.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_sync.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_validation.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/tests/test_vocabulary.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/scripts/composio-watch.sh +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/BUILDER_GUIDE_V2.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/__init__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/__main__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/_runner_script.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/api.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/changelog.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/cli.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/__init__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/adapt.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/build.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/capabilities.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/changelog.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/check.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/connect.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/dev.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/docs.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/guide.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/help.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/init.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/login.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/memory.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/push.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/run.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/runs.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/schedule.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/tools.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/update.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/commands/validate.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/config.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/dev.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/dev_page/index.html +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/docs/Gravity.agent.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/docs/Gravity.getting-started.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/docs/problem-to-agent.md +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/localrun.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/manifest.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/project.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/chat/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/deepagent/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/minimal/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/gateway.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/nodes/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/prompts.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/structured/src/state.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/chat/tests/test_agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/deepagent/tests/test_agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/minimal/tests/test_agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/.gitignore +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/__init__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/gateway.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/nodes/__init__.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/nodes/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/prompts.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/src/state.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/templates/v2/structured/tests/test_agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/timeline.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/ui.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/updater.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/src/gravity_cli/workspace.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/src/summary.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter/tests/test_summary.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/manifest.yaml +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/requirements.txt +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/src/agent.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/src/summary.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/starter-v2/tests/test_summary.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/conftest.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_adapt.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_agent_guide.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_agents.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_api.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_build_push.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_changelog.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_check.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_connect.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_connect_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_dev.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_dev_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_gateway_token.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_localrun.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_manifest_integration.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_run.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_run_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_runs.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_schedule.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_schedule_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_session.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_templates.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_templates_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_timeline.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_tools.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_ui.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_updater.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_v2_cli.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_validate.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_validate_v2.py +0 -0
- {gravity_cli-0.9.0 → gravity_cli-0.10.0}/tests/test_welcome.py +0 -0
- {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.
|
|
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
|
+
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
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/rules_cases.json
RENAMED
|
@@ -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
|
|
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
|
-
"
|
|
263
|
-
{"value": self.name, "
|
|
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 = (
|
|
@@ -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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/built_ins.py
RENAMED
|
File without changes
|
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/catalog.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/gen_catalog.py
RENAMED
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/gen_vocabulary.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/manifest_v2.py
RENAMED
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/source_scan.py
RENAMED
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/validation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gravity_cli-0.9.0 → gravity_cli-0.10.0}/packages/gravity-schema/gravity_schema/vocabulary/sync.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|