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,75 @@
1
+ """The user-data tree in the map must list what the resolvers actually create.
2
+
3
+ fm_builder._store_tree used to read the REAL folders off the local disk so a new
4
+ subfolder could never be omitted. That made a VERSIONED artifact depend on whose
5
+ machine built it. The list is canonical now, so this test carries the guarantee
6
+ the disk read used to: create a user-data root through tools/_lib/userdata and
7
+ assert the canonical list matches the directories that appear.
8
+
9
+ Add a resolver to userdata (or a folder to _CANON_FOLDERS) and this test tells
10
+ you the other half is missing, at build time rather than in someone's diff.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import pytest
15
+
16
+ import fm_builder
17
+ import fm_strings
18
+
19
+ from tools._lib import userdata
20
+
21
+
22
+ def _make_every_userdata_dir(component: str = "probe") -> None:
23
+ """Call every directory resolver userdata exposes, so each folder is created."""
24
+ userdata.state_dir(component)
25
+ userdata.config_dir(component)
26
+ userdata.prompts_dir(component)
27
+ userdata.sessions_dir()
28
+ userdata.exports_dir()
29
+ userdata.schedule_dir()
30
+ userdata.store_db_path() # parent only; the file itself is not created
31
+
32
+
33
+ def test_canonical_folders_match_what_userdata_creates(tmp_path, monkeypatch):
34
+ monkeypatch.setenv("AAT_USERDATA_DIR", str(tmp_path / "ud"))
35
+ monkeypatch.delenv("AAT_USER_ID", raising=False)
36
+ monkeypatch.delenv("AAT_WORKSPACE_ID", raising=False)
37
+
38
+ _make_every_userdata_dir()
39
+
40
+ live = {p.name for p in userdata.base().iterdir() if p.is_dir()}
41
+ assert live == set(fm_builder._CANON_FOLDERS), (
42
+ "fm_builder._CANON_FOLDERS is out of step with tools/_lib/userdata: "
43
+ f"only on disk={sorted(live - set(fm_builder._CANON_FOLDERS))}, "
44
+ f"only in the list={sorted(set(fm_builder._CANON_FOLDERS) - live)}")
45
+
46
+
47
+ # The store panel is part of the architecture narrative, which not every
48
+ # distribution of the framework ships. Where its copy is absent there is nothing
49
+ # to assert about it, so these skip rather than fail.
50
+ requires_store_copy = pytest.mark.skipif(
51
+ "sc1_h" not in fm_strings.S["en"],
52
+ reason="this distribution does not ship the store panel copy")
53
+
54
+ @requires_store_copy
55
+ def test_every_canonical_folder_is_described_in_both_languages():
56
+ """A folder with no description renders as a bare name with a blank column."""
57
+ for lang in ("en", "ro"):
58
+ S = fm_builder.fm_strings.S[lang]
59
+ described = ({"config": S["tc_config"], "sessions": S["tc_sessions"],
60
+ "schedule": S["tc_schedule"]} | fm_builder._FOLDER_EXTRA[lang])
61
+ missing = [f for f in fm_builder._CANON_FOLDERS if not described.get(f)]
62
+ assert not missing, f"{lang}: folders with no description: {missing}"
63
+
64
+
65
+ @requires_store_copy
66
+ def test_store_tree_is_independent_of_the_local_user_data_folder(tmp_path, monkeypatch):
67
+ """The whole point: same bytes on a machine with user data and on a clean one."""
68
+ monkeypatch.setenv("AAT_USERDATA_DIR", str(tmp_path / "empty"))
69
+ clean = fm_builder._store_tree("en")
70
+
71
+ populated_root = tmp_path / "populated"
72
+ monkeypatch.setenv("AAT_USERDATA_DIR", str(populated_root))
73
+ _make_every_userdata_dir()
74
+ (populated_root / "a-folder-someone-added-locally").mkdir()
75
+ assert fm_builder._store_tree("en") == clean
@@ -0,0 +1,61 @@
1
+ name: framework-map
2
+ description: >-
3
+ Regenerate the interactive, bilingual (EN default / RO) framework map - a
4
+ single self-contained HTML file that visualises every tool, agent, skill and
5
+ action from the live registry (drillable to the argument level), plus the
6
+ orchestration loop, the who-triggers-what diagram, schedules, the
7
+ context/state/knowledge store and worked use cases. Built for presenting the
8
+ Agents-and-Tools framework to a team.
9
+ version: 0.1.0
10
+ runtime: python
11
+ entrypoint: main.py
12
+
13
+ actions:
14
+ - name: build
15
+ description: >-
16
+ Extract the live registry, compress it, apply the RO catalog translations
17
+ (falling back to English where a translation is missing), assemble the
18
+ single-file HTML, and write it. Reports counts, category breakdown, and any
19
+ catalog strings still awaiting an RO translation.
20
+ args:
21
+ - name: out
22
+ type: string
23
+ required: false
24
+ default: framework-map.html
25
+ description: Output path for the HTML file. Relative paths resolve from the repo root.
26
+ output_schema: |
27
+ { "path": "string", "bytes": int, "tools": int, "agents": int,
28
+ "skills": int, "actions": int, "tool_actions": int, "agent_actions": int,
29
+ "categories": { "<name>": int }, "uncategorized": ["string"],
30
+ "ro_untranslated": { "tool_desc": [], "triggers": [], "agent_desc": [],
31
+ "skill_desc": [], "category": [] } }
32
+ examples:
33
+ - cmd: python scripts/run-tool.py framework-map build
34
+ output: '{"path": ".../framework-map.html", "bytes": 1280000, "tools": 44, "agents": 8, "skills": 12, "actions": 1500, ...}'
35
+ - cmd: python scripts/run-tool.py framework-map build --out outputs/map.html
36
+ output: '{"path": ".../outputs/map.html", "bytes": 1280000, ...}'
37
+
38
+ - name: check
39
+ description: >-
40
+ Report current counts, the category breakdown, any uncategorized tools, and
41
+ any catalog strings (tool/agent/skill descriptions, triggers, categories)
42
+ still missing an RO translation. Writes nothing - use before build to see
43
+ what a new tool/agent needs.
44
+ output_schema: |
45
+ { "tools": int, "agents": int, "skills": int, "actions": int,
46
+ "categories": {}, "uncategorized": [], "ro_untranslated": {} }
47
+ examples:
48
+ - cmd: python scripts/run-tool.py framework-map check
49
+ output: '{"tools": 44, "agents": 8, "skills": 12, "actions": 1500, "ro_untranslated": {}}'
50
+
51
+ secrets: []
52
+
53
+ routing:
54
+ triggers:
55
+ - regenerate / rebuild the framework map or the agents-and-tools visualization
56
+ - update the framework HTML with the new tools / agents / mechanics
57
+ - refresh the agents and tools diagram / presentation page
58
+ - which tools or agents changed / still need an RO translation
59
+ - build the bilingual framework map (EN/RO)
60
+ primary_action: build
61
+ example: "framework-map build (dry-run counts + untranslated: framework-map check)"
@@ -0,0 +1,29 @@
1
+ # profiles.json moved to the central user-data folder
2
+
3
+ `tools/mysql/profiles.json` is no longer here. User-specific connection profiles
4
+ now live in the central, git-ignored user-data folder so the framework stays free
5
+ of user data (hand the repo to someone else, wipe that folder, done).
6
+
7
+ New location (resolved by `tools/_lib/userdata.py`):
8
+
9
+ ```
10
+ context-state-knowledge/config/mysql/profiles.json
11
+ ```
12
+
13
+ Override the root with the `AAT_USERDATA_DIR` environment variable. Passwords were
14
+ never in this file - they remain in Windows Credential Manager under
15
+ `agents-and-tools:mysql:<profile>`.
16
+
17
+ The tool resolves the path via `userdata.config_dir("mysql")`; nothing else
18
+ changes. Add/list profiles exactly as before (`run-tool.py mysql add-profile ...`).
19
+
20
+ **Fresh install / wiped user data?** `profiles.template.json` here seeds an EMPTY
21
+ `{}` on purpose: in this format every top-level key is a live profile, so a
22
+ placeholder entry would show up in `profiles`, get suggested by error hints, and
23
+ invite credentials for a fake host. Use `add-profile`, which builds the file:
24
+
25
+ ```bash
26
+ python scripts/run-tool.py mysql add-profile --name myprofile \
27
+ --host db.example.com --port 3306 --database mydb --username user --tls
28
+ python scripts/set-credential.py mysql myprofile # password -> CredMan
29
+ ```
@@ -0,0 +1,196 @@
1
+ # mysql
2
+
3
+ Read-only **MySQL / MariaDB** queries over `pymysql`, with named connection
4
+ profiles. SELECT-only by default; `--write` is required (and gated by the shared
5
+ guard) for any non-SELECT. JSON in / JSON out.
6
+
7
+ > MySQL has no `ApplicationIntent=ReadOnly` equivalent, so for this engine the
8
+ > **write-guard is the read-only enforcement**. Its keyword list is the superset
9
+ > of both engines (adds `REPLACE`, `CALL`, `LOAD`, `LOCK`, `RENAME`, …).
10
+
11
+ ## Credentials (the model)
12
+
13
+ A profile splits into two halves:
14
+
15
+ - **Non-secret config** (host, database, username, port, charset, TLS flags,
16
+ timeouts) lives in `tools/mysql/profiles.json`. Never a password.
17
+ - **The password** lives ONLY in Windows Credential Manager, under the target
18
+ `agents-and-tools:mysql:<profile-name>` — the secret name **is** the profile
19
+ name. Read at runtime via `creds.get("mysql", <profile>)`.
20
+
21
+ For a profile named `default`, set its password with:
22
+
23
+ ```powershell
24
+ python scripts/set-credential.py mysql default
25
+ ```
26
+
27
+ If it's missing, DB actions fail with code `auth_required` and that exact hint.
28
+
29
+ ## Actions
30
+
31
+ ```powershell
32
+ # List profiles (no passwords). Works with no DB and no driver installed.
33
+ python scripts/run-tool.py mysql profiles
34
+
35
+ # Add a profile (config only — password set separately, see above).
36
+ python scripts/run-tool.py mysql add-profile `
37
+ --name default --host 10.0.0.5 --database redmine --username readonly --tls yes
38
+
39
+ # Connectivity check: masked DSN + server version (never the password).
40
+ python scripts/run-tool.py mysql test-connection --profile default
41
+
42
+ # Read-only query. Params are bound via %s placeholders, never interpolated.
43
+ python scripts/run-tool.py mysql query --profile default `
44
+ --sql "SELECT * FROM issues WHERE project_id = %s LIMIT 10" --params '[3]'
45
+
46
+ # A write needs the explicit flag (still gated, still parameterised):
47
+ python scripts/run-tool.py mysql query --profile default `
48
+ --sql "DELETE FROM cache WHERE id = %s" --params '[7]' --write
49
+
50
+ # Schema introspection (defaults to the profile's database).
51
+ python scripts/run-tool.py mysql tables --profile default
52
+ python scripts/run-tool.py mysql columns --profile default --table issues
53
+ ```
54
+
55
+ ## Multiple databases (one profile, many DBs)
56
+
57
+ `--database` is just the **default schema** and is optional — one profile (one host +
58
+ login + credential) already reaches every database on the host. Pick one per call:
59
+
60
+ ```powershell
61
+ python scripts/run-tool.py mysql query --profile prod --database redmine --sql "SELECT * FROM issues LIMIT 5"
62
+ python scripts/run-tool.py mysql tables --profile prod --database wordpress
63
+ python scripts/run-tool.py mysql columns --profile prod --database wordpress --table wp_posts
64
+ ```
65
+
66
+ `--database` sets the connection's default schema for that call, so `tables`/`columns`
67
+ introspect it and unqualified names resolve to it. You can also reach another schema
68
+ inline with a qualified name (`SELECT * FROM otherdb.t`) if the login has grants.
69
+ Prefer one named profile per database? That works too — both styles are fine.
70
+
71
+ ## Schema mirror, diff & migrations
72
+
73
+ Three actions extend the tool from "query a DB" to "version a DB's schema". They
74
+ share the engine-agnostic machinery in `tools/_lib/dbschema.py`; the MySQL-specific
75
+ half (catalog enumeration, `SHOW CREATE`, the `__schema_migrations` table) lives in
76
+ `tools/mysql/schema.py`.
77
+
78
+ ### `schema-extract` — mirror every object to local `.sql` files (read-only)
79
+
80
+ Writes one file per object under `<out>/schema/<Type>/<schema>.<name>.sql` plus a
81
+ `_manifest.json` of `relpath -> sha256`. **Incremental** by default — a re-run with no
82
+ schema changes writes nothing. Read-only (only `SELECT` / `SHOW CREATE`).
83
+
84
+ ```powershell
85
+ # Mirror the profile's database to ./db-mirror/<profile>/
86
+ python scripts/run-tool.py mysql schema-extract --profile default
87
+
88
+ # Pick a database, a subset of object types, and a custom output dir.
89
+ python scripts/run-tool.py mysql schema-extract --profile prod `
90
+ --database redmine --types TABLE,VIEW,PROCEDURE --out .\mirrors\redmine
91
+
92
+ # See what would change without touching disk.
93
+ python scripts/run-tool.py mysql schema-extract --profile default --dry-run
94
+
95
+ # Force a clean re-extract.
96
+ python scripts/run-tool.py mysql schema-extract --profile default --full
97
+ ```
98
+
99
+ `--types` accepts any of `TABLE,VIEW,PROCEDURE,FUNCTION,TRIGGER,EVENT`. Returns
100
+ `{profile, database, out, written, unchanged, removed, total, by_type, dry_run}`.
101
+
102
+ ### `schema-diff` — compare two schema sides (read-only)
103
+
104
+ Each side is **either** a mirror directory **or** `profile:NAME` (extracted live to a
105
+ temp mirror first). Reports objects added / removed / changed, with a unified diff per
106
+ change (suppress bodies with `--no-diff-text`).
107
+
108
+ ```powershell
109
+ # Two already-extracted mirrors.
110
+ python scripts/run-tool.py mysql schema-diff --left .\mirrors\dev --right .\mirrors\rel
111
+
112
+ # Live: same profile, two databases on the host.
113
+ python scripts/run-tool.py mysql schema-diff `
114
+ --left profile:prod --database-left app_dev `
115
+ --right profile:prod --database-right app_release
116
+
117
+ # Just the changed/added/removed name lists (no diff bodies).
118
+ python scripts/run-tool.py mysql schema-diff --left .\a --right .\b --no-diff-text
119
+ ```
120
+
121
+ Returns `{left, right, added[], removed[], changed[{relpath, diff}], unchanged,
122
+ identical, summary}`. Read-only end to end.
123
+
124
+ ### `migrate` — forward-only versioned migration runner
125
+
126
+ Applies pending `NNNN_<slug>.sql` files in numeric order, tracking applied state in a
127
+ `__schema_migrations` table inside the target DB. `list` (the default) is read-only;
128
+ `apply` is the **only writer** and is gated behind `--apply`.
129
+
130
+ ```powershell
131
+ # List applied vs pending + drift + danger warnings (read-only).
132
+ python scripts/run-tool.py mysql migrate --profile default --dir .\db-migrations\app
133
+
134
+ # Validate without persisting: each migration runs in a rolled-back transaction.
135
+ python scripts/run-tool.py mysql migrate --profile default --dir .\db-migrations\app `
136
+ --mode apply --apply --dry-run
137
+
138
+ # Actually apply pending migrations (requires --apply).
139
+ python scripts/run-tool.py mysql migrate --profile default --dir .\db-migrations\app `
140
+ --mode apply --apply
141
+ ```
142
+
143
+ - Default `--dir` is `./db-migrations/<profile>`.
144
+ - `apply` **refuses to run on drift** (an applied migration whose file `sha256` changed
145
+ on disk) unless `--accept-drift` is passed.
146
+ - Each file runs in its own transaction; the runner **stops on the first error**.
147
+ - `danger_warnings` (DROP/TRUNCATE TABLE, unqualified UPDATE/DELETE) are surfaced per
148
+ pending file but do **not** block.
149
+
150
+ **DELIMITER / multi-statement caveat (important):** MySQL stored-routine bodies contain
151
+ semicolons, so a migration file is executed as a **single statement** — there is no
152
+ client-side `;`-splitting and no `DELIMITER` handling. Author each migration as **one
153
+ statement per file** (e.g. a single `CREATE PROCEDURE ... BEGIN ... END` with **no**
154
+ `DELIMITER` lines, or one plain DDL statement). Files with several `;`-separated plain
155
+ statements, or `DELIMITER`-wrapped bodies, are **not** supported in one file. (`GO`
156
+ batch-splitting is SQL-Server-only and is not used here.)
157
+
158
+ > **Safety:** `schema-extract`, `schema-diff`, and `migrate --mode list` are read-only.
159
+ > `migrate --mode apply` is the only write path and requires the explicit `--apply` flag.
160
+
161
+ ## add-profile options
162
+
163
+ | flag | default | notes |
164
+ |------|---------|-------|
165
+ | `--name` | — (required) | profile + credential name |
166
+ | `--host` | — (required) | |
167
+ | `--database` | login default | default schema (optional); override per call with `query/tables/columns --database` |
168
+ | `--username` | `root` | |
169
+ | `--port` | `3306` | |
170
+ | `--charset` | `utf8mb4` | |
171
+ | `--tls` | `no` | `yes`/`no` — wrap the socket in TLS |
172
+ | `--tls-verify-cert` | `no` | `yes`/`no` — verify the server cert chain |
173
+ | `--connect-timeout` | `30` | seconds |
174
+ | `--statement-timeout` | `300` | read timeout, seconds, `0` = unbounded |
175
+ | `--overwrite` | off | replace an existing profile |
176
+
177
+ ## Safety
178
+
179
+ - **Read-only by default** — `INSERT/UPDATE/DELETE/REPLACE/MERGE/TRUNCATE/ALTER/
180
+ CREATE/DROP/GRANT/CALL/LOAD/LOCK/…` and multi-statement batches are rejected
181
+ unless `--write` is passed. The guard lives in `tools/_lib/dbquery.py`.
182
+ - Values are always **parameterised** (`%s`), never spliced into the SQL.
183
+ - A **max-rows cap** (`--max-rows`, default 1000) returns a `truncated` flag.
184
+ - TLS without cert-verification encrypts the channel for IP-only hosts (the
185
+ SQL-Server `TrustServerCertificate=yes` analogue).
186
+
187
+ ## Dependencies
188
+
189
+ `pymysql` + `cryptography` (the latter for MySQL 8 `caching_sha2_password`).
190
+ Imported lazily — if absent, DB actions fail with `missing_dependency`;
191
+ `profiles` / `add-profile` keep working.
192
+
193
+ ## Errors
194
+
195
+ `invalid_argument` (2), `auth_required`, `write_blocked` (2),
196
+ `missing_dependency`, `db_error`, `error`.
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: mysql
3
+ description: Read-only MySQL/MariaDB queries over pymysql with named connection profiles. SELECT-only by default (--write to override); returns rows as JSON; schema/table introspection. MySQL has no read-only intent, so the write-guard is the enforcement.
4
+ ---
5
+
6
+ # mysql
7
+
8
+ Read-only MySQL/MariaDB queries over pymysql with named connection profiles. SELECT-only by default (--write to override); returns rows as JSON; schema/table introspection. MySQL has no read-only intent, so the write-guard is the enforcement.
9
+
10
+ ## How to call it
11
+
12
+ ```bash
13
+ python scripts/run-tool.py mysql <action> [--args]
14
+ # e.g. mysql query --profile default --sql "SELECT * FROM issues LIMIT 10"
15
+ ```
16
+
17
+ One JSON object on stdout for success; `{"error": {"code", "message", "details"}}` and a non-zero exit on failure. Progress and logs go to stderr only.
18
+
19
+ **Start with `query`.**
20
+
21
+ ## Actions
22
+
23
+ | action | required args | what it does |
24
+ |---|---|---|
25
+ | `add-profile` | `--name`, `--host` | Store a connection profile (config only; set the password separately via set-credential). |
26
+ | `columns` | `--profile`, `--table` | List a table's columns (name, type, nullable, key, length, default). |
27
+ | `migrate` | `--profile` | Forward-only versioned migration runner. mode=list (default, read-only) shows applied/pending + drift + danger warnings; mode=apply (gated by --apply) runs… |
28
+ | `profiles` | — | List configured connection profiles (no passwords). |
29
+ | `query` | `--profile`, `--sql` | Run read-only SQL (SELECT by default; --write allows non-SELECT). Params bound via %s placeholders, never interpolated. |
30
+ | `schema-diff` | `--left`, `--right` | Compare two schema sides and report objects added/removed/changed with a unified diff per change. Each side is a mirror directory OR profile:NAME (extracted… |
31
+ | `schema-extract` | `--profile` | Mirror every object in the database to local .sql files (one per object) under <out>/schema/<Type>/. Read-only and incremental: a re-run with no changes writes… |
32
+ | `tables` | `--profile` | List tables and views, optionally restricted to one schema. |
33
+ | `test-connection` | `--profile` | Connect and return the masked connection string + server version (never the password). |
34
+
35
+ ---
36
+
37
+ Generated from `tools/mysql/tool.yaml` by `scripts/build-tool-skill.py`. Do not edit by hand — change the manifest and regenerate.
File without changes
@@ -0,0 +1,191 @@
1
+ """pymysql connection factory + query layer for the `mysql` tool.
2
+
3
+ Lazy driver import: pymysql is only imported when a connection is opened, so
4
+ `add-profile` / `profiles` work without it. If pymysql is missing we raise
5
+ ``MissingDependencyError`` (mapped to ``missing_dependency``) with an install
6
+ hint.
7
+
8
+ MySQL has no ApplicationIntent=ReadOnly equivalent, so read-only is enforced
9
+ by the shared write-guard in dbquery (the dispatch layer calls it before any
10
+ statement runs). A profile's NON-SECRET config (from profiles.json):
11
+ host (required)
12
+ database (optional) default schema
13
+ username (optional) default 'root'
14
+ port (optional) default 3306
15
+ charset (optional) default 'utf8mb4'
16
+ tls bool, default False (wrap socket in TLS)
17
+ tls_verify_cert bool, default False (verify the server cert chain)
18
+ connect_timeout seconds, default 30
19
+ statement_timeout seconds, default 300 (read timeout; 0 = unbounded)
20
+ The password comes from Credential Manager (never the file).
21
+ """
22
+ from __future__ import annotations
23
+
24
+ import ssl as _ssl
25
+ from typing import Any
26
+
27
+ from tools._lib import dbquery
28
+
29
+ DEFAULT_PORT = 3306
30
+ DEFAULT_USERNAME = "root"
31
+ DEFAULT_CHARSET = "utf8mb4"
32
+ DEFAULT_CONNECT_TIMEOUT = 30
33
+ DEFAULT_STATEMENT_TIMEOUT = 300
34
+
35
+
36
+ class MissingDependencyError(Exception):
37
+ """pymysql not installed. -> missing_dependency."""
38
+
39
+
40
+ class DBError(Exception):
41
+ """A driver-level error opening/executing. -> db_error."""
42
+
43
+
44
+ def _import_pymysql():
45
+ try:
46
+ import pymysql # noqa: PLC0415
47
+ import pymysql.cursors # noqa: PLC0415
48
+ except ImportError as e: # pragma: no cover - depends on host
49
+ raise MissingDependencyError(
50
+ "pymysql is not installed. Install with:\n"
51
+ " uv pip install pymysql cryptography\n"
52
+ "(cryptography is needed for MySQL 8 caching_sha2_password auth)."
53
+ ) from e
54
+ return pymysql
55
+
56
+
57
+ def _ssl_context(profile: dict):
58
+ if not profile.get("tls"):
59
+ return None
60
+ ctx = _ssl.create_default_context()
61
+ if not profile.get("tls_verify_cert", False):
62
+ ctx.check_hostname = False
63
+ ctx.verify_mode = _ssl.CERT_NONE
64
+ return ctx
65
+
66
+
67
+ def connection_kwargs(profile: dict, password: str | None) -> dict:
68
+ """Build pymysql.connect kwargs (password included when given)."""
69
+ host = profile.get("host")
70
+ if not host:
71
+ raise DBError("profile is missing 'host'")
72
+ pymysql = _import_pymysql()
73
+ kwargs: dict[str, Any] = {
74
+ "host": host,
75
+ "port": int(profile.get("port", DEFAULT_PORT)),
76
+ "user": profile.get("username", DEFAULT_USERNAME),
77
+ "charset": profile.get("charset", DEFAULT_CHARSET),
78
+ "autocommit": True,
79
+ "cursorclass": pymysql.cursors.DictCursor,
80
+ "connect_timeout": int(profile.get("connect_timeout", DEFAULT_CONNECT_TIMEOUT)),
81
+ "read_timeout": int(profile.get("statement_timeout", DEFAULT_STATEMENT_TIMEOUT)),
82
+ }
83
+ if profile.get("database"):
84
+ kwargs["database"] = profile["database"]
85
+ if password is not None:
86
+ kwargs["password"] = password
87
+ ctx = _ssl_context(profile)
88
+ if ctx is not None:
89
+ kwargs["ssl"] = ctx
90
+ return kwargs
91
+
92
+
93
+ def masked_dsn(profile: dict) -> str:
94
+ """A human-readable, password-free connection summary - safe to return/log."""
95
+ host = profile.get("host", "?")
96
+ port = int(profile.get("port", DEFAULT_PORT))
97
+ user = profile.get("username", DEFAULT_USERNAME)
98
+ database = profile.get("database", "")
99
+ tls = "on" if profile.get("tls") else "off"
100
+ dsn = f"mysql://{user}:***@{host}:{port}/{database}?charset={profile.get('charset', DEFAULT_CHARSET)}&tls={tls}"
101
+ return dbquery.mask_dsn(dsn)
102
+
103
+
104
+ def connect(profile: dict, password: str | None):
105
+ """Open a pymysql connection for `profile`."""
106
+ pymysql = _import_pymysql()
107
+ kwargs = connection_kwargs(profile, password)
108
+ try:
109
+ return pymysql.connect(**kwargs)
110
+ except pymysql.Error as e: # pragma: no cover - needs a live server
111
+ raise DBError(str(e)) from e
112
+
113
+
114
+ # ---------------------------------------------------------------------------
115
+ # Query + introspection. Each takes a connection-like object so tests can
116
+ # inject a fake. The write-guard is enforced by the dispatch layer.
117
+ # ---------------------------------------------------------------------------
118
+
119
+ def run_query(
120
+ conn,
121
+ sql: str,
122
+ params: list | tuple | None,
123
+ max_rows: int | None,
124
+ ) -> dict:
125
+ """Execute one SQL statement; return {columns, rows, row_count, truncated}.
126
+
127
+ `params` are passed to ``cursor.execute`` (pymysql uses ``%s`` placeholders);
128
+ they are never string-interpolated into `sql`.
129
+ """
130
+ cur = conn.cursor()
131
+ try:
132
+ if params:
133
+ cur.execute(sql, list(params))
134
+ else:
135
+ cur.execute(sql)
136
+ columns = dbquery.column_names(cur)
137
+ raw = cur.fetchall() if columns else []
138
+ capped, truncated = dbquery.cap_rows(list(raw), max_rows)
139
+ rows = dbquery.rows_to_dicts(columns, capped)
140
+ finally:
141
+ try:
142
+ cur.close()
143
+ except Exception: # noqa: BLE001
144
+ pass
145
+ return {
146
+ "columns": columns,
147
+ "rows": rows,
148
+ "row_count": len(rows),
149
+ "truncated": truncated,
150
+ }
151
+
152
+
153
+ def server_version(conn) -> str:
154
+ out = run_query(conn, "SELECT VERSION() AS version", None, None)
155
+ rows = out["rows"]
156
+ return str(rows[0].get("version", "")) if rows else ""
157
+
158
+
159
+ def list_tables(conn, schema: str | None) -> list[dict]:
160
+ sql = (
161
+ "SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE "
162
+ "FROM INFORMATION_SCHEMA.TABLES"
163
+ )
164
+ params: list[Any] = []
165
+ if schema:
166
+ sql += " WHERE TABLE_SCHEMA = %s"
167
+ params.append(schema)
168
+ else:
169
+ sql += " WHERE TABLE_SCHEMA = DATABASE()"
170
+ sql += " ORDER BY TABLE_SCHEMA, TABLE_NAME"
171
+ out = run_query(conn, sql, params or None, None)
172
+ return out["rows"]
173
+
174
+
175
+ def list_columns(conn, table: str) -> list[dict]:
176
+ """Columns for `table`, which may be ``schema.table`` or just ``table``."""
177
+ schema, _, name = table.rpartition(".")
178
+ sql = (
179
+ "SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY, "
180
+ "CHARACTER_MAXIMUM_LENGTH, COLUMN_DEFAULT "
181
+ "FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = %s"
182
+ )
183
+ params: list[Any] = [name]
184
+ if schema:
185
+ sql += " AND TABLE_SCHEMA = %s"
186
+ params.append(schema)
187
+ else:
188
+ sql += " AND TABLE_SCHEMA = DATABASE()"
189
+ sql += " ORDER BY ORDINAL_POSITION"
190
+ out = run_query(conn, sql, params, None)
191
+ return out["rows"]