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,70 @@
1
+ """Static instruction contracts, not evidence of model behavioral improvement."""
2
+ from pathlib import Path
3
+
4
+ import pytest
5
+
6
+ ROOT = Path(__file__).resolve().parents[2]
7
+
8
+
9
+ def text(skill, resource="SKILL.md"):
10
+ return " ".join((ROOT / "skills" / skill / resource).read_text(encoding="utf-8").split())
11
+
12
+
13
+ @pytest.mark.parametrize("skill", ["procesio-cli", "sql-server-optimizer"])
14
+ def test_skill_authoring_handoff_has_one_owner(skill):
15
+ body = text(skill).split("## Boundary", 1)[1].split("## ", 1)[0]
16
+ assert "`agent-skill-engineer`" in body
17
+ assert "`procesio-cli-maintainer`" in body
18
+
19
+
20
+ def test_operational_verification_does_not_grant_execution_permission():
21
+ body = text("procesio-cli")
22
+ contract = text("procesio-cli", "references/operation-contract.md")
23
+ assert "Verification is not additional execution permission" in body
24
+ assert "CLI and MCP" in contract
25
+ assert "explicit operator approval" in contract
26
+ assert "Run, test, submit, enable, and trigger" in contract
27
+ assert "Unknown outcome" in contract
28
+
29
+
30
+ def test_credential_recovery_does_not_restore_exposed_keys_or_probe_forbidden_targets():
31
+ contract = text("procesio-cli", "references/credentials-admin.md")
32
+ assert "Never restore a disclosed or revoked credential" in contract
33
+ assert "preserve the incident" in contract
34
+ assert "Never probe a forbidden workspace" in contract
35
+ assert "separately approved" in contract
36
+
37
+
38
+ def test_sql_actual_plans_and_deployment_require_bounded_approval():
39
+ body = text("sql-server-optimizer")
40
+ context = text("sql-server-optimizer", "references/db-context.md")
41
+ assert "Tuning permission is not deployment permission" in body
42
+ assert "An actual execution plan executes the statement" in context
43
+ assert "ROLLBACK" in context
44
+ assert "unknown outcome" in context
45
+ assert "explicit approval" in context
46
+
47
+
48
+ def test_advisor_distinguishes_occupied_capacity_from_ee_count():
49
+ sizing = text("procesio-platform-advisor", "references/sizing-method.md")
50
+ assert "mean_occupied_seconds" in sizing
51
+ assert "verified_slots_per_EE" in sizing
52
+ assert "steady-state" in sizing
53
+ assert "not a peak or SLA guarantee" in sizing
54
+ assert "do not invent an EE count" in sizing
55
+
56
+
57
+ def test_advisor_missing_sources_stays_provisional_and_non_mutating():
58
+ body = text("procesio-platform-advisor")
59
+ assert "If current sources are unavailable" in body
60
+ assert "provisional" in body
61
+ assert "separately approved operational handoff" in body
62
+
63
+
64
+ def test_maintainer_covers_secret_bearing_reads_and_scoped_release_evidence():
65
+ contract = text("procesio-cli-maintainer", "references/change-contract.md")
66
+ integration = text("procesio-cli-maintainer", "references/skill-authoring.md")
67
+ assert "secret-bearing reads" in contract
68
+ assert "redacted projection" in contract
69
+ assert "reference or helper" in integration
70
+ assert "evaluated package fingerprint" in integration
@@ -0,0 +1,204 @@
1
+ """Release claims must bind to bytes, not merely green ledger labels."""
2
+ from __future__ import annotations
3
+
4
+ import hashlib
5
+ import subprocess
6
+ import sys
7
+ from pathlib import Path, PurePosixPath
8
+
9
+ import pytest
10
+
11
+ ROOT = Path(__file__).resolve().parents[2]
12
+ if str(ROOT) not in sys.path:
13
+ sys.path.insert(0, str(ROOT))
14
+
15
+ from tools._lib.skill_release import check_release_binding
16
+
17
+
18
+ def git(root, *args):
19
+ return subprocess.check_output(["git", "-C", str(root), *args])
20
+
21
+
22
+ @pytest.fixture
23
+ def snapshot(tmp_path):
24
+ git(tmp_path, "init", "-q")
25
+ package = tmp_path / "skills" / "demo"
26
+ (package / "references").mkdir(parents=True)
27
+ (tmp_path / "skills" / "evals").mkdir()
28
+ for name, value in {
29
+ "demo/SKILL.md": "---\nname: demo\n---\n# Demo\n",
30
+ "demo/references/rule.md": "Original rule\n",
31
+ "evals/behavioral.json": "{}\n",
32
+ "evals/gate5-thresholds.json": "{}\n",
33
+ "evals/gates.json": "{}\n",
34
+ }.items():
35
+ # write_bytes, not write_text: on Windows write_text translates \n to
36
+ # \r\n, but git (autocrlf) stores an LF blob, so the working tree would
37
+ # then diverge from the committed bytes skill_release digests. The Linux
38
+ # author's write_text already yields LF; this keeps parity cross-platform.
39
+ (tmp_path / "skills" / name).write_bytes(value.encode("utf-8"))
40
+ git(tmp_path, "add", "skills")
41
+ git(tmp_path, "-c", "user.name=Test", "-c", "user.email=test@example.com",
42
+ "commit", "-qm", "fixture")
43
+ commit = git(tmp_path, "rev-parse", "HEAD").decode().strip()
44
+ # Order by PurePosixPath, matching skill_release._digest (and the Linux
45
+ # series launcher that produced the committed fingerprints). sorted(Path.rglob)
46
+ # is platform-dependent: WindowsPath sorts case-insensitively, so a mixed-case
47
+ # name like SKILL.md lands in a different slot and the digest diverges from the
48
+ # canonical one on Windows.
49
+ contents = {p.relative_to(tmp_path / "skills").as_posix(): p.read_bytes()
50
+ for p in (tmp_path / "skills").rglob("*") if p.is_file()}
51
+ digest = hashlib.sha256()
52
+ for name in sorted(contents, key=PurePosixPath):
53
+ digest.update(name.encode("utf-8") + b"\0" + contents[name] + b"\0")
54
+ return tmp_path, commit, digest.hexdigest()
55
+
56
+
57
+ def check(snapshot):
58
+ root, commit, fingerprint = snapshot
59
+ return check_release_binding(root, root / "skills", commit, fingerprint)
60
+
61
+
62
+ def test_crlf_working_tree_matches_an_lf_fingerprint(snapshot):
63
+ # SVN materialises CRLF where the fingerprint was recorded over LF bytes; the
64
+ # gate normalises newlines, so an SVN checkout is not read as tampering.
65
+ root, commit, fingerprint = snapshot
66
+ for p in (root / "skills").rglob("*"):
67
+ if p.is_file() and p.suffix in {".md", ".json"}:
68
+ p.write_bytes(p.read_bytes().replace(b"\n", b"\r\n"))
69
+ assert check_release_binding(root, root / "skills", commit, fingerprint) == []
70
+
71
+
72
+ def test_matching_package_and_full_snapshot_pass(snapshot):
73
+ assert check(snapshot) == []
74
+
75
+
76
+ @pytest.mark.parametrize("relative", ["demo/SKILL.md", "demo/references/rule.md",
77
+ "evals/behavioral.json", "evals/gate5-thresholds.json"])
78
+ def test_dirty_loaded_or_experiment_bytes_fail(snapshot, relative):
79
+ (snapshot[0] / "skills" / relative).write_text("changed", encoding="utf-8")
80
+ assert "release-content-drift" in {row["code"] for row in check(snapshot)}
81
+
82
+
83
+ def test_added_and_deleted_package_resources_fail(snapshot):
84
+ root = snapshot[0] / "skills" / "demo"
85
+ (root / "references" / "rule.md").unlink()
86
+ (root / "references" / "new.md").write_text("new")
87
+ assert "release-content-drift" in {row["code"] for row in check(snapshot)}
88
+
89
+
90
+ def test_new_package_cannot_hide_outside_evaluated_inventory(snapshot):
91
+ package = snapshot[0] / "skills" / "another"
92
+ package.mkdir()
93
+ (package / "SKILL.md").write_text("another")
94
+ assert "release-content-drift" in {row["code"] for row in check(snapshot)}
95
+
96
+
97
+ def test_ledger_update_does_not_poison_loaded_package_binding(snapshot):
98
+ root = snapshot[0] / "skills"
99
+ (root / "evals" / "gates.json").write_text('{"new_evidence": true}')
100
+ assert check(snapshot) == []
101
+
102
+
103
+ @pytest.mark.parametrize("relative", ["scripts/payload.pyc", "__pycache__/generated.pyc"])
104
+ def test_release_requires_a_clean_source_package_without_bytecode(snapshot, relative):
105
+ path = snapshot[0] / "skills" / "demo" / relative
106
+ path.parent.mkdir(parents=True, exist_ok=True)
107
+ path.write_bytes(b"potentially executable bytes")
108
+ assert "unsafe-release-content" in {row["code"] for row in check(snapshot)}
109
+
110
+
111
+ def test_tree_object_is_not_commit_lineage(snapshot):
112
+ root, _, fingerprint = snapshot
113
+ tree = git(root, "rev-parse", "HEAD^{tree}").decode().strip()
114
+ result = check_release_binding(root, root / "skills", tree, fingerprint)
115
+ assert "unavailable-release-snapshot" in {row["code"] for row in result}
116
+
117
+
118
+ def test_wrong_historical_full_tree_hash_fails(snapshot):
119
+ root, commit, _ = snapshot
120
+ result = check_release_binding(root, root / "skills", commit, "0" * 64)
121
+ assert "release-snapshot-mismatch" in {row["code"] for row in result}
122
+
123
+
124
+ @pytest.mark.parametrize("commit,fingerprint", [(None, None), ("HEAD", "a" * 64),
125
+ ("a" * 40, "bad"), (True, False)])
126
+ def test_malformed_binding_fails_closed(snapshot, commit, fingerprint):
127
+ root = snapshot[0]
128
+ result = check_release_binding(root, root / "skills", commit, fingerprint)
129
+ assert "invalid-release-binding" in {row["code"] for row in result}
130
+
131
+
132
+ def test_symlink_resource_is_rejected_without_reading_target(snapshot):
133
+ root = snapshot[0]
134
+ outside = root / "outside.txt"
135
+ outside.write_text("must not load")
136
+ link = root / "skills" / "demo" / "references" / "escape.md"
137
+ try:
138
+ link.symlink_to(outside)
139
+ except OSError:
140
+ pytest.skip("symlink creation unavailable")
141
+ assert "unsafe-release-content" in {row["code"] for row in check(snapshot)}
142
+
143
+
144
+ def _ledger_check(snapshot, mutate=lambda ledger: None):
145
+ import json
146
+ import runpy
147
+
148
+ root, commit, fingerprint = snapshot
149
+ ledger = {"release_eligible": True, "release_blockers": [],
150
+ "gates": [{"id": value, "status": "passed"} for value in range(7)]}
151
+ ledger["gates"][5].update(evaluated_candidate_commit=commit,
152
+ evaluated_candidate_fingerprint=fingerprint)
153
+ mutate(ledger)
154
+ path = root / "ledger.json"
155
+ path.write_text(json.dumps(ledger), encoding="utf-8")
156
+ check_status = runpy.run_path(str(ROOT / "scripts" / "check-skill-governance.py"))["check_status"]
157
+ return check_status(path, repo_root=root, skills_root=root / "skills")
158
+
159
+
160
+ def test_green_ledger_automatically_checks_real_content(snapshot):
161
+ assert _ledger_check(snapshot) == []
162
+ (snapshot[0] / "skills" / "demo" / "SKILL.md").write_text("changed")
163
+ assert "release-content-drift" in {row["code"] for row in _ledger_check(snapshot)}
164
+
165
+
166
+ @pytest.mark.parametrize("value", ["false", 0, [], None])
167
+ def test_ledger_requires_real_boolean(snapshot, value):
168
+ findings = _ledger_check(snapshot, lambda doc: doc.update(release_eligible=value))
169
+ assert "invalid-gate-status" in {row["code"] for row in findings}
170
+
171
+
172
+ @pytest.mark.parametrize("value", [False, [], "0"])
173
+ def test_ledger_rejects_non_integer_gate_ids_without_crashing(snapshot, value):
174
+ findings = _ledger_check(snapshot, lambda doc: doc["gates"][0].update(id=value))
175
+ assert "incomplete-gate-set" in {row["code"] for row in findings}
176
+
177
+
178
+ @pytest.mark.parametrize("field,value,code", [
179
+ ("evidence", "not-a-list", "invalid-gate-evidence"),
180
+ ("evidence", ["../outside"], "unsafe-gate-evidence"),
181
+ ("status", [], "invalid-gate-state"),
182
+ ])
183
+ def test_malformed_evidence_and_status_fail_closed(snapshot, field, value, code):
184
+ findings = _ledger_check(snapshot, lambda doc: doc["gates"][0].update({field: value}))
185
+ assert code in {row["code"] for row in findings}
186
+
187
+
188
+ @pytest.mark.parametrize("evidence", ["nul\x00path", "x" * 5000], ids=["nul", "overlong"])
189
+ def test_filesystem_metadata_errors_stay_structured(snapshot, evidence):
190
+ findings = _ledger_check(snapshot, lambda doc: doc["gates"][0].update(evidence=[evidence]))
191
+ assert "unsafe-gate-evidence" in {row["code"] for row in findings}
192
+
193
+
194
+ def test_symlink_loop_resolution_error_stays_structured(snapshot, monkeypatch):
195
+ original = Path.resolve
196
+
197
+ def resolve(path, *args, **kwargs):
198
+ if path.name == "loop":
199
+ raise RuntimeError("symlink loop")
200
+ return original(path, *args, **kwargs)
201
+
202
+ monkeypatch.setattr(Path, "resolve", resolve)
203
+ findings = _ledger_check(snapshot, lambda doc: doc["gates"][0].update(evidence=["loop"]))
204
+ assert "unsafe-gate-evidence" in {row["code"] for row in findings}
@@ -0,0 +1,74 @@
1
+ from __future__ import annotations
2
+
3
+ import importlib.util
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ ROOT = Path(__file__).resolve().parents[2]
9
+ if str(ROOT) not in sys.path:
10
+ sys.path.insert(0, str(ROOT))
11
+ SCRIPT = ROOT / "scripts" / "evaluate-skill-routing.py"
12
+ SPEC = importlib.util.spec_from_file_location("evaluate_skill_routing", SCRIPT)
13
+ assert SPEC and SPEC.loader
14
+ module = importlib.util.module_from_spec(SPEC)
15
+ sys.modules[SPEC.name] = module
16
+ SPEC.loader.exec_module(module)
17
+
18
+ from tools._lib.manifest import load_skill
19
+
20
+
21
+ def _governed_names(skills_root: Path) -> set[str]:
22
+ """Skills that opt into the governance/eval discipline, by the `source_policy`
23
+ marker. The routing corpus is authored for this portfolio universe; AAT also
24
+ hosts imported/portable skills whose prompts legitimately fall outside it, so
25
+ the live routing gate is scored over the governed set, not the whole tree
26
+ (procesio-cli's `skills/` IS the portfolio, so there the two coincide)."""
27
+ names: set[str] = set()
28
+ for skill_md in sorted(skills_root.glob("*/SKILL.md")):
29
+ try:
30
+ manifest = load_skill(skill_md)
31
+ except Exception: # noqa: BLE001 - a broken skill is validate-skills' job
32
+ continue
33
+ if manifest.source_policy:
34
+ names.add(manifest.name)
35
+ return names
36
+
37
+
38
+ def test_frozen_v2_baseline_is_reproducible():
39
+ report = module.evaluate(
40
+ module.load_catalog(ROOT / "skills" / "evals" / "baseline-catalog.json"),
41
+ module.load_cases(ROOT / "skills" / "evals" / "routing.json"),
42
+ )
43
+ expected = json.loads((ROOT / "skills" / "evals" / "baseline-routing-v2.json").read_text(encoding="utf-8"))
44
+ assert module.projection(report) == expected
45
+
46
+
47
+ def test_live_skill_descriptions_clear_gate_three():
48
+ governed = _governed_names(ROOT / "skills")
49
+ assert governed, "no governed skills found (source_policy marker missing?)"
50
+ live = [s for s in module.load_skills(ROOT / "skills") if s.name in governed]
51
+ report = module.evaluate(
52
+ live,
53
+ module.load_cases(ROOT / "skills" / "evals" / "routing.json"),
54
+ )
55
+ assert report["routing_accuracy"] >= 0.95
56
+ assert report["collision_rate"] == 0
57
+
58
+
59
+ def test_explicit_exclusion_prevents_postgresql_false_positive():
60
+ skills = [module.Skill(
61
+ "sql-server-optimizer",
62
+ "Analyze SQL Server T-SQL; do not use for PostgreSQL or MySQL.",
63
+ )]
64
+ assert module.select("Tune this PostgreSQL query", skills)[0] is None
65
+
66
+
67
+ def test_hyphenated_tsql_matches():
68
+ skills = [module.Skill(
69
+ "sql-server-optimizer",
70
+ "Analyze SQL Server T-SQL predicates and sargability.",
71
+ )]
72
+ assert module.select(
73
+ "Why is this T-SQL predicate not sargable?", skills
74
+ )[0] == "sql-server-optimizer"
@@ -0,0 +1,116 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import importlib.util
5
+ import json
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ import pytest
10
+ import yaml
11
+
12
+ ROOT = Path(__file__).resolve().parents[2]
13
+ SCRIPT = ROOT / "skills" / "agent-skill-engineer" / "scripts" / "scaffold_skill.py"
14
+ SPEC = importlib.util.spec_from_file_location("agent_skill_scaffold_v2", SCRIPT)
15
+ assert SPEC and SPEC.loader
16
+ SCAFFOLD = importlib.util.module_from_spec(SPEC)
17
+ sys.modules[SPEC.name] = SCAFFOLD
18
+ SPEC.loader.exec_module(SCAFFOLD)
19
+
20
+
21
+ def _frontmatter(path: Path) -> dict:
22
+ lines = path.read_text(encoding="utf-8").splitlines()
23
+ end = lines[1:].index("---") + 1
24
+ value = yaml.safe_load("\n".join(lines[1:end]))
25
+ assert isinstance(value, dict)
26
+ return value
27
+
28
+
29
+ def test_governed_scaffold_preserves_v1_contract_and_adds_causal_evidence_fields(tmp_path):
30
+ args = SCAFFOLD._parser().parse_args(
31
+ [
32
+ "incident-triage",
33
+ "--root",
34
+ str(tmp_path),
35
+ "--description",
36
+ "Triage recurring incidents. Use when an incident report needs a bounded diagnostic workflow.",
37
+ "--profile",
38
+ "governed",
39
+ "--owner",
40
+ "platform team",
41
+ "--baseline-version",
42
+ "abc123",
43
+ "--trigger",
44
+ "triage a recurring production incident",
45
+ "--non-trigger",
46
+ "implement the incident-management product itself",
47
+ "--target-client",
48
+ "Agent Skills compatible coding agents",
49
+ "--evidence-tier",
50
+ "3",
51
+ ]
52
+ )
53
+ result = SCAFFOLD.scaffold(args)
54
+ target = tmp_path / "incident-triage"
55
+ frontmatter = _frontmatter(target / "SKILL.md")
56
+ body = (target / "SKILL.md").read_text(encoding="utf-8")
57
+ suite = json.loads((target / "evals" / "evals.json").read_text(encoding="utf-8"))
58
+
59
+ assert result["schema_version"] == 2
60
+ assert result["evidence_tier"] == 3
61
+ assert frontmatter["name"] == "incident-triage"
62
+ assert frontmatter["owner"] == "platform team"
63
+ assert frontmatter["eval_suite"] == "evals/evals.json"
64
+ assert frontmatter["metadata"]["status"] == "draft"
65
+ assert "## Causal contract" in body
66
+ assert "Protected successes" in body
67
+ assert "repairs and regressions" in body
68
+ assert "implement the incident-management product itself" in body
69
+ assert suite["rubric_contract"] == "fixed-jury-rubric-v2"
70
+ assert suite["evidence_tier"] == 3
71
+ assert suite["experiment_contract"]["test"].startswith("untouched")
72
+ assert {case["kind"] for case in suite["cases"]} == {
73
+ "positive",
74
+ "negative",
75
+ "overlap",
76
+ "pressure",
77
+ }
78
+
79
+
80
+ def test_scaffold_still_refuses_overwrite_and_escape(tmp_path):
81
+ parser = SCAFFOLD._parser()
82
+ args = parser.parse_args(
83
+ [
84
+ "demo-skill",
85
+ "--root",
86
+ str(tmp_path),
87
+ "--description",
88
+ "Create a demo. Use when a reusable demo workflow is requested.",
89
+ ]
90
+ )
91
+ SCAFFOLD.scaffold(args)
92
+ with pytest.raises(FileExistsError, match="refusing to overwrite"):
93
+ SCAFFOLD.scaffold(args)
94
+ with pytest.raises(ValueError, match="lowercase"):
95
+ SCAFFOLD.scaffold(argparse.Namespace(**{**vars(args), "name": "../escape"}))
96
+
97
+
98
+ def test_failed_governed_scaffold_leaves_no_partial_directory(tmp_path):
99
+ args = SCAFFOLD._parser().parse_args(
100
+ [
101
+ "governed-skill",
102
+ "--root",
103
+ str(tmp_path),
104
+ "--description",
105
+ "Govern work. Use when the governed workflow is required.",
106
+ "--profile",
107
+ "governed",
108
+ "--owner",
109
+ "team",
110
+ "--baseline-version",
111
+ "abc",
112
+ ]
113
+ )
114
+ with pytest.raises(ValueError, match="--trigger"):
115
+ SCAFFOLD.scaffold(args)
116
+ assert not (tmp_path / "governed-skill").exists()
@@ -0,0 +1,115 @@
1
+ from __future__ import annotations
2
+
3
+ import importlib.util
4
+ import json
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ ROOT = Path(__file__).resolve().parents[2]
9
+ SCRIPT = ROOT / "scripts" / "validate-skills.py"
10
+ SPEC = importlib.util.spec_from_file_location("validate_skills", SCRIPT)
11
+ assert SPEC and SPEC.loader
12
+ module = importlib.util.module_from_spec(SPEC)
13
+ sys.modules[SPEC.name] = module
14
+ SPEC.loader.exec_module(module)
15
+
16
+
17
+ def _write(path: Path, content: str) -> None:
18
+ path.parent.mkdir(parents=True, exist_ok=True)
19
+ path.write_text(content, encoding="utf-8")
20
+
21
+
22
+ def _skill(root: Path, folder: str = "demo", name: str = "demo", body: str = "# Demo") -> Path:
23
+ path = root / "skills" / folder / "SKILL.md"
24
+ _write(path, f"---\nname: {name}\ndescription: Use when testing the demo skill.\n---\n\n{body}\n")
25
+ return path
26
+
27
+
28
+ def test_valid_skill_has_no_blocking_findings(tmp_path):
29
+ _skill(tmp_path)
30
+ assert module.validate_repo(tmp_path / "skills", tmp_path) == []
31
+
32
+
33
+ def test_missing_reference_and_folder_mismatch_are_detected(tmp_path):
34
+ _skill(tmp_path, folder="wrong", name="demo", body="Read `references/missing.md`.")
35
+ codes = {finding.code for finding in module.validate_repo(tmp_path / "skills", tmp_path)}
36
+ assert {"folder-name-mismatch", "missing-reference"} <= codes
37
+
38
+
39
+ def test_nested_scripts_are_rejected(tmp_path):
40
+ _skill(tmp_path)
41
+ _write(tmp_path / "skills" / "demo" / "references" / "scripts" / "dump.sql", "select 1")
42
+ codes = {finding.code for finding in module.validate_repo(tmp_path / "skills", tmp_path)}
43
+ assert {"nested-resource", "script-in-references"} <= codes
44
+
45
+
46
+ def test_python_bytecode_caches_are_ignored(tmp_path):
47
+ _skill(tmp_path)
48
+ _write(
49
+ tmp_path
50
+ / "skills"
51
+ / "demo"
52
+ / "scripts"
53
+ / "__pycache__"
54
+ / "helper.cpython-312.pyc",
55
+ "transient bytecode fixture",
56
+ )
57
+
58
+ assert module.validate_repo(tmp_path / "skills", tmp_path) == []
59
+
60
+
61
+ def test_command_examples_must_name_real_actions(tmp_path):
62
+ _write(tmp_path / "tools" / "widget" / "tool.yaml", """
63
+ name: widget
64
+ description: widgets
65
+ actions:
66
+ - name: list-things
67
+ args:
68
+ - {name: limit, type: integer}
69
+ """.lstrip())
70
+ _skill(tmp_path, body=(
71
+ "`python scripts/run-tool.py widget list-things --limit 1`\n\n"
72
+ "`python scripts/run-tool.py widget delete-world`"
73
+ ))
74
+ findings = module.validate_repo(tmp_path / "skills", tmp_path)
75
+ assert any(finding.code == "unknown-action" and "delete-world" in finding.message
76
+ for finding in findings)
77
+ assert not any(finding.code == "unknown-action" and "list-things" in finding.message
78
+ for finding in findings)
79
+
80
+
81
+ def test_waiver_matches_only_the_declared_finding():
82
+ finding = module.Finding("error", "missing-reference", "demo", "SKILL.md", "x")
83
+ assert module._waived(finding, [{"skill": "demo", "code": "missing-*", "path": "*"}])
84
+ assert not module._waived(finding, [{"skill": "other", "code": "missing-*"}])
85
+
86
+
87
+ def test_committed_waiver_file_is_valid_json():
88
+ data = json.loads((ROOT / "skills" / "evals" / "validation-baseline.json").read_text(encoding="utf-8"))
89
+ assert isinstance(data["allow"], list)
90
+
91
+
92
+ def test_committed_skills_tree_passes_the_validator():
93
+ """The read-back the hand-written skills never had.
94
+
95
+ Every other test in this file builds its own fixture under tmp_path, so they
96
+ prove the validator's logic and nothing about the tree that ships. The
97
+ mirror guard for the GENERATED manuals does scan for real
98
+ (tests/test_tool_skills.py::test_skill_frontmatter_parses) - which is why a
99
+ description carrying a colon-space is caught under tools/ and was not caught
100
+ under skills/.
101
+
102
+ Why one bad file is not one file's problem: registry.list_skills() parses
103
+ every manifest in a single pass, so one unloadable SKILL.md fails get-skill
104
+ for EVERY skill, not just its own.
105
+
106
+ This calls main() rather than validate_repo() on purpose. validate_repo()
107
+ applies the full rubric to every folder, ignoring the `source_policy`
108
+ governance opt-in, so it fails imported skills that were never written to
109
+ that rubric. main() is what the CLI and both pre-commit hooks run, so this
110
+ test and the command a developer runs cannot drift apart.
111
+ """
112
+ assert module.main([]) == 0, (
113
+ "the committed skills tree does not pass the validator - "
114
+ "run `python scripts/validate-skills.py` for the findings"
115
+ )
File without changes