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.
- recala_cli-0.6.0/.gitignore +262 -0
- recala_cli-0.6.0/CHANGELOG.md +128 -0
- recala_cli-0.6.0/PKG-INFO +63 -0
- recala_cli-0.6.0/README.md +40 -0
- recala_cli-0.6.0/pyproject.toml +46 -0
- recala_cli-0.6.0/scripts/check-dogfood.sh +87 -0
- recala_cli-0.6.0/scripts/release.py +187 -0
- recala_cli-0.6.0/src/recala_cli/__init__.py +3 -0
- recala_cli-0.6.0/src/recala_cli/__main__.py +3 -0
- recala_cli-0.6.0/src/recala_cli/article_runs.py +372 -0
- recala_cli-0.6.0/src/recala_cli/auth.py +196 -0
- recala_cli-0.6.0/src/recala_cli/client.py +103 -0
- recala_cli-0.6.0/src/recala_cli/commands/__init__.py +1 -0
- recala_cli-0.6.0/src/recala_cli/commands/article.py +835 -0
- recala_cli-0.6.0/src/recala_cli/commands/auth.py +207 -0
- recala_cli-0.6.0/src/recala_cli/commands/billing.py +76 -0
- recala_cli-0.6.0/src/recala_cli/commands/bing.py +164 -0
- recala_cli-0.6.0/src/recala_cli/commands/cadence.py +217 -0
- recala_cli-0.6.0/src/recala_cli/commands/connect.py +395 -0
- recala_cli-0.6.0/src/recala_cli/commands/credits.py +46 -0
- recala_cli-0.6.0/src/recala_cli/commands/faithful_translations.py +70 -0
- recala_cli-0.6.0/src/recala_cli/commands/gsc.py +79 -0
- recala_cli-0.6.0/src/recala_cli/commands/index.py +293 -0
- recala_cli-0.6.0/src/recala_cli/commands/keys.py +98 -0
- recala_cli-0.6.0/src/recala_cli/commands/knowledge.py +245 -0
- recala_cli-0.6.0/src/recala_cli/commands/languages.py +119 -0
- recala_cli-0.6.0/src/recala_cli/commands/monthly_report.py +152 -0
- recala_cli-0.6.0/src/recala_cli/commands/notifications.py +106 -0
- recala_cli-0.6.0/src/recala_cli/commands/onboard.py +237 -0
- recala_cli-0.6.0/src/recala_cli/commands/org.py +352 -0
- recala_cli-0.6.0/src/recala_cli/commands/profile.py +70 -0
- recala_cli-0.6.0/src/recala_cli/commands/questions.py +246 -0
- recala_cli-0.6.0/src/recala_cli/commands/reads.py +320 -0
- recala_cli-0.6.0/src/recala_cli/commands/refresh.py +138 -0
- recala_cli-0.6.0/src/recala_cli/commands/refusals.py +20 -0
- recala_cli-0.6.0/src/recala_cli/commands/schema.py +47 -0
- recala_cli-0.6.0/src/recala_cli/commands/shell.py +81 -0
- recala_cli-0.6.0/src/recala_cli/commands/skills.py +92 -0
- recala_cli-0.6.0/src/recala_cli/commands/slot_topic.py +94 -0
- recala_cli-0.6.0/src/recala_cli/commands/status.py +153 -0
- recala_cli-0.6.0/src/recala_cli/commands/topics.py +328 -0
- recala_cli-0.6.0/src/recala_cli/config.py +176 -0
- recala_cli-0.6.0/src/recala_cli/confirm.py +137 -0
- recala_cli-0.6.0/src/recala_cli/display.py +40 -0
- recala_cli-0.6.0/src/recala_cli/endpoints.py +258 -0
- recala_cli-0.6.0/src/recala_cli/errors.py +220 -0
- recala_cli-0.6.0/src/recala_cli/human.py +324 -0
- recala_cli-0.6.0/src/recala_cli/ids.py +139 -0
- recala_cli-0.6.0/src/recala_cli/labels.py +74 -0
- recala_cli-0.6.0/src/recala_cli/main.py +129 -0
- recala_cli-0.6.0/src/recala_cli/onboarding.py +522 -0
- recala_cli-0.6.0/src/recala_cli/organizations.py +197 -0
- recala_cli-0.6.0/src/recala_cli/output.py +34 -0
- recala_cli-0.6.0/src/recala_cli/parallel.py +18 -0
- recala_cli-0.6.0/src/recala_cli/polling.py +102 -0
- recala_cli-0.6.0/src/recala_cli/prompts.py +88 -0
- recala_cli-0.6.0/src/recala_cli/runtime.py +216 -0
- recala_cli-0.6.0/src/recala_cli/search_numbers.py +22 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-apply-revision-notes/SKILL.md +39 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-article-signoff/SKILL.md +67 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-cli-contract.md +78 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-connect-search-console/SKILL.md +29 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-onboard/SKILL.md +25 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-onboard-brand/SKILL.md +25 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-plan-month/SKILL.md +33 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-schedule-approved/SKILL.md +36 -0
- recala_cli-0.6.0/src/recala_cli/skills/recala-weekly-authority-report/SKILL.md +35 -0
- recala_cli-0.6.0/src/recala_cli/ui.py +260 -0
- recala_cli-0.6.0/src/recala_cli/updates.py +43 -0
- recala_cli-0.6.0/src/recala_cli/views.py +372 -0
- recala_cli-0.6.0/tests/conftest.py +120 -0
- recala_cli-0.6.0/tests/distribution/test_public_install.py +774 -0
- recala_cli-0.6.0/tests/fixtures/hold_text_json.json +167 -0
- recala_cli-0.6.0/tests/fixtures/human_output_pass1_json.json +10 -0
- recala_cli-0.6.0/tests/fixtures/machine_contract_main.json +787 -0
- recala_cli-0.6.0/tests/test_agent_onboarding.py +552 -0
- recala_cli-0.6.0/tests/test_approve_read_receipt.py +24 -0
- recala_cli-0.6.0/tests/test_approve_reconfirm.py +82 -0
- recala_cli-0.6.0/tests/test_article_id_output.py +44 -0
- recala_cli-0.6.0/tests/test_billing_invoices.py +56 -0
- recala_cli-0.6.0/tests/test_billing_link.py +64 -0
- recala_cli-0.6.0/tests/test_bing.py +150 -0
- recala_cli-0.6.0/tests/test_c2_onboarding.py +487 -0
- recala_cli-0.6.0/tests/test_cadence.py +170 -0
- recala_cli-0.6.0/tests/test_calendar_matches_plan.py +65 -0
- recala_cli-0.6.0/tests/test_calendar_slots.py +377 -0
- recala_cli-0.6.0/tests/test_confirm.py +186 -0
- recala_cli-0.6.0/tests/test_connect_and_status.py +367 -0
- recala_cli-0.6.0/tests/test_content_commands.py +583 -0
- recala_cli-0.6.0/tests/test_core_errors.py +41 -0
- recala_cli-0.6.0/tests/test_core_release.py +73 -0
- recala_cli-0.6.0/tests/test_core_root.py +163 -0
- recala_cli-0.6.0/tests/test_core_short_ids.py +95 -0
- recala_cli-0.6.0/tests/test_core_speed.py +68 -0
- recala_cli-0.6.0/tests/test_core_status_speed.py +43 -0
- recala_cli-0.6.0/tests/test_credits.py +109 -0
- recala_cli-0.6.0/tests/test_dogfood_fixes.py +1209 -0
- recala_cli-0.6.0/tests/test_dogfood_status.py +99 -0
- recala_cli-0.6.0/tests/test_edit_link_warnings.py +31 -0
- recala_cli-0.6.0/tests/test_errors.py +193 -0
- recala_cli-0.6.0/tests/test_faithful_translation_settings.py +122 -0
- recala_cli-0.6.0/tests/test_gsc.py +89 -0
- recala_cli-0.6.0/tests/test_help_listing.py +42 -0
- recala_cli-0.6.0/tests/test_hold_finding_sentences.py +59 -0
- recala_cli-0.6.0/tests/test_hold_text.py +334 -0
- recala_cli-0.6.0/tests/test_human_output_pass1.py +352 -0
- recala_cli-0.6.0/tests/test_human_readable.py +304 -0
- recala_cli-0.6.0/tests/test_index.py +234 -0
- recala_cli-0.6.0/tests/test_keys.py +83 -0
- recala_cli-0.6.0/tests/test_knowledge_admit.py +106 -0
- recala_cli-0.6.0/tests/test_languages.py +107 -0
- recala_cli-0.6.0/tests/test_login.py +202 -0
- recala_cli-0.6.0/tests/test_machine_contract.py +94 -0
- recala_cli-0.6.0/tests/test_monthly_report.py +120 -0
- recala_cli-0.6.0/tests/test_notifications.py +112 -0
- recala_cli-0.6.0/tests/test_onboarding_channel.py +7 -0
- recala_cli-0.6.0/tests/test_onboarding_commands.py +190 -0
- recala_cli-0.6.0/tests/test_org.py +118 -0
- recala_cli-0.6.0/tests/test_org_readable.py +262 -0
- recala_cli-0.6.0/tests/test_poll_pacing.py +122 -0
- recala_cli-0.6.0/tests/test_profile.py +58 -0
- recala_cli-0.6.0/tests/test_publish_commands.py +410 -0
- recala_cli-0.6.0/tests/test_questions.py +379 -0
- recala_cli-0.6.0/tests/test_questions_in_words.py +32 -0
- recala_cli-0.6.0/tests/test_recheck_findings.py +181 -0
- recala_cli-0.6.0/tests/test_refresh.py +120 -0
- recala_cli-0.6.0/tests/test_rerun_refusal.py +156 -0
- recala_cli-0.6.0/tests/test_review_hardening.py +187 -0
- recala_cli-0.6.0/tests/test_review_round3.py +296 -0
- recala_cli-0.6.0/tests/test_scan_reports_what_was_found.py +70 -0
- recala_cli-0.6.0/tests/test_search_numbers.py +16 -0
- recala_cli-0.6.0/tests/test_short_id_selectors.py +258 -0
- recala_cli-0.6.0/tests/test_skills.py +94 -0
- recala_cli-0.6.0/tests/test_slot_topic.py +122 -0
- recala_cli-0.6.0/tests/test_times_in_company_zone.py +73 -0
- recala_cli-0.6.0/tests/test_topics.py +67 -0
- recala_cli-0.6.0/tests/test_topics_add.py +56 -0
- recala_cli-0.6.0/tests/test_topics_one_call.py +53 -0
- recala_cli-0.6.0/tests/test_ui.py +303 -0
- recala_cli-0.6.0/tests/test_view_surface.py +83 -0
- recala_cli-0.6.0/tests/test_whoami.py +63 -0
- recala_cli-0.6.0/tests/test_write_flags.py +126 -0
- 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
|