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.
Files changed (253) hide show
  1. caraer_cli-0.1.4/AGENTS.md +15 -0
  2. caraer_cli-0.1.4/CHANGELOG.md +209 -0
  3. caraer_cli-0.1.4/PKG-INFO +400 -0
  4. caraer_cli-0.1.4/README.md +363 -0
  5. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/__init__.py +1 -1
  6. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/apps.py +47 -11
  7. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/client.py +7 -2
  8. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/installation.py +12 -0
  9. caraer_cli-0.1.4/caraer_cli/api/modules.py +49 -0
  10. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/projects.py +53 -0
  11. caraer_cli-0.1.4/caraer_cli/app_install.py +41 -0
  12. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/app_sync.py +288 -20
  13. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/apps_local.py +19 -9
  14. caraer_cli-0.1.4/caraer_cli/commands/apps.py +1090 -0
  15. caraer_cli-0.1.4/caraer_cli/commands/apps_add.py +695 -0
  16. caraer_cli-0.1.4/caraer_cli/commands/apps_local.py +447 -0
  17. caraer_cli-0.1.4/caraer_cli/commands/apps_release.py +335 -0
  18. caraer_cli-0.1.4/caraer_cli/commands/deprecation.py +97 -0
  19. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/publish.py +18 -0
  20. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/skill.py +66 -37
  21. caraer_cli-0.1.4/caraer_cli/commands/webhooks.py +152 -0
  22. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/completion_callbacks.py +13 -1
  23. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/context.py +7 -0
  24. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/formatters/output.py +5 -3
  25. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/__init__.py +4 -0
  26. caraer_cli-0.1.4/caraer_cli/project/app_bars_sync.py +373 -0
  27. caraer_cli-0.1.4/caraer_cli/project/app_manifest_template.py +76 -0
  28. caraer_cli-0.1.4/caraer_cli/project/code_manifest.py +97 -0
  29. caraer_cli-0.1.4/caraer_cli/project/function_files.py +264 -0
  30. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/inbound_sync.py +51 -2
  31. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/json_schemas.py +1 -5
  32. caraer_cli-0.1.4/caraer_cli/project/layout_upgrade.py +388 -0
  33. caraer_cli-0.1.4/caraer_cli/project/lifecycle_sync.py +207 -0
  34. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/local_dev.py +82 -5
  35. caraer_cli-0.1.4/caraer_cli/project/local_installation_db.py +87 -0
  36. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/manifest_edit.py +8 -1
  37. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/marketplace_assemble.py +82 -20
  38. caraer_cli-0.1.4/caraer_cli/project/modules_codegen.py +194 -0
  39. caraer_cli-0.1.4/caraer_cli/project/modules_dev.py +2649 -0
  40. caraer_cli-0.1.4/caraer_cli/project/modules_dev_api.py +176 -0
  41. caraer_cli-0.1.4/caraer_cli/project/modules_manifest.py +453 -0
  42. caraer_cli-0.1.4/caraer_cli/project/modules_publish.py +393 -0
  43. caraer_cli-0.1.4/caraer_cli/project/modules_scaffold.py +192 -0
  44. caraer_cli-0.1.4/caraer_cli/project/modules_sync.py +237 -0
  45. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/oauth_providers_sync.py +5 -0
  46. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/paths.py +69 -2
  47. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/push_plan.py +1 -1
  48. caraer_cli-0.1.4/caraer_cli/project/scaffold.py +916 -0
  49. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/schedules_sync.py +46 -1
  50. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/schema.py +14 -3
  51. caraer_cli-0.1.4/caraer_cli/project/settings_sections_sync.py +101 -0
  52. caraer_cli-0.1.4/caraer_cli/project/settings_sync.py +428 -0
  53. caraer_cli-0.1.4/caraer_cli/project/sync.py +651 -0
  54. caraer_cli-0.1.4/caraer_cli/project/validate_app.py +2293 -0
  55. caraer_cli-0.1.4/caraer_cli/project/webhook_label.py +73 -0
  56. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/webhooks_sync.py +162 -13
  57. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/state/config.py +100 -9
  58. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/catalog.py +56 -3
  59. caraer_cli-0.1.4/caraer_cli/wizard/marketplace.py +786 -0
  60. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/public_app.py +79 -42
  61. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/scope_macros.py +138 -0
  62. caraer_cli-0.1.4/docs/agents/domain.md +51 -0
  63. caraer_cli-0.1.4/docs/agents/issue-tracker.md +45 -0
  64. caraer_cli-0.1.4/docs/agents/triage-labels.md +15 -0
  65. caraer_cli-0.1.4/docs/app_lifecycle.md +173 -0
  66. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/docs/backend_contract.md +22 -5
  67. caraer_cli-0.1.4/docs/functions.md +178 -0
  68. caraer_cli-0.1.4/docs/inbound.md +58 -0
  69. caraer_cli-0.1.4/docs/modules.md +100 -0
  70. caraer_cli-0.1.4/docs/platform_versioning.md +90 -0
  71. caraer_cli-0.1.4/docs/schedules.md +53 -0
  72. caraer_cli-0.1.4/docs/webhooks.md +284 -0
  73. caraer_cli-0.1.4/examples/README.md +33 -0
  74. caraer_cli-0.1.4/examples/layout-v21/.env.example +2 -0
  75. caraer_cli-0.1.4/examples/layout-v21/.gitignore +5 -0
  76. caraer_cli-0.1.4/examples/layout-v21/README.md +146 -0
  77. caraer_cli-0.1.4/examples/layout-v21/caraer.json +9 -0
  78. caraer_cli-0.1.4/examples/layout-v21/package.json +19 -0
  79. caraer_cli-0.1.4/examples/layout-v21/src/app/app.caraer.yaml +20 -0
  80. caraer_cli-0.1.4/examples/layout-v21/src/app/appbars/list-dialog-options.js +21 -0
  81. caraer_cli-0.1.4/examples/layout-v21/src/app/appbars/ping.js +307 -0
  82. caraer_cli-0.1.4/examples/layout-v21/src/app/functions/due-date.js +25 -0
  83. caraer_cli-0.1.4/examples/layout-v21/src/app/functions/hello-world.js +43 -0
  84. caraer_cli-0.1.4/examples/layout-v21/src/app/inbound/echo.js +27 -0
  85. caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/install.js +43 -0
  86. caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/rotate.js +16 -0
  87. caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/uninstall.js +15 -0
  88. caraer_cli-0.1.4/examples/layout-v21/src/app/lifecycle/update.js +23 -0
  89. caraer_cli-0.1.4/examples/layout-v21/src/app/modules/hello_world/hello_world.astro +76 -0
  90. caraer_cli-0.1.4/examples/layout-v21/src/app/modules/hello_world/types.d.ts +23 -0
  91. caraer_cli-0.1.4/examples/layout-v21/src/app/schedules/heartbeat.js +22 -0
  92. caraer_cli-0.1.4/examples/layout-v21/src/app/settings.yaml +39 -0
  93. caraer_cli-0.1.4/examples/layout-v21/src/app/shared/index.js +142 -0
  94. caraer_cli-0.1.4/examples/layout-v21/src/app/webhooks/candidate-updated.yaml +7 -0
  95. caraer_cli-0.1.4/examples/layout-v21/tsconfig.json +12 -0
  96. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/README.md +4 -5
  97. caraer_cli-0.1.4/examples/webhook-inbox/package.json +14 -0
  98. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/app.caraer.yaml +2 -10
  99. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/pyproject.toml +1 -1
  100. caraer_cli-0.1.4/schemas/app.caraer.schema.json +557 -0
  101. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/function.caraer.schema.json +1 -1
  102. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/inbound.caraer.schema.json +1 -1
  103. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/lifecycle.caraer.schema.json +5 -1
  104. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/schedule.caraer.schema.json +1 -1
  105. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/schemas/webhook.caraer.schema.json +2 -2
  106. caraer_cli-0.1.4/skills/caraer-apps/SKILL.md +255 -0
  107. caraer_cli-0.1.4/skills/caraer-apps/reference.md +457 -0
  108. caraer_cli-0.1.4/skills/caraer-cms/SKILL.md +109 -0
  109. caraer_cli-0.1.4/skills/caraer-cms/reference.md +55 -0
  110. caraer_cli-0.1.4/tests/unit/test_add_scaffolds.py +183 -0
  111. caraer_cli-0.1.4/tests/unit/test_app_bars_sync.py +143 -0
  112. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_app_detail.py +0 -1
  113. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_app_manifest_yaml.py +8 -4
  114. caraer_cli-0.1.4/tests/unit/test_app_root_precedence.py +69 -0
  115. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_app_sync.py +43 -0
  116. caraer_cli-0.1.4/tests/unit/test_apps_command_tree.py +121 -0
  117. caraer_cli-0.1.4/tests/unit/test_apps_install.py +176 -0
  118. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_apps_wizard.py +56 -11
  119. caraer_cli-0.1.4/tests/unit/test_config.py +92 -0
  120. caraer_cli-0.1.4/tests/unit/test_example_layout_v21.py +15 -0
  121. caraer_cli-0.1.4/tests/unit/test_layout_v21.py +555 -0
  122. caraer_cli-0.1.4/tests/unit/test_local_app.py +216 -0
  123. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_local_dev.py +2 -2
  124. caraer_cli-0.1.4/tests/unit/test_marketplace_assemble.py +331 -0
  125. caraer_cli-0.1.4/tests/unit/test_modules.py +711 -0
  126. caraer_cli-0.1.4/tests/unit/test_modules_dev.py +193 -0
  127. caraer_cli-0.1.4/tests/unit/test_modules_dev_api.py +122 -0
  128. caraer_cli-0.1.4/tests/unit/test_modules_publish.py +151 -0
  129. caraer_cli-0.1.4/tests/unit/test_private_apps.py +97 -0
  130. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_project_schema.py +66 -6
  131. caraer_cli-0.1.4/tests/unit/test_prompt_schedule.py +200 -0
  132. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_push_plan.py +4 -2
  133. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_resolve_function.py +3 -1
  134. caraer_cli-0.1.4/tests/unit/test_setting_field_wizard.py +150 -0
  135. caraer_cli-0.1.4/tests/unit/test_settings_sync.py +126 -0
  136. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_skill_install.py +22 -1
  137. caraer_cli-0.1.4/tests/unit/test_validate_app.py +609 -0
  138. caraer_cli-0.1.4/tests/unit/test_visible_when_parsing.py +48 -0
  139. caraer_cli-0.1.4/tests/unit/test_webhook_label.py +28 -0
  140. caraer_cli-0.1.4/tests/unit/test_webhooks_cmd.py +141 -0
  141. caraer_cli-0.1.4/uv.lock +1173 -0
  142. caraer_cli-0.1.2/CHANGELOG.md +0 -73
  143. caraer_cli-0.1.2/PKG-INFO +0 -266
  144. caraer_cli-0.1.2/README.md +0 -229
  145. caraer_cli-0.1.2/caraer_cli/commands/apps.py +0 -2025
  146. caraer_cli-0.1.2/caraer_cli/commands/webhooks.py +0 -68
  147. caraer_cli-0.1.2/caraer_cli/project/app_bars_sync.py +0 -154
  148. caraer_cli-0.1.2/caraer_cli/project/app_manifest_template.py +0 -68
  149. caraer_cli-0.1.2/caraer_cli/project/lifecycle_sync.py +0 -119
  150. caraer_cli-0.1.2/caraer_cli/project/pricing_sync.py +0 -81
  151. caraer_cli-0.1.2/caraer_cli/project/scaffold.py +0 -537
  152. caraer_cli-0.1.2/caraer_cli/project/settings_sync.py +0 -77
  153. caraer_cli-0.1.2/caraer_cli/project/sync.py +0 -308
  154. caraer_cli-0.1.2/caraer_cli/project/typegen.py +0 -278
  155. caraer_cli-0.1.2/caraer_cli/project/validate_app.py +0 -1215
  156. caraer_cli-0.1.2/caraer_cli/wizard/marketplace.py +0 -350
  157. caraer_cli-0.1.2/docs/app_lifecycle.md +0 -135
  158. caraer_cli-0.1.2/docs/platform_versioning.md +0 -46
  159. caraer_cli-0.1.2/examples/README.md +0 -19
  160. caraer_cli-0.1.2/examples/webhook-inbox/src/types/caraer.d.ts +0 -115
  161. caraer_cli-0.1.2/schemas/app.caraer.schema.json +0 -175
  162. caraer_cli-0.1.2/skills/caraer-apps/SKILL.md +0 -172
  163. caraer_cli-0.1.2/skills/caraer-apps/reference.md +0 -163
  164. caraer_cli-0.1.2/tests/unit/test_add_scaffolds.py +0 -66
  165. caraer_cli-0.1.2/tests/unit/test_config.py +0 -8
  166. caraer_cli-0.1.2/tests/unit/test_local_app.py +0 -119
  167. caraer_cli-0.1.2/tests/unit/test_manifest_edit.py +0 -36
  168. caraer_cli-0.1.2/tests/unit/test_marketplace_assemble.py +0 -104
  169. caraer_cli-0.1.2/tests/unit/test_migrate_v2.py +0 -46
  170. caraer_cli-0.1.2/tests/unit/test_typegen.py +0 -31
  171. caraer_cli-0.1.2/tests/unit/test_validate_app.py +0 -180
  172. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/.github/workflows/ci.yml +0 -0
  173. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/.github/workflows/publish.yml +0 -0
  174. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/.gitignore +0 -0
  175. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/CONTRIBUTING.md +0 -0
  176. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/LICENSE +0 -0
  177. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/SECURITY.md +0 -0
  178. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/__init__.py +0 -0
  179. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/auth.py +0 -0
  180. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/functions.py +0 -0
  181. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/integration_runtime.py +0 -0
  182. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/sandboxes.py +0 -0
  183. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/api/webhooks.py +0 -0
  184. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/__init__.py +0 -0
  185. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/auth.py +0 -0
  186. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/company.py +0 -0
  187. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/installation.py +0 -0
  188. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/profile.py +0 -0
  189. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/commands/sandbox.py +0 -0
  190. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/completion.py +0 -0
  191. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/errors.py +0 -0
  192. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/formatters/__init__.py +0 -0
  193. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/formatters/timestamps.py +0 -0
  194. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/install_completion.py +0 -0
  195. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/local_app.py +0 -0
  196. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/main.py +0 -0
  197. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/models/__init__.py +0 -0
  198. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/models/api.py +0 -0
  199. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/release.py +0 -0
  200. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/project/state.py +0 -0
  201. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/resolve.py +0 -0
  202. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/skills/.gitkeep +0 -0
  203. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/state/__init__.py +0 -0
  204. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/state/session.py +0 -0
  205. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/utils.py +0 -0
  206. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/__init__.py +0 -0
  207. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/caraer_cli/wizard/prompts.py +0 -0
  208. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/.env.example +0 -0
  209. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/.gitignore +0 -0
  210. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/caraer.json +0 -0
  211. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/catch/function.caraer.json +0 -0
  212. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/catch/index.js +0 -0
  213. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/catch/shared.js +0 -0
  214. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/clear-inbox/function.caraer.json +0 -0
  215. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/clear-inbox/index.js +0 -0
  216. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/clear-inbox/shared.js +0 -0
  217. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/heartbeat/function.caraer.json +0 -0
  218. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/heartbeat/index.js +0 -0
  219. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/heartbeat/shared.js +0 -0
  220. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-install/function.caraer.json +0 -0
  221. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-install/index.js +0 -0
  222. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-install/shared.js +0 -0
  223. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-rotate/function.caraer.json +0 -0
  224. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-rotate/index.js +0 -0
  225. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-rotate/shared.js +0 -0
  226. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-uninstall/function.caraer.json +0 -0
  227. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-uninstall/index.js +0 -0
  228. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-uninstall/shared.js +0 -0
  229. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-update/function.caraer.json +0 -0
  230. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-update/index.js +0 -0
  231. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/functions/on-update/shared.js +0 -0
  232. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/inbound/catch.json +0 -0
  233. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/install.json +0 -0
  234. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/rotate.json +0 -0
  235. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/uninstall.json +0 -0
  236. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/lifecycle/update.json +0 -0
  237. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/examples/webhook-inbox/src/app/schedules/heartbeat.json +0 -0
  238. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/scripts/ci.sh +0 -0
  239. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/scripts/install.sh +0 -0
  240. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/contract/README.md +0 -0
  241. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/integration/README.md +0 -0
  242. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_apps_local.py +0 -0
  243. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_command_help.py +0 -0
  244. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_completion.py +0 -0
  245. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_errors.py +0 -0
  246. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_output.py +0 -0
  247. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_profile.py +0 -0
  248. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_release.py +0 -0
  249. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_require_text.py +0 -0
  250. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_resolve.py +0 -0
  251. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_timestamps.py +0 -0
  252. {caraer_cli-0.1.2 → caraer_cli-0.1.4}/tests/unit/test_utils.py +0 -0
  253. {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).