celltype-cli 0.1.0__tar.gz → 0.1.2__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 (187) hide show
  1. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/settings.local.json +2 -1
  2. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/PKG-INFO +1 -1
  3. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/pyproject.toml +1 -1
  4. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/cli.py +26 -31
  5. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/apply.md +0 -0
  6. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/archive.md +0 -0
  7. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/bulk-archive.md +0 -0
  8. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/continue.md +0 -0
  9. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/explore.md +0 -0
  10. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/ff.md +0 -0
  11. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/new.md +0 -0
  12. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/onboard.md +0 -0
  13. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/sync.md +0 -0
  14. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/commands/opsx/verify.md +0 -0
  15. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-apply-change/SKILL.md +0 -0
  16. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-archive-change/SKILL.md +0 -0
  17. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-bulk-archive-change/SKILL.md +0 -0
  18. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-continue-change/SKILL.md +0 -0
  19. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-explore/SKILL.md +0 -0
  20. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-ff-change/SKILL.md +0 -0
  21. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-new-change/SKILL.md +0 -0
  22. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-onboard/SKILL.md +0 -0
  23. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-sync-specs/SKILL.md +0 -0
  24. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.claude/skills/openspec-verify-change/SKILL.md +0 -0
  25. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.dockerignore +0 -0
  26. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.github/workflows/ci.yml +0 -0
  27. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/.gitignore +0 -0
  28. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/CLAUDE.md +0 -0
  29. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/Dockerfile +0 -0
  30. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/Dockerfile.api +0 -0
  31. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/LICENSE +0 -0
  32. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/README.md +0 -0
  33. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/assets/bixbench_benchmark.png +0 -0
  34. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/assets/ct2.gif +0 -0
  35. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/docker-compose.yml +0 -0
  36. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/install.sh +0 -0
  37. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/openspec/config.yaml +0 -0
  38. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/scripts/prepare_datasets.py +0 -0
  39. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/scripts/prepare_l1000.py +0 -0
  40. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/settings.json +0 -0
  41. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/__init__.py +0 -0
  42. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/__init__.py +0 -0
  43. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/case_studies.py +0 -0
  44. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/config.py +0 -0
  45. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/doctor.py +0 -0
  46. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/knowledge.py +0 -0
  47. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/loop.py +0 -0
  48. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/mcp_server.py +0 -0
  49. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/orchestrator.py +0 -0
  50. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/runner.py +0 -0
  51. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/sandbox.py +0 -0
  52. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/session.py +0 -0
  53. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/system_prompt.py +0 -0
  54. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/trace_store.py +0 -0
  55. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/trajectory.py +0 -0
  56. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/types.py +0 -0
  57. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/agent/workflows.py +0 -0
  58. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/api/__init__.py +0 -0
  59. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/api/app.py +0 -0
  60. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/api/config.py +0 -0
  61. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/api/engine.py +0 -0
  62. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/data/__init__.py +0 -0
  63. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/data/compute_providers.json +0 -0
  64. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/data/cro_database.json +0 -0
  65. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/data/downloader.py +0 -0
  66. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/data/loaders.py +0 -0
  67. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/kb/__init__.py +0 -0
  68. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/kb/benchmarks.py +0 -0
  69. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/kb/governance.py +0 -0
  70. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/kb/ingest.py +0 -0
  71. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/kb/reasoning.py +0 -0
  72. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/kb/schema_monitor.py +0 -0
  73. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/kb/substrate.py +0 -0
  74. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/models/__init__.py +0 -0
  75. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/models/llm.py +0 -0
  76. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/__init__.py +0 -0
  77. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/_compound_resolver.py +0 -0
  78. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/biomarker.py +0 -0
  79. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/cellxgene.py +0 -0
  80. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/chemistry.py +0 -0
  81. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/claude.py +0 -0
  82. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/clinical.py +0 -0
  83. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/clue.py +0 -0
  84. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/code.py +0 -0
  85. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/combination.py +0 -0
  86. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/compute.py +0 -0
  87. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/cro.py +0 -0
  88. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/data_api.py +0 -0
  89. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/design.py +0 -0
  90. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/dna.py +0 -0
  91. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/experiment.py +0 -0
  92. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/expression.py +0 -0
  93. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/files.py +0 -0
  94. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/genomics.py +0 -0
  95. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/http_client.py +0 -0
  96. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/imaging.py +0 -0
  97. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/intel.py +0 -0
  98. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/literature.py +0 -0
  99. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/network.py +0 -0
  100. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/notification.py +0 -0
  101. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/omics.py +0 -0
  102. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/ops.py +0 -0
  103. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/parity.py +0 -0
  104. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/pk.py +0 -0
  105. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/protein.py +0 -0
  106. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/regulatory.py +0 -0
  107. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/remote_data.py +0 -0
  108. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/report.py +0 -0
  109. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/repurposing.py +0 -0
  110. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/safety.py +0 -0
  111. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/shell.py +0 -0
  112. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/singlecell.py +0 -0
  113. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/statistics.py +0 -0
  114. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/structure.py +0 -0
  115. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/target.py +0 -0
  116. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/translational.py +0 -0
  117. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/tools/viability.py +0 -0
  118. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/ui/__init__.py +0 -0
  119. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/ui/markdown.py +0 -0
  120. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/ui/status.py +0 -0
  121. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/ui/suggestions.py +0 -0
  122. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/ui/terminal.py +0 -0
  123. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/src/ct/ui/traces.py +0 -0
  124. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/__init__.py +0 -0
  125. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/conftest.py +0 -0
  126. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/fixtures/plan_snapshot.txt +0 -0
  127. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/fixtures/trace_snapshot.txt +0 -0
  128. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_api_smoke.py +0 -0
  129. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_cellxgene.py +0 -0
  130. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_chemistry_new.py +0 -0
  131. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_claude.py +0 -0
  132. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_cli.py +0 -0
  133. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_clue.py +0 -0
  134. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_code.py +0 -0
  135. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_compute.py +0 -0
  136. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_config.py +0 -0
  137. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_cro.py +0 -0
  138. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_data_api.py +0 -0
  139. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_data_api_service.py +0 -0
  140. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_design.py +0 -0
  141. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_dna.py +0 -0
  142. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_doctor.py +0 -0
  143. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_downloader.py +0 -0
  144. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_engine.py +0 -0
  145. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_experiment.py +0 -0
  146. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_files.py +0 -0
  147. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_future_backends_todo.py +0 -0
  148. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_html_report.py +0 -0
  149. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_http_client.py +0 -0
  150. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_imaging.py +0 -0
  151. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_kb_benchmarks.py +0 -0
  152. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_kb_governance.py +0 -0
  153. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_kb_ingest.py +0 -0
  154. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_kb_reasoning.py +0 -0
  155. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_kb_schema_monitor.py +0 -0
  156. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_kb_substrate.py +0 -0
  157. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_knowledge.py +0 -0
  158. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_llm.py +0 -0
  159. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_mention_completer.py +0 -0
  160. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_network.py +0 -0
  161. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_notebook.py +0 -0
  162. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_notification.py +0 -0
  163. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_omics.py +0 -0
  164. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_ops.py +0 -0
  165. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_parity_tools.py +0 -0
  166. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_parkinsons_toolchain_smoke.py +0 -0
  167. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_patent_search.py +0 -0
  168. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_plan_display.py +0 -0
  169. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_protein.py +0 -0
  170. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_registry.py +0 -0
  171. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_remote_data.py +0 -0
  172. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_repurposing.py +0 -0
  173. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_sandbox.py +0 -0
  174. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_sdk_streaming.py +0 -0
  175. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_session.py +0 -0
  176. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_shell.py +0 -0
  177. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_singlecell.py +0 -0
  178. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_status.py +0 -0
  179. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_structure.py +0 -0
  180. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_target.py +0 -0
  181. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_terminal.py +0 -0
  182. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_terminal_integration.py +0 -0
  183. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_tools.py +0 -0
  184. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_trace_store.py +0 -0
  185. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_traces.py +0 -0
  186. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_trajectory.py +0 -0
  187. {celltype_cli-0.1.0 → celltype_cli-0.1.2}/tests/test_workflows.py +0 -0
@@ -89,7 +89,8 @@
89
89
  "Bash(tail:*)",
90
90
  "Bash(grep FAILED\\\\|ERROR:*)",
91
91
  "Bash(echo not found under common names:*)",
92
- "Bash(head:*)"
92
+ "Bash(head:*)",
93
+ "Bash(twine upload:*)"
93
94
  ]
94
95
  }
95
96
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celltype-cli
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: CellType CLI — An autonomous agent for drug discovery research
5
5
  Author: CellType Inc.
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "celltype-cli"
7
- version = "0.1.0"
7
+ version = "0.1.2"
8
8
  description = "CellType CLI — An autonomous agent for drug discovery research"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1110,14 +1110,15 @@ def case_study_run(
1110
1110
 
1111
1111
  llm_issue = cfg.llm_preflight_issue()
1112
1112
  if llm_issue:
1113
- console.print(
1114
- Panel(
1115
- f"[bold red]LLM is not configured[/bold red]\n\n{llm_issue}",
1116
- title="[red]Configuration Error[/red]",
1117
- border_style="red",
1118
- )
1119
- )
1120
- raise typer.Exit(code=2)
1113
+ console.print("\n [yellow]First-time setup required.[/yellow]\n")
1114
+ setup_cmd(api_key=None)
1115
+ cfg = Config.load()
1116
+ if model:
1117
+ cfg.set("llm.model", model)
1118
+ llm_issue = cfg.llm_preflight_issue()
1119
+ if llm_issue:
1120
+ console.print(f"\n [red]Setup incomplete:[/red] {llm_issue}")
1121
+ raise typer.Exit(code=2)
1121
1122
 
1122
1123
  session = Session(config=cfg, verbose=verbose)
1123
1124
  case = CASE_STUDIES[case_id]
@@ -1204,17 +1205,15 @@ def run_query(query: str, context: dict, output: Optional[Path],
1204
1205
 
1205
1206
  llm_issue = cfg.llm_preflight_issue()
1206
1207
  if llm_issue:
1207
- console.print(
1208
- Panel(
1209
- (
1210
- f"[bold red]LLM is not configured[/bold red]\n\n{llm_issue}\n\n"
1211
- "Run `ct doctor` for a full readiness check."
1212
- ),
1213
- title="[red]Configuration Error[/red]",
1214
- border_style="red",
1215
- )
1216
- )
1217
- raise typer.Exit(code=2)
1208
+ console.print("\n [yellow]First-time setup required.[/yellow]\n")
1209
+ setup_cmd(api_key=None)
1210
+ cfg = Config.load()
1211
+ if model:
1212
+ cfg.set("llm.model", model)
1213
+ llm_issue = cfg.llm_preflight_issue()
1214
+ if llm_issue:
1215
+ console.print(f"\n [red]Setup incomplete:[/red] {llm_issue}")
1216
+ raise typer.Exit(code=2)
1218
1217
 
1219
1218
  session = Session(config=cfg, verbose=verbose)
1220
1219
 
@@ -1387,18 +1386,14 @@ def run_interactive(context: dict, output: Optional[Path],
1387
1386
 
1388
1387
  llm_issue = cfg.llm_preflight_issue()
1389
1388
  if llm_issue:
1390
- console.print(
1391
- Panel(
1392
- (
1393
- f"[bold red]LLM is not configured[/bold red]\n\n{llm_issue}\n\n"
1394
- "Set your key/provider via `ct config set ...`, then run `ct` again.\n"
1395
- "Tip: run `ct doctor` for a full readiness check."
1396
- ),
1397
- title="[red]Configuration Error[/red]",
1398
- border_style="red",
1399
- )
1400
- )
1401
- return
1389
+ console.print("\n [yellow]First-time setup required.[/yellow]\n")
1390
+ setup_cmd(api_key=None)
1391
+ # Reload config after setup
1392
+ cfg = Config.load()
1393
+ llm_issue = cfg.llm_preflight_issue()
1394
+ if llm_issue:
1395
+ console.print(f"\n [red]Setup incomplete:[/red] {llm_issue}")
1396
+ return
1402
1397
 
1403
1398
  print_banner()
1404
1399
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes