procesio-cli 0.1.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 (647) hide show
  1. procesio_cli/__init__.py +18 -0
  2. procesio_cli/_cli.py +71 -0
  3. procesio_cli/agents/__init__.py +0 -0
  4. procesio_cli/agents/_lib/__init__.py +0 -0
  5. procesio_cli/agents/_lib/actiondef.py +24 -0
  6. procesio_cli/agents/_lib/errors.py +40 -0
  7. procesio_cli/agents/_lib/reversibility.py +236 -0
  8. procesio_cli/agents/_lib/toolrunner.py +141 -0
  9. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PLAYBOOK.md +62 -0
  10. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PROCESIO-INTEROP.md +76 -0
  11. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-TROUBLESHOOTING.md +60 -0
  12. procesio_cli/agents/connector-builder/README.md +51 -0
  13. procesio_cli/agents/connector-builder/agent.yaml +61 -0
  14. procesio_cli/agents/connector-builder/context.py +19 -0
  15. procesio_cli/agents/connector-builder/handlers/__init__.py +1 -0
  16. procesio_cli/agents/connector-builder/handlers/checklist.py +71 -0
  17. procesio_cli/agents/connector-builder/handlers/guidance.py +37 -0
  18. procesio_cli/agents/connector-builder/handlers/nextstep.py +221 -0
  19. procesio_cli/agents/connector-builder/handlers/status.py +35 -0
  20. procesio_cli/agents/connector-builder/knowledge.py +47 -0
  21. procesio_cli/agents/connector-builder/main.py +93 -0
  22. procesio_cli/agents/connector-builder/tests/conftest.py +95 -0
  23. procesio_cli/agents/connector-builder/tests/test_cba_agent.py +148 -0
  24. procesio_cli/agents/orchestrator/__init__.py +0 -0
  25. procesio_cli/agents/orchestrator/bootstraplib.py +166 -0
  26. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/00-INDEX.md +60 -0
  27. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/01-PROCESSES.md +230 -0
  28. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/02-FORMS.md +287 -0
  29. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/03-INTEGRATIONS.md +384 -0
  30. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/04-DATABASE.md +293 -0
  31. procesio_cli/agents/procesio/PROCESIO-API-RELIABILITY-DOCTRINE.md +113 -0
  32. procesio_cli/agents/procesio/PROCESIO-BEST-PRACTICES.md +316 -0
  33. procesio_cli/agents/procesio/PROCESIO-BUILD-AND-TEST-PLAYBOOK.md +217 -0
  34. procesio_cli/agents/procesio/PROCESIO-DATASTORE.md +72 -0
  35. procesio_cli/agents/procesio/PROCESIO-ENVIRONMENTS.md +62 -0
  36. procesio_cli/agents/procesio/PROCESIO-SCHEDULING.md +47 -0
  37. procesio_cli/agents/procesio/PROCESIO-VISUAL-ORGANIZATION.md +175 -0
  38. procesio_cli/agents/procesio/README.md +97 -0
  39. procesio_cli/agents/procesio/__init__.py +0 -0
  40. procesio_cli/agents/procesio/agent.yaml +73 -0
  41. procesio_cli/agents/procesio/audit.py +226 -0
  42. procesio_cli/agents/procesio/checklist.py +135 -0
  43. procesio_cli/agents/procesio/context.py +19 -0
  44. procesio_cli/agents/procesio/handlers/__init__.py +0 -0
  45. procesio_cli/agents/procesio/handlers/audit.py +39 -0
  46. procesio_cli/agents/procesio/handlers/checklist.py +34 -0
  47. procesio_cli/agents/procesio/handlers/guidance.py +36 -0
  48. procesio_cli/agents/procesio/handlers/status.py +33 -0
  49. procesio_cli/agents/procesio/handlers/verify.py +39 -0
  50. procesio_cli/agents/procesio/knowledge.py +115 -0
  51. procesio_cli/agents/procesio/main.py +89 -0
  52. procesio_cli/agents/procesio/tests/__init__.py +0 -0
  53. procesio_cli/agents/procesio/tests/conftest.py +62 -0
  54. procesio_cli/agents/procesio/tests/test_audit.py +91 -0
  55. procesio_cli/agents/procesio/tests/test_checklist.py +28 -0
  56. procesio_cli/agents/procesio/tests/test_guidance.py +78 -0
  57. procesio_cli/agents/procesio/tests/test_manifest_sync.py +48 -0
  58. procesio_cli/agents/procesio/tests/test_verify.py +134 -0
  59. procesio_cli/agents/procesio/tests/test_workspace_scope.py +97 -0
  60. procesio_cli/agents/procesio/verifylib.py +222 -0
  61. procesio_cli/dashboard/README.md +117 -0
  62. procesio_cli/dashboard/__init__.py +18 -0
  63. procesio_cli/dashboard/serve.py +98 -0
  64. procesio_cli/dashboard/server/__init__.py +1 -0
  65. procesio_cli/dashboard/server/config_schemas.py +92 -0
  66. procesio_cli/dashboard/server/google.py +103 -0
  67. procesio_cli/dashboard/server/handler.py +160 -0
  68. procesio_cli/dashboard/server/inventory.py +213 -0
  69. procesio_cli/dashboard/server/jobs.py +118 -0
  70. procesio_cli/dashboard/server/llmtest.py +181 -0
  71. procesio_cli/dashboard/server/procesio_env.py +94 -0
  72. procesio_cli/dashboard/server/routes.py +74 -0
  73. procesio_cli/dashboard/server/runner.py +150 -0
  74. procesio_cli/dashboard/server/security.py +29 -0
  75. procesio_cli/dashboard/server/setup.py +211 -0
  76. procesio_cli/dashboard/server/validate.py +152 -0
  77. procesio_cli/dashboard/tests/conftest.py +16 -0
  78. procesio_cli/dashboard/tests/test_dashboard.py +225 -0
  79. procesio_cli/dashboard/tests/test_procesio_env.py +159 -0
  80. procesio_cli/dashboard/web/actions.js +274 -0
  81. procesio_cli/dashboard/web/api.js +79 -0
  82. procesio_cli/dashboard/web/app.js +385 -0
  83. procesio_cli/dashboard/web/copilot.js +72 -0
  84. procesio_cli/dashboard/web/google.js +121 -0
  85. procesio_cli/dashboard/web/index.html +67 -0
  86. procesio_cli/dashboard/web/procesio_env.js +187 -0
  87. procesio_cli/dashboard/web/styles.css +207 -0
  88. procesio_cli/registry.py +370 -0
  89. procesio_cli/scripts/build-router.py +249 -0
  90. procesio_cli/scripts/build-tool-skill.py +202 -0
  91. procesio_cli/scripts/check-requirements.py +131 -0
  92. procesio_cli/scripts/check-skill-governance.py +174 -0
  93. procesio_cli/scripts/evaluate-skill-routing.py +217 -0
  94. procesio_cli/scripts/evaluate-skills.py +316 -0
  95. procesio_cli/scripts/get-skill.py +122 -0
  96. procesio_cli/scripts/list-skills.py +68 -0
  97. procesio_cli/scripts/list-tools.py +73 -0
  98. procesio_cli/scripts/run-agent.py +59 -0
  99. procesio_cli/scripts/run-tool.py +123 -0
  100. procesio_cli/scripts/secret_scan.py +584 -0
  101. procesio_cli/scripts/set-credential.py +126 -0
  102. procesio_cli/scripts/validate-skills.py +530 -0
  103. procesio_cli/skills/PORTFOLIO.md +134 -0
  104. procesio_cli/skills/__init__.py +6 -0
  105. procesio_cli/skills/agent-skill-engineer/SKILL.md +226 -0
  106. procesio_cli/skills/agent-skill-engineer/evals/evals.json +422 -0
  107. procesio_cli/skills/agent-skill-engineer/references/authoring-standard.md +178 -0
  108. procesio_cli/skills/agent-skill-engineer/references/decision-framework.md +107 -0
  109. procesio_cli/skills/agent-skill-engineer/references/domain-evidence-protocol.md +248 -0
  110. procesio_cli/skills/agent-skill-engineer/references/evaluation-standard.md +191 -0
  111. procesio_cli/skills/agent-skill-engineer/references/expert-lenses.md +167 -0
  112. procesio_cli/skills/agent-skill-engineer/references/field-gate-standard.md +231 -0
  113. procesio_cli/skills/agent-skill-engineer/references/optimization-protocol.md +233 -0
  114. procesio_cli/skills/agent-skill-engineer/references/optimizer-contract.md +268 -0
  115. procesio_cli/skills/agent-skill-engineer/references/portability-standard.md +99 -0
  116. procesio_cli/skills/agent-skill-engineer/references/research-basis.md +128 -0
  117. procesio_cli/skills/agent-skill-engineer/references/review-standard.md +143 -0
  118. procesio_cli/skills/agent-skill-engineer/scripts/audit_skill.py +959 -0
  119. procesio_cli/skills/agent-skill-engineer/scripts/optimize_skill.py +891 -0
  120. procesio_cli/skills/agent-skill-engineer/scripts/scaffold_skill.py +397 -0
  121. procesio_cli/skills/evals/baseline-catalog.json +14 -0
  122. procesio_cli/skills/evals/baseline-routing-v2.json +38 -0
  123. procesio_cli/skills/evals/baseline.json +37 -0
  124. procesio_cli/skills/evals/behavioral.json +367 -0
  125. procesio_cli/skills/evals/field-boundary-development-v1.json +126 -0
  126. procesio_cli/skills/evals/field-closeout-correction-development-v1.json +23 -0
  127. procesio_cli/skills/evals/field-closeout-development-v1.json +89 -0
  128. procesio_cli/skills/evals/portfolio-pressure-training-v1.json +83 -0
  129. procesio_cli/skills/evals/routing.json +363 -0
  130. procesio_cli/skills/evals/validation-baseline.json +4 -0
  131. procesio_cli/skills/procesio-cli/SKILL.md +134 -0
  132. procesio_cli/skills/procesio-cli/evals/evals.json +111 -0
  133. procesio_cli/skills/procesio-cli/evals/workflows.json +16 -0
  134. procesio_cli/skills/procesio-cli/references/connector-lifecycle.md +47 -0
  135. procesio_cli/skills/procesio-cli/references/credentials-admin.md +113 -0
  136. procesio_cli/skills/procesio-cli/references/data-verification.md +71 -0
  137. procesio_cli/skills/procesio-cli/references/documents-files.md +44 -0
  138. procesio_cli/skills/procesio-cli/references/form-e2e.md +57 -0
  139. procesio_cli/skills/procesio-cli/references/operation-contract.md +138 -0
  140. procesio_cli/skills/procesio-cli/references/process-debugging.md +65 -0
  141. procesio_cli/skills/procesio-cli/references/process-lifecycle.md +88 -0
  142. procesio_cli/skills/procesio-cli/references/schedules-webhooks.md +58 -0
  143. procesio_cli/skills/procesio-cli/references/transport-environments.md +53 -0
  144. procesio_cli/skills/procesio-cli-maintainer/SKILL.md +84 -0
  145. procesio_cli/skills/procesio-cli-maintainer/evals/evals.json +116 -0
  146. procesio_cli/skills/procesio-cli-maintainer/references/change-contract.md +34 -0
  147. procesio_cli/skills/procesio-cli-maintainer/references/mcp-compatibility.md +13 -0
  148. procesio_cli/skills/procesio-cli-maintainer/references/skill-authoring.md +51 -0
  149. procesio_cli/skills/procesio-platform-advisor/SKILL.md +82 -0
  150. procesio_cli/skills/procesio-platform-advisor/evals/evals.json +116 -0
  151. procesio_cli/skills/procesio-platform-advisor/references/capability-map.md +22 -0
  152. procesio_cli/skills/procesio-platform-advisor/references/fit-framework.md +35 -0
  153. procesio_cli/skills/procesio-platform-advisor/references/freshness-policy.md +25 -0
  154. procesio_cli/skills/procesio-platform-advisor/references/sizing-method.md +70 -0
  155. procesio_cli/skills/procesio-platform-advisor/scripts/estimate_capacity.py +99 -0
  156. procesio_cli/skills/procesio-setup/SKILL.md +180 -0
  157. procesio_cli/skills/sql-server-optimizer/SKILL.md +86 -0
  158. procesio_cli/skills/sql-server-optimizer/evals/evals.json +116 -0
  159. procesio_cli/skills/sql-server-optimizer/references/db-context.md +44 -0
  160. procesio_cli/skills/sql-server-optimizer/references/generic-mode.md +32 -0
  161. procesio_cli/skills/sql-server-optimizer/references/procesio-mode.md +40 -0
  162. procesio_cli/skills/sql-server-optimizer/references/sql-rules.md +43 -0
  163. procesio_cli/skills/sql-server-optimizer/scripts/export-indexes.sql +178 -0
  164. procesio_cli/skills/sql-server-optimizer/scripts/export-procs-and-functions.sql +118 -0
  165. procesio_cli/skills/sql-server-optimizer/scripts/export-tables.sql +367 -0
  166. procesio_cli/skills/tests/__init__.py +0 -0
  167. procesio_cli/skills/tests/test_agent_skill_engineer.py +240 -0
  168. procesio_cli/skills/tests/test_auth_failure_stop.py +25 -0
  169. procesio_cli/skills/tests/test_capacity_estimator.py +85 -0
  170. procesio_cli/skills/tests/test_field_boundary_learning.py +100 -0
  171. procesio_cli/skills/tests/test_field_closeout_learning.py +123 -0
  172. procesio_cli/skills/tests/test_field_gate_standard.py +76 -0
  173. procesio_cli/skills/tests/test_operational_playbooks.py +51 -0
  174. procesio_cli/skills/tests/test_portfolio_pressure_training.py +35 -0
  175. procesio_cli/skills/tests/test_process_lifecycle_single_run.py +25 -0
  176. procesio_cli/skills/tests/test_skill_evaluator.py +67 -0
  177. procesio_cli/skills/tests/test_skill_optimizer.py +473 -0
  178. procesio_cli/skills/tests/test_skill_portfolio_review.py +70 -0
  179. procesio_cli/skills/tests/test_skill_release_binding.py +204 -0
  180. procesio_cli/skills/tests/test_skill_routing.py +74 -0
  181. procesio_cli/skills/tests/test_skill_scaffold_v2.py +116 -0
  182. procesio_cli/skills/tests/test_validate_skills.py +115 -0
  183. procesio_cli/tools/__init__.py +0 -0
  184. procesio_cli/tools/_lib/README.md +119 -0
  185. procesio_cli/tools/_lib/__init__.py +0 -0
  186. procesio_cli/tools/_lib/accounting.py +120 -0
  187. procesio_cli/tools/_lib/contacts.py +544 -0
  188. procesio_cli/tools/_lib/creds.py +83 -0
  189. procesio_cli/tools/_lib/creds_backends.py +578 -0
  190. procesio_cli/tools/_lib/dbprofiles.py +147 -0
  191. procesio_cli/tools/_lib/dbquery.py +286 -0
  192. procesio_cli/tools/_lib/dbschema.py +225 -0
  193. procesio_cli/tools/_lib/io.py +54 -0
  194. procesio_cli/tools/_lib/manifest.py +297 -0
  195. procesio_cli/tools/_lib/skill_release.py +127 -0
  196. procesio_cli/tools/_lib/skill_resources.py +118 -0
  197. procesio_cli/tools/_lib/userdata.py +228 -0
  198. procesio_cli/tools/_lib/webserialize/__init__.py +16 -0
  199. procesio_cli/tools/_lib/webserialize/admin.py +61 -0
  200. procesio_cli/tools/_lib/webserialize/client.py +264 -0
  201. procesio_cli/tools/_lib/webserialize/config.py +96 -0
  202. procesio_cli/tools/_lib/webserialize/errors.py +27 -0
  203. procesio_cli/tools/_lib/webserialize/framing.py +45 -0
  204. procesio_cli/tools/_lib/webserialize/registry.py +47 -0
  205. procesio_cli/tools/_lib/webserialize/runtime.py +61 -0
  206. procesio_cli/tools/_lib/webserialize/server.py +510 -0
  207. procesio_cli/tools/_lib/websession.py +194 -0
  208. procesio_cli/tools/connector-builder/CONNECTOR-BUILDER-API-NOTES.md +91 -0
  209. procesio_cli/tools/connector-builder/README.md +101 -0
  210. procesio_cli/tools/connector-builder/SKILL.md +248 -0
  211. procesio_cli/tools/connector-builder/__init__.py +7 -0
  212. procesio_cli/tools/connector-builder/actiondef.py +24 -0
  213. procesio_cli/tools/connector-builder/client.py +251 -0
  214. procesio_cli/tools/connector-builder/errors.py +44 -0
  215. procesio_cli/tools/connector-builder/gen_manifest.py +142 -0
  216. procesio_cli/tools/connector-builder/handlers/__init__.py +1 -0
  217. procesio_cli/tools/connector-builder/handlers/admin.py +182 -0
  218. procesio_cli/tools/connector-builder/handlers/auth.py +74 -0
  219. procesio_cli/tools/connector-builder/handlers/builds.py +396 -0
  220. procesio_cli/tools/connector-builder/handlers/common.py +104 -0
  221. procesio_cli/tools/connector-builder/handlers/files.py +111 -0
  222. procesio_cli/tools/connector-builder/handlers/raw.py +38 -0
  223. procesio_cli/tools/connector-builder/handlers/telemetry.py +39 -0
  224. procesio_cli/tools/connector-builder/main.py +94 -0
  225. procesio_cli/tools/connector-builder/tests/conftest.py +146 -0
  226. procesio_cli/tools/connector-builder/tests/test_cb_client.py +86 -0
  227. procesio_cli/tools/connector-builder/tests/test_cb_dispatch.py +105 -0
  228. procesio_cli/tools/connector-builder/tests/test_cb_manifest_sync.py +76 -0
  229. procesio_cli/tools/connector-builder/tests/test_cb_wait.py +123 -0
  230. procesio_cli/tools/connector-builder/tool.yaml +671 -0
  231. procesio_cli/tools/framework-map/.gitattributes +2 -0
  232. procesio_cli/tools/framework-map/README.md +98 -0
  233. procesio_cli/tools/framework-map/SKILL.md +30 -0
  234. procesio_cli/tools/framework-map/app.js +188 -0
  235. procesio_cli/tools/framework-map/fm_builder.py +476 -0
  236. procesio_cli/tools/framework-map/fm_catalog.py +19 -0
  237. procesio_cli/tools/framework-map/fm_ro_catalog.py +94 -0
  238. procesio_cli/tools/framework-map/fm_strings.py +101 -0
  239. procesio_cli/tools/framework-map/main.py +95 -0
  240. procesio_cli/tools/framework-map/styles.css +214 -0
  241. procesio_cli/tools/framework-map/tests/conftest.py +33 -0
  242. procesio_cli/tools/framework-map/tests/test_fm_build.py +126 -0
  243. procesio_cli/tools/framework-map/tests/test_fm_manifest_sync.py +63 -0
  244. procesio_cli/tools/framework-map/tests/test_fm_store_tree.py +75 -0
  245. procesio_cli/tools/framework-map/tool.yaml +61 -0
  246. procesio_cli/tools/mysql/MOVED-TO-CENTRAL.md +29 -0
  247. procesio_cli/tools/mysql/README.md +196 -0
  248. procesio_cli/tools/mysql/SKILL.md +37 -0
  249. procesio_cli/tools/mysql/__init__.py +0 -0
  250. procesio_cli/tools/mysql/connection.py +191 -0
  251. procesio_cli/tools/mysql/main.py +487 -0
  252. procesio_cli/tools/mysql/profiles.template.json +1 -0
  253. procesio_cli/tools/mysql/schema.py +434 -0
  254. procesio_cli/tools/mysql/tests/__init__.py +0 -0
  255. procesio_cli/tools/mysql/tests/conftest.py +21 -0
  256. procesio_cli/tools/mysql/tests/test_manifest_sync.py +68 -0
  257. procesio_cli/tools/mysql/tests/test_mysql.py +201 -0
  258. procesio_cli/tools/mysql/tests/test_mysql_schema.py +337 -0
  259. procesio_cli/tools/mysql/tool.yaml +112 -0
  260. procesio_cli/tools/procesio/DTO-SUBTOOLS-NOTE.md +360 -0
  261. procesio_cli/tools/procesio/FORM-DEV-GUIDE/00-INDEX.md +67 -0
  262. procesio_cli/tools/procesio/FORM-DEV-GUIDE/01-ANATOMY.md +209 -0
  263. procesio_cli/tools/procesio/FORM-DEV-GUIDE/02-CODE-INJECTION.md +309 -0
  264. procesio_cli/tools/procesio/FORM-DEV-GUIDE/03-DOM-CONTRACT.md +370 -0
  265. procesio_cli/tools/procesio/FORM-DEV-GUIDE/04-INTERACTION-RECIPES.md +600 -0
  266. procesio_cli/tools/procesio/FORM-DEV-GUIDE/05-STEPPER-AND-MOTION.md +426 -0
  267. procesio_cli/tools/procesio/FORM-DEV-GUIDE/06-PROCESS-INTEGRATION.md +347 -0
  268. procesio_cli/tools/procesio/FORM-DEV-GUIDE/07-DEPLOY-WORKFLOW.md +294 -0
  269. procesio_cli/tools/procesio/FORM-DEV-GUIDE/08-PITFALLS.md +569 -0
  270. procesio_cli/tools/procesio/FORM-DEV-GUIDE/09-NAVIGATION-AND-HOSTING.md +308 -0
  271. procesio_cli/tools/procesio/PHASE4-E2E-NOTES.md +594 -0
  272. procesio_cli/tools/procesio/PROCESIO-API-CORRECTIONS.md +295 -0
  273. procesio_cli/tools/procesio/PROCESIO-API-NOTES.md +6976 -0
  274. procesio_cli/tools/procesio/PROCESIO-AUTH-NOTES.md +226 -0
  275. procesio_cli/tools/procesio/PROCESIO-CARD-BUILD-NOTES.md +183 -0
  276. procesio_cli/tools/procesio/PROCESIO-CONNECTORS-NOTES.md +141 -0
  277. procesio_cli/tools/procesio/PROCESIO-CUSTOM-ACTION-NOTES.md +179 -0
  278. procesio_cli/tools/procesio/PROCESIO-DOCS-FIX-REPORT.md +123 -0
  279. procesio_cli/tools/procesio/PROCESIO-ENVIRONMENTS-NOTES.md +94 -0
  280. procesio_cli/tools/procesio/PROCESIO-FE-VALIDATION-NOTES.md +107 -0
  281. procesio_cli/tools/procesio/PROCESIO-FOREACH-NOTES.md +199 -0
  282. procesio_cli/tools/procesio/PROCESIO-FORM-API-HANG-NOTE.md +101 -0
  283. procesio_cli/tools/procesio/PROCESIO-FORM-SUBMISSION-NOTES.md +172 -0
  284. procesio_cli/tools/procesio/PROCESIO-HTML-TO-DOCX-NOTES.md +110 -0
  285. procesio_cli/tools/procesio/PROCESIO-INSTANCE-HISTORY-NOTES.md +242 -0
  286. procesio_cli/tools/procesio/PROCESIO-METERING-NOTES.md +201 -0
  287. procesio_cli/tools/procesio/PROCESIO-NODE-CODE-NOTES.md +279 -0
  288. procesio_cli/tools/procesio/PROCESIO-NODE-MODULE-WHITELIST.md +113 -0
  289. procesio_cli/tools/procesio/PROCESIO-PYTHON-ACTION-NOTES.md +165 -0
  290. procesio_cli/tools/procesio/PROCESIO-QUERY-STORE-NOTES.md +826 -0
  291. procesio_cli/tools/procesio/PROCESIO-RECONCILIATION-PATTERNS.md +104 -0
  292. procesio_cli/tools/procesio/PROCESIO-RESOURCE-MODEL-NOTES.md +1100 -0
  293. procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-CRED-OPTIONALITY.md +45 -0
  294. procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-NOTES.md +252 -0
  295. procesio_cli/tools/procesio/PROCESIO-SQL-ACTIONS-NOTES.md +284 -0
  296. procesio_cli/tools/procesio/PROCESIO-USAGE-GUIDE.md +219 -0
  297. procesio_cli/tools/procesio/README.md +341 -0
  298. procesio_cli/tools/procesio/SCHEDULE-INPUT-SECURITY-NOTES.md +63 -0
  299. procesio_cli/tools/procesio/SKILL.md +694 -0
  300. procesio_cli/tools/procesio/__init__.py +1 -0
  301. procesio_cli/tools/procesio/actiondef.py +27 -0
  302. procesio_cli/tools/procesio/assets/html2docx/html2docx.js +2155 -0
  303. procesio_cli/tools/procesio/auth.py +354 -0
  304. procesio_cli/tools/procesio/autogen.py +121 -0
  305. procesio_cli/tools/procesio/client.py +355 -0
  306. procesio_cli/tools/procesio/config.py +96 -0
  307. procesio_cli/tools/procesio/data/endpoints.json +2901 -0
  308. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/01-authentication.md +180 -0
  309. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/02-conventions.md +116 -0
  310. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/ANONYMOUS-SURFACE.md +51 -0
  311. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/README.md +104 -0
  312. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/SYMBOL-INDEX.md +444 -0
  313. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/03-auth-users-workspaces.md +731 -0
  314. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/04-processes.md +913 -0
  315. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/05-actions.md +605 -0
  316. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/06-files.md +237 -0
  317. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/07-forms-documents.md +985 -0
  318. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/08-credentials.md +532 -0
  319. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/09-datastore-datatypes.md +830 -0
  320. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/10-custom-urls.md +319 -0
  321. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/11-subscriptions-resources-analytics.md +455 -0
  322. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/12-webhooks-notifications-misc.md +519 -0
  323. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/13-realtime-signalr.md +153 -0
  324. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/99-internal-and-other-services.md +52 -0
  325. procesio_cli/tools/procesio/docs_info/FormBuilder mock.ts +5725 -0
  326. procesio_cli/tools/procesio/docs_info/Procesio Platform Actions.json +30219 -0
  327. procesio_cli/tools/procesio/docs_info/form-config-enums.ts +92 -0
  328. procesio_cli/tools/procesio/docs_info/form-theme.ts +1603 -0
  329. procesio_cli/tools/procesio/docs_info/process-validation-reference-1.md +2739 -0
  330. procesio_cli/tools/procesio/dto/__init__.py +13 -0
  331. procesio_cli/tools/procesio/dto/credential/builder.py +179 -0
  332. procesio_cli/tools/procesio/dto/credential/config.schema.json +19 -0
  333. procesio_cli/tools/procesio/dto/credential/description.md +193 -0
  334. procesio_cli/tools/procesio/dto/credential/fixtures/rest.config.json +11 -0
  335. procesio_cli/tools/procesio/dto/credential/fixtures/rest.dto.json +28 -0
  336. procesio_cli/tools/procesio/dto/credential/fixtures/rest.template.json +44 -0
  337. procesio_cli/tools/procesio/dto/credential/template.dto.json +16 -0
  338. procesio_cli/tools/procesio/dto/data/_refresh.py +147 -0
  339. procesio_cli/tools/procesio/dto/data/action_catalog.json +30825 -0
  340. procesio_cli/tools/procesio/dto/data/action_families.json +55 -0
  341. procesio_cli/tools/procesio/dto/data/platform_types.json +182 -0
  342. procesio_cli/tools/procesio/dto/datatype/builder.py +223 -0
  343. procesio_cli/tools/procesio/dto/datatype/config.schema.json +47 -0
  344. procesio_cli/tools/procesio/dto/datatype/description.md +85 -0
  345. procesio_cli/tools/procesio/dto/datatype/fixtures/customer.config.json +41 -0
  346. procesio_cli/tools/procesio/dto/datatype/fixtures/customer.dto.json +164 -0
  347. procesio_cli/tools/procesio/dto/datatype/template.dto.json +37 -0
  348. procesio_cli/tools/procesio/dto/document/builder.py +193 -0
  349. procesio_cli/tools/procesio/dto/document/config.schema.json +33 -0
  350. procesio_cli/tools/procesio/dto/document/description.md +124 -0
  351. procesio_cli/tools/procesio/dto/document/fixtures/invoice.config.json +16 -0
  352. procesio_cli/tools/procesio/dto/document/fixtures/invoice.dto.json +32 -0
  353. procesio_cli/tools/procesio/dto/document/template.dto.json +14 -0
  354. procesio_cli/tools/procesio/dto/form/FORM-STYLING-NOTES.md +142 -0
  355. procesio_cli/tools/procesio/dto/form/GOLDEN-DRIFT-NOTES.md +72 -0
  356. procesio_cli/tools/procesio/dto/form/RUN-PROCESS-RESULT-NOTES.md +80 -0
  357. procesio_cli/tools/procesio/dto/form/addelement.py +277 -0
  358. procesio_cli/tools/procesio/dto/form/builder.py +1009 -0
  359. procesio_cli/tools/procesio/dto/form/capture_goldens.py +106 -0
  360. procesio_cli/tools/procesio/dto/form/code_cipher.py +67 -0
  361. procesio_cli/tools/procesio/dto/form/config.schema.json +76 -0
  362. procesio_cli/tools/procesio/dto/form/data_shell.json +1 -0
  363. procesio_cli/tools/procesio/dto/form/description.md +346 -0
  364. procesio_cli/tools/procesio/dto/form/elements/approval.json +259 -0
  365. procesio_cli/tools/procesio/dto/form/elements/assignee.json +137 -0
  366. procesio_cli/tools/procesio/dto/form/elements/button.json +125 -0
  367. procesio_cli/tools/procesio/dto/form/elements/chart.json +341 -0
  368. procesio_cli/tools/procesio/dto/form/elements/chat.json +199 -0
  369. procesio_cli/tools/procesio/dto/form/elements/checkbox.json +153 -0
  370. procesio_cli/tools/procesio/dto/form/elements/column.json +77 -0
  371. procesio_cli/tools/procesio/dto/form/elements/columns.json +78 -0
  372. procesio_cli/tools/procesio/dto/form/elements/datetime-input.json +304 -0
  373. procesio_cli/tools/procesio/dto/form/elements/divider.json +54 -0
  374. procesio_cli/tools/procesio/dto/form/elements/dropdown.json +130 -0
  375. procesio_cli/tools/procesio/dto/form/elements/dynamic-table-row.json +253 -0
  376. procesio_cli/tools/procesio/dto/form/elements/file-upload.json +196 -0
  377. procesio_cli/tools/procesio/dto/form/elements/file-viewer.json +169 -0
  378. procesio_cli/tools/procesio/dto/form/elements/heading.json +79 -0
  379. procesio_cli/tools/procesio/dto/form/elements/icon.json +107 -0
  380. procesio_cli/tools/procesio/dto/form/elements/image.json +174 -0
  381. procesio_cli/tools/procesio/dto/form/elements/input.json +206 -0
  382. procesio_cli/tools/procesio/dto/form/elements/list.json +202 -0
  383. procesio_cli/tools/procesio/dto/form/elements/number-input.json +202 -0
  384. procesio_cli/tools/procesio/dto/form/elements/paragraph.json +79 -0
  385. procesio_cli/tools/procesio/dto/form/elements/radiobox.json +174 -0
  386. procesio_cli/tools/procesio/dto/form/elements/section.json +114 -0
  387. procesio_cli/tools/procesio/dto/form/elements/select.json +217 -0
  388. procesio_cli/tools/procesio/dto/form/elements/side-panel.json +146 -0
  389. procesio_cli/tools/procesio/dto/form/elements/signature-pad.json +141 -0
  390. procesio_cli/tools/procesio/dto/form/elements/static-table-row.json +84 -0
  391. procesio_cli/tools/procesio/dto/form/elements/step.json +105 -0
  392. procesio_cli/tools/procesio/dto/form/elements/stepper.json +126 -0
  393. procesio_cli/tools/procesio/dto/form/elements/tab.json +77 -0
  394. procesio_cli/tools/procesio/dto/form/elements/table.json +279 -0
  395. procesio_cli/tools/procesio/dto/form/elements/tabs.json +114 -0
  396. procesio_cli/tools/procesio/dto/form/elements/textarea.json +213 -0
  397. procesio_cli/tools/procesio/dto/form/enum_map.json +68 -0
  398. procesio_cli/tools/procesio/dto/form/fieldpath.py +284 -0
  399. procesio_cli/tools/procesio/dto/form/fixtures/reg.config.json +32 -0
  400. procesio_cli/tools/procesio/dto/form/fixtures/reg.elements.json +638 -0
  401. procesio_cli/tools/procesio/dto/form/sync_from_mock.py +386 -0
  402. procesio_cli/tools/procesio/dto/framework.py +125 -0
  403. procesio_cli/tools/procesio/dto/process/builder.py +1991 -0
  404. procesio_cli/tools/procesio/dto/process/config.schema.json +159 -0
  405. procesio_cli/tools/procesio/dto/process/description.md +218 -0
  406. procesio_cli/tools/procesio/dto/process/fixtures/greet.config.json +32 -0
  407. procesio_cli/tools/procesio/dto/process/fixtures/greet.dto.json +317 -0
  408. procesio_cli/tools/procesio/dto/process/naming.py +305 -0
  409. procesio_cli/tools/procesio/dto/process/normalize.py +74 -0
  410. procesio_cli/tools/procesio/dto/process/template.dto.json +32 -0
  411. procesio_cli/tools/procesio/dto/refdata.py +87 -0
  412. procesio_cli/tools/procesio/dto/registry.py +27 -0
  413. procesio_cli/tools/procesio/dto/webhook/builder.py +142 -0
  414. procesio_cli/tools/procesio/dto/webhook/config.schema.json +25 -0
  415. procesio_cli/tools/procesio/dto/webhook/description.md +92 -0
  416. procesio_cli/tools/procesio/dto/webhook/fixtures/order.config.json +10 -0
  417. procesio_cli/tools/procesio/dto/webhook/fixtures/order.dto.json +25 -0
  418. procesio_cli/tools/procesio/dto/webhook/template.dto.json +14 -0
  419. procesio_cli/tools/procesio/environments.py +264 -0
  420. procesio_cli/tools/procesio/errors.py +166 -0
  421. procesio_cli/tools/procesio/flowmodel/README.md +37 -0
  422. procesio_cli/tools/procesio/flowmodel/__init__.py +14 -0
  423. procesio_cli/tools/procesio/flowmodel/digest.py +223 -0
  424. procesio_cli/tools/procesio/flowmodel/families.py +34 -0
  425. procesio_cli/tools/procesio/flowmodel/fevalidation.py +1098 -0
  426. procesio_cli/tools/procesio/flowmodel/formdigest.py +232 -0
  427. procesio_cli/tools/procesio/flowmodel/inspect.py +78 -0
  428. procesio_cli/tools/procesio/flowmodel/model.py +82 -0
  429. procesio_cli/tools/procesio/flowmodel/nodeparam.py +871 -0
  430. procesio_cli/tools/procesio/flowmodel/reader.py +191 -0
  431. procesio_cli/tools/procesio/flowmodel/sqlparam.py +410 -0
  432. procesio_cli/tools/procesio/form_code_keys.py +50 -0
  433. procesio_cli/tools/procesio/formlint.py +292 -0
  434. procesio_cli/tools/procesio/gen_manifest.py +118 -0
  435. procesio_cli/tools/procesio/handlers/__init__.py +1 -0
  436. procesio_cli/tools/procesio/handlers/auth_actions.py +103 -0
  437. procesio_cli/tools/procesio/handlers/catalog.py +147 -0
  438. procesio_cli/tools/procesio/handlers/common.py +90 -0
  439. procesio_cli/tools/procesio/handlers/customaction_ops.py +146 -0
  440. procesio_cli/tools/procesio/handlers/datastore_ops.py +482 -0
  441. procesio_cli/tools/procesio/handlers/datatype_ops.py +275 -0
  442. procesio_cli/tools/procesio/handlers/dto_actions.py +258 -0
  443. procesio_cli/tools/procesio/handlers/environment_admin.py +146 -0
  444. procesio_cli/tools/procesio/handlers/fevalidate.py +236 -0
  445. procesio_cli/tools/procesio/handlers/files.py +141 -0
  446. procesio_cli/tools/procesio/handlers/flowgraph.py +229 -0
  447. procesio_cli/tools/procesio/handlers/flowlint.py +269 -0
  448. procesio_cli/tools/procesio/handlers/form_chains.py +336 -0
  449. procesio_cli/tools/procesio/handlers/form_code.py +277 -0
  450. procesio_cli/tools/procesio/handlers/form_element.py +199 -0
  451. procesio_cli/tools/procesio/handlers/form_events.py +441 -0
  452. procesio_cli/tools/procesio/handlers/form_update.py +270 -0
  453. procesio_cli/tools/procesio/handlers/formprocess.py +211 -0
  454. procesio_cli/tools/procesio/handlers/generic.py +135 -0
  455. procesio_cli/tools/procesio/handlers/layout.py +137 -0
  456. procesio_cli/tools/procesio/handlers/nodeparams.py +1018 -0
  457. procesio_cli/tools/procesio/handlers/process_layout.py +189 -0
  458. procesio_cli/tools/procesio/handlers/process_naming.py +213 -0
  459. procesio_cli/tools/procesio/handlers/processes.py +416 -0
  460. procesio_cli/tools/procesio/handlers/profile_admin.py +184 -0
  461. procesio_cli/tools/procesio/handlers/resource_ops.py +447 -0
  462. procesio_cli/tools/procesio/handlers/schedules.py +320 -0
  463. procesio_cli/tools/procesio/handlers/sqlactions.py +232 -0
  464. procesio_cli/tools/procesio/handlers/transport.py +463 -0
  465. procesio_cli/tools/procesio/handlers/usageguide.py +222 -0
  466. procesio_cli/tools/procesio/layout/README.md +196 -0
  467. procesio_cli/tools/procesio/layout/__init__.py +11 -0
  468. procesio_cli/tools/procesio/layout/adapter.py +736 -0
  469. procesio_cli/tools/procesio/layout/cycles.py +186 -0
  470. procesio_cli/tools/procesio/layout/dispatch.py +39 -0
  471. procesio_cli/tools/procesio/layout/elk/elk_runner.mjs +50 -0
  472. procesio_cli/tools/procesio/layout/elk/package-lock.json +21 -0
  473. procesio_cli/tools/procesio/layout/elk/package.json +11 -0
  474. procesio_cli/tools/procesio/layout/elk_engine.py +568 -0
  475. procesio_cli/tools/procesio/layout/engine.py +1311 -0
  476. procesio_cli/tools/procesio/layout/report.py +187 -0
  477. procesio_cli/tools/procesio/main.py +179 -0
  478. procesio_cli/tools/procesio/profiles.py +193 -0
  479. procesio_cli/tools/procesio/reliability.py +193 -0
  480. procesio_cli/tools/procesio/sqlformat.py +167 -0
  481. procesio_cli/tools/procesio/swagger.py +51 -0
  482. procesio_cli/tools/procesio/tests/__init__.py +0 -0
  483. procesio_cli/tools/procesio/tests/conftest.py +129 -0
  484. procesio_cli/tools/procesio/tests/test_auth.py +200 -0
  485. procesio_cli/tools/procesio/tests/test_autogen.py +78 -0
  486. procesio_cli/tools/procesio/tests/test_builder_attrpath_sqlbind.py +180 -0
  487. procesio_cli/tools/procesio/tests/test_builder_custom_action_catalog.py +72 -0
  488. procesio_cli/tools/procesio/tests/test_client.py +114 -0
  489. procesio_cli/tools/procesio/tests/test_client_reliability.py +139 -0
  490. procesio_cli/tools/procesio/tests/test_customaction.py +103 -0
  491. procesio_cli/tools/procesio/tests/test_customaction_test.py +80 -0
  492. procesio_cli/tools/procesio/tests/test_cycles.py +69 -0
  493. procesio_cli/tools/procesio/tests/test_datastore.py +378 -0
  494. procesio_cli/tools/procesio/tests/test_datastore_node.py +94 -0
  495. procesio_cli/tools/procesio/tests/test_dispatch.py +170 -0
  496. procesio_cli/tools/procesio/tests/test_document_page_size.py +19 -0
  497. procesio_cli/tools/procesio/tests/test_dto.py +734 -0
  498. procesio_cli/tools/procesio/tests/test_edit_dryrun_preview.py +96 -0
  499. procesio_cli/tools/procesio/tests/test_elk_layout.py +221 -0
  500. procesio_cli/tools/procesio/tests/test_environments.py +214 -0
  501. procesio_cli/tools/procesio/tests/test_fevalidate_gate.py +104 -0
  502. procesio_cli/tools/procesio/tests/test_fevalidation.py +317 -0
  503. procesio_cli/tools/procesio/tests/test_fieldpath_variables.py +87 -0
  504. procesio_cli/tools/procesio/tests/test_files.py +72 -0
  505. procesio_cli/tools/procesio/tests/test_flow_digest.py +202 -0
  506. procesio_cli/tools/procesio/tests/test_flowlint.py +114 -0
  507. procesio_cli/tools/procesio/tests/test_flowmodel.py +158 -0
  508. procesio_cli/tools/procesio/tests/test_form_add_element.py +256 -0
  509. procesio_cli/tools/procesio/tests/test_form_approval_gaps.py +319 -0
  510. procesio_cli/tools/procesio/tests/test_form_auto_names.py +60 -0
  511. procesio_cli/tools/procesio/tests/test_form_chains.py +217 -0
  512. procesio_cli/tools/procesio/tests/test_form_code_actions.py +188 -0
  513. procesio_cli/tools/procesio/tests/test_form_code_keys.py +92 -0
  514. procesio_cli/tools/procesio/tests/test_form_code_style.py +178 -0
  515. procesio_cli/tools/procesio/tests/test_form_delete_element.py +99 -0
  516. procesio_cli/tools/procesio/tests/test_form_element_config.py +141 -0
  517. procesio_cli/tools/procesio/tests/test_form_event_maps.py +135 -0
  518. procesio_cli/tools/procesio/tests/test_form_event_ops.py +376 -0
  519. procesio_cli/tools/procesio/tests/test_form_event_replace.py +86 -0
  520. procesio_cli/tools/procesio/tests/test_form_events.py +92 -0
  521. procesio_cli/tools/procesio/tests/test_form_parity.py +171 -0
  522. procesio_cli/tools/procesio/tests/test_form_select_source.py +74 -0
  523. procesio_cli/tools/procesio/tests/test_form_sync.py +35 -0
  524. procesio_cli/tools/procesio/tests/test_form_update.py +133 -0
  525. procesio_cli/tools/procesio/tests/test_formlint.py +155 -0
  526. procesio_cli/tools/procesio/tests/test_formlint_css_scope.py +38 -0
  527. procesio_cli/tools/procesio/tests/test_formlint_field_names.py +83 -0
  528. procesio_cli/tools/procesio/tests/test_guards.py +110 -0
  529. procesio_cli/tools/procesio/tests/test_hidden_setting_types.py +39 -0
  530. procesio_cli/tools/procesio/tests/test_html2docx_asset.py +132 -0
  531. procesio_cli/tools/procesio/tests/test_key_handle_terminology.py +45 -0
  532. procesio_cli/tools/procesio/tests/test_layout.py +574 -0
  533. procesio_cli/tools/procesio/tests/test_layout_report.py +88 -0
  534. procesio_cli/tools/procesio/tests/test_manifest_sync.py +68 -0
  535. procesio_cli/tools/procesio/tests/test_nodedelete.py +151 -0
  536. procesio_cli/tools/procesio/tests/test_nodeparam.py +826 -0
  537. procesio_cli/tools/procesio/tests/test_normalize.py +70 -0
  538. procesio_cli/tools/procesio/tests/test_payload_docs.py +86 -0
  539. procesio_cli/tools/procesio/tests/test_process_action_naming.py +170 -0
  540. procesio_cli/tools/procesio/tests/test_process_call_api_seed.py +46 -0
  541. procesio_cli/tools/procesio/tests/test_process_ext.py +373 -0
  542. procesio_cli/tools/procesio/tests/test_process_invariants.py +183 -0
  543. procesio_cli/tools/procesio/tests/test_process_layout.py +117 -0
  544. procesio_cli/tools/procesio/tests/test_process_naming.py +188 -0
  545. procesio_cli/tools/procesio/tests/test_process_query_store.py +172 -0
  546. procesio_cli/tools/procesio/tests/test_processinfo_variable.py +56 -0
  547. procesio_cli/tools/procesio/tests/test_profiles.py +127 -0
  548. procesio_cli/tools/procesio/tests/test_put_projects.py +41 -0
  549. procesio_cli/tools/procesio/tests/test_reliability.py +107 -0
  550. procesio_cli/tools/procesio/tests/test_removal_gate.py +95 -0
  551. procesio_cli/tools/procesio/tests/test_resource_ops.py +173 -0
  552. procesio_cli/tools/procesio/tests/test_save_validity.py +207 -0
  553. procesio_cli/tools/procesio/tests/test_schedule_cron_shape.py +111 -0
  554. procesio_cli/tools/procesio/tests/test_schedules.py +309 -0
  555. procesio_cli/tools/procesio/tests/test_sqlconvert.py +234 -0
  556. procesio_cli/tools/procesio/tests/test_sqlformat.py +83 -0
  557. procesio_cli/tools/procesio/tests/test_sqlparam.py +187 -0
  558. procesio_cli/tools/procesio/tests/test_superseded_actions.py +54 -0
  559. procesio_cli/tools/procesio/tests/test_surgical_concurrency.py +156 -0
  560. procesio_cli/tools/procesio/tests/test_tier4.py +123 -0
  561. procesio_cli/tools/procesio/tests/test_transport.py +147 -0
  562. procesio_cli/tools/procesio/tests/test_transport_data_stores.py +168 -0
  563. procesio_cli/tools/procesio/tests/test_transport_mapper_repair.py +150 -0
  564. procesio_cli/tools/procesio/tests/test_transport_webhook_strip.py +253 -0
  565. procesio_cli/tools/procesio/tests/test_usage_guide.py +96 -0
  566. procesio_cli/tools/procesio/tool.yaml +12486 -0
  567. procesio_cli/tools/sqlserver/MOVED-TO-CENTRAL.md +29 -0
  568. procesio_cli/tools/sqlserver/README.md +192 -0
  569. procesio_cli/tools/sqlserver/SKILL.md +37 -0
  570. procesio_cli/tools/sqlserver/SQLSERVER-SCHEMA-NOTES.md +284 -0
  571. procesio_cli/tools/sqlserver/__init__.py +0 -0
  572. procesio_cli/tools/sqlserver/connection.py +242 -0
  573. procesio_cli/tools/sqlserver/main.py +521 -0
  574. procesio_cli/tools/sqlserver/profiles.template.json +1 -0
  575. procesio_cli/tools/sqlserver/schema.py +600 -0
  576. procesio_cli/tools/sqlserver/tests/__init__.py +0 -0
  577. procesio_cli/tools/sqlserver/tests/conftest.py +21 -0
  578. procesio_cli/tools/sqlserver/tests/test_connection.py +75 -0
  579. procesio_cli/tools/sqlserver/tests/test_dbprofiles.py +92 -0
  580. procesio_cli/tools/sqlserver/tests/test_dbquery.py +220 -0
  581. procesio_cli/tools/sqlserver/tests/test_manifest_sync.py +68 -0
  582. procesio_cli/tools/sqlserver/tests/test_sqlserver.py +326 -0
  583. procesio_cli/tools/sqlserver/tests/test_sqlserver_schema.py +488 -0
  584. procesio_cli/tools/sqlserver/tool.yaml +123 -0
  585. procesio_cli/tools/web/README.md +381 -0
  586. procesio_cli/tools/web/SKILL.md +37 -0
  587. procesio_cli/tools/web/WEB-AUTOMATION-NOTES.md +277 -0
  588. procesio_cli/tools/web/__init__.py +21 -0
  589. procesio_cli/tools/web/actiondef.py +24 -0
  590. procesio_cli/tools/web/api.py +444 -0
  591. procesio_cli/tools/web/brokered.py +107 -0
  592. procesio_cli/tools/web/driver.py +839 -0
  593. procesio_cli/tools/web/drivercontract.py +44 -0
  594. procesio_cli/tools/web/errors.py +54 -0
  595. procesio_cli/tools/web/handlers/__init__.py +1 -0
  596. procesio_cli/tools/web/handlers/archive.py +367 -0
  597. procesio_cli/tools/web/handlers/browse.py +182 -0
  598. procesio_cli/tools/web/handlers/contacts.py +74 -0
  599. procesio_cli/tools/web/handlers/sessmgmt.py +120 -0
  600. procesio_cli/tools/web/main.py +128 -0
  601. procesio_cli/tools/web/sessions.py +253 -0
  602. procesio_cli/tools/web/steps.py +162 -0
  603. procesio_cli/tools/web/tests/__init__.py +0 -0
  604. procesio_cli/tools/web/tests/conftest.py +197 -0
  605. procesio_cli/tools/web/tests/test_api.py +330 -0
  606. procesio_cli/tools/web/tests/test_archive.py +190 -0
  607. procesio_cli/tools/web/tests/test_brokered.py +138 -0
  608. procesio_cli/tools/web/tests/test_dispatch.py +132 -0
  609. procesio_cli/tools/web/tests/test_errors.py +60 -0
  610. procesio_cli/tools/web/tests/test_manifest_sync.py +76 -0
  611. procesio_cli/tools/web/tests/test_page_contacts.py +68 -0
  612. procesio_cli/tools/web/tests/test_sessions.py +145 -0
  613. procesio_cli/tools/web/tests/test_steps.py +210 -0
  614. procesio_cli/tools/web/tool.yaml +184 -0
  615. procesio_cli/tools/xlsx/README.md +34 -0
  616. procesio_cli/tools/xlsx/SKILL.md +28 -0
  617. procesio_cli/tools/xlsx/__init__.py +0 -0
  618. procesio_cli/tools/xlsx/main.py +129 -0
  619. procesio_cli/tools/xlsx/reader.py +91 -0
  620. procesio_cli/tools/xlsx/tests/__init__.py +0 -0
  621. procesio_cli/tools/xlsx/tests/conftest.py +39 -0
  622. procesio_cli/tools/xlsx/tests/test_xlsx.py +103 -0
  623. procesio_cli/tools/xlsx/tool.yaml +30 -0
  624. procesio_cli/webplatform/aat_mcp/AAT-MCP-NOTES.md +244 -0
  625. procesio_cli/webplatform/aat_mcp/README.md +78 -0
  626. procesio_cli/webplatform/aat_mcp/bridge.py +705 -0
  627. procesio_cli/webplatform/aat_mcp/chat_server.py +194 -0
  628. procesio_cli/webplatform/aat_mcp/chat_surface.snapshot.json +668 -0
  629. procesio_cli/webplatform/aat_mcp/chat_surface.yaml +372 -0
  630. procesio_cli/webplatform/aat_mcp/gate.py +68 -0
  631. procesio_cli/webplatform/aat_mcp/http_server.py +139 -0
  632. procesio_cli/webplatform/aat_mcp/protocol.py +175 -0
  633. procesio_cli/webplatform/aat_mcp/server.py +306 -0
  634. procesio_cli/webplatform/aat_mcp/tests/conftest.py +8 -0
  635. procesio_cli/webplatform/aat_mcp/tests/test_aat_mcp.py +255 -0
  636. procesio_cli/webplatform/aat_mcp/tests/test_chat_surface.py +247 -0
  637. procesio_cli/webplatform/aat_mcp/tests/test_discovery.py +489 -0
  638. procesio_cli/webplatform/aat_mcp/tests/test_multiuser.py +86 -0
  639. procesio_cli/webplatform/aat_mcp/tests/test_progressive_discovery.py +89 -0
  640. procesio_cli/webplatform/aat_mcp/tests/test_protocol.py +180 -0
  641. procesio_cli/webplatform/aat_mcp/tests/test_skill_discovery.py +23 -0
  642. procesio_cli-0.1.1.dist-info/METADATA +467 -0
  643. procesio_cli-0.1.1.dist-info/RECORD +647 -0
  644. procesio_cli-0.1.1.dist-info/WHEEL +4 -0
  645. procesio_cli-0.1.1.dist-info/entry_points.txt +7 -0
  646. procesio_cli-0.1.1.dist-info/licenses/LICENSE +201 -0
  647. procesio_cli-0.1.1.dist-info/licenses/NOTICE +5 -0
@@ -0,0 +1,38 @@
1
+ """Generic escape hatch: call ANY connector-builder endpoint not first-classed.
2
+
3
+ Keeps the tool complete as the API evolves — new endpoints are reachable via
4
+ `api --method ... --path ...` without a code change, while the common workflow
5
+ stays ergonomic through the dedicated actions.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+
11
+ from actiondef import ActionDef
12
+ from handlers.common import parse_json
13
+
14
+
15
+ def api(client, args) -> dict:
16
+ params = parse_json(args.query, what="query", expect=dict)
17
+ body = parse_json(args.body, what="body", expect=(dict, list)) if args.body else None
18
+ if args.out:
19
+ # Binary / file response: stream to disk (GET only makes sense here).
20
+ return client.download(args.path, args.out, params=params)
21
+ result = client.request(args.method, args.path, params=params, json_body=body)
22
+ return {"path": args.path, "method": args.method.upper(), "response": result}
23
+
24
+
25
+ def _api_args(p: argparse.ArgumentParser) -> None:
26
+ p.add_argument("--method", default="GET",
27
+ help="HTTP method (GET/POST/PUT/PATCH/DELETE)")
28
+ p.add_argument("--path", required=True,
29
+ help="Endpoint path, e.g. /builds or /admin/users")
30
+ p.add_argument("--query", help="Query params as a JSON object")
31
+ p.add_argument("--body", help="Request body as JSON (object or array)")
32
+ p.add_argument("--out", help="If set, stream the response to this file (binary)")
33
+
34
+
35
+ ACTIONS: dict[str, ActionDef] = {
36
+ "api": ActionDef(api, _api_args,
37
+ description="Call any endpoint (method/path/query/body); --out streams binary."),
38
+ }
@@ -0,0 +1,39 @@
1
+ """Cross-build telemetry: GET /telemetry/logs (own builds; all builds for admin)."""
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+
6
+ from actiondef import ActionDef
7
+
8
+
9
+ def telemetry(client, args) -> dict:
10
+ params: dict = {"page": args.page, "page_size": args.page_size}
11
+ for f in ("build_id", "stage", "model", "model_search", "after", "before"):
12
+ v = getattr(args, f)
13
+ if v:
14
+ params[f] = v
15
+ if args.success is not None:
16
+ params["success"] = str(args.success).lower()
17
+ return client.get("/telemetry/logs", params)
18
+
19
+
20
+ def _telemetry_args(p: argparse.ArgumentParser) -> None:
21
+ p.add_argument("--page", type=int, default=1)
22
+ p.add_argument("--page-size", dest="page_size", type=int, default=100,
23
+ help="Max 500")
24
+ p.add_argument("--build-id", dest="build_id",
25
+ help="Comma-separated build UUIDs to filter")
26
+ p.add_argument("--stage", help="Comma-separated stage names")
27
+ p.add_argument("--success", type=lambda v: v.lower() in ("1", "true", "yes"),
28
+ default=None, help="Filter by success true/false")
29
+ p.add_argument("--model", help="Comma-separated model names")
30
+ p.add_argument("--model-search", dest="model_search", help="Substring model search")
31
+ p.add_argument("--after", help="ISO datetime lower bound")
32
+ p.add_argument("--before", help="ISO datetime upper bound")
33
+
34
+
35
+ ACTIONS: dict[str, ActionDef] = {
36
+ "telemetry": ActionDef(
37
+ telemetry, _telemetry_args,
38
+ description="Cross-build LLM telemetry (cost/tokens/latency), filterable."),
39
+ }
@@ -0,0 +1,94 @@
1
+ """connector-builder tool entrypoint — action dispatch.
2
+
3
+ Drives the AI Connector Builder (connector-builder.procesio.app): the platform
4
+ that turns API documentation into compiled PROCESIO Custom Action `.nupkg`
5
+ connectors via an 8-stage LLM pipeline (gather → clarify → plan → generate →
6
+ validate → compile → fix → deliver).
7
+
8
+ Two auth modes, both resolving to an `Authorization: Bearer <token>` header
9
+ (see client.py): an `acb_...` API key, or username/password → POST /auth/login.
10
+
11
+ The dir name has a hyphen, so this tool's own modules are imported by BARE name
12
+ with the tool root on sys.path (mirrors quickmail-web / fgo-web); the shared libs
13
+ are imported as the valid package `tools._lib`.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import sys
18
+ from pathlib import Path
19
+
20
+ TOOL_ROOT = Path(__file__).resolve().parent
21
+ FRAMEWORK_ROOT = TOOL_ROOT.parents[1]
22
+ _VENV_PY = FRAMEWORK_ROOT / ".venv" / "Scripts" / "python.exe"
23
+ if _VENV_PY.exists() and Path(sys.executable).resolve() != _VENV_PY.resolve():
24
+ import subprocess
25
+ sys.exit(subprocess.run([str(_VENV_PY), __file__, *sys.argv[1:]]).returncode)
26
+
27
+ import argparse # noqa: E402
28
+
29
+ for _p in (str(TOOL_ROOT), str(FRAMEWORK_ROOT)):
30
+ if _p not in sys.path:
31
+ sys.path.insert(0, _p)
32
+
33
+ from tools._lib.io import emit, fail # noqa: E402
34
+
35
+ import errors # noqa: E402
36
+ from actiondef import ActionDef # noqa: E402
37
+
38
+
39
+ class _Parser(argparse.ArgumentParser):
40
+ def error(self, message: str):
41
+ raise errors.UsageError(message)
42
+
43
+
44
+ def collect_actions() -> dict[str, ActionDef]:
45
+ from handlers import auth, builds, files, telemetry, admin, raw
46
+ actions: dict[str, ActionDef] = {}
47
+ for module in (auth, builds, files, telemetry, admin, raw):
48
+ for name, defn in module.ACTIONS.items():
49
+ if name in actions:
50
+ raise RuntimeError(f"duplicate connector-builder action: {name}")
51
+ actions[name] = defn
52
+ return actions
53
+
54
+
55
+ ACTIONS = collect_actions()
56
+
57
+
58
+ def _default_client_factory():
59
+ from client import ConnectorBuilderClient
60
+ return ConnectorBuilderClient()
61
+
62
+
63
+ def dispatch(action: str, argv: list[str], *, client_factory=None) -> dict:
64
+ if action not in ACTIONS:
65
+ raise errors.UsageError(
66
+ f"unknown action: {action}. Known: {', '.join(sorted(ACTIONS))}")
67
+ defn = ACTIONS[action]
68
+ parser = _Parser(prog=f"connector-builder {action}", description=defn.description)
69
+ defn.add_args(parser)
70
+ parsed = parser.parse_args(argv)
71
+ if defn.needs_client:
72
+ factory = client_factory or _default_client_factory
73
+ return defn.func(factory(), parsed)
74
+ return defn.func(parsed)
75
+
76
+
77
+ def main(argv=None) -> None:
78
+ argv = list(sys.argv[1:] if argv is None else argv)
79
+ if not argv or argv[0] in ("-h", "--help"):
80
+ print("Actions:", file=sys.stderr)
81
+ for name in sorted(ACTIONS):
82
+ print(f" {name:<28} {ACTIONS[name].description}", file=sys.stderr)
83
+ sys.exit(0)
84
+ action, rest = argv[0], argv[1:]
85
+ try:
86
+ result = dispatch(action, rest)
87
+ except Exception as exc: # noqa: BLE001
88
+ code, message, details, exit_code = errors.classify(exc)
89
+ fail(code, message, details, exit_code)
90
+ emit(result)
91
+
92
+
93
+ if __name__ == "__main__":
94
+ main()
@@ -0,0 +1,146 @@
1
+ """Pytest fixtures + hyphen-safe module loading for the connector-builder tool.
2
+
3
+ The tool dir name has a hyphen, so its own modules (errors, actiondef, client,
4
+ handlers.*, main) cannot be imported as ``tools.connector-builder.*``. At runtime
5
+ main.py imports them by BARE name with the tool root on sys.path. Under pytest
6
+ those bare names collide across hyphenated tools, so — exactly like fgo-web /
7
+ quickmail-web — we load THIS tool's modules under unique ``cb_*`` aliases via
8
+ importlib, registering the bare names only TRANSIENTLY during load so each
9
+ module's intra-tool bare imports resolve to THIS tool's files, then restore.
10
+
11
+ NOTE: there is intentionally NO tests/__init__.py here and every test file has a
12
+ unique ``test_cb_*`` basename — otherwise pytest's rootdir import collides with
13
+ other hyphenated tools' identically-named test modules.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import importlib.util
18
+ import sys
19
+ from pathlib import Path
20
+ from types import ModuleType
21
+
22
+ import pytest
23
+
24
+ TOOL_ROOT = Path(__file__).resolve().parents[1] # tools/connector-builder
25
+ FRAMEWORK_ROOT = Path(__file__).resolve().parents[3] # repo root
26
+
27
+ if str(FRAMEWORK_ROOT) not in sys.path:
28
+ sys.path.insert(0, str(FRAMEWORK_ROOT))
29
+
30
+ _BARE_NAMES = (
31
+ "errors", "actiondef", "client",
32
+ "handlers", "handlers.common", "handlers.auth", "handlers.builds",
33
+ "handlers.files", "handlers.telemetry", "handlers.admin", "handlers.raw",
34
+ "main",
35
+ )
36
+ _MISSING = object()
37
+ _saved_bare = {n: sys.modules.get(n, _MISSING) for n in _BARE_NAMES}
38
+
39
+
40
+ def _load(bare_name: str, relpath: str) -> ModuleType:
41
+ path = TOOL_ROOT / relpath
42
+ spec = importlib.util.spec_from_file_location(bare_name, path)
43
+ assert spec and spec.loader
44
+ mod = importlib.util.module_from_spec(spec)
45
+ sys.modules[bare_name] = mod # transient: lets intra-tool bare imports work
46
+ spec.loader.exec_module(mod)
47
+ sys.modules["cb_" + bare_name.replace(".", "_")] = mod
48
+ return mod
49
+
50
+
51
+ # Leaf modules first.
52
+ errors = _load("errors", "errors.py")
53
+ actiondef = _load("actiondef", "actiondef.py")
54
+ client = _load("client", "client.py")
55
+
56
+ _handlers_pkg = ModuleType("handlers")
57
+ _handlers_pkg.__path__ = [str(TOOL_ROOT / "handlers")] # type: ignore[attr-defined]
58
+ sys.modules["handlers"] = _handlers_pkg
59
+ sys.modules["cb_handlers"] = _handlers_pkg
60
+ common = _load("handlers.common", "handlers/common.py")
61
+ auth = _load("handlers.auth", "handlers/auth.py")
62
+ builds = _load("handlers.builds", "handlers/builds.py")
63
+ files = _load("handlers.files", "handlers/files.py")
64
+ telemetry = _load("handlers.telemetry", "handlers/telemetry.py")
65
+ admin = _load("handlers.admin", "handlers/admin.py")
66
+ raw = _load("handlers.raw", "handlers/raw.py")
67
+
68
+ main = _load("main", "main.py")
69
+
70
+ # Friendly aliases for tests.
71
+ sys.modules["cb_main"] = main
72
+ sys.modules["cb_errors"] = errors
73
+ sys.modules["cb_client"] = client
74
+
75
+ # Strip TOOL_ROOT from sys.path so another hyphenated tool's bare imports don't
76
+ # resolve to OUR files for the rest of the session, then restore bare-name slots.
77
+ _tool_root_str = str(TOOL_ROOT)
78
+ sys.path[:] = [p for p in sys.path if p != _tool_root_str]
79
+ for _bn, _prev in _saved_bare.items():
80
+ if _prev is _MISSING:
81
+ sys.modules.pop(_bn, None)
82
+ else:
83
+ sys.modules[_bn] = _prev
84
+
85
+
86
+ class FakeClient:
87
+ """Records calls and returns canned responses. Mirrors the
88
+ ConnectorBuilderClient verb surface used by handlers."""
89
+
90
+ def __init__(self, responses=None, base_url="https://example/api"):
91
+ self.base_url = base_url
92
+ self.calls: list[tuple] = []
93
+ self.responses = responses or {}
94
+
95
+ def _ret(self, key, default):
96
+ return self.responses.get(key, default)
97
+
98
+ def get(self, path, params=None):
99
+ self.calls.append(("GET", path, params, None))
100
+ return self._ret(("GET", path), {"ok": True, "path": path, "params": params})
101
+
102
+ def post(self, path, json_body=None, params=None):
103
+ self.calls.append(("POST", path, params, json_body))
104
+ return self._ret(("POST", path), {"ok": True, "path": path, "body": json_body})
105
+
106
+ def put(self, path, json_body=None):
107
+ self.calls.append(("PUT", path, None, json_body))
108
+ return self._ret(("PUT", path), {"ok": True, "path": path, "body": json_body})
109
+
110
+ def patch(self, path, json_body=None):
111
+ self.calls.append(("PATCH", path, None, json_body))
112
+ return self._ret(("PATCH", path), {"ok": True, "path": path, "body": json_body})
113
+
114
+ def delete(self, path, params=None):
115
+ self.calls.append(("DELETE", path, params, None))
116
+ return self._ret(("DELETE", path), {"ok": True, "path": path})
117
+
118
+ def request(self, method, path, params=None, json_body=None):
119
+ self.calls.append((method.upper(), path, params, json_body))
120
+ return self._ret((method.upper(), path),
121
+ {"ok": True, "path": path, "method": method.upper()})
122
+
123
+ def download(self, path, out_path, params=None):
124
+ self.calls.append(("DOWNLOAD", path, params, out_path))
125
+ return {"out": out_path, "bytes": 123, "filename": "pkg.nupkg",
126
+ "content_type": "application/octet-stream"}
127
+
128
+
129
+ @pytest.fixture
130
+ def fake_client():
131
+ return FakeClient()
132
+
133
+
134
+ @pytest.fixture
135
+ def cb_main():
136
+ return main
137
+
138
+
139
+ @pytest.fixture
140
+ def cb_errors():
141
+ return errors
142
+
143
+
144
+ @pytest.fixture
145
+ def cb_client():
146
+ return client
@@ -0,0 +1,86 @@
1
+ """Auth-resolution + client behaviour tests (no network)."""
2
+ from __future__ import annotations
3
+
4
+ import pytest
5
+
6
+ import cb_client as client
7
+ import cb_errors as errors
8
+
9
+
10
+ @pytest.fixture(autouse=True)
11
+ def _clear_auth_env(monkeypatch):
12
+ for k in ("CONNECTOR_BUILDER_AUTH", "CONNECTOR_BUILDER_API_KEY",
13
+ "CONNECTOR_BUILDER_USERNAME", "CONNECTOR_BUILDER_PASSWORD"):
14
+ monkeypatch.delenv(k, raising=False)
15
+
16
+
17
+ def _set_creds(monkeypatch, mapping):
18
+ monkeypatch.setattr(client, "_cred", lambda name: mapping.get(name))
19
+
20
+
21
+ def test_apikey_mode_default_when_key_present(monkeypatch):
22
+ _set_creds(monkeypatch, {"api-key": "acb_abc"})
23
+ assert client.resolve_token() == "acb_abc"
24
+
25
+
26
+ def test_userpass_mode_when_only_userpass(monkeypatch):
27
+ _set_creds(monkeypatch, {"username": "u@e", "password": "pw"})
28
+ monkeypatch.setattr(client, "login", lambda u, p: f"jwt:{u}:{p}")
29
+ assert client.resolve_token() == "jwt:u@e:pw"
30
+
31
+
32
+ def test_explicit_userpass_overrides_apikey(monkeypatch):
33
+ monkeypatch.setenv("CONNECTOR_BUILDER_AUTH", "userpass")
34
+ _set_creds(monkeypatch, {"api-key": "acb_abc", "username": "u", "password": "p"})
35
+ monkeypatch.setattr(client, "login", lambda u, p: "jwt-tok")
36
+ assert client.resolve_token() == "jwt-tok"
37
+
38
+
39
+ def test_no_credential_raises(monkeypatch):
40
+ _set_creds(monkeypatch, {})
41
+ with pytest.raises(errors.CredentialError):
42
+ client.resolve_token()
43
+
44
+
45
+ def test_apikey_mode_without_key_raises(monkeypatch):
46
+ monkeypatch.setenv("CONNECTOR_BUILDER_AUTH", "apikey")
47
+ _set_creds(monkeypatch, {"username": "u", "password": "p"})
48
+ with pytest.raises(errors.CredentialError):
49
+ client.resolve_token()
50
+
51
+
52
+ def test_bearer_header_shape():
53
+ c = client.ConnectorBuilderClient(token="acb_xyz")
54
+ h = c._headers()
55
+ assert h["Authorization"] == "Bearer acb_xyz"
56
+ assert h["Accept"] == "application/json"
57
+
58
+
59
+ def test_base_url_env_override(monkeypatch):
60
+ monkeypatch.setenv("CONNECTOR_BUILDER_BASE_URL", "https://local/api/")
61
+ assert client.get_base_url() == "https://local/api"
62
+
63
+
64
+ class _Resp:
65
+ def __init__(self, status, body):
66
+ self.status_code = status
67
+ self._body = body
68
+ self.headers = {}
69
+ self.content = b"{}"
70
+ self.text = "{}"
71
+
72
+ def json(self):
73
+ return self._body
74
+
75
+
76
+ def test_request_raises_apierror_on_4xx(monkeypatch):
77
+ c = client.ConnectorBuilderClient(token="t")
78
+
79
+ class _S:
80
+ def request(self, *a, **k):
81
+ return _Resp(404, {"detail": "nope"})
82
+
83
+ c._s = _S()
84
+ with pytest.raises(errors.ApiError) as ei:
85
+ c.get("/builds/x")
86
+ assert ei.value.status_code == 404
@@ -0,0 +1,105 @@
1
+ """Dispatch + handler routing tests with a FakeClient (zero network)."""
2
+ from __future__ import annotations
3
+
4
+ import pytest
5
+
6
+ import cb_main as main
7
+
8
+
9
+ def _run(action, argv, fake_client):
10
+ return main.dispatch(action, argv, client_factory=lambda: fake_client)
11
+
12
+
13
+ def test_unknown_action_raises(fake_client):
14
+ import cb_errors as errors
15
+ with pytest.raises(errors.UsageError):
16
+ _run("nope", [], fake_client)
17
+
18
+
19
+ def test_check_hits_auth_me(fake_client):
20
+ fake_client.responses[("GET", "/auth/me")] = {
21
+ "email": "x@example.com", "role": "admin", "has_llm_key": True}
22
+ out = _run("check", [], fake_client)
23
+ assert out["ok"] is True and out["role"] == "admin"
24
+ assert fake_client.calls[0][:2] == ("GET", "/auth/me")
25
+
26
+
27
+ def test_create_build_requires_a_source(fake_client):
28
+ import cb_errors as errors
29
+ with pytest.raises(errors.UsageError):
30
+ _run("create-build", ["--user-requirements", "do x"], fake_client)
31
+
32
+
33
+ def test_create_build_posts_body(fake_client):
34
+ _run("create-build", ["--api-url", "https://docs", "--user-requirements", "x"],
35
+ fake_client)
36
+ method, path, _params, body = fake_client.calls[0]
37
+ assert (method, path) == ("POST", "/builds")
38
+ assert body["api_url"] == "https://docs" and body["user_requirements"] == "x"
39
+
40
+
41
+ def test_answer_wraps_answers_object(fake_client):
42
+ _run("answer", ["--build-id", "B1", "--answers", '{"q1":"a1"}'], fake_client)
43
+ method, path, _p, body = fake_client.calls[0]
44
+ assert (method, path) == ("POST", "/builds/B1/answers")
45
+ assert body == {"answers": {"q1": "a1"}}
46
+
47
+
48
+ def test_answer_rejects_bad_json(fake_client):
49
+ import cb_errors as errors
50
+ with pytest.raises(errors.UsageError):
51
+ _run("answer", ["--build-id", "B1", "--answers", "not-json"], fake_client)
52
+
53
+
54
+ def test_override_stage_payload(fake_client):
55
+ _run("override-stage",
56
+ ["--build-id", "B1", "--target-step", "3", "--target-status", "waiting_user"],
57
+ fake_client)
58
+ method, path, _p, body = fake_client.calls[0]
59
+ assert (method, path) == ("POST", "/builds/B1/override-stage")
60
+ assert body == {"target_step": 3, "target_status": "waiting_user"}
61
+
62
+
63
+ def test_download_artifact_streams_to_out(fake_client):
64
+ out = _run("download-artifact", ["--build-id", "B1", "--out", "pkg.nupkg"],
65
+ fake_client)
66
+ assert out["bytes"] == 123
67
+ assert fake_client.calls[0][:2] == ("DOWNLOAD", "/builds/B1/artifact")
68
+
69
+
70
+ def test_update_file_requires_content(fake_client):
71
+ import cb_errors as errors
72
+ with pytest.raises(errors.UsageError):
73
+ _run("update-file", ["--build-id", "B1", "--filename", "A.cs"], fake_client)
74
+
75
+
76
+ def test_knowledge_create_validates_module_type(fake_client):
77
+ import cb_errors as errors
78
+ with pytest.raises(errors.UsageError):
79
+ _run("knowledge-create",
80
+ ["--module-type", "bogus", "--name", "x.md", "--content", "y"],
81
+ fake_client)
82
+
83
+
84
+ def test_knowledge_update_puts_content(fake_client):
85
+ _run("knowledge-update",
86
+ ["--module-type", "prompt", "--name", "clarify.md", "--content", "hi"],
87
+ fake_client)
88
+ method, path, _p, body = fake_client.calls[0]
89
+ assert (method, path) == ("PUT", "/admin/knowledge/prompt/clarify.md")
90
+ assert body == {"content": "hi"}
91
+
92
+
93
+ def test_api_escape_hatch_get(fake_client):
94
+ out = _run("api", ["--method", "GET", "--path", "/builds", "--query", '{"page":1}'],
95
+ fake_client)
96
+ assert out["method"] == "GET" and out["path"] == "/builds"
97
+ assert fake_client.calls[0][:2] == ("GET", "/builds")
98
+
99
+
100
+ def test_all_actions_present():
101
+ # Sanity: the full surface is wired (auth+builds+files+telemetry+admin+raw).
102
+ for a in ("check", "create-build", "gather", "answer", "approve-plan",
103
+ "approve-generate", "download-artifact", "telemetry",
104
+ "knowledge-list", "build-selftest", "api"):
105
+ assert a in main.ACTIONS
@@ -0,0 +1,76 @@
1
+ """Guard: tool.yaml (source of truth) declares exactly the actions the dispatcher
2
+ registers, every CLI flag appears as a manifest arg (and vice-versa), required
3
+ flags are marked required, and the three auth secrets are declared.
4
+
5
+ ``main`` comes in via the ``cb_main`` alias from conftest."""
6
+ from __future__ import annotations
7
+
8
+ import argparse
9
+ from pathlib import Path
10
+
11
+ import cb_main as main
12
+ from tools._lib.manifest import load_tool
13
+
14
+
15
+ def _manifest():
16
+ tool_root = Path(main.__file__).resolve().parent
17
+ return load_tool(tool_root / "tool.yaml")
18
+
19
+
20
+ def test_manifest_loads():
21
+ m = _manifest()
22
+ assert m.name == "connector-builder"
23
+ assert m.routing is not None
24
+
25
+
26
+ def test_manifest_actions_match_dispatch():
27
+ m = _manifest()
28
+ manifest_actions = set(m.action_names())
29
+ dispatch_actions = set(main.ACTIONS)
30
+ assert manifest_actions == dispatch_actions, (
31
+ f"only in manifest: {manifest_actions - dispatch_actions}; "
32
+ f"only in code: {dispatch_actions - manifest_actions}"
33
+ )
34
+
35
+
36
+ def test_manifest_args_match_argparse():
37
+ m = _manifest()
38
+ for name, defn in main.ACTIONS.items():
39
+ parser = argparse.ArgumentParser()
40
+ defn.add_args(parser)
41
+ argparse_names = set()
42
+ for action in parser._actions:
43
+ for opt in action.option_strings:
44
+ if opt.startswith("--") and opt != "--help":
45
+ argparse_names.add(opt[2:])
46
+ spec = m.get_action(name)
47
+ manifest_names = {a.name for a in spec.args}
48
+ assert manifest_names == argparse_names, (
49
+ f"action {name}: only in manifest {manifest_names - argparse_names}; "
50
+ f"only in argparse {argparse_names - manifest_names}"
51
+ )
52
+
53
+
54
+ def test_required_args_marked_required_in_manifest():
55
+ m = _manifest()
56
+ for name, defn in main.ACTIONS.items():
57
+ parser = argparse.ArgumentParser()
58
+ defn.add_args(parser)
59
+ required_argparse = set()
60
+ for action in parser._actions:
61
+ if getattr(action, "required", False):
62
+ for opt in action.option_strings:
63
+ if opt.startswith("--") and opt != "--help":
64
+ required_argparse.add(opt[2:])
65
+ spec = m.get_action(name)
66
+ required_manifest = {a.name for a in spec.args if a.required}
67
+ assert required_argparse <= required_manifest, (
68
+ f"action {name}: argparse-required but not manifest-required: "
69
+ f"{required_argparse - required_manifest}"
70
+ )
71
+
72
+
73
+ def test_secrets_declared():
74
+ m = _manifest()
75
+ names = {s.name for s in m.secrets}
76
+ assert names == {"api-key", "username", "password"}