caraer-cli 0.1.2__tar.gz → 0.1.4__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.
- caraer_cli-0.1.4/AGENTS.md +15 -0
- caraer_cli-0.1.4/CHANGELOG.md +209 -0
- caraer_cli-0.1.4/PKG-INFO +400 -0
- caraer_cli-0.1.4/README.md +363 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/__init__.py +1 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/apps.py +47 -11
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/client.py +7 -2
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/installation.py +12 -0
- caraer_cli-0.1.4/caraer_cli/api/modules.py +49 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/projects.py +53 -0
- caraer_cli-0.1.4/caraer_cli/app_install.py +41 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/app_sync.py +288 -20
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/apps_local.py +19 -9
- caraer_cli-0.1.4/caraer_cli/commands/apps.py +1090 -0
- caraer_cli-0.1.4/caraer_cli/commands/apps_add.py +695 -0
- caraer_cli-0.1.4/caraer_cli/commands/apps_local.py +447 -0
- caraer_cli-0.1.4/caraer_cli/commands/apps_release.py +335 -0
- caraer_cli-0.1.4/caraer_cli/commands/deprecation.py +97 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/publish.py +18 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/skill.py +66 -37
- caraer_cli-0.1.4/caraer_cli/commands/webhooks.py +152 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/completion_callbacks.py +13 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/context.py +7 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/formatters/output.py +5 -3
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/__init__.py +4 -0
- caraer_cli-0.1.4/caraer_cli/project/app_bars_sync.py +373 -0
- caraer_cli-0.1.4/caraer_cli/project/app_manifest_template.py +76 -0
- caraer_cli-0.1.4/caraer_cli/project/code_manifest.py +97 -0
- caraer_cli-0.1.4/caraer_cli/project/function_files.py +264 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/inbound_sync.py +51 -2
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/json_schemas.py +1 -5
- caraer_cli-0.1.4/caraer_cli/project/layout_upgrade.py +388 -0
- caraer_cli-0.1.4/caraer_cli/project/lifecycle_sync.py +207 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/local_dev.py +82 -5
- caraer_cli-0.1.4/caraer_cli/project/local_installation_db.py +87 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/manifest_edit.py +8 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/marketplace_assemble.py +82 -20
- caraer_cli-0.1.4/caraer_cli/project/modules_codegen.py +194 -0
- caraer_cli-0.1.4/caraer_cli/project/modules_dev.py +2649 -0
- caraer_cli-0.1.4/caraer_cli/project/modules_dev_api.py +176 -0
- caraer_cli-0.1.4/caraer_cli/project/modules_manifest.py +453 -0
- caraer_cli-0.1.4/caraer_cli/project/modules_publish.py +393 -0
- caraer_cli-0.1.4/caraer_cli/project/modules_scaffold.py +192 -0
- caraer_cli-0.1.4/caraer_cli/project/modules_sync.py +237 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/oauth_providers_sync.py +5 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/paths.py +69 -2
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/push_plan.py +1 -1
- caraer_cli-0.1.4/caraer_cli/project/scaffold.py +916 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/schedules_sync.py +46 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/schema.py +14 -3
- caraer_cli-0.1.4/caraer_cli/project/settings_sections_sync.py +101 -0
- caraer_cli-0.1.4/caraer_cli/project/settings_sync.py +428 -0
- caraer_cli-0.1.4/caraer_cli/project/sync.py +651 -0
- caraer_cli-0.1.4/caraer_cli/project/validate_app.py +2293 -0
- caraer_cli-0.1.4/caraer_cli/project/webhook_label.py +73 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/webhooks_sync.py +162 -13
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/state/config.py +100 -9
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/catalog.py +56 -3
- caraer_cli-0.1.4/caraer_cli/wizard/marketplace.py +786 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/public_app.py +79 -42
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/scope_macros.py +138 -0
- caraer_cli-0.1.4/docs/agents/domain.md +51 -0
- caraer_cli-0.1.4/docs/agents/issue-tracker.md +45 -0
- caraer_cli-0.1.4/docs/agents/triage-labels.md +15 -0
- caraer_cli-0.1.4/docs/app_lifecycle.md +173 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/docs/backend_contract.md +22 -5
- caraer_cli-0.1.4/docs/functions.md +178 -0
- caraer_cli-0.1.4/docs/inbound.md +58 -0
- caraer_cli-0.1.4/docs/modules.md +100 -0
- caraer_cli-0.1.4/docs/platform_versioning.md +90 -0
- caraer_cli-0.1.4/docs/schedules.md +53 -0
- caraer_cli-0.1.4/docs/webhooks.md +284 -0
- caraer_cli-0.1.4/examples/README.md +33 -0
- caraer_cli-0.1.4/examples/layout-v21/.env.example +2 -0
- caraer_cli-0.1.4/examples/layout-v21/.gitignore +5 -0
- caraer_cli-0.1.4/examples/layout-v21/README.md +146 -0
- caraer_cli-0.1.4/examples/layout-v21/caraer.json +9 -0
- caraer_cli-0.1.4/examples/layout-v21/package.json +19 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/app.caraer.yaml +20 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/appbars/list-dialog-options.js +21 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/appbars/ping.js +307 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/functions/due-date.js +25 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/functions/hello-world.js +43 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/inbound/echo.js +27 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/install.js +43 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/rotate.js +16 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/uninstall.js +15 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/update.js +23 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/modules/hello_world/hello_world.astro +76 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/modules/hello_world/types.d.ts +23 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/schedules/heartbeat.js +22 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/settings.yaml +39 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/shared/index.js +142 -0
- caraer_cli-0.1.4/examples/layout-v21/src/app/webhooks/candidate-updated.yaml +7 -0
- caraer_cli-0.1.4/examples/layout-v21/tsconfig.json +12 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/README.md +4 -5
- caraer_cli-0.1.4/examples/webhook-inbox/package.json +14 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/app.caraer.yaml +2 -10
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/pyproject.toml +1 -1
- caraer_cli-0.1.4/schemas/app.caraer.schema.json +557 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/function.caraer.schema.json +1 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/inbound.caraer.schema.json +1 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/lifecycle.caraer.schema.json +5 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/schedule.caraer.schema.json +1 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/webhook.caraer.schema.json +2 -2
- caraer_cli-0.1.4/skills/caraer-apps/SKILL.md +255 -0
- caraer_cli-0.1.4/skills/caraer-apps/reference.md +457 -0
- caraer_cli-0.1.4/skills/caraer-cms/SKILL.md +109 -0
- caraer_cli-0.1.4/skills/caraer-cms/reference.md +55 -0
- caraer_cli-0.1.4/tests/unit/test_add_scaffolds.py +183 -0
- caraer_cli-0.1.4/tests/unit/test_app_bars_sync.py +143 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_app_detail.py +0 -1
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_app_manifest_yaml.py +8 -4
- caraer_cli-0.1.4/tests/unit/test_app_root_precedence.py +69 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_app_sync.py +43 -0
- caraer_cli-0.1.4/tests/unit/test_apps_command_tree.py +121 -0
- caraer_cli-0.1.4/tests/unit/test_apps_install.py +176 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_apps_wizard.py +56 -11
- caraer_cli-0.1.4/tests/unit/test_config.py +92 -0
- caraer_cli-0.1.4/tests/unit/test_example_layout_v21.py +15 -0
- caraer_cli-0.1.4/tests/unit/test_layout_v21.py +555 -0
- caraer_cli-0.1.4/tests/unit/test_local_app.py +216 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_local_dev.py +2 -2
- caraer_cli-0.1.4/tests/unit/test_marketplace_assemble.py +331 -0
- caraer_cli-0.1.4/tests/unit/test_modules.py +711 -0
- caraer_cli-0.1.4/tests/unit/test_modules_dev.py +193 -0
- caraer_cli-0.1.4/tests/unit/test_modules_dev_api.py +122 -0
- caraer_cli-0.1.4/tests/unit/test_modules_publish.py +151 -0
- caraer_cli-0.1.4/tests/unit/test_private_apps.py +97 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_project_schema.py +66 -6
- caraer_cli-0.1.4/tests/unit/test_prompt_schedule.py +200 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_push_plan.py +4 -2
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_resolve_function.py +3 -1
- caraer_cli-0.1.4/tests/unit/test_setting_field_wizard.py +150 -0
- caraer_cli-0.1.4/tests/unit/test_settings_sync.py +126 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_skill_install.py +22 -1
- caraer_cli-0.1.4/tests/unit/test_validate_app.py +609 -0
- caraer_cli-0.1.4/tests/unit/test_visible_when_parsing.py +48 -0
- caraer_cli-0.1.4/tests/unit/test_webhook_label.py +28 -0
- caraer_cli-0.1.4/tests/unit/test_webhooks_cmd.py +141 -0
- caraer_cli-0.1.4/uv.lock +1173 -0
- caraer_cli-0.1.2/CHANGELOG.md +0 -73
- caraer_cli-0.1.2/PKG-INFO +0 -266
- caraer_cli-0.1.2/README.md +0 -229
- caraer_cli-0.1.2/caraer_cli/commands/apps.py +0 -2025
- caraer_cli-0.1.2/caraer_cli/commands/webhooks.py +0 -68
- caraer_cli-0.1.2/caraer_cli/project/app_bars_sync.py +0 -154
- caraer_cli-0.1.2/caraer_cli/project/app_manifest_template.py +0 -68
- caraer_cli-0.1.2/caraer_cli/project/lifecycle_sync.py +0 -119
- caraer_cli-0.1.2/caraer_cli/project/pricing_sync.py +0 -81
- caraer_cli-0.1.2/caraer_cli/project/scaffold.py +0 -537
- caraer_cli-0.1.2/caraer_cli/project/settings_sync.py +0 -77
- caraer_cli-0.1.2/caraer_cli/project/sync.py +0 -308
- caraer_cli-0.1.2/caraer_cli/project/typegen.py +0 -278
- caraer_cli-0.1.2/caraer_cli/project/validate_app.py +0 -1215
- caraer_cli-0.1.2/caraer_cli/wizard/marketplace.py +0 -350
- caraer_cli-0.1.2/docs/app_lifecycle.md +0 -135
- caraer_cli-0.1.2/docs/platform_versioning.md +0 -46
- caraer_cli-0.1.2/examples/README.md +0 -19
- caraer_cli-0.1.2/examples/webhook-inbox/src/types/caraer.d.ts +0 -115
- caraer_cli-0.1.2/schemas/app.caraer.schema.json +0 -175
- caraer_cli-0.1.2/skills/caraer-apps/SKILL.md +0 -172
- caraer_cli-0.1.2/skills/caraer-apps/reference.md +0 -163
- caraer_cli-0.1.2/tests/unit/test_add_scaffolds.py +0 -66
- caraer_cli-0.1.2/tests/unit/test_config.py +0 -8
- caraer_cli-0.1.2/tests/unit/test_local_app.py +0 -119
- caraer_cli-0.1.2/tests/unit/test_manifest_edit.py +0 -36
- caraer_cli-0.1.2/tests/unit/test_marketplace_assemble.py +0 -104
- caraer_cli-0.1.2/tests/unit/test_migrate_v2.py +0 -46
- caraer_cli-0.1.2/tests/unit/test_typegen.py +0 -31
- caraer_cli-0.1.2/tests/unit/test_validate_app.py +0 -180
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/.github/workflows/ci.yml +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/.github/workflows/publish.yml +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/.gitignore +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/CONTRIBUTING.md +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/LICENSE +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/SECURITY.md +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/__init__.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/auth.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/functions.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/integration_runtime.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/sandboxes.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/webhooks.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/__init__.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/auth.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/company.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/installation.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/profile.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/sandbox.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/completion.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/errors.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/formatters/__init__.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/formatters/timestamps.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/install_completion.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/local_app.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/main.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/models/__init__.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/models/api.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/release.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/state.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/resolve.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/skills/.gitkeep +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/state/__init__.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/state/session.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/utils.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/__init__.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/prompts.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/.env.example +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/.gitignore +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/catch/function.caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/catch/index.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/catch/shared.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/clear-inbox/function.caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/clear-inbox/index.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/clear-inbox/shared.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/heartbeat/function.caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/heartbeat/index.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/heartbeat/shared.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-install/function.caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-install/index.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-install/shared.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-rotate/function.caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-rotate/index.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-rotate/shared.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-uninstall/function.caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-uninstall/index.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-uninstall/shared.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-update/function.caraer.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-update/index.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-update/shared.js +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/inbound/catch.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/install.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/rotate.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/uninstall.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/update.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/schedules/heartbeat.json +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/scripts/ci.sh +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/scripts/install.sh +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/contract/README.md +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/integration/README.md +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_apps_local.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_command_help.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_completion.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_errors.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_output.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_profile.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_release.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_require_text.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_resolve.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_timestamps.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_utils.py +0 -0
- {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_v2_runtime_poll.py +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Agent instructions
|
|
2
|
+
|
|
3
|
+
## Agent skills
|
|
4
|
+
|
|
5
|
+
### Issue tracker
|
|
6
|
+
|
|
7
|
+
Issues and specs live in this repo's GitHub Issues (via `gh`). See `docs/agents/issue-tracker.md`.
|
|
8
|
+
|
|
9
|
+
### Triage labels
|
|
10
|
+
|
|
11
|
+
Default triage roles mapped 1:1 (`needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, `wontfix`). See `docs/agents/triage-labels.md`.
|
|
12
|
+
|
|
13
|
+
### Domain docs
|
|
14
|
+
|
|
15
|
+
Single-context: `CONTEXT.md` and `docs/adr/` at the repo root. See `docs/agents/domain.md`.
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.4
|
|
4
|
+
|
|
5
|
+
- HTTP webhooks are first-class on 2026.2.1: one YAML file each under
|
|
6
|
+
`src/app/webhooks/`. `caraer apps add webhook --mode HTTP --url …` writes
|
|
7
|
+
that file. Serverless webhooks stay on the function manifest.
|
|
8
|
+
|
|
9
|
+
- Module `fields` is a list of field objects or `{ group: "Style", fields:
|
|
10
|
+
[...] }` expandables. Do not set `group` on a field. `advanced: true`
|
|
11
|
+
stays the unnamed Advanced settings group.
|
|
12
|
+
|
|
13
|
+
- Clicking a `data-caraer-field` node in the CMS preview focuses that
|
|
14
|
+
sidebar field (local `caraer apps local` harness and the Flutter builder).
|
|
15
|
+
`examples/layout-v21` and new `caraer apps add module` scaffolds mark heading
|
|
16
|
+
and body.
|
|
17
|
+
|
|
18
|
+
- `caraer apps push` warns when the workspace is still 2026.2 and offers to
|
|
19
|
+
rewrite it to 2026.2.1 (default yes). `--upgrade` / `--no-upgrade` skip the
|
|
20
|
+
prompt. `caraer apps upgrade` still rewrites without deploying.
|
|
21
|
+
|
|
22
|
+
- Docs and `examples/layout-v21` match the 2026.2.1 layout: flat functions,
|
|
23
|
+
`src/app/appbars/`, JS lifecycle / inbound / schedules, webhook `label` and
|
|
24
|
+
`webhookFormat`, company-copy topics on the Webhooks tab, CMS Modules tab,
|
|
25
|
+
and `caraer apps delete` versus uninstall. `caraer apps add webhook`,
|
|
26
|
+
`add schedule`, and `add inbound` write 2026.2.1 code files (function
|
|
27
|
+
manifest / JS). JSON remains only on a 2026.2 workspace.
|
|
28
|
+
|
|
29
|
+
- Webhook topics and required scopes read a key on a setting. A property
|
|
30
|
+
single-select uses `objectName` and `propertyName`
|
|
31
|
+
(`record.<setting:due_date.objectName>.date_due.<setting:due_date.propertyName>`,
|
|
32
|
+
and `records.<setting:due_date.objectName>.property.<setting:due_date.propertyName>.all`).
|
|
33
|
+
A mapping row is addressed by `fieldName` (`<setting:field_map.email>`).
|
|
34
|
+
Mapping scopes stay on the object. Caraer stores the concrete topic on the
|
|
35
|
+
company webhook when the app is installed or settings are saved.
|
|
36
|
+
|
|
37
|
+
- Example app `examples/layout-v21`: full 2026.2.1 layout with settings,
|
|
38
|
+
inbound, schedule, app bar, CMS module, and a setting-targeted record webhook.
|
|
39
|
+
|
|
40
|
+
- Guides for serverless functions, CMS modules, webhooks, lifecycle hooks,
|
|
41
|
+
schedules, and inbound routes: `docs/functions.md`, `docs/modules.md`,
|
|
42
|
+
`docs/webhooks.md`, `docs/app_lifecycle.md`, `docs/schedules.md`,
|
|
43
|
+
`docs/inbound.md`.
|
|
44
|
+
|
|
45
|
+
- The default profile is `prod` (`https://api.caraer.com`). Built-in profiles
|
|
46
|
+
are `local` (`http://localhost:8080`), `dev` (`https://v2.dev.api.caraer.com`),
|
|
47
|
+
`staging` (`https://v2.staging.api.caraer.com`), and `prod`. Existing configs
|
|
48
|
+
that still use the old hosts are updated on the next command. Staging and
|
|
49
|
+
dev are not proxied through Cloudflare.
|
|
50
|
+
|
|
51
|
+
- CMS preview reinstalls when `@caraer/cms-runtime` or `@caraer/cms-tokens`
|
|
52
|
+
are missing or are broken `caraer-web/packages` links, instead of treating
|
|
53
|
+
an existing `@astrojs/node` as enough.
|
|
54
|
+
|
|
55
|
+
- CMS module preview (`.harness__preview`) uses block flow like live
|
|
56
|
+
`#main`, so section modules fill the frame instead of shrink-wrapping
|
|
57
|
+
in a centered flex row.
|
|
58
|
+
|
|
59
|
+
- CMS module manifests can import shared field objects (for example
|
|
60
|
+
`widthField` from `src/app/modules/settings.ts`) instead of repeating
|
|
61
|
+
options in every module. Field groups can be spread (`...backgroundFields`).
|
|
62
|
+
Shared files at the modules root, and `_`-prefixed folders, are included
|
|
63
|
+
in the published package. Nested settings files may reuse exported arrays
|
|
64
|
+
such as `COLORS`.
|
|
65
|
+
|
|
66
|
+
- `caraer apps push` is the one command for private and public apps: it
|
|
67
|
+
deploys by default, publishes CMS modules, and installs on the selected
|
|
68
|
+
company. `--no-deploy` syncs without a build. `--wait` blocks on function
|
|
69
|
+
runtime provisioning; the default skips that wait.
|
|
70
|
+
|
|
71
|
+
- App `package.json` `dev` is `caraer apps local dev`, so `npm run dev` /
|
|
72
|
+
`pnpm dev` starts functions and the CMS preview. A missing `dev` script
|
|
73
|
+
is filled in; an existing one is left alone.
|
|
74
|
+
|
|
75
|
+
- `apps local dev --cms` isolates the preview harness from the app
|
|
76
|
+
`package.json`, so pnpm does not skip `@astrojs/node`.
|
|
77
|
+
|
|
78
|
+
- `apps init` scaffolds `src/app/modules/hello_world` (entry + `fields.d.ts`),
|
|
79
|
+
the same starter CMS module `apps add module` would create.
|
|
80
|
+
|
|
81
|
+
- `apps init` writes a root `tsconfig.json` (same options as `caraer-core`) so
|
|
82
|
+
module scripts can resolve npm libraries from `package.json`. Node
|
|
83
|
+
`package.json` scaffolds set `"type": "module"`, `@caraer/client`, and the
|
|
84
|
+
published CMS contract packages (`@caraer/cms-runtime`, `@caraer/cms-tokens`)
|
|
85
|
+
and runs `npm install` so the default `hello_world` module resolves. They no
|
|
86
|
+
longer add `three` / `@types/three`. Add those only when a module imports
|
|
87
|
+
them.
|
|
88
|
+
|
|
89
|
+
- Settings schema `filterPropertyTypes` / `filterPropertyFormats` on
|
|
90
|
+
`PROPERTY_SINGLE_SELECT` / `PROPERTY_MULTI_SELECT` (CMS alias
|
|
91
|
+
`allowedPropertyTypes` / `allowedPropertyFormats`)
|
|
92
|
+
|
|
93
|
+
## 0.1.3
|
|
94
|
+
|
|
95
|
+
- Settings schema `filterTraits` on `OBJECT_SINGLE_SELECT` / `OBJECT_MULTI_SELECT`
|
|
96
|
+
so installers can be limited to objects that have specific traits
|
|
97
|
+
- Parse CMS module `manifest` object literals without `json5`, so existing
|
|
98
|
+
`caraer` installs keep working after this release
|
|
99
|
+
|
|
100
|
+
- Settings schema `ACTION` fields with `actionSource` trigger a serverless
|
|
101
|
+
function without saving settings (cannot be `required` or a `visibleWhen` target)
|
|
102
|
+
- App scaffolds write a public `# yaml-language-server: $schema=…` line that
|
|
103
|
+
loads [Caraer-HQ/caraer-app-schemas](https://github.com/Caraer-HQ/caraer-app-schemas)
|
|
104
|
+
- Removed `caraer apps migrate-v2`. Existing V1 apps are migrated via the backend
|
|
105
|
+
Neo4j migration `apps-platform-v2` (`run-migration apps-platform-v2 up`).
|
|
106
|
+
- Removed `caraer apps typegen`. Import serverless payload helpers from the
|
|
107
|
+
Caraer clients instead: `@caraer/client` (Node) / `caraer-client` (Python).
|
|
108
|
+
Node scaffolds add `@caraer/client` as a `devDependency`.
|
|
109
|
+
- App scaffolds (`apps init` / wizard) default `hideApiKeyField: true` so the
|
|
110
|
+
installation API key is hidden in the Caraer UI unless explicitly shown
|
|
111
|
+
- `caraer apps add schedule` interactive wizard: cron presets (hourly,
|
|
112
|
+
daily, weekdays, …) or custom Spring 5–6 field expression, plus
|
|
113
|
+
function picker, description, and enabled. `--cron` / `--description` /
|
|
114
|
+
`--enabled|--disabled` still work non-interactively.
|
|
115
|
+
- **Breaking (with aliases):** regrouped `caraer apps` into nested
|
|
116
|
+
`add/`, `local/`, and `release/` groups. Golden-path leaves stay flat
|
|
117
|
+
(`list`, `select`, `init`, `push`, `validate`, …). Old flat paths
|
|
118
|
+
(`add-function`, `dev`, `deploy`, `builds`, …) remain as **hidden**
|
|
119
|
+
aliases that print a one-line deprecation warning. Aliases will be
|
|
120
|
+
removed after one release — migrate to the new paths now.
|
|
121
|
+
- V2 runtimes now deploy straight from the pushed build archive (Cloud Run
|
|
122
|
+
style): the platform stores function metadata only, not source code. After a
|
|
123
|
+
build push, the CLI refreshes function UUID tracking read-only instead of
|
|
124
|
+
re-uploading code through the legacy API, and `apps pull` never overwrites
|
|
125
|
+
local sources when the platform has no stored code
|
|
126
|
+
- Shared code: `src/app/shared/` is deployed at the runtime archive root, so
|
|
127
|
+
functions import helpers with the same relative path locally and deployed
|
|
128
|
+
(`require("../../shared")` from `functions/<name>/index.js`). No more
|
|
129
|
+
copying `shared.js` into every function folder (requires backend support;
|
|
130
|
+
platform 2026.2 build pushes only — legacy sync warns and skips it)
|
|
131
|
+
- `function.caraer.json` is now optional: a folder under `src/app/functions/`
|
|
132
|
+
with `index.js` / `main.py` is a function named after the folder, using the
|
|
133
|
+
app-level runtime. Keep the manifest only for a custom `entry` or
|
|
134
|
+
`description`. Scaffolds and `apps pull` no longer write redundant manifests
|
|
135
|
+
- `apps init` scaffolds a root `package.json` with npm scripts
|
|
136
|
+
(`dev`, `validate`, `push`, `deploy`, `logs`) for Node projects
|
|
137
|
+
- `apps init` no longer creates empty `settings/`, `pricing/`, and `app-bars/`
|
|
138
|
+
directories; their writers create them on demand
|
|
139
|
+
|
|
140
|
+
## 0.1.2
|
|
141
|
+
|
|
142
|
+
- Cursor Agent Skill `caraer-apps` under `skills/caraer-apps`, installable via
|
|
143
|
+
`caraer skill install` / `caraer skill install --project`
|
|
144
|
+
- JSON Schemas under `schemas/` for app / function / webhook / schedule /
|
|
145
|
+
inbound / lifecycle configs (IDE `$schema` + optional `caraer-cli[schemas]`)
|
|
146
|
+
- `caraer apps typegen` writes `src/types/caraer.d.ts` (Node) or
|
|
147
|
+
`caraer_types.py` (Python) payload helpers
|
|
148
|
+
- Example app `examples/webhook-inbox` (inbound catch → installation state)
|
|
149
|
+
- Modular marketplace files: `src/app/settings/`, `pricing/`, `app-bars/`, `lifecycle/`
|
|
150
|
+
(merged into the manifest on push; split on pull). Scaffolds:
|
|
151
|
+
`apps add-setting|add-pricing-plan|add-app-bar|add-lifecycle-hook`
|
|
152
|
+
- `apps validate` covers settings, pricing, app bars, and lifecycle hooks
|
|
153
|
+
- `apps add-setting|pricing-plan|app-bar` use wizard prompts and append to
|
|
154
|
+
`app.caraer.yaml` by default (`--modular` for separate JSON files)
|
|
155
|
+
- `apps init` always scaffolds all four lifecycle hooks + `on-*` functions
|
|
156
|
+
- Function sync includes sidecar `sourceFiles` so multi-file handlers deploy correctly
|
|
157
|
+
- Docs: [docs/app_lifecycle.md](docs/app_lifecycle.md); webhook-inbox includes all
|
|
158
|
+
lifecycle hooks (install/uninstall/rotate/update)
|
|
159
|
+
- V2 local `apps dev` matches container contract: `POST /functions/{name}`,
|
|
160
|
+
`X-Caraer-Function` header, and `body.functionName` (legacy `POST /{name}` kept)
|
|
161
|
+
- `apps dev` emulates installation state/secrets/jobs/connections + inbound routes;
|
|
162
|
+
`--invoke-schedule` fires a local schedule once
|
|
163
|
+
- `apps deploy --wait/--no-wait` polls `runtimeStatus` (same as `push --deploy`)
|
|
164
|
+
- `apps pull` aligns local `platformVersion`/`runtime` with remote and pulls
|
|
165
|
+
external OAuth providers
|
|
166
|
+
- Installation commands: `apps state|secrets|jobs|connections`
|
|
167
|
+
- `apps test` remote-invokes a function (or `--sample-only`); `apps rollback`
|
|
168
|
+
redeploys a prior READY build; `apps builds list|get`
|
|
169
|
+
- `apps logs --all` fetches app-level V2 container logs
|
|
170
|
+
- `apps validate` covers schedules, inbound routes, and OAuth providers
|
|
171
|
+
- `apps push` / `pull` sync schedules, inbound routes, and OAuth providers
|
|
172
|
+
(in addition to manifest, functions, webhooks)
|
|
173
|
+
- Local app definition is now **`src/app/app.caraer.yaml`** (legacy `app.caraer.json` still loads);
|
|
174
|
+
scaffolds include commented examples for scopes, settings, pricing, and app bars
|
|
175
|
+
- App platform **V2** (`platformVersion: 2026.2`): one async container runtime per app;
|
|
176
|
+
`apps push --deploy` polls `runtimeStatus`; `apps status` shows runtime fields
|
|
177
|
+
- Default scaffold is `2026.2`; use `--platform 2026.1` for legacy per-function Cloud Functions
|
|
178
|
+
- Collapsed local **project** into **app**: `caraer.json` replaces `caraer.project.json`;
|
|
179
|
+
opaque developer-project id lives in `.caraer/state.json`
|
|
180
|
+
- Single sync pair: `caraer apps pull` / `caraer apps push` syncs manifest, functions,
|
|
181
|
+
webhooks, schedules, inbound, and OAuth providers
|
|
182
|
+
- Removed top-level `webhooks`, `pricing`, `appbars`, and `functions` command groups
|
|
183
|
+
(edit files under `src/app/` instead)
|
|
184
|
+
- Removed `caraer apps link` and `caraer apps watch` (use `select` / `push` instead)
|
|
185
|
+
- Removed deprecated `caraer project` command group (use `caraer apps` instead)
|
|
186
|
+
- Removed `caraer config` command group (use `caraer profile` instead)
|
|
187
|
+
- Removed `caraer completion` command group; shell completion is installed by `scripts/install.sh`
|
|
188
|
+
- Public packaging polish: LICENSE, SECURITY, CONTRIBUTING; example defaults to `2026.2`
|
|
189
|
+
- Developer sandboxes clone the selected company Neo4j DB only (same company
|
|
190
|
+
identity; `X-Caraer-Sandbox-Uuid` overrides `databaseid`). Recreate sandboxes
|
|
191
|
+
after upgrading past the old clone-company model
|
|
192
|
+
(`caraer sandbox use` / `clear`)
|
|
193
|
+
- `caraer apps add-function` / `add-webhook` / `add-schedule` / `add-inbound`
|
|
194
|
+
scaffold local function folders and integration-runtime JSON files
|
|
195
|
+
- Missing required args/options prompt interactively (questionary) instead of
|
|
196
|
+
failing with Typer usage errors; non-TTY still fails clearly
|
|
197
|
+
- `caraer apps logs` prints log lines below the summary table; `--follow`
|
|
198
|
+
streams only new entries; skips unreadable Cloud Audit protobuf dumps
|
|
199
|
+
|
|
200
|
+
## 0.1.0
|
|
201
|
+
|
|
202
|
+
- Standalone `caraer-cli` package extracted from backend `clients/python`
|
|
203
|
+
- Existing app / webhook / function commands
|
|
204
|
+
- `caraer project` local project workflow (`init`, `link`, `upload`, `pull`, `watch`, `status`)
|
|
205
|
+
- Build/deploy/logs/dev commands wired to developer-project APIs
|
|
206
|
+
- `caraer functions delete`
|
|
207
|
+
- `caraer sandbox` commands
|
|
208
|
+
- Example project under `examples/webhook-inbox`
|
|
209
|
+
- CI workflow and `scripts/ci.sh`
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: caraer-cli
|
|
3
|
+
Version: 0.1.4
|
|
4
|
+
Summary: Developer CLI for Caraer apps, webhooks, and serverless functions.
|
|
5
|
+
Project-URL: Homepage, https://caraer.com
|
|
6
|
+
Project-URL: Documentation, https://developer.caraer.com
|
|
7
|
+
Author: Caraer
|
|
8
|
+
License: Proprietary
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: apps,caraer,cli,marketplace,serverless
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: Other/Proprietary License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: httpx>=0.27.0
|
|
22
|
+
Requires-Dist: keyring>=25.2.1
|
|
23
|
+
Requires-Dist: platformdirs>=4.2.2
|
|
24
|
+
Requires-Dist: pydantic>=2.8.0
|
|
25
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
26
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
27
|
+
Requires-Dist: questionary>=2.0.1
|
|
28
|
+
Requires-Dist: rich>=13.7.1
|
|
29
|
+
Requires-Dist: tomli>=2.0.1; python_version < '3.11'
|
|
30
|
+
Requires-Dist: typer>=0.12.3
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: build>=1.2.1; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=8.3.2; extra == 'dev'
|
|
34
|
+
Provides-Extra: schemas
|
|
35
|
+
Requires-Dist: jsonschema>=4.22.0; extra == 'schemas'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# Caraer CLI
|
|
39
|
+
|
|
40
|
+
Developer CLI for building Caraer apps: serverless functions, webhooks, schedules,
|
|
41
|
+
inbound routes, lifecycle hooks, and CMS modules.
|
|
42
|
+
|
|
43
|
+
The CLI is a thin client of the Caraer API. You do not need GCP credentials on
|
|
44
|
+
your machine.
|
|
45
|
+
|
|
46
|
+
Docs: [developer.caraer.com](https://developer.caraer.com)
|
|
47
|
+
|
|
48
|
+
## Requirements
|
|
49
|
+
|
|
50
|
+
- **Python 3.10+** (the CLI itself)
|
|
51
|
+
- **Node.js 22** and npm (default `nodejs22` runtime and the starter CMS module)
|
|
52
|
+
- A Caraer account that can create apps in a company
|
|
53
|
+
|
|
54
|
+
## Install
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pipx install caraer-cli
|
|
58
|
+
# or: uv tool install caraer-cli
|
|
59
|
+
# or: pip install caraer-cli
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Confirm:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
caraer --version
|
|
66
|
+
caraer profile current # prod, https://api.caraer.com
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
A new install uses the `prod` profile. `caraer profile use local`, `dev`, or
|
|
70
|
+
`staging` switches API host.
|
|
71
|
+
|
|
72
|
+
### Install from source
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
git clone https://github.com/Caraer-HQ/caraer-cli.git
|
|
76
|
+
cd caraer-cli
|
|
77
|
+
python3 -m venv .venv
|
|
78
|
+
source .venv/bin/activate
|
|
79
|
+
./scripts/install.sh
|
|
80
|
+
caraer --version
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
If install fails with `requires a different Python`, create the venv with
|
|
84
|
+
`python3.10`, `python3.11`, or `python3.12`. Restart the terminal so tab
|
|
85
|
+
completion loads.
|
|
86
|
+
|
|
87
|
+
## Prompt for an AI coding agent
|
|
88
|
+
|
|
89
|
+
Paste this into Cursor, Claude Code, or a similar agent. It installs the CLI,
|
|
90
|
+
logs you into production, and scaffolds an app. It does not deploy.
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
Set up the Caraer CLI on this machine and scaffold a Caraer app. Do not push,
|
|
94
|
+
deploy, install, or publish the app unless I explicitly ask.
|
|
95
|
+
|
|
96
|
+
1. Check Python is 3.10 or newer (`python3 --version`). If it is older, stop
|
|
97
|
+
and tell me how to install it.
|
|
98
|
+
2. Check Node.js 22 is available (`node --version`). The default `nodejs22`
|
|
99
|
+
runtime and starter CMS module need it. If it is missing, stop and tell me.
|
|
100
|
+
3. If `caraer --version` fails, install the CLI:
|
|
101
|
+
prefer `pipx install caraer-cli`, else `uv tool install caraer-cli`,
|
|
102
|
+
else `pip install caraer-cli`. Confirm with `caraer --version`.
|
|
103
|
+
4. Confirm the active profile is production before login:
|
|
104
|
+
`caraer profile current`
|
|
105
|
+
base_url must be https://api.caraer.com. If it is not, run `caraer profile use prod`.
|
|
106
|
+
5. Install the agent skills so later edits follow Caraer app conventions:
|
|
107
|
+
`caraer skill install`
|
|
108
|
+
Tell me to start a new chat before relying on those skills.
|
|
109
|
+
6. Log in with `caraer auth login` and stop so I can approve the device code
|
|
110
|
+
in the browser. Do not ask for or type my password. If device login is
|
|
111
|
+
unavailable, ask me to run `caraer auth login --email <my-email>` myself.
|
|
112
|
+
7. Run `caraer company list` and ask which company to use, then
|
|
113
|
+
`caraer company select <uuid>`.
|
|
114
|
+
8. Ask whether the app is private to that company or a public marketplace app,
|
|
115
|
+
and what label to use. Then scaffold with platform 2026.2.1 (the default):
|
|
116
|
+
- Private: `caraer apps init --private --label "<Label>" --auth-method API_KEY`
|
|
117
|
+
- Public: `caraer apps init --label "<Label>"`
|
|
118
|
+
Do not pass `--platform 2026.1`.
|
|
119
|
+
9. Change into the new folder and run `caraer apps validate`. Fix only errors
|
|
120
|
+
the scaffold itself reported.
|
|
121
|
+
10. Summarize the folder, how to run it locally (`caraer apps local dev`), and
|
|
122
|
+
that `caraer apps push` deploys and installs on the selected company.
|
|
123
|
+
Wait for me before pushing.
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
After that chat, open a **new** agent chat in the app folder. The installed
|
|
127
|
+
skills (`caraer-apps`, `caraer-cms`) are what teach the agent the app layout.
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
caraer skill install # ~/.cursor/skills/caraer-apps and caraer-cms
|
|
131
|
+
caraer skill install --project # ./.cursor/skills in the current directory
|
|
132
|
+
caraer skill list
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Quick start
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
caraer auth login
|
|
139
|
+
# CI or password login: caraer auth login --email you@example.com
|
|
140
|
+
caraer company list
|
|
141
|
+
caraer company select <company-uuid>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Create a local app:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
caraer apps init --label "My App"
|
|
148
|
+
# company-only app:
|
|
149
|
+
caraer apps init --private --label "Internal Tool" --auth-method API_KEY
|
|
150
|
+
cd my_app
|
|
151
|
+
caraer apps validate
|
|
152
|
+
caraer apps local dev # local server: POST /functions/<name>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Deploy only when you mean to. `caraer apps push` syncs the manifest, functions,
|
|
156
|
+
webhooks, schedules, inbound routes, and OAuth providers, deploys the function
|
|
157
|
+
build, publishes CMS modules, and installs the app on the selected company.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
caraer apps push --dry-run
|
|
161
|
+
caraer apps push # add --wait to block until the runtime is READY
|
|
162
|
+
caraer apps status
|
|
163
|
+
caraer apps local logs # the only local function, or a prompt
|
|
164
|
+
caraer apps local logs --all
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Only the company that created the app (or a super-admin) can push builds.
|
|
168
|
+
|
|
169
|
+
`--no-deploy` syncs without a build. Private apps (`caraer apps init --private`,
|
|
170
|
+
or `privateApp: true` in `caraer.json`) use the private app API and cannot be
|
|
171
|
+
submitted with `caraer publish`.
|
|
172
|
+
|
|
173
|
+
New apps use workspace `platformVersion: 2026.2.1` (one container per app). Use
|
|
174
|
+
`--platform 2026.1` only for the legacy per-function model. See
|
|
175
|
+
[docs/platform_versioning.md](docs/platform_versioning.md).
|
|
176
|
+
|
|
177
|
+
### Add pieces
|
|
178
|
+
|
|
179
|
+
Run these inside the app folder:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
caraer apps add function my-action
|
|
183
|
+
caraer apps add options-function list-items # dynamic select options
|
|
184
|
+
caraer apps add webhook --topic record.candidate.created --function my-action
|
|
185
|
+
caraer apps add webhook --mode HTTP --topic record.candidate.updated --url https://example.com/hooks/caraer
|
|
186
|
+
caraer apps add schedule heartbeat --cron "0 0 */12 * * *"
|
|
187
|
+
caraer apps add inbound echo --auth NONE --sync
|
|
188
|
+
caraer apps add setting
|
|
189
|
+
caraer apps add lifecycle-hook
|
|
190
|
+
caraer apps add module hello --kind section
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
On `2026.2.1` those write code files (see
|
|
194
|
+
[`examples/layout-v21`](examples/layout-v21)):
|
|
195
|
+
|
|
196
|
+
- Webhook: `exports.manifest.webhooks` on `src/app/functions/<name>.js`
|
|
197
|
+
(HTTP: `src/app/webhooks/<name>.yaml`)
|
|
198
|
+
- Schedule: `src/app/schedules/<name>.js`
|
|
199
|
+
- Inbound: `src/app/inbound/<name>.js`
|
|
200
|
+
|
|
201
|
+
On `2026.2` `add webhook|schedule|inbound` still write JSON under
|
|
202
|
+
`src/app/webhooks/`, `schedules/`, and `inbound/`.
|
|
203
|
+
|
|
204
|
+
`caraer apps init` already creates lifecycle files
|
|
205
|
+
(`src/app/lifecycle/{install,uninstall,rotate,update}.js`) and a starter
|
|
206
|
+
`modules/hello_world`. A `2026.2` app is rewritten to `2026.2.1` on the
|
|
207
|
+
next `caraer apps push` unless you decline the prompt (default yes) or
|
|
208
|
+
pass `--no-upgrade`. `caraer apps upgrade` does the same rewrite without
|
|
209
|
+
deploying. See [docs/platform_versioning.md](docs/platform_versioning.md).
|
|
210
|
+
|
|
211
|
+
`add schedule` and `add setting` open a wizard when you omit flags.
|
|
212
|
+
`add setting` writes into `src/app/settings.yaml`.
|
|
213
|
+
|
|
214
|
+
## Project layout
|
|
215
|
+
|
|
216
|
+
```text
|
|
217
|
+
my_app/
|
|
218
|
+
caraer.json # platformVersion 2026.2.1, appUuid, privateApp
|
|
219
|
+
package.json
|
|
220
|
+
src/app/
|
|
221
|
+
app.caraer.yaml # identity, scopes, auth, details
|
|
222
|
+
settings.yaml # installer setting fields (optional section grouping)
|
|
223
|
+
functions/<name>.js # name is the filename; serverless webhooks live in exports.manifest
|
|
224
|
+
appbars/<name>.js # appBars on this file; Caraer runs it for app.bar.triggered
|
|
225
|
+
lifecycle/<hook>.js # install | uninstall | rotate | update
|
|
226
|
+
schedules/<name>.js
|
|
227
|
+
inbound/<name>.js
|
|
228
|
+
webhooks/<name>.yaml # HTTP webhooks (POST to a URL, no function)
|
|
229
|
+
shared/ # require("../shared") from each of the above
|
|
230
|
+
modules/<name>/<name>.astro
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
A function is a file named after the function, with `exports.handler` (Node) or
|
|
234
|
+
`def handler` (Python). Helpers live in `shared/`.
|
|
235
|
+
|
|
236
|
+
Node handlers export `handler`. Payload types come from `@caraer/client`
|
|
237
|
+
(`LifecyclePayload`, `WebhookPayload`, `SchedulePayload`):
|
|
238
|
+
|
|
239
|
+
```js
|
|
240
|
+
exports.handler = async (req, res) => {
|
|
241
|
+
const body = req.body || {};
|
|
242
|
+
res.status(200).json({ ok: true, event: body.event || null });
|
|
243
|
+
};
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Python handlers use `caraer-client` for the same payload types:
|
|
247
|
+
|
|
248
|
+
```python
|
|
249
|
+
def handler(request):
|
|
250
|
+
return {"statusCode": 200, "body": {"ok": True}}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Shared helpers live in `src/app/shared/` and are imported with the same relative
|
|
254
|
+
path locally and when deployed, for example `require("../shared")` from
|
|
255
|
+
`functions/<name>.js`.
|
|
256
|
+
|
|
257
|
+
See [`examples/layout-v21`](examples/layout-v21) for a full `2026.2.1` app
|
|
258
|
+
(named files, settings list, inbound, schedule, app bars, CMS module, and
|
|
259
|
+
setting-targeted record and due-date webhooks).
|
|
260
|
+
[`examples/webhook-inbox`](examples/webhook-inbox) is the older `2026.2`
|
|
261
|
+
folder layout.
|
|
262
|
+
|
|
263
|
+
A private app can be removed from the company that created it:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
caraer apps delete # selected private app; asks first
|
|
267
|
+
caraer apps delete --yes # no prompt
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Uninstall is a different action: it removes one company's install and leaves
|
|
271
|
+
the app in place. Delete is creator-company only, and only for private apps.
|
|
272
|
+
|
|
273
|
+
## App pieces
|
|
274
|
+
|
|
275
|
+
Each piece is a file under `src/app/` that points at a function, except CMS
|
|
276
|
+
modules, which are Astro components published with the app.
|
|
277
|
+
|
|
278
|
+
| Piece | What it does | Guide |
|
|
279
|
+
|-------|----------------|-------|
|
|
280
|
+
| Serverless functions | The code that runs | [docs/functions.md](docs/functions.md) |
|
|
281
|
+
| CMS modules | Blocks for the website builder | [docs/modules.md](docs/modules.md) |
|
|
282
|
+
| Webhooks | Run a function when a record or relation changes | [docs/webhooks.md](docs/webhooks.md) |
|
|
283
|
+
| Lifecycle | Run a function on install, update, uninstall, or credential rotate | [docs/app_lifecycle.md](docs/app_lifecycle.md) |
|
|
284
|
+
| Schedules | Run a function on a cron | [docs/schedules.md](docs/schedules.md) |
|
|
285
|
+
| Inbound routes | Public HTTP from an outside system into a function | [docs/inbound.md](docs/inbound.md) |
|
|
286
|
+
|
|
287
|
+
## Settings
|
|
288
|
+
|
|
289
|
+
Installation settings are filled in by the admin who installs the app.
|
|
290
|
+
|
|
291
|
+
`src/app/settings.yaml` is a single-level list of fields. Group related
|
|
292
|
+
fields into installer cards with `section` / `sectionSubtitle` on the field.
|
|
293
|
+
Caraer lays cards out left to right, top to bottom, at most 3 across.
|
|
294
|
+
Fields without `section` stay schema-only (no section card).
|
|
295
|
+
|
|
296
|
+
```yaml
|
|
297
|
+
- name: candidate_mapping
|
|
298
|
+
type: MAPPING
|
|
299
|
+
label: Candidate mapping
|
|
300
|
+
section: Candidate
|
|
301
|
+
sectionSubtitle: Map CV fields and parsing behavior
|
|
302
|
+
- name: parse_on_cv_change
|
|
303
|
+
type: SWITCH
|
|
304
|
+
label: Parse when a CV changes
|
|
305
|
+
section: Candidate
|
|
306
|
+
- name: custom_mapping
|
|
307
|
+
label: Custom mapping for work experience
|
|
308
|
+
type: SWITCH
|
|
309
|
+
defaultValue: false
|
|
310
|
+
- name: work_experience_mapping
|
|
311
|
+
type: MAPPING
|
|
312
|
+
visibleWhen:
|
|
313
|
+
- field: custom_mapping
|
|
314
|
+
operator: EQUALS
|
|
315
|
+
value: true
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
A field with `visibleWhen` is shown, required, and submitted only while every
|
|
319
|
+
condition holds. Hidden fields are dropped.
|
|
320
|
+
|
|
321
|
+
Operators: `EQUALS` (default), `NOT_EQUALS`, `IN`, `NOT_IN`, `IS_SET`,
|
|
322
|
+
`IS_NOT_SET`.
|
|
323
|
+
|
|
324
|
+
Do not ask the installer for the Caraer API base URL. The runtime injects
|
|
325
|
+
`body.caraerApiBase`.
|
|
326
|
+
|
|
327
|
+
`records.<setting:field>.all` on `requiredScopes` follows the installer's
|
|
328
|
+
object pick. A path reads one key: `<setting:due_date.objectName>` and
|
|
329
|
+
`<setting:due_date.propertyName>` for a property single-select, and
|
|
330
|
+
`<setting:field_map.email>` for the mapping row whose `fieldName` is `email`.
|
|
331
|
+
A property scope is
|
|
332
|
+
`records.<setting:due_date.objectName>.property.<setting:due_date.propertyName>.all`.
|
|
333
|
+
The same placeholders work on webhook topics. See
|
|
334
|
+
[docs/webhooks.md](docs/webhooks.md).
|
|
335
|
+
|
|
336
|
+
## Profiles
|
|
337
|
+
|
|
338
|
+
Config is stored in the user config directory (`config.toml`). Built-in
|
|
339
|
+
profiles:
|
|
340
|
+
|
|
341
|
+
| Profile | API |
|
|
342
|
+
|---------|-----|
|
|
343
|
+
| `prod` (default) | `https://api.caraer.com` |
|
|
344
|
+
| `staging` | `https://v2.staging.api.caraer.com` |
|
|
345
|
+
| `dev` | `https://v2.dev.api.caraer.com` |
|
|
346
|
+
| `local` | `http://localhost:8080` |
|
|
347
|
+
|
|
348
|
+
`prod` is the Cloudflare edge. `staging` and `dev` are DNS aliases on Vercel
|
|
349
|
+
(`v2.staging.api` → `staging.api.caraer.com`, `v2.dev.api` → `dev.api.caraer.com`)
|
|
350
|
+
and are not proxied through Cloudflare.
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
caraer profile list
|
|
354
|
+
caraer profile use staging
|
|
355
|
+
caraer profile set --base-url https://api.caraer.com --output json
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
`--profile <name>` overrides the active profile for a single command.
|
|
359
|
+
|
|
360
|
+
## Sandboxes
|
|
361
|
+
|
|
362
|
+
A sandbox clones the selected company's Neo4j database. The company stays the
|
|
363
|
+
same. Each company can have at most 3 active sandboxes.
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
caraer company select <company-uuid>
|
|
367
|
+
caraer sandbox create --name my-test
|
|
368
|
+
caraer sandbox use <sandbox-uuid>
|
|
369
|
+
caraer sandbox clear
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Sandboxes isolate Neo4j data. Function runtime code is still the deployed
|
|
373
|
+
build. Preview a push with `caraer apps push --dry-run` before you deploy.
|
|
374
|
+
|
|
375
|
+
## Command groups
|
|
376
|
+
|
|
377
|
+
- `auth`, `company`, `profile` — session and which API you talk to
|
|
378
|
+
- `apps` — scaffold, validate, push, logs, local dev, delete (private apps)
|
|
379
|
+
- `webhooks` — formats, events, and test helpers
|
|
380
|
+
- `publish` — marketplace review for public apps
|
|
381
|
+
- `sandbox` — Neo4j clone of the selected company
|
|
382
|
+
- `skill` — install the Cursor agent skills shipped with the CLI
|
|
383
|
+
|
|
384
|
+
## Further reading
|
|
385
|
+
|
|
386
|
+
- [Serverless functions](docs/functions.md)
|
|
387
|
+
- [CMS modules](docs/modules.md)
|
|
388
|
+
- [Webhooks](docs/webhooks.md)
|
|
389
|
+
- [App lifecycle hooks](docs/app_lifecycle.md)
|
|
390
|
+
- [Scheduled functions](docs/schedules.md)
|
|
391
|
+
- [Inbound routes](docs/inbound.md)
|
|
392
|
+
- [Platform versioning](docs/platform_versioning.md)
|
|
393
|
+
- [Backend contract](docs/backend_contract.md)
|
|
394
|
+
- [Changelog](CHANGELOG.md)
|
|
395
|
+
- [Security](SECURITY.md)
|
|
396
|
+
- Agent skills: [`skills/caraer-apps`](skills/caraer-apps), [`skills/caraer-cms`](skills/caraer-cms)
|
|
397
|
+
|
|
398
|
+
## License
|
|
399
|
+
|
|
400
|
+
Proprietary — see [LICENSE](LICENSE).
|