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,29 @@
1
+ # profiles.json moved to the central user-data folder
2
+
3
+ `tools/sqlserver/profiles.json` is no longer here. User-specific connection
4
+ profiles now live in the central, git-ignored user-data folder so the framework
5
+ stays free 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/sqlserver/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:sqlserver:<profile>`.
16
+
17
+ The tool resolves the path via `userdata.config_dir("sqlserver")`; nothing else
18
+ changes. Add/list profiles exactly as before (`run-tool.py sqlserver 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 sqlserver add-profile --name myprofile \
27
+ --server sql.example.com --database mydb --username user --encrypt
28
+ python scripts/set-credential.py sqlserver myprofile # password -> CredMan
29
+ ```
@@ -0,0 +1,192 @@
1
+ # sqlserver
2
+
3
+ Read-only **SQL Server** queries over `pyodbc`, with named connection profiles.
4
+ SELECT-only by default; `--write` is required (and gated by the shared guard)
5
+ for any non-SELECT. JSON in / JSON out, like every tool here.
6
+
7
+ ## Credentials (the model)
8
+
9
+ A profile splits into two halves:
10
+
11
+ - **Non-secret config** (server, database, username, driver, port, TLS flags,
12
+ timeouts) lives in `tools/sqlserver/profiles.json`. Never a password.
13
+ - **The password** lives ONLY in Windows Credential Manager, under the target
14
+ `agents-and-tools:sqlserver:<profile-name>` — the secret name **is** the
15
+ profile name. Read at runtime via `creds.get("sqlserver", <profile>)`.
16
+
17
+ For a profile named `default`, set its password with:
18
+
19
+ ```powershell
20
+ python scripts/set-credential.py sqlserver default
21
+ ```
22
+
23
+ If it's missing, DB actions fail with code `auth_required` and that exact hint.
24
+
25
+ ## Actions
26
+
27
+ ```powershell
28
+ # List profiles (no passwords). Works with no DB and no driver installed.
29
+ python scripts/run-tool.py sqlserver profiles
30
+
31
+ # Add a profile (config only — password set separately, see above).
32
+ python scripts/run-tool.py sqlserver add-profile `
33
+ --name default --server myhost.database.windows.net `
34
+ --database DeployCenter --username ringhelteam
35
+
36
+ # Connectivity check: masked connection string + server version (never the password).
37
+ python scripts/run-tool.py sqlserver test-connection --profile default
38
+
39
+ # Read-only query. Params are bound via ? placeholders, never interpolated.
40
+ python scripts/run-tool.py sqlserver query --profile default `
41
+ --sql "SELECT TOP 10 * FROM dbo.Customer WHERE City = ?" --params '["Cluj"]'
42
+
43
+ # A write needs the explicit flag (still gated, still parameterised):
44
+ python scripts/run-tool.py sqlserver query --profile default `
45
+ --sql "UPDATE dbo.Flag SET on=1 WHERE id=?" --params '[7]' --write
46
+
47
+ # Line endings in --sql are normalized to CRLF before execution (reported as
48
+ # "eol_normalized": true). This keeps CREATE/ALTER PROCEDURE|VIEW|FUNCTION|
49
+ # TRIGGER definitions internally consistent so SSMS never shows its
50
+ # "Inconsistent Line Endings" prompt when the object is scripted out. Pass
51
+ # --no-normalize-eol only if you must preserve a bare LF inside a string
52
+ # literal (param values are bound separately and are never touched).
53
+
54
+ # Schema introspection.
55
+ python scripts/run-tool.py sqlserver tables --profile default --schema dbo
56
+ python scripts/run-tool.py sqlserver columns --profile default --table dbo.Customer
57
+ ```
58
+
59
+ ## Schema mirror, diff & migrations
60
+
61
+ Three actions built on the shared, engine-agnostic core in `tools/_lib/dbschema.py`.
62
+ `schema-extract`, `schema-diff`, and `migrate --mode list` are **read-only**;
63
+ `migrate --mode apply` is the only writer and is gated behind `--apply`.
64
+
65
+ ### `schema-extract` — mirror every object to local `.sql` files
66
+
67
+ Writes one `.sql` file per object under `<out>/schema/<Type>/<schema>.<name>.sql`,
68
+ plus a `_manifest.json` of relpath→sha256. Incremental by default (a second run
69
+ with no schema change writes 0 files); `--full` wipes and re-extracts.
70
+
71
+ ```powershell
72
+ # Mirror a whole DB (default out: ./db-mirror/<profile>)
73
+ python scripts/run-tool.py sqlserver schema-extract --profile deploycenter
74
+
75
+ # Pick a specific DB on a server profile, only some object families, dry-run
76
+ python scripts/run-tool.py sqlserver schema-extract --profile prod --database fee_dev `
77
+ --types P,V,FN,U --out ./db-mirror/fee_dev --dry-run
78
+ ```
79
+
80
+ Module objects (procedures `P`, functions `FN`/`IF`/`TF`, views `V`, DML triggers
81
+ `TR`) are captured **verbatim** from `sys.sql_modules.definition`. Tables (`U`) get
82
+ `CREATE TABLE` DDL generated from the catalog (columns/types/nullability/identity/
83
+ defaults/collation/computed, primary key, foreign keys, non-PK indexes, check
84
+ constraints). `--types` filters by object **family** — e.g. `--types FN` keeps the
85
+ whole Functions family (scalar + inline + table-valued), since the on-disk label
86
+ does not distinguish them. Output: `{profile, database, out, written, unchanged,
87
+ removed, total, by_type, dry_run}`.
88
+
89
+ ### `schema-diff` — compare two mirrors or two live DBs
90
+
91
+ Each side is either an existing mirror **directory** or `profile:NAME` (extracted to
92
+ a temp mirror on the fly, with an optional `--database-*` override). Returns objects
93
+ added (only on the right) / removed (only on the left) / changed (with a unified
94
+ diff per object). `--no-diff-text` keeps just the name lists.
95
+
96
+ ```powershell
97
+ # Two already-extracted mirrors
98
+ python scripts/run-tool.py sqlserver schema-diff --left ./db-mirror/fee_dev --right ./db-mirror/fee_release
99
+
100
+ # Two live DBs on the same server profile, names only (no diff bodies)
101
+ python scripts/run-tool.py sqlserver schema-diff `
102
+ --left profile:fee_dev --right profile:fee_release --no-diff-text
103
+ ```
104
+
105
+ ### `migrate` — forward-only versioned migration runner
106
+
107
+ Applies pending `NNNN_<slug>.sql` files in numeric order, tracking applied state in
108
+ `dbo.__schema_migrations` (created on first run). `--mode list` (default, read-only)
109
+ shows applied vs pending, flags **drift** (an applied file whose sha256 changed on
110
+ disk), and surfaces danger warnings (DROP/TRUNCATE, unqualified UPDATE/DELETE) per
111
+ pending file. `--mode apply` **writes** and therefore requires an explicit `--apply`;
112
+ it refuses to run on drift unless `--accept-drift`, applies pending in order (each
113
+ file in one transaction, GO batches split), records a tracking row on success, and
114
+ stops on the first error.
115
+
116
+ ```powershell
117
+ # Safe default: see what's applied vs pending (read-only)
118
+ python scripts/run-tool.py sqlserver migrate --profile sandbox --dir ./db-migrations/sandbox
119
+
120
+ # Validate without persisting — each file runs in a rolled-back transaction
121
+ python scripts/run-tool.py sqlserver migrate --profile sandbox --mode apply --apply --dry-run
122
+
123
+ # Actually apply (writes). --apply is mandatory; never run against production casually.
124
+ python scripts/run-tool.py sqlserver migrate --profile sandbox --mode apply --apply
125
+ ```
126
+
127
+ **Deferred / limitations (v1):** exotic objects are NOT yet extracted — CLR
128
+ assemblies, user-defined scalar/table/CLR types, authored schemas, database-scope
129
+ DDL triggers, partitioning/filegroups/XML schema collections/full-text, sequences,
130
+ synonyms, Service Broker, extended properties (port from a sibling schema extractor when
131
+ needed). GO-batch splitting is line-based: a `GO` alone on a line **inside** a string
132
+ literal or block comment is still treated as a batch separator. No down/rollback
133
+ migrations (write a new forward migration to reverse).
134
+
135
+ ## Multiple databases (one profile, many DBs)
136
+
137
+ `--database` is **optional** on a profile, so a profile can be just a server + login
138
+ (one credential) and you pick the database per call:
139
+
140
+ ```powershell
141
+ # One profile for the whole instance (no --database)...
142
+ python scripts/run-tool.py sqlserver add-profile --name prod --server myhost --username ringhelteam
143
+ python scripts/set-credential.py sqlserver prod
144
+
145
+ # ...then target any database on it per call:
146
+ python scripts/run-tool.py sqlserver query --profile prod --database DeployCenter --sql "SELECT TOP 5 * FROM dbo.Customer"
147
+ python scripts/run-tool.py sqlserver tables --profile prod --database FEE
148
+ python scripts/run-tool.py sqlserver columns --profile prod --database FEE --table dbo.Invoice
149
+ ```
150
+
151
+ `--database` overrides the profile's default for that one call (SQL Server connects
152
+ straight to that DB — no `USE`, which the read-only guard blocks anyway). Omit it to
153
+ use the profile's `--database`, or the login's default DB if the profile has none.
154
+ Prefer one named profile per database instead? That still works — both styles are fine.
155
+
156
+ ## add-profile options
157
+
158
+ | flag | default | notes |
159
+ |------|---------|-------|
160
+ | `--name` | — (required) | profile + credential name |
161
+ | `--server` | — (required) | `host`, `host\instance`, or fqdn |
162
+ | `--database` | login default | optional — one profile can serve many DBs; override per call with `query/tables/columns --database` |
163
+ | `--username` | trusted conn | omit for a Windows/trusted connection |
164
+ | `--port` | — | appended as `server,port` |
165
+ | `--driver` | newest installed `ODBC Driver … for SQL Server` | auto-detected via `pyodbc.drivers()`; pass one to pin it |
166
+ | `--encrypt` | `yes` | `yes`/`no` |
167
+ | `--trust-server-certificate` | `no` | `yes`/`no` (self-signed/on-prem) |
168
+ | `--connect-timeout` | `30` | seconds |
169
+ | `--statement-timeout` | `300` | seconds, `0` = unbounded |
170
+ | `--overwrite` | off | replace an existing profile |
171
+
172
+ ## Safety
173
+
174
+ - **Read-only by default** — `INSERT/UPDATE/DELETE/MERGE/TRUNCATE/ALTER/CREATE/
175
+ DROP/GRANT/EXEC/CALL/…` and multi-statement batches are rejected unless
176
+ `--write` is passed. The guard lives in `tools/_lib/dbquery.py`.
177
+ - Read-only profiles also add `ApplicationIntent=ReadOnly`; pair with a
178
+ dedicated read-only SQL login for defence in depth.
179
+ - Values are always **parameterised** (`?`), never spliced into the SQL.
180
+ - A **max-rows cap** (`--max-rows`, default 1000) returns a `truncated` flag.
181
+ - The connection string is **masked** (`PWD=***`) everywhere it surfaces.
182
+
183
+ ## Dependencies
184
+
185
+ `pyodbc` + a Microsoft ODBC Driver for SQL Server (17 or 18). Imported lazily —
186
+ if absent, DB actions fail with `missing_dependency` and an install hint;
187
+ `profiles` / `add-profile` keep working.
188
+
189
+ ## Errors
190
+
191
+ `invalid_argument` (2), `auth_required`, `write_blocked` (2),
192
+ `missing_dependency`, `db_error`, `error`.
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: sqlserver
3
+ description: Read-only SQL Server queries over pyodbc with named connection profiles. SELECT-only by default (--write to override); returns rows as JSON; schema/table introspection.
4
+ ---
5
+
6
+ # sqlserver
7
+
8
+ Read-only SQL Server queries over pyodbc with named connection profiles. SELECT-only by default (--write to override); returns rows as JSON; schema/table introspection.
9
+
10
+ ## How to call it
11
+
12
+ ```bash
13
+ python scripts/run-tool.py sqlserver <action> [--args]
14
+ # e.g. sqlserver query --profile default --sql "SELECT TOP 10 * FROM dbo.Customer"
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`, `--server` | 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, length, default). |
27
+ | `migrate` | `--profile` | List or apply versioned .sql migrations (forward-only; tracking table; apply gated behind --apply). list is read-only and the default. |
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 ? placeholders, never interpolated. |
30
+ | `schema-diff` | `--left`, `--right` | Diff two schema mirrors or live profiles (objects added/removed/changed + unified diffs). Read-only. |
31
+ | `schema-extract` | `--profile` | Mirror all DB objects to local .sql files (one per object; incremental; read-only). |
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/sqlserver/tool.yaml` by `scripts/build-tool-skill.py`. Do not edit by hand — change the manifest and regenerate.
@@ -0,0 +1,284 @@
1
+ # sqlserver — schema-extract / schema-diff / migrate notes
2
+
3
+ Durable learnings for the three schema actions added to the `sqlserver` tool.
4
+ Code: `tools/sqlserver/schema.py` (engine SQL + migrate engine), the actions in
5
+ `tools/sqlserver/main.py`, the shared pure core in `tools/_lib/dbschema.py`
6
+ (FROZEN — do not edit from the tool). Tests: `tests/test_sqlserver_schema.py`.
7
+
8
+ ## Architecture (where the seams are)
9
+
10
+ - `tools/_lib/dbschema.py` is the **engine-agnostic, pure** core: `mirror_relpath`,
11
+ `write_mirror` (incremental, manifest, `--full`, `--dry-run`), `diff_mirrors`,
12
+ `discover_migrations`, `pending`, `danger_warnings`, `split_go_batches`,
13
+ `sha256_file/_text`. A "record" is `{type, schema, name, definition}` where
14
+ `type` is the **directory label** ("Procedures"/"Functions"/"Views"/"Triggers"/
15
+ "Tables"), NOT the SQL Server type letter.
16
+ - `tools/sqlserver/schema.py` is the only driver-touching half: `extract_objects`,
17
+ the table-DDL generator, and the migrate engine (`ensure_migrations_table`,
18
+ `fetch_applied`, `record_applied`, `apply_migration_sql`).
19
+
20
+ ## extract_objects
21
+
22
+ - Module objects (`P`, `FN`, `IF`, `TF`, `V`, `TR`) come **verbatim** from
23
+ `sys.sql_modules.definition` via a single `LEFT JOIN sys.objects`. Encrypted
24
+ (`WITH ENCRYPTION`) or permission-denied objects return a NULL body — we still
25
+ emit a record, with a `-- NOTE: definition unavailable` placeholder, rather than
26
+ dropping it silently.
27
+ - Bodies are normalised CRLF/CR → LF before hashing/writing. SQL Server returns
28
+ CRLF; without normalising, Windows text-mode writes would double the CR
29
+ (`\r\r\n`) and the manifest sha would never match disk → every run rewrites.
30
+ - Tables (`U`) have no stored CREATE text, so DDL is generated from the catalog
31
+ (sys.columns/identity_columns/computed_columns/default_constraints, key_constraints
32
+ PK, indexes, foreign_keys, check_constraints). Length types convert byte length →
33
+ char count for `n*` types (`max_length // 2`); `-1` → `(MAX)`.
34
+ - **`--types` filters by object FAMILY, not sub-kind.** The on-disk label
35
+ "Functions" maps to {FN, IF, TF}; you cannot ask for only inline TVFs. Asking for
36
+ any one of a family's letters keeps the whole family. Documented in
37
+ `schema._record_letters_wanted`.
38
+
39
+ ## migrate engine
40
+
41
+ - Tracking table `dbo.__schema_migrations` (migration_id PK, filename, sha256,
42
+ applied_at DEFAULT SYSUTCDATETIME(), applied_by DEFAULT SUSER_SNAME(),
43
+ duration_ms, notes). Created idempotently via `IF NOT EXISTS` on first
44
+ `fetch_applied`.
45
+ - `apply_migration_sql` wraps each file in an **explicit** `BEGIN TRANSACTION` /
46
+ `COMMIT` (or `ROLLBACK` for dry-run / on error) because `connection.connect()`
47
+ opens pyodbc with `autocommit=True`. This gives file-level atomicity AND a no-op
48
+ validation mode without adding an autocommit=False connect path.
49
+ - `migrate --mode list` and the whole extract/diff surface are READ-ONLY.
50
+ `--mode apply` is the only writer and REQUIRES `--apply` (UsageError otherwise);
51
+ it refuses on drift (an applied file whose disk sha changed) unless
52
+ `--accept-drift`. Pending applied in numeric order; stop on first error.
53
+
54
+ ## Limitations / deferred (v1)
55
+
56
+ - GO-batch split (`dbschema.split_go_batches`) is line-based: a `GO` alone on a line
57
+ **inside a string literal or block comment** is still treated as a separator.
58
+ Documented; matches the pyodbc-only approach used elsewhere (no go-sqlcmd dependency).
59
+ - Exotic objects NOT extracted yet (port from a sibling extractor
60
+ `DB_ringhel_DeployCenter/tools/extract.py` when needed): CLR assemblies,
61
+ user-defined scalar/table/CLR types, authored schemas (CREATE SCHEMA),
62
+ database-scope DDL triggers (parent_class=0), partitioning/filegroups/XML schema
63
+ collections/full-text, sequences, synonyms, Service Broker, extended properties.
64
+ - No down/rollback migrations — write a new forward migration to reverse.
65
+
66
+ ## Testing
67
+
68
+ - All unit tests use FAKE cursors/connections — no live DB, no pyodbc. The
69
+ `FakeCursor` in `test_sqlserver_schema.py` replays a QUEUE of (description, rows)
70
+ results across `execute()` calls, because `schema._emit_table` reuses one cursor
71
+ for five sequential queries (columns → pk → index → fk → check).
72
+ - `migrate` apply was NEVER run against a live DB during development (spec safety
73
+ rule). Live extract/diff is safe via read-only profiles only.
74
+ - `dispatch` injects `conn_factory`; `schema-diff` is `needs_conn=False` and gets
75
+ the factory passed through specially (it opens its own per-side connections).
76
+
77
+ ## Field learnings (first live migrate run — chatbotai W1, 2026-07-02)
78
+
79
+ - **`THROW` in migration-applied proc bodies needs `;THROW;`** — a THROW following
80
+ `END` (or any unterminated statement) fails the batch with "Incorrect syntax near
81
+ 'THROW'". Always write `;THROW;`, and wrap a bare `IF … THROW` in
82
+ `BEGIN ;THROW; END`.
83
+ - **Apply one file at a time when needed** (e.g. heap→clustered conversions with
84
+ row-count checks between): the runner applies ALL pending in order, but applied
85
+ state is keyed by `migration_id` + sha256 in `dbo.__schema_migrations`, NOT by
86
+ directory — so copy files one-by-one into a staging dir, `migrate --dir <staging>
87
+ --apply` per file, then point back at the real dir; identical files show as
88
+ already applied.
89
+ - **`query` needs `--write` to EXEC even read-only procs** — the read-only guard is
90
+ keyword-based and `EXEC` is on the write list.
91
+ - `migrate` ignores subdirectories and non-`NNNN_*.sql` files inside `--dir`
92
+ (an `evidence/` subfolder and a `W1-REPORT.md` coexist fine; not even listed in
93
+ `skipped_files`).
94
+
95
+ ## Field learnings (multi-database sync, 2026-10)
96
+
97
+ - **`migrate --mode list` and `--dry-run` are not fully read-only:** both create
98
+ `dbo.__schema_migrations` on first contact (via `fetch_applied`). Expect that table
99
+ to appear in every database you only inspected.
100
+ - **`--dry-run` doubles as a behaviour test harness.** Append assertion batches after
101
+ the migration (old-style calls, new parameters, expected rows; `;THROW` on any
102
+ mismatch) and dry-run the combined file: the change plus the proof run in one
103
+ transaction and are rolled back. `query` returns only the first result that has
104
+ columns, so capture procedure output with `INSERT @t EXEC ...` instead of letting
105
+ it print. Prove the assertions are live with a negative control (see below).
106
+ - **An `ALTER COLUMN ... WITH (ONLINE = ON)` must be the first operation of its
107
+ transaction** when the table's clustered index carries a LOB column (`nvarchar(max)`
108
+ etc.); otherwise SQL Server raises error 10635. Since `migrate` wraps a file in one
109
+ transaction, put the online ALTER alone in its own `NNNN_*.sql`, and put any
110
+ `DROP STATISTICS` it needs (a type change fails while column statistics exist) in an
111
+ EARLIER file. The failure is conditional: it only appears where statistics exist on
112
+ the column, so the same file can pass on one database and fail on the next.
113
+ - **Online vs offline size-of-data changes:** widening a column on a ~350k-row table
114
+ took ~220 s ONLINE (table usable throughout) versus ~30-40 s offline under a
115
+ schema-modification lock that blocks every reader, `READ UNCOMMITTED` included.
116
+ On a live table prefer ONLINE, as its own file.
117
+ - **Comparing databases:** compare tables from the catalog (name-independent), not
118
+ from generated DDL, or auto-named constraints (`DF__Tbl__col__1A2B3C`) show up as
119
+ differences. Respect the database collation (a `_CI_` collation makes `Id` and
120
+ `id` the same column), and leave out automatic-tuning indexes (`nci_msft_*`,
121
+ `nci_wi_*`), which are per-database workload artefacts.
122
+
123
+ ## Field learnings (errors after a row count, wide changes on busy tables, 2026-10)
124
+
125
+ - **Every `execute` is drained (`dbquery.drain_results`).** SQL Server sends a batch's
126
+ results in order and pyodbc raises a statement's error only when the cursor reaches it
127
+ with `nextset()`. Before the drain, a statement that failed after one that returned
128
+ "N rows affected" was silently lost: in `migrate`, `XACT_ABORT` rolled the file back on
129
+ the server while the tool committed nothing, reported the file as applied and recorded
130
+ it in `dbo.__schema_migrations`; in a `--dry-run` test, every `;THROW` that followed an
131
+ INSERT never fired, so the test passed whatever the data said. The error surfaces as
132
+ `... (SQLMoreResults)`. A test fake without `nextset()` cannot show this, so the tests
133
+ use a multi-result fake that raises from `nextset()`.
134
+ - **Run a negative control for every assertion file.** Dry-run the assertions without
135
+ the change and require them to fail. That is how the swallowed errors were found: an
136
+ assertion file that passed with and without the change it was meant to prove.
137
+ - **`query --write` returns the first result that has columns**, stepping past
138
+ row-count-only results, so a multi-statement batch without `SET NOCOUNT ON` still
139
+ returns its final SELECT (before, it returned nothing).
140
+ - **`max_length` in `sys.columns` and `sys.parameters` is in bytes**: `nvarchar(100)`
141
+ reports 200. Read it as characters and a too-narrow parameter looks wide enough.
142
+ - **A parameter and an `OPENJSON ... WITH` column cut a longer string without an error**;
143
+ only an INSERT or UPDATE into a narrower column raises (2628, "String or binary data
144
+ would be truncated"). Widen a column together with every parameter, variable and
145
+ OPENJSON column that carries its value, or the value is still cut, silently. Find them
146
+ in `sys.parameters` and by scanning `OBJECT_DEFINITION` for the column's names next to
147
+ a declared length.
148
+ - **Growing a varchar/nvarchar within the same type is a metadata change**, also when
149
+ the column is in nonclustered indexes: a few milliseconds per column on a table with
150
+ about a million rows. A type change (varchar to nvarchar) rewrites every row.
151
+ - **Order a migration so the table lock comes last.** `ALTER TABLE` holds a schema
152
+ lock that blocks every reader, `READ UNCOMMITTED` included, until COMMIT. Put the
153
+ `ALTER PROCEDURE` batches first and the column changes just before the final check:
154
+ the tables are then held for milliseconds, and only callers of the altered procedures
155
+ wait while they recompile.
156
+ - **A dry-run test holds every lock it takes until the rollback.** Calling procedures
157
+ inside it on large tables with a cold cache once held four busy tables for about
158
+ 50 seconds. On large production databases, keep the dry-run to schema assertions and
159
+ run the procedure calls in the post-apply check, which alters nothing and so locks
160
+ only its own test rows. `SET LOCK_TIMEOUT` makes a busy object fail the file fast
161
+ instead of queueing the application behind it; rerun later.
162
+ - **Guard each `ALTER PROCEDURE` with the procedure's `modify_date`** as read when the
163
+ migration was built (`CONVERT(varchar(23), modify_date, 121)`), and `;THROW` if it
164
+ moved: a procedure changed by someone in between is rebuilt from the new text, never
165
+ overwritten.
166
+
167
+ ## Field learnings (deadlocks and catch-all predicates, 2026-10)
168
+
169
+ - **Azure SQL keeps every deadlock graph for about a month**, readable from `master`:
170
+ `SELECT event_data FROM sys.fn_xe_telemetry_blob_target_read_file('dl', NULL, NULL, NULL)`
171
+ (one `xml_deadlock_report` per row, with `database_name`), and per-database counts in
172
+ `master.sys.event_log WHERE event_type = 'deadlock'`. Both lag by tens of minutes. Group the
173
+ graphs by database, then by the statements in `executionStack/frame` (for ad-hoc batches the
174
+ frame is `unknown`: read `inputbuf` and the frame's line number).
175
+ - **`exchangeEvent` + `pagelock` among the resources = an intra-query parallelism deadlock**: the
176
+ threads of ONE parallel scan blocking each other, not two clients. The cure is to stop the
177
+ scan (seekable predicate, index), not to retry or serialize callers.
178
+ - **A catch-all predicate on a variable defeats the index**: `WHERE id = @id AND (@flag = 1 OR
179
+ CUI = @CUI)` cannot seek on `(CUI, id)`, because one cached plan must serve both values of
180
+ `@flag`. Split it into `IF @flag = 1 <statement A> ELSE <statement B>`: each branch gets its
181
+ own seekable plan and the behaviour is identical. Seen as ~20k reads and 0.8 s per call
182
+ dropping to 3-50 reads and 0 ms. The same applies to `(@p IS NULL OR col = @p)` filters.
183
+ - **An nvarchar column compared with a numeric literal is converted, row by row**
184
+ (`CONVERT_IMPLICIT(bigint, col)`), so its index is unusable and the statement scans. Fix it
185
+ at the caller (`= N'123'` or a typed nvarchar parameter). An index on a computed
186
+ `CONVERT(bigint, col)` would match it but makes every non-numeric value fail on insert.
187
+ - **Query Store hints need a stable `query_id`.** An ad-hoc statement with literals gets a new
188
+ `query_id` per value (check `sys.query_store_query_text`), so no hint can target it.
189
+ - **`READ UNCOMMITTED` switches off lock-after-qualification** even when optimized locking and
190
+ RCSI are on: an UPDATE then holds U locks while it qualifies rows, which is what point
191
+ updates of the same pages deadlock against.
192
+ - **Ranking a shared elastic pool:** `master.sys.resource_stats` (5-minute samples, 14 days) per
193
+ database shows who consumes the pool; then Query Store per database
194
+ (`sys.query_store_runtime_stats` x `count_executions`) for the top statements, including
195
+ `count_compiles` and `avg_compile_duration`, which expose procedures that recompile on every
196
+ statistics update.
197
+ - **A range on ISNULL bounds is NOT a reliable fix for a catch-all filter.**
198
+ `id BETWEEN ISNULL(@id, MIN) AND ISNULL(@id, MAX)` returns the right rows, but the cached plan
199
+ is compiled for whichever call came first: compiled for the NULL (batch) case it scans, and every
200
+ single-row call then scans too (seen: ~5k reads became ~25k). Two statements under
201
+ `IF @id IS NOT NULL ... ELSE ...` are the plan-stable form. Measure the deployed plan, not the idea.
202
+ - **Prove an equivalence before shipping a performance change:** run the current object and a
203
+ temporary copy (`CREATE PROCEDURE #name_new ...`, built from the live definition) with the same
204
+ parameters on real data and compare the rows, inside a transaction you roll back when the object
205
+ writes. Rows that differ only because production wrote between the two runs show up as
206
+ "old == old2 == new" on an old/new/old rerun.
207
+ - **`OPTION (RECOMPILE)` on a list query with many optional filters** lets the optimizer drop the
208
+ unused ones (seen: 3.25M -> 84k reads for one page). It costs a compile per call, which on a
209
+ near-empty database can exceed the query itself; worth it only where the data is large.
210
+
211
+ ## Field learnings (index parity across databases that share one code base, 2026-10)
212
+
213
+ - **Azure automatic tuning creates and drops indexes per database** (`CREATE_INDEX` / `DROP_INDEX`
214
+ in `sys.database_automatic_tuning_options`; names `nci_msft_*`, `nci_wi_*`). Databases that run the
215
+ same procedures therefore drift: the same query seeks in one and scans in another. Make every
216
+ index the code relies on an explicit, named index in the reference database and propagate it like
217
+ any other schema change; keep automatic tuning as a source of suggestions.
218
+ - **Adopt instead of rebuilding:** where an automatic-tuning index already has exactly the wanted
219
+ keys and included columns, `EXEC sp_rename 'dbo.T.nci_msft_...', 'IX_...', 'INDEX'` is instant;
220
+ build only where it is missing. Copy the canonical definition from the most-used existing one, so
221
+ the big databases mostly rename.
222
+ - **ONLINE index builds through `migrate`:** one index per file (each file is one transaction, and the
223
+ build's final schema lock is held until COMMIT), `WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY
224
+ (MAX_DURATION = 1 MINUTES, ABORT_AFTER_WAIT = SELF)))` works inside that transaction, and a
225
+ multi-gigabyte build outlasts the profile's 300 s statement timeout: run `main.dispatch("migrate",
226
+ ..., conn_factory=...)` in-process with `statement_timeout: 0` instead of copying the credential
227
+ into a second profile.
228
+ - **A self-check inside a migration must not match its own comments:** a `LIKE '%pattern%'` or an
229
+ occurrence count over `OBJECT_DEFINITION` also sees the header comment the migration added.
230
+ Match the exact old predicate or keep the phrase out of the comment.
231
+
232
+ ## Field learnings (byte-identical modules and type changes across databases, 2026-10)
233
+
234
+ - **`migrate` stores modules with the file's line endings.** It CRLF-normalizes each file, and
235
+ `split_go_batches` now keeps each line's own ending. Before that fix it rejoined lines with "\n",
236
+ so every module deployed through `migrate` was stored LF-only next to CRLF originals, and SSMS
237
+ reported "Inconsistent Line Endings" on script-out. Normalizing an existing module to CRLF is safe
238
+ only when no string literal in it spans lines (check before re-deploying).
239
+ - **Prove text alignment by hash:** `CONVERT(varchar(64), HASHBYTES('SHA2_256', OBJECT_DEFINITION(OBJECT_ID('dbo.X'))), 2)`
240
+ equals the SHA-256 of the canonical text encoded UTF-16LE. SQL Server stores an `ALTER PROCEDURE/FUNCTION`
241
+ back as `CREATE ...`, so the hash of the CREATE text matches after an ALTER. A one-space change fails it.
242
+ - **A function called by a DEFAULT constraint cannot be altered** (error 3729, "Cannot ALTER ... because it
243
+ is being referenced by object 'DF_...'"): drop the default, ALTER the function, re-create the default
244
+ with the same name and definition, all in one transaction.
245
+ - **A type change on a column (varchar -> nvarchar, bigint -> int, nvarchar(max) -> datetime) is blocked
246
+ by the indexes and the DEFAULT on it.** Capture their exact definitions from the catalog, drop them,
247
+ ALTER COLUMN, re-create them; a length-only change of the same type is not blocked by a default.
248
+ Without dependents on a big table, do it ONLINE: one file that drops the column's statistics, a
249
+ second file with the ONLINE ALTER COLUMN alone (first operation of its transaction).
250
+ - **ALTER COLUMN never truncates on a type change:** a value that does not fit the new type (non-numeric
251
+ text to int, bigint above the int range, an unparsable date) stops the statement with an error. Check
252
+ the data first with TRY_CONVERT and fill NULLs from their source column before making it NOT NULL.
253
+ - **Stopping a parallel-scan deadlock from a caller you cannot change.** An ad-hoc statement sent with
254
+ literals (`WHERE message_id = 8641686710` on an nvarchar column) is neither seekable (the column gets
255
+ converted) nor parameterized (`query_parameterization_type_desc = None`, one Query Store query per
256
+ value, same `query_hash`), so a Query Store hint has no stable query_id to attach to. Two plan guides on
257
+ the statement's template do it: `sp_get_query_template` on one sample, then a `TEMPLATE` guide with
258
+ `OPTION (PARAMETERIZATION FORCED)` and a `SQL` guide on the same parameterized text and `@params` with
259
+ `OPTION (MAXDOP 1)`. Serial scans of one plan lock pages in the same order, so concurrent copies block
260
+ briefly instead of deadlocking (`exchangeEvent` + `pagelock` in the graph). Forced parameterization
261
+ types an integer literal in a comparison above the int range as `numeric(38,0)` and a string literal as
262
+ `varchar(8000)`, so the template is stable across values. Verify on the cached `Prepared` plan:
263
+ `PlanGuideName="<sql guide>"` and `NonParallelPlanReason="MaxDOPSetToOne"`; the ad-hoc entry shows
264
+ `TemplatePlanGuideName`. It is a mitigation: the statement still scans until the caller sends a typed
265
+ value, and once it does the guides simply stop matching.
266
+ - **The tracking table follows the same rule.** `dbo.__schema_migrations` is now created with
267
+ `migration_id nvarchar(200)` under `PK___schema_migrations` and `sha256 nchar(64)`. Older copies
268
+ have `varchar(200)` / `char(64)` and a system-named PK (`PK____schema__<hash>`, different in every
269
+ database). Convert them with a migration: drop the PK found in `sys.key_constraints`, ALTER both
270
+ columns, re-add the named PK. `EXEC (...)` only concatenates literals and variables, so build the
271
+ DROP into a variable first (`EXEC (N'...' + QUOTENAME(@pk))` is a syntax error, 102).
272
+ - **Error 689 after an ONLINE ALTER COLUMN:** the online rebuild leaves cleanup work on the table, and an
273
+ OFFLINE change to another column of the same table right after it fails with 689 until the cleanup
274
+ finishes. Order each table's changes offline first, online last, and let the runner wait ~30 s and
275
+ resume (the migration that failed was rolled back and is still pending) if it happens anyway.
276
+ - **A column with a DEFAULT on a busy, large table** (a queue that takes inserts all day): the offline path
277
+ (drop default, ALTER, re-add) holds a schema lock for the whole rewrite, long enough to time out the
278
+ application's 30 s commands. Three files instead: (1) drop the default, guarded by a THROW if the column
279
+ holds NULLs; (2) the ONLINE ALTER COLUMN alone; (3) re-add the default under its canonical name and set
280
+ `col = <default>` WHERE col IS NULL, which catches any row inserted between (1) and (3) without it.
281
+ Only for a NULLable column (a NOT NULL one rejects those inserts while the default is gone); a reader
282
+ that polls for the default value sees those rows only after step (3), a delay of the ALTER's duration.
283
+ The steps depend on each other, so this path cannot be dry-run as a whole: prove it with a real apply on
284
+ a test database that has the same shape before running it on production.
File without changes