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.
- procesio_cli/__init__.py +18 -0
- procesio_cli/_cli.py +71 -0
- procesio_cli/agents/__init__.py +0 -0
- procesio_cli/agents/_lib/__init__.py +0 -0
- procesio_cli/agents/_lib/actiondef.py +24 -0
- procesio_cli/agents/_lib/errors.py +40 -0
- procesio_cli/agents/_lib/reversibility.py +236 -0
- procesio_cli/agents/_lib/toolrunner.py +141 -0
- procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PLAYBOOK.md +62 -0
- procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PROCESIO-INTEROP.md +76 -0
- procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-TROUBLESHOOTING.md +60 -0
- procesio_cli/agents/connector-builder/README.md +51 -0
- procesio_cli/agents/connector-builder/agent.yaml +61 -0
- procesio_cli/agents/connector-builder/context.py +19 -0
- procesio_cli/agents/connector-builder/handlers/__init__.py +1 -0
- procesio_cli/agents/connector-builder/handlers/checklist.py +71 -0
- procesio_cli/agents/connector-builder/handlers/guidance.py +37 -0
- procesio_cli/agents/connector-builder/handlers/nextstep.py +221 -0
- procesio_cli/agents/connector-builder/handlers/status.py +35 -0
- procesio_cli/agents/connector-builder/knowledge.py +47 -0
- procesio_cli/agents/connector-builder/main.py +93 -0
- procesio_cli/agents/connector-builder/tests/conftest.py +95 -0
- procesio_cli/agents/connector-builder/tests/test_cba_agent.py +148 -0
- procesio_cli/agents/orchestrator/__init__.py +0 -0
- procesio_cli/agents/orchestrator/bootstraplib.py +166 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/00-INDEX.md +60 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/01-PROCESSES.md +230 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/02-FORMS.md +287 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/03-INTEGRATIONS.md +384 -0
- procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/04-DATABASE.md +293 -0
- procesio_cli/agents/procesio/PROCESIO-API-RELIABILITY-DOCTRINE.md +113 -0
- procesio_cli/agents/procesio/PROCESIO-BEST-PRACTICES.md +316 -0
- procesio_cli/agents/procesio/PROCESIO-BUILD-AND-TEST-PLAYBOOK.md +217 -0
- procesio_cli/agents/procesio/PROCESIO-DATASTORE.md +72 -0
- procesio_cli/agents/procesio/PROCESIO-ENVIRONMENTS.md +62 -0
- procesio_cli/agents/procesio/PROCESIO-SCHEDULING.md +47 -0
- procesio_cli/agents/procesio/PROCESIO-VISUAL-ORGANIZATION.md +175 -0
- procesio_cli/agents/procesio/README.md +97 -0
- procesio_cli/agents/procesio/__init__.py +0 -0
- procesio_cli/agents/procesio/agent.yaml +73 -0
- procesio_cli/agents/procesio/audit.py +226 -0
- procesio_cli/agents/procesio/checklist.py +135 -0
- procesio_cli/agents/procesio/context.py +19 -0
- procesio_cli/agents/procesio/handlers/__init__.py +0 -0
- procesio_cli/agents/procesio/handlers/audit.py +39 -0
- procesio_cli/agents/procesio/handlers/checklist.py +34 -0
- procesio_cli/agents/procesio/handlers/guidance.py +36 -0
- procesio_cli/agents/procesio/handlers/status.py +33 -0
- procesio_cli/agents/procesio/handlers/verify.py +39 -0
- procesio_cli/agents/procesio/knowledge.py +115 -0
- procesio_cli/agents/procesio/main.py +89 -0
- procesio_cli/agents/procesio/tests/__init__.py +0 -0
- procesio_cli/agents/procesio/tests/conftest.py +62 -0
- procesio_cli/agents/procesio/tests/test_audit.py +91 -0
- procesio_cli/agents/procesio/tests/test_checklist.py +28 -0
- procesio_cli/agents/procesio/tests/test_guidance.py +78 -0
- procesio_cli/agents/procesio/tests/test_manifest_sync.py +48 -0
- procesio_cli/agents/procesio/tests/test_verify.py +134 -0
- procesio_cli/agents/procesio/tests/test_workspace_scope.py +97 -0
- procesio_cli/agents/procesio/verifylib.py +222 -0
- procesio_cli/dashboard/README.md +117 -0
- procesio_cli/dashboard/__init__.py +18 -0
- procesio_cli/dashboard/serve.py +98 -0
- procesio_cli/dashboard/server/__init__.py +1 -0
- procesio_cli/dashboard/server/config_schemas.py +92 -0
- procesio_cli/dashboard/server/google.py +103 -0
- procesio_cli/dashboard/server/handler.py +160 -0
- procesio_cli/dashboard/server/inventory.py +213 -0
- procesio_cli/dashboard/server/jobs.py +118 -0
- procesio_cli/dashboard/server/llmtest.py +181 -0
- procesio_cli/dashboard/server/procesio_env.py +94 -0
- procesio_cli/dashboard/server/routes.py +74 -0
- procesio_cli/dashboard/server/runner.py +150 -0
- procesio_cli/dashboard/server/security.py +29 -0
- procesio_cli/dashboard/server/setup.py +211 -0
- procesio_cli/dashboard/server/validate.py +152 -0
- procesio_cli/dashboard/tests/conftest.py +16 -0
- procesio_cli/dashboard/tests/test_dashboard.py +225 -0
- procesio_cli/dashboard/tests/test_procesio_env.py +159 -0
- procesio_cli/dashboard/web/actions.js +274 -0
- procesio_cli/dashboard/web/api.js +79 -0
- procesio_cli/dashboard/web/app.js +385 -0
- procesio_cli/dashboard/web/copilot.js +72 -0
- procesio_cli/dashboard/web/google.js +121 -0
- procesio_cli/dashboard/web/index.html +67 -0
- procesio_cli/dashboard/web/procesio_env.js +187 -0
- procesio_cli/dashboard/web/styles.css +207 -0
- procesio_cli/registry.py +370 -0
- procesio_cli/scripts/build-router.py +249 -0
- procesio_cli/scripts/build-tool-skill.py +202 -0
- procesio_cli/scripts/check-requirements.py +131 -0
- procesio_cli/scripts/check-skill-governance.py +174 -0
- procesio_cli/scripts/evaluate-skill-routing.py +217 -0
- procesio_cli/scripts/evaluate-skills.py +316 -0
- procesio_cli/scripts/get-skill.py +122 -0
- procesio_cli/scripts/list-skills.py +68 -0
- procesio_cli/scripts/list-tools.py +73 -0
- procesio_cli/scripts/run-agent.py +59 -0
- procesio_cli/scripts/run-tool.py +123 -0
- procesio_cli/scripts/secret_scan.py +584 -0
- procesio_cli/scripts/set-credential.py +126 -0
- procesio_cli/scripts/validate-skills.py +530 -0
- procesio_cli/skills/PORTFOLIO.md +134 -0
- procesio_cli/skills/__init__.py +6 -0
- procesio_cli/skills/agent-skill-engineer/SKILL.md +226 -0
- procesio_cli/skills/agent-skill-engineer/evals/evals.json +422 -0
- procesio_cli/skills/agent-skill-engineer/references/authoring-standard.md +178 -0
- procesio_cli/skills/agent-skill-engineer/references/decision-framework.md +107 -0
- procesio_cli/skills/agent-skill-engineer/references/domain-evidence-protocol.md +248 -0
- procesio_cli/skills/agent-skill-engineer/references/evaluation-standard.md +191 -0
- procesio_cli/skills/agent-skill-engineer/references/expert-lenses.md +167 -0
- procesio_cli/skills/agent-skill-engineer/references/field-gate-standard.md +231 -0
- procesio_cli/skills/agent-skill-engineer/references/optimization-protocol.md +233 -0
- procesio_cli/skills/agent-skill-engineer/references/optimizer-contract.md +268 -0
- procesio_cli/skills/agent-skill-engineer/references/portability-standard.md +99 -0
- procesio_cli/skills/agent-skill-engineer/references/research-basis.md +128 -0
- procesio_cli/skills/agent-skill-engineer/references/review-standard.md +143 -0
- procesio_cli/skills/agent-skill-engineer/scripts/audit_skill.py +959 -0
- procesio_cli/skills/agent-skill-engineer/scripts/optimize_skill.py +891 -0
- procesio_cli/skills/agent-skill-engineer/scripts/scaffold_skill.py +397 -0
- procesio_cli/skills/evals/baseline-catalog.json +14 -0
- procesio_cli/skills/evals/baseline-routing-v2.json +38 -0
- procesio_cli/skills/evals/baseline.json +37 -0
- procesio_cli/skills/evals/behavioral.json +367 -0
- procesio_cli/skills/evals/field-boundary-development-v1.json +126 -0
- procesio_cli/skills/evals/field-closeout-correction-development-v1.json +23 -0
- procesio_cli/skills/evals/field-closeout-development-v1.json +89 -0
- procesio_cli/skills/evals/portfolio-pressure-training-v1.json +83 -0
- procesio_cli/skills/evals/routing.json +363 -0
- procesio_cli/skills/evals/validation-baseline.json +4 -0
- procesio_cli/skills/procesio-cli/SKILL.md +134 -0
- procesio_cli/skills/procesio-cli/evals/evals.json +111 -0
- procesio_cli/skills/procesio-cli/evals/workflows.json +16 -0
- procesio_cli/skills/procesio-cli/references/connector-lifecycle.md +47 -0
- procesio_cli/skills/procesio-cli/references/credentials-admin.md +113 -0
- procesio_cli/skills/procesio-cli/references/data-verification.md +71 -0
- procesio_cli/skills/procesio-cli/references/documents-files.md +44 -0
- procesio_cli/skills/procesio-cli/references/form-e2e.md +57 -0
- procesio_cli/skills/procesio-cli/references/operation-contract.md +138 -0
- procesio_cli/skills/procesio-cli/references/process-debugging.md +65 -0
- procesio_cli/skills/procesio-cli/references/process-lifecycle.md +88 -0
- procesio_cli/skills/procesio-cli/references/schedules-webhooks.md +58 -0
- procesio_cli/skills/procesio-cli/references/transport-environments.md +53 -0
- procesio_cli/skills/procesio-cli-maintainer/SKILL.md +84 -0
- procesio_cli/skills/procesio-cli-maintainer/evals/evals.json +116 -0
- procesio_cli/skills/procesio-cli-maintainer/references/change-contract.md +34 -0
- procesio_cli/skills/procesio-cli-maintainer/references/mcp-compatibility.md +13 -0
- procesio_cli/skills/procesio-cli-maintainer/references/skill-authoring.md +51 -0
- procesio_cli/skills/procesio-platform-advisor/SKILL.md +82 -0
- procesio_cli/skills/procesio-platform-advisor/evals/evals.json +116 -0
- procesio_cli/skills/procesio-platform-advisor/references/capability-map.md +22 -0
- procesio_cli/skills/procesio-platform-advisor/references/fit-framework.md +35 -0
- procesio_cli/skills/procesio-platform-advisor/references/freshness-policy.md +25 -0
- procesio_cli/skills/procesio-platform-advisor/references/sizing-method.md +70 -0
- procesio_cli/skills/procesio-platform-advisor/scripts/estimate_capacity.py +99 -0
- procesio_cli/skills/procesio-setup/SKILL.md +180 -0
- procesio_cli/skills/sql-server-optimizer/SKILL.md +86 -0
- procesio_cli/skills/sql-server-optimizer/evals/evals.json +116 -0
- procesio_cli/skills/sql-server-optimizer/references/db-context.md +44 -0
- procesio_cli/skills/sql-server-optimizer/references/generic-mode.md +32 -0
- procesio_cli/skills/sql-server-optimizer/references/procesio-mode.md +40 -0
- procesio_cli/skills/sql-server-optimizer/references/sql-rules.md +43 -0
- procesio_cli/skills/sql-server-optimizer/scripts/export-indexes.sql +178 -0
- procesio_cli/skills/sql-server-optimizer/scripts/export-procs-and-functions.sql +118 -0
- procesio_cli/skills/sql-server-optimizer/scripts/export-tables.sql +367 -0
- procesio_cli/skills/tests/__init__.py +0 -0
- procesio_cli/skills/tests/test_agent_skill_engineer.py +240 -0
- procesio_cli/skills/tests/test_auth_failure_stop.py +25 -0
- procesio_cli/skills/tests/test_capacity_estimator.py +85 -0
- procesio_cli/skills/tests/test_field_boundary_learning.py +100 -0
- procesio_cli/skills/tests/test_field_closeout_learning.py +123 -0
- procesio_cli/skills/tests/test_field_gate_standard.py +76 -0
- procesio_cli/skills/tests/test_operational_playbooks.py +51 -0
- procesio_cli/skills/tests/test_portfolio_pressure_training.py +35 -0
- procesio_cli/skills/tests/test_process_lifecycle_single_run.py +25 -0
- procesio_cli/skills/tests/test_skill_evaluator.py +67 -0
- procesio_cli/skills/tests/test_skill_optimizer.py +473 -0
- procesio_cli/skills/tests/test_skill_portfolio_review.py +70 -0
- procesio_cli/skills/tests/test_skill_release_binding.py +204 -0
- procesio_cli/skills/tests/test_skill_routing.py +74 -0
- procesio_cli/skills/tests/test_skill_scaffold_v2.py +116 -0
- procesio_cli/skills/tests/test_validate_skills.py +115 -0
- procesio_cli/tools/__init__.py +0 -0
- procesio_cli/tools/_lib/README.md +119 -0
- procesio_cli/tools/_lib/__init__.py +0 -0
- procesio_cli/tools/_lib/accounting.py +120 -0
- procesio_cli/tools/_lib/contacts.py +544 -0
- procesio_cli/tools/_lib/creds.py +83 -0
- procesio_cli/tools/_lib/creds_backends.py +578 -0
- procesio_cli/tools/_lib/dbprofiles.py +147 -0
- procesio_cli/tools/_lib/dbquery.py +286 -0
- procesio_cli/tools/_lib/dbschema.py +225 -0
- procesio_cli/tools/_lib/io.py +54 -0
- procesio_cli/tools/_lib/manifest.py +297 -0
- procesio_cli/tools/_lib/skill_release.py +127 -0
- procesio_cli/tools/_lib/skill_resources.py +118 -0
- procesio_cli/tools/_lib/userdata.py +228 -0
- procesio_cli/tools/_lib/webserialize/__init__.py +16 -0
- procesio_cli/tools/_lib/webserialize/admin.py +61 -0
- procesio_cli/tools/_lib/webserialize/client.py +264 -0
- procesio_cli/tools/_lib/webserialize/config.py +96 -0
- procesio_cli/tools/_lib/webserialize/errors.py +27 -0
- procesio_cli/tools/_lib/webserialize/framing.py +45 -0
- procesio_cli/tools/_lib/webserialize/registry.py +47 -0
- procesio_cli/tools/_lib/webserialize/runtime.py +61 -0
- procesio_cli/tools/_lib/webserialize/server.py +510 -0
- procesio_cli/tools/_lib/websession.py +194 -0
- procesio_cli/tools/connector-builder/CONNECTOR-BUILDER-API-NOTES.md +91 -0
- procesio_cli/tools/connector-builder/README.md +101 -0
- procesio_cli/tools/connector-builder/SKILL.md +248 -0
- procesio_cli/tools/connector-builder/__init__.py +7 -0
- procesio_cli/tools/connector-builder/actiondef.py +24 -0
- procesio_cli/tools/connector-builder/client.py +251 -0
- procesio_cli/tools/connector-builder/errors.py +44 -0
- procesio_cli/tools/connector-builder/gen_manifest.py +142 -0
- procesio_cli/tools/connector-builder/handlers/__init__.py +1 -0
- procesio_cli/tools/connector-builder/handlers/admin.py +182 -0
- procesio_cli/tools/connector-builder/handlers/auth.py +74 -0
- procesio_cli/tools/connector-builder/handlers/builds.py +396 -0
- procesio_cli/tools/connector-builder/handlers/common.py +104 -0
- procesio_cli/tools/connector-builder/handlers/files.py +111 -0
- procesio_cli/tools/connector-builder/handlers/raw.py +38 -0
- procesio_cli/tools/connector-builder/handlers/telemetry.py +39 -0
- procesio_cli/tools/connector-builder/main.py +94 -0
- procesio_cli/tools/connector-builder/tests/conftest.py +146 -0
- procesio_cli/tools/connector-builder/tests/test_cb_client.py +86 -0
- procesio_cli/tools/connector-builder/tests/test_cb_dispatch.py +105 -0
- procesio_cli/tools/connector-builder/tests/test_cb_manifest_sync.py +76 -0
- procesio_cli/tools/connector-builder/tests/test_cb_wait.py +123 -0
- procesio_cli/tools/connector-builder/tool.yaml +671 -0
- procesio_cli/tools/framework-map/.gitattributes +2 -0
- procesio_cli/tools/framework-map/README.md +98 -0
- procesio_cli/tools/framework-map/SKILL.md +30 -0
- procesio_cli/tools/framework-map/app.js +188 -0
- procesio_cli/tools/framework-map/fm_builder.py +476 -0
- procesio_cli/tools/framework-map/fm_catalog.py +19 -0
- procesio_cli/tools/framework-map/fm_ro_catalog.py +94 -0
- procesio_cli/tools/framework-map/fm_strings.py +101 -0
- procesio_cli/tools/framework-map/main.py +95 -0
- procesio_cli/tools/framework-map/styles.css +214 -0
- procesio_cli/tools/framework-map/tests/conftest.py +33 -0
- procesio_cli/tools/framework-map/tests/test_fm_build.py +126 -0
- procesio_cli/tools/framework-map/tests/test_fm_manifest_sync.py +63 -0
- procesio_cli/tools/framework-map/tests/test_fm_store_tree.py +75 -0
- procesio_cli/tools/framework-map/tool.yaml +61 -0
- procesio_cli/tools/mysql/MOVED-TO-CENTRAL.md +29 -0
- procesio_cli/tools/mysql/README.md +196 -0
- procesio_cli/tools/mysql/SKILL.md +37 -0
- procesio_cli/tools/mysql/__init__.py +0 -0
- procesio_cli/tools/mysql/connection.py +191 -0
- procesio_cli/tools/mysql/main.py +487 -0
- procesio_cli/tools/mysql/profiles.template.json +1 -0
- procesio_cli/tools/mysql/schema.py +434 -0
- procesio_cli/tools/mysql/tests/__init__.py +0 -0
- procesio_cli/tools/mysql/tests/conftest.py +21 -0
- procesio_cli/tools/mysql/tests/test_manifest_sync.py +68 -0
- procesio_cli/tools/mysql/tests/test_mysql.py +201 -0
- procesio_cli/tools/mysql/tests/test_mysql_schema.py +337 -0
- procesio_cli/tools/mysql/tool.yaml +112 -0
- procesio_cli/tools/procesio/DTO-SUBTOOLS-NOTE.md +360 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/00-INDEX.md +67 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/01-ANATOMY.md +209 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/02-CODE-INJECTION.md +309 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/03-DOM-CONTRACT.md +370 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/04-INTERACTION-RECIPES.md +600 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/05-STEPPER-AND-MOTION.md +426 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/06-PROCESS-INTEGRATION.md +347 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/07-DEPLOY-WORKFLOW.md +294 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/08-PITFALLS.md +569 -0
- procesio_cli/tools/procesio/FORM-DEV-GUIDE/09-NAVIGATION-AND-HOSTING.md +308 -0
- procesio_cli/tools/procesio/PHASE4-E2E-NOTES.md +594 -0
- procesio_cli/tools/procesio/PROCESIO-API-CORRECTIONS.md +295 -0
- procesio_cli/tools/procesio/PROCESIO-API-NOTES.md +6976 -0
- procesio_cli/tools/procesio/PROCESIO-AUTH-NOTES.md +226 -0
- procesio_cli/tools/procesio/PROCESIO-CARD-BUILD-NOTES.md +183 -0
- procesio_cli/tools/procesio/PROCESIO-CONNECTORS-NOTES.md +141 -0
- procesio_cli/tools/procesio/PROCESIO-CUSTOM-ACTION-NOTES.md +179 -0
- procesio_cli/tools/procesio/PROCESIO-DOCS-FIX-REPORT.md +123 -0
- procesio_cli/tools/procesio/PROCESIO-ENVIRONMENTS-NOTES.md +94 -0
- procesio_cli/tools/procesio/PROCESIO-FE-VALIDATION-NOTES.md +107 -0
- procesio_cli/tools/procesio/PROCESIO-FOREACH-NOTES.md +199 -0
- procesio_cli/tools/procesio/PROCESIO-FORM-API-HANG-NOTE.md +101 -0
- procesio_cli/tools/procesio/PROCESIO-FORM-SUBMISSION-NOTES.md +172 -0
- procesio_cli/tools/procesio/PROCESIO-HTML-TO-DOCX-NOTES.md +110 -0
- procesio_cli/tools/procesio/PROCESIO-INSTANCE-HISTORY-NOTES.md +242 -0
- procesio_cli/tools/procesio/PROCESIO-METERING-NOTES.md +201 -0
- procesio_cli/tools/procesio/PROCESIO-NODE-CODE-NOTES.md +279 -0
- procesio_cli/tools/procesio/PROCESIO-NODE-MODULE-WHITELIST.md +113 -0
- procesio_cli/tools/procesio/PROCESIO-PYTHON-ACTION-NOTES.md +165 -0
- procesio_cli/tools/procesio/PROCESIO-QUERY-STORE-NOTES.md +826 -0
- procesio_cli/tools/procesio/PROCESIO-RECONCILIATION-PATTERNS.md +104 -0
- procesio_cli/tools/procesio/PROCESIO-RESOURCE-MODEL-NOTES.md +1100 -0
- procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-CRED-OPTIONALITY.md +45 -0
- procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-NOTES.md +252 -0
- procesio_cli/tools/procesio/PROCESIO-SQL-ACTIONS-NOTES.md +284 -0
- procesio_cli/tools/procesio/PROCESIO-USAGE-GUIDE.md +219 -0
- procesio_cli/tools/procesio/README.md +341 -0
- procesio_cli/tools/procesio/SCHEDULE-INPUT-SECURITY-NOTES.md +63 -0
- procesio_cli/tools/procesio/SKILL.md +694 -0
- procesio_cli/tools/procesio/__init__.py +1 -0
- procesio_cli/tools/procesio/actiondef.py +27 -0
- procesio_cli/tools/procesio/assets/html2docx/html2docx.js +2155 -0
- procesio_cli/tools/procesio/auth.py +354 -0
- procesio_cli/tools/procesio/autogen.py +121 -0
- procesio_cli/tools/procesio/client.py +355 -0
- procesio_cli/tools/procesio/config.py +96 -0
- procesio_cli/tools/procesio/data/endpoints.json +2901 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/01-authentication.md +180 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/02-conventions.md +116 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/ANONYMOUS-SURFACE.md +51 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/README.md +104 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/SYMBOL-INDEX.md +444 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/03-auth-users-workspaces.md +731 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/04-processes.md +913 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/05-actions.md +605 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/06-files.md +237 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/07-forms-documents.md +985 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/08-credentials.md +532 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/09-datastore-datatypes.md +830 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/10-custom-urls.md +319 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/11-subscriptions-resources-analytics.md +455 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/12-webhooks-notifications-misc.md +519 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/13-realtime-signalr.md +153 -0
- procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/99-internal-and-other-services.md +52 -0
- procesio_cli/tools/procesio/docs_info/FormBuilder mock.ts +5725 -0
- procesio_cli/tools/procesio/docs_info/Procesio Platform Actions.json +30219 -0
- procesio_cli/tools/procesio/docs_info/form-config-enums.ts +92 -0
- procesio_cli/tools/procesio/docs_info/form-theme.ts +1603 -0
- procesio_cli/tools/procesio/docs_info/process-validation-reference-1.md +2739 -0
- procesio_cli/tools/procesio/dto/__init__.py +13 -0
- procesio_cli/tools/procesio/dto/credential/builder.py +179 -0
- procesio_cli/tools/procesio/dto/credential/config.schema.json +19 -0
- procesio_cli/tools/procesio/dto/credential/description.md +193 -0
- procesio_cli/tools/procesio/dto/credential/fixtures/rest.config.json +11 -0
- procesio_cli/tools/procesio/dto/credential/fixtures/rest.dto.json +28 -0
- procesio_cli/tools/procesio/dto/credential/fixtures/rest.template.json +44 -0
- procesio_cli/tools/procesio/dto/credential/template.dto.json +16 -0
- procesio_cli/tools/procesio/dto/data/_refresh.py +147 -0
- procesio_cli/tools/procesio/dto/data/action_catalog.json +30825 -0
- procesio_cli/tools/procesio/dto/data/action_families.json +55 -0
- procesio_cli/tools/procesio/dto/data/platform_types.json +182 -0
- procesio_cli/tools/procesio/dto/datatype/builder.py +223 -0
- procesio_cli/tools/procesio/dto/datatype/config.schema.json +47 -0
- procesio_cli/tools/procesio/dto/datatype/description.md +85 -0
- procesio_cli/tools/procesio/dto/datatype/fixtures/customer.config.json +41 -0
- procesio_cli/tools/procesio/dto/datatype/fixtures/customer.dto.json +164 -0
- procesio_cli/tools/procesio/dto/datatype/template.dto.json +37 -0
- procesio_cli/tools/procesio/dto/document/builder.py +193 -0
- procesio_cli/tools/procesio/dto/document/config.schema.json +33 -0
- procesio_cli/tools/procesio/dto/document/description.md +124 -0
- procesio_cli/tools/procesio/dto/document/fixtures/invoice.config.json +16 -0
- procesio_cli/tools/procesio/dto/document/fixtures/invoice.dto.json +32 -0
- procesio_cli/tools/procesio/dto/document/template.dto.json +14 -0
- procesio_cli/tools/procesio/dto/form/FORM-STYLING-NOTES.md +142 -0
- procesio_cli/tools/procesio/dto/form/GOLDEN-DRIFT-NOTES.md +72 -0
- procesio_cli/tools/procesio/dto/form/RUN-PROCESS-RESULT-NOTES.md +80 -0
- procesio_cli/tools/procesio/dto/form/addelement.py +277 -0
- procesio_cli/tools/procesio/dto/form/builder.py +1009 -0
- procesio_cli/tools/procesio/dto/form/capture_goldens.py +106 -0
- procesio_cli/tools/procesio/dto/form/code_cipher.py +67 -0
- procesio_cli/tools/procesio/dto/form/config.schema.json +76 -0
- procesio_cli/tools/procesio/dto/form/data_shell.json +1 -0
- procesio_cli/tools/procesio/dto/form/description.md +346 -0
- procesio_cli/tools/procesio/dto/form/elements/approval.json +259 -0
- procesio_cli/tools/procesio/dto/form/elements/assignee.json +137 -0
- procesio_cli/tools/procesio/dto/form/elements/button.json +125 -0
- procesio_cli/tools/procesio/dto/form/elements/chart.json +341 -0
- procesio_cli/tools/procesio/dto/form/elements/chat.json +199 -0
- procesio_cli/tools/procesio/dto/form/elements/checkbox.json +153 -0
- procesio_cli/tools/procesio/dto/form/elements/column.json +77 -0
- procesio_cli/tools/procesio/dto/form/elements/columns.json +78 -0
- procesio_cli/tools/procesio/dto/form/elements/datetime-input.json +304 -0
- procesio_cli/tools/procesio/dto/form/elements/divider.json +54 -0
- procesio_cli/tools/procesio/dto/form/elements/dropdown.json +130 -0
- procesio_cli/tools/procesio/dto/form/elements/dynamic-table-row.json +253 -0
- procesio_cli/tools/procesio/dto/form/elements/file-upload.json +196 -0
- procesio_cli/tools/procesio/dto/form/elements/file-viewer.json +169 -0
- procesio_cli/tools/procesio/dto/form/elements/heading.json +79 -0
- procesio_cli/tools/procesio/dto/form/elements/icon.json +107 -0
- procesio_cli/tools/procesio/dto/form/elements/image.json +174 -0
- procesio_cli/tools/procesio/dto/form/elements/input.json +206 -0
- procesio_cli/tools/procesio/dto/form/elements/list.json +202 -0
- procesio_cli/tools/procesio/dto/form/elements/number-input.json +202 -0
- procesio_cli/tools/procesio/dto/form/elements/paragraph.json +79 -0
- procesio_cli/tools/procesio/dto/form/elements/radiobox.json +174 -0
- procesio_cli/tools/procesio/dto/form/elements/section.json +114 -0
- procesio_cli/tools/procesio/dto/form/elements/select.json +217 -0
- procesio_cli/tools/procesio/dto/form/elements/side-panel.json +146 -0
- procesio_cli/tools/procesio/dto/form/elements/signature-pad.json +141 -0
- procesio_cli/tools/procesio/dto/form/elements/static-table-row.json +84 -0
- procesio_cli/tools/procesio/dto/form/elements/step.json +105 -0
- procesio_cli/tools/procesio/dto/form/elements/stepper.json +126 -0
- procesio_cli/tools/procesio/dto/form/elements/tab.json +77 -0
- procesio_cli/tools/procesio/dto/form/elements/table.json +279 -0
- procesio_cli/tools/procesio/dto/form/elements/tabs.json +114 -0
- procesio_cli/tools/procesio/dto/form/elements/textarea.json +213 -0
- procesio_cli/tools/procesio/dto/form/enum_map.json +68 -0
- procesio_cli/tools/procesio/dto/form/fieldpath.py +284 -0
- procesio_cli/tools/procesio/dto/form/fixtures/reg.config.json +32 -0
- procesio_cli/tools/procesio/dto/form/fixtures/reg.elements.json +638 -0
- procesio_cli/tools/procesio/dto/form/sync_from_mock.py +386 -0
- procesio_cli/tools/procesio/dto/framework.py +125 -0
- procesio_cli/tools/procesio/dto/process/builder.py +1991 -0
- procesio_cli/tools/procesio/dto/process/config.schema.json +159 -0
- procesio_cli/tools/procesio/dto/process/description.md +218 -0
- procesio_cli/tools/procesio/dto/process/fixtures/greet.config.json +32 -0
- procesio_cli/tools/procesio/dto/process/fixtures/greet.dto.json +317 -0
- procesio_cli/tools/procesio/dto/process/naming.py +305 -0
- procesio_cli/tools/procesio/dto/process/normalize.py +74 -0
- procesio_cli/tools/procesio/dto/process/template.dto.json +32 -0
- procesio_cli/tools/procesio/dto/refdata.py +87 -0
- procesio_cli/tools/procesio/dto/registry.py +27 -0
- procesio_cli/tools/procesio/dto/webhook/builder.py +142 -0
- procesio_cli/tools/procesio/dto/webhook/config.schema.json +25 -0
- procesio_cli/tools/procesio/dto/webhook/description.md +92 -0
- procesio_cli/tools/procesio/dto/webhook/fixtures/order.config.json +10 -0
- procesio_cli/tools/procesio/dto/webhook/fixtures/order.dto.json +25 -0
- procesio_cli/tools/procesio/dto/webhook/template.dto.json +14 -0
- procesio_cli/tools/procesio/environments.py +264 -0
- procesio_cli/tools/procesio/errors.py +166 -0
- procesio_cli/tools/procesio/flowmodel/README.md +37 -0
- procesio_cli/tools/procesio/flowmodel/__init__.py +14 -0
- procesio_cli/tools/procesio/flowmodel/digest.py +223 -0
- procesio_cli/tools/procesio/flowmodel/families.py +34 -0
- procesio_cli/tools/procesio/flowmodel/fevalidation.py +1098 -0
- procesio_cli/tools/procesio/flowmodel/formdigest.py +232 -0
- procesio_cli/tools/procesio/flowmodel/inspect.py +78 -0
- procesio_cli/tools/procesio/flowmodel/model.py +82 -0
- procesio_cli/tools/procesio/flowmodel/nodeparam.py +871 -0
- procesio_cli/tools/procesio/flowmodel/reader.py +191 -0
- procesio_cli/tools/procesio/flowmodel/sqlparam.py +410 -0
- procesio_cli/tools/procesio/form_code_keys.py +50 -0
- procesio_cli/tools/procesio/formlint.py +292 -0
- procesio_cli/tools/procesio/gen_manifest.py +118 -0
- procesio_cli/tools/procesio/handlers/__init__.py +1 -0
- procesio_cli/tools/procesio/handlers/auth_actions.py +103 -0
- procesio_cli/tools/procesio/handlers/catalog.py +147 -0
- procesio_cli/tools/procesio/handlers/common.py +90 -0
- procesio_cli/tools/procesio/handlers/customaction_ops.py +146 -0
- procesio_cli/tools/procesio/handlers/datastore_ops.py +482 -0
- procesio_cli/tools/procesio/handlers/datatype_ops.py +275 -0
- procesio_cli/tools/procesio/handlers/dto_actions.py +258 -0
- procesio_cli/tools/procesio/handlers/environment_admin.py +146 -0
- procesio_cli/tools/procesio/handlers/fevalidate.py +236 -0
- procesio_cli/tools/procesio/handlers/files.py +141 -0
- procesio_cli/tools/procesio/handlers/flowgraph.py +229 -0
- procesio_cli/tools/procesio/handlers/flowlint.py +269 -0
- procesio_cli/tools/procesio/handlers/form_chains.py +336 -0
- procesio_cli/tools/procesio/handlers/form_code.py +277 -0
- procesio_cli/tools/procesio/handlers/form_element.py +199 -0
- procesio_cli/tools/procesio/handlers/form_events.py +441 -0
- procesio_cli/tools/procesio/handlers/form_update.py +270 -0
- procesio_cli/tools/procesio/handlers/formprocess.py +211 -0
- procesio_cli/tools/procesio/handlers/generic.py +135 -0
- procesio_cli/tools/procesio/handlers/layout.py +137 -0
- procesio_cli/tools/procesio/handlers/nodeparams.py +1018 -0
- procesio_cli/tools/procesio/handlers/process_layout.py +189 -0
- procesio_cli/tools/procesio/handlers/process_naming.py +213 -0
- procesio_cli/tools/procesio/handlers/processes.py +416 -0
- procesio_cli/tools/procesio/handlers/profile_admin.py +184 -0
- procesio_cli/tools/procesio/handlers/resource_ops.py +447 -0
- procesio_cli/tools/procesio/handlers/schedules.py +320 -0
- procesio_cli/tools/procesio/handlers/sqlactions.py +232 -0
- procesio_cli/tools/procesio/handlers/transport.py +463 -0
- procesio_cli/tools/procesio/handlers/usageguide.py +222 -0
- procesio_cli/tools/procesio/layout/README.md +196 -0
- procesio_cli/tools/procesio/layout/__init__.py +11 -0
- procesio_cli/tools/procesio/layout/adapter.py +736 -0
- procesio_cli/tools/procesio/layout/cycles.py +186 -0
- procesio_cli/tools/procesio/layout/dispatch.py +39 -0
- procesio_cli/tools/procesio/layout/elk/elk_runner.mjs +50 -0
- procesio_cli/tools/procesio/layout/elk/package-lock.json +21 -0
- procesio_cli/tools/procesio/layout/elk/package.json +11 -0
- procesio_cli/tools/procesio/layout/elk_engine.py +568 -0
- procesio_cli/tools/procesio/layout/engine.py +1311 -0
- procesio_cli/tools/procesio/layout/report.py +187 -0
- procesio_cli/tools/procesio/main.py +179 -0
- procesio_cli/tools/procesio/profiles.py +193 -0
- procesio_cli/tools/procesio/reliability.py +193 -0
- procesio_cli/tools/procesio/sqlformat.py +167 -0
- procesio_cli/tools/procesio/swagger.py +51 -0
- procesio_cli/tools/procesio/tests/__init__.py +0 -0
- procesio_cli/tools/procesio/tests/conftest.py +129 -0
- procesio_cli/tools/procesio/tests/test_auth.py +200 -0
- procesio_cli/tools/procesio/tests/test_autogen.py +78 -0
- procesio_cli/tools/procesio/tests/test_builder_attrpath_sqlbind.py +180 -0
- procesio_cli/tools/procesio/tests/test_builder_custom_action_catalog.py +72 -0
- procesio_cli/tools/procesio/tests/test_client.py +114 -0
- procesio_cli/tools/procesio/tests/test_client_reliability.py +139 -0
- procesio_cli/tools/procesio/tests/test_customaction.py +103 -0
- procesio_cli/tools/procesio/tests/test_customaction_test.py +80 -0
- procesio_cli/tools/procesio/tests/test_cycles.py +69 -0
- procesio_cli/tools/procesio/tests/test_datastore.py +378 -0
- procesio_cli/tools/procesio/tests/test_datastore_node.py +94 -0
- procesio_cli/tools/procesio/tests/test_dispatch.py +170 -0
- procesio_cli/tools/procesio/tests/test_document_page_size.py +19 -0
- procesio_cli/tools/procesio/tests/test_dto.py +734 -0
- procesio_cli/tools/procesio/tests/test_edit_dryrun_preview.py +96 -0
- procesio_cli/tools/procesio/tests/test_elk_layout.py +221 -0
- procesio_cli/tools/procesio/tests/test_environments.py +214 -0
- procesio_cli/tools/procesio/tests/test_fevalidate_gate.py +104 -0
- procesio_cli/tools/procesio/tests/test_fevalidation.py +317 -0
- procesio_cli/tools/procesio/tests/test_fieldpath_variables.py +87 -0
- procesio_cli/tools/procesio/tests/test_files.py +72 -0
- procesio_cli/tools/procesio/tests/test_flow_digest.py +202 -0
- procesio_cli/tools/procesio/tests/test_flowlint.py +114 -0
- procesio_cli/tools/procesio/tests/test_flowmodel.py +158 -0
- procesio_cli/tools/procesio/tests/test_form_add_element.py +256 -0
- procesio_cli/tools/procesio/tests/test_form_approval_gaps.py +319 -0
- procesio_cli/tools/procesio/tests/test_form_auto_names.py +60 -0
- procesio_cli/tools/procesio/tests/test_form_chains.py +217 -0
- procesio_cli/tools/procesio/tests/test_form_code_actions.py +188 -0
- procesio_cli/tools/procesio/tests/test_form_code_keys.py +92 -0
- procesio_cli/tools/procesio/tests/test_form_code_style.py +178 -0
- procesio_cli/tools/procesio/tests/test_form_delete_element.py +99 -0
- procesio_cli/tools/procesio/tests/test_form_element_config.py +141 -0
- procesio_cli/tools/procesio/tests/test_form_event_maps.py +135 -0
- procesio_cli/tools/procesio/tests/test_form_event_ops.py +376 -0
- procesio_cli/tools/procesio/tests/test_form_event_replace.py +86 -0
- procesio_cli/tools/procesio/tests/test_form_events.py +92 -0
- procesio_cli/tools/procesio/tests/test_form_parity.py +171 -0
- procesio_cli/tools/procesio/tests/test_form_select_source.py +74 -0
- procesio_cli/tools/procesio/tests/test_form_sync.py +35 -0
- procesio_cli/tools/procesio/tests/test_form_update.py +133 -0
- procesio_cli/tools/procesio/tests/test_formlint.py +155 -0
- procesio_cli/tools/procesio/tests/test_formlint_css_scope.py +38 -0
- procesio_cli/tools/procesio/tests/test_formlint_field_names.py +83 -0
- procesio_cli/tools/procesio/tests/test_guards.py +110 -0
- procesio_cli/tools/procesio/tests/test_hidden_setting_types.py +39 -0
- procesio_cli/tools/procesio/tests/test_html2docx_asset.py +132 -0
- procesio_cli/tools/procesio/tests/test_key_handle_terminology.py +45 -0
- procesio_cli/tools/procesio/tests/test_layout.py +574 -0
- procesio_cli/tools/procesio/tests/test_layout_report.py +88 -0
- procesio_cli/tools/procesio/tests/test_manifest_sync.py +68 -0
- procesio_cli/tools/procesio/tests/test_nodedelete.py +151 -0
- procesio_cli/tools/procesio/tests/test_nodeparam.py +826 -0
- procesio_cli/tools/procesio/tests/test_normalize.py +70 -0
- procesio_cli/tools/procesio/tests/test_payload_docs.py +86 -0
- procesio_cli/tools/procesio/tests/test_process_action_naming.py +170 -0
- procesio_cli/tools/procesio/tests/test_process_call_api_seed.py +46 -0
- procesio_cli/tools/procesio/tests/test_process_ext.py +373 -0
- procesio_cli/tools/procesio/tests/test_process_invariants.py +183 -0
- procesio_cli/tools/procesio/tests/test_process_layout.py +117 -0
- procesio_cli/tools/procesio/tests/test_process_naming.py +188 -0
- procesio_cli/tools/procesio/tests/test_process_query_store.py +172 -0
- procesio_cli/tools/procesio/tests/test_processinfo_variable.py +56 -0
- procesio_cli/tools/procesio/tests/test_profiles.py +127 -0
- procesio_cli/tools/procesio/tests/test_put_projects.py +41 -0
- procesio_cli/tools/procesio/tests/test_reliability.py +107 -0
- procesio_cli/tools/procesio/tests/test_removal_gate.py +95 -0
- procesio_cli/tools/procesio/tests/test_resource_ops.py +173 -0
- procesio_cli/tools/procesio/tests/test_save_validity.py +207 -0
- procesio_cli/tools/procesio/tests/test_schedule_cron_shape.py +111 -0
- procesio_cli/tools/procesio/tests/test_schedules.py +309 -0
- procesio_cli/tools/procesio/tests/test_sqlconvert.py +234 -0
- procesio_cli/tools/procesio/tests/test_sqlformat.py +83 -0
- procesio_cli/tools/procesio/tests/test_sqlparam.py +187 -0
- procesio_cli/tools/procesio/tests/test_superseded_actions.py +54 -0
- procesio_cli/tools/procesio/tests/test_surgical_concurrency.py +156 -0
- procesio_cli/tools/procesio/tests/test_tier4.py +123 -0
- procesio_cli/tools/procesio/tests/test_transport.py +147 -0
- procesio_cli/tools/procesio/tests/test_transport_data_stores.py +168 -0
- procesio_cli/tools/procesio/tests/test_transport_mapper_repair.py +150 -0
- procesio_cli/tools/procesio/tests/test_transport_webhook_strip.py +253 -0
- procesio_cli/tools/procesio/tests/test_usage_guide.py +96 -0
- procesio_cli/tools/procesio/tool.yaml +12486 -0
- procesio_cli/tools/sqlserver/MOVED-TO-CENTRAL.md +29 -0
- procesio_cli/tools/sqlserver/README.md +192 -0
- procesio_cli/tools/sqlserver/SKILL.md +37 -0
- procesio_cli/tools/sqlserver/SQLSERVER-SCHEMA-NOTES.md +284 -0
- procesio_cli/tools/sqlserver/__init__.py +0 -0
- procesio_cli/tools/sqlserver/connection.py +242 -0
- procesio_cli/tools/sqlserver/main.py +521 -0
- procesio_cli/tools/sqlserver/profiles.template.json +1 -0
- procesio_cli/tools/sqlserver/schema.py +600 -0
- procesio_cli/tools/sqlserver/tests/__init__.py +0 -0
- procesio_cli/tools/sqlserver/tests/conftest.py +21 -0
- procesio_cli/tools/sqlserver/tests/test_connection.py +75 -0
- procesio_cli/tools/sqlserver/tests/test_dbprofiles.py +92 -0
- procesio_cli/tools/sqlserver/tests/test_dbquery.py +220 -0
- procesio_cli/tools/sqlserver/tests/test_manifest_sync.py +68 -0
- procesio_cli/tools/sqlserver/tests/test_sqlserver.py +326 -0
- procesio_cli/tools/sqlserver/tests/test_sqlserver_schema.py +488 -0
- procesio_cli/tools/sqlserver/tool.yaml +123 -0
- procesio_cli/tools/web/README.md +381 -0
- procesio_cli/tools/web/SKILL.md +37 -0
- procesio_cli/tools/web/WEB-AUTOMATION-NOTES.md +277 -0
- procesio_cli/tools/web/__init__.py +21 -0
- procesio_cli/tools/web/actiondef.py +24 -0
- procesio_cli/tools/web/api.py +444 -0
- procesio_cli/tools/web/brokered.py +107 -0
- procesio_cli/tools/web/driver.py +839 -0
- procesio_cli/tools/web/drivercontract.py +44 -0
- procesio_cli/tools/web/errors.py +54 -0
- procesio_cli/tools/web/handlers/__init__.py +1 -0
- procesio_cli/tools/web/handlers/archive.py +367 -0
- procesio_cli/tools/web/handlers/browse.py +182 -0
- procesio_cli/tools/web/handlers/contacts.py +74 -0
- procesio_cli/tools/web/handlers/sessmgmt.py +120 -0
- procesio_cli/tools/web/main.py +128 -0
- procesio_cli/tools/web/sessions.py +253 -0
- procesio_cli/tools/web/steps.py +162 -0
- procesio_cli/tools/web/tests/__init__.py +0 -0
- procesio_cli/tools/web/tests/conftest.py +197 -0
- procesio_cli/tools/web/tests/test_api.py +330 -0
- procesio_cli/tools/web/tests/test_archive.py +190 -0
- procesio_cli/tools/web/tests/test_brokered.py +138 -0
- procesio_cli/tools/web/tests/test_dispatch.py +132 -0
- procesio_cli/tools/web/tests/test_errors.py +60 -0
- procesio_cli/tools/web/tests/test_manifest_sync.py +76 -0
- procesio_cli/tools/web/tests/test_page_contacts.py +68 -0
- procesio_cli/tools/web/tests/test_sessions.py +145 -0
- procesio_cli/tools/web/tests/test_steps.py +210 -0
- procesio_cli/tools/web/tool.yaml +184 -0
- procesio_cli/tools/xlsx/README.md +34 -0
- procesio_cli/tools/xlsx/SKILL.md +28 -0
- procesio_cli/tools/xlsx/__init__.py +0 -0
- procesio_cli/tools/xlsx/main.py +129 -0
- procesio_cli/tools/xlsx/reader.py +91 -0
- procesio_cli/tools/xlsx/tests/__init__.py +0 -0
- procesio_cli/tools/xlsx/tests/conftest.py +39 -0
- procesio_cli/tools/xlsx/tests/test_xlsx.py +103 -0
- procesio_cli/tools/xlsx/tool.yaml +30 -0
- procesio_cli/webplatform/aat_mcp/AAT-MCP-NOTES.md +244 -0
- procesio_cli/webplatform/aat_mcp/README.md +78 -0
- procesio_cli/webplatform/aat_mcp/bridge.py +705 -0
- procesio_cli/webplatform/aat_mcp/chat_server.py +194 -0
- procesio_cli/webplatform/aat_mcp/chat_surface.snapshot.json +668 -0
- procesio_cli/webplatform/aat_mcp/chat_surface.yaml +372 -0
- procesio_cli/webplatform/aat_mcp/gate.py +68 -0
- procesio_cli/webplatform/aat_mcp/http_server.py +139 -0
- procesio_cli/webplatform/aat_mcp/protocol.py +175 -0
- procesio_cli/webplatform/aat_mcp/server.py +306 -0
- procesio_cli/webplatform/aat_mcp/tests/conftest.py +8 -0
- procesio_cli/webplatform/aat_mcp/tests/test_aat_mcp.py +255 -0
- procesio_cli/webplatform/aat_mcp/tests/test_chat_surface.py +247 -0
- procesio_cli/webplatform/aat_mcp/tests/test_discovery.py +489 -0
- procesio_cli/webplatform/aat_mcp/tests/test_multiuser.py +86 -0
- procesio_cli/webplatform/aat_mcp/tests/test_progressive_discovery.py +89 -0
- procesio_cli/webplatform/aat_mcp/tests/test_protocol.py +180 -0
- procesio_cli/webplatform/aat_mcp/tests/test_skill_discovery.py +23 -0
- procesio_cli-0.1.1.dist-info/METADATA +467 -0
- procesio_cli-0.1.1.dist-info/RECORD +647 -0
- procesio_cli-0.1.1.dist-info/WHEEL +4 -0
- procesio_cli-0.1.1.dist-info/entry_points.txt +7 -0
- procesio_cli-0.1.1.dist-info/licenses/LICENSE +201 -0
- procesio_cli-0.1.1.dist-info/licenses/NOTICE +5 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
"""Engine-specific schema extraction + migration bits for the `mysql` tool.
|
|
2
|
+
|
|
3
|
+
Pairs with the engine-agnostic machinery in ``tools/_lib/dbschema.py``
|
|
4
|
+
(``write_mirror`` / ``diff_mirrors`` / ``discover_migrations`` / ``pending`` /
|
|
5
|
+
``danger_warnings`` / hashing). This module is the MySQL half: it knows how to
|
|
6
|
+
enumerate a database's objects via INFORMATION_SCHEMA, pull each object's full
|
|
7
|
+
DDL with ``SHOW CREATE ...``, maintain the ``__schema_migrations`` tracking
|
|
8
|
+
table, and apply a migration file's statements.
|
|
9
|
+
|
|
10
|
+
It takes a connection-like object (any DB-API conn whose ``cursor()`` yields a
|
|
11
|
+
DictCursor — i.e. ``fetchall()``/``fetchone()`` return ``dict`` rows). Tests
|
|
12
|
+
inject a fake; production uses ``tools.mysql.connection``.
|
|
13
|
+
|
|
14
|
+
MySQL is simpler than SQL Server here: ``SHOW CREATE TABLE/VIEW/PROCEDURE/
|
|
15
|
+
FUNCTION/TRIGGER`` and ``SHOW CREATE EVENT`` hand back the complete ``CREATE``
|
|
16
|
+
statement, so the mirror DDL is verbatim and no catalog reconstruction is needed.
|
|
17
|
+
|
|
18
|
+
DELIMITER caveat (documented limitation): MySQL stored-routine bodies that a
|
|
19
|
+
human authored with ``DELIMITER`` blocks cannot be naively split on ``;`` — the
|
|
20
|
+
body itself contains semicolons. ``apply_migration_sql`` therefore runs each
|
|
21
|
+
migration file as a SINGLE statement (no client-side ``;`` splitting and no
|
|
22
|
+
``DELIMITER`` handling). Author routine migrations as one ``CREATE PROCEDURE``/
|
|
23
|
+
``CREATE FUNCTION`` statement per file (no ``DELIMITER``); the driver accepts the
|
|
24
|
+
full body in one ``execute``. Multi-statement DDL files (several plain
|
|
25
|
+
statements separated by ``;``) are NOT supported in one file for the same reason
|
|
26
|
+
— keep one statement per migration file, or rely on the routine body being a
|
|
27
|
+
single statement. ``split_go_batches`` is SQL-Server-only and is NOT used here.
|
|
28
|
+
"""
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import time
|
|
32
|
+
from typing import Any
|
|
33
|
+
|
|
34
|
+
# Object-type "dir labels" used as the mirror's <Type> directory and as the
|
|
35
|
+
# user-facing --types vocabulary. Maps label -> the INFORMATION_SCHEMA source.
|
|
36
|
+
TYPE_LABELS = ("Tables", "Views", "Procedures", "Functions", "Triggers", "Events")
|
|
37
|
+
|
|
38
|
+
# --types accepts the singular engine letters (TABLE,VIEW,...) per the spec;
|
|
39
|
+
# map each to its dir label.
|
|
40
|
+
_FILTER_TO_LABEL = {
|
|
41
|
+
"TABLE": "Tables",
|
|
42
|
+
"VIEW": "Views",
|
|
43
|
+
"PROCEDURE": "Procedures",
|
|
44
|
+
"FUNCTION": "Functions",
|
|
45
|
+
"TRIGGER": "Triggers",
|
|
46
|
+
"EVENT": "Events",
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
MIGRATIONS_TABLE = "__schema_migrations"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# ---------------------------------------------------------------------------
|
|
53
|
+
# small cursor helpers (DictCursor-aware, tolerant of fake cursors)
|
|
54
|
+
# ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
def _rows(conn, sql: str, params=None) -> list[dict]:
|
|
57
|
+
cur = conn.cursor()
|
|
58
|
+
try:
|
|
59
|
+
if params:
|
|
60
|
+
cur.execute(sql, params)
|
|
61
|
+
else:
|
|
62
|
+
cur.execute(sql)
|
|
63
|
+
out = cur.fetchall()
|
|
64
|
+
return list(out) if out else []
|
|
65
|
+
finally:
|
|
66
|
+
_close(cur)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _one(conn, sql: str, params=None) -> dict | None:
|
|
70
|
+
cur = conn.cursor()
|
|
71
|
+
try:
|
|
72
|
+
if params:
|
|
73
|
+
cur.execute(sql, params)
|
|
74
|
+
else:
|
|
75
|
+
cur.execute(sql)
|
|
76
|
+
if hasattr(cur, "fetchone"):
|
|
77
|
+
row = cur.fetchone()
|
|
78
|
+
if row is not None:
|
|
79
|
+
return row
|
|
80
|
+
return None
|
|
81
|
+
rows = cur.fetchall()
|
|
82
|
+
return rows[0] if rows else None
|
|
83
|
+
finally:
|
|
84
|
+
_close(cur)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _close(cur) -> None:
|
|
88
|
+
try:
|
|
89
|
+
cur.close()
|
|
90
|
+
except Exception: # noqa: BLE001
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _create_value(row: dict | None, *keys: str) -> str:
|
|
95
|
+
"""SHOW CREATE returns a dict whose DDL column key varies by object type
|
|
96
|
+
(``Create Table`` / ``Create View`` / ``Create Procedure`` / ...). Triggers
|
|
97
|
+
in particular use ``SQL Original Statement``. Pull the first matching key;
|
|
98
|
+
fall back to the last non-name string column so we degrade gracefully on an
|
|
99
|
+
unexpected MySQL/MariaDB variant."""
|
|
100
|
+
if not row:
|
|
101
|
+
return ""
|
|
102
|
+
for k in keys:
|
|
103
|
+
if k in row and row[k] is not None:
|
|
104
|
+
return str(row[k])
|
|
105
|
+
# case-insensitive retry (MariaDB sometimes differs in casing)
|
|
106
|
+
lower = {str(k).lower(): v for k, v in row.items()}
|
|
107
|
+
for k in keys:
|
|
108
|
+
v = lower.get(k.lower())
|
|
109
|
+
if v is not None:
|
|
110
|
+
return str(v)
|
|
111
|
+
# last resort: the longest string value that is not the object name
|
|
112
|
+
candidates = [v for v in row.values() if isinstance(v, str)]
|
|
113
|
+
return max(candidates, key=len) if candidates else ""
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _current_database(conn) -> str:
|
|
117
|
+
row = _one(conn, "SELECT DATABASE() AS db")
|
|
118
|
+
if not row:
|
|
119
|
+
return ""
|
|
120
|
+
db = row.get("db") if isinstance(row, dict) else None
|
|
121
|
+
return str(db) if db else ""
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# ---------------------------------------------------------------------------
|
|
125
|
+
# extraction
|
|
126
|
+
# ---------------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
def extract_objects(conn, types=None) -> list[dict]:
|
|
129
|
+
"""Enumerate all objects in the connected database and return mirror records.
|
|
130
|
+
|
|
131
|
+
Each record is ``{"type", "schema", "name", "definition"}`` where ``type``
|
|
132
|
+
is a dir label (Tables/Views/Procedures/Functions/Triggers/Events),
|
|
133
|
+
``schema`` is the database name (or ""), ``name`` is the object name, and
|
|
134
|
+
``definition`` is the full ``SHOW CREATE`` text.
|
|
135
|
+
|
|
136
|
+
``types`` (optional) filters by the engine vocabulary
|
|
137
|
+
``TABLE,VIEW,PROCEDURE,FUNCTION,TRIGGER,EVENT`` (case-insensitive); each maps
|
|
138
|
+
to its dir label. ``None`` extracts everything.
|
|
139
|
+
"""
|
|
140
|
+
wanted = _wanted_labels(types)
|
|
141
|
+
db = _current_database(conn)
|
|
142
|
+
schema = db or ""
|
|
143
|
+
records: list[dict] = []
|
|
144
|
+
|
|
145
|
+
if "Tables" in wanted:
|
|
146
|
+
for name in _table_names(conn, db, "BASE TABLE"):
|
|
147
|
+
row = _one(conn, f"SHOW CREATE TABLE `{name}`")
|
|
148
|
+
ddl = _create_value(row, "Create Table")
|
|
149
|
+
records.append(_rec("Tables", schema, name, ddl))
|
|
150
|
+
|
|
151
|
+
if "Views" in wanted:
|
|
152
|
+
for name in _table_names(conn, db, "VIEW"):
|
|
153
|
+
row = _one(conn, f"SHOW CREATE VIEW `{name}`")
|
|
154
|
+
ddl = _create_value(row, "Create View")
|
|
155
|
+
records.append(_rec("Views", schema, name, ddl))
|
|
156
|
+
|
|
157
|
+
if "Procedures" in wanted:
|
|
158
|
+
for name in _routine_names(conn, db, "PROCEDURE"):
|
|
159
|
+
row = _one(conn, f"SHOW CREATE PROCEDURE `{name}`")
|
|
160
|
+
ddl = _create_value(row, "Create Procedure")
|
|
161
|
+
records.append(_rec("Procedures", schema, name, ddl))
|
|
162
|
+
|
|
163
|
+
if "Functions" in wanted:
|
|
164
|
+
for name in _routine_names(conn, db, "FUNCTION"):
|
|
165
|
+
row = _one(conn, f"SHOW CREATE FUNCTION `{name}`")
|
|
166
|
+
ddl = _create_value(row, "Create Function")
|
|
167
|
+
records.append(_rec("Functions", schema, name, ddl))
|
|
168
|
+
|
|
169
|
+
if "Triggers" in wanted:
|
|
170
|
+
for name in _trigger_names(conn, db):
|
|
171
|
+
row = _one(conn, f"SHOW CREATE TRIGGER `{name}`")
|
|
172
|
+
ddl = _create_value(row, "SQL Original Statement", "Statement")
|
|
173
|
+
records.append(_rec("Triggers", schema, name, ddl))
|
|
174
|
+
|
|
175
|
+
if "Events" in wanted:
|
|
176
|
+
for name in _event_names(conn, db):
|
|
177
|
+
row = _one(conn, f"SHOW CREATE EVENT `{name}`")
|
|
178
|
+
ddl = _create_value(row, "Create Event")
|
|
179
|
+
records.append(_rec("Events", schema, name, ddl))
|
|
180
|
+
|
|
181
|
+
return records
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _wanted_labels(types) -> set[str]:
|
|
185
|
+
if not types:
|
|
186
|
+
return set(TYPE_LABELS)
|
|
187
|
+
if isinstance(types, str):
|
|
188
|
+
tokens = [t for t in types.replace(",", " ").split() if t]
|
|
189
|
+
else:
|
|
190
|
+
tokens = list(types)
|
|
191
|
+
wanted: set[str] = set()
|
|
192
|
+
for tok in tokens:
|
|
193
|
+
key = str(tok).strip().upper().rstrip("S") # tolerate plural/singular
|
|
194
|
+
# restore exact known forms
|
|
195
|
+
for engine_key, label in _FILTER_TO_LABEL.items():
|
|
196
|
+
if engine_key == key or engine_key.rstrip("S") == key or label.upper().rstrip("S") == key:
|
|
197
|
+
wanted.add(label)
|
|
198
|
+
return wanted or set(TYPE_LABELS)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _rec(type_label: str, schema: str, name: str, definition: str) -> dict:
|
|
202
|
+
# Normalize line endings to LF so the mirror is stable across hosts.
|
|
203
|
+
text = (definition or "").replace("\r\n", "\n").replace("\r", "\n")
|
|
204
|
+
if text and not text.endswith("\n"):
|
|
205
|
+
text += "\n"
|
|
206
|
+
return {"type": type_label, "schema": schema, "name": str(name),
|
|
207
|
+
"definition": text}
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _table_names(conn, db: str, table_type: str) -> list[str]:
|
|
211
|
+
if db:
|
|
212
|
+
rows = _rows(
|
|
213
|
+
conn,
|
|
214
|
+
"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES "
|
|
215
|
+
"WHERE TABLE_SCHEMA = %s AND TABLE_TYPE = %s ORDER BY TABLE_NAME",
|
|
216
|
+
[db, table_type],
|
|
217
|
+
)
|
|
218
|
+
else:
|
|
219
|
+
rows = _rows(
|
|
220
|
+
conn,
|
|
221
|
+
"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES "
|
|
222
|
+
"WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE = %s ORDER BY TABLE_NAME",
|
|
223
|
+
[table_type],
|
|
224
|
+
)
|
|
225
|
+
return [str(r["TABLE_NAME"]) for r in rows if r.get("TABLE_NAME")]
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _routine_names(conn, db: str, routine_type: str) -> list[str]:
|
|
229
|
+
if db:
|
|
230
|
+
rows = _rows(
|
|
231
|
+
conn,
|
|
232
|
+
"SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES "
|
|
233
|
+
"WHERE ROUTINE_SCHEMA = %s AND ROUTINE_TYPE = %s ORDER BY ROUTINE_NAME",
|
|
234
|
+
[db, routine_type],
|
|
235
|
+
)
|
|
236
|
+
else:
|
|
237
|
+
rows = _rows(
|
|
238
|
+
conn,
|
|
239
|
+
"SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES "
|
|
240
|
+
"WHERE ROUTINE_SCHEMA = DATABASE() AND ROUTINE_TYPE = %s ORDER BY ROUTINE_NAME",
|
|
241
|
+
[routine_type],
|
|
242
|
+
)
|
|
243
|
+
return [str(r["ROUTINE_NAME"]) for r in rows if r.get("ROUTINE_NAME")]
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _trigger_names(conn, db: str) -> list[str]:
|
|
247
|
+
if db:
|
|
248
|
+
rows = _rows(
|
|
249
|
+
conn,
|
|
250
|
+
"SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS "
|
|
251
|
+
"WHERE TRIGGER_SCHEMA = %s ORDER BY TRIGGER_NAME",
|
|
252
|
+
[db],
|
|
253
|
+
)
|
|
254
|
+
else:
|
|
255
|
+
rows = _rows(
|
|
256
|
+
conn,
|
|
257
|
+
"SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS "
|
|
258
|
+
"WHERE TRIGGER_SCHEMA = DATABASE() ORDER BY TRIGGER_NAME",
|
|
259
|
+
)
|
|
260
|
+
return [str(r["TRIGGER_NAME"]) for r in rows if r.get("TRIGGER_NAME")]
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _event_names(conn, db: str) -> list[str]:
|
|
264
|
+
if db:
|
|
265
|
+
rows = _rows(
|
|
266
|
+
conn,
|
|
267
|
+
"SELECT EVENT_NAME FROM INFORMATION_SCHEMA.EVENTS "
|
|
268
|
+
"WHERE EVENT_SCHEMA = %s ORDER BY EVENT_NAME",
|
|
269
|
+
[db],
|
|
270
|
+
)
|
|
271
|
+
else:
|
|
272
|
+
rows = _rows(
|
|
273
|
+
conn,
|
|
274
|
+
"SELECT EVENT_NAME FROM INFORMATION_SCHEMA.EVENTS "
|
|
275
|
+
"WHERE EVENT_SCHEMA = DATABASE() ORDER BY EVENT_NAME",
|
|
276
|
+
)
|
|
277
|
+
return [str(r["EVENT_NAME"]) for r in rows if r.get("EVENT_NAME")]
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
# ---------------------------------------------------------------------------
|
|
281
|
+
# migration engine bits
|
|
282
|
+
# ---------------------------------------------------------------------------
|
|
283
|
+
|
|
284
|
+
CREATE_MIGRATIONS_TABLE = (
|
|
285
|
+
f"CREATE TABLE IF NOT EXISTS `{MIGRATIONS_TABLE}` (\n"
|
|
286
|
+
" migration_id VARCHAR(255) NOT NULL,\n"
|
|
287
|
+
" filename VARCHAR(512) NOT NULL,\n"
|
|
288
|
+
" sha256 CHAR(64) NOT NULL,\n"
|
|
289
|
+
" applied_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n"
|
|
290
|
+
" applied_by VARCHAR(255) NULL,\n"
|
|
291
|
+
" duration_ms BIGINT NULL,\n"
|
|
292
|
+
" notes TEXT NULL,\n"
|
|
293
|
+
" PRIMARY KEY (migration_id)\n"
|
|
294
|
+
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def ensure_migrations_table(conn) -> None:
|
|
299
|
+
"""Create the ``__schema_migrations`` tracking table if it does not exist."""
|
|
300
|
+
cur = conn.cursor()
|
|
301
|
+
try:
|
|
302
|
+
cur.execute(CREATE_MIGRATIONS_TABLE)
|
|
303
|
+
finally:
|
|
304
|
+
_close(cur)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def tracking_table_exists(conn) -> bool:
|
|
308
|
+
"""Read-only: does the tracking table exist in the current database?"""
|
|
309
|
+
rows = _rows(
|
|
310
|
+
conn,
|
|
311
|
+
"SELECT 1 AS x FROM information_schema.tables "
|
|
312
|
+
f"WHERE table_schema = DATABASE() AND table_name = '{MIGRATIONS_TABLE}' LIMIT 1",
|
|
313
|
+
)
|
|
314
|
+
return bool(rows)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def fetch_applied(conn) -> dict[str, dict]:
|
|
318
|
+
"""Return ``{migration_id: {"sha256", "filename", "applied_at"}}`` from the
|
|
319
|
+
tracking table. READ-ONLY: returns {} if the table does not exist yet (only
|
|
320
|
+
``apply`` creates it)."""
|
|
321
|
+
if not tracking_table_exists(conn):
|
|
322
|
+
return {}
|
|
323
|
+
rows = _rows(
|
|
324
|
+
conn,
|
|
325
|
+
f"SELECT migration_id, filename, sha256, applied_at "
|
|
326
|
+
f"FROM `{MIGRATIONS_TABLE}` ORDER BY migration_id",
|
|
327
|
+
)
|
|
328
|
+
out: dict[str, dict] = {}
|
|
329
|
+
for r in rows:
|
|
330
|
+
mid = r.get("migration_id")
|
|
331
|
+
if mid is None:
|
|
332
|
+
continue
|
|
333
|
+
applied_at = r.get("applied_at")
|
|
334
|
+
out[str(mid)] = {
|
|
335
|
+
"sha256": str(r.get("sha256") or ""),
|
|
336
|
+
"filename": str(r.get("filename") or ""),
|
|
337
|
+
"applied_at": applied_at.isoformat() if hasattr(applied_at, "isoformat")
|
|
338
|
+
else (str(applied_at) if applied_at is not None else None),
|
|
339
|
+
}
|
|
340
|
+
return out
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def record_applied(conn, mig_id: str, filename: str, sha: str,
|
|
344
|
+
duration_ms: int, applied_by: str | None = None,
|
|
345
|
+
notes: str | None = None) -> None:
|
|
346
|
+
"""Insert a tracking row for a successfully-applied migration."""
|
|
347
|
+
cur = conn.cursor()
|
|
348
|
+
try:
|
|
349
|
+
cur.execute(
|
|
350
|
+
f"INSERT INTO `{MIGRATIONS_TABLE}` "
|
|
351
|
+
f"(migration_id, filename, sha256, applied_by, duration_ms, notes) "
|
|
352
|
+
f"VALUES (%s, %s, %s, %s, %s, %s)",
|
|
353
|
+
[mig_id, filename, sha, applied_by, int(duration_ms), notes],
|
|
354
|
+
)
|
|
355
|
+
finally:
|
|
356
|
+
_close(cur)
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def apply_migration_sql(conn, sql: str) -> int:
|
|
360
|
+
"""Execute a migration file's SQL inside an explicit transaction and return
|
|
361
|
+
elapsed milliseconds.
|
|
362
|
+
|
|
363
|
+
Our ``connect()`` uses ``autocommit=True``, so we open an explicit
|
|
364
|
+
transaction (``conn.begin()`` / ``conn.commit()``, falling back to raw
|
|
365
|
+
``BEGIN``/``COMMIT`` for fakes) and run the file's SQL as a SINGLE statement
|
|
366
|
+
— see the module docstring's DELIMITER caveat: routine bodies and
|
|
367
|
+
multi-statement ``;``-separated files are NOT client-side-split.
|
|
368
|
+
"""
|
|
369
|
+
start = time.perf_counter()
|
|
370
|
+
_begin(conn)
|
|
371
|
+
try:
|
|
372
|
+
cur = conn.cursor()
|
|
373
|
+
try:
|
|
374
|
+
cur.execute(sql)
|
|
375
|
+
finally:
|
|
376
|
+
_close(cur)
|
|
377
|
+
_commit(conn)
|
|
378
|
+
except Exception:
|
|
379
|
+
_rollback(conn)
|
|
380
|
+
raise
|
|
381
|
+
return int((time.perf_counter() - start) * 1000)
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def apply_migration_dry_run(conn, sql: str) -> int:
|
|
385
|
+
"""Run a migration's SQL inside a transaction that is ALWAYS rolled back,
|
|
386
|
+
validating it executes without persisting. Returns elapsed milliseconds.
|
|
387
|
+
Re-raises on a SQL error so the caller can stop on the first failure."""
|
|
388
|
+
start = time.perf_counter()
|
|
389
|
+
_begin(conn)
|
|
390
|
+
try:
|
|
391
|
+
cur = conn.cursor()
|
|
392
|
+
try:
|
|
393
|
+
cur.execute(sql)
|
|
394
|
+
finally:
|
|
395
|
+
_close(cur)
|
|
396
|
+
finally:
|
|
397
|
+
_rollback(conn)
|
|
398
|
+
return int((time.perf_counter() - start) * 1000)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def _begin(conn) -> None:
|
|
402
|
+
if hasattr(conn, "begin"):
|
|
403
|
+
conn.begin()
|
|
404
|
+
else: # pragma: no cover - fakes provide begin(); real pymysql conn has it
|
|
405
|
+
cur = conn.cursor()
|
|
406
|
+
try:
|
|
407
|
+
cur.execute("BEGIN")
|
|
408
|
+
finally:
|
|
409
|
+
_close(cur)
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def _commit(conn) -> None:
|
|
413
|
+
if hasattr(conn, "commit"):
|
|
414
|
+
conn.commit()
|
|
415
|
+
else: # pragma: no cover
|
|
416
|
+
cur = conn.cursor()
|
|
417
|
+
try:
|
|
418
|
+
cur.execute("COMMIT")
|
|
419
|
+
finally:
|
|
420
|
+
_close(cur)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def _rollback(conn) -> None:
|
|
424
|
+
try:
|
|
425
|
+
if hasattr(conn, "rollback"):
|
|
426
|
+
conn.rollback()
|
|
427
|
+
else: # pragma: no cover
|
|
428
|
+
cur = conn.cursor()
|
|
429
|
+
try:
|
|
430
|
+
cur.execute("ROLLBACK")
|
|
431
|
+
finally:
|
|
432
|
+
_close(cur)
|
|
433
|
+
except Exception: # noqa: BLE001
|
|
434
|
+
pass
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Put the framework root on sys.path so `from tools...` imports work."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
# pymysql is an OPTIONAL dependency (the MySQL driver), so a plain install does not
|
|
9
|
+
# have it. These tests then FAIL, which reads as a broken repository rather
|
|
10
|
+
# than as an extra nobody asked for. Skip instead, with the reason visible.
|
|
11
|
+
#
|
|
12
|
+
# exc_type matters: pytest 9 skips only on ModuleNotFoundError by default,
|
|
13
|
+
# and a package can be installed yet unimportable - pymysql on a runner
|
|
14
|
+
# without its native library raises a plain ImportError, which would
|
|
15
|
+
# otherwise re-raise and take collection down instead of skipping.
|
|
16
|
+
pytest.importorskip('pymysql', reason="install the extra that provides pymysql",
|
|
17
|
+
exc_type=ImportError)
|
|
18
|
+
|
|
19
|
+
FRAMEWORK_ROOT = Path(__file__).resolve().parents[3]
|
|
20
|
+
if str(FRAMEWORK_ROOT) not in sys.path:
|
|
21
|
+
sys.path.insert(0, str(FRAMEWORK_ROOT))
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Guard: tool.yaml declares exactly the actions the dispatcher registers, and
|
|
2
|
+
every declared arg matches the action's argparse (both directions), with
|
|
3
|
+
argparse-required flags marked required in the manifest."""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from tools._lib.manifest import load_tool
|
|
10
|
+
from tools.mysql import main
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _manifest():
|
|
14
|
+
tool_root = Path(main.__file__).resolve().parent
|
|
15
|
+
return load_tool(tool_root / "tool.yaml")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_manifest_actions_match_dispatch():
|
|
19
|
+
m = _manifest()
|
|
20
|
+
manifest_actions = set(m.action_names())
|
|
21
|
+
dispatch_actions = set(main.ACTIONS)
|
|
22
|
+
assert manifest_actions == dispatch_actions, (
|
|
23
|
+
f"only in manifest: {manifest_actions - dispatch_actions}; "
|
|
24
|
+
f"only in code: {dispatch_actions - manifest_actions}"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_manifest_args_match_argparse():
|
|
29
|
+
m = _manifest()
|
|
30
|
+
for name, defn in main.ACTIONS.items():
|
|
31
|
+
parser = argparse.ArgumentParser()
|
|
32
|
+
defn.add_args(parser)
|
|
33
|
+
argparse_names = set()
|
|
34
|
+
for action in parser._actions:
|
|
35
|
+
for opt in action.option_strings:
|
|
36
|
+
if opt.startswith("--") and opt != "--help":
|
|
37
|
+
argparse_names.add(opt[2:])
|
|
38
|
+
spec = m.get_action(name)
|
|
39
|
+
manifest_names = {a.name for a in spec.args}
|
|
40
|
+
assert manifest_names == argparse_names, (
|
|
41
|
+
f"action {name}: only in manifest {manifest_names - argparse_names}; "
|
|
42
|
+
f"only in argparse {argparse_names - manifest_names}"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_required_args_marked_required_in_manifest():
|
|
47
|
+
m = _manifest()
|
|
48
|
+
for name, defn in main.ACTIONS.items():
|
|
49
|
+
parser = argparse.ArgumentParser()
|
|
50
|
+
defn.add_args(parser)
|
|
51
|
+
argparse_names = set()
|
|
52
|
+
required_argparse = set()
|
|
53
|
+
for action in parser._actions:
|
|
54
|
+
for opt in action.option_strings:
|
|
55
|
+
if opt.startswith("--") and opt != "--help":
|
|
56
|
+
argparse_names.add(opt[2:])
|
|
57
|
+
if getattr(action, "required", False):
|
|
58
|
+
required_argparse.add(opt[2:])
|
|
59
|
+
spec = m.get_action(name)
|
|
60
|
+
required_manifest = {a.name for a in spec.args if a.required}
|
|
61
|
+
assert required_argparse <= required_manifest, (
|
|
62
|
+
f"action {name}: argparse-required but not manifest-required: "
|
|
63
|
+
f"{required_argparse - required_manifest}"
|
|
64
|
+
)
|
|
65
|
+
assert required_manifest <= argparse_names, (
|
|
66
|
+
f"action {name}: manifest-required but not an argparse flag: "
|
|
67
|
+
f"{required_manifest - argparse_names}"
|
|
68
|
+
)
|