recala-cli 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. recala_cli-0.6.0/.gitignore +262 -0
  2. recala_cli-0.6.0/CHANGELOG.md +128 -0
  3. recala_cli-0.6.0/PKG-INFO +63 -0
  4. recala_cli-0.6.0/README.md +40 -0
  5. recala_cli-0.6.0/pyproject.toml +46 -0
  6. recala_cli-0.6.0/scripts/check-dogfood.sh +87 -0
  7. recala_cli-0.6.0/scripts/release.py +187 -0
  8. recala_cli-0.6.0/src/recala_cli/__init__.py +3 -0
  9. recala_cli-0.6.0/src/recala_cli/__main__.py +3 -0
  10. recala_cli-0.6.0/src/recala_cli/article_runs.py +372 -0
  11. recala_cli-0.6.0/src/recala_cli/auth.py +196 -0
  12. recala_cli-0.6.0/src/recala_cli/client.py +103 -0
  13. recala_cli-0.6.0/src/recala_cli/commands/__init__.py +1 -0
  14. recala_cli-0.6.0/src/recala_cli/commands/article.py +835 -0
  15. recala_cli-0.6.0/src/recala_cli/commands/auth.py +207 -0
  16. recala_cli-0.6.0/src/recala_cli/commands/billing.py +76 -0
  17. recala_cli-0.6.0/src/recala_cli/commands/bing.py +164 -0
  18. recala_cli-0.6.0/src/recala_cli/commands/cadence.py +217 -0
  19. recala_cli-0.6.0/src/recala_cli/commands/connect.py +395 -0
  20. recala_cli-0.6.0/src/recala_cli/commands/credits.py +46 -0
  21. recala_cli-0.6.0/src/recala_cli/commands/faithful_translations.py +70 -0
  22. recala_cli-0.6.0/src/recala_cli/commands/gsc.py +79 -0
  23. recala_cli-0.6.0/src/recala_cli/commands/index.py +293 -0
  24. recala_cli-0.6.0/src/recala_cli/commands/keys.py +98 -0
  25. recala_cli-0.6.0/src/recala_cli/commands/knowledge.py +245 -0
  26. recala_cli-0.6.0/src/recala_cli/commands/languages.py +119 -0
  27. recala_cli-0.6.0/src/recala_cli/commands/monthly_report.py +152 -0
  28. recala_cli-0.6.0/src/recala_cli/commands/notifications.py +106 -0
  29. recala_cli-0.6.0/src/recala_cli/commands/onboard.py +237 -0
  30. recala_cli-0.6.0/src/recala_cli/commands/org.py +352 -0
  31. recala_cli-0.6.0/src/recala_cli/commands/profile.py +70 -0
  32. recala_cli-0.6.0/src/recala_cli/commands/questions.py +246 -0
  33. recala_cli-0.6.0/src/recala_cli/commands/reads.py +320 -0
  34. recala_cli-0.6.0/src/recala_cli/commands/refresh.py +138 -0
  35. recala_cli-0.6.0/src/recala_cli/commands/refusals.py +20 -0
  36. recala_cli-0.6.0/src/recala_cli/commands/schema.py +47 -0
  37. recala_cli-0.6.0/src/recala_cli/commands/shell.py +81 -0
  38. recala_cli-0.6.0/src/recala_cli/commands/skills.py +92 -0
  39. recala_cli-0.6.0/src/recala_cli/commands/slot_topic.py +94 -0
  40. recala_cli-0.6.0/src/recala_cli/commands/status.py +153 -0
  41. recala_cli-0.6.0/src/recala_cli/commands/topics.py +328 -0
  42. recala_cli-0.6.0/src/recala_cli/config.py +176 -0
  43. recala_cli-0.6.0/src/recala_cli/confirm.py +137 -0
  44. recala_cli-0.6.0/src/recala_cli/display.py +40 -0
  45. recala_cli-0.6.0/src/recala_cli/endpoints.py +258 -0
  46. recala_cli-0.6.0/src/recala_cli/errors.py +220 -0
  47. recala_cli-0.6.0/src/recala_cli/human.py +324 -0
  48. recala_cli-0.6.0/src/recala_cli/ids.py +139 -0
  49. recala_cli-0.6.0/src/recala_cli/labels.py +74 -0
  50. recala_cli-0.6.0/src/recala_cli/main.py +129 -0
  51. recala_cli-0.6.0/src/recala_cli/onboarding.py +522 -0
  52. recala_cli-0.6.0/src/recala_cli/organizations.py +197 -0
  53. recala_cli-0.6.0/src/recala_cli/output.py +34 -0
  54. recala_cli-0.6.0/src/recala_cli/parallel.py +18 -0
  55. recala_cli-0.6.0/src/recala_cli/polling.py +102 -0
  56. recala_cli-0.6.0/src/recala_cli/prompts.py +88 -0
  57. recala_cli-0.6.0/src/recala_cli/runtime.py +216 -0
  58. recala_cli-0.6.0/src/recala_cli/search_numbers.py +22 -0
  59. recala_cli-0.6.0/src/recala_cli/skills/recala-apply-revision-notes/SKILL.md +39 -0
  60. recala_cli-0.6.0/src/recala_cli/skills/recala-article-signoff/SKILL.md +67 -0
  61. recala_cli-0.6.0/src/recala_cli/skills/recala-cli-contract.md +78 -0
  62. recala_cli-0.6.0/src/recala_cli/skills/recala-connect-search-console/SKILL.md +29 -0
  63. recala_cli-0.6.0/src/recala_cli/skills/recala-onboard/SKILL.md +25 -0
  64. recala_cli-0.6.0/src/recala_cli/skills/recala-onboard-brand/SKILL.md +25 -0
  65. recala_cli-0.6.0/src/recala_cli/skills/recala-plan-month/SKILL.md +33 -0
  66. recala_cli-0.6.0/src/recala_cli/skills/recala-schedule-approved/SKILL.md +36 -0
  67. recala_cli-0.6.0/src/recala_cli/skills/recala-weekly-authority-report/SKILL.md +35 -0
  68. recala_cli-0.6.0/src/recala_cli/ui.py +260 -0
  69. recala_cli-0.6.0/src/recala_cli/updates.py +43 -0
  70. recala_cli-0.6.0/src/recala_cli/views.py +372 -0
  71. recala_cli-0.6.0/tests/conftest.py +120 -0
  72. recala_cli-0.6.0/tests/distribution/test_public_install.py +774 -0
  73. recala_cli-0.6.0/tests/fixtures/hold_text_json.json +167 -0
  74. recala_cli-0.6.0/tests/fixtures/human_output_pass1_json.json +10 -0
  75. recala_cli-0.6.0/tests/fixtures/machine_contract_main.json +787 -0
  76. recala_cli-0.6.0/tests/test_agent_onboarding.py +552 -0
  77. recala_cli-0.6.0/tests/test_approve_read_receipt.py +24 -0
  78. recala_cli-0.6.0/tests/test_approve_reconfirm.py +82 -0
  79. recala_cli-0.6.0/tests/test_article_id_output.py +44 -0
  80. recala_cli-0.6.0/tests/test_billing_invoices.py +56 -0
  81. recala_cli-0.6.0/tests/test_billing_link.py +64 -0
  82. recala_cli-0.6.0/tests/test_bing.py +150 -0
  83. recala_cli-0.6.0/tests/test_c2_onboarding.py +487 -0
  84. recala_cli-0.6.0/tests/test_cadence.py +170 -0
  85. recala_cli-0.6.0/tests/test_calendar_matches_plan.py +65 -0
  86. recala_cli-0.6.0/tests/test_calendar_slots.py +377 -0
  87. recala_cli-0.6.0/tests/test_confirm.py +186 -0
  88. recala_cli-0.6.0/tests/test_connect_and_status.py +367 -0
  89. recala_cli-0.6.0/tests/test_content_commands.py +583 -0
  90. recala_cli-0.6.0/tests/test_core_errors.py +41 -0
  91. recala_cli-0.6.0/tests/test_core_release.py +73 -0
  92. recala_cli-0.6.0/tests/test_core_root.py +163 -0
  93. recala_cli-0.6.0/tests/test_core_short_ids.py +95 -0
  94. recala_cli-0.6.0/tests/test_core_speed.py +68 -0
  95. recala_cli-0.6.0/tests/test_core_status_speed.py +43 -0
  96. recala_cli-0.6.0/tests/test_credits.py +109 -0
  97. recala_cli-0.6.0/tests/test_dogfood_fixes.py +1209 -0
  98. recala_cli-0.6.0/tests/test_dogfood_status.py +99 -0
  99. recala_cli-0.6.0/tests/test_edit_link_warnings.py +31 -0
  100. recala_cli-0.6.0/tests/test_errors.py +193 -0
  101. recala_cli-0.6.0/tests/test_faithful_translation_settings.py +122 -0
  102. recala_cli-0.6.0/tests/test_gsc.py +89 -0
  103. recala_cli-0.6.0/tests/test_help_listing.py +42 -0
  104. recala_cli-0.6.0/tests/test_hold_finding_sentences.py +59 -0
  105. recala_cli-0.6.0/tests/test_hold_text.py +334 -0
  106. recala_cli-0.6.0/tests/test_human_output_pass1.py +352 -0
  107. recala_cli-0.6.0/tests/test_human_readable.py +304 -0
  108. recala_cli-0.6.0/tests/test_index.py +234 -0
  109. recala_cli-0.6.0/tests/test_keys.py +83 -0
  110. recala_cli-0.6.0/tests/test_knowledge_admit.py +106 -0
  111. recala_cli-0.6.0/tests/test_languages.py +107 -0
  112. recala_cli-0.6.0/tests/test_login.py +202 -0
  113. recala_cli-0.6.0/tests/test_machine_contract.py +94 -0
  114. recala_cli-0.6.0/tests/test_monthly_report.py +120 -0
  115. recala_cli-0.6.0/tests/test_notifications.py +112 -0
  116. recala_cli-0.6.0/tests/test_onboarding_channel.py +7 -0
  117. recala_cli-0.6.0/tests/test_onboarding_commands.py +190 -0
  118. recala_cli-0.6.0/tests/test_org.py +118 -0
  119. recala_cli-0.6.0/tests/test_org_readable.py +262 -0
  120. recala_cli-0.6.0/tests/test_poll_pacing.py +122 -0
  121. recala_cli-0.6.0/tests/test_profile.py +58 -0
  122. recala_cli-0.6.0/tests/test_publish_commands.py +410 -0
  123. recala_cli-0.6.0/tests/test_questions.py +379 -0
  124. recala_cli-0.6.0/tests/test_questions_in_words.py +32 -0
  125. recala_cli-0.6.0/tests/test_recheck_findings.py +181 -0
  126. recala_cli-0.6.0/tests/test_refresh.py +120 -0
  127. recala_cli-0.6.0/tests/test_rerun_refusal.py +156 -0
  128. recala_cli-0.6.0/tests/test_review_hardening.py +187 -0
  129. recala_cli-0.6.0/tests/test_review_round3.py +296 -0
  130. recala_cli-0.6.0/tests/test_scan_reports_what_was_found.py +70 -0
  131. recala_cli-0.6.0/tests/test_search_numbers.py +16 -0
  132. recala_cli-0.6.0/tests/test_short_id_selectors.py +258 -0
  133. recala_cli-0.6.0/tests/test_skills.py +94 -0
  134. recala_cli-0.6.0/tests/test_slot_topic.py +122 -0
  135. recala_cli-0.6.0/tests/test_times_in_company_zone.py +73 -0
  136. recala_cli-0.6.0/tests/test_topics.py +67 -0
  137. recala_cli-0.6.0/tests/test_topics_add.py +56 -0
  138. recala_cli-0.6.0/tests/test_topics_one_call.py +53 -0
  139. recala_cli-0.6.0/tests/test_ui.py +303 -0
  140. recala_cli-0.6.0/tests/test_view_surface.py +83 -0
  141. recala_cli-0.6.0/tests/test_whoami.py +63 -0
  142. recala_cli-0.6.0/tests/test_write_flags.py +126 -0
  143. recala_cli-0.6.0/uv.lock +172 -0
@@ -0,0 +1,262 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ dist/
6
+ .venv/
7
+ venv/
8
+
9
+ # Node
10
+ node_modules/
11
+ .astro/
12
+
13
+ # Environment
14
+ .env
15
+ .env.local
16
+ .env.production
17
+ .env.test
18
+ !apps/web/.env.production
19
+
20
+ # Backup files
21
+ *.bak
22
+
23
+ # IDE
24
+ .vscode/
25
+ .idea/
26
+
27
+ # Claude Code session state — must NEVER be committed.
28
+ # `.claude/worktrees/` holds short-lived per-agent working dirs (see
29
+ # docs/parallel_claude_sessions.md). Anything in `.claude/` is local
30
+ # scratch state for the running session, not source code.
31
+ .claude/
32
+
33
+ # OS
34
+ .DS_Store
35
+ Thumbs.db
36
+
37
+ # Build
38
+ apps/web/dist/
39
+ apps/api/dist/
40
+
41
+ # Coverage
42
+ coverage.xml
43
+ .coverage
44
+ htmlcov/
45
+
46
+ # Netlify
47
+ .netlify/
48
+
49
+ # Supabase CLI ephemeral state
50
+ supabase/.branches/
51
+ supabase/.temp/
52
+
53
+ # Playwright / MCP test artifacts
54
+ .playwright-mcp/
55
+ playwright-report/
56
+ test-results/
57
+ /apps/api/ab_test_output/
58
+ /apps/api/niche_test_output/
59
+ /apps/api/test_output/
60
+ /apps/video/out/
61
+ /baseline_articles/
62
+ *.png
63
+ *.jpg
64
+ *.jpeg
65
+ *.webp
66
+ *.gif
67
+ # But DO ship transactional-email assets (referenced by absolute URL from
68
+ # email templates, must deploy to https://recala.co/email/...)
69
+ !apps/web/public/email/**
70
+ # ...and the social-share og:image rendered by apps/web/scripts/og/render-og.mjs
71
+ !apps/web/public/og-home.png
72
+ # ...and the favicon / app-icon set rendered by apps/web/scripts/brand/build-favicons.mjs
73
+ !apps/web/public/favicon.png
74
+ !apps/web/public/favicon-32x32.png
75
+ !apps/web/public/apple-touch-icon.png
76
+ !apps/web/public/icon-192.png
77
+ !apps/web/public/icon-512.png
78
+ # ...and the square wordmark logo that Organization.logo points at (apps/web/src/lib/brand.ts)
79
+ !apps/web/public/logo.png
80
+ # ...and the landing film's poster frame (apps/web/src/components/landing/funnel/FunnelFilm.astro)
81
+ !apps/web/public/video/recala-film-poster.webp
82
+ /niche_test_output
83
+ /test_output
84
+ /product-hunt*
85
+ /result*
86
+ !/apps/api/src/writer/acceptance/result.py
87
+ /article*.md
88
+ /canary*.md
89
+ /baseline_articles/baseline_results.json
90
+
91
+ # Compounding-loop durable artifacts — keep these committed (they are baselines
92
+ # and ledgers, not scratch runs; the /tmp wipe of 2026-06-12 lost b0_baseline)
93
+ !apps/api/results/b0_baseline.jsonl
94
+ !apps/api/results/b0_cohort.json
95
+ !apps/api/results/loop_ledger.jsonl
96
+ apps/api/docs/gold_standard/evidence/
97
+ apps/api/docs/gold_standard/images_canary_*/*.png
98
+
99
+ # Semaforo de las baterias de mutacion (tests/conftest.py). Efimero por diseno.
100
+ .mutation-running
101
+
102
+ # Token OAuth de WordPress (harness/authorize_wordpress.py). CREDENCIAL, no artefacto.
103
+ .env.wordpress-token.json
104
+
105
+ # Estado efimero de las baterias de mutacion: nunca se versiona.
106
+ *.pristine
107
+ .mutation-running
108
+ .mutation.lock
109
+
110
+ # Ledgers de corrida — NUNCA versionados.
111
+ # Contienen la evidencia del CLIENTE. Git no es un almacen documental: es historial
112
+ # permanente, replicable y sin borrado real. La verificabilidad NO justifica eso, y
113
+ # ademas no la aporta: la URL que un motor sigue va en el propio articulo. El ledger
114
+ # sirve para auditoria INTERNA, que es otra propiedad. Ver 2026-08-14.
115
+ brain/00_Meta/corpus/ledgers/
116
+
117
+ # Local runtime configuration and independently hosted founder review.
118
+ /.local/
119
+ /tools/launch-review/
120
+
121
+ # Private execution evidence is retained locally; publish selected reports explicitly.
122
+ /brain/30_Investigation/workspace-consolidation-2026-09-14/
123
+
124
+ # Consolidation: preserve raw local research and test output without publishing it
125
+ /brain/00_Meta/brain-hygiene-2026-09-14/before/
126
+ /brain/00_Meta/corpus/aspirational-six/
127
+ /brain/00_Meta/corpus/blind-eval-v1/
128
+ /brain/00_Meta/corpus/blind-eval-v2/
129
+ /brain/00_Meta/corpus/brand-portals-round-03/
130
+ /brain/00_Meta/corpus/brand-portals-round-04/
131
+ /brain/00_Meta/corpus/six-brands-archetypes/
132
+ /brain/00_Meta/corpus/writer-blind-lab-protocol-v2/
133
+ /brain/00_Meta/corpus/writer-blind-lab-protocol-v2-smoke/
134
+ /brain/00_Meta/corpus/writer-blind-lab-v3/
135
+ /brain/00_Meta/corpus/writer-blind-round-02/
136
+ /brain/00_Meta/corpus/writer-blind-round-02-dry-check/
137
+ /brain/30_Investigation/brand-portal-round-03/art-direction-live/browser/
138
+ /brain/30_Investigation/brand-portal-round-03/art-direction-live/grammars/
139
+ /brain/30_Investigation/brand-portal-round-03/browser-qa/
140
+ /brain/30_Investigation/brand-portal-round-03/evidence/
141
+ /brain/30_Investigation/brand-portal-round-03/sources/
142
+ /brain/30_Investigation/brand-portal-round-03/system-integration-pre-signals-private/
143
+ /brain/30_Investigation/brand-portal-round-03/system-integration-private/
144
+ /brain/30_Investigation/brand-portal-round-03/visual-admission-pre-toc-r2-private/
145
+ /brain/30_Investigation/brand-portal-round-03/visual-admission-private/
146
+ /brain/30_Investigation/dogfood-publication-2026-09-14/detector-boundary-fix/before/
147
+ /brain/30_Investigation/dogfood-publication-2026-09-14/detector-modal-stop-fix/before/
148
+ /brain/30_Investigation/dogfood-publication-2026-09-14/publisher-independent-review/pytest-final/
149
+ /brain/30_Investigation/dogfood-publication-2026-09-14/publisher-independent-review/pytest-tmp/
150
+ /brain/30_Investigation/dogfood-publication-2026-09-14/publisher/reused-image-before/
151
+ /brain/30_Investigation/dogfood-publication-2026-09-14/revalidation-adapter/
152
+ /brain/30_Investigation/dogfood-publication-2026-09-14/runtime/
153
+ /brain/30_Investigation/dogfood-publication-2026-09-14/site/
154
+ /brain/30_Investigation/editorial-intake-2026-09-14/admission/
155
+ /brain/30_Investigation/editorial-intake-2026-09-14/editorial-natural/before/
156
+ /brain/30_Investigation/editorial-intake-2026-09-14/editorial-natural/repair-before/
157
+ /brain/30_Investigation/editorial-intake-2026-09-14/editorial-research/.firecrawl/
158
+ /brain/30_Investigation/editorial-intake-2026-09-14/evidence-completion/before/
159
+ /brain/30_Investigation/editorial-intake-2026-09-14/evidence-completion/before-queue-race-repair/
160
+ /brain/30_Investigation/editorial-intake-2026-09-14/evidence-completion/delta-files/
161
+ /brain/30_Investigation/editorial-intake-2026-09-14/evidence-completion/session-start/
162
+ /brain/30_Investigation/editorial-intake-2026-09-14/images/
163
+ /brain/30_Investigation/editorial-intake-2026-09-14/intake-repair/offline_guard/
164
+ /brain/30_Investigation/editorial-intake-2026-09-14/intake-repair/preimages/
165
+ /brain/30_Investigation/editorial-intake-2026-09-14/intake-repair/review-repair/preimages/
166
+ /brain/30_Investigation/editorial-intake-2026-09-14/intake-v2-review/offline_guard/
167
+ /brain/30_Investigation/editorial-intake-2026-09-14/root-repairs/
168
+ /brain/30_Investigation/editorial-intake-2026-09-14/runtime/
169
+ /brain/30_Investigation/editorial-intake-2026-09-14/site/
170
+ /brain/30_Investigation/editorial-intake-2026-09-14/sources/
171
+ /brain/30_Investigation/editorial-intake-2026-09-14/visual-repair/
172
+ /brain/30_Investigation/editorial-intake-2026-09-14/visual-research/.firecrawl/
173
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/corrected-root/
174
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/diagnosis/after/
175
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/diagnosis/before/
176
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/diagnosis/offline_guard/
177
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/documents/native/
178
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/documents/reference/
179
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/native/
180
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/next-intake/admission-ui-v1-preimages/
181
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/next-intake/page-evidence-preimages/
182
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/reference/
183
+ /brain/30_Investigation/ingestion-benchmark-2026-09-09/site/
184
+ /brain/30_Investigation/launch-execution-2026-09-07/company-source-baseline/
185
+ /brain/30_Investigation/launch-execution-2026-09-08/atomic-source-instruction-v1-after/
186
+ /brain/30_Investigation/launch-execution-2026-09-08/atomic-source-instruction-v1-before/
187
+ /brain/30_Investigation/launch-execution-2026-09-08/atomic-source-instruction-v1-red-tests/
188
+ /brain/30_Investigation/launch-execution-2026-09-08/body-effective-retry-v1-after/
189
+ /brain/30_Investigation/launch-execution-2026-09-08/body-effective-retry-v1-before/
190
+ /brain/30_Investigation/launch-execution-2026-09-08/body-effective-retry-v1-red-tests/
191
+ /brain/30_Investigation/launch-execution-2026-09-08/citation-baseline/
192
+ /brain/30_Investigation/launch-execution-2026-09-08/classifier-precision-baseline/
193
+ /brain/30_Investigation/launch-execution-2026-09-08/competitor-publication-v1-after/
194
+ /brain/30_Investigation/launch-execution-2026-09-08/competitor-publication-v1-before/
195
+ /brain/30_Investigation/launch-execution-2026-09-08/competitor-publication-v2-after/
196
+ /brain/30_Investigation/launch-execution-2026-09-08/competitor-publication-v2-before/
197
+ /brain/30_Investigation/launch-execution-2026-09-08/competitor-publication-v3-after/
198
+ /brain/30_Investigation/launch-execution-2026-09-08/competitor-publication-v3-before/
199
+ /brain/30_Investigation/launch-execution-2026-09-08/deliverable-fix-after/
200
+ /brain/30_Investigation/launch-execution-2026-09-08/deliverable-fix-baseline/
201
+ /brain/30_Investigation/launch-execution-2026-09-08/deliverable-fix-v2-after/
202
+ /brain/30_Investigation/launch-execution-2026-09-08/deliverable-independent-tests/
203
+ /brain/30_Investigation/launch-execution-2026-09-08/editorial-handoff-baseline/
204
+ /brain/30_Investigation/launch-execution-2026-09-08/export-completion-baseline/
205
+ /brain/30_Investigation/launch-execution-2026-09-08/export-completion-v1-after/
206
+ /brain/30_Investigation/launch-execution-2026-09-08/export-completion-v2-after/
207
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-after/apps/
208
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-after/src/
209
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-before/apps/
210
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-before/src/
211
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-final-red-tests/
212
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-v2-after/apps/
213
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-v2-after/src/
214
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-v3-after/apps/
215
+ /brain/30_Investigation/launch-execution-2026-09-08/fifth-quality-v3-after/src/
216
+ /brain/30_Investigation/launch-execution-2026-09-08/graph-handbook-anchors-v1-after/
217
+ /brain/30_Investigation/launch-execution-2026-09-08/graph-handbook-anchors-v1-before/
218
+ /brain/30_Investigation/launch-execution-2026-09-08/graph-handbook-anchors-v2-after/
219
+ /brain/30_Investigation/launch-execution-2026-09-08/graph-handbook-anchors-v2-before/
220
+ /brain/30_Investigation/launch-execution-2026-09-08/graph-source-eligibility-v1-after/
221
+ /brain/30_Investigation/launch-execution-2026-09-08/graph-source-eligibility-v1-before/
222
+ /brain/30_Investigation/launch-execution-2026-09-08/hero-receipt-persistence-v1-after/
223
+ /brain/30_Investigation/launch-execution-2026-09-08/hero-receipt-persistence-v1-before/
224
+ /brain/30_Investigation/launch-execution-2026-09-08/image-direction-baseline/
225
+ /brain/30_Investigation/launch-execution-2026-09-08/judge-claim-scope-after/src/
226
+ /brain/30_Investigation/launch-execution-2026-09-08/judge-claim-scope-before/
227
+ /brain/30_Investigation/launch-execution-2026-09-08/judge-claim-scope-v2-after/src/
228
+ /brain/30_Investigation/launch-execution-2026-09-08/judge-claim-scope-v3-after/src/
229
+ /brain/30_Investigation/launch-execution-2026-09-08/judge-claim-scope-v4-after/src/
230
+ /brain/30_Investigation/launch-execution-2026-09-08/judge-token-precision-baseline/
231
+ /brain/30_Investigation/launch-execution-2026-09-08/main-release-independent-guard/
232
+ /brain/30_Investigation/launch-execution-2026-09-08/main-release-v2-guard/
233
+ /brain/30_Investigation/launch-execution-2026-09-08/openai-truncation-baseline/
234
+ /brain/30_Investigation/launch-execution-2026-09-08/quality-independent-tests/
235
+ /brain/30_Investigation/launch-execution-2026-09-08/quality-receipt-fix-baseline/
236
+ /brain/30_Investigation/launch-execution-2026-09-08/queue-commission-after/
237
+ /brain/30_Investigation/launch-execution-2026-09-08/reader-advice-attribution-v1-after/src/
238
+ /brain/30_Investigation/launch-execution-2026-09-08/reader-advice-attribution-v1-before/
239
+ /brain/30_Investigation/launch-execution-2026-09-08/reader-advice-attribution-v2-after/src/
240
+ /brain/30_Investigation/launch-execution-2026-09-08/reader-advice-attribution-v2-before/
241
+ /brain/30_Investigation/launch-execution-2026-09-08/review-lost-write-fixture-v1-after/
242
+ /brain/30_Investigation/launch-execution-2026-09-08/review-lost-write-fixture-v1-before/
243
+ /brain/30_Investigation/launch-execution-2026-09-08/review-lost-write-fixture-v1-staging/
244
+ /brain/30_Investigation/launch-execution-2026-09-08/revise-dangling-after/
245
+ /brain/30_Investigation/launch-execution-2026-09-08/revise-dangling-before/
246
+ /brain/30_Investigation/launch-execution-2026-09-08/scout-discovery-provenance-v1-after/
247
+ /brain/30_Investigation/launch-execution-2026-09-08/scout-discovery-provenance-v1-before/
248
+ /brain/30_Investigation/launch-execution-2026-09-08/section-contract-baseline/
249
+ /brain/30_Investigation/launch-execution-2026-09-08/seventh-quality-v1-after/
250
+ /brain/30_Investigation/launch-execution-2026-09-08/seventh-quality-v1-before/
251
+ /brain/30_Investigation/launch-execution-2026-09-08/seventh-quality-v2-after/
252
+ /brain/30_Investigation/launch-execution-2026-09-08/seventh-quality-v2-before/
253
+ /brain/30_Investigation/launch-execution-2026-09-08/seventh-quality-v3-after/
254
+ /brain/30_Investigation/launch-execution-2026-09-08/seventh-quality-v3-before/
255
+ /brain/30_Investigation/launch-execution-2026-09-08/slot-hero-contract-after/
256
+ /brain/30_Investigation/launch-execution-2026-09-08/slot-hero-contract-before/
257
+ /brain/30_Investigation/launch-execution-2026-09-08/slot-hero-contract-v2-after/
258
+ /brain/30_Investigation/launch-execution-2026-09-08/slot-hero-contract-v2-before/
259
+ /brain/30_Investigation/launch-execution-2026-09-08/structural-labels-baseline/
260
+ /brain/30_Investigation/references-restoration-2026-09-14/runtime/
261
+ /apps/api/.coverage.*
262
+ /apps/api/tests/golden/builder_v3/
@@ -0,0 +1,128 @@
1
+ # CLI changes
2
+
3
+ ## 0.6.0
4
+
5
+ Faster, clearer and complete, and installed from PyPI.
6
+
7
+ Faster
8
+
9
+ - `status` asks each question once and all at the same time: about 13 s for a live company instead of about 48 s. Most of what is left is the server's publication calendar.
10
+ - A company name after `--org` is resolved from the sign-in already read plus names remembered for a day, not one read per company: `whoami --org <name>` about 1–2 s instead of about 6 s.
11
+ - `topics list` and `topics up-next list` read the queue in one call; `index status` reads its articles in parallel.
12
+
13
+ Easier to use
14
+
15
+ - `-h` works everywhere, and `--org` may come before the command (`recala --org acme status`).
16
+ - A mistyped command names the closest real one, in the root and in every group.
17
+ - `recala completion bash|zsh|fish` prints the tab-completion script; `recala update` installs the newest version with the tool that installed it (uv or pipx), or prints both commands.
18
+ - Every command that writes accepts `--dry-run` and `--yes`. A dry run reads and checks everything, sends nothing and says what it would have sent (`--json`: `{"dry_run": true, "sent": false, ...}`). `--yes` still skips a prompt only for a publishing action with an API key that holds `publish`.
19
+ - Authors and knowledge sources take the 8-character id the lists print (`authors edit`, `article person`, `autoapprove on --author`, `knowledge remove`, `knowledge admit`), like articles and topics.
20
+ - `article list --status <state> --language <code>`: filter the list; each row marks its language and a total line closes it.
21
+ - A command run without `--org` names the company it acted on, on stderr (never with `--json`).
22
+
23
+ Clearer output
24
+
25
+ - "Company" everywhere a person reads; `org`, `--org` and the `--json` keys are unchanged.
26
+ - Any server failure reads the same: Recala had a problem on its side, try again in a minute, and where to write. The server's own words stay in `--json` (`details.server_message`). Signed out is one exit code (3) and one sentence on every command, checked before a company is asked for.
27
+ - For a server error, `--json` `message` is now that generic sentence; the server's own text moved to `details.server_message`. Scripts that read `message` for the server's text should read `details.server_message`.
28
+ - Plan and credit lines read for a customer: "5 articles this period, 3 included in the plan", with no "(internal)" and no "6 of 3".
29
+ - Times are in the company's timezone everywhere, including `topics waiting-slots`, `article versions`, `article share`, `index`, `connect status`, `refresh runs` and `notifications list`.
30
+ - A held article's findings are sentences that say what to fix, with units and bounds in words.
31
+ - `calendar` keeps a stopped or waiting date even when it is in the past, as `plan` does; `cadence set --dry-run` merges your change over the saved cadence.
32
+ - `questions show` names failed checks in sentences; `index status` gives Google's verdicts in words.
33
+ - `report authority` lists its six parts under plain names.
34
+ - `topics list` shows 20 per section with "N more: recala topics list --limit 0"; `--json` keeps every row.
35
+ - `authors list` prints the 8-character id, like `knowledge list` and `company show`.
36
+ - `bing data`, `gsc data` and `report monthly` say "1 click" and "1 impression".
37
+ - `connect sitemap` and `cms status` are hidden from help (`index sitemaps show` and `connect status` show the same); both still work.
38
+
39
+ New commands
40
+
41
+ - `company languages show|add|remove`: the extra languages that start translations (one past the company's limit is refused before anything is sent).
42
+ - `company profile show`: the company's default author, voice, positioning and default intent.
43
+ - `notifications list` and `notifications read <id>|--all`: what the portal's bell shows.
44
+ - `report monthly [--month YYYY-MM]` shows the client report; `report monthly share` makes a link anyone can read, after you confirm.
45
+ - `refresh show`: the company's auto-refresh setting, what is due and what it cost this month. `refresh pause <article>` and `refresh resume <article>` stop or restart it for one article; `refresh runs <id>` follows one run. The company-wide switch stays in the portal.
46
+ - `knowledge admit <source>`: admit a ready source for use in articles (`--as own|proposed|researched`).
47
+ - `billing invoices`: the company's invoices, with a portal link for payment changes.
48
+
49
+ Install
50
+
51
+ - Published on PyPI as `recala-cli`: `uv tool install recala-cli` or `pipx install recala-cli`. Releases are built and published from a `cli-v*` tag by trusted publishing.
52
+
53
+ Google Search Console's numbers from the terminal.
54
+
55
+ - `gsc data`: the stored totals, top queries and top pages over Google's final days, like `bing data`. A company that is not connected, must reconnect or has no data yet gets that in words, never a zero. `--json` carries every field.
56
+
57
+ Bing Webmaster Tools from the terminal.
58
+
59
+ - `connect bing`: Microsoft sign-in in the browser, then choose the site.
60
+ - `bing status`, `bing sites`, `bing use` and `bing data`: how fresh the numbers are, which sites are verified, which one is the company's, and the stored totals, top queries and top pages. `--json` carries every field.
61
+
62
+ A date that stopped and waits for a person can take another topic.
63
+
64
+ - `topics waiting-slots`: the dates waiting for a person, why each stopped, and the Up next topics they may take.
65
+ - `topics replace-slot <slot> <topic>`: put one of those topics on the date. Owners and editors, signed in as themselves; API keys are refused. `calendar` names the command on such a date.
66
+
67
+ ## 0.5.3
68
+
69
+ Holds, re-runs and costs in plain words, one id that works everywhere, payment links, Sanity article schemas, and the onboarding fixes from the FundsEarth dogfood (#716, #915, #927, #929). Version 0.5.2 was never published, so this release also carries everything in the 0.5.2 section below.
70
+
71
+ - A held article reads as plain sentences: its title, why (one numbered finding per line), the other reasons, the last check and one next step with the 8-character id. A hold with no explanation asks you to contact support instead of printing a raw code. `--json` output is unchanged.
72
+ - Cost previews and refusals are sentences that name the command that fixes them. A held article's promised free re-run is called a "free re-run" on every plan; a plan credit reads "uses 1 of your plan's articles".
73
+ - `article regenerate`: a re-run the writer refuses now says it was refused, why, what still holds the draft and one next step (exit 6; `--json` carries the details). A refusal for a missing author points at `recala article person`, a run already in progress says to wait, and a daily research stop keeps its reset time. `article status` adds "Last re-run: ..." when one stopped.
74
+ - The 8-character article id the CLI prints works in every article command, including `index`. A malformed id is refused before any request is sent.
75
+ - `article recheck` prints each stopped finding on its own line, prints the refusal header once, and says "1 finding" in the singular.
76
+ - `article approve --read` shows the current text and records that you read it before approving. `--reconfirm-current` refreshes the approval of an already-approved original (human session only).
77
+ - `article create` and `article regenerate` treat a skipped CMS push (auto-publish off) as a normal result: "Ready for review; not pushed to the CMS". `article share --review-link` prints the full review URL, and a disabled review link says why.
78
+ - Add `autoapprove faithful-translations show|enable|disable` (owners; `enable` and `disable` take `--dry-run`): opt in to auto-approving verified translations of articles a person approved (#915). Ordinary auto-approve must also be on.
79
+ - Add `billing link --plan <plan>` (owners): a 30-day payment link for whoever pays, bound to your company. It works once payment links are enabled for the company (#927).
80
+ - Add `authors edit <id>` (owners) to change an author's name, role, bio, links, LinkedIn or expertise; only the fields you pass change.
81
+ - `connect sanity` and `cms connect --provider sanity` accept `--schema-profile post|article` (asked when interactive; default `post`). `status` shows the connected Sanity project, and falls back to the site address when Sanity cannot be read.
82
+ - `connect status` no longer fails when Search Console is not connected; the sitemap is simply not shown.
83
+ - `topics add` puts a manual topic at the top of Up next, prints its title and position, and recovers a half-finished reorder.
84
+ - `calendar` and `plan` say when a day stopped because no topic in the queue has enough of the company's own material, and to answer the material questions or add sources.
85
+ - `company scan` reports what it found instead of "Saved what Recala found" over nothing, and reads a company's catalogue, self-description and palette from its site. A service business's services are saved as its products. AI-overview sources that cannot be read are named as such instead of "other".
86
+ - `company create` says which company is now active and how to switch back; `--no-use` keeps the current one (and no longer claims one is active when there is none).
87
+ - Onboarding previews honour the one free article per email and block a run the gate would refuse; payment hints name `recala billing link`; a deleted company is never switched back to.
88
+ - `credits` and `status` say extras past the allowance are refused (not "comped") for a company without overflow.
89
+ - `topics why` hides empty fields and says what to upload, and with which command, when a topic waits for company material. `knowledge add-url` prints why a page was not added.
90
+ - `--help` lists `company` and `authors` once (`org` and `author` remain aliases), and every command's first sentence fits the help column.
91
+
92
+ ## 0.5.2
93
+
94
+ Correct published articles from the CLI, and read every status view in plain language (#691, #701).
95
+
96
+ - Add `article republish` (with `--dry-run`): sends a corrected article to your site, updating its page or publishing it if it has none. It asks first; a held or unapproved article is refused with the next step.
97
+ - `status` shows questions as "N tracked of M allowed" and AI engines by name; `credits` shows the question allowance as "up to N".
98
+ - Times in `status`, `questions`, `calendar` and `topics why` are in the company's timezone; when none is set, "timezone not set; times in UTC" is said once instead of a bare UTC.
99
+ - `questions` lists the tracked questions by area with each engine's latest result; `--all` shows them all.
100
+ - `topics list`, `topics up-next list` and `org list` put the name first and an 8-character id second. Topic commands and `article create --topic` accept that short id, so a copied short id no longer reaches the API as an invalid id.
101
+ - `topics why` prints plain labels instead of internal codes.
102
+
103
+ ## 0.5.1
104
+
105
+ Fixes the calendar and plan views after the 0.5.0 autopilot work (#683).
106
+
107
+ - `calendar` shows autopilot publication slots in your local time with plain states, and names the recovery command when a slot needs attention.
108
+ - `plan` shows local times and plain states instead of UTC and internal states.
109
+ - A slot is shown once, beside its appointment, instead of twice.
110
+
111
+ ## 0.5.0
112
+
113
+ Builds on resumable agent onboarding (#664).
114
+
115
+ - Reset/interrupted article runs exit 9 immediately with the exact restart command. Failed runs retain their failure code and reason in human output.
116
+ - Preview session and API-key re-runs before confirmation: free re-run or EUR 19. Missing/mismatched cost previews and changed charges require fresh confirmation (exit 10); `--yes` keeps the existing grant rules.
117
+ - JSON calendar responses always include `slots` (an empty list when no cadence slots exist), and `timezone` uses the cadence timezone when available.
118
+ - Published runs say published. Continuing runs and daily research-limit refusals no longer advertise a blind retry.
119
+ - Start article creation asynchronously, wait through short status requests, detach with Ctrl-C or `--no-wait`, and resume with `article run`. Held/failed outcomes use exit 6; daily research allowance stops use exit 8.
120
+ - Add `article regenerate` and `article recheck` with named confirmation, server eligibility, charge mode and clear results. Draft approval names `article submit`; schedule previews honor `--tz`.
121
+ - Refresh expired sessions silently and explain re-login when needed. Refuse legacy credentials before an ineffective all-write grant.
122
+ - Name topics, articles and signers in human output, including pipes. List companies name-first and articles with dates. Keep topic rationale readable.
123
+ - Add `topics up-next list|add|remove|move`; approval explains the next step. Fetch all visible topic pages consistently for humans and JSON.
124
+ - Show cadence slots and publication times in the cadence timezone. Preserve failed-slot reasons and explain blocked autopilot, without duplicating the next onboarding action.
125
+ - Keep onboarding completion retry commands executable and clear obsolete saved failures. Guard cadence and auto-approval consent writes. Preserve refusal recovery under `python -m recala_cli`.
126
+ - Check the existing release pointer once per day for human upgrade notices. Explain disabled API keys by API error code.
127
+
128
+ The spinner is unchanged (D1 belongs to #669). API hold-detail language and the portal's unknown-hold mapping remain API/portal follow-ups; the CLI retains the supplied code, detail and applicable recovery command.
@@ -0,0 +1,63 @@
1
+ Metadata-Version: 2.5
2
+ Name: recala-cli
3
+ Version: 0.6.0
4
+ Summary: Drive your Recala company from the terminal, by hand or through an AI agent.
5
+ Project-URL: Homepage, https://recala.co
6
+ Project-URL: Documentation, https://recala.co/developers
7
+ Author: Recala
8
+ Keywords: ai-agents,articles,cli,content,recala
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3 :: Only
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: click>=8.1
19
+ Requires-Dist: httpx>=0.27
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest>=8.3; extra == 'dev'
22
+ Description-Content-Type: text/markdown
23
+
24
+ # Recala CLI
25
+
26
+ Drive your Recala company from the terminal, by hand or through an AI agent.
27
+ Everything the portal does for articles, topics, authors and publishing is a command.
28
+
29
+ ## Install
30
+
31
+ ```
32
+ uv tool install recala-cli
33
+ ```
34
+
35
+ or
36
+
37
+ ```
38
+ pipx install recala-cli
39
+ ```
40
+
41
+ Upgrade with `recala update`, or `uv tool upgrade recala-cli`.
42
+
43
+ ## Sign in
44
+
45
+ ```
46
+ recala login
47
+ ```
48
+
49
+ This opens your browser once. After that, `recala company list` shows your companies and
50
+ `recala company use <name>` picks the one the next commands act on.
51
+
52
+ ## Three examples
53
+
54
+ ```
55
+ recala status
56
+ recala article list
57
+ recala --org "My Company" credits
58
+ ```
59
+
60
+ Add `--json` to any command for output an agent can read. `recala --help` lists every command;
61
+ `recala completion zsh` prints shell completion.
62
+
63
+ Documentation: https://recala.co/developers
@@ -0,0 +1,40 @@
1
+ # Recala CLI
2
+
3
+ Drive your Recala company from the terminal, by hand or through an AI agent.
4
+ Everything the portal does for articles, topics, authors and publishing is a command.
5
+
6
+ ## Install
7
+
8
+ ```
9
+ uv tool install recala-cli
10
+ ```
11
+
12
+ or
13
+
14
+ ```
15
+ pipx install recala-cli
16
+ ```
17
+
18
+ Upgrade with `recala update`, or `uv tool upgrade recala-cli`.
19
+
20
+ ## Sign in
21
+
22
+ ```
23
+ recala login
24
+ ```
25
+
26
+ This opens your browser once. After that, `recala company list` shows your companies and
27
+ `recala company use <name>` picks the one the next commands act on.
28
+
29
+ ## Three examples
30
+
31
+ ```
32
+ recala status
33
+ recala article list
34
+ recala --org "My Company" credits
35
+ ```
36
+
37
+ Add `--json` to any command for output an agent can read. `recala --help` lists every command;
38
+ `recala completion zsh` prints shell completion.
39
+
40
+ Documentation: https://recala.co/developers
@@ -0,0 +1,46 @@
1
+ [project]
2
+ name = "recala-cli"
3
+ version = "0.6.0"
4
+ description = "Drive your Recala company from the terminal, by hand or through an AI agent."
5
+ readme = "README.md"
6
+ authors = [{ name = "Recala" }]
7
+ keywords = ["recala", "cli", "content", "articles", "ai-agents"]
8
+ classifiers = [
9
+ "Environment :: Console",
10
+ "Intended Audience :: Developers",
11
+ "Operating System :: OS Independent",
12
+ "Programming Language :: Python :: 3",
13
+ "Programming Language :: Python :: 3 :: Only",
14
+ "Programming Language :: Python :: 3.11",
15
+ "Programming Language :: Python :: 3.12",
16
+ "Programming Language :: Python :: 3.13",
17
+ ]
18
+ requires-python = ">=3.11"
19
+ # click is what Typer is built on; using it directly keeps the dependency list to two
20
+ # libraries the API already locks (apps/api/uv.lock), so the CLI adds nothing new.
21
+ dependencies = [
22
+ "click>=8.1",
23
+ "httpx>=0.27",
24
+ ]
25
+
26
+ [project.optional-dependencies]
27
+ dev = ["pytest>=8.3"]
28
+
29
+ [project.urls]
30
+ Homepage = "https://recala.co"
31
+ Documentation = "https://recala.co/developers"
32
+
33
+ [project.scripts]
34
+ recala = "recala_cli.main:cli"
35
+
36
+ [build-system]
37
+ requires = ["hatchling"]
38
+ build-backend = "hatchling.build"
39
+
40
+ [tool.hatch.build.targets.wheel]
41
+ packages = ["src/recala_cli"]
42
+
43
+ [tool.pytest.ini_options]
44
+ testpaths = ["tests"]
45
+ pythonpath = ["src"]
46
+ addopts = "-q --strict-markers"
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env bash
2
+ # Reproduce the local handoff gates without git writes or a real CLI profile.
3
+ set -euo pipefail
4
+ repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
5
+ cd "$repo_root"
6
+ check_scratch="$(mktemp -d)"
7
+ trap 'rm -rf "$check_scratch"' EXIT
8
+ export HOME="$check_scratch" RECALA_CONFIG_DIR="$check_scratch/config"
9
+ export PYTHONPATH="$repo_root/src:$repo_root/apps/api"
10
+ export RECALA_NO_UPDATE_CHECK=1 ASTRO_TELEMETRY_DISABLED=1
11
+ export SENTRY_AUTH_TOKEN='' PUBLIC_SENTRY_DSN='' SENTRY_DSN=''
12
+ export RECALA_CLI_CMD='python3 -m recala_cli'
13
+ api_python="${RECALA_API_TEST_PYTHON:-$repo_root/apps/api/.venv/bin/python}"
14
+ if [[ ! -x "$api_python" ]]; then
15
+ printf 'Set RECALA_API_TEST_PYTHON to the Python executable with the API test dependencies.\n' >&2
16
+ exit 2
17
+ fi
18
+ run_check() {
19
+ printf 'CHECK '
20
+ printf '%q ' "$@"
21
+ printf '\n'
22
+ if "$@"; then
23
+ printf 'EXIT=0\n'
24
+ else
25
+ check_rc=$?
26
+ printf 'EXIT=%s\n' "$check_rc"
27
+ return "$check_rc"
28
+ fi
29
+ }
30
+ (
31
+ cd apps/cli
32
+ run_check pytest -q -o addopts=--strict-markers
33
+ )
34
+ api_tests=(apps/api/tests/unit/routers apps/api/tests/unit/api_keys apps/api/tests/test_cli_calls_only_routes_the_api_serves.py apps/api/tests/integration/test_regenerate_endpoint.py apps/api/tests/test_regenerate_handler_parity.py)
35
+ while IFS= read -r test_file; do
36
+ api_tests+=("$test_file")
37
+ done < <(rg -l 'generate_from_queue|/generate/from-queue|/api/v1/runs/|get_run_state' apps/api/tests --glob 'test*.py' | sort -u)
38
+ run_check "$api_python" -m pytest -q "${api_tests[@]}"
39
+ changed_python=(
40
+ apps/api/src/routers/generate.py
41
+ apps/api/src/routers/keys.py
42
+ apps/api/src/routers/ops.py
43
+ apps/api/tests/unit/authority/test_commission_identity_guard.py
44
+ apps/cli/src/recala_cli/auth.py
45
+ apps/cli/src/recala_cli/client.py
46
+ apps/cli/src/recala_cli/commands/article.py
47
+ apps/cli/src/recala_cli/commands/auth.py
48
+ apps/cli/src/recala_cli/commands/cadence.py
49
+ apps/cli/src/recala_cli/commands/onboard.py
50
+ apps/cli/src/recala_cli/commands/org.py
51
+ apps/cli/src/recala_cli/commands/reads.py
52
+ apps/cli/src/recala_cli/commands/status.py
53
+ apps/cli/src/recala_cli/commands/topics.py
54
+ apps/cli/src/recala_cli/confirm.py
55
+ apps/cli/src/recala_cli/endpoints.py
56
+ apps/cli/src/recala_cli/errors.py
57
+ apps/cli/src/recala_cli/human.py
58
+ apps/cli/src/recala_cli/labels.py
59
+ apps/cli/src/recala_cli/onboarding.py
60
+ apps/cli/src/recala_cli/organizations.py
61
+ apps/cli/src/recala_cli/runtime.py
62
+ apps/cli/src/recala_cli/views.py
63
+ apps/cli/tests/conftest.py
64
+ apps/cli/tests/test_agent_onboarding.py
65
+ apps/cli/tests/test_cadence.py
66
+ apps/cli/tests/test_connect_and_status.py
67
+ apps/cli/tests/test_content_commands.py
68
+ apps/cli/tests/test_human_readable.py
69
+ apps/cli/tests/test_machine_contract.py
70
+ apps/cli/tests/test_org.py
71
+ apps/cli/tests/test_org_readable.py
72
+ apps/cli/tests/test_review_hardening.py
73
+ apps/cli/src/recala_cli/article_runs.py
74
+ apps/cli/src/recala_cli/updates.py
75
+ apps/cli/tests/test_dogfood_fixes.py
76
+ apps/cli/tests/test_c2_onboarding.py
77
+ apps/api/tests/test_cli_async_generation.py
78
+ apps/api/tests/integration/test_regenerate_endpoint.py
79
+ apps/api/tests/unit/routers/test_api_keys_served.py
80
+ )
81
+ run_check ruff check --config apps/cli/pyproject.toml "${changed_python[@]}"
82
+ run_check git diff --check
83
+ cd apps/web
84
+ run_check npm run docs:cli:check
85
+ run_check npx --no-install vitest run src/lib src/components/developers
86
+ # Includes onboarding checks, SSR externals, bundle budget and CLI release gate.
87
+ run_check npm run build