canfar-lab 0.7.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 (479) hide show
  1. canfar_lab-0.7.0/.cursor/harness/.gitignore +4 -0
  2. canfar_lab-0.7.0/.cursor/harness/config.json +7 -0
  3. canfar_lab-0.7.0/.cursor/harness/failures/2026-08-27-epistemic-stack-verifier.md +13 -0
  4. canfar_lab-0.7.0/.cursor/harness/playbook.md +12 -0
  5. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-08-27-epistemic-stack.md +5 -0
  6. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-08-27-writing-skills.md +5 -0
  7. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-08-31-viz-skills.md +5 -0
  8. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-09-07-consolidate-astroai-main.md +7 -0
  9. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-09-07-update-upstream.md +6 -0
  10. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-21-studio-agent-layout.md +5 -0
  11. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-21-studio-settings-usability.md +5 -0
  12. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-22-desktop-studio-launch.md +5 -0
  13. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-22-desktop-sync-dock.md +5 -0
  14. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-22-local-notebooks-dock-bar.md +5 -0
  15. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-22-studio-launch.md +7 -0
  16. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-24-dsh-rc3-arc-doorbell.md +5 -0
  17. canfar_lab-0.7.0/.cursor/harness/trajectories/2026-10-24-review-ship.md +5 -0
  18. canfar_lab-0.7.0/.cursor/hooks/harness-session-start.sh +37 -0
  19. canfar_lab-0.7.0/.cursor/hooks.json +10 -0
  20. canfar_lab-0.7.0/.dockerignore +11 -0
  21. canfar_lab-0.7.0/.github/workflows/ci.yml +47 -0
  22. canfar_lab-0.7.0/.github/workflows/publish.yml +24 -0
  23. canfar_lab-0.7.0/.gitignore +20 -0
  24. canfar_lab-0.7.0/AGENTS.md +73 -0
  25. canfar_lab-0.7.0/CLAUDE.md +2 -0
  26. canfar_lab-0.7.0/LICENSE +21 -0
  27. canfar_lab-0.7.0/PKG-INFO +156 -0
  28. canfar_lab-0.7.0/README.md +94 -0
  29. canfar_lab-0.7.0/agents/claude/mcp.json +43 -0
  30. canfar_lab-0.7.0/agents/codex/mcp-servers.toml +34 -0
  31. canfar_lab-0.7.0/agents/cursor/mcp.json +43 -0
  32. canfar_lab-0.7.0/agents/omp/config-zero-spend.yml +19 -0
  33. canfar_lab-0.7.0/agents/omp/config.yml +40 -0
  34. canfar_lab-0.7.0/agents/omp/mcp.json +43 -0
  35. canfar_lab-0.7.0/agents/opencode/opencode.json +42 -0
  36. canfar_lab-0.7.0/agents/pi/settings.json +10 -0
  37. canfar_lab-0.7.0/agents/work/models.json +68 -0
  38. canfar_lab-0.7.0/docs/USAGE.md +294 -0
  39. canfar_lab-0.7.0/docs/cli.md +516 -0
  40. canfar_lab-0.7.0/docs/concurrency.md +59 -0
  41. canfar_lab-0.7.0/docs/config.md +34 -0
  42. canfar_lab-0.7.0/docs/desk-sync.md +499 -0
  43. canfar_lab-0.7.0/docs/help.md +104 -0
  44. canfar_lab-0.7.0/docs/panel.md +77 -0
  45. canfar_lab-0.7.0/docs/studio.md +236 -0
  46. canfar_lab-0.7.0/evals/astro_eval.py +393 -0
  47. canfar_lab-0.7.0/examples/workload/hello/README.md +15 -0
  48. canfar_lab-0.7.0/examples/workload/hello/job.py +17 -0
  49. canfar_lab-0.7.0/examples/workload/mnist_cnn/README.md +19 -0
  50. canfar_lab-0.7.0/examples/workload/mnist_cnn/infer.py +43 -0
  51. canfar_lab-0.7.0/examples/workload/mnist_cnn/train.py +66 -0
  52. canfar_lab-0.7.0/instructions/AGENTS-global.md +71 -0
  53. canfar_lab-0.7.0/pixi.lock +1638 -0
  54. canfar_lab-0.7.0/pyproject.toml +111 -0
  55. canfar_lab-0.7.0/rules/agents/env-hygiene.md +39 -0
  56. canfar_lab-0.7.0/rules/agents/harness.md +10 -0
  57. canfar_lab-0.7.0/rules/agents/latex.md +7 -0
  58. canfar_lab-0.7.0/rules/agents/ponytail.md +24 -0
  59. canfar_lab-0.7.0/rules/agents/python-pixi.md +6 -0
  60. canfar_lab-0.7.0/rules/agents/shell.md +6 -0
  61. canfar_lab-0.7.0/rules/agents/token-efficient.md +3 -0
  62. canfar_lab-0.7.0/rules/agents/writing.md +7 -0
  63. canfar_lab-0.7.0/rules/cursor/env-hygiene.mdc +44 -0
  64. canfar_lab-0.7.0/rules/cursor/harness.mdc +17 -0
  65. canfar_lab-0.7.0/rules/cursor/latex.mdc +15 -0
  66. canfar_lab-0.7.0/rules/cursor/ponytail.mdc +36 -0
  67. canfar_lab-0.7.0/rules/cursor/python-pixi.mdc +13 -0
  68. canfar_lab-0.7.0/rules/cursor/shell.mdc +14 -0
  69. canfar_lab-0.7.0/rules/cursor/token-efficient.mdc +15 -0
  70. canfar_lab-0.7.0/rules/cursor/writing.mdc +15 -0
  71. canfar_lab-0.7.0/scripts/audit-cli-help.sh +212 -0
  72. canfar_lab-0.7.0/scripts/bootstrap-canfar-workspace.sh +219 -0
  73. canfar_lab-0.7.0/scripts/check-wheel.sh +42 -0
  74. canfar_lab-0.7.0/scripts/ci.sh +37 -0
  75. canfar_lab-0.7.0/scripts/debug_autoscaler_repro.py +170 -0
  76. canfar_lab-0.7.0/scripts/ensure-claude-bridge.sh +53 -0
  77. canfar_lab-0.7.0/scripts/init-harness.sh +78 -0
  78. canfar_lab-0.7.0/scripts/init-session.sh +168 -0
  79. canfar_lab-0.7.0/scripts/install-agents.sh +43 -0
  80. canfar_lab-0.7.0/scripts/install-work-models.py +142 -0
  81. canfar_lab-0.7.0/scripts/sync-review-bench.sh +88 -0
  82. canfar_lab-0.7.0/skills/academic-writing/SKILL.md +94 -0
  83. canfar_lab-0.7.0/skills/ask-dont-tell/SKILL.md +31 -0
  84. canfar_lab-0.7.0/skills/canfar-lab-workflow/SKILL.md +216 -0
  85. canfar_lab-0.7.0/skills/gh-address-comments/LICENSE.txt +202 -0
  86. canfar_lab-0.7.0/skills/gh-address-comments/SKILL.md +25 -0
  87. canfar_lab-0.7.0/skills/gh-address-comments/scripts/fetch_comments.py +237 -0
  88. canfar_lab-0.7.0/skills/gh-fix-ci/LICENSE.txt +202 -0
  89. canfar_lab-0.7.0/skills/gh-fix-ci/SKILL.md +71 -0
  90. canfar_lab-0.7.0/skills/gh-fix-ci/scripts/inspect_pr_checks.py +505 -0
  91. canfar_lab-0.7.0/skills/harness-coding/AGENTS-snippet.md +23 -0
  92. canfar_lab-0.7.0/skills/harness-coding/SKILL.md +104 -0
  93. canfar_lab-0.7.0/skills/harness-coding/hooks/harness-session-start.sh +37 -0
  94. canfar_lab-0.7.0/skills/harness-coding/hooks/harness-stop.sh +99 -0
  95. canfar_lab-0.7.0/skills/harness-coding/scripts/init-harness.sh +76 -0
  96. canfar_lab-0.7.0/skills/harness-coding/scripts/install-all-agents.sh +5 -0
  97. canfar_lab-0.7.0/skills/harness-coding/scripts/install_pre_push_hook.sh +55 -0
  98. canfar_lab-0.7.0/skills/harness-coding/templates/config.json +7 -0
  99. canfar_lab-0.7.0/skills/harness-coding/templates/playbook-verify-tiers.md +2 -0
  100. canfar_lab-0.7.0/skills/harness-improve/SKILL.md +64 -0
  101. canfar_lab-0.7.0/skills/harness-reflect/SKILL.md +55 -0
  102. canfar_lab-0.7.0/skills/jupyter-notebook/LICENSE.txt +201 -0
  103. canfar_lab-0.7.0/skills/jupyter-notebook/SKILL.md +107 -0
  104. canfar_lab-0.7.0/skills/jupyter-notebook/agents/openai.yaml +6 -0
  105. canfar_lab-0.7.0/skills/jupyter-notebook/assets/experiment-template.ipynb +110 -0
  106. canfar_lab-0.7.0/skills/jupyter-notebook/assets/jupyter-small.svg +3 -0
  107. canfar_lab-0.7.0/skills/jupyter-notebook/assets/jupyter.png +0 -0
  108. canfar_lab-0.7.0/skills/jupyter-notebook/assets/tutorial-template.ipynb +107 -0
  109. canfar_lab-0.7.0/skills/jupyter-notebook/references/experiment-patterns.md +10 -0
  110. canfar_lab-0.7.0/skills/jupyter-notebook/references/notebook-structure.md +17 -0
  111. canfar_lab-0.7.0/skills/jupyter-notebook/references/quality-checklist.md +11 -0
  112. canfar_lab-0.7.0/skills/jupyter-notebook/references/tutorial-patterns.md +9 -0
  113. canfar_lab-0.7.0/skills/jupyter-notebook/scripts/new_notebook.py +130 -0
  114. canfar_lab-0.7.0/skills/latex-debug/SKILL.md +57 -0
  115. canfar_lab-0.7.0/skills/overleaf-git/SKILL.md +71 -0
  116. canfar_lab-0.7.0/skills/pdf/LICENSE.txt +201 -0
  117. canfar_lab-0.7.0/skills/pdf/SKILL.md +67 -0
  118. canfar_lab-0.7.0/skills/pdf/agents/openai.yaml +5 -0
  119. canfar_lab-0.7.0/skills/pdf/assets/pdf.png +0 -0
  120. canfar_lab-0.7.0/skills/perf-measure/SKILL.md +33 -0
  121. canfar_lab-0.7.0/skills/pixi-dev/SKILL.md +48 -0
  122. canfar_lab-0.7.0/skills/repo-router/SKILL.md +79 -0
  123. canfar_lab-0.7.0/skills/science-correctness/SKILL.md +49 -0
  124. canfar_lab-0.7.0/skills/torchsky-dev/SKILL.md +29 -0
  125. canfar_lab-0.7.0/skills/uv-dev/SKILL.md +42 -0
  126. canfar_lab-0.7.0/src/canfar_lab/__init__.py +20 -0
  127. canfar_lab-0.7.0/src/canfar_lab/__main__.py +4 -0
  128. canfar_lab-0.7.0/src/canfar_lab/agent/__init__.py +5 -0
  129. canfar_lab-0.7.0/src/canfar_lab/agent/addons.py +230 -0
  130. canfar_lab-0.7.0/src/canfar_lab/agent/agent_config.py +593 -0
  131. canfar_lab-0.7.0/src/canfar_lab/agent/agent_targets.py +285 -0
  132. canfar_lab-0.7.0/src/canfar_lab/agent/bin_root.py +383 -0
  133. canfar_lab-0.7.0/src/canfar_lab/agent/bundle_path.py +48 -0
  134. canfar_lab-0.7.0/src/canfar_lab/agent/clean_agent.py +97 -0
  135. canfar_lab-0.7.0/src/canfar_lab/agent/fix.py +236 -0
  136. canfar_lab-0.7.0/src/canfar_lab/agent/install.py +440 -0
  137. canfar_lab-0.7.0/src/canfar_lab/agent/install_bins.py +407 -0
  138. canfar_lab-0.7.0/src/canfar_lab/agent/install_fetch.py +577 -0
  139. canfar_lab-0.7.0/src/canfar_lab/agent/interact.py +130 -0
  140. canfar_lab-0.7.0/src/canfar_lab/agent/inventory.py +194 -0
  141. canfar_lab-0.7.0/src/canfar_lab/agent/keys.py +338 -0
  142. canfar_lab-0.7.0/src/canfar_lab/agent/opencode_config.py +89 -0
  143. canfar_lab-0.7.0/src/canfar_lab/agent/openscience.py +275 -0
  144. canfar_lab-0.7.0/src/canfar_lab/agent/plugins.py +620 -0
  145. canfar_lab-0.7.0/src/canfar_lab/agent/reconcile.py +236 -0
  146. canfar_lab-0.7.0/src/canfar_lab/agent/registry.py +72 -0
  147. canfar_lab-0.7.0/src/canfar_lab/agent/registry_lifecycle.py +718 -0
  148. canfar_lab-0.7.0/src/canfar_lab/agent/registry_probe.py +376 -0
  149. canfar_lab-0.7.0/src/canfar_lab/agent/registry_store.py +78 -0
  150. canfar_lab-0.7.0/src/canfar_lab/agent/review_bench.py +535 -0
  151. canfar_lab-0.7.0/src/canfar_lab/agent/setup.py +921 -0
  152. canfar_lab-0.7.0/src/canfar_lab/agent/setup_state.py +264 -0
  153. canfar_lab-0.7.0/src/canfar_lab/agent/support.py +251 -0
  154. canfar_lab-0.7.0/src/canfar_lab/agent/upstream.py +87 -0
  155. canfar_lab-0.7.0/src/canfar_lab/agent/wipe.py +119 -0
  156. canfar_lab-0.7.0/src/canfar_lab/cli/__init__.py +0 -0
  157. canfar_lab-0.7.0/src/canfar_lab/cli/agent_cmd.py +378 -0
  158. canfar_lab-0.7.0/src/canfar_lab/cli/agent_format.py +251 -0
  159. canfar_lab-0.7.0/src/canfar_lab/cli/agent_install.py +603 -0
  160. canfar_lab-0.7.0/src/canfar_lab/cli/agent_keys.py +105 -0
  161. canfar_lab-0.7.0/src/canfar_lab/cli/agent_plugins.py +210 -0
  162. canfar_lab-0.7.0/src/canfar_lab/cli/agent_setup.py +408 -0
  163. canfar_lab-0.7.0/src/canfar_lab/cli/banner.py +76 -0
  164. canfar_lab-0.7.0/src/canfar_lab/cli/clean.py +140 -0
  165. canfar_lab-0.7.0/src/canfar_lab/cli/config.py +63 -0
  166. canfar_lab-0.7.0/src/canfar_lab/cli/context.py +33 -0
  167. canfar_lab-0.7.0/src/canfar_lab/cli/desk.py +218 -0
  168. canfar_lab-0.7.0/src/canfar_lab/cli/dispatch.py +27 -0
  169. canfar_lab-0.7.0/src/canfar_lab/cli/env.py +69 -0
  170. canfar_lab-0.7.0/src/canfar_lab/cli/help_cmd.py +242 -0
  171. canfar_lab-0.7.0/src/canfar_lab/cli/init_clone_env.py +506 -0
  172. canfar_lab-0.7.0/src/canfar_lab/cli/kernel.py +109 -0
  173. canfar_lab-0.7.0/src/canfar_lab/cli/main.py +113 -0
  174. canfar_lab-0.7.0/src/canfar_lab/cli/open_cmd.py +134 -0
  175. canfar_lab-0.7.0/src/canfar_lab/cli/panel.py +199 -0
  176. canfar_lab-0.7.0/src/canfar_lab/cli/status.py +176 -0
  177. canfar_lab-0.7.0/src/canfar_lab/cli/studio.py +522 -0
  178. canfar_lab-0.7.0/src/canfar_lab/cli/sync.py +509 -0
  179. canfar_lab-0.7.0/src/canfar_lab/config/__init__.py +3 -0
  180. canfar_lab-0.7.0/src/canfar_lab/config/settings.py +118 -0
  181. canfar_lab-0.7.0/src/canfar_lab/core/arc_permissions.py +109 -0
  182. canfar_lab-0.7.0/src/canfar_lab/core/cadc_auth.py +21 -0
  183. canfar_lab-0.7.0/src/canfar_lab/core/disk_usage.py +158 -0
  184. canfar_lab-0.7.0/src/canfar_lab/core/git.py +156 -0
  185. canfar_lab-0.7.0/src/canfar_lab/core/home_clean.py +144 -0
  186. canfar_lab-0.7.0/src/canfar_lab/core/home_layout.py +410 -0
  187. canfar_lab-0.7.0/src/canfar_lab/core/kernel.py +171 -0
  188. canfar_lab-0.7.0/src/canfar_lab/core/pathlock.py +177 -0
  189. canfar_lab-0.7.0/src/canfar_lab/core/paths.py +70 -0
  190. canfar_lab-0.7.0/src/canfar_lab/core/project.py +361 -0
  191. canfar_lab-0.7.0/src/canfar_lab/core/session_common.py +122 -0
  192. canfar_lab-0.7.0/src/canfar_lab/core/session_resources.py +166 -0
  193. canfar_lab-0.7.0/src/canfar_lab/core/storage.py +303 -0
  194. canfar_lab-0.7.0/src/canfar_lab/core/vospace_status.py +270 -0
  195. canfar_lab-0.7.0/src/canfar_lab/data/__init__.py +0 -0
  196. canfar_lab-0.7.0/src/canfar_lab/data/agent/VERSION +1 -0
  197. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/agy.yaml +27 -0
  198. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/augment.yaml +28 -0
  199. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/claude.yaml +26 -0
  200. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/cline.yaml +19 -0
  201. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/codewhale.yaml +29 -0
  202. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/codex.yaml +28 -0
  203. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/copilot.yaml +26 -0
  204. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/cursor.yaml +23 -0
  205. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/droid.yaml +30 -0
  206. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/dsh.yaml +23 -0
  207. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/freebuff.yaml +28 -0
  208. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/goose.yaml +24 -0
  209. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/hermes.yaml +27 -0
  210. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/junie.yaml +29 -0
  211. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/kilo.yaml +25 -0
  212. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/muse.yaml +27 -0
  213. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/omp.yaml +29 -0
  214. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/openclaw.yaml +22 -0
  215. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/opencode.yaml +25 -0
  216. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/openscience.yaml +33 -0
  217. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/pi.yaml +31 -0
  218. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/qoder.yaml +25 -0
  219. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/swival.yaml +23 -0
  220. canfar_lab-0.7.0/src/canfar_lab/data/agent/agents/zcode.yaml +25 -0
  221. canfar_lab-0.7.0/src/canfar_lab/data/agent/claude/mcp.json +33 -0
  222. canfar_lab-0.7.0/src/canfar_lab/data/agent/claude/settings.json +17 -0
  223. canfar_lab-0.7.0/src/canfar_lab/data/agent/cli/agent-tools.sh +17 -0
  224. canfar_lab-0.7.0/src/canfar_lab/data/agent/cline/cline-notes.md +7 -0
  225. canfar_lab-0.7.0/src/canfar_lab/data/agent/codewhale/config.toml +12 -0
  226. canfar_lab-0.7.0/src/canfar_lab/data/agent/codex/config.toml +30 -0
  227. canfar_lab-0.7.0/src/canfar_lab/data/agent/copilot/mcp-config.json +42 -0
  228. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/mcp.json +33 -0
  229. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/astroai-lab-paths.mdc +18 -0
  230. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/cpp.mdc +13 -0
  231. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/env-hygiene.mdc +44 -0
  232. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/harness.mdc +17 -0
  233. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/latex.mdc +15 -0
  234. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/ponytail.mdc +36 -0
  235. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/python-pixi.mdc +13 -0
  236. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/python.mdc +15 -0
  237. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/shell.mdc +14 -0
  238. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/token-efficient.mdc +15 -0
  239. canfar_lab-0.7.0/src/canfar_lab/data/agent/cursor/rules/writing.mdc +15 -0
  240. canfar_lab-0.7.0/src/canfar_lab/data/agent/freebuff/astroai-notes.md +6 -0
  241. canfar_lab-0.7.0/src/canfar_lab/data/agent/goose/extensions.yaml +43 -0
  242. canfar_lab-0.7.0/src/canfar_lab/data/agent/goose/goosehints +6 -0
  243. canfar_lab-0.7.0/src/canfar_lab/data/agent/kilo/kilo.jsonc +12 -0
  244. canfar_lab-0.7.0/src/canfar_lab/data/agent/manifest.json +86 -0
  245. canfar_lab-0.7.0/src/canfar_lab/data/agent/marimo/marimo.toml +17 -0
  246. canfar_lab-0.7.0/src/canfar_lab/data/agent/muse/settings.json +3 -0
  247. canfar_lab-0.7.0/src/canfar_lab/data/agent/omp/astroai-notes.md +23 -0
  248. canfar_lab-0.7.0/src/canfar_lab/data/agent/opencode/opencode.json +42 -0
  249. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/agent/astronomy.md +25 -0
  250. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/canfar.md +81 -0
  251. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/command/astro-check.md +15 -0
  252. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/command/find-data.md +10 -0
  253. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/command/save-results.md +10 -0
  254. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/command/scale-out.md +12 -0
  255. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/astro-literature/SKILL.md +55 -0
  256. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/cadc-archive-search/SKILL.md +52 -0
  257. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/canfar-data-management/SKILL.md +63 -0
  258. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/canfar-ray-scaling/SKILL.md +76 -0
  259. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/catalog-crossmatch/SKILL.md +79 -0
  260. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/ccd-image-reduction/SKILL.md +79 -0
  261. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/fits-wcs-cutouts/SKILL.md +74 -0
  262. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/gaia-astrometry/SKILL.md +95 -0
  263. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/lightcurve-periodogram/SKILL.md +53 -0
  264. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/obscore-tap/SKILL.md +55 -0
  265. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/observation-planning/SKILL.md +69 -0
  266. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/photometric-calibration/SKILL.md +75 -0
  267. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/photometry-aperture/SKILL.md +65 -0
  268. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/spectra-specutils/SKILL.md +58 -0
  269. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/spectral-cubes/SKILL.md +68 -0
  270. canfar_lab-0.7.0/src/canfar_lab/data/agent/openscience/skills/vo-cutouts-datalink/SKILL.md +76 -0
  271. canfar_lab-0.7.0/src/canfar_lab/data/agent/pi/settings.json +4 -0
  272. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/ast-grep-cli.yaml +15 -0
  273. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/git-mcp.yaml +22 -0
  274. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/mcp-context7.yaml +12 -0
  275. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/mcp-memory.yaml +12 -0
  276. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/ponytail-rule.yaml +14 -0
  277. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/ray-manager-mcp.yaml +20 -0
  278. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/skore-cli.yaml +16 -0
  279. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/sqlite.yaml +26 -0
  280. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/time.yaml +23 -0
  281. canfar_lab-0.7.0/src/canfar_lab/data/agent/plugins/token-efficient.yaml +13 -0
  282. canfar_lab-0.7.0/src/canfar_lab/data/agent/project/.cursor/mcp.json +14 -0
  283. canfar_lab-0.7.0/src/canfar_lab/data/agent/project/.cursor/rules/project-defaults.mdc +11 -0
  284. canfar_lab-0.7.0/src/canfar_lab/data/agent/project/AGENTS.md +62 -0
  285. canfar_lab-0.7.0/src/canfar_lab/data/agent/qoder/astroai-notes.md +6 -0
  286. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/env-hygiene.md +39 -0
  287. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/harness.md +10 -0
  288. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/latex.md +7 -0
  289. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/ponytail.md +24 -0
  290. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/python-pixi.md +6 -0
  291. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/shell.md +6 -0
  292. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/token-efficient.md +3 -0
  293. canfar_lab-0.7.0/src/canfar_lab/data/agent/rules/writing.md +7 -0
  294. canfar_lab-0.7.0/src/canfar_lab/data/agent/support.yaml +87 -0
  295. canfar_lab-0.7.0/src/canfar_lab/data/agent/swival/astroai-notes.md +6 -0
  296. canfar_lab-0.7.0/src/canfar_lab/data/agent/zcode/astroai-notes.md +6 -0
  297. canfar_lab-0.7.0/src/canfar_lab/data/brand/README.md +11 -0
  298. canfar_lab-0.7.0/src/canfar_lab/data/brand/astroai-logo.png +0 -0
  299. canfar_lab-0.7.0/src/canfar_lab/data/desk/agents.html +159 -0
  300. canfar_lab-0.7.0/src/canfar_lab/data/desk/dock.html +230 -0
  301. canfar_lab-0.7.0/src/canfar_lab/data/notebooks/ray_train.ipynb +43 -0
  302. canfar_lab-0.7.0/src/canfar_lab/data/notebooks/starter.ipynb +460 -0
  303. canfar_lab-0.7.0/src/canfar_lab/data/notebooks/starter.py +423 -0
  304. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/HOWTO.md +294 -0
  305. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/README.md +225 -0
  306. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/VERSION +1 -0
  307. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/bin/dsh-web.sh +40 -0
  308. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/bin/panel.sh +108 -0
  309. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/cordis.bench.patch.yml +12 -0
  310. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/presets/review-bench/agent.cordis.yml +682 -0
  311. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/presets/review-bench/preset.yml +8 -0
  312. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/project-template/.dsh/README.md +95 -0
  313. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/project-template/.dsh/cordis.patch.yml +21 -0
  314. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/skills/astroai-team-charter/SKILL.md +167 -0
  315. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/skills/canfar-session/SKILL.md +44 -0
  316. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/skills/review-panel/SKILL.md +258 -0
  317. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/skills/review-panel/references/brief-template.md +42 -0
  318. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/skills/review-panel/references/panel-round1.js +130 -0
  319. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/skills/review-panel/references/report-template.md +49 -0
  320. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/skills/review-panel/references/rubric.md +128 -0
  321. canfar_lab-0.7.0/src/canfar_lab/data/review-bench/validate.mjs +314 -0
  322. canfar_lab-0.7.0/src/canfar_lab/data/shell/hooks.sh +68 -0
  323. canfar_lab-0.7.0/src/canfar_lab/data/shell/profile.sh +105 -0
  324. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-brand/cordis.patch.yml +8 -0
  325. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-brand/lib/client.js +81 -0
  326. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-brand/lib/index.js +2 -0
  327. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-brand/package.json +30 -0
  328. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-settings/cordis.patch.yml +4 -0
  329. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-settings/lib/client.js +308 -0
  330. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-settings/lib/index.js +111 -0
  331. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-astroai-settings/package.json +29 -0
  332. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-opencode-session/README.md +135 -0
  333. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-opencode-session/cordis.patch.yml +29 -0
  334. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-opencode-session/lib/index.js +216 -0
  335. canfar_lab-0.7.0/src/canfar_lab/data/studio/plugins/dsh-opencode-session/package.json +53 -0
  336. canfar_lab-0.7.0/src/canfar_lab/desk/__init__.py +15 -0
  337. canfar_lab-0.7.0/src/canfar_lab/desk/actions.py +281 -0
  338. canfar_lab-0.7.0/src/canfar_lab/desk/agents_page.py +84 -0
  339. canfar_lab-0.7.0/src/canfar_lab/desk/apps.py +384 -0
  340. canfar_lab-0.7.0/src/canfar_lab/desk/proxy.py +440 -0
  341. canfar_lab-0.7.0/src/canfar_lab/desk/serve.py +79 -0
  342. canfar_lab-0.7.0/src/canfar_lab/desk/state.py +155 -0
  343. canfar_lab-0.7.0/src/canfar_lab/dsh_release.py +158 -0
  344. canfar_lab-0.7.0/src/canfar_lab/errors.py +15 -0
  345. canfar_lab-0.7.0/src/canfar_lab/models/__init__.py +3 -0
  346. canfar_lab-0.7.0/src/canfar_lab/models/manifest.py +19 -0
  347. canfar_lab-0.7.0/src/canfar_lab/panel.py +274 -0
  348. canfar_lab-0.7.0/src/canfar_lab/session_urls.py +66 -0
  349. canfar_lab-0.7.0/src/canfar_lab/shell/__init__.py +1 -0
  350. canfar_lab-0.7.0/src/canfar_lab/shell/session_env.py +416 -0
  351. canfar_lab-0.7.0/src/canfar_lab/studio.py +557 -0
  352. canfar_lab-0.7.0/src/canfar_lab/studio_bundles.py +218 -0
  353. canfar_lab-0.7.0/src/canfar_lab/studio_doctor.py +578 -0
  354. canfar_lab-0.7.0/src/canfar_lab/studio_layer.py +968 -0
  355. canfar_lab-0.7.0/src/canfar_lab/studio_paths.py +225 -0
  356. canfar_lab-0.7.0/src/canfar_lab/studio_profile.py +177 -0
  357. canfar_lab-0.7.0/src/canfar_lab/sync/__init__.py +15 -0
  358. canfar_lab-0.7.0/src/canfar_lab/sync/arc_data.py +155 -0
  359. canfar_lab-0.7.0/src/canfar_lab/sync/bus.py +236 -0
  360. canfar_lab-0.7.0/src/canfar_lab/sync/catalog.py +221 -0
  361. canfar_lab-0.7.0/src/canfar_lab/sync/clock.py +30 -0
  362. canfar_lab-0.7.0/src/canfar_lab/sync/engine.py +512 -0
  363. canfar_lab-0.7.0/src/canfar_lab/sync/watch.py +167 -0
  364. canfar_lab-0.7.0/src/canfar_lab/ui.py +265 -0
  365. canfar_lab-0.7.0/src/canfar_lab/utils/__init__.py +0 -0
  366. canfar_lab-0.7.0/src/canfar_lab/utils/console.py +5 -0
  367. canfar_lab-0.7.0/src/canfar_lab/utils/json_utils.py +141 -0
  368. canfar_lab-0.7.0/src/canfar_lab/utils/subprocess.py +66 -0
  369. canfar_lab-0.7.0/src/canfar_lab/utils/timing.py +61 -0
  370. canfar_lab-0.7.0/src/canfar_lab/utils/toml_compat.py +12 -0
  371. canfar_lab-0.7.0/src/canfar_lab/version.py +57 -0
  372. canfar_lab-0.7.0/src/canfar_workload/__init__.py +30 -0
  373. canfar_lab-0.7.0/src/canfar_workload/astro_data.py +561 -0
  374. canfar_lab-0.7.0/src/canfar_workload/autoscaler.py +748 -0
  375. canfar_lab-0.7.0/src/canfar_workload/canfar_ops.py +324 -0
  376. canfar_lab-0.7.0/src/canfar_workload/cli.py +1095 -0
  377. canfar_lab-0.7.0/src/canfar_workload/cluster.py +600 -0
  378. canfar_lab-0.7.0/src/canfar_workload/dashboard.py +317 -0
  379. canfar_lab-0.7.0/src/canfar_workload/executor.py +238 -0
  380. canfar_lab-0.7.0/src/canfar_workload/manager_client.py +179 -0
  381. canfar_lab-0.7.0/src/canfar_workload/mcp.py +626 -0
  382. canfar_lab-0.7.0/src/canfar_workload/models.py +301 -0
  383. canfar_lab-0.7.0/src/canfar_workload/preflight.py +196 -0
  384. canfar_lab-0.7.0/src/canfar_workload/ray_cluster.py +119 -0
  385. canfar_lab-0.7.0/src/canfar_workload/reconcile.py +211 -0
  386. canfar_lab-0.7.0/src/canfar_workload/settings.py +96 -0
  387. canfar_lab-0.7.0/src/canfar_workload/state_store.py +180 -0
  388. canfar_lab-0.7.0/src/canfar_workload/worker_logs.py +45 -0
  389. canfar_lab-0.7.0/src/canfar_workload/workers.py +231 -0
  390. canfar_lab-0.7.0/templates/canfar-workspace/AGENTS.md +80 -0
  391. canfar_lab-0.7.0/templates/canfar-workspace/CLAUDE.md +1 -0
  392. canfar_lab-0.7.0/templates/canfar-workspace/scripts/sync-keys.py +402 -0
  393. canfar_lab-0.7.0/templates/canfar-workspace/scripts/workspace-doctor.py +338 -0
  394. canfar_lab-0.7.0/templates/canfar-workspace/scripts/workspace-sync.py +627 -0
  395. canfar_lab-0.7.0/templates/canfar-workspace/update-repos.sh +145 -0
  396. canfar_lab-0.7.0/templates/canfar-workspace/workspace.toml +158 -0
  397. canfar_lab-0.7.0/tests/__init__.py +0 -0
  398. canfar_lab-0.7.0/tests/cli/test_cli_agent_contract.py +217 -0
  399. canfar_lab-0.7.0/tests/cli/test_cli_extended.py +587 -0
  400. canfar_lab-0.7.0/tests/cli/test_commands.py +271 -0
  401. canfar_lab-0.7.0/tests/cli/test_dispatch.py +18 -0
  402. canfar_lab-0.7.0/tests/cli/test_env_shell.py +148 -0
  403. canfar_lab-0.7.0/tests/cli/test_session_flow.py +174 -0
  404. canfar_lab-0.7.0/tests/cli/test_sync.py +159 -0
  405. canfar_lab-0.7.0/tests/cli/test_sync_exchange.py +264 -0
  406. canfar_lab-0.7.0/tests/conftest.py +83 -0
  407. canfar_lab-0.7.0/tests/fixtures/canfar-skills/skills/astroai-ray/SKILL.md +93 -0
  408. canfar_lab-0.7.0/tests/helpers.py +84 -0
  409. canfar_lab-0.7.0/tests/integration/test_cold_start_save_resume.py +147 -0
  410. canfar_lab-0.7.0/tests/unit/test_addons.py +112 -0
  411. canfar_lab-0.7.0/tests/unit/test_agent.py +577 -0
  412. canfar_lab-0.7.0/tests/unit/test_agent_awesome_clean_fix.py +181 -0
  413. canfar_lab-0.7.0/tests/unit/test_agent_config.py +456 -0
  414. canfar_lab-0.7.0/tests/unit/test_agent_coverage_boost.py +355 -0
  415. canfar_lab-0.7.0/tests/unit/test_agent_extended.py +109 -0
  416. canfar_lab-0.7.0/tests/unit/test_agent_install_matrix.py +512 -0
  417. canfar_lab-0.7.0/tests/unit/test_agent_keys.py +253 -0
  418. canfar_lab-0.7.0/tests/unit/test_agent_remove.py +300 -0
  419. canfar_lab-0.7.0/tests/unit/test_agent_setup_state.py +182 -0
  420. canfar_lab-0.7.0/tests/unit/test_arc_data.py +43 -0
  421. canfar_lab-0.7.0/tests/unit/test_arc_permissions.py +94 -0
  422. canfar_lab-0.7.0/tests/unit/test_astro_eval.py +89 -0
  423. canfar_lab-0.7.0/tests/unit/test_audit_strip_ansi.py +100 -0
  424. canfar_lab-0.7.0/tests/unit/test_bin_root.py +195 -0
  425. canfar_lab-0.7.0/tests/unit/test_cadc_auth.py +49 -0
  426. canfar_lab-0.7.0/tests/unit/test_completions.py +155 -0
  427. canfar_lab-0.7.0/tests/unit/test_concurrency.py +101 -0
  428. canfar_lab-0.7.0/tests/unit/test_desk_apps.py +216 -0
  429. canfar_lab-0.7.0/tests/unit/test_desk_proxy.py +422 -0
  430. canfar_lab-0.7.0/tests/unit/test_desk_state_actions.py +393 -0
  431. canfar_lab-0.7.0/tests/unit/test_disk_usage.py +98 -0
  432. canfar_lab-0.7.0/tests/unit/test_dsh_release.py +126 -0
  433. canfar_lab-0.7.0/tests/unit/test_gh_release_install.py +94 -0
  434. canfar_lab-0.7.0/tests/unit/test_git_clone_update.py +92 -0
  435. canfar_lab-0.7.0/tests/unit/test_help_cmd.py +261 -0
  436. canfar_lab-0.7.0/tests/unit/test_home_clean.py +51 -0
  437. canfar_lab-0.7.0/tests/unit/test_home_layout.py +319 -0
  438. canfar_lab-0.7.0/tests/unit/test_hooks.py +15 -0
  439. canfar_lab-0.7.0/tests/unit/test_kernel.py +73 -0
  440. canfar_lab-0.7.0/tests/unit/test_opencode_config.py +175 -0
  441. canfar_lab-0.7.0/tests/unit/test_openrouter_key.py +94 -0
  442. canfar_lab-0.7.0/tests/unit/test_openscience_config.py +275 -0
  443. canfar_lab-0.7.0/tests/unit/test_panel.py +145 -0
  444. canfar_lab-0.7.0/tests/unit/test_paths.py +234 -0
  445. canfar_lab-0.7.0/tests/unit/test_paths_extended.py +122 -0
  446. canfar_lab-0.7.0/tests/unit/test_plugins.py +417 -0
  447. canfar_lab-0.7.0/tests/unit/test_project.py +59 -0
  448. canfar_lab-0.7.0/tests/unit/test_project_extended.py +363 -0
  449. canfar_lab-0.7.0/tests/unit/test_pure_logic.py +688 -0
  450. canfar_lab-0.7.0/tests/unit/test_reconcile.py +116 -0
  451. canfar_lab-0.7.0/tests/unit/test_registry.py +1354 -0
  452. canfar_lab-0.7.0/tests/unit/test_review_bench.py +276 -0
  453. canfar_lab-0.7.0/tests/unit/test_session_env.py +245 -0
  454. canfar_lab-0.7.0/tests/unit/test_settings.py +31 -0
  455. canfar_lab-0.7.0/tests/unit/test_shell_profile.py +82 -0
  456. canfar_lab-0.7.0/tests/unit/test_storage_extended.py +171 -0
  457. canfar_lab-0.7.0/tests/unit/test_studio.py +274 -0
  458. canfar_lab-0.7.0/tests/unit/test_studio_profile.py +800 -0
  459. canfar_lab-0.7.0/tests/unit/test_subprocess.py +29 -0
  460. canfar_lab-0.7.0/tests/unit/test_support_panel.py +146 -0
  461. canfar_lab-0.7.0/tests/unit/test_sync_bus.py +119 -0
  462. canfar_lab-0.7.0/tests/unit/test_sync_catalog.py +91 -0
  463. canfar_lab-0.7.0/tests/unit/test_sync_engine.py +221 -0
  464. canfar_lab-0.7.0/tests/unit/test_sync_watch.py +165 -0
  465. canfar_lab-0.7.0/tests/unit/test_timing.py +76 -0
  466. canfar_lab-0.7.0/tests/unit/test_ui.py +105 -0
  467. canfar_lab-0.7.0/tests/unit/test_version.py +51 -0
  468. canfar_lab-0.7.0/tests/unit/test_vospace_status.py +205 -0
  469. canfar_lab-0.7.0/tests/unit/test_wipe.py +253 -0
  470. canfar_lab-0.7.0/tests/workload/test_astro_data.py +220 -0
  471. canfar_lab-0.7.0/tests/workload/test_autoscaler.py +463 -0
  472. canfar_lab-0.7.0/tests/workload/test_benchmark_contract.py +19 -0
  473. canfar_lab-0.7.0/tests/workload/test_canfar_ops.py +44 -0
  474. canfar_lab-0.7.0/tests/workload/test_cli.py +229 -0
  475. canfar_lab-0.7.0/tests/workload/test_cluster.py +887 -0
  476. canfar_lab-0.7.0/tests/workload/test_dashboard.py +197 -0
  477. canfar_lab-0.7.0/tests/workload/test_executor.py +155 -0
  478. canfar_lab-0.7.0/tests/workload/test_mcp.py +357 -0
  479. canfar_lab-0.7.0/tests/workload/test_models.py +77 -0
@@ -0,0 +1,4 @@
1
+ trajectories/
2
+ failures/
3
+ state/
4
+ proposals/rejected.md
@@ -0,0 +1,7 @@
1
+ {
2
+ "verify_fast": ["./scripts/ci.sh"],
3
+ "verify": ["./scripts/ci.sh"],
4
+ "verify_full": ["./scripts/ci.sh"],
5
+ "reflect_min_turns": 5,
6
+ "reflect_min_minutes": 45
7
+ }
@@ -0,0 +1,13 @@
1
+ # verifier failure 2026-08-27-epistemic-stack
2
+
3
+ - `pixi run preflight-push` is configured as `verify_fast`, but this checkout
4
+ has no `preflight-push` Pixi task.
5
+ - `pixi run pytest -q tests/unit/test_addons.py tests/unit/test_plugins.py`
6
+ could not launch `pytest` because the current Pixi environment has no
7
+ `pytest` executable.
8
+ - `pixi run format-check` could not acquire the Pixi prefix lock from this
9
+ restricted checkout. Running the bundled Ruff directly with its cache under
10
+ `/private/tmp` passed (`153 files already formatted`).
11
+ - Follow-up: use the available `lint` task and direct catalog/skill checks;
12
+ do not classify the catalog changes as test failures until the environment
13
+ is provisioned.
@@ -0,0 +1,12 @@
1
+ # Harness Playbook
2
+
3
+ ## Bullets
4
+
5
+ - id: verify-tiers
6
+ desc: verify_fast during edits; verify (ci-local) before push; verify_full only when human opts in.
7
+
8
+ - id: file-memory
9
+ desc: Put durable notes in .cursor/harness/ — not long chat scrollback.
10
+
11
+ - id: minimal-diff
12
+ desc: Smallest correct change; match existing repo style and tools.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-08-27-epistemic-stack
2
+ status: completed
3
+ verifier: `pixi run lint`; bundled Ruff `format --check` with cache under `/private/tmp`; direct YAML/catalog invariant check; skill-creator quick validation
4
+ outcome: pass — lint, formatting, registry parsing, and bundled skill validation pass; pytest unavailable in current environment
5
+ lesson: The configured `pixi run preflight-push` task is absent from this checkout; keep the mismatch recorded until the repository verifier is reconciled.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-08-27-writing-skills
2
+ status: completed
3
+ verifier: pixi run ci; static registry and syntax checks
4
+ outcome: pass for lint/format/static checks; CI stopped at pre-existing missing tomli in the stale environment
5
+ lesson: Root-layout GitHub skills need the plugin id as their destination name.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-08-31-viz-skills
2
+ status: completed
3
+ verifier: pixi python load_plugins() for matplotlib-data-visualization
4
+ outcome: comment-only on matplotlib plugin; orx-* not added
5
+ lesson: openresearch image already runs `orx install-skills`; do not duplicate that tree in plugins/.
@@ -0,0 +1,7 @@
1
+ # 2026-09-07 consolidate onto astroai/main
2
+
3
+ - Rebased fork-only Ray autoscaler commits onto upstream; resolved `dashboard.py` (keep `live=` gate + manager_id probe path).
4
+ - Merged via https://github.com/astroai/canfar-lab/pull/11 → `af5ab3b`.
5
+ - Force-aligned `sfabbro/canfar-lab` `origin/main` to `upstream/main` (0/0 divergence).
6
+ - Deleted obsolete `wip/npx-platform-skills` and `wip/ray-autoscaler-cap`; removed vendor-astroai-ray worktree.
7
+ - Local only: harness `viz-skills` playbook bullet (unstaged).
@@ -0,0 +1,6 @@
1
+ # 2026-09-07 update from upstream/main
2
+
3
+ - FF `main` 758d6f3 → 8ca2ac3 (20 commits; agent CLIs home-canonical, plugin pack slimmed).
4
+ - Stash pop conflict: `matplotlib-data-visualization.yaml` modify/delete — kept upstream deletion (skills no longer vendored here).
5
+ - Re-applied local harness `viz-skills` bullet (worded for no in-tree plugin).
6
+ - Worktree `wip/npx-platform-skills`: rebase onto upstream skipped cherry-pick 97f6024 (already PR #10). Branch tip == upstream/main; origin/wip still has the old tip (needs force-push if retaining the remote branch).
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-10-21-studio-agent-layout
2
+ status: completed
3
+ verifier: ./scripts/ci.sh
4
+ outcome: pass (1121 passed, 19 skipped, coverage 75.85%)
5
+ lesson: a home drop symlink into the scratch bin is one binary; classify must not call it a second home install. Key reload must use BSD `stat -f` and `date +%s` — macOS bash 3.2 has no `stat -c` and no `EPOCHSECONDS`, and an empty stamp matches the unset stamp so keys never load. Download allow-list must include `tempfile.gettempdir()` (macOS pytest tmp is `/var/folders`, not `/tmp`). Panel key assertions must clear every catalog key, or a developer `ANTHROPIC_API_KEY` changes `keys_present`.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-10-21-studio-settings-usability
2
+ status: completed
3
+ verifier: pixi run pytest tests/unit/test_bin_root.py tests/cli/test_cli_agent_contract.py --no-cov; node --check settings client
4
+ outcome: pass
5
+ lesson: a missing settings payload must not render the laptop sentence; keep the last good layout and show the error. Key rows need catalog labels, and only https signup links.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-10-22-desktop-studio-launch
2
+ status: completed
3
+ verifier: ./scripts/ci.sh and python3 scripts/lib/test_studio_canfar_proxy.py
4
+ outcome: pass (1126 passed, proxy test ok). xmatcher stays the sync name; ~/src/astroai/xmatch is a separate checkout.
5
+ lesson: `--json` on `agent settings` must be a verb flag. A laptop `SCRATCH` directory is not a CANFAR session. The studio image pins `ARG DSH_VERSION` to canfar-lab's `DSH_VERSION`.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-10-22-desktop-sync-dock
2
+ status: completed
3
+ verifier: pixi run pytest tests/unit/test_studio.py tests/unit/test_desk_proxy.py tests/unit/test_studio_profile.py tests/unit/test_desk_state_actions.py -o addopts= -q
4
+ outcome: pass (110)
5
+ lesson: Laptop `canfar lab studio` must serve the desk proxy on the public port; bare dsh has no sync dock. A live :3080 that is not the proxy has to be quit before the dock can bind.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-10-22-local-notebooks-dock-bar
2
+ status: completed
3
+ verifier: pixi run pytest tests/unit/test_desk_apps.py tests/unit/test_desk_state_actions.py tests/unit/test_desk_proxy.py -o addopts= -q
4
+ outcome: pass (70)
5
+ lesson: Laptop JupyterLab and marimo are local loopback servers; the desk bar is a 44px top strip with a Hide handle.
@@ -0,0 +1,7 @@
1
+ # Studio launch on the laptop
2
+
3
+ `pixi run canfar` is the platform client. canfar 1.4.1 (PyPI) reads `~/.canfar/config.yaml` on import and exits when the file is schema version 2 (written by canfar 1.5). `canfar lab` does not use that file. The pixi task `canfar` routes a leading `lab` through `canfar_lab.cli.dispatch` and only then the platform client.
4
+
5
+ The astroai dsh profile must pin `@deepseek-ai/dsh-experimental-agent-team-profile` to `studio.DSH_VERSION`. npm `latest` for that package is still `0.1.5-alpha.2`, and a bare `dsh plugin add` installs it. Those 0.1.5 modules in the profile `node_modules` shadow the 0.2.1-rc.2 CLI and `typert-loader` dies on startup. One `dsh plugin add <name>@<pin>` upgrades and prunes the retired web-profile. A `remove` before that add aborts the upgrade.
6
+
7
+ `dsh plugin` needs `pnpm` on PATH. The studio image activates pnpm 12.6.0 with corepack.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-10-24-dsh-rc3-arc-doorbell
2
+ status: completed
3
+ verifier: pixi run pytest tests/unit/test_arc_data.py tests/unit/test_dsh_release.py tests/unit/test_studio.py tests/unit/test_desk_state_actions.py -o addopts= -q
4
+ outcome: pass after newest-tag fixture moved above the pin
5
+ lesson: npm latest can lag next. The doorbell uses canfar data cp to arc:/home; vosfs stays inside that client.
@@ -0,0 +1,5 @@
1
+ # trajectory 2026-10-24-review-ship
2
+ status: completed
3
+ verifier: ./scripts/ci.sh
4
+ outcome: pass — 1270 passed, 19 skipped, coverage 76.92%
5
+ lesson: pixi upgrade strips [project.dependencies] floors; restore canfar and the version bounds before committing the lock. ty 0.0.91 rejects @contextmanager -> Iterator.
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env bash
2
+ # Inject playbook context at session start when .cursor/harness exists.
3
+ set -euo pipefail
4
+
5
+ input=$(cat)
6
+ playbook=".cursor/harness/playbook.md"
7
+
8
+ if [[ ! -f "$playbook" ]]; then
9
+ echo '{}'
10
+ exit 0
11
+ fi
12
+
13
+ export HARNESS_PLAYBOOK="$playbook"
14
+ python3 <<'PY'
15
+ import json, os, re
16
+
17
+ path = os.environ.get("HARNESS_PLAYBOOK", ".cursor/harness/playbook.md")
18
+ try:
19
+ text = open(path).read()
20
+ except OSError:
21
+ print("{}")
22
+ raise SystemExit(0)
23
+
24
+ # ponytail: cap at 12 bullets to limit context injection
25
+ ids = re.findall(r"^- id:\s*(\S+)\s*\n\s*desc:\s*(.+)$", text, re.M)
26
+ if not ids:
27
+ print("{}")
28
+ raise SystemExit(0)
29
+
30
+ lines = [f"- id: {i}\n desc: {d.strip()}" for i, d in ids[:12]]
31
+ msg = (
32
+ "Harness playbook (full file: .cursor/harness/playbook.md). "
33
+ "Follow harness-coding: plan → execute → verify → file memory.\n\n"
34
+ + "\n\n".join(lines)
35
+ )
36
+ print(json.dumps({"additional_context": msg}))
37
+ PY
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 1,
3
+ "hooks": {
4
+ "sessionStart": [
5
+ {
6
+ "command": ".cursor/hooks/harness-session-start.sh"
7
+ }
8
+ ]
9
+ }
10
+ }
@@ -0,0 +1,11 @@
1
+ .venv
2
+ .git
3
+ .pytest_cache
4
+ .ruff_cache
5
+ htmlcov
6
+ .coverage
7
+ dist
8
+ **/__pycache__
9
+ *.pyc
10
+ *.egg-info
11
+ .mypy_cache
@@ -0,0 +1,47 @@
1
+ name: CI
2
+
3
+ # Remote gate mirroring ./scripts/ci.sh: ruff, ty, wheel data, CLI audit, pytest.
4
+ # Run ./scripts/ci.sh locally before pushing.
5
+ on:
6
+ push:
7
+ branches: [main]
8
+ pull_request:
9
+ branches: [main]
10
+
11
+ # The test job only checks out and runs checks; it never writes back to
12
+ # the repo, so restrict the GITHUB_TOKEN to read-only contents.
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ test:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v7
21
+
22
+ - uses: prefix-dev/setup-pixi@v0.10.2
23
+ with:
24
+ cache: true
25
+
26
+ - name: Lockfile integrity — pixi install --frozen
27
+ # Hard-fail on lockfile drift: --frozen refuses to touch pixi.lock
28
+ # and errors if the manifest changed without re-locking.
29
+ run: pixi install --frozen
30
+
31
+ - name: Ruff check
32
+ run: pixi run lint
33
+
34
+ - name: Ruff format
35
+ run: pixi run format-check
36
+
37
+ - name: ty typecheck
38
+ run: pixi run typecheck
39
+
40
+ - name: Wheel data
41
+ run: bash scripts/check-wheel.sh
42
+
43
+ - name: CLI audit
44
+ run: pixi run cli-audit
45
+
46
+ - name: Pytest
47
+ run: pixi run test
@@ -0,0 +1,24 @@
1
+ name: Publish
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ pypi:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ id-token: write
13
+ steps:
14
+ - uses: actions/checkout@v7
15
+
16
+ - uses: actions/setup-python@v7
17
+ with:
18
+ python-version: "3.13"
19
+
20
+ - name: Build
21
+ run: python -m pip install build hatchling && python -m build
22
+
23
+ - name: Publish to PyPI
24
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,20 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ dist/
7
+ *.egg-info/
8
+ .coverage
9
+ htmlcov/
10
+
11
+ # Local MNIST example artifacts
12
+ examples/workload/mnist_cnn/data/
13
+ examples/workload/mnist_cnn/*.pt
14
+ uv.lock
15
+
16
+ # Agent scratch directories
17
+ .freebuff/
18
+ .agents/
19
+ .codex/
20
+
@@ -0,0 +1,73 @@
1
+ # AGENTS.md — canfar-lab
2
+
3
+ In-session CANFAR Science Platform workbench and workload tooling (`canfar-lab`).
4
+ CANFAR is the platform. This package is one command tree: `canfar lab` on the
5
+ platform CLI, and the standalone `canfar-lab` binary.
6
+
7
+ ## Remotes (AstroAI fork workflow)
8
+
9
+ | Remote | Points at | Use |
10
+ |--------|-----------|-----|
11
+ | `origin` | `<github_user>/canfar-lab` | Push fork `main` |
12
+ | `upstream` | `astroai/canfar-lab` | Sync `main`; PR target |
13
+
14
+ `main` tracks `upstream/main`. Prefer working and pushing on fork `main`.
15
+ Never force-push `astroai` `main`.
16
+
17
+ ```bash
18
+ git fetch upstream && git rebase upstream/main
19
+ # edit on main
20
+ git push origin main
21
+ gh pr create -R astroai/canfar-lab --head <github_user>:main
22
+ ```
23
+
24
+ ## Environment
25
+
26
+ Pixi (`[tool.pixi]` in `pyproject.toml`). Prefer `pixi run` over system Python.
27
+
28
+ ```bash
29
+ pixi install
30
+ ```
31
+
32
+ ## Verification
33
+
34
+ ```bash
35
+ ./scripts/ci.sh # lint, format, typecheck, CLI audit, pytest
36
+ canfar lab studio --doctor # Studio pre-flight (needs dsh on PATH)
37
+ canfar lab panel doctor # headless Team / review-bench
38
+ ```
39
+
40
+ Harness verify tasks in `.cursor/harness/config.json` map to the same gate.
41
+
42
+ ## In-session project template
43
+
44
+ The AGENTS template copied into user projects lives under
45
+ `src/canfar_lab/data/agent/project/AGENTS.md`. Edit that file when changing
46
+ what lab users see after `canfar lab agent setup`, not only this root file.
47
+
48
+ Workspace layout and `/arc` rules (`PYTHONNOUSERSITE`, no `$HOME/.local`
49
+ installs): parent workspace `AGENTS.md` (`~/src/AGENTS.md`).
50
+
51
+ ## Env hygiene
52
+
53
+ - Prefer `pixi run` / `pixi run python` over bare `python3` when Pixi exists.
54
+ - Never `pip install --user` or install into `~/.local` / `$HOME/.local` (esp. CANFAR `/arc/home`).
55
+ - Headless/batch: `export PYTHONNOUSERSITE=1` and `unset PYTHONPATH`.
56
+ - On CANFAR: code under `$WORK` → `/scratch/src` (session-ephemeral). Prefer
57
+ `canfar lab sync` / `canfar lab clone <fork> --update` to refresh source; `save`/`resume` are deps only.
58
+ See `docs/USAGE.md` → Getting code onto jobs; skill `canfar-lab-workflow`.
59
+ - Session images: always `images.canfar.net/astroai/*` — **never** `skaha/*`.
60
+
61
+ ## Code propagation (jobs + sessions)
62
+
63
+ On CANFAR, code lives under `$WORK` → **`$SCRATCH/src`** (session-ephemeral).
64
+ Workers do not see another pod's `/scratch`. Pick a mode before jobs:
65
+
66
+ 1. **GitHub push → pull** (default): push fork `origin`, then
67
+ `canfar lab sync` or `canfar lab clone <fork/repo> --update` (or `--ref <sha>`). Prints HEAD SHA.
68
+ 2. **`canfar lab save` / `resume`**: lockfiles / env only — **not** source.
69
+ 3. **VOSpace tarball** under `vos:$USER/astroai/` (pack deps yourself; no CLI yet).
70
+ 4. **2 + 3** for reproducible headless (env snapshot + code blob).
71
+
72
+ Same-session Ray: `canfar lab run` packages local `working_dir`. Details:
73
+ `docs/USAGE.md` § Code propagation.
@@ -0,0 +1,2 @@
1
+ @AGENTS.md
2
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sébastien Fabbro
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,156 @@
1
+ Metadata-Version: 2.5
2
+ Name: canfar-lab
3
+ Version: 0.7.0
4
+ Summary: In-session workbench and workload CLI extensions for the CANFAR Science Platform
5
+ Project-URL: Homepage, https://github.com/astroai/canfar-lab
6
+ Project-URL: Documentation, https://github.com/astroai/canfar-lab/blob/main/docs/USAGE.md
7
+ Project-URL: Repository, https://github.com/astroai/canfar-lab
8
+ Project-URL: Issues, https://github.com/astroai/canfar-lab/issues
9
+ Project-URL: Platform, https://opencadc.github.io/canfar/
10
+ Author-email: Simon Fabbro <simon.fabbro@nrc-cnrc.gc.ca>
11
+ License: MIT License
12
+
13
+ Copyright (c) 2026 Sébastien Fabbro
14
+
15
+ Permission is hereby granted, free of charge, to any person obtaining a copy
16
+ of this software and associated documentation files (the "Software"), to deal
17
+ in the Software without restriction, including without limitation the rights
18
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19
+ copies of the Software, and to permit persons to whom the Software is
20
+ furnished to do so, subject to the following conditions:
21
+
22
+ The above copyright notice and this permission notice shall be included in all
23
+ copies or substantial portions of the Software.
24
+
25
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
+ SOFTWARE.
32
+ License-File: LICENSE
33
+ Keywords: astroai,astronomy,canfar,science-platform,session
34
+ Classifier: Development Status :: 3 - Alpha
35
+ Classifier: Environment :: Console
36
+ Classifier: Intended Audience :: Developers
37
+ Classifier: Intended Audience :: Science/Research
38
+ Classifier: License :: OSI Approved :: MIT License
39
+ Classifier: Natural Language :: English
40
+ Classifier: Operating System :: POSIX :: Linux
41
+ Classifier: Programming Language :: Python :: 3 :: Only
42
+ Classifier: Programming Language :: Python :: 3.10
43
+ Classifier: Programming Language :: Python :: 3.11
44
+ Classifier: Programming Language :: Python :: 3.12
45
+ Classifier: Programming Language :: Python :: 3.13
46
+ Classifier: Topic :: Scientific/Engineering :: Astronomy
47
+ Requires-Python: >=3.10
48
+ Requires-Dist: canfar>=1.5.2
49
+ Requires-Dist: httpx>=0.28.1
50
+ Requires-Dist: pydantic-settings>=2.16.1
51
+ Requires-Dist: pydantic>=2.14.1
52
+ Requires-Dist: pyyaml>=6.0.3
53
+ Requires-Dist: rich>=15.0.0
54
+ Requires-Dist: tomli>=2.5.0; python_version < '3.11'
55
+ Requires-Dist: typer>=0.27.3
56
+ Provides-Extra: dev
57
+ Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
58
+ Requires-Dist: pytest>=9.1.1; extra == 'dev'
59
+ Requires-Dist: ruff>=0.17.2; extra == 'dev'
60
+ Requires-Dist: ty>=0.0.91; extra == 'dev'
61
+ Description-Content-Type: text/markdown
62
+
63
+ # canfar-lab
64
+
65
+ The **`canfar lab`** commands you run *inside* an AstroAI session on the
66
+ [CANFAR Science Platform](https://www.opencadc.org/canfar/). The same tree is
67
+ the standalone `canfar-lab` binary.
68
+
69
+ Start and stop sessions with [`canfar`](https://github.com/opencadc/canfar)
70
+ (or the Science Portal). Inside the session, `canfar lab` does three jobs:
71
+
72
+ 1. **Project env** — `init` / `clone` / `save` / `resume` (lockfiles on `/arc`)
73
+ 2. **Ray cluster** — `cluster start` / `status` / `run` / `jobs`
74
+ 3. **Agents** — `agent setup` / `install` / `verify`
75
+
76
+ ```mermaid
77
+ flowchart LR
78
+ subgraph laptop [Laptop or portal]
79
+ Portal[Science Portal]
80
+ CanfarCLI["canfar login / create"]
81
+ end
82
+ subgraph session [AstroAI session]
83
+ Lab["canfar lab"]
84
+ Tools["pixi / uv / Jupyter / CADC / Ray"]
85
+ end
86
+ Portal --> session
87
+ CanfarCLI --> session
88
+ Lab --> Tools
89
+ ```
90
+
91
+ | Name | Meaning |
92
+ |------|---------|
93
+ | **AstroAI** | Product: GitHub [`astroai`](https://github.com/astroai), Harbor `astroai` |
94
+ | **CANFAR** | Host platform: portal, Skaha, `/arc`, auth |
95
+ | **`canfar`** | Platform CLI — sessions and `canfar data` |
96
+ | **`canfar lab` / `canfar-lab`** | This package, inside a session |
97
+ | **`images.canfar.net/astroai/*`** | Session images |
98
+
99
+ Images: [canfar-containers](https://github.com/astroai/canfar-containers).
100
+
101
+ ## Inside a session
102
+
103
+ ```bash
104
+ canfar lab # status banner
105
+ canfar lab init mylab # or: clone owner/repo
106
+ canfar lab save # lockfile snapshot to /arc
107
+ canfar lab resume mylab
108
+ canfar lab status # quotas, sessions (not the Ray cluster)
109
+
110
+ canfar lab cluster start
111
+ canfar lab cluster status
112
+ canfar lab run train.py --cpus 2
113
+
114
+ canfar lab kernel ensure
115
+ canfar lab agent setup
116
+ ```
117
+
118
+ `canfar lab status` is this session’s CPU/disk/quota. `canfar lab cluster status`
119
+ is whether the Ray cluster is up. `canfar lab cluster stop` tears down workers
120
+ and the manager.
121
+
122
+ Help: `canfar lab help` · one command: `canfar lab help -c cluster` · cheat sheet:
123
+ [docs/help.md](docs/help.md)
124
+
125
+ ## Install
126
+
127
+ ```bash
128
+ pip install canfar-lab
129
+ canfar-lab --help
130
+ ```
131
+
132
+ Do not pass `--user`. On a CANFAR session that writes `/arc/home/.local`. If the image Python is not writable, `uv pip install --python /opt/canfar canfar-lab`. Upgrade with `pip install -U canfar-lab`. Session images that already include the package put `canfar-lab` on PATH.
133
+
134
+ ## Docs
135
+
136
+ | Doc | What it is |
137
+ |-----|------------|
138
+ | [docs/help.md](docs/help.md) | Cheat sheet |
139
+ | [docs/USAGE.md](docs/USAGE.md) | Storage, workflows, Ray, agents |
140
+ | [docs/cli.md](docs/cli.md) | Flags and every command |
141
+ | [docs/config.md](docs/config.md) | Optional `~/.astroai/lab/config.yaml` |
142
+ | [docs/concurrency.md](docs/concurrency.md) | Shared home: locks, atomic writes, agent runtime placement |
143
+ | [docs/studio.md](docs/studio.md) | AstroAI Studio: the browser coding portal, its dsh profile, teams, storage split |
144
+ | [docs/desk-sync.md](docs/desk-sync.md) | Desk cockpit and CANFAR ↔ desktop sync (design proposal) |
145
+ | [docs/panel.md](docs/panel.md) | AstroAI Panel / Studio Team review (keys only; models in dsh Settings) |
146
+
147
+ Data movement is not this CLI. Use **`canfar data`** and `vcp` / `vls`.
148
+
149
+ ## Development
150
+
151
+ ```bash
152
+ ./scripts/ci.sh
153
+ pixi run test
154
+ ```
155
+
156
+ [MIT](LICENSE). `canfar` keeps its own license.
@@ -0,0 +1,94 @@
1
+ # canfar-lab
2
+
3
+ The **`canfar lab`** commands you run *inside* an AstroAI session on the
4
+ [CANFAR Science Platform](https://www.opencadc.org/canfar/). The same tree is
5
+ the standalone `canfar-lab` binary.
6
+
7
+ Start and stop sessions with [`canfar`](https://github.com/opencadc/canfar)
8
+ (or the Science Portal). Inside the session, `canfar lab` does three jobs:
9
+
10
+ 1. **Project env** — `init` / `clone` / `save` / `resume` (lockfiles on `/arc`)
11
+ 2. **Ray cluster** — `cluster start` / `status` / `run` / `jobs`
12
+ 3. **Agents** — `agent setup` / `install` / `verify`
13
+
14
+ ```mermaid
15
+ flowchart LR
16
+ subgraph laptop [Laptop or portal]
17
+ Portal[Science Portal]
18
+ CanfarCLI["canfar login / create"]
19
+ end
20
+ subgraph session [AstroAI session]
21
+ Lab["canfar lab"]
22
+ Tools["pixi / uv / Jupyter / CADC / Ray"]
23
+ end
24
+ Portal --> session
25
+ CanfarCLI --> session
26
+ Lab --> Tools
27
+ ```
28
+
29
+ | Name | Meaning |
30
+ |------|---------|
31
+ | **AstroAI** | Product: GitHub [`astroai`](https://github.com/astroai), Harbor `astroai` |
32
+ | **CANFAR** | Host platform: portal, Skaha, `/arc`, auth |
33
+ | **`canfar`** | Platform CLI — sessions and `canfar data` |
34
+ | **`canfar lab` / `canfar-lab`** | This package, inside a session |
35
+ | **`images.canfar.net/astroai/*`** | Session images |
36
+
37
+ Images: [canfar-containers](https://github.com/astroai/canfar-containers).
38
+
39
+ ## Inside a session
40
+
41
+ ```bash
42
+ canfar lab # status banner
43
+ canfar lab init mylab # or: clone owner/repo
44
+ canfar lab save # lockfile snapshot to /arc
45
+ canfar lab resume mylab
46
+ canfar lab status # quotas, sessions (not the Ray cluster)
47
+
48
+ canfar lab cluster start
49
+ canfar lab cluster status
50
+ canfar lab run train.py --cpus 2
51
+
52
+ canfar lab kernel ensure
53
+ canfar lab agent setup
54
+ ```
55
+
56
+ `canfar lab status` is this session’s CPU/disk/quota. `canfar lab cluster status`
57
+ is whether the Ray cluster is up. `canfar lab cluster stop` tears down workers
58
+ and the manager.
59
+
60
+ Help: `canfar lab help` · one command: `canfar lab help -c cluster` · cheat sheet:
61
+ [docs/help.md](docs/help.md)
62
+
63
+ ## Install
64
+
65
+ ```bash
66
+ pip install canfar-lab
67
+ canfar-lab --help
68
+ ```
69
+
70
+ Do not pass `--user`. On a CANFAR session that writes `/arc/home/.local`. If the image Python is not writable, `uv pip install --python /opt/canfar canfar-lab`. Upgrade with `pip install -U canfar-lab`. Session images that already include the package put `canfar-lab` on PATH.
71
+
72
+ ## Docs
73
+
74
+ | Doc | What it is |
75
+ |-----|------------|
76
+ | [docs/help.md](docs/help.md) | Cheat sheet |
77
+ | [docs/USAGE.md](docs/USAGE.md) | Storage, workflows, Ray, agents |
78
+ | [docs/cli.md](docs/cli.md) | Flags and every command |
79
+ | [docs/config.md](docs/config.md) | Optional `~/.astroai/lab/config.yaml` |
80
+ | [docs/concurrency.md](docs/concurrency.md) | Shared home: locks, atomic writes, agent runtime placement |
81
+ | [docs/studio.md](docs/studio.md) | AstroAI Studio: the browser coding portal, its dsh profile, teams, storage split |
82
+ | [docs/desk-sync.md](docs/desk-sync.md) | Desk cockpit and CANFAR ↔ desktop sync (design proposal) |
83
+ | [docs/panel.md](docs/panel.md) | AstroAI Panel / Studio Team review (keys only; models in dsh Settings) |
84
+
85
+ Data movement is not this CLI. Use **`canfar data`** and `vcp` / `vls`.
86
+
87
+ ## Development
88
+
89
+ ```bash
90
+ ./scripts/ci.sh
91
+ pixi run test
92
+ ```
93
+
94
+ [MIT](LICENSE). `canfar` keeps its own license.