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