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,210 @@
1
+ """The declarative step interpreter: each step type dispatches to the right
2
+ driver call with the right args, and bad steps fail fast as UsageError."""
3
+ from __future__ import annotations
4
+
5
+ import pytest
6
+
7
+ from tools.web.errors import UsageError
8
+ from tools.web.steps import KNOWN_STEPS, run_steps, validate_steps
9
+
10
+
11
+ def test_goto_click_fill_press_wait_dispatch(fake_driver):
12
+ steps = [
13
+ {"do": "goto", "url": "https://x.test"},
14
+ {"do": "wait_for", "selector": "#ready"},
15
+ {"do": "fill", "selector": "#q", "text": "hello"},
16
+ {"do": "click", "selector": "#go"},
17
+ {"do": "press", "key": "Enter"},
18
+ ]
19
+ run_steps(fake_driver, steps)
20
+ assert fake_driver.methods() == [
21
+ "goto", "wait_for", "fill", "click", "press", "current_url",
22
+ ]
23
+ # args carried through correctly
24
+ calls = {m: kw for m, kw in fake_driver.calls}
25
+ assert calls["goto"]["url"] == "https://x.test"
26
+ assert calls["fill"]["selector"] == "#q"
27
+ assert calls["fill"]["text"] == "hello"
28
+ assert calls["press"]["key"] == "Enter"
29
+
30
+
31
+ def test_press_with_selector(fake_driver):
32
+ run_steps(fake_driver, [{"do": "press", "key": "Tab", "selector": "#name"}])
33
+ press = [kw for m, kw in fake_driver.calls if m == "press"][0]
34
+ assert press == {"key": "Tab", "selector": "#name"}
35
+
36
+
37
+ def test_type_step_dispatches_keyboard(fake_driver):
38
+ # No selector -> types into whatever is focused (e.g. a canvas grid cell).
39
+ # With selector -> the element is focused first, then typed into.
40
+ run_steps(fake_driver, [
41
+ {"do": "type", "text": "hello world"},
42
+ {"do": "type", "text": "x", "selector": "#t-name-box", "timeout": 3000},
43
+ ])
44
+ types = [kw for m, kw in fake_driver.calls if m == "type_text"]
45
+ assert types[0] == {"text": "hello world", "selector": None, "timeout": None}
46
+ assert types[1] == {"text": "x", "selector": "#t-name-box", "timeout": 3000}
47
+
48
+
49
+ def test_wait_step_dispatches_fixed_delay(fake_driver):
50
+ run_steps(fake_driver, [{"do": "wait", "ms": 1500}])
51
+ waits = [kw for m, kw in fake_driver.calls if m == "wait"]
52
+ assert waits == [{"ms": 1500}]
53
+
54
+
55
+ def test_type_requires_text():
56
+ with pytest.raises(UsageError) as e:
57
+ validate_steps([{"do": "type", "selector": "#x"}])
58
+ assert "missing required key" in str(e.value)
59
+
60
+
61
+ def test_wait_requires_ms():
62
+ with pytest.raises(UsageError) as e:
63
+ validate_steps([{"do": "wait"}])
64
+ assert "missing required key" in str(e.value)
65
+
66
+
67
+ def test_extract_text_named_and_default_name(fake_driver):
68
+ fake_driver.texts = {"h1": "Big Title", None: "whole body"}
69
+ out = run_steps(fake_driver, [
70
+ {"do": "extract_text", "selector": "h1", "name": "headline"},
71
+ {"do": "extract_text"}, # no selector -> reads body; name falls back to "text"
72
+ ])
73
+ assert out["results"]["headline"] == "Big Title"
74
+ assert out["results"]["text"] == "whole body"
75
+
76
+
77
+ def test_extract_attr_named_and_fallback_name(fake_driver):
78
+ fake_driver.attrs = {("a.cta", "href"): "https://dest"}
79
+ out = run_steps(fake_driver, [
80
+ {"do": "extract_attr", "selector": "a.cta", "attr": "href", "name": "link"},
81
+ {"do": "extract_attr", "selector": "img", "attr": "src"},
82
+ ])
83
+ assert out["results"]["link"] == "https://dest"
84
+ # fallback name is "<selector>@<attr>"
85
+ assert out["results"]["img@src"] == "attr:img:src"
86
+
87
+
88
+ def test_screenshot_collected(fake_driver):
89
+ out = run_steps(fake_driver, [
90
+ {"do": "screenshot", "path": "a.png"},
91
+ {"do": "screenshot", "path": "b.png", "full_page": False},
92
+ ])
93
+ assert out["screenshots"] == ["a.png", "b.png"]
94
+ shots = [kw for m, kw in fake_driver.calls if m == "screenshot"]
95
+ assert shots[1]["full_page"] is False
96
+
97
+
98
+ def test_timeout_passed_through(fake_driver):
99
+ run_steps(fake_driver, [{"do": "wait_for", "selector": "#x", "timeout": 5000}])
100
+ wait = [kw for m, kw in fake_driver.calls if m == "wait_for"][0]
101
+ assert wait["timeout"] == 5000
102
+
103
+
104
+ def test_final_url_included(fake_driver):
105
+ fake_driver.url = "https://x.test/final"
106
+ out = run_steps(fake_driver, [{"do": "goto", "url": "https://x.test"}])
107
+ assert out["final_url"] == "https://x.test/final"
108
+
109
+
110
+ # --- validation / error cases (no driver interaction needed) --------------
111
+
112
+ def test_steps_must_be_list():
113
+ with pytest.raises(UsageError):
114
+ validate_steps({"do": "goto", "url": "x"})
115
+
116
+
117
+ def test_unknown_step_rejected():
118
+ with pytest.raises(UsageError) as e:
119
+ validate_steps([{"do": "teleport", "url": "x"}])
120
+ assert "unknown action" in str(e.value)
121
+
122
+
123
+ def test_missing_required_key_rejected():
124
+ with pytest.raises(UsageError) as e:
125
+ validate_steps([{"do": "fill", "selector": "#q"}]) # missing text
126
+ assert "missing required key" in str(e.value)
127
+
128
+
129
+ def test_unknown_key_rejected():
130
+ with pytest.raises(UsageError) as e:
131
+ validate_steps([{"do": "goto", "url": "x", "bogus": 1}])
132
+ assert "unknown key" in str(e.value)
133
+
134
+
135
+ def test_missing_do_rejected():
136
+ with pytest.raises(UsageError):
137
+ validate_steps([{"url": "x"}])
138
+
139
+
140
+ def test_non_object_step_rejected():
141
+ with pytest.raises(UsageError):
142
+ validate_steps(["just a string"])
143
+
144
+
145
+ def test_validation_happens_before_any_driver_call(fake_driver):
146
+ # A later bad step must abort the whole run before the good first step runs.
147
+ with pytest.raises(UsageError):
148
+ run_steps(fake_driver, [
149
+ {"do": "goto", "url": "https://x.test"},
150
+ {"do": "nope"},
151
+ ])
152
+ assert fake_driver.calls == [] # nothing executed
153
+
154
+
155
+ def test_known_steps_constant_matches_schema():
156
+ assert KNOWN_STEPS == {
157
+ "goto", "click", "fill", "press", "type", "wait", "wait_for",
158
+ "extract_text", "extract_attr", "eval", "viewport", "screenshot",
159
+ "upload", "upload_via_chooser",
160
+ }
161
+
162
+
163
+ def test_upload_dispatches_set_input_files(fake_driver):
164
+ run_steps(fake_driver, [
165
+ {"do": "upload", "selector": "#avatar", "path": "C:/pics/me.jpg"},
166
+ {"do": "upload", "selector": "#docs", "path": ["a.pdf", "b.pdf"], "timeout": 9000},
167
+ ])
168
+ calls = [kw for m, kw in fake_driver.calls if m == "set_input_files"]
169
+ assert calls[0] == {"selector": "#avatar", "files": "C:/pics/me.jpg", "timeout": None}
170
+ assert calls[1] == {"selector": "#docs", "files": ["a.pdf", "b.pdf"], "timeout": 9000}
171
+
172
+
173
+ def test_upload_via_chooser_dispatches(fake_driver):
174
+ run_steps(fake_driver, [
175
+ {"do": "upload_via_chooser", "selector": "button.attach", "path": "note.png"},
176
+ ])
177
+ call = [kw for m, kw in fake_driver.calls if m == "set_files_via_chooser"][0]
178
+ assert call == {"selector": "button.attach", "files": "note.png", "timeout": None}
179
+
180
+
181
+ def test_upload_requires_selector_and_path():
182
+ with pytest.raises(UsageError) as e:
183
+ validate_steps([{"do": "upload", "selector": "#f"}]) # missing path
184
+ assert "missing required key" in str(e.value)
185
+
186
+
187
+ def test_click_defaults_to_the_actionability_check(fake_driver):
188
+ run_steps(fake_driver, [{"do": "click", "selector": "button.save"}])
189
+ assert ("click", {"selector": "button.save", "timeout": None,
190
+ "force": False}) in fake_driver.calls
191
+
192
+
193
+ def test_click_can_be_forced_through_an_overlay(fake_driver):
194
+ """Some frameworks paint a container over their own controls; without this
195
+ the click is refused even though a person can press the control."""
196
+ run_steps(fake_driver, [{"do": "click", "selector": "button.save", "force": True}])
197
+ assert ("click", {"selector": "button.save", "timeout": None,
198
+ "force": True}) in fake_driver.calls
199
+
200
+
201
+ def test_viewport_step_dispatches_resize(fake_driver):
202
+ run_steps(fake_driver, [{"do": "viewport", "width": 1920, "height": 1080}])
203
+ sizes = [kw for m, kw in fake_driver.calls if m == "set_viewport"]
204
+ assert sizes == [{"width": 1920, "height": 1080}]
205
+
206
+
207
+ def test_viewport_requires_width_and_height():
208
+ with pytest.raises(UsageError) as e:
209
+ validate_steps([{"do": "viewport", "width": 1920}])
210
+ assert "missing required key" in str(e.value)
@@ -0,0 +1,184 @@
1
+ name: web
2
+ description: >
3
+ Drive web apps that have NO API via Playwright, reusing SAVED login sessions
4
+ so we authenticate once and reuse. Sessions are Playwright storageState
5
+ (cookies + localStorage) per named site, stored gitignored under
6
+ tools/web/sessions/<name>.json - they hold live auth and are SENSITIVE
7
+ (never committed, never printed). Other tools and the outreach agent call
8
+ this whenever they need to connect to a site or do deeper web research.
9
+ Action-dispatched. No HTTP API; a BrowserDriver abstraction wraps Playwright
10
+ (imported lazily) so the tool loads even before browsers are installed.
11
+ BROKER-OWNED SESSIONS: run/get-text/screenshot against a session owned by a
12
+ serializing broker (whatsapp/ryver/fgo/mirro - tools/_lib/webserialize) are
13
+ executed INSIDE that broker, serialized with the owning tool's commands, so
14
+ ad-hoc web commands can't race the profile. --direct bypasses (backup).
15
+ save-session/delete-session auto-stop the owning broker first.
16
+ version: 0.2.0
17
+ runtime: python
18
+ entrypoint: main.py
19
+
20
+ # No credentials in Credential Manager: auth lives in saved session files
21
+ # (storageState) under tools/web/sessions/, which are gitignored.
22
+ secrets: []
23
+
24
+ routing:
25
+ triggers:
26
+ - "drive/scrape a website that has no API, using a saved login session; deeper web research"
27
+ primary_action: run
28
+ example: "web run --session <name> ... (read text: web get-text; one-time login: web save-session)"
29
+
30
+ actions:
31
+ - name: save-session
32
+ description: >
33
+ Interactively capture a login session. Launches a HEADED browser at --url,
34
+ lets the human log in, then captures storageState to
35
+ tools/web/sessions/<name>.json. Run once per site. By default it BLOCKS
36
+ until ENTER is pressed on stdin; an AGENT must instead pass --wait-seconds,
37
+ because agent stdin is EOF and the ENTER wait would return instantly and
38
+ save a half-authenticated profile.
39
+ args:
40
+ - {name: name, type: string, required: true, description: "Session name (letters/digits/._-); how you reference it later"}
41
+ - {name: url, type: string, required: true, description: Login URL to open in the headed browser}
42
+ - {name: channel, type: string, description: "Optional Chromium channel: 'chrome' or 'msedge' (use a real installed browser)"}
43
+ - {name: persistent, type: boolean, description: "Save a PERSISTENT browser profile (user-data-dir) instead of a storageState snapshot; required for IndexedDB-auth sites like WhatsApp Web"}
44
+ - {name: wait-seconds, type: integer, description: "Wait this long for the login instead of blocking on ENTER; required when an agent launches the flow"}
45
+ - {name: wait-until-url-excludes, type: string, description: "With --wait-seconds, finish as soon as the address bar leaves this host (e.g. accounts.google.com)"}
46
+ output_schema: '{ "session": "...", "path": "tools/web/sessions/<name>.json", "url": "...", "waited_for": "enter|timer|url", "login_detected": true }'
47
+
48
+ - name: list-sessions
49
+ description: List saved sessions (names + metadata only, never contents).
50
+ output_schema: '{ "sessions": [ {name, bytes, modified, persistent} ], "count": 0, "dir": "..." }'
51
+
52
+ - name: delete-session
53
+ description: >
54
+ Delete ALL of a saved session's artifacts - the storageState file, the
55
+ persistent <name>.profile/ directory, and the <name>.cookies.json sidecar.
56
+ Deleting a session destroys a login that only a human at a browser can
57
+ re-establish, so this PREVIEWS by default and removes nothing unless
58
+ --confirm is passed (the unconfirmed call is the dry run).
59
+ args:
60
+ - {name: name, type: string, required: true, description: Session name to delete}
61
+ - {name: confirm, type: boolean, description: "Actually delete; without it the call only previews would_remove"}
62
+ output_schema: '{ "session": "...", "deleted": true, "existed": true, "removed": ["state","profile","cookies"], "would_remove": ["..."], "confirmation_required": true, "failed": {}, "broker_stopped": "..." }'
63
+
64
+ - name: run
65
+ description: >
66
+ Load a saved session, optionally navigate to --url, then execute a
67
+ declarative step list (--actions JSON array or --actions-file). Returns
68
+ collected outputs. Step schema (each step has a "do"):
69
+ goto{url,timeout?} | click{selector,timeout?,force?} | fill{selector,text,timeout?} |
70
+ press{key,selector?} | type{text,selector?,timeout?} | wait{ms} |
71
+ wait_for{selector,timeout?} | extract_text{selector?,name,timeout?} |
72
+ extract_attr{selector,attr,name,timeout?} | viewport{width,height} |
73
+ screenshot{path,full_page?}.
74
+ 'type' drives real keyboard events (canvas grids like Google Sheets where
75
+ cells aren't DOM); 'wait' is a fixed ms delay (autosave settle).
76
+ Headless by default; --headed to watch. --hold-seconds keeps a headed
77
+ browser open after the steps so a HUMAN can review what was staged and
78
+ click the irreversible control (Submit/Confirm/Send) themselves; an
79
+ expired hold is still a successful run.
80
+ args:
81
+ - {name: session, type: string, required: true, description: Saved session name to load}
82
+ - {name: url, type: string, description: Optional URL to visit before running the steps}
83
+ - {name: actions, type: string, description: "Inline JSON array of steps"}
84
+ - {name: actions-file, type: string, description: "Path to a JSON file containing the steps array"}
85
+ - {name: headed, type: boolean, default: false, description: "Show the browser window (default headless)"}
86
+ - {name: channel, type: string, description: "Chromium channel: 'chrome' or 'msedge'"}
87
+ - {name: hold-seconds, type: integer, description: "After the last step keep the headed browser open up to N seconds for a human to finish the action; requires headed"}
88
+ - {name: hold-until-selector, type: string, description: "End the hold early once this selector appears; requires hold-seconds"}
89
+ - {name: hold-until-url-excludes, type: string, description: "End the hold early once the address bar leaves this host; requires hold-seconds"}
90
+ - {name: direct, type: boolean, default: false, description: "Bypass the owning tool serializing broker and drive the browser in-process (backup; only safe when that broker is stopped)"}
91
+ output_schema: '{ "session": "...", "results": {"name": "value"}, "screenshots": ["..."], "final_url": "...", "hold": {"held_seconds": 0, "completed": false, "reason": "selector|url|timeout"} }'
92
+
93
+ - name: get-text
94
+ description: "Convenience: load a session, open --url, return visible text (whole page or --selector). For lead/topic research."
95
+ args:
96
+ - {name: session, type: string, required: true, description: Saved session name to load}
97
+ - {name: url, type: string, required: true, description: URL to navigate to}
98
+ - {name: selector, type: string, description: Optional CSS selector; default reads the whole page body}
99
+ - {name: wait, type: string, description: Optional selector to await before reading (for SPAs)}
100
+ - {name: headed, type: boolean, default: false, description: Show the browser window}
101
+ - {name: channel, type: string, description: "Chromium channel: 'chrome' or 'msedge'"}
102
+ - {name: direct, type: boolean, default: false, description: "Bypass the owning tool serializing broker and drive the browser in-process (backup; only safe when that broker is stopped)"}
103
+ output_schema: '{ "session": "...", "url": "...", "selector": null, "text": "...", "final_url": "..." }'
104
+
105
+ - name: screenshot
106
+ description: "Load a session, open --url, save a screenshot to --out."
107
+ args:
108
+ - {name: session, type: string, required: true, description: Saved session name to load}
109
+ - {name: url, type: string, required: true, description: URL to capture}
110
+ - {name: out, type: string, required: true, description: "Output image path (.png)"}
111
+ - {name: viewport-only, type: boolean, default: false, description: "Capture only the viewport (default: full page)"}
112
+ - {name: wait, type: string, description: Optional selector to await first}
113
+ - {name: headed, type: boolean, default: false, description: Show the browser window}
114
+ - {name: channel, type: string, description: "Chromium channel: 'chrome' or 'msedge'"}
115
+ - {name: direct, type: boolean, default: false, description: "Bypass the owning tool serializing broker and drive the browser in-process (backup; only safe when that broker is stopped)"}
116
+ output_schema: '{ "session": "...", "url": "...", "path": "...", "final_url": "..." }'
117
+
118
+ - name: archive-document
119
+ description: >
120
+ Capture a published document (web page or PDF) as a reviewable evidence set:
121
+ the ORIGINAL response bytes untouched, a self-contained HTML rendering with
122
+ stylesheets inlined so it opens offline with its layout, and a text
123
+ extraction for searching and quoting. Every readable artefact carries a
124
+ provenance header (title, the date the document states about itself, source
125
+ URL, fetch timestamp, sha256 of the original) so a later capture can be
126
+ compared against it. Unauthenticated fetch only - a login-gated document is
127
+ recorded as unreachable, never substituted with a summary.
128
+ args:
129
+ - {name: url, type: string, description: "URL of the document to capture (exactly one of --url/--file)"}
130
+ - {name: file, type: string, description: "Local file to archive instead of fetching (an already-downloaded original)"}
131
+ - {name: source-url, type: string, description: "With --file: the URL the file came from, recorded in the header"}
132
+ - {name: out-dir, type: string, required: true, description: "Base directory; a subfolder named --name is created inside it"}
133
+ - {name: name, type: string, required: true, description: "Folder and file basename for the document (a slug, not a URL)"}
134
+ - {name: title, type: string, description: "Published title override; default reads <title>/<h1>"}
135
+ - {name: timeout, type: integer, default: 60, description: "Per-request timeout in seconds"}
136
+ - {name: no-self-contained, type: boolean, default: false, description: "Skip the stylesheet-inlined copy (original + extraction only)"}
137
+ output_schema: '{ "name": "...", "dir": "...", "url": "...", "final_url": "...", "status": 200, "kind": "html|pdf", "title": "...", "fetched_at": "...", "bytes": 0, "stylesheets_inlined": 0, "chars_extracted": 0, "document_date_candidates": [{"date": "...", "context": "..."}], "files": {"original": "...", "self_contained": "...", "extraction": "..."}, "sha256": {"original": "...", "self_contained": "...", "extraction": "..."} }'
138
+
139
+ - name: page-contacts
140
+ description: >
141
+ The contact details a PUBLIC page publishes, read with one plain HTTP GET (no
142
+ browser, no session, nothing clicked): emails from mailto links and visible
143
+ text (including "name [at] domain [dot] com"), profile links grouped by
144
+ platform (linkedin, x, youtube, instagram, ...), link-in-bio pages, and
145
+ affiliate-shaped links. Meant for link-in-bio pages and personal sites. A
146
+ 4xx/5xx page returns reachable=false instead of an error.
147
+ args:
148
+ - {name: url, type: string, required: true, description: "Public page to read (link-in-bio, personal site)"}
149
+ - {name: timeout, type: integer, default: 20, description: "Request timeout in seconds"}
150
+ output_schema: '{ "url": "...", "final_url": "...", "status": 200, "content_type": "...", "reachable": true, "title": "...", "emails": ["..."], "links": {"linkedin": [], "x": [], "website": [], "link_in_bio": [], "...": []}, "affiliate_links": [ {url, host, network, program, param} ] }'
151
+
152
+ - name: render-pdf
153
+ description: "Render an HTML string/file to a PDF (session-less, headless Chromium page.pdf)."
154
+ args:
155
+ - {name: html, type: string, description: "Inline HTML string to render (exactly one of --html / --html-file)"}
156
+ - {name: html-file, type: string, description: "Path to an HTML file to render"}
157
+ - {name: out, type: string, required: true, description: "Output PDF path (.pdf)"}
158
+ - {name: format, type: string, default: A4, description: "Paper size: A4 (default) / Letter / Legal"}
159
+ - {name: width, type: string, description: "Custom page width as a CSS length, e.g. 1000mm (needs --height; overrides --format) - large-format print such as a roll-up or poster"}
160
+ - {name: height, type: string, description: "Custom page height as a CSS length, e.g. 2000mm (needs --width)"}
161
+ - {name: margin, type: string, description: "One CSS length for all four margins; 0 for full-bleed artwork. Default keeps the document margins (12/14/12/12 mm)"}
162
+ output_schema: '{ "out": "...", "bytes": 12345 }'
163
+
164
+ examples:
165
+ - cmd: python scripts/run-tool.py web save-session --name linkedin --url https://www.linkedin.com/login
166
+ output: '{"session": "linkedin", "path": ".../tools/web/sessions/linkedin.json", "url": "https://www.linkedin.com/login"}'
167
+ - cmd: 'python scripts/run-tool.py web archive-document --url https://example.com/terms --out-dir documentation/legal/existing --name terms'
168
+ output: '{"name": "terms", "dir": "...", "kind": "html", "title": "Terms", "sha256": {"original": "..."}, "files": {"original": "...", "self_contained": "...", "extraction": "..."}}'
169
+ - cmd: python scripts/run-tool.py web list-sessions
170
+ output: '{"sessions": [{"name": "linkedin", "bytes": 4096, "modified": "2026-06-22T09:00:00"}], "count": 1, "dir": "..."}'
171
+ - cmd: 'python scripts/run-tool.py web get-text --session linkedin --url https://www.linkedin.com/in/someone --selector main'
172
+ output: '{"session": "linkedin", "url": "...", "selector": "main", "text": "...", "final_url": "..."}'
173
+ - cmd: 'python scripts/run-tool.py web run --session linkedin --actions "[{\"do\":\"goto\",\"url\":\"https://www.linkedin.com/feed\"},{\"do\":\"extract_text\",\"selector\":\"h1\",\"name\":\"headline\"}]"'
174
+ output: '{"session": "linkedin", "results": {"headline": "..."}, "screenshots": [], "final_url": "..."}'
175
+
176
+ requires:
177
+ - name: playwright-chromium
178
+ kind: browser
179
+ why: >
180
+ every action that opens a browser. `uv sync` installs the Playwright PACKAGE,
181
+ not the browser binary - and Playwright is imported lazily, so the tool loads
182
+ and the tests pass while the first real action fails with browser_error.
183
+ check: '{python} -c "from playwright.sync_api import sync_playwright; p=sync_playwright().start(); p.chromium.executable_path; p.stop()"'
184
+ install: uv run playwright install chromium
@@ -0,0 +1,34 @@
1
+ # xlsx
2
+
3
+ Read local Excel (`.xlsx` / `.xlsm`) workbooks. No credentials — operates on
4
+ local files. Built from a one-off script per the "scripts become tools"
5
+ directive, so reading Excel files is now a reusable, registered capability.
6
+
7
+ Native Google Sheets are read with the **google-sheets** tool; this tool is for
8
+ `.xlsx` blobs (e.g. files downloaded from Drive with `google-drive download-file`).
9
+
10
+ ## Actions
11
+
12
+ ```powershell
13
+ # List sheets + dimensions
14
+ python scripts/run-tool.py xlsx list-sheets --path "C:\path\book.xlsx"
15
+
16
+ # Read one sheet as a JSON 2D array (empty rows skipped, trailing blanks trimmed)
17
+ python scripts/run-tool.py xlsx read-sheet --path "C:\path\book.xlsx" --sheet "Data" --max-results 100
18
+
19
+ # Dump the whole workbook to readable text
20
+ python scripts/run-tool.py xlsx dump --path "C:\path\book.xlsx" --save out.txt
21
+ ```
22
+
23
+ ## Typical pipeline (Drive .xlsx -> read)
24
+
25
+ ```powershell
26
+ python scripts/run-tool.py google-drive download-file --file-id <ID> --save book.xlsx
27
+ python scripts/run-tool.py xlsx dump --path book.xlsx --save book.txt
28
+ ```
29
+
30
+ ## Notes
31
+ - Cell values are JSON-safe; dates/times come back as ISO strings.
32
+ - UTF-8 throughout (Romanian diacritics etc. are preserved).
33
+ - `read-sheet` returns `{sheet, rows, truncated}`; `truncated` is true when
34
+ `--max-results` capped the output.
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: xlsx
3
+ description: Read local Excel (.xlsx/.xlsm) workbooks - list sheets, read a sheet as JSON, or dump the whole file to text. No credentials.
4
+ ---
5
+
6
+ # xlsx
7
+
8
+ Read local Excel (.xlsx/.xlsm) workbooks - list sheets, read a sheet as JSON, or dump the whole file to text. No credentials.
9
+
10
+ ## How to call it
11
+
12
+ ```bash
13
+ python scripts/run-tool.py xlsx <action> [--args]
14
+ ```
15
+
16
+ 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.
17
+
18
+ ## Actions
19
+
20
+ | action | required args | what it does |
21
+ |---|---|---|
22
+ | `dump` | `--path` | Dump the whole workbook to readable pipe-delimited text. |
23
+ | `list-sheets` | `--path` | List a workbook's sheets with row/column counts. |
24
+ | `read-sheet` | `--path` | Read one sheet's rows as a JSON 2D array (trailing-empty cells trimmed, empty rows skipped). |
25
+
26
+ ---
27
+
28
+ Generated from `tools/xlsx/tool.yaml` by `scripts/build-tool-skill.py`. Do not edit by hand — change the manifest and regenerate.
File without changes
@@ -0,0 +1,129 @@
1
+ """xlsx tool entrypoint - read local Excel (.xlsx/.xlsm) files. Action-dispatched.
2
+
3
+ No credentials (local files only). Built from the original ad-hoc dump_xlsx.py,
4
+ per the "scripts become tools" directive.
5
+
6
+ Actions:
7
+ list-sheets --path <f>
8
+ read-sheet --path <f> [--sheet NAME] [--max-rows N] [--raw]
9
+ dump --path <f> [--save OUT.txt] [--max-rows N]
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import argparse
14
+ import sys
15
+ from dataclasses import dataclass
16
+ from pathlib import Path
17
+ from typing import Callable
18
+
19
+ TOOL_ROOT = Path(__file__).resolve().parent
20
+ FRAMEWORK_ROOT = TOOL_ROOT.parents[1]
21
+ _VENV_PY = FRAMEWORK_ROOT / ".venv" / "Scripts" / "python.exe"
22
+ if _VENV_PY.exists() and Path(sys.executable).resolve() != _VENV_PY.resolve():
23
+ import subprocess
24
+ sys.exit(subprocess.run([str(_VENV_PY), __file__, *sys.argv[1:]]).returncode)
25
+
26
+ if str(FRAMEWORK_ROOT) not in sys.path:
27
+ sys.path.insert(0, str(FRAMEWORK_ROOT))
28
+
29
+ from tools._lib.io import emit, fail # noqa: E402
30
+ from tools.xlsx import reader # noqa: E402
31
+
32
+
33
+ class UsageError(Exception):
34
+ """Bad/invalid arguments -> invalid_argument, exit 2."""
35
+
36
+
37
+ class _Parser(argparse.ArgumentParser):
38
+ def error(self, message: str):
39
+ raise UsageError(message)
40
+
41
+
42
+ @dataclass
43
+ class ActionDef:
44
+ func: Callable
45
+ add_args: Callable[[argparse.ArgumentParser], None]
46
+ description: str = ""
47
+
48
+
49
+ def _list_sheets(args) -> dict:
50
+ return {"path": args.path, "sheets": reader.list_sheets(args.path)}
51
+
52
+
53
+ def _read_sheet(args) -> dict:
54
+ return reader.read_sheet(args.path, args.sheet, max_rows=args.max_results)
55
+
56
+
57
+ def _dump(args) -> dict:
58
+ text = reader.dump_text(args.path, max_rows=args.max_results)
59
+ if args.save:
60
+ out = Path(args.save).resolve()
61
+ out.parent.mkdir(parents=True, exist_ok=True)
62
+ out.write_text(text, encoding="utf-8")
63
+ return {"savedTo": str(out), "characters": len(text)}
64
+ return {"text": text, "characters": len(text)}
65
+
66
+
67
+ def _path_arg(p):
68
+ p.add_argument("--path", required=True, help="Local .xlsx/.xlsm file")
69
+
70
+
71
+ def _read_args(p):
72
+ _path_arg(p)
73
+ p.add_argument("--sheet", help="Sheet name (default: first/active)")
74
+ p.add_argument("--max-results", type=int, help="Cap rows returned")
75
+
76
+
77
+ def _dump_args(p):
78
+ _path_arg(p)
79
+ p.add_argument("--save", help="Write text dump here instead of inline")
80
+ p.add_argument("--max-results", type=int, help="Cap rows per sheet")
81
+
82
+
83
+ ACTIONS = {
84
+ "list-sheets": ActionDef(_list_sheets, _path_arg,
85
+ "List a workbook's sheets with row/column counts."),
86
+ "read-sheet": ActionDef(_read_sheet, _read_args,
87
+ "Read one sheet's rows as a JSON 2D array."),
88
+ "dump": ActionDef(_dump, _dump_args,
89
+ "Dump the whole workbook to readable text (--save or inline)."),
90
+ }
91
+
92
+
93
+ def dispatch(action: str, argv: list[str]) -> dict:
94
+ if action not in ACTIONS:
95
+ raise UsageError(f"unknown action: {action}. Known: {', '.join(sorted(ACTIONS))}")
96
+ defn = ACTIONS[action]
97
+ parser = _Parser(prog=f"xlsx {action}", description=defn.description)
98
+ defn.add_args(parser)
99
+ return defn.func(parser.parse_args(argv))
100
+
101
+
102
+ def _classify(exc: Exception):
103
+ if isinstance(exc, UsageError):
104
+ return "invalid_argument", str(exc), 2
105
+ if isinstance(exc, FileNotFoundError):
106
+ return "not_found", str(exc), 1
107
+ if isinstance(exc, ValueError):
108
+ return "invalid_argument", str(exc), 2
109
+ return "error", str(exc) or exc.__class__.__name__, 1
110
+
111
+
112
+ def main(argv=None) -> None:
113
+ argv = list(sys.argv[1:] if argv is None else argv)
114
+ if not argv or argv[0] in ("-h", "--help"):
115
+ print("Actions:", file=sys.stderr)
116
+ for name in sorted(ACTIONS):
117
+ print(f" {name:<14} {ACTIONS[name].description}", file=sys.stderr)
118
+ sys.exit(0)
119
+ action, rest = argv[0], argv[1:]
120
+ try:
121
+ result = dispatch(action, rest)
122
+ except Exception as exc: # noqa: BLE001
123
+ code, message, exit_code = _classify(exc)
124
+ fail(code, message, {}, exit_code)
125
+ emit(result)
126
+
127
+
128
+ if __name__ == "__main__":
129
+ main()