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,240 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import importlib.util
|
|
5
|
+
import json
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
import yaml
|
|
11
|
+
|
|
12
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
13
|
+
SKILL_ROOT = ROOT / "skills" / "agent-skill-engineer"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _load(name: str, path: Path):
|
|
17
|
+
spec = importlib.util.spec_from_file_location(name, path)
|
|
18
|
+
assert spec and spec.loader
|
|
19
|
+
module = importlib.util.module_from_spec(spec)
|
|
20
|
+
sys.modules[name] = module
|
|
21
|
+
spec.loader.exec_module(module)
|
|
22
|
+
return module
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
SCAFFOLD = _load(
|
|
26
|
+
"agent_skill_scaffold",
|
|
27
|
+
SKILL_ROOT / "scripts" / "scaffold_skill.py",
|
|
28
|
+
)
|
|
29
|
+
AUDIT = _load(
|
|
30
|
+
"agent_skill_audit",
|
|
31
|
+
SKILL_ROOT / "scripts" / "audit_skill.py",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _frontmatter(path: Path) -> dict:
|
|
36
|
+
lines = path.read_text(encoding="utf-8").splitlines()
|
|
37
|
+
end = lines[1:].index("---") + 1
|
|
38
|
+
value = yaml.safe_load("\n".join(lines[1:end]))
|
|
39
|
+
assert isinstance(value, dict)
|
|
40
|
+
return value
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _governed_skill_mds() -> list[Path]:
|
|
44
|
+
"""Skill manuals that opt into the governance/eval discipline (the
|
|
45
|
+
`source_policy` marker). The strict audit and the fixed-rubric contract apply
|
|
46
|
+
to the governed portfolio; a fuller tree (AAT) also hosts imported/portable
|
|
47
|
+
skills that never signed up for them. In procesio-cli, whose skills/ IS the
|
|
48
|
+
portfolio, this is every skill."""
|
|
49
|
+
out: list[Path] = []
|
|
50
|
+
for skill_md in sorted((ROOT / "skills").glob("*/SKILL.md")):
|
|
51
|
+
if skill_md.parent.name.startswith("_") or skill_md.parent.name == "tests":
|
|
52
|
+
continue
|
|
53
|
+
try:
|
|
54
|
+
frontmatter = _frontmatter(skill_md)
|
|
55
|
+
except Exception: # noqa: BLE001 - a broken skill is validate-skills' job
|
|
56
|
+
continue
|
|
57
|
+
if frontmatter.get("source_policy"):
|
|
58
|
+
out.append(skill_md)
|
|
59
|
+
return out
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_meta_skill_passes_its_deterministic_audit():
|
|
63
|
+
report = AUDIT.audit_skill(SKILL_ROOT)
|
|
64
|
+
|
|
65
|
+
assert report["passed"] is True
|
|
66
|
+
assert report["errors"] == 0
|
|
67
|
+
assert report["warnings"] == 0
|
|
68
|
+
assert report["quality_score"] == 100
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@pytest.mark.parametrize("skill_md", _governed_skill_mds(),
|
|
72
|
+
ids=lambda path: path.parent.name)
|
|
73
|
+
def test_every_published_skill_passes_strict_audit(skill_md):
|
|
74
|
+
report = AUDIT.audit_skill(skill_md.parent)
|
|
75
|
+
assert report["errors"] == 0, report["findings"]
|
|
76
|
+
assert report["warnings"] == 0, report["findings"]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@pytest.mark.parametrize("category", ["references", "scripts", "assets"])
|
|
80
|
+
def test_audit_resolves_category_paths_from_skill_root(tmp_path, category):
|
|
81
|
+
root = tmp_path / "demo"
|
|
82
|
+
source = root / "references" / "context.md"
|
|
83
|
+
target = root / category / "example.txt"
|
|
84
|
+
source.parent.mkdir(parents=True)
|
|
85
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
86
|
+
target.write_text("example", encoding="utf-8")
|
|
87
|
+
source.write_text(f"Read `{category}/example.txt`.\n", encoding="utf-8")
|
|
88
|
+
|
|
89
|
+
assert AUDIT._candidate_reference(f"{category}/example.txt", source, root) == target.resolve()
|
|
90
|
+
findings = AUDIT._scan_links(root, [source])
|
|
91
|
+
assert not [item for item in findings if item.code == "missing-reference"]
|
|
92
|
+
assert not [item for item in findings if item.path == f"{category}/example.txt"]
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@pytest.mark.parametrize("raw,code", [
|
|
96
|
+
("scripts/missing.sql", "missing-reference"),
|
|
97
|
+
("../outside.md", "unsafe-reference"),
|
|
98
|
+
("scripts/../../outside.md", "unsafe-reference"),
|
|
99
|
+
])
|
|
100
|
+
def test_audit_resource_resolution_still_rejects_invalid_paths(tmp_path, raw, code):
|
|
101
|
+
root = tmp_path / "demo"
|
|
102
|
+
source = root / "references" / "context.md"
|
|
103
|
+
source.parent.mkdir(parents=True)
|
|
104
|
+
source.write_text(f"[resource]({raw})\n", encoding="utf-8")
|
|
105
|
+
assert code in {item.code for item in AUDIT._scan_links(root, [source])}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_audit_resource_resolution_rejects_symlink_escape(tmp_path):
|
|
109
|
+
root = tmp_path / "demo"
|
|
110
|
+
source = root / "references" / "context.md"
|
|
111
|
+
source.parent.mkdir(parents=True)
|
|
112
|
+
(root / "scripts").mkdir()
|
|
113
|
+
outside = tmp_path / "outside.sql"
|
|
114
|
+
outside.write_text("SELECT 1;", encoding="utf-8")
|
|
115
|
+
try:
|
|
116
|
+
(root / "scripts" / "export.sql").symlink_to(outside)
|
|
117
|
+
except OSError:
|
|
118
|
+
pytest.skip("symlink creation unavailable on this platform")
|
|
119
|
+
source.write_text("Read `scripts/export.sql`.\n", encoding="utf-8")
|
|
120
|
+
assert "unsafe-reference" in {item.code for item in AUDIT._scan_links(root, [source])}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def test_scaffold_is_path_confined_governed_and_no_overwrite(tmp_path):
|
|
124
|
+
parser = SCAFFOLD._parser()
|
|
125
|
+
args = parser.parse_args(
|
|
126
|
+
[
|
|
127
|
+
"incident-triage",
|
|
128
|
+
"--root",
|
|
129
|
+
str(tmp_path),
|
|
130
|
+
"--description",
|
|
131
|
+
"Triage recurring incidents. Use when an incident report needs a bounded diagnostic workflow.",
|
|
132
|
+
"--profile",
|
|
133
|
+
"governed",
|
|
134
|
+
"--owner",
|
|
135
|
+
"platform team",
|
|
136
|
+
"--baseline-version",
|
|
137
|
+
"abc123",
|
|
138
|
+
"--trigger",
|
|
139
|
+
"triage a recurring production incident",
|
|
140
|
+
]
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
result = SCAFFOLD.scaffold(args)
|
|
144
|
+
target = tmp_path / "incident-triage"
|
|
145
|
+
|
|
146
|
+
assert result["created"] is True
|
|
147
|
+
assert (target / "SKILL.md").is_file()
|
|
148
|
+
assert (target / "evals" / "evals.json").is_file()
|
|
149
|
+
frontmatter = _frontmatter(target / "SKILL.md")
|
|
150
|
+
assert frontmatter["name"] == "incident-triage"
|
|
151
|
+
assert frontmatter["owner"] == "platform team"
|
|
152
|
+
assert frontmatter["eval_suite"] == "evals/evals.json"
|
|
153
|
+
suite = json.loads((target / "evals" / "evals.json").read_text(encoding="utf-8"))
|
|
154
|
+
assert {case["kind"] for case in suite["cases"]} == {
|
|
155
|
+
"positive",
|
|
156
|
+
"negative",
|
|
157
|
+
"overlap",
|
|
158
|
+
"pressure",
|
|
159
|
+
}
|
|
160
|
+
assert suite["rubric_contract"] == "fixed-jury-rubric-v2"
|
|
161
|
+
|
|
162
|
+
with pytest.raises(FileExistsError, match="refusing to overwrite"):
|
|
163
|
+
SCAFFOLD.scaffold(args)
|
|
164
|
+
|
|
165
|
+
with pytest.raises(ValueError, match="lowercase"):
|
|
166
|
+
bad = argparse.Namespace(**{**vars(args), "name": "../escape"})
|
|
167
|
+
SCAFFOLD.scaffold(bad)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def test_audit_rejects_dynamic_jury_and_unsafe_reference(tmp_path):
|
|
171
|
+
root = tmp_path / "broken-skill"
|
|
172
|
+
(root / "evals").mkdir(parents=True)
|
|
173
|
+
(root / "SKILL.md").write_text(
|
|
174
|
+
"---\n"
|
|
175
|
+
"name: broken-skill\n"
|
|
176
|
+
"description: Use when auditing a broken example.\n"
|
|
177
|
+
"version: 1.0.0\n"
|
|
178
|
+
"owner: test\n"
|
|
179
|
+
"last_verified: 2026-09-04\n"
|
|
180
|
+
"baseline_version: abc\n"
|
|
181
|
+
"eval_suite: evals/evals.json\n"
|
|
182
|
+
"source_policy: stable\n"
|
|
183
|
+
"routing:\n triggers: [audit a broken example]\n"
|
|
184
|
+
"---\n\n"
|
|
185
|
+
"# Broken\n\n"
|
|
186
|
+
"## Boundary\nBounded.\n\n"
|
|
187
|
+
"## Workflow\nRead [outside](../outside.md).\n\n"
|
|
188
|
+
"## Verification\nInspect the report.\n",
|
|
189
|
+
encoding="utf-8",
|
|
190
|
+
)
|
|
191
|
+
(root / "evals" / "evals.json").write_text(
|
|
192
|
+
json.dumps(
|
|
193
|
+
{
|
|
194
|
+
"skill_name": "broken-skill",
|
|
195
|
+
"evals": [
|
|
196
|
+
{
|
|
197
|
+
"id": "one",
|
|
198
|
+
"kind": "positive",
|
|
199
|
+
"prompt": "Do it",
|
|
200
|
+
"expected_output": "Be good and safe.",
|
|
201
|
+
}
|
|
202
|
+
],
|
|
203
|
+
}
|
|
204
|
+
),
|
|
205
|
+
encoding="utf-8",
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
report = AUDIT.audit_skill(root)
|
|
209
|
+
codes = {item["code"] for item in report["findings"]}
|
|
210
|
+
|
|
211
|
+
assert report["passed"] is False
|
|
212
|
+
assert "unsafe-reference" in codes
|
|
213
|
+
assert "dynamic-jury-rubric" in codes
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def test_every_published_skill_uses_fixed_atomic_eval_rubrics():
|
|
217
|
+
criterion_id = AUDIT.CRITERION_RE
|
|
218
|
+
case_kinds = AUDIT.CASE_KINDS
|
|
219
|
+
|
|
220
|
+
for skill_md in _governed_skill_mds():
|
|
221
|
+
frontmatter = _frontmatter(skill_md)
|
|
222
|
+
suite_path = skill_md.parent / frontmatter["eval_suite"]
|
|
223
|
+
suite = json.loads(suite_path.read_text(encoding="utf-8"))
|
|
224
|
+
cases = suite["cases"]
|
|
225
|
+
|
|
226
|
+
assert suite["schema_version"] >= 2, skill_md.parent.name
|
|
227
|
+
assert suite["skill_name"] == frontmatter["name"]
|
|
228
|
+
assert suite["rubric_contract"] == "fixed-jury-rubric-v2"
|
|
229
|
+
assert {case["kind"] for case in cases} == case_kinds
|
|
230
|
+
|
|
231
|
+
for case in cases:
|
|
232
|
+
expected = case["expected_output"]
|
|
233
|
+
criteria = expected["criteria"]
|
|
234
|
+
ids = [entry["id"] for entry in criteria]
|
|
235
|
+
assert expected["rubric_version"] >= 1
|
|
236
|
+
assert 2 <= len(criteria) <= 8
|
|
237
|
+
assert len(ids) == len(set(ids))
|
|
238
|
+
assert all(criterion_id.fullmatch(item) for item in ids)
|
|
239
|
+
assert all(entry["description"].startswith("Pass only when") for entry in criteria)
|
|
240
|
+
assert all(isinstance(entry["required"], bool) for entry in criteria)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""The operational skill must not encourage endpoint exploration after auth fails."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
7
|
+
SKILL = ROOT / "skills" / "procesio-cli"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_credentials_playbook_stops_after_failed_check_auth():
|
|
11
|
+
text = (SKILL / "references" / "credentials-admin.md").read_text(encoding="utf-8")
|
|
12
|
+
lowered = text.lower()
|
|
13
|
+
assert "authentication hard stop" in lowered
|
|
14
|
+
assert "authenticated: false" in lowered
|
|
15
|
+
assert "stop all remote procesio calls" in lowered
|
|
16
|
+
assert "show-credential" in lowered
|
|
17
|
+
assert "key handle" in lowered and "api key value" in lowered
|
|
18
|
+
assert "configured but not confirmed" in lowered
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_main_skill_treats_failed_readiness_as_a_stop_condition():
|
|
22
|
+
text = (SKILL / "SKILL.md").read_text(encoding="utf-8").lower()
|
|
23
|
+
assert "authenticated: false" in text
|
|
24
|
+
assert "mode" in text
|
|
25
|
+
assert "stop" in text
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib.util
|
|
4
|
+
import json
|
|
5
|
+
import subprocess
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
SCRIPT = Path(__file__).resolve().parents[2] / "skills/procesio-platform-advisor/scripts/estimate_capacity.py"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def module():
|
|
15
|
+
spec = importlib.util.spec_from_file_location("capacity_estimator", SCRIPT)
|
|
16
|
+
value = importlib.util.module_from_spec(spec)
|
|
17
|
+
spec.loader.exec_module(value)
|
|
18
|
+
return value
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def payload():
|
|
22
|
+
return {"executions": 10000, "available_seconds": 3600,
|
|
23
|
+
"mean_active_compute_seconds": 2, "mean_occupied_seconds": 20,
|
|
24
|
+
"busy_interval_arrival_rate": 5, "safety_factor": 1.25}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_documented_example_requires_capacity_source_before_ee_conversion():
|
|
28
|
+
data = payload()
|
|
29
|
+
estimate = module().estimate(data)
|
|
30
|
+
assert estimate["compute_work_seconds"] == 20000
|
|
31
|
+
assert estimate["occupied_slot_seconds"] == 200000
|
|
32
|
+
assert estimate["average_occupied_slots"] == pytest.approx(55.55555556)
|
|
33
|
+
assert estimate["planned_slots"] == 125
|
|
34
|
+
assert estimate["slot_based_ee_lower_bound"] is None
|
|
35
|
+
data.update(verified_slots_per_ee=10, capacity_source="hypothetical example, not a product limit")
|
|
36
|
+
assert module().estimate(data)["slot_based_ee_lower_bound"] == 13
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.mark.parametrize("key,value", [
|
|
40
|
+
("executions", True), ("executions", 1.5), ("available_seconds", 0),
|
|
41
|
+
("mean_occupied_seconds", None), ("safety_factor", 0.5),
|
|
42
|
+
("mean_active_compute_seconds", float("nan")),
|
|
43
|
+
("busy_interval_arrival_rate", float("inf")), ("executions", -1),
|
|
44
|
+
])
|
|
45
|
+
def test_invalid_units_and_nonfinite_inputs_fail(key, value):
|
|
46
|
+
data = payload()
|
|
47
|
+
data[key] = value
|
|
48
|
+
with pytest.raises(ValueError):
|
|
49
|
+
module().estimate(data)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_unattributed_capacity_and_unknown_fields_fail():
|
|
53
|
+
with pytest.raises(ValueError):
|
|
54
|
+
module().estimate(dict(payload(), verified_slots_per_ee=10))
|
|
55
|
+
with pytest.raises(ValueError):
|
|
56
|
+
module().estimate(dict(payload(), slots_per_ee=10))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_zero_workload_and_occupied_wait_are_distinct():
|
|
60
|
+
assert module().estimate(dict(payload(), executions=0, busy_interval_arrival_rate=0))["planned_slots"] == 0
|
|
61
|
+
estimate = module().estimate(dict(payload(), mean_active_compute_seconds=0))
|
|
62
|
+
assert estimate["compute_work_seconds"] == 0
|
|
63
|
+
assert estimate["planned_slots"] == 125
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_overflow_is_a_validation_error():
|
|
67
|
+
with pytest.raises(ValueError):
|
|
68
|
+
module().estimate(dict(payload(), executions=10 ** 308, mean_occupied_seconds=10 ** 308))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# Explicit short ids: without them pytest derives the id from the param value, so
|
|
72
|
+
# the 65537-space case puts a 64 KB string into the PYTEST_CURRENT_TEST env var and
|
|
73
|
+
# Windows rejects it (env vars cap at 32767 chars). The content still reaches the CLI
|
|
74
|
+
# via a file, so the test behavior is unchanged.
|
|
75
|
+
@pytest.mark.parametrize("content,code", [("not json", 1), ("[]", 1), (" " * 65537, 1), (None, 0)],
|
|
76
|
+
ids=["not-json", "empty-array", "overlong-input", "valid"])
|
|
77
|
+
def test_real_cli_has_one_json_result_and_no_traceback(tmp_path, content, code):
|
|
78
|
+
source = tmp_path / "input.json"
|
|
79
|
+
source.write_text(json.dumps(payload()) if content is None else content)
|
|
80
|
+
result = subprocess.run([sys.executable, str(SCRIPT), "--input", str(source)],
|
|
81
|
+
capture_output=True, text=True)
|
|
82
|
+
assert result.returncode == code
|
|
83
|
+
response = json.loads(result.stdout)
|
|
84
|
+
assert ("error" in response) == bool(code)
|
|
85
|
+
assert not result.stderr
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Structural retention checks + frozen development cases, NOT behavioral uplift proof."""
|
|
2
|
+
import hashlib
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
8
|
+
REFS = ROOT / 'skills/procesio-cli/references'
|
|
9
|
+
CORPUS = ROOT / 'skills/evals/field-boundary-development-v1.json'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def text(name):
|
|
13
|
+
return ' '.join((REFS / name).read_text(encoding='utf-8').split())
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_development_cases_remain_frozen_and_separate():
|
|
17
|
+
assert hashlib.sha256(CORPUS.read_bytes()).hexdigest() == (
|
|
18
|
+
'bb0e22e34bdf262a72973958eed528aa470dc37c758c6197126fbbdd5ad72596'
|
|
19
|
+
)
|
|
20
|
+
suite = json.loads(CORPUS.read_text(encoding="utf-8"))
|
|
21
|
+
assert suite['evidence_role'] == 'development_only_not_holdout'
|
|
22
|
+
assert suite['rubric_contract'] == 'fixed-jury-rubric-v2'
|
|
23
|
+
cases = suite['cases']
|
|
24
|
+
ids = {c['id'] for c in cases}
|
|
25
|
+
assert len(cases) == len(ids) == 10
|
|
26
|
+
historical = json.loads((ROOT / 'skills/evals/behavioral.json').read_text(encoding="utf-8"))
|
|
27
|
+
assert not ids & {c['id'] for c in historical['cases']}
|
|
28
|
+
assert {'positive', 'pressure', 'negative', 'missing-context'} <= {c['kind'] for c in cases}
|
|
29
|
+
assert not re.search(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', CORPUS.read_text(encoding="utf-8"))
|
|
30
|
+
for case in cases:
|
|
31
|
+
assert (ROOT / 'skills' / case['expected_skill'] / 'SKILL.md').is_file()
|
|
32
|
+
rubric = case['expected_output']
|
|
33
|
+
assert rubric['rubric_version'] == 1
|
|
34
|
+
criteria = rubric['criteria']
|
|
35
|
+
assert 2 <= len(criteria) <= 8
|
|
36
|
+
assert len({c['id'] for c in criteria}) == len(criteria)
|
|
37
|
+
for c in criteria:
|
|
38
|
+
assert re.fullmatch(r'[a-z][a-z0-9]*(?:_[a-z0-9]+)+', c['id'])
|
|
39
|
+
assert c['required'] is True
|
|
40
|
+
assert c['description'].startswith('Pass only when')
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_credentials_preserve_existing_access_and_typed_identity():
|
|
44
|
+
body = text('credentials-admin.md')
|
|
45
|
+
for term in ['two authentication planes', 'workspace GUID', 'connection GUID',
|
|
46
|
+
'`gid`', 'not evidence of absence', 'does not prove read-only',
|
|
47
|
+
'generated', 'not invent', 'owner', 'emails or user IDs']:
|
|
48
|
+
assert term in body
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_native_proof_is_independent_and_transition_sensitive():
|
|
52
|
+
body = text('data-verification.md')
|
|
53
|
+
for term in ['original request', 'same intermediate', 'explicit null',
|
|
54
|
+
'concrete → null', 'null → concrete', 'false', 'zero',
|
|
55
|
+
'already null', 'typed object', 'not a universal', 'protected']:
|
|
56
|
+
assert term in body
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_debugging_does_not_repeat_shared_state_corruption():
|
|
60
|
+
body = text('process-debugging.md')
|
|
61
|
+
assert 'original item → intermediate variable → native mapping → persisted row' in body
|
|
62
|
+
assert 'last loop iteration' in body
|
|
63
|
+
assert 'same intermediate' in body
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_graph_and_confidentiality_precede_execution():
|
|
67
|
+
body = text('process-lifecycle.md')
|
|
68
|
+
assert 'before freezing' in body
|
|
69
|
+
assert 'input-port' in body
|
|
70
|
+
assert 'Join' in body
|
|
71
|
+
assert 'first persistence boundary' in body
|
|
72
|
+
assert 'synthetic canary' in body
|
|
73
|
+
assert 'inactive creation' in body
|
|
74
|
+
assert 'downstream hashing' in body
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def test_resume_and_inventory_rules_are_not_delete_and_retry():
|
|
78
|
+
body = text('operation-contract.md')
|
|
79
|
+
for term in ['returned page', 'unique stable IDs', 'not not-found',
|
|
80
|
+
'Approval recording', 'checkpoint eligibility', 'actual execution',
|
|
81
|
+
'one bounded next step', 'selected-phase', 'aggregate']:
|
|
82
|
+
assert term in body
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_meta_gate_compares_independent_evidence_and_separate_layers():
|
|
86
|
+
body = ' '.join((ROOT / 'skills/agent-skill-engineer/references/field-gate-standard.md').read_text(encoding="utf-8").split())
|
|
87
|
+
for term in ['same erroneous intermediate', 'first persistence boundary',
|
|
88
|
+
'offline assertions', 'causal skill improvement',
|
|
89
|
+
'typed-null', 'checkpoint eligibility']:
|
|
90
|
+
assert term in body
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_confidentiality_gate_is_reachable_for_exports_before_execute():
|
|
94
|
+
common = text('operation-contract.md')
|
|
95
|
+
assert 'Before a read, export or diagnostic fetch' in common
|
|
96
|
+
assert 'references/process-lifecycle.md' in common
|
|
97
|
+
transport = text('transport-environments.md')
|
|
98
|
+
assert transport.index('pre-acquisition confidentiality gate') < transport.index('## Execute')
|
|
99
|
+
assert 'inline secrets' in transport
|
|
100
|
+
assert 'references/process-lifecycle.md' in transport
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Development-corpus and instruction retention checks, not behavior/runtime proof."""
|
|
2
|
+
import hashlib
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
8
|
+
SKILLS = ROOT / 'skills'
|
|
9
|
+
CORPUS = SKILLS / 'evals/field-closeout-development-v1.json'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_review_addendum_is_separate_and_fixed():
|
|
13
|
+
path = SKILLS / 'evals/field-closeout-correction-development-v1.json'
|
|
14
|
+
assert hashlib.sha256(path.read_bytes()).hexdigest() == (
|
|
15
|
+
'b155396ca27300bd535e8da33bf32eb4ab4a4d73d6c30a30682c8b7130ff4dc8'
|
|
16
|
+
)
|
|
17
|
+
suite = json.loads(path.read_text(encoding='utf-8'))
|
|
18
|
+
assert suite['evidence_role'] == 'development_only_not_holdout'
|
|
19
|
+
assert suite['rubric_contract'] == 'fixed-jury-rubric-v2'
|
|
20
|
+
assert len(suite['cases']) == 1
|
|
21
|
+
case = suite['cases'][0]
|
|
22
|
+
for name in ('behavioral.json', 'field-boundary-development-v1.json',
|
|
23
|
+
'field-closeout-development-v1.json'):
|
|
24
|
+
other = json.loads((SKILLS / 'evals' / name).read_text(encoding='utf-8'))
|
|
25
|
+
assert case['id'] not in {item['id'] for item in other['cases']}
|
|
26
|
+
assert case['expected_skill'] == 'procesio-cli'
|
|
27
|
+
rubric = case['expected_output']
|
|
28
|
+
assert rubric['rubric_version'] == 1
|
|
29
|
+
assert len(rubric['criteria']) == 4
|
|
30
|
+
assert len({c['id'] for c in rubric['criteria']}) == 4
|
|
31
|
+
for criterion in rubric['criteria']:
|
|
32
|
+
assert criterion['required'] is True
|
|
33
|
+
assert criterion['description'].startswith('Pass only when')
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def body(relative):
|
|
37
|
+
return ' '.join((SKILLS / relative).read_text(encoding='utf-8').split())
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_closeout_development_contract_is_frozen_and_separate():
|
|
41
|
+
assert hashlib.sha256(CORPUS.read_bytes()).hexdigest() == (
|
|
42
|
+
'566e18324c29eade65bf4a81044da1ae23306721d98a501ea29d585b7c49ac92'
|
|
43
|
+
)
|
|
44
|
+
suite = json.loads(CORPUS.read_text(encoding='utf-8'))
|
|
45
|
+
assert suite['evidence_role'] == 'development_only_not_holdout'
|
|
46
|
+
assert suite['rubric_contract'] == 'fixed-jury-rubric-v2'
|
|
47
|
+
cases = suite['cases']
|
|
48
|
+
ids = {case['id'] for case in cases}
|
|
49
|
+
assert len(ids) == len(cases) == 7
|
|
50
|
+
assert {'positive', 'pressure', 'negative', 'missing-context'} <= {
|
|
51
|
+
case['kind'] for case in cases
|
|
52
|
+
}
|
|
53
|
+
for name in ('behavioral.json', 'field-boundary-development-v1.json'):
|
|
54
|
+
other = json.loads((SKILLS / 'evals' / name).read_text(encoding='utf-8'))
|
|
55
|
+
assert not ids & {case['id'] for case in other['cases']}
|
|
56
|
+
assert not re.search(
|
|
57
|
+
r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}|Sentinel|scratchpad/',
|
|
58
|
+
CORPUS.read_text(encoding='utf-8'),
|
|
59
|
+
)
|
|
60
|
+
for case in cases:
|
|
61
|
+
assert (SKILLS / case['expected_skill'] / 'SKILL.md').is_file()
|
|
62
|
+
rubric = case['expected_output']
|
|
63
|
+
assert rubric['rubric_version'] == 1
|
|
64
|
+
criteria = rubric['criteria']
|
|
65
|
+
assert 2 <= len(criteria) <= 8
|
|
66
|
+
assert len({criterion['id'] for criterion in criteria}) == len(criteria)
|
|
67
|
+
for criterion in criteria:
|
|
68
|
+
assert re.fullmatch(r'[a-z][a-z0-9]*(?:_[a-z0-9]+)+', criterion['id'])
|
|
69
|
+
assert criterion['required'] is True
|
|
70
|
+
assert criterion['description'].startswith('Pass only when')
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_safety_obligation_is_not_success_dependent():
|
|
74
|
+
field = body('agent-skill-engineer/references/field-gate-standard.md')
|
|
75
|
+
for term in ('safety containment', 'evidence-destroying cleanup',
|
|
76
|
+
'independently of business-output decoding', 'existing approval',
|
|
77
|
+
'does not pass the business gate'):
|
|
78
|
+
assert term in field
|
|
79
|
+
for path in ('agent-skill-engineer/SKILL.md',
|
|
80
|
+
'agent-skill-engineer/references/evaluation-standard.md'):
|
|
81
|
+
text = body(path)
|
|
82
|
+
assert 'clean up only after' not in text
|
|
83
|
+
assert 'approved safety containment' in text
|
|
84
|
+
lifecycle = body('procesio-cli/references/process-lifecycle.md')
|
|
85
|
+
assert 'does not depend on successful output decoding' in lifecycle
|
|
86
|
+
assert 'separate approval' in lifecycle
|
|
87
|
+
assert 'evidence-destroying cleanup' in lifecycle
|
|
88
|
+
for name in ('form-e2e.md', 'schedules-webhooks.md'):
|
|
89
|
+
adjacent = body('procesio-cli/references/' + name)
|
|
90
|
+
assert 'separate approval' in adjacent
|
|
91
|
+
assert 'must not wait for successful output decoding' in adjacent
|
|
92
|
+
assert 'references/process-lifecycle.md' in adjacent
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_comparison_rule_preserves_semantics_and_original_evidence():
|
|
96
|
+
text = body('procesio-cli/references/operation-contract.md')
|
|
97
|
+
for term in ('identity, authored semantics and representation',
|
|
98
|
+
'versioned source contract', 'untouched original',
|
|
99
|
+
'exact field paths', 'error bindings', 'Boolean/integer',
|
|
100
|
+
'new attributable result'):
|
|
101
|
+
assert term in text
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_observation_repair_does_not_require_reexecution():
|
|
105
|
+
text = body('agent-skill-engineer/references/field-gate-standard.md')
|
|
106
|
+
for term in ('existing attributable evidence', 'does not by itself establish',
|
|
107
|
+
'valid observation of a missing required effect',
|
|
108
|
+
'missing observation boundary', 'null is not zero'):
|
|
109
|
+
assert term in text
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_diagnostic_stop_delivers_without_promoting_acceptance():
|
|
113
|
+
text = body('procesio-cli/references/operation-contract.md')
|
|
114
|
+
for term in ('smallest observation', 'stop condition', 'responsible owner',
|
|
115
|
+
'clearly scoped artifact', 'not retroactive acceptance'):
|
|
116
|
+
assert term in text
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def test_generalization_requires_transfer_and_boundary_control():
|
|
120
|
+
text = body('agent-skill-engineer/references/field-gate-standard.md')
|
|
121
|
+
for term in ('different domain', 'counterexample', 'must not apply',
|
|
122
|
+
'development cases', 'not transfer-performance evidence'):
|
|
123
|
+
assert term in text
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
import yaml
|
|
7
|
+
|
|
8
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
9
|
+
META = ROOT / "skills" / "agent-skill-engineer"
|
|
10
|
+
SKILL = META / "SKILL.md"
|
|
11
|
+
STANDARD = META / "references" / "field-gate-standard.md"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _frontmatter(path: Path) -> dict:
|
|
15
|
+
lines = path.read_text(encoding="utf-8").splitlines()
|
|
16
|
+
end = lines[1:].index("---") + 1
|
|
17
|
+
value = yaml.safe_load("\n".join(lines[1:end]))
|
|
18
|
+
assert isinstance(value, dict)
|
|
19
|
+
return value
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_meta_skill_routes_field_trials_to_fixed_gate_standard():
|
|
23
|
+
skill = SKILL.read_text(encoding="utf-8")
|
|
24
|
+
frontmatter = _frontmatter(SKILL)
|
|
25
|
+
|
|
26
|
+
# The field contract landed in 2.0.1; later repairs must retain it, not
|
|
27
|
+
# keep an obsolete exact version merely to satisfy this regression test.
|
|
28
|
+
version = tuple(int(part) for part in frontmatter["version"].split("."))
|
|
29
|
+
assert len(version) == 3 and version >= (2, 0, 1)
|
|
30
|
+
assert frontmatter["baseline_version"] == "a47135373c4c0598391e808939397cd139234afd"
|
|
31
|
+
assert "`references/field-gate-standard.md`" in skill
|
|
32
|
+
assert "Host code—not the acting agent—decides pass" in skill
|
|
33
|
+
assert "full parent/child execution budget" in skill
|
|
34
|
+
assert "Never weaken a completed gate" in skill
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_field_gate_standard_is_general_and_host_enforced():
|
|
38
|
+
text = STANDARD.read_text(encoding="utf-8")
|
|
39
|
+
normalized = " ".join(text.split())
|
|
40
|
+
|
|
41
|
+
for phrase in (
|
|
42
|
+
"ordered required check IDs",
|
|
43
|
+
"fingerprint of the complete skill package",
|
|
44
|
+
"including `SKILL.md`, references, scripts, and assets",
|
|
45
|
+
"The host computes the aggregate verdict",
|
|
46
|
+
"complete causal execution tree",
|
|
47
|
+
"A required outcome that fails is not converted into a gap",
|
|
48
|
+
"A phase verdict covers only that phase's frozen obligations",
|
|
49
|
+
"does not force every later phase to report `passed_with_gap`",
|
|
50
|
+
"compute and preserve both verdict scopes separately",
|
|
51
|
+
"Credential exposure is monotonic for the exposed credential",
|
|
52
|
+
"does not make a completed `no_secret_exposure` check true",
|
|
53
|
+
"prove the old value is rejected",
|
|
54
|
+
"invalidate stale exports or reports",
|
|
55
|
+
"preserve the original report",
|
|
56
|
+
"separately approved versioned remediation contract",
|
|
57
|
+
"Avoid case-specific overfitting",
|
|
58
|
+
"Project-specific ID, title, payload, or workaround",
|
|
59
|
+
):
|
|
60
|
+
assert phrase in normalized
|
|
61
|
+
|
|
62
|
+
# General doctrine must not embed installation IDs or private evidence paths.
|
|
63
|
+
assert not re.search(r"[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}", text)
|
|
64
|
+
assert "scratchpad/" not in text
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_review_and_evaluation_standards_fail_closed_on_field_gate_drift():
|
|
68
|
+
review = (META / "references" / "review-standard.md").read_text(encoding="utf-8")
|
|
69
|
+
evaluation = (META / "references" / "evaluation-standard.md").read_text(encoding="utf-8")
|
|
70
|
+
|
|
71
|
+
assert "acting agent invent required checks" in review
|
|
72
|
+
assert "complete causal execution counts" in review
|
|
73
|
+
assert "failed required field outcome" in review
|
|
74
|
+
assert "deterministic host code should validate exact IDs and order" in evaluation
|
|
75
|
+
assert "does not retroactively permit a gap" in evaluation
|
|
76
|
+
assert "full parent/child execution budget" in evaluation
|