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