graph-agents-cli 0.3.1__py3-none-any.whl

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 (291) hide show
  1. graph_agents_cli/__init__.py +26 -0
  2. graph_agents_cli/_api_policy.py +2145 -0
  3. graph_agents_cli/_approvals.py +400 -0
  4. graph_agents_cli/_build.py +186 -0
  5. graph_agents_cli/_build_info.json +7 -0
  6. graph_agents_cli/_chat_client.py +462 -0
  7. graph_agents_cli/_click.py +157 -0
  8. graph_agents_cli/_defaults.py +139 -0
  9. graph_agents_cli/_experiments.py +64 -0
  10. graph_agents_cli/_http.py +192 -0
  11. graph_agents_cli/_output.py +83 -0
  12. graph_agents_cli/_project.py +462 -0
  13. graph_agents_cli/_remote.py +220 -0
  14. graph_agents_cli/_response_schema.py +264 -0
  15. graph_agents_cli/_runner.py +319 -0
  16. graph_agents_cli/_skills_check.py +274 -0
  17. graph_agents_cli/_tools.py +189 -0
  18. graph_agents_cli/_trust.py +66 -0
  19. graph_agents_cli/api/__init__.py +15 -0
  20. graph_agents_cli/api/_changes.py +506 -0
  21. graph_agents_cli/api/_files.py +658 -0
  22. graph_agents_cli/api/cmd_api.py +2480 -0
  23. graph_agents_cli/deploy/__init__.py +15 -0
  24. graph_agents_cli/deploy/_config.py +171 -0
  25. graph_agents_cli/deploy/_image.py +128 -0
  26. graph_agents_cli/deploy/_kube.py +286 -0
  27. graph_agents_cli/deploy/_modes.py +234 -0
  28. graph_agents_cli/deploy/_preflight.py +370 -0
  29. graph_agents_cli/deploy/_values.py +168 -0
  30. graph_agents_cli/deploy/cmd_deploy.py +1866 -0
  31. graph_agents_cli/deploy/gitops.py +562 -0
  32. graph_agents_cli/deploy/local_load.py +273 -0
  33. graph_agents_cli/dev/__init__.py +13 -0
  34. graph_agents_cli/dev/cmd_build.py +131 -0
  35. graph_agents_cli/dev/cmd_install.py +78 -0
  36. graph_agents_cli/dev/cmd_lint.py +119 -0
  37. graph_agents_cli/dev/cmd_playground.py +297 -0
  38. graph_agents_cli/dev/policy_check.py +1287 -0
  39. graph_agents_cli/eval/__init__.py +22 -0
  40. graph_agents_cli/eval/_client.py +670 -0
  41. graph_agents_cli/eval/_common.py +177 -0
  42. graph_agents_cli/eval/_judge.py +168 -0
  43. graph_agents_cli/eval/_judge_runner.py +238 -0
  44. graph_agents_cli/eval/_paths.py +212 -0
  45. graph_agents_cli/eval/checks.py +581 -0
  46. graph_agents_cli/eval/cmd_analyze.py +278 -0
  47. graph_agents_cli/eval/cmd_compare.py +284 -0
  48. graph_agents_cli/eval/cmd_eval_group.py +80 -0
  49. graph_agents_cli/eval/cmd_generate.py +558 -0
  50. graph_agents_cli/eval/cmd_grade.py +466 -0
  51. graph_agents_cli/eval/cmd_metric.py +156 -0
  52. graph_agents_cli/eval/cmd_run.py +370 -0
  53. graph_agents_cli/eval/cmd_submit.py +400 -0
  54. graph_agents_cli/eval/config.py +435 -0
  55. graph_agents_cli/eval/dataset.py +350 -0
  56. graph_agents_cli/eval/gate.py +420 -0
  57. graph_agents_cli/eval/transcript.py +192 -0
  58. graph_agents_cli/extension/__init__.py +13 -0
  59. graph_agents_cli/extension/_compat.py +86 -0
  60. graph_agents_cli/extension/_loader.py +293 -0
  61. graph_agents_cli/extension/_manifest.py +135 -0
  62. graph_agents_cli/extension/_overrides.py +195 -0
  63. graph_agents_cli/extension/_paths.py +91 -0
  64. graph_agents_cli/extension/_refs.py +193 -0
  65. graph_agents_cli/extension/_resolver.py +453 -0
  66. graph_agents_cli/extension/_schema.py +106 -0
  67. graph_agents_cli/extension/_spec.py +253 -0
  68. graph_agents_cli/extension/_sync.py +102 -0
  69. graph_agents_cli/extension/_trust.py +58 -0
  70. graph_agents_cli/extension/cmd_extension_add.py +259 -0
  71. graph_agents_cli/extension/cmd_extension_group.py +57 -0
  72. graph_agents_cli/extension/cmd_extension_list.py +56 -0
  73. graph_agents_cli/extension/cmd_extension_remove.py +61 -0
  74. graph_agents_cli/extension/cmd_extension_update.py +195 -0
  75. graph_agents_cli/info/__init__.py +13 -0
  76. graph_agents_cli/info/cmd_info.py +222 -0
  77. graph_agents_cli/infra/__init__.py +15 -0
  78. graph_agents_cli/infra/checks.py +1169 -0
  79. graph_agents_cli/infra/cmd_infra.py +103 -0
  80. graph_agents_cli/main.py +591 -0
  81. graph_agents_cli/peer/__init__.py +15 -0
  82. graph_agents_cli/peer/_generate.py +254 -0
  83. graph_agents_cli/peer/cmd_peer.py +1151 -0
  84. graph_agents_cli/run/__init__.py +13 -0
  85. graph_agents_cli/run/_local_server.py +1157 -0
  86. graph_agents_cli/run/_signals.py +141 -0
  87. graph_agents_cli/run/cmd_approvals.py +530 -0
  88. graph_agents_cli/run/cmd_run.py +1421 -0
  89. graph_agents_cli/scaffold/__init__.py +19 -0
  90. graph_agents_cli/scaffold/agents/README.md +24 -0
  91. graph_agents_cli/scaffold/agents/empty_py/.template/templateconfig.yaml +22 -0
  92. graph_agents_cli/scaffold/agents/langgraph/.env.example +292 -0
  93. graph_agents_cli/scaffold/agents/langgraph/.template/templateconfig.yaml +28 -0
  94. graph_agents_cli/scaffold/agents/langgraph/Dockerfile +59 -0
  95. graph_agents_cli/scaffold/agents/langgraph/Dockerfile.langgraph-server +59 -0
  96. graph_agents_cli/scaffold/agents/langgraph/README.md +571 -0
  97. graph_agents_cli/scaffold/agents/langgraph/api-policy.yaml +60 -0
  98. graph_agents_cli/scaffold/agents/langgraph/app/__init__.py +20 -0
  99. graph_agents_cli/scaffold/agents/langgraph/app/agent.py +174 -0
  100. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/__init__.py +15 -0
  101. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/a2a.py +2162 -0
  102. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/a2a_client.py +1167 -0
  103. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/api_client.py +4220 -0
  104. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/approvals.py +1349 -0
  105. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/auth.py +1986 -0
  106. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/chat.py +2962 -0
  107. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/checkpointer.py +432 -0
  108. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/content.py +569 -0
  109. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/db.py +580 -0
  110. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/limits.py +203 -0
  111. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/metrics.py +231 -0
  112. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/middleware.py +361 -0
  113. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/model.py +611 -0
  114. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/playground.py +230 -0
  115. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/run_locks.py +459 -0
  116. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/structured.py +755 -0
  117. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/telemetry.py +681 -0
  118. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/threads.py +493 -0
  119. graph_agents_cli/scaffold/agents/langgraph/app/app_utils/token_exchange.py +959 -0
  120. graph_agents_cli/scaffold/agents/langgraph/app/fast_api_app.py +770 -0
  121. graph_agents_cli/scaffold/agents/langgraph/app/policies/__init__.py +55 -0
  122. graph_agents_cli/scaffold/agents/langgraph/app/policies/custom.py +97 -0
  123. graph_agents_cli/scaffold/agents/langgraph/app/tools/__init__.py +46 -0
  124. graph_agents_cli/scaffold/agents/langgraph/app/tools/example_api.py +92 -0
  125. graph_agents_cli/scaffold/agents/langgraph/app/tools/weather.py +33 -0
  126. graph_agents_cli/scaffold/agents/langgraph/langgraph.json +14 -0
  127. graph_agents_cli/scaffold/agents/langgraph/pyproject.toml +78 -0
  128. graph_agents_cli/scaffold/agents/langgraph/tests/conftest.py +376 -0
  129. graph_agents_cli/scaffold/agents/langgraph/tests/eval/datasets/basic-dataset.json +53 -0
  130. graph_agents_cli/scaffold/agents/langgraph/tests/eval/eval_config.yaml +32 -0
  131. graph_agents_cli/scaffold/agents/langgraph/tests/integration/approval_graph.py +137 -0
  132. graph_agents_cli/scaffold/agents/langgraph/tests/integration/fake_issuer.py +216 -0
  133. graph_agents_cli/scaffold/agents/langgraph/tests/integration/fake_openai.py +357 -0
  134. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_a2a_outcomes.py +569 -0
  135. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_a2a_relay.py +479 -0
  136. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_api_surface.py +812 -0
  137. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_approvals.py +1367 -0
  138. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_approvals_server.py +794 -0
  139. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_cross_actor.py +497 -0
  140. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_cross_actor_server.py +247 -0
  141. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_history_repair.py +278 -0
  142. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_model_apis.py +242 -0
  143. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_postgres.py +637 -0
  144. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_resilience_postgres.py +770 -0
  145. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_runtime_guardrails.py +854 -0
  146. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_server_e2e.py +340 -0
  147. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_server_runtime.py +989 -0
  148. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_structured_answers.py +584 -0
  149. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_structured_server.py +222 -0
  150. graph_agents_cli/scaffold/agents/langgraph/tests/integration/test_token_exchange_issuer.py +650 -0
  151. graph_agents_cli/scaffold/agents/langgraph/tests/load_test/.results/.placeholder +0 -0
  152. graph_agents_cli/scaffold/agents/langgraph/tests/load_test/README.md +22 -0
  153. graph_agents_cli/scaffold/agents/langgraph/tests/load_test/conftest.py +21 -0
  154. graph_agents_cli/scaffold/agents/langgraph/tests/load_test/load_test.py +81 -0
  155. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_a2a_client.py +824 -0
  156. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_a2a_scoping.py +724 -0
  157. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_api_client.py +1214 -0
  158. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_api_client_hardening.py +716 -0
  159. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_api_policy_rpc.py +767 -0
  160. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_approval_ledger.py +1536 -0
  161. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_fake_model.py +115 -0
  162. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_jwt_policy.py +991 -0
  163. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_limits.py +310 -0
  164. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_logging.py +148 -0
  165. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_logging_hardening.py +271 -0
  166. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_policy.py +378 -0
  167. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_resilience.py +610 -0
  168. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_server_auth.py +702 -0
  169. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_structured.py +673 -0
  170. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_telemetry.py +404 -0
  171. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_thread_listing.py +255 -0
  172. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_threads.py +268 -0
  173. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_token_exchange.py +1320 -0
  174. graph_agents_cli/scaffold/agents/langgraph/tests/unit/test_untrusted_content.py +393 -0
  175. graph_agents_cli/scaffold/agents/langgraph/uv-fastapi.lock +2084 -0
  176. graph_agents_cli/scaffold/agents/langgraph/uv-langgraph-server.lock +2106 -0
  177. graph_agents_cli/scaffold/agents/langgraph/{{cookiecutter.agent_guidance_filename}} +129 -0
  178. graph_agents_cli/scaffold/base_templates/_shared/graph-agents-cli-manifest.yaml +36 -0
  179. graph_agents_cli/scaffold/base_templates/python/.dockerignore +32 -0
  180. graph_agents_cli/scaffold/base_templates/python/.github/CODEOWNERS +30 -0
  181. graph_agents_cli/scaffold/base_templates/python/.github/agent.env +7 -0
  182. graph_agents_cli/scaffold/base_templates/python/.github/workflows/pr_checks.yaml +214 -0
  183. graph_agents_cli/scaffold/base_templates/python/.gitignore +209 -0
  184. graph_agents_cli/scaffold/base_templates/python/tests/unit/test_dummy.py +23 -0
  185. graph_agents_cli/scaffold/base_templates/python/{{cookiecutter.agent_guidance_filename}} +35 -0
  186. graph_agents_cli/scaffold/cmd_scaffold_group.py +49 -0
  187. graph_agents_cli/scaffold/commands/__init__.py +13 -0
  188. graph_agents_cli/scaffold/commands/create.py +1424 -0
  189. graph_agents_cli/scaffold/commands/enhance.py +1652 -0
  190. graph_agents_cli/scaffold/commands/upgrade.py +570 -0
  191. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/.github/agent.env +12 -0
  192. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/.github/workflows/promote-to-prod.yaml +371 -0
  193. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/.github/workflows/staging.yaml +450 -0
  194. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/argocd/application-dev.yaml +43 -0
  195. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/argocd/application-prod.yaml +41 -0
  196. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/argocd/application-staging.yaml +43 -0
  197. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/.helmignore +14 -0
  198. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/Chart.yaml +21 -0
  199. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/examples/networkpolicy.yaml +103 -0
  200. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/NOTES.txt +48 -0
  201. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/_helpers.tpl +189 -0
  202. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/certificate.yaml +15 -0
  203. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/configmap.yaml +10 -0
  204. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/deployment.yaml +199 -0
  205. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/hpa.yaml +22 -0
  206. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/httproute.yaml +30 -0
  207. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/ingress.yaml +39 -0
  208. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/networkpolicy.yaml +48 -0
  209. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/pdb.yaml +13 -0
  210. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/postgresql-secret.yaml +37 -0
  211. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/service.yaml +15 -0
  212. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/serviceaccount.yaml +13 -0
  213. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/templates/servicemonitor.yaml +42 -0
  214. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values-dev.yaml +22 -0
  215. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values-prod.yaml +45 -0
  216. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values-staging.yaml +29 -0
  217. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/deployment/helm/{{cookiecutter.project_name}}/values.yaml +396 -0
  218. graph_agents_cli/scaffold/deployment_targets/kubernetes/python/tests/integration/test_chart.py +269 -0
  219. graph_agents_cli/scaffold/deployment_targets/none/README.md +5 -0
  220. graph_agents_cli/scaffold/deployment_targets/none/python/README.md +6 -0
  221. graph_agents_cli/scaffold/utils/__init__.py +13 -0
  222. graph_agents_cli/scaffold/utils/backup.py +212 -0
  223. graph_agents_cli/scaffold/utils/build_record.py +257 -0
  224. graph_agents_cli/scaffold/utils/cli_options.py +184 -0
  225. graph_agents_cli/scaffold/utils/fs.py +83 -0
  226. graph_agents_cli/scaffold/utils/generate_locks.py +214 -0
  227. graph_agents_cli/scaffold/utils/generation_metadata.py +88 -0
  228. graph_agents_cli/scaffold/utils/keyedit.py +768 -0
  229. graph_agents_cli/scaffold/utils/keymerge.py +537 -0
  230. graph_agents_cli/scaffold/utils/language.py +138 -0
  231. graph_agents_cli/scaffold/utils/lock_utils.py +94 -0
  232. graph_agents_cli/scaffold/utils/logging.py +77 -0
  233. graph_agents_cli/scaffold/utils/manifest.py +292 -0
  234. graph_agents_cli/scaffold/utils/merge.py +970 -0
  235. graph_agents_cli/scaffold/utils/merge3.py +216 -0
  236. graph_agents_cli/scaffold/utils/openapi_seed.py +199 -0
  237. graph_agents_cli/scaffold/utils/remote_template.py +376 -0
  238. graph_agents_cli/scaffold/utils/template.py +1352 -0
  239. graph_agents_cli/scaffold/utils/upgrade.py +894 -0
  240. graph_agents_cli/scaffold/utils/version.py +438 -0
  241. graph_agents_cli/secrets/__init__.py +15 -0
  242. graph_agents_cli/secrets/_apply.py +954 -0
  243. graph_agents_cli/secrets/_required.py +188 -0
  244. graph_agents_cli/secrets/cmd_secrets.py +211 -0
  245. graph_agents_cli/setup/__init__.py +13 -0
  246. graph_agents_cli/setup/_antigravity.py +221 -0
  247. graph_agents_cli/setup/cmd_auth.py +1030 -0
  248. graph_agents_cli/setup/cmd_dev_token.py +513 -0
  249. graph_agents_cli/setup/cmd_setup.py +428 -0
  250. graph_agents_cli/setup/cmd_update.py +140 -0
  251. graph_agents_cli/skills/__init__.py +13 -0
  252. graph_agents_cli/skills/_bundle.py +65 -0
  253. graph_agents_cli/skills/data/README.md +19 -0
  254. graph_agents_cli/skills/data/graph-agents-cli-deploy/SKILL.md +357 -0
  255. graph_agents_cli/skills/data/graph-agents-cli-deploy/references/github-settings.md +113 -0
  256. graph_agents_cli/skills/data/graph-agents-cli-deploy/references/gitops.md +137 -0
  257. graph_agents_cli/skills/data/graph-agents-cli-deploy/references/kubernetes.md +315 -0
  258. graph_agents_cli/skills/data/graph-agents-cli-deploy/references/secrets.md +160 -0
  259. graph_agents_cli/skills/data/graph-agents-cli-eval/SKILL.md +303 -0
  260. graph_agents_cli/skills/data/graph-agents-cli-eval/references/dataset_schema.md +282 -0
  261. graph_agents_cli/skills/data/graph-agents-cli-eval/references/metrics-guide.md +143 -0
  262. graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/SKILL.md +659 -0
  263. graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/references/langchain-models.md +124 -0
  264. graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/references/langgraph.md +235 -0
  265. graph_agents_cli/skills/data/graph-agents-cli-langgraph-code/references/template-contract.md +477 -0
  266. graph_agents_cli/skills/data/graph-agents-cli-observability/SKILL.md +231 -0
  267. graph_agents_cli/skills/data/graph-agents-cli-observability/references/langsmith.md +46 -0
  268. graph_agents_cli/skills/data/graph-agents-cli-observability/references/otel.md +59 -0
  269. graph_agents_cli/skills/data/graph-agents-cli-scaffold/SKILL.md +414 -0
  270. graph_agents_cli/skills/data/graph-agents-cli-scaffold/references/flags.md +134 -0
  271. graph_agents_cli/skills/data/graph-agents-cli-workflow/SKILL.md +478 -0
  272. graph_agents_cli/skills/data/graph-agents-cli-workflow/references/brainstorming.md +118 -0
  273. graph_agents_cli/skills/data/graph-agents-cli-workflow/references/commands.md +419 -0
  274. graph_agents_cli/skills/data/graph-agents-cli-workflow/references/extension.md +156 -0
  275. graph_agents_cli/skills/data/graph-agents-cli-workflow/references/internals.md +67 -0
  276. graph_agents_cli/skills/data/graph-agents-cli-workflow/references/spec-template.md +56 -0
  277. graph_agents_cli/skills/data/graph-agents-cli-workflow/references/terminology.md +119 -0
  278. graph_agents_cli/system/__init__.py +15 -0
  279. graph_agents_cli/system/_apply.py +519 -0
  280. graph_agents_cli/system/_checks.py +1023 -0
  281. graph_agents_cli/system/_deploy.py +215 -0
  282. graph_agents_cli/system/_model.py +363 -0
  283. graph_agents_cli/system/_system.py +664 -0
  284. graph_agents_cli/system/_views.py +208 -0
  285. graph_agents_cli/system/cmd_system.py +423 -0
  286. graph_agents_cli-0.3.1.dist-info/METADATA +162 -0
  287. graph_agents_cli-0.3.1.dist-info/RECORD +291 -0
  288. graph_agents_cli-0.3.1.dist-info/WHEEL +4 -0
  289. graph_agents_cli-0.3.1.dist-info/entry_points.txt +2 -0
  290. graph_agents_cli-0.3.1.dist-info/licenses/LICENSE +201 -0
  291. graph_agents_cli-0.3.1.dist-info/licenses/NOTICE +19 -0
@@ -0,0 +1,55 @@
1
+ # Copyright 2026 graph-agents-cli contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """AuthPolicy registry: `AUTH_POLICY` value -> policy factory.
16
+
17
+ Agent code, never touched by `graph-agents-cli scaffold upgrade`. Add a policy
18
+ by registering its factory here.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from collections.abc import Callable
24
+
25
+ from {{cookiecutter.agent_directory}}.app_utils.auth import (
26
+ CUSTOM,
27
+ JWT,
28
+ SHARED_BEARER,
29
+ AuthPolicy,
30
+ JwtPolicy,
31
+ SharedBearerPolicy,
32
+ )
33
+
34
+
35
+ def _custom() -> AuthPolicy:
36
+ from {{cookiecutter.agent_directory}}.policies.custom import CustomPolicy
37
+
38
+ return CustomPolicy()
39
+
40
+
41
+ REGISTRY: dict[str, Callable[[], AuthPolicy]] = {
42
+ SHARED_BEARER: SharedBearerPolicy,
43
+ JWT: JwtPolicy,
44
+ CUSTOM: _custom,
45
+ }
46
+
47
+
48
+ def build_policy(name: str) -> AuthPolicy:
49
+ try:
50
+ factory = REGISTRY[name]
51
+ except KeyError:
52
+ raise RuntimeError(
53
+ f"Unknown AUTH_POLICY {name!r}; expected one of {sorted(REGISTRY)}."
54
+ ) from None
55
+ return factory()
@@ -0,0 +1,97 @@
1
+ # Copyright 2026 graph-agents-cli contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """`custom` policy: the interface the project implements, shipped as a fail-closed stub.
16
+
17
+ Use it when callers authenticate with something the built-in policies do not
18
+ cover, for example the session cookie of an existing application (for OIDC
19
+ bearer tokens use the built-in `jwt` policy instead). The same policy object
20
+ guards every surface: the chat and thread routes, the A2A card and JSON-RPC
21
+ endpoint, and, under `langgraph-server`, the server's native API.
22
+
23
+ Implement `CustomPolicy` so that, on every request:
24
+
25
+ * `authenticate(request)` validates the caller's credential (a cookie, a
26
+ header, a token) against the system that issued it and returns a
27
+ `Principal`:
28
+ - `id`: stable and unique per caller. It owns threads and A2A tasks (two
29
+ callers with the same id see each other's conversations), and is hashed
30
+ into traces and run records.
31
+ - `roles`: matched against `AUTH_READ_ACROSS_ROLES` (may read other
32
+ principals' threads) and `AUTH_ADMIN_ROLES` (may manage assistants, crons
33
+ and the store under langgraph-server). Role names must not contain commas.
34
+ - `permissions`: usually `set(ACTIONS)`; `authorize` decides per action.
35
+ - `attributes`: optional, for example `tenant`. Secrets go only under
36
+ `attributes["credentials"][<api name>]` (see below). Keys starting with
37
+ `@` belong to the framework.
38
+ - `actor`: None when the caller is the user. When the credential shows that
39
+ another agent presents it for the user, `Actor(id=<that agent>)` (with
40
+ `chain`, the agents before it). A policy through which other agents
41
+ forward users' credentials must set it, or this agent treats the calling
42
+ agent as the person. `app_utils.auth.actor_from_claims` reads an RFC 8693
43
+ `act` claim as the `jwt` policy does.
44
+ Ids (`id`, the actor's) are 1-256 characters without control characters;
45
+ anything else fails the request with 500 (a bug in the policy).
46
+ `finalize_principal` then applies `AUTH_ALLOWED_ACTORS`,
47
+ `AUTH_DELEGATED_ROLES` and `AUTH_MAX_DELEGATION_DEPTH` to every policy.
48
+ A missing or invalid credential raises `HTTPException(401)` with a
49
+ `WWW-Authenticate` header; a server-side problem (the issuer cannot be
50
+ reached) raises `HTTPException(503)`. Never put the credential itself in an
51
+ error detail or a log line.
52
+ * `authorize(principal, action, resource)` allows or refuses `action` (see
53
+ `app_utils.auth.ACTIONS`) on `resource` (a thread id or None) with
54
+ `HTTPException(403)`. Thread ownership is enforced separately, by
55
+ `app_utils.threads` (fastapi) and the owner filters in `app_utils.auth`
56
+ (langgraph-server).
57
+ * Optionally `startup_problems() -> list[str]`: configuration problems found
58
+ when the app starts. Any problem stops the process outside `APP_ENV=dev`
59
+ (see `app_utils.auth.check_startup`).
60
+
61
+ Both methods are awaited on the request path: do blocking I/O through an
62
+ async client, and cache what you can (sessions, keys) with a short TTL.
63
+
64
+ To let tools call an `auth: forward` API of `api-policy.yaml` with the caller's
65
+ own credential, put it in `attributes["credentials"][<api name>]`; that is the
66
+ only attribute that may hold a secret (`Principal.public_attributes()` is what
67
+ gets persisted, logged or traced).
68
+
69
+ Until it is implemented every request fails with 503, and
70
+ `graph-agents-cli deploy --env staging|prod` refuses while the manifest says
71
+ `auth_policy_implemented: false`. Flip that flag after replacing this stub,
72
+ and add tests beside `tests/unit/test_policy.py` (a valid credential, a
73
+ missing one, an invalid one, and two principals that must not see each
74
+ other's threads).
75
+ """
76
+
77
+ from __future__ import annotations
78
+
79
+ from fastapi import HTTPException, Request
80
+
81
+ from {{cookiecutter.agent_directory}}.app_utils.auth import Principal
82
+
83
+ NOT_IMPLEMENTED = (
84
+ "AUTH_POLICY=custom is scaffolded as a fail-closed stub. Implement CustomPolicy in "
85
+ "{{cookiecutter.agent_directory}}/policies/custom.py (authenticate the caller, load roles "
86
+ "and permissions) and set auth_policy_implemented: true in graph-agents-cli-manifest.yaml."
87
+ )
88
+
89
+
90
+ class CustomPolicy:
91
+ """The project's own authentication and authorization. Stub: fails closed."""
92
+
93
+ async def authenticate(self, request: Request) -> Principal:
94
+ raise HTTPException(status_code=503, detail=NOT_IMPLEMENTED)
95
+
96
+ async def authorize(self, principal: Principal, action: str, resource: str | None) -> None:
97
+ raise HTTPException(status_code=503, detail=NOT_IMPLEMENTED)
@@ -0,0 +1,46 @@
1
+ # Copyright 2026 graph-agents-cli contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Tool registry.
16
+
17
+ Convention: every module in this package declares ``API_CALLS``, a
18
+ module-level list of ``{"api", "method", "operation_id", "path"}`` dicts naming
19
+ every external API call it makes (``[]`` when it makes none), and ``TOOLS``,
20
+ the list of tool objects it contributes. External calls go through
21
+ ``app_utils.api_client.get_client`` only, which enforces `api-policy.yaml` at
22
+ runtime; `graph-agents-cli lint` checks the declarations against the same file.
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ import importlib
28
+ import logging
29
+ import pkgutil
30
+ from typing import Any
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ def get_tools() -> list[Any]:
36
+ """Every tool contributed by the modules of this package, in module-name order."""
37
+ tools: list[Any] = []
38
+ for info in sorted(pkgutil.iter_modules(__path__), key=lambda i: i.name):
39
+ module = importlib.import_module(f"{__name__}.{info.name}")
40
+ if not hasattr(module, "API_CALLS"):
41
+ logger.warning(
42
+ "%s declares no API_CALLS (use [] when it calls no external API).",
43
+ module.__name__,
44
+ )
45
+ tools.extend(getattr(module, "TOOLS", []))
46
+ return tools
@@ -0,0 +1,92 @@
1
+ {% if cookiecutter.example_api -%}
2
+ # Copyright 2026 graph-agents-cli contributors
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ """Example API tool: one explicit call through the policy-enforcing client.
17
+
18
+ Generated from `api-policy.yaml`: the call is the first operation its first API
19
+ allows, whatever its method (an `allowed_operations` entry, else an operation
20
+ of its OpenAPI spec), so it passes `graph-agents-cli lint` and the policy test
21
+ as generated. It is one concrete, declared call rather than a generic
22
+ "any method, any path" tool, because lint can only check calls a tool declares.
23
+ It shows the pattern every tool that calls an external API follows: declare
24
+ each call in `API_CALLS` (checked by `graph-agents-cli lint`), send it through
25
+ `app_utils.api_client.get_client` (which refuses anything outside
26
+ `api-policy.yaml` before sending), and pass the run context so an
27
+ `auth: forward` API receives the caller's own credential. Replace the call with
28
+ the one your agent needs, or delete this module.
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import json
34
+ from typing import Any
35
+
36
+ from langchain.tools import ToolRuntime
37
+ from langchain_core.tools import tool
38
+
39
+ from {{cookiecutter.agent_directory}}.app_utils.api_client import get_client
40
+
41
+ API_CALLS: list[dict[str, str]] = [
42
+ {
43
+ "api": "{{ cookiecutter.example_api.api }}",
44
+ "method": "{{ cookiecutter.example_api.method }}",
45
+ {%- if cookiecutter.example_api.operation_id %}
46
+ "operation_id": "{{ cookiecutter.example_api.operation_id }}",
47
+ {%- endif %}
48
+ "path": "{{ cookiecutter.example_api.path }}",
49
+ },
50
+ ]
51
+
52
+
53
+ @tool
54
+ async def call_{{ cookiecutter.example_api.api }}_api(
55
+ {%- for name in cookiecutter.example_api.params %}
56
+ {{ name }}: str,
57
+ {%- endfor %}
58
+ {%- if cookiecutter.example_api.has_body %}
59
+ body: dict[str, Any],
60
+ {%- endif %}
61
+ runtime: ToolRuntime[Any],
62
+ ) -> str:
63
+ """{{ cookiecutter.example_api.method }} {{ cookiecutter.example_api.path }} on the {{ cookiecutter.example_api.api }} API{% if cookiecutter.example_api.has_body %} with `body` as the JSON request body{% endif %}; return the response as JSON."""
64
+ context: Any = getattr(runtime, "context", None)
65
+ client = get_client("{{ cookiecutter.example_api.api }}", context=context)
66
+ # The path stays the declared template; the client encodes each path
67
+ # parameter as one segment and refuses `.`/`..`, so model input cannot reach
68
+ # another endpoint. A refusal (ApiPolicyError, also when the API's limits are
69
+ # reached) or a failed call (ApiCallError) propagates: agent.py turns it
70
+ # into a tool error the model can read.
71
+ data = await client.request(
72
+ "{{ cookiecutter.example_api.method }}",
73
+ "{{ cookiecutter.example_api.path }}",
74
+ {%- if cookiecutter.example_api.operation_id %}
75
+ operation_id="{{ cookiecutter.example_api.operation_id }}",
76
+ {%- endif %}
77
+ {%- if cookiecutter.example_api.params %}
78
+ path_params={
79
+ {%- for name in cookiecutter.example_api.params %}
80
+ "{{ name }}": {{ name }},
81
+ {%- endfor %}
82
+ },
83
+ {%- endif %}
84
+ {%- if cookiecutter.example_api.has_body %}
85
+ json_body=body,
86
+ {%- endif %}
87
+ )
88
+ return data if isinstance(data, str) else json.dumps(data)
89
+
90
+
91
+ TOOLS = [call_{{ cookiecutter.example_api.api }}_api]
92
+ {% endif -%}
@@ -0,0 +1,33 @@
1
+ # Copyright 2026 Google LLC
2
+ # Modifications Copyright 2026 graph-agents-cli contributors
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # https://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ """Example tool: a simulated weather lookup. Calls no external API."""
17
+
18
+ from __future__ import annotations
19
+
20
+ from langchain_core.tools import tool
21
+
22
+ API_CALLS: list[dict[str, str]] = []
23
+
24
+
25
+ @tool
26
+ def get_weather(query: str) -> str:
27
+ """Get the current weather for a place. Use it whenever the user asks about the weather."""
28
+ if "sf" in query.lower() or "san francisco" in query.lower():
29
+ return "It's 60 degrees and foggy."
30
+ return "It's 90 degrees and sunny."
31
+
32
+
33
+ TOOLS = [get_weather]
@@ -0,0 +1,14 @@
1
+ {
2
+ "dependencies": ["."],
3
+ "graphs": {
4
+ "agent": "./{{cookiecutter.agent_directory}}/agent.py:graph"
5
+ },
6
+ "env": ".env",
7
+ "http": {
8
+ "app": "./{{cookiecutter.agent_directory}}/fast_api_app.py:app"
9
+ },
10
+ "auth": {
11
+ "path": "./{{cookiecutter.agent_directory}}/app_utils/auth.py:auth"
12
+ },
13
+ "python_version": "3.12"
14
+ }
@@ -0,0 +1,78 @@
1
+ [project]
2
+ name = "{{cookiecutter.project_name}}"
3
+ version = "0.1.0"
4
+ description = "LangGraph agent scaffolded by graph-agents-cli"
5
+ requires-python = ">=3.12,<3.14"
6
+ dependencies = [
7
+ # Agent framework
8
+ "langchain>=1.0,<2",
9
+ "langgraph>=1.0,<2",
10
+ "langchain-core>=1.0,<2",
11
+ # Model providers. All four are installed so MODEL_PROVIDER is a runtime
12
+ # setting (openai-compatible endpoints use langchain-openai).
13
+ "langchain-openai>=1.0,<2",
14
+ "langchain-anthropic>=1.0,<2",
15
+ "langchain-google-genai>=3.0,<5",
16
+ # Server
17
+ "fastapi>=0.115,<1",
18
+ "uvicorn>=0.30,<1",
19
+ "httpx>=0.27,<1",
20
+ "python-dotenv>=1.0,<2",
21
+ "pydantic>=2.7,<3",
22
+ "pyyaml>=6.0,<7",
23
+ # Auth (AUTH_POLICY=jwt verifies OIDC tokens) and Prometheus metrics
24
+ "pyjwt[crypto]>=2.8,<3",
25
+ "prometheus-client>=0.20,<1",
26
+ # Persistence (fastapi runtime binds the checkpointer itself)
27
+ "langgraph-checkpoint-postgres>=2.0,<4",
28
+ "psycopg[binary]>=3.1,<4",
29
+ "psycopg-pool>=3.2,<4",
30
+ # A2A protocol
31
+ "a2a-sdk[http-server]>=1.0,<2",
32
+ # Observability (opt-in at runtime, see .env.example)
33
+ "opentelemetry-sdk>=1.25,<2",
34
+ "opentelemetry-exporter-otlp-proto-http>=1.25,<2",
35
+ "openinference-instrumentation-langchain>=0.1.40,<1",
36
+ "langsmith>=0.3,<1",
37
+ {% if cookiecutter.runtime == 'langgraph-server' %}
38
+ # LangGraph Server runtime: the server package, its SDK (loopback client
39
+ # used by /chat) and the local dev server used by `run` and `playground`.
40
+ "langgraph-api>=0.2,<1",
41
+ "langgraph-sdk>=0.1,<1",
42
+ "langgraph-cli[inmem]>=0.2,<1",
43
+ {% endif %}
44
+ ]
45
+
46
+ [dependency-groups]
47
+ dev = [
48
+ "pytest>=8.3,<10",
49
+ "pytest-asyncio>=0.24,<2",
50
+ "httpx>=0.27,<1",
51
+ "ruff>=0.6,<1",
52
+ "langgraph-cli[inmem]>=0.2,<1",
53
+ ]
54
+
55
+ [build-system]
56
+ requires = ["hatchling>=1.25"]
57
+ build-backend = "hatchling.build"
58
+
59
+ [tool.hatch.build.targets.wheel]
60
+ packages = ["{{cookiecutter.agent_directory}}"]
61
+
62
+ [tool.pytest.ini_options]
63
+ pythonpath = ["."]
64
+ asyncio_mode = "auto"
65
+ asyncio_default_fixture_loop_scope = "function"
66
+ filterwarnings = ["ignore::DeprecationWarning"]
67
+
68
+ [tool.ruff]
69
+ line-length = 100
70
+ target-version = "py312"
71
+ extend-exclude = [".venv", "tests/load_test/.results"]
72
+
73
+ [tool.ruff.lint]
74
+ select = ["E", "F", "W", "I", "B", "UP", "RUF"]
75
+ ignore = ["E501", "B008"]
76
+
77
+ [tool.ruff.lint.isort]
78
+ known-first-party = ["{{cookiecutter.agent_directory}}"]