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