just-another-coding-agent 0.1.7__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 (230) hide show
  1. just_another_coding_agent-0.1.7/.codex +0 -0
  2. just_another_coding_agent-0.1.7/.editorconfig +12 -0
  3. just_another_coding_agent-0.1.7/.env.example +7 -0
  4. just_another_coding_agent-0.1.7/.github/workflows/ci.yml +63 -0
  5. just_another_coding_agent-0.1.7/.github/workflows/release.yml +156 -0
  6. just_another_coding_agent-0.1.7/.gitignore +218 -0
  7. just_another_coding_agent-0.1.7/.python-version +1 -0
  8. just_another_coding_agent-0.1.7/.vscode/launch.json +193 -0
  9. just_another_coding_agent-0.1.7/.vscode/settings.json +20 -0
  10. just_another_coding_agent-0.1.7/AGENTS.md +61 -0
  11. just_another_coding_agent-0.1.7/Makefile +13 -0
  12. just_another_coding_agent-0.1.7/PKG-INFO +244 -0
  13. just_another_coding_agent-0.1.7/README.md +225 -0
  14. just_another_coding_agent-0.1.7/cmd/jaca/main.go +178 -0
  15. just_another_coding_agent-0.1.7/cmd/jaca/main_test.go +102 -0
  16. just_another_coding_agent-0.1.7/cmd/jaca-read-only-worker/main.go +977 -0
  17. just_another_coding_agent-0.1.7/cmd/jaca-read-only-worker/main_test.go +244 -0
  18. just_another_coding_agent-0.1.7/docs/README.md +50 -0
  19. just_another_coding_agent-0.1.7/docs/adr/0001-use-pydanticai-as-engine.md +21 -0
  20. just_another_coding_agent-0.1.7/docs/adr/0002-headless-coding-agent-is-the-product.md +21 -0
  21. just_another_coding_agent-0.1.7/docs/adr/0003-canonical-session-and-rpc-contract.md +26 -0
  22. just_another_coding_agent-0.1.7/docs/adr/0004-canonical-package-layout.md +29 -0
  23. just_another_coding_agent-0.1.7/docs/adr/0005-preserve-pi-product-behavior-not-architecture.md +35 -0
  24. just_another_coding_agent-0.1.7/docs/adr/0006-internal-execution-helpers-must-not-own-tool-semantics.md +62 -0
  25. just_another_coding_agent-0.1.7/docs/architecture.md +242 -0
  26. just_another_coding_agent-0.1.7/docs/chatgpt-subscription-oauth-spike.md +209 -0
  27. just_another_coding_agent-0.1.7/docs/compaction.md +194 -0
  28. just_another_coding_agent-0.1.7/docs/contracts.md +713 -0
  29. just_another_coding_agent-0.1.7/docs/development.md +152 -0
  30. just_another_coding_agent-0.1.7/docs/goal.md +80 -0
  31. just_another_coding_agent-0.1.7/docs/grounding.md +17 -0
  32. just_another_coding_agent-0.1.7/docs/harbor-terminal-bench.md +451 -0
  33. just_another_coding_agent-0.1.7/docs/learning/terminal-bench-checklist.md +133 -0
  34. just_another_coding_agent-0.1.7/docs/mental-model.md +302 -0
  35. just_another_coding_agent-0.1.7/docs/read-only-worker.md +145 -0
  36. just_another_coding_agent-0.1.7/docs/stateful-orchestration.md +133 -0
  37. just_another_coding_agent-0.1.7/docs/terminal-bench-journal.md +406 -0
  38. just_another_coding_agent-0.1.7/docs/tui-architecture-plan.md +648 -0
  39. just_another_coding_agent-0.1.7/docs/tui.md +174 -0
  40. just_another_coding_agent-0.1.7/evaluations/__init__.py +1 -0
  41. just_another_coding_agent-0.1.7/evaluations/bench/__init__.py +19 -0
  42. just_another_coding_agent-0.1.7/evaluations/bench/exec_prompt.py +493 -0
  43. just_another_coding_agent-0.1.7/evaluations/harbor/__init__.py +5 -0
  44. just_another_coding_agent-0.1.7/evaluations/harbor/agent.py +117 -0
  45. just_another_coding_agent-0.1.7/evaluations/harbor/commands.py +231 -0
  46. just_another_coding_agent-0.1.7/evaluations/harbor/install-just-another-coding-agent.sh.j2 +53 -0
  47. just_another_coding_agent-0.1.7/evaluations/scripts/build_tb2_submission_tree.py +157 -0
  48. just_another_coding_agent-0.1.7/evaluations/scripts/run_tb2_submission_glm5.sh +206 -0
  49. just_another_coding_agent-0.1.7/evaluations/scripts/run_tb2_submission_glm5_slice.sh +240 -0
  50. just_another_coding_agent-0.1.7/evaluations/scripts/tb2_glm5.sh +78 -0
  51. just_another_coding_agent-0.1.7/evaluations/scripts/tb2_gpt54_chatgpt.sh +17 -0
  52. just_another_coding_agent-0.1.7/evaluations/scripts/validate_tb2_bundle.py +101 -0
  53. just_another_coding_agent-0.1.7/evaluations/scripts/validate_tb2_submission_tree.py +169 -0
  54. just_another_coding_agent-0.1.7/evaluations/swebench/__init__.py +1 -0
  55. just_another_coding_agent-0.1.7/evaluations/swebench/batch.py +161 -0
  56. just_another_coding_agent-0.1.7/evaluations/swebench/cli.py +115 -0
  57. just_another_coding_agent-0.1.7/evaluations/swebench/dataset.py +67 -0
  58. just_another_coding_agent-0.1.7/evaluations/swebench/prompt.py +66 -0
  59. just_another_coding_agent-0.1.7/evaluations/swebench/runner.py +118 -0
  60. just_another_coding_agent-0.1.7/evaluations/watchdog/__init__.py +5 -0
  61. just_another_coding_agent-0.1.7/evaluations/watchdog/evaluators.py +57 -0
  62. just_another_coding_agent-0.1.7/experiments/read_only_worker/bench.py +472 -0
  63. just_another_coding_agent-0.1.7/experiments/read_only_worker/python_subprocess_worker.py +87 -0
  64. just_another_coding_agent-0.1.7/experiments/read_only_worker/rust_worker/Cargo.lock +107 -0
  65. just_another_coding_agent-0.1.7/experiments/read_only_worker/rust_worker/Cargo.toml +8 -0
  66. just_another_coding_agent-0.1.7/experiments/read_only_worker/rust_worker/src/main.rs +506 -0
  67. just_another_coding_agent-0.1.7/go.mod +31 -0
  68. just_another_coding_agent-0.1.7/go.sum +49 -0
  69. just_another_coding_agent-0.1.7/internal/jaca/app/auth.go +229 -0
  70. just_another_coding_agent-0.1.7/internal/jaca/app/backend.go +38 -0
  71. just_another_coding_agent-0.1.7/internal/jaca/app/integration_test.go +358 -0
  72. just_another_coding_agent-0.1.7/internal/jaca/app/login.go +246 -0
  73. just_another_coding_agent-0.1.7/internal/jaca/app/markdown.go +216 -0
  74. just_another_coding_agent-0.1.7/internal/jaca/app/model.go +1380 -0
  75. just_another_coding_agent-0.1.7/internal/jaca/app/model_test.go +2085 -0
  76. just_another_coding_agent-0.1.7/internal/jaca/app/onboarding.go +216 -0
  77. just_another_coding_agent-0.1.7/internal/jaca/app/render.go +904 -0
  78. just_another_coding_agent-0.1.7/internal/jaca/app/render_test.go +546 -0
  79. just_another_coding_agent-0.1.7/internal/jaca/app/session.go +59 -0
  80. just_another_coding_agent-0.1.7/internal/jaca/app/settings.go +468 -0
  81. just_another_coding_agent-0.1.7/internal/jaca/app/slash.go +473 -0
  82. just_another_coding_agent-0.1.7/internal/jaca/app/slash_test.go +143 -0
  83. just_another_coding_agent-0.1.7/internal/jaca/app/textwrap.go +138 -0
  84. just_another_coding_agent-0.1.7/internal/jaca/app/toolrender.go +767 -0
  85. just_another_coding_agent-0.1.7/internal/jaca/app/transcript.go +700 -0
  86. just_another_coding_agent-0.1.7/internal/jaca/app/transcript_test.go +1340 -0
  87. just_another_coding_agent-0.1.7/internal/jaca/app/update.go +164 -0
  88. just_another_coding_agent-0.1.7/internal/jaca/app/update_test.go +20 -0
  89. just_another_coding_agent-0.1.7/internal/jaca/config/config.go +124 -0
  90. just_another_coding_agent-0.1.7/internal/jaca/config/config_test.go +151 -0
  91. just_another_coding_agent-0.1.7/internal/jaca/rpc/client.go +1229 -0
  92. just_another_coding_agent-0.1.7/internal/jaca/rpc/client_test.go +478 -0
  93. just_another_coding_agent-0.1.7/internal/jaca/rpc/types.go +316 -0
  94. just_another_coding_agent-0.1.7/internal/jaca/rpc/types_test.go +188 -0
  95. just_another_coding_agent-0.1.7/pyproject.toml +50 -0
  96. just_another_coding_agent-0.1.7/scripts/debug_rpc_once.py +153 -0
  97. just_another_coding_agent-0.1.7/scripts/verify_bundled_wheel.py +64 -0
  98. just_another_coding_agent-0.1.7/scripts/verify_release_artifacts.py +79 -0
  99. just_another_coding_agent-0.1.7/src/just_another_coding_agent/__init__.py +5 -0
  100. just_another_coding_agent-0.1.7/src/just_another_coding_agent/__main__.py +392 -0
  101. just_another_coding_agent-0.1.7/src/just_another_coding_agent/_hatch_build.py +50 -0
  102. just_another_coding_agent-0.1.7/src/just_another_coding_agent/auth.py +389 -0
  103. just_another_coding_agent-0.1.7/src/just_another_coding_agent/config.py +61 -0
  104. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/__init__.py +1 -0
  105. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/auth.py +56 -0
  106. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/compaction.py +41 -0
  107. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/model_catalog.py +275 -0
  108. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/platform.py +15 -0
  109. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/rpc.py +415 -0
  110. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/run_events.py +259 -0
  111. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/session.py +179 -0
  112. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/thinking.py +16 -0
  113. just_another_coding_agent-0.1.7/src/just_another_coding_agent/contracts/tools.py +31 -0
  114. just_another_coding_agent-0.1.7/src/just_another_coding_agent/go_binaries.py +87 -0
  115. just_another_coding_agent-0.1.7/src/just_another_coding_agent/go_tui.py +103 -0
  116. just_another_coding_agent-0.1.7/src/just_another_coding_agent/oauth_github_copilot.py +358 -0
  117. just_another_coding_agent-0.1.7/src/just_another_coding_agent/oauth_openai_codex.py +417 -0
  118. just_another_coding_agent-0.1.7/src/just_another_coding_agent/oauth_store.py +128 -0
  119. just_another_coding_agent-0.1.7/src/just_another_coding_agent/provider_readiness.py +146 -0
  120. just_another_coding_agent-0.1.7/src/just_another_coding_agent/rpc/__init__.py +5 -0
  121. just_another_coding_agent-0.1.7/src/just_another_coding_agent/rpc/session_store.py +273 -0
  122. just_another_coding_agent-0.1.7/src/just_another_coding_agent/rpc/stdio.py +1134 -0
  123. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/__init__.py +63 -0
  124. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/activity.py +229 -0
  125. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/agent.py +212 -0
  126. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/__init__.py +27 -0
  127. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/boundary.py +44 -0
  128. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/budget.py +27 -0
  129. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/constants.py +22 -0
  130. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/resume.py +81 -0
  131. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/session_summary.py +186 -0
  132. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/source_builder.py +193 -0
  133. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/compaction/trigger.py +276 -0
  134. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/env.py +17 -0
  135. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/local_traces.py +98 -0
  136. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/models.py +481 -0
  137. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/observability.py +136 -0
  138. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/project_docs.py +155 -0
  139. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/recovery.py +71 -0
  140. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/run.py +1211 -0
  141. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/session.py +552 -0
  142. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/token_estimation.py +62 -0
  143. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/tool_args.py +79 -0
  144. just_another_coding_agent-0.1.7/src/just_another_coding_agent/runtime/turn_context.py +435 -0
  145. just_another_coding_agent-0.1.7/src/just_another_coding_agent/secret_store.py +111 -0
  146. just_another_coding_agent-0.1.7/src/just_another_coding_agent/session/__init__.py +33 -0
  147. just_another_coding_agent-0.1.7/src/just_another_coding_agent/session/jsonl.py +988 -0
  148. just_another_coding_agent-0.1.7/src/just_another_coding_agent/session/preview.py +87 -0
  149. just_another_coding_agent-0.1.7/src/just_another_coding_agent/session/replacement_history.py +189 -0
  150. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/__init__.py +1 -0
  151. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/_activity.py +52 -0
  152. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/_workspace.py +24 -0
  153. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/deps.py +43 -0
  154. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/edit.py +288 -0
  155. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/errors.py +64 -0
  156. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/find.py +135 -0
  157. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/grep.py +161 -0
  158. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/ls.py +127 -0
  159. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/read.py +140 -0
  160. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/read_only_worker/__init__.py +1 -0
  161. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/read_only_worker/client.py +191 -0
  162. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/read_only_worker/launcher.py +37 -0
  163. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/read_only_worker/protocol.py +242 -0
  164. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/read_only_worker/runtime.py +53 -0
  165. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/registry.py +96 -0
  166. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/shell.py +326 -0
  167. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/truncation.py +194 -0
  168. just_another_coding_agent-0.1.7/src/just_another_coding_agent/tools/write.py +80 -0
  169. just_another_coding_agent-0.1.7/tests/conftest.py +8 -0
  170. just_another_coding_agent-0.1.7/tests/contracts/read_only_tool_test_support.py +53 -0
  171. just_another_coding_agent-0.1.7/tests/contracts/test_activity_metadata.py +162 -0
  172. just_another_coding_agent-0.1.7/tests/contracts/test_agent_builder.py +203 -0
  173. just_another_coding_agent-0.1.7/tests/contracts/test_auth_store.py +173 -0
  174. just_another_coding_agent-0.1.7/tests/contracts/test_bash_tool.py +291 -0
  175. just_another_coding_agent-0.1.7/tests/contracts/test_compaction_modules.py +353 -0
  176. just_another_coding_agent-0.1.7/tests/contracts/test_debug_rpc_once.py +179 -0
  177. just_another_coding_agent-0.1.7/tests/contracts/test_edit_tool.py +248 -0
  178. just_another_coding_agent-0.1.7/tests/contracts/test_find_tool.py +88 -0
  179. just_another_coding_agent-0.1.7/tests/contracts/test_go_tui_install.py +197 -0
  180. just_another_coding_agent-0.1.7/tests/contracts/test_go_tui_launcher.py +722 -0
  181. just_another_coding_agent-0.1.7/tests/contracts/test_grep_tool.py +75 -0
  182. just_another_coding_agent-0.1.7/tests/contracts/test_hatch_build.py +55 -0
  183. just_another_coding_agent-0.1.7/tests/contracts/test_ls_tool.py +76 -0
  184. just_another_coding_agent-0.1.7/tests/contracts/test_model_resolution.py +664 -0
  185. just_another_coding_agent-0.1.7/tests/contracts/test_observability.py +156 -0
  186. just_another_coding_agent-0.1.7/tests/contracts/test_parallel_tool_policy.py +202 -0
  187. just_another_coding_agent-0.1.7/tests/contracts/test_project_docs.py +65 -0
  188. just_another_coding_agent-0.1.7/tests/contracts/test_read_only_worker_client.py +195 -0
  189. just_another_coding_agent-0.1.7/tests/contracts/test_read_only_worker_install.py +45 -0
  190. just_another_coding_agent-0.1.7/tests/contracts/test_read_only_worker_protocol.py +271 -0
  191. just_another_coding_agent-0.1.7/tests/contracts/test_read_only_worker_runtime.py +97 -0
  192. just_another_coding_agent-0.1.7/tests/contracts/test_read_tool.py +138 -0
  193. just_another_coding_agent-0.1.7/tests/contracts/test_release_artifacts.py +74 -0
  194. just_another_coding_agent-0.1.7/tests/contracts/test_rpc_stdio.py +1859 -0
  195. just_another_coding_agent-0.1.7/tests/contracts/test_run_events.py +269 -0
  196. just_another_coding_agent-0.1.7/tests/contracts/test_runtime_env.py +37 -0
  197. just_another_coding_agent-0.1.7/tests/contracts/test_runtime_tracing.py +196 -0
  198. just_another_coding_agent-0.1.7/tests/contracts/test_session_jsonl.py +1836 -0
  199. just_another_coding_agent-0.1.7/tests/contracts/test_session_runtime.py +2720 -0
  200. just_another_coding_agent-0.1.7/tests/contracts/test_session_store.py +421 -0
  201. just_another_coding_agent-0.1.7/tests/contracts/test_tool_activity_returns.py +289 -0
  202. just_another_coding_agent-0.1.7/tests/contracts/test_tool_events.py +1529 -0
  203. just_another_coding_agent-0.1.7/tests/contracts/test_tool_registry.py +261 -0
  204. just_another_coding_agent-0.1.7/tests/contracts/test_tools_contract.py +21 -0
  205. just_another_coding_agent-0.1.7/tests/contracts/test_workspace_paths.py +71 -0
  206. just_another_coding_agent-0.1.7/tests/contracts/test_write_tool.py +91 -0
  207. just_another_coding_agent-0.1.7/tests/e2e/test_canonical_backend.py +325 -0
  208. just_another_coding_agent-0.1.7/tests/e2e/test_compaction_stress.py +663 -0
  209. just_another_coding_agent-0.1.7/tests/e2e/test_go_read_only_worker.py +269 -0
  210. just_another_coding_agent-0.1.7/tests/e2e/test_rust_read_only_worker.py +152 -0
  211. just_another_coding_agent-0.1.7/tests/e2e/test_stdio_server.py +1344 -0
  212. just_another_coding_agent-0.1.7/tests/evaluations/test_bench_package.py +15 -0
  213. just_another_coding_agent-0.1.7/tests/evaluations/test_compaction_continuity.py +424 -0
  214. just_another_coding_agent-0.1.7/tests/evaluations/test_exec_prompt.py +584 -0
  215. just_another_coding_agent-0.1.7/tests/evaluations/test_harbor_agent.py +209 -0
  216. just_another_coding_agent-0.1.7/tests/evaluations/test_harbor_commands.py +288 -0
  217. just_another_coding_agent-0.1.7/tests/evaluations/test_harbor_install_script.py +59 -0
  218. just_another_coding_agent-0.1.7/tests/evaluations/test_submission_glm5_launcher.py +249 -0
  219. just_another_coding_agent-0.1.7/tests/evaluations/test_submission_glm5_slice_launcher.py +276 -0
  220. just_another_coding_agent-0.1.7/tests/evaluations/test_swebench_batch.py +123 -0
  221. just_another_coding_agent-0.1.7/tests/evaluations/test_swebench_dataset.py +73 -0
  222. just_another_coding_agent-0.1.7/tests/evaluations/test_swebench_prompt.py +44 -0
  223. just_another_coding_agent-0.1.7/tests/evaluations/test_swebench_runner.py +164 -0
  224. just_another_coding_agent-0.1.7/tests/evaluations/test_tb2_glm5_harness.py +208 -0
  225. just_another_coding_agent-0.1.7/tests/evaluations/test_tb2_gpt54_chatgpt_harness.py +129 -0
  226. just_another_coding_agent-0.1.7/tests/evaluations/test_tb2_submission_tree_tools.py +190 -0
  227. just_another_coding_agent-0.1.7/tests/evaluations/test_watchdog_evaluators.py +98 -0
  228. just_another_coding_agent-0.1.7/tests/session_test_helpers.py +56 -0
  229. just_another_coding_agent-0.1.7/tests/test_package.py +5 -0
  230. just_another_coding_agent-0.1.7/uv.lock +2622 -0
File without changes
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ indent_style = space
7
+ indent_size = 4
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
@@ -0,0 +1,7 @@
1
+ # Provider credentials
2
+ OPENAI_API_KEY=
3
+ ANTHROPIC_API_KEY=
4
+
5
+ # Canonical local defaults
6
+ PI_PROVIDER=openai
7
+ PI_MODEL=gpt-5.2
@@ -0,0 +1,63 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ os: [ubuntu-latest, windows-latest, macos-latest]
13
+
14
+ runs-on: ${{ matrix.os }}
15
+
16
+ steps:
17
+ - name: Check out code
18
+ uses: actions/checkout@v5
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v6
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Set up uv
26
+ uses: astral-sh/setup-uv@v7
27
+ with:
28
+ enable-cache: false
29
+
30
+ - name: Set up Go
31
+ uses: actions/setup-go@v6
32
+ with:
33
+ go-version-file: go.mod
34
+
35
+ - name: Install dependencies
36
+ run: uv sync --extra dev --extra test
37
+
38
+ - name: Verify shipped provider imports
39
+ run: >-
40
+ uv run python -c
41
+ "from pydantic_ai.models.anthropic import AnthropicModel; from pydantic_ai.models.google import GoogleModel; from pydantic_ai.models.openai import OpenAIChatModel, OpenAIResponsesModel; from pydantic_ai.models.openrouter import OpenRouterModel"
42
+
43
+ - name: Lint
44
+ run: uv run ruff check .
45
+
46
+ - name: Run tests
47
+ run: >-
48
+ uv run python -m pytest
49
+ tests/contracts
50
+ tests/e2e
51
+ --ignore=tests/e2e/test_rust_read_only_worker.py
52
+ tests/evaluations
53
+
54
+ - name: Run Go tests
55
+ run: go test ./cmd/jaca ./cmd/jaca-read-only-worker ./internal/jaca/...
56
+
57
+ - name: Build bundled wheel
58
+ env:
59
+ JACA_BUILD_TUI: "1"
60
+ run: uv build --wheel
61
+
62
+ - name: Verify bundled wheel contents
63
+ run: python scripts/verify_bundled_wheel.py dist/*.whl
@@ -0,0 +1,156 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ build-wheels:
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ include:
18
+ - os: ubuntu-latest
19
+ artifact_name: jaca-wheel-linux-amd64
20
+ - os: windows-latest
21
+ artifact_name: jaca-wheel-windows-amd64
22
+ - os: macos-15-intel
23
+ artifact_name: jaca-wheel-macos-amd64
24
+ - os: macos-14
25
+ artifact_name: jaca-wheel-macos-arm64
26
+
27
+ runs-on: ${{ matrix.os }}
28
+
29
+ steps:
30
+ - name: Check out code
31
+ uses: actions/checkout@v5
32
+
33
+ - name: Set up Python
34
+ uses: actions/setup-python@v6
35
+ with:
36
+ python-version: "3.12"
37
+
38
+ - name: Set up uv
39
+ uses: astral-sh/setup-uv@v7
40
+ with:
41
+ enable-cache: false
42
+
43
+ - name: Set up Go
44
+ uses: actions/setup-go@v6
45
+ with:
46
+ go-version-file: go.mod
47
+
48
+ - name: Build bundled wheel
49
+ env:
50
+ JACA_BUILD_TUI: "1"
51
+ run: uv build --wheel
52
+
53
+ - name: Verify bundled wheel contents
54
+ run: python scripts/verify_bundled_wheel.py dist/*.whl
55
+
56
+ - name: Upload wheel artifact
57
+ uses: actions/upload-artifact@v6
58
+ with:
59
+ name: ${{ matrix.artifact_name }}
60
+ path: dist/*.whl
61
+ if-no-files-found: error
62
+
63
+ build-sdist:
64
+ runs-on: ubuntu-latest
65
+
66
+ steps:
67
+ - name: Check out code
68
+ uses: actions/checkout@v5
69
+
70
+ - name: Set up Python
71
+ uses: actions/setup-python@v6
72
+ with:
73
+ python-version: "3.12"
74
+
75
+ - name: Set up uv
76
+ uses: astral-sh/setup-uv@v7
77
+ with:
78
+ enable-cache: false
79
+
80
+ - name: Build source distribution
81
+ run: uv build --sdist
82
+
83
+ - name: Upload sdist artifact
84
+ uses: actions/upload-artifact@v6
85
+ with:
86
+ name: jaca-sdist
87
+ path: dist/*.tar.gz
88
+ if-no-files-found: error
89
+
90
+ github-release:
91
+ if: startsWith(github.ref, 'refs/tags/v')
92
+ needs:
93
+ - build-wheels
94
+ - build-sdist
95
+ runs-on: ubuntu-latest
96
+ permissions:
97
+ contents: write
98
+
99
+ steps:
100
+ - name: Check out code
101
+ uses: actions/checkout@v5
102
+
103
+ - name: Download release artifacts
104
+ uses: actions/download-artifact@v5
105
+ with:
106
+ path: dist
107
+ merge-multiple: true
108
+
109
+ - name: Verify complete release manifest
110
+ run: python scripts/verify_release_artifacts.py dist
111
+
112
+ - name: Publish GitHub release assets
113
+ env:
114
+ GH_TOKEN: ${{ github.token }}
115
+ run: |
116
+ if gh release view "${{ github.ref_name }}" --repo "${{ github.repository }}" >/dev/null 2>&1; then
117
+ gh release upload "${{ github.ref_name }}" dist/* \
118
+ --repo "${{ github.repository }}" \
119
+ --clobber
120
+ else
121
+ gh release create "${{ github.ref_name }}" dist/* \
122
+ --repo "${{ github.repository }}" \
123
+ --title "${{ github.ref_name }}" \
124
+ --verify-tag
125
+ fi
126
+
127
+ publish-pypi:
128
+ if: startsWith(github.ref, 'refs/tags/v')
129
+ needs:
130
+ - build-wheels
131
+ - build-sdist
132
+ runs-on: ubuntu-latest
133
+ permissions:
134
+ contents: read
135
+ id-token: write
136
+ environment:
137
+ name: pypi
138
+
139
+ steps:
140
+ - name: Check out code
141
+ uses: actions/checkout@v5
142
+
143
+ - name: Download release artifacts
144
+ uses: actions/download-artifact@v5
145
+ with:
146
+ path: dist
147
+ merge-multiple: true
148
+
149
+ - name: Verify complete release manifest
150
+ run: python scripts/verify_release_artifacts.py dist
151
+
152
+ - name: Publish wheels to PyPI
153
+ uses: pypa/gh-action-pypi-publish@release/v1
154
+ with:
155
+ packages-dir: dist
156
+ verbose: true
@@ -0,0 +1,218 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ #poetry.lock
109
+ #poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ #pdm.lock
116
+ #pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ #pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # SageMath parsed files
135
+ *.sage.py
136
+
137
+ # Environments
138
+ .env
139
+ .envrc
140
+ .venv
141
+ env/
142
+ venv/
143
+ ENV/
144
+ env.bak/
145
+ venv.bak/
146
+
147
+ # Spyder project settings
148
+ .spyderproject
149
+ .spyproject
150
+
151
+ # Rope project settings
152
+ .ropeproject
153
+
154
+ # mkdocs documentation
155
+ /site
156
+
157
+ # Benchmark artifacts
158
+ jobs/
159
+ tasks/
160
+
161
+ # mypy
162
+ .mypy_cache/
163
+ .dmypy.json
164
+ dmypy.json
165
+
166
+ # Pyre type checker
167
+ .pyre/
168
+
169
+ # pytype static type analyzer
170
+ .pytype/
171
+
172
+ # Cython debug symbols
173
+ cython_debug/
174
+
175
+ # PyCharm
176
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
177
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
178
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
179
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
180
+ #.idea/
181
+
182
+ # Abstra
183
+ # Abstra is an AI-powered process automation framework.
184
+ # Ignore directories containing user credentials, local state, and settings.
185
+ # Learn more at https://abstra.io/docs
186
+ .abstra/
187
+
188
+ # Visual Studio Code
189
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
190
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
191
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
192
+ # you could uncomment the following to ignore the entire vscode folder
193
+ # .vscode/
194
+
195
+ # Ruff stuff:
196
+ .ruff_cache/
197
+
198
+ # PyPI configuration file
199
+ .pypirc
200
+
201
+ # Cursor
202
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
203
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
204
+ # refer to https://docs.cursor.com/context/ignore-files
205
+ .cursorignore
206
+ .cursorindexingignore
207
+
208
+ # Marimo
209
+ marimo/_static/
210
+ marimo/_lsp/
211
+ __marimo__/
212
+
213
+
214
+ /CC.zip
215
+
216
+ # SWE-bench evaluation artifacts
217
+ /logs/
218
+ *.jaca-*.json
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,193 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "configurations": [
4
+ {
5
+ "name": "Go: RPC types current package test",
6
+ "type": "go",
7
+ "request": "launch",
8
+ "mode": "test",
9
+ "program": "${fileDirname}",
10
+ "cwd": "${workspaceFolder}",
11
+ "args": [
12
+ "-test.run",
13
+ "^${input:goTestName}$"
14
+ ],
15
+ "dlvToolPath": "/home/dahiy/go/bin/dlv",
16
+ "showLog": true
17
+ },
18
+ {
19
+ "name": "Python: JACA Backend (headless RPC)",
20
+ "type": "debugpy",
21
+ "request": "launch",
22
+ "module": "just_another_coding_agent",
23
+ "cwd": "${workspaceFolder}",
24
+ "envFile": "${workspaceFolder}/.env",
25
+ "env": {
26
+ "PYTHONPATH": "${workspaceFolder}/src",
27
+ "PYTHONUNBUFFERED": "1",
28
+ "JACA_TRACE_MODE": "local"
29
+ },
30
+ "args": [
31
+ "--headless",
32
+ "--model",
33
+ "${input:jacaModel}",
34
+ "--workspace-root",
35
+ "${workspaceFolder}"
36
+ ],
37
+ "console": "integratedTerminal",
38
+ "justMyCode": true
39
+ },
40
+ {
41
+ "name": "Python: JACA Backend one prompt",
42
+ "type": "debugpy",
43
+ "request": "launch",
44
+ "program": "${workspaceFolder}/scripts/debug_rpc_once.py",
45
+ "cwd": "${workspaceFolder}",
46
+ "envFile": "${workspaceFolder}/.env",
47
+ "env": {
48
+ "PYTHONPATH": "${workspaceFolder}/src",
49
+ "PYTHONUNBUFFERED": "1",
50
+ "JACA_TRACE_MODE": "local"
51
+ },
52
+ "args": [
53
+ "--model",
54
+ "${input:jacaModel}",
55
+ "--prompt",
56
+ "${input:jacaPrompt}",
57
+ "--workspace-root",
58
+ "${workspaceFolder}"
59
+ ],
60
+ "console": "integratedTerminal",
61
+ "justMyCode": true
62
+ },
63
+ {
64
+ "name": "Python: JACA Backend prompt sequence",
65
+ "type": "debugpy",
66
+ "request": "launch",
67
+ "program": "${workspaceFolder}/scripts/debug_rpc_once.py",
68
+ "cwd": "${workspaceFolder}",
69
+ "envFile": "${workspaceFolder}/.env",
70
+ "env": {
71
+ "PYTHONPATH": "${workspaceFolder}/src",
72
+ "PYTHONUNBUFFERED": "1",
73
+ "JACA_TRACE_MODE": "local"
74
+ },
75
+ "args": [
76
+ "--model",
77
+ "${input:jacaModel}",
78
+ "--prompts",
79
+ "${input:jacaPrompts}",
80
+ "--workspace-root",
81
+ "${workspaceFolder}"
82
+ ],
83
+ "console": "integratedTerminal",
84
+ "justMyCode": true
85
+ },
86
+ {
87
+ "name": "Python: Pytest Current File",
88
+ "type": "debugpy",
89
+ "request": "launch",
90
+ "module": "pytest",
91
+ "cwd": "${workspaceFolder}",
92
+ "envFile": "${workspaceFolder}/.env",
93
+ "env": {
94
+ "PYTHONPATH": "${workspaceFolder}/src",
95
+ "PYTHONUNBUFFERED": "1"
96
+ },
97
+ "args": [
98
+ "-q",
99
+ "${file}"
100
+ ],
101
+ "console": "integratedTerminal",
102
+ "justMyCode": true
103
+ },
104
+ {
105
+ "name": "Python: Pytest Current Test (-k)",
106
+ "type": "debugpy",
107
+ "request": "launch",
108
+ "module": "pytest",
109
+ "cwd": "${workspaceFolder}",
110
+ "envFile": "${workspaceFolder}/.env",
111
+ "env": {
112
+ "PYTHONPATH": "${workspaceFolder}/src",
113
+ "PYTHONUNBUFFERED": "1"
114
+ },
115
+ "args": [
116
+ "-q",
117
+ "${file}",
118
+ "-k",
119
+ "${input:pytestFilter}"
120
+ ],
121
+ "console": "integratedTerminal",
122
+ "justMyCode": true
123
+ },
124
+ {
125
+ "name": "Python: RPC stdio e2e",
126
+ "type": "debugpy",
127
+ "request": "launch",
128
+ "module": "pytest",
129
+ "cwd": "${workspaceFolder}",
130
+ "envFile": "${workspaceFolder}/.env",
131
+ "env": {
132
+ "PYTHONPATH": "${workspaceFolder}/src",
133
+ "PYTHONUNBUFFERED": "1"
134
+ },
135
+ "args": [
136
+ "-q",
137
+ "tests/e2e/test_stdio_server.py"
138
+ ],
139
+ "console": "integratedTerminal",
140
+ "justMyCode": true
141
+ },
142
+ {
143
+ "name": "Python: Compaction stress e2e",
144
+ "type": "debugpy",
145
+ "request": "launch",
146
+ "module": "pytest",
147
+ "cwd": "${workspaceFolder}",
148
+ "envFile": "${workspaceFolder}/.env",
149
+ "env": {
150
+ "PYTHONPATH": "${workspaceFolder}/src",
151
+ "PYTHONUNBUFFERED": "1"
152
+ },
153
+ "args": [
154
+ "-q",
155
+ "tests/e2e/test_compaction_stress.py"
156
+ ],
157
+ "console": "integratedTerminal",
158
+ "justMyCode": true
159
+ }
160
+ ],
161
+ "inputs": [
162
+ {
163
+ "id": "jacaModel",
164
+ "type": "promptString",
165
+ "description": "Model id for the headless backend",
166
+ "default": "openai-responses:gpt-5.4"
167
+ },
168
+ {
169
+ "id": "goTestName",
170
+ "type": "promptString",
171
+ "description": "Exact Go test name for -test.run",
172
+ "default": "TestDecodeEnvelopePreservesRunSucceededUsageFields"
173
+ },
174
+ {
175
+ "id": "pytestFilter",
176
+ "type": "promptString",
177
+ "description": "pytest -k expression for the current file",
178
+ "default": "test_"
179
+ },
180
+ {
181
+ "id": "jacaPrompt",
182
+ "type": "promptString",
183
+ "description": "Prompt for one-shot backend debugging",
184
+ "default": "hello"
185
+ },
186
+ {
187
+ "id": "jacaPrompts",
188
+ "type": "promptString",
189
+ "description": "Prompt sequence for the same session, separated by ||",
190
+ "default": "hello || run some tests || summarize what happened"
191
+ }
192
+ ]
193
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "go.alternateTools": {
3
+ "dlv": "/home/dahiy/go/bin/dlv"
4
+ },
5
+ "go.toolsEnvVars": {
6
+ "PATH": "/home/dahiy/go/bin:${env:PATH}"
7
+ },
8
+ "go.delveConfig": {
9
+ "dlvFlags": [
10
+ "--check-go-version=false"
11
+ ]
12
+ },
13
+ "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
14
+ "python.envFile": "${workspaceFolder}/.env",
15
+ "python.testing.pytestArgs": [
16
+ "tests"
17
+ ],
18
+ "python.testing.unittestEnabled": false,
19
+ "python.testing.pytestEnabled": true
20
+ }