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,101 @@
|
|
|
1
|
+
"""UI copy for this distribution.
|
|
2
|
+
|
|
3
|
+
LBL is the generic interface vocabulary and is carried whole. S holds only
|
|
4
|
+
the page copy this distribution actually renders; the hero comes from the
|
|
5
|
+
engine's own fallback, so nothing here has to be authored by hand.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
LBL = {
|
|
10
|
+
"en": {
|
|
11
|
+
"ctl_collapse": "Collapse all",
|
|
12
|
+
"ctl_expand": "Expand all",
|
|
13
|
+
"ctl_search": "Search tools, agents, skills, actions... e.g. whatsapp, invoice, search-people",
|
|
14
|
+
"empty": "Nothing matches that search.",
|
|
15
|
+
"exp_h2": "Explore everything",
|
|
16
|
+
"exp_intro": "The full registry, straight from the manifests. Search by name or by what it does. Open a tool to see its actions, open an action to see its arguments. Green dot means its credentials are already in place. Names, commands, and the per-action technical notes stay in English, as in the terminal.",
|
|
17
|
+
"exp_kicker": "Every capability, drillable",
|
|
18
|
+
"l_actions": "Actions",
|
|
19
|
+
"l_autotrigger": "auto-trigger",
|
|
20
|
+
"l_creds": "Credentials it needs",
|
|
21
|
+
"l_drives": "Drives these tools",
|
|
22
|
+
"l_noargs": "no arguments",
|
|
23
|
+
"l_opt": "opt",
|
|
24
|
+
"l_primary": "Primary use",
|
|
25
|
+
"l_req": "req",
|
|
26
|
+
"l_triggers": "Triggers on",
|
|
27
|
+
"l_when": "When it triggers & what it does",
|
|
28
|
+
"m_many": "matches",
|
|
29
|
+
"m_one": "match",
|
|
30
|
+
"nav_cases": "Use cases",
|
|
31
|
+
"nav_explore": "Explore",
|
|
32
|
+
"nav_line": "The line",
|
|
33
|
+
"nav_loop": "The loop",
|
|
34
|
+
"nav_pieces": "The pieces",
|
|
35
|
+
"nav_platform": "The driver",
|
|
36
|
+
"nav_prompts": "Prompts",
|
|
37
|
+
"nav_schedules": "Schedules",
|
|
38
|
+
"nav_store": "The store",
|
|
39
|
+
"nav_together": "Working together",
|
|
40
|
+
"nav_triggers": "Who triggers what",
|
|
41
|
+
"tab_agents": "Agents",
|
|
42
|
+
"tab_skills": "Skills",
|
|
43
|
+
"tab_tools": "Tools",
|
|
44
|
+
"tip_needs": "needs credentials",
|
|
45
|
+
"tip_ready": "credentials present",
|
|
46
|
+
"w_actions": "actions",
|
|
47
|
+
"w_arg": "arg",
|
|
48
|
+
"w_args": "args",
|
|
49
|
+
"w_tools": "tools",
|
|
50
|
+
},
|
|
51
|
+
"ro": {
|
|
52
|
+
"ctl_collapse": "Restrânge tot",
|
|
53
|
+
"ctl_expand": "Extinde tot",
|
|
54
|
+
"ctl_search": "Caută tool-uri, agenți, skill-uri, acțiuni... ex. whatsapp, factură, search-people",
|
|
55
|
+
"empty": "Nimic nu se potrivește cu căutarea.",
|
|
56
|
+
"exp_h2": "Explorează tot",
|
|
57
|
+
"exp_intro": "Registrul complet, direct din manifeste. Caută după nume sau după ce face. Deschide un tool ca să-i vezi acțiunile, deschide o acțiune ca să-i vezi argumentele. Punctul verde înseamnă că credentialele sunt deja la locul lor. Numele, comenzile și notele tehnice de la nivel de acțiune rămân în engleză, ca în terminal.",
|
|
58
|
+
"exp_kicker": "Fiecare capabilitate, în detaliu",
|
|
59
|
+
"l_actions": "Acțiuni",
|
|
60
|
+
"l_autotrigger": "auto-declanșare",
|
|
61
|
+
"l_creds": "Credentiale necesare",
|
|
62
|
+
"l_drives": "Conduce aceste tool-uri",
|
|
63
|
+
"l_noargs": "fără argumente",
|
|
64
|
+
"l_opt": "opt",
|
|
65
|
+
"l_primary": "Utilizare principală",
|
|
66
|
+
"l_req": "oblig",
|
|
67
|
+
"l_triggers": "Se declanșează la",
|
|
68
|
+
"l_when": "Când se declanșează & ce face",
|
|
69
|
+
"m_many": "potriviri",
|
|
70
|
+
"m_one": "potrivire",
|
|
71
|
+
"nav_cases": "Exemple",
|
|
72
|
+
"nav_explore": "Explorează",
|
|
73
|
+
"nav_line": "Linia",
|
|
74
|
+
"nav_loop": "Bucla",
|
|
75
|
+
"nav_pieces": "Componentele",
|
|
76
|
+
"nav_platform": "Driverul",
|
|
77
|
+
"nav_prompts": "Prompturi",
|
|
78
|
+
"nav_schedules": "Programări",
|
|
79
|
+
"nav_store": "Memoria",
|
|
80
|
+
"nav_together": "Cum lucrează împreună",
|
|
81
|
+
"nav_triggers": "Cine declanșează ce",
|
|
82
|
+
"tab_agents": "Agenți",
|
|
83
|
+
"tab_skills": "Skill-uri",
|
|
84
|
+
"tab_tools": "Tool-uri",
|
|
85
|
+
"tip_needs": "lipsesc credentiale",
|
|
86
|
+
"tip_ready": "credentiale prezente",
|
|
87
|
+
"w_actions": "acțiuni",
|
|
88
|
+
"w_arg": "arg",
|
|
89
|
+
"w_args": "argumente",
|
|
90
|
+
"w_tools": "tool-uri",
|
|
91
|
+
},
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
S = {
|
|
95
|
+
"en": {
|
|
96
|
+
"footer": "Generated from the live manifests, $NTOOLS tools · $NAGENTS agents · $NSKILLS skills · $NACTIONS actions. The registry is the source of truth, this map regenerates from it. Framework capability is shared and versioned, your data stays in <code>context-state-knowledge/</code>, secrets stay in the Windows Credential Store.",
|
|
97
|
+
},
|
|
98
|
+
"ro": {
|
|
99
|
+
"footer": "Generat din manifestele vii, $NTOOLS tool-uri · $NAGENTS agenți · $NSKILLS skill-uri · $NACTIONS acțiuni. Registrul e sursa de adevăr - harta asta se regenerează din el. Capabilitatea de framework e partajată și versionată, datele tale rămân în <code>context-state-knowledge/</code>, secretele rămân în Windows Credential Store.",
|
|
100
|
+
},
|
|
101
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""framework-map tool entrypoint - action dispatch.
|
|
2
|
+
|
|
3
|
+
Regenerates the interactive bilingual (EN default / RO) framework map HTML from
|
|
4
|
+
the live registry. JSON in / JSON out. No secrets, no user data - the generated
|
|
5
|
+
file is a build artifact (it does reflect current credential presence via the
|
|
6
|
+
readiness dots, nothing more).
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
TOOL_ROOT = Path(__file__).resolve().parent
|
|
14
|
+
FRAMEWORK_ROOT = TOOL_ROOT.parents[1]
|
|
15
|
+
_VENV_PY = FRAMEWORK_ROOT / ".venv" / "Scripts" / "python.exe"
|
|
16
|
+
if _VENV_PY.exists() and Path(sys.executable).resolve() != _VENV_PY.resolve():
|
|
17
|
+
import subprocess
|
|
18
|
+
sys.exit(subprocess.run([str(_VENV_PY), __file__, *sys.argv[1:]]).returncode)
|
|
19
|
+
|
|
20
|
+
import argparse # noqa: E402
|
|
21
|
+
|
|
22
|
+
for _p in (str(FRAMEWORK_ROOT), str(TOOL_ROOT)):
|
|
23
|
+
if _p not in sys.path:
|
|
24
|
+
sys.path.insert(0, _p)
|
|
25
|
+
|
|
26
|
+
from tools._lib.io import emit, fail, log # noqa: E402
|
|
27
|
+
import fm_builder # noqa: E402
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ActionDef:
|
|
31
|
+
def __init__(self, add_args, run, description=""):
|
|
32
|
+
self._add_args = add_args
|
|
33
|
+
self.run = run
|
|
34
|
+
self.description = description
|
|
35
|
+
|
|
36
|
+
def add_args(self, parser):
|
|
37
|
+
self._add_args(parser)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _add_build_args(p):
|
|
41
|
+
p.add_argument("--out", default="framework-map.html",
|
|
42
|
+
help="Output path for the HTML (relative paths resolve from the repo root).")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _run_build(args):
|
|
46
|
+
log("extracting registry + assembling map ...")
|
|
47
|
+
html, stats = fm_builder.build_html(FRAMEWORK_ROOT)
|
|
48
|
+
if not html.rstrip().endswith("</html>"):
|
|
49
|
+
fail("assembly_error", "generated HTML is truncated (missing </html>)")
|
|
50
|
+
out = Path(args.out)
|
|
51
|
+
if not out.is_absolute():
|
|
52
|
+
out = FRAMEWORK_ROOT / out
|
|
53
|
+
data = html.encode("utf-8")
|
|
54
|
+
out.write_bytes(data) # bytes, not write_text: avoid Windows CRLF translation
|
|
55
|
+
size = out.stat().st_size
|
|
56
|
+
if size != len(data):
|
|
57
|
+
fail("write_mismatch", "written byte count does not match generated HTML",
|
|
58
|
+
{"written": size, "expected": len(data)})
|
|
59
|
+
log(f"wrote {out} ({size} bytes)")
|
|
60
|
+
emit({"path": str(out), "bytes": size, **stats})
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _add_check_args(p):
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _run_check(args):
|
|
68
|
+
emit(fm_builder.stats_only(FRAMEWORK_ROOT))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
ACTIONS = {
|
|
72
|
+
"build": ActionDef(_add_build_args, _run_build,
|
|
73
|
+
"Extract the live registry, translate the catalog to RO, write the single-file HTML map."),
|
|
74
|
+
"check": ActionDef(_add_check_args, _run_check,
|
|
75
|
+
"Report counts, categories, and catalog strings still missing an RO translation. Writes nothing."),
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def main():
|
|
80
|
+
parser = argparse.ArgumentParser(prog="framework-map", description="Regenerate the framework map.")
|
|
81
|
+
sub = parser.add_subparsers(dest="action", required=True)
|
|
82
|
+
for name, defn in ACTIONS.items():
|
|
83
|
+
sp = sub.add_parser(name, help=defn.description)
|
|
84
|
+
defn.add_args(sp)
|
|
85
|
+
args = parser.parse_args()
|
|
86
|
+
try:
|
|
87
|
+
ACTIONS[args.action].run(args)
|
|
88
|
+
except SystemExit:
|
|
89
|
+
raise
|
|
90
|
+
except Exception as e: # noqa: BLE001
|
|
91
|
+
fail("build_error", str(e), {"action": args.action})
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
main()
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
|
|
2
|
+
:root{
|
|
3
|
+
--bg:#f5f6f8; --panel:#ffffff; --ink:#12151c; --muted:#5b6472; --faint:#8a93a3;
|
|
4
|
+
--line:#e5e8ef; --line2:#eef1f6;
|
|
5
|
+
--tool:#0e7490; --tool-bg:#ecfeff; --tool-ln:#a5e8ef;
|
|
6
|
+
--agent:#6d28d9; --agent-bg:#f5f3ff; --agent-ln:#d6ccf7;
|
|
7
|
+
--skill:#b45309; --skill-bg:#fff8ec; --skill-ln:#f3ddb0;
|
|
8
|
+
--store:#047857; --store-bg:#ecfdf5; --store-ln:#b3e6ce;
|
|
9
|
+
--brand:#2563eb; --brand-bg:#eef4ff;
|
|
10
|
+
--shadow:0 1px 2px rgba(16,22,40,.04),0 6px 24px rgba(16,22,40,.05);
|
|
11
|
+
}
|
|
12
|
+
*{box-sizing:border-box}
|
|
13
|
+
html{scroll-behavior:smooth}
|
|
14
|
+
body{margin:0;background:var(--bg);color:var(--ink);
|
|
15
|
+
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Inter,Helvetica,Arial,sans-serif;
|
|
16
|
+
font-size:15px;line-height:1.55;-webkit-font-smoothing:antialiased}
|
|
17
|
+
code,.mono{font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace}
|
|
18
|
+
a{color:var(--brand);text-decoration:none}
|
|
19
|
+
a:hover{text-decoration:underline}
|
|
20
|
+
.wrap{max-width:1180px;margin:0 auto;padding:0 22px}
|
|
21
|
+
|
|
22
|
+
/* header */
|
|
23
|
+
header.top{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.86);
|
|
24
|
+
backdrop-filter:saturate(1.2) blur(8px);border-bottom:1px solid var(--line)}
|
|
25
|
+
.top-in{max-width:1180px;margin:0 auto;padding:10px 22px;display:flex;align-items:center;gap:18px;flex-wrap:wrap}
|
|
26
|
+
.brand{font-weight:700;letter-spacing:-.01em;font-size:16px;display:flex;align-items:center;gap:9px}
|
|
27
|
+
.brand .dot{width:11px;height:11px;border-radius:3px;background:linear-gradient(135deg,var(--tool),var(--agent))}
|
|
28
|
+
.nav{display:flex;gap:2px;flex-wrap:wrap;order:1;flex-basis:100%;margin-top:3px}
|
|
29
|
+
.nav a{color:var(--muted);padding:5px 10px;border-radius:7px;font-size:13.5px;font-weight:500}
|
|
30
|
+
.nav a:hover{background:var(--brand-bg);color:var(--brand);text-decoration:none}
|
|
31
|
+
|
|
32
|
+
/* hero */
|
|
33
|
+
.hero{padding:56px 0 30px}
|
|
34
|
+
.eyebrow{color:var(--brand);font-weight:600;font-size:13px;letter-spacing:.04em;text-transform:uppercase}
|
|
35
|
+
h1{font-size:42px;line-height:1.05;letter-spacing:-.025em;margin:12px 0 6px;font-weight:760}
|
|
36
|
+
.sub{font-size:19px;color:var(--muted);max-width:720px;margin:0 0 20px}
|
|
37
|
+
.lead{font-size:16.5px;max-width:760px;color:#2b313d}
|
|
38
|
+
.counts{display:flex;gap:10px;flex-wrap:wrap;margin:26px 0 4px}
|
|
39
|
+
.count{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 18px;box-shadow:var(--shadow)}
|
|
40
|
+
.count b{font-size:26px;font-weight:730;letter-spacing:-.02em;display:block}
|
|
41
|
+
.count span{font-size:12.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
|
|
42
|
+
|
|
43
|
+
section.band{padding:44px 0;border-top:1px solid var(--line)}
|
|
44
|
+
.band h2{font-size:27px;letter-spacing:-.02em;margin:0 0 6px;font-weight:720}
|
|
45
|
+
.band .kicker{color:var(--faint);font-weight:600;font-size:12.5px;letter-spacing:.06em;text-transform:uppercase;margin-bottom:14px}
|
|
46
|
+
.band p.intro{font-size:16px;color:#333a47;max-width:800px;margin:0 0 22px}
|
|
47
|
+
|
|
48
|
+
/* element cards */
|
|
49
|
+
.layer-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}
|
|
50
|
+
.lcard{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;box-shadow:var(--shadow);position:relative;overflow:hidden}
|
|
51
|
+
.lcard:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px}
|
|
52
|
+
.lcard.tool:before{background:var(--tool)} .lcard.agent:before{background:var(--agent)}
|
|
53
|
+
.lcard.skill:before{background:var(--skill)} .lcard.store:before{background:var(--store)}
|
|
54
|
+
.lcard h3{margin:0 0 3px;font-size:18px;display:flex;align-items:center;gap:9px;font-weight:680}
|
|
55
|
+
.tag{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:3px 8px;border-radius:6px}
|
|
56
|
+
.tag.tool{background:var(--tool-bg);color:var(--tool)} .tag.agent{background:var(--agent-bg);color:var(--agent)}
|
|
57
|
+
.tag.skill{background:var(--skill-bg);color:var(--skill)} .tag.store{background:var(--store-bg);color:var(--store)}
|
|
58
|
+
.lcard .role{color:var(--faint);font-size:12.5px;margin:0 0 10px}
|
|
59
|
+
.lcard p{margin:0 0 8px;font-size:14.5px;color:#2f3641}
|
|
60
|
+
details.more{margin-top:8px;border-top:1px solid var(--line2);padding-top:8px}
|
|
61
|
+
details.more>summary{cursor:pointer;color:var(--brand);font-weight:600;font-size:13.5px;list-style:none}
|
|
62
|
+
details.more>summary::-webkit-details-marker{display:none}
|
|
63
|
+
details.more>summary:before{content:"+ ";font-weight:700}
|
|
64
|
+
details.more[open]>summary:before{content:"– "}
|
|
65
|
+
details.more .body{font-size:13.8px;color:#3a414d;padding-top:8px}
|
|
66
|
+
details.more .body{color:#3a414d}
|
|
67
|
+
.kv{margin:6px 0}.kv b{color:var(--ink)}
|
|
68
|
+
|
|
69
|
+
/* diagrams */
|
|
70
|
+
.diagram{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:8px;box-shadow:var(--shadow);overflow-x:auto}
|
|
71
|
+
.diagram svg{display:block;width:100%;height:auto;min-width:640px}
|
|
72
|
+
.split{display:grid;grid-template-columns:1fr auto 1fr;gap:0;align-items:stretch;background:var(--panel);
|
|
73
|
+
border:1px solid var(--line);border-radius:16px;overflow:hidden;box-shadow:var(--shadow)}
|
|
74
|
+
.split .half{padding:22px}
|
|
75
|
+
.split .fw{background:linear-gradient(180deg,#f0f7ff,#fff)}
|
|
76
|
+
.split .ud{background:linear-gradient(180deg,#f0fcf6,#fff)}
|
|
77
|
+
.split .mid{width:1px;background:repeating-linear-gradient(180deg,var(--line) 0 8px,transparent 8px 16px)}
|
|
78
|
+
.split h4{margin:0 0 3px;font-size:16px}
|
|
79
|
+
.split .lab{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:2px 8px;border-radius:6px;display:inline-block;margin-bottom:9px}
|
|
80
|
+
.split .lab.a{background:var(--brand-bg);color:var(--brand)}
|
|
81
|
+
.split .lab.b{background:var(--store-bg);color:var(--store)}
|
|
82
|
+
.chiprow{display:flex;flex-wrap:wrap;gap:7px;margin-top:8px}
|
|
83
|
+
.chip{background:#f3f5f9;border:1px solid var(--line);border-radius:999px;padding:4px 11px;font-size:12.5px;color:#3b424e;font-weight:500}
|
|
84
|
+
.chip.mono{font-family:ui-monospace,monospace;font-size:11.5px}
|
|
85
|
+
.note{font-size:13px;color:var(--muted);margin-top:14px;padding:12px 15px;background:#fbfcfd;border:1px solid var(--line);border-radius:10px}
|
|
86
|
+
.note b{color:var(--ink)}
|
|
87
|
+
|
|
88
|
+
/* trigger rows */
|
|
89
|
+
.trigrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(255px,1fr));gap:14px}
|
|
90
|
+
.trig{background:var(--panel);border:1px solid var(--line);border-radius:13px;padding:16px 18px;box-shadow:var(--shadow)}
|
|
91
|
+
.trig .flow{font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px;margin-bottom:6px}
|
|
92
|
+
.trig .flow .ar{color:var(--faint)}
|
|
93
|
+
.trig p{margin:0;font-size:13.8px;color:#3a414d}
|
|
94
|
+
.pill{font-size:11px;font-weight:700;padding:2px 8px;border-radius:6px;text-transform:uppercase;letter-spacing:.03em}
|
|
95
|
+
.pill.user{background:var(--brand-bg);color:var(--brand)}
|
|
96
|
+
.pill.orch{background:#eef2ff;color:#4338ca}
|
|
97
|
+
.pill.skill{background:var(--skill-bg);color:var(--skill)}
|
|
98
|
+
.pill.clock{background:#fef2f2;color:#b91c1c}
|
|
99
|
+
.pill.agent{background:var(--agent-bg);color:var(--agent)}
|
|
100
|
+
.pill.tool{background:var(--tool-bg);color:var(--tool)}
|
|
101
|
+
|
|
102
|
+
/* loop stepper */
|
|
103
|
+
.loop{display:grid;grid-template-columns:repeat(6,1fr);gap:10px}
|
|
104
|
+
.step{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px;box-shadow:var(--shadow);position:relative}
|
|
105
|
+
.step .n{width:24px;height:24px;border-radius:7px;background:var(--brand-bg);color:var(--brand);font-weight:700;font-size:13px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}
|
|
106
|
+
.step h4{margin:0 0 4px;font-size:14.5px}
|
|
107
|
+
.step p{margin:0;font-size:12.8px;color:var(--muted)}
|
|
108
|
+
|
|
109
|
+
/* modes */
|
|
110
|
+
.modes{display:grid;grid-template-columns:1fr 1fr;gap:16px}
|
|
111
|
+
.mode{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;box-shadow:var(--shadow)}
|
|
112
|
+
.mode.auto{border-top:3px solid var(--store)}
|
|
113
|
+
.mode.driver{border-top:3px solid var(--agent)}
|
|
114
|
+
.mode h4{margin:0 0 8px;font-size:17px;display:flex;align-items:center;gap:9px}
|
|
115
|
+
|
|
116
|
+
/* tree */
|
|
117
|
+
.tree{background:#0f1420;color:#d6deeb;border-radius:14px;padding:20px 22px;font-family:ui-monospace,monospace;font-size:13.2px;line-height:1.75;overflow-x:auto;box-shadow:var(--shadow)}
|
|
118
|
+
.tree .d{color:#7dd3fc}.tree .f{color:#e2e8f0}.tree .c{color:#64748b}.tree .lock{color:#fbbf24}
|
|
119
|
+
|
|
120
|
+
/* explorer */
|
|
121
|
+
.exp-bar{position:sticky;top:52px;z-index:40;background:var(--bg);padding:14px 0;display:flex;gap:12px;align-items:center;flex-wrap:wrap}
|
|
122
|
+
#search{flex:1;min-width:200px;padding:11px 15px;border:1px solid var(--line);border-radius:11px;font-size:15px;background:var(--panel);box-shadow:var(--shadow)}
|
|
123
|
+
#search:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-bg)}
|
|
124
|
+
.tabs{display:flex;gap:4px;background:var(--panel);border:1px solid var(--line);border-radius:11px;padding:4px}
|
|
125
|
+
.tabs button{border:0;background:transparent;padding:8px 15px;border-radius:8px;font-size:14px;font-weight:600;color:var(--muted);cursor:pointer}
|
|
126
|
+
.tabs button.on{background:var(--brand);color:#fff}
|
|
127
|
+
.exp-tools button.on{background:var(--tool)} .exp-agents button.on{background:var(--agent)} .exp-skills button.on{background:var(--skill)}
|
|
128
|
+
.btn{border:1px solid var(--line);background:var(--panel);padding:9px 13px;border-radius:10px;font-size:13px;font-weight:600;color:var(--muted);cursor:pointer;box-shadow:var(--shadow)}
|
|
129
|
+
.btn:hover{color:var(--ink);border-color:#d3d9e3}
|
|
130
|
+
.expcount{font-size:13px;color:var(--faint);margin-left:2px}
|
|
131
|
+
|
|
132
|
+
.cathead{display:flex;align-items:center;gap:10px;margin:22px 0 12px;cursor:pointer;user-select:none}
|
|
133
|
+
.cathead .cx{font-size:13px;color:var(--faint);font-weight:600}
|
|
134
|
+
.cathead h3{margin:0;font-size:16px;font-weight:680}
|
|
135
|
+
.cathead .tw{font-size:11px;transition:transform .15s;color:var(--faint)}
|
|
136
|
+
.cathead.closed .tw{transform:rotate(-90deg)}
|
|
137
|
+
.catgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px}
|
|
138
|
+
.catgrid.hide{display:none}
|
|
139
|
+
|
|
140
|
+
.card{background:var(--panel);border:1px solid var(--line);border-radius:13px;box-shadow:var(--shadow);overflow:hidden}
|
|
141
|
+
.card>summary{cursor:pointer;list-style:none;padding:15px 17px;display:flex;align-items:flex-start;gap:10px}
|
|
142
|
+
.card>summary::-webkit-details-marker{display:none}
|
|
143
|
+
.card .nm{font-weight:680;font-size:15.5px;font-family:ui-monospace,monospace;letter-spacing:-.01em}
|
|
144
|
+
.card .ds{font-size:13px;color:var(--muted);margin-top:3px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
|
145
|
+
.card[open] .ds{display:block;-webkit-line-clamp:unset}
|
|
146
|
+
.card .meta{margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;gap:5px;flex-shrink:0}
|
|
147
|
+
.acount{font-size:11.5px;font-weight:700;padding:3px 9px;border-radius:999px;background:#f0f2f6;color:var(--muted);white-space:nowrap}
|
|
148
|
+
.dotr{width:8px;height:8px;border-radius:50%}
|
|
149
|
+
.dotr.on{background:#16a34a}.dotr.off{background:#d1d5db}
|
|
150
|
+
.card .tw{font-size:11px;color:var(--faint);margin-top:3px}
|
|
151
|
+
.card[open] .tw{transform:rotate(90deg)}
|
|
152
|
+
.card .body{padding:0 17px 16px;border-top:1px solid var(--line2)}
|
|
153
|
+
.card .body .full{font-size:13.8px;color:#333a47;margin:12px 0}
|
|
154
|
+
.sec-l{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--faint);margin:14px 0 7px}
|
|
155
|
+
.ex{background:#0f1420;color:#d6deeb;border-radius:9px;padding:10px 13px;font-family:ui-monospace,monospace;font-size:12.4px;overflow-x:auto;white-space:pre-wrap;word-break:break-word}
|
|
156
|
+
.trigchips .chip{background:var(--brand-bg);color:#3949c4;border-color:#dbe3ff;font-size:11.5px}
|
|
157
|
+
.seccap .chip{cursor:pointer}
|
|
158
|
+
.seccap .chip:hover{border-color:var(--agent);color:var(--agent)}
|
|
159
|
+
.lockchip{background:#fffbeb;border:1px solid #f3ddb0;color:#92600a;border-radius:999px;padding:3px 10px;font-size:11.8px;font-family:ui-monospace,monospace;display:inline-flex;gap:5px;align-items:center}
|
|
160
|
+
|
|
161
|
+
/* action list */
|
|
162
|
+
.acts{margin-top:4px}
|
|
163
|
+
.act{border:1px solid var(--line2);border-radius:9px;margin-bottom:6px;overflow:hidden;background:#fcfdfe}
|
|
164
|
+
.act>summary{cursor:pointer;list-style:none;padding:9px 12px;display:flex;align-items:center;gap:9px;font-family:ui-monospace,monospace;font-size:13px;font-weight:600}
|
|
165
|
+
.act>summary::-webkit-details-marker{display:none}
|
|
166
|
+
.act>summary:before{content:"▸";color:var(--faint);font-size:10px;transition:transform .12s}
|
|
167
|
+
.act[open]>summary:before{transform:rotate(90deg)}
|
|
168
|
+
.act .argn{margin-left:auto;font-size:10.5px;font-weight:700;color:var(--faint);font-family:inherit}
|
|
169
|
+
.act .abody{padding:2px 12px 11px 30px}
|
|
170
|
+
.act .adesc{font-size:12.8px;color:#41485a;margin:2px 0 8px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif}
|
|
171
|
+
.arg{display:flex;gap:8px;align-items:baseline;padding:3px 0;border-top:1px dashed var(--line);font-size:12.3px}
|
|
172
|
+
.arg .an{font-family:ui-monospace,monospace;font-weight:600;color:var(--tool)}
|
|
173
|
+
.arg .req{font-size:9.5px;font-weight:800;letter-spacing:.04em;padding:1px 5px;border-radius:4px;background:#fee2e2;color:#b91c1c;text-transform:uppercase}
|
|
174
|
+
.arg .opt{font-size:9.5px;font-weight:800;letter-spacing:.04em;padding:1px 5px;border-radius:4px;background:#f0f2f6;color:var(--faint);text-transform:uppercase}
|
|
175
|
+
.arg .ad{color:var(--muted)}
|
|
176
|
+
.noargs{font-size:12.3px;color:var(--faint);font-style:italic;padding:4px 0}
|
|
177
|
+
.drives{display:flex;flex-wrap:wrap;gap:6px}
|
|
178
|
+
.tchip{background:var(--tool-bg);color:var(--tool);border:1px solid var(--tool-ln);border-radius:999px;padding:3px 11px;font-size:12px;font-family:ui-monospace,monospace;cursor:pointer;font-weight:600}
|
|
179
|
+
.tchip:hover{background:var(--tool);color:#fff}
|
|
180
|
+
.hl{animation:hl 2s ease}
|
|
181
|
+
@keyframes hl{0%,40%{box-shadow:0 0 0 3px var(--agent)}100%{box-shadow:var(--shadow)}}
|
|
182
|
+
.empty{padding:40px;text-align:center;color:var(--faint)}
|
|
183
|
+
|
|
184
|
+
/* use cases */
|
|
185
|
+
.uc{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:18px 20px;box-shadow:var(--shadow);margin-bottom:14px}
|
|
186
|
+
.uc h4{margin:0 0 4px;font-size:16.5px}
|
|
187
|
+
.uc .ask{font-family:ui-monospace,monospace;font-size:13px;color:var(--brand);background:var(--brand-bg);padding:2px 9px;border-radius:6px;display:inline-block;margin-bottom:9px}
|
|
188
|
+
.uc p{margin:0 0 11px;font-size:14.3px;color:#333a47}
|
|
189
|
+
.uc .chain{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
|
|
190
|
+
.uc .chain .ar{color:var(--faint);font-size:12px}
|
|
191
|
+
.jump{border-radius:999px;padding:3px 11px;font-size:12px;font-weight:600;cursor:pointer;border:1px solid}
|
|
192
|
+
.jump.tool{background:var(--tool-bg);color:var(--tool);border-color:var(--tool-ln)}
|
|
193
|
+
.jump.agent{background:var(--agent-bg);color:var(--agent);border-color:var(--agent-ln)}
|
|
194
|
+
.jump.orch{background:#eef2ff;color:#4338ca;border-color:#d5ddff}
|
|
195
|
+
.jump:hover{filter:brightness(.96)}
|
|
196
|
+
|
|
197
|
+
footer{padding:36px 0 60px;color:var(--faint);font-size:13px;border-top:1px solid var(--line);margin-top:20px}
|
|
198
|
+
@media(max-width:820px){
|
|
199
|
+
.loop{grid-template-columns:1fr 1fr}.modes{grid-template-columns:1fr}
|
|
200
|
+
.split{grid-template-columns:1fr}.split .mid{display:none}
|
|
201
|
+
h1{font-size:33px}.nav{display:none}
|
|
202
|
+
}
|
|
203
|
+
@media print{
|
|
204
|
+
header.top,.exp-bar,.nav{position:static}
|
|
205
|
+
.card,.act{break-inside:avoid}
|
|
206
|
+
body{background:#fff}
|
|
207
|
+
}
|
|
208
|
+
.langtoggle{display:flex;gap:2px;background:var(--panel);border:1px solid var(--line);border-radius:9px;padding:3px;margin-left:auto}
|
|
209
|
+
.langtoggle button{border:0;background:transparent;padding:5px 12px;border-radius:6px;font-size:13px;font-weight:700;color:var(--muted);cursor:pointer;letter-spacing:.03em}
|
|
210
|
+
.langtoggle button.on{background:var(--brand);color:#fff}
|
|
211
|
+
.lang-ro{display:none}
|
|
212
|
+
body.ro .lang-en{display:none}
|
|
213
|
+
body.ro .lang-ro{display:block}
|
|
214
|
+
@media(max-width:820px){ .langtoggle{margin-left:auto} }
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Module loading for the framework-map tool (hyphenated dir).
|
|
2
|
+
|
|
3
|
+
The dir name has a hyphen, so modules can't be imported as
|
|
4
|
+
``tools.framework-map.*``. The tool's own modules are already fm_-prefixed
|
|
5
|
+
(fm_builder / fm_strings / fm_ro_catalog), so they import cleanly by bare name
|
|
6
|
+
once the tool root is on sys.path and never collide with other tools. Only
|
|
7
|
+
main.py needs an alias (``fm_main``) to avoid clashing with other tools' main.py
|
|
8
|
+
during a full-suite run.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import importlib.util
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
TOOL_ROOT = Path(__file__).resolve().parents[1]
|
|
17
|
+
FRAMEWORK_ROOT = Path(__file__).resolve().parents[3]
|
|
18
|
+
for _p in (str(FRAMEWORK_ROOT), str(TOOL_ROOT)):
|
|
19
|
+
if _p not in sys.path:
|
|
20
|
+
sys.path.insert(0, _p)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _load(name: str, filename: str):
|
|
24
|
+
spec = importlib.util.spec_from_file_location(name, str(TOOL_ROOT / filename))
|
|
25
|
+
mod = importlib.util.module_from_spec(spec)
|
|
26
|
+
sys.modules[name] = mod
|
|
27
|
+
spec.loader.exec_module(mod)
|
|
28
|
+
return mod
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# main.py imports fm_builder, which imports fm_strings + fm_ro_catalog by name
|
|
32
|
+
# (resolved via TOOL_ROOT on sys.path). Load main under a unique alias.
|
|
33
|
+
_load("fm_main", "main.py")
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""Build the map from the live registry and assert its structure + invariants."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
import fm_builder
|
|
9
|
+
|
|
10
|
+
FRAMEWORK_ROOT = Path(fm_builder.__file__).resolve().parents[2]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_stats_only_shape():
|
|
14
|
+
s = fm_builder.stats_only(FRAMEWORK_ROOT)
|
|
15
|
+
for key in ("tools", "agents", "skills", "actions", "tool_actions",
|
|
16
|
+
"agent_actions", "categories", "uncategorized", "ro_untranslated"):
|
|
17
|
+
assert key in s
|
|
18
|
+
# Deliberately not a census (">= 39 tools"): that asserted the contents of one
|
|
19
|
+
# checkout rather than the behaviour of the builder, so it failed in any
|
|
20
|
+
# distribution of the framework that ships a different set. What must hold is
|
|
21
|
+
# that the registry produced something of each kind and that the totals agree.
|
|
22
|
+
assert s["tools"] >= 1 and s["agents"] >= 1
|
|
23
|
+
assert s["actions"] == s["tool_actions"] + s["agent_actions"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_every_tool_is_categorized():
|
|
27
|
+
# a new tool with no CAT entry falls into "Other"; keep the map curated.
|
|
28
|
+
s = fm_builder.stats_only(FRAMEWORK_ROOT)
|
|
29
|
+
assert s["uncategorized"] == [], f"uncategorized tools: {s['uncategorized']}"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_catalog_fully_translated_to_ro():
|
|
33
|
+
# adding a tool/agent/skill without an RO catalog translation shows up here;
|
|
34
|
+
# `framework-map check` lists exactly what to translate.
|
|
35
|
+
s = fm_builder.stats_only(FRAMEWORK_ROOT)
|
|
36
|
+
assert s["ro_untranslated"] == {}, f"missing RO translations: {s['ro_untranslated']}"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_build_html_structure():
|
|
40
|
+
html, stats = fm_builder.build_html(FRAMEWORK_ROOT)
|
|
41
|
+
assert html.startswith("<!DOCTYPE html>")
|
|
42
|
+
assert html.rstrip().endswith("</html>")
|
|
43
|
+
# both datasets embedded + language toggle present
|
|
44
|
+
assert "const DATA=" in html and "const DATA_RO=" in html and "const LBL=" in html
|
|
45
|
+
assert 'data-lang="ro"' in html and "lang-ro" in html
|
|
46
|
+
# self-contained: no external resource references
|
|
47
|
+
assert 'href="http' not in html and 'src="http' not in html
|
|
48
|
+
# counts made it into the page
|
|
49
|
+
assert "{:,}".format(stats["tools"]) in html
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_no_unresolved_template_tokens():
|
|
53
|
+
html, _ = fm_builder.build_html(FRAMEWORK_ROOT)
|
|
54
|
+
# narrative placeholders ($svg_*, $NTOOLS, $uc1_h, $footer ...) must all be
|
|
55
|
+
# substituted. ($filter can legitimately appear inside embedded manifest text.)
|
|
56
|
+
import re
|
|
57
|
+
body = html.split("const DATA=", 1)[0] # ignore the embedded JSON payload
|
|
58
|
+
leftover = set(re.findall(r"\$[A-Za-z_]{2,}", body))
|
|
59
|
+
assert not leftover, f"unresolved template tokens: {sorted(leftover)}"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_marker_ids_unique_per_language():
|
|
63
|
+
html, _ = fm_builder.build_html(FRAMEWORK_ROOT)
|
|
64
|
+
# The arrowheads live in the architecture diagram, which is part of the
|
|
65
|
+
# narrative a distribution may not ship. Where there is no diagram there is
|
|
66
|
+
# nothing to assert; where there is one, the markers must be per-language or
|
|
67
|
+
# the RO arrows reference a hidden EN marker and vanish.
|
|
68
|
+
if "<marker" not in html:
|
|
69
|
+
pytest.skip("this distribution does not ship the architecture diagram")
|
|
70
|
+
assert 'id="ahg-en"' in html and 'id="ahg-ro"' in html
|
|
71
|
+
assert "url(#ahg-ro)" in html and "url(#ahg-en)" in html
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# -- structural + reference guards (build once, reuse) ------------------------
|
|
75
|
+
|
|
76
|
+
_CACHE: dict = {}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _built():
|
|
80
|
+
if "html" not in _CACHE:
|
|
81
|
+
_CACHE["html"], _ = fm_builder.build_html(FRAMEWORK_ROOT)
|
|
82
|
+
# everything before the embedded JSON payload is the real markup
|
|
83
|
+
_CACHE["body"] = _CACHE["html"].split("const DATA=", 1)[0]
|
|
84
|
+
return _CACHE
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_section_and_div_tags_balanced():
|
|
88
|
+
# a dropped closing tag orphans every later section (this actually happened);
|
|
89
|
+
# balance is the cheapest guard that would have caught it immediately.
|
|
90
|
+
body = _built()["body"]
|
|
91
|
+
assert body.count("<section") == body.count("</section>"), "unbalanced <section> tags"
|
|
92
|
+
assert body.count("<div") == body.count("</div>"), "unbalanced <div> tags"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_nav_links_resolve_to_sections():
|
|
96
|
+
import re
|
|
97
|
+
html = _built()["html"]
|
|
98
|
+
hrefs = set(re.findall(r'<a href="#([\w-]+)"', html))
|
|
99
|
+
targets = (set(re.findall(r'id="([\w-]+)"', html))
|
|
100
|
+
| set(re.findall(r'data-sec="([\w-]+)"', html)))
|
|
101
|
+
missing = hrefs - targets
|
|
102
|
+
assert not missing, f"nav links with no matching section: {missing}"
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def test_narrative_references_resolve():
|
|
106
|
+
# use-case chips + the generated schedule note reference agents/tools by name
|
|
107
|
+
# via data-ujump; a rename/removal must not leave a dead pointer.
|
|
108
|
+
import re
|
|
109
|
+
body = _built()["body"]
|
|
110
|
+
refs = set(re.findall(r'data-ujump="([\w-]+)"', body))
|
|
111
|
+
dump = fm_builder.compress(fm_builder.extract(FRAMEWORK_ROOT))
|
|
112
|
+
real = ({t["name"] for t in dump["tools"]}
|
|
113
|
+
| {a["name"] for a in dump["agents"]} | {"__none__"})
|
|
114
|
+
unknown = refs - real
|
|
115
|
+
assert not unknown, f"data-ujump references a non-existent capability: {unknown}"
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_schedule_note_generated_from_yaml():
|
|
119
|
+
# the 'Live today' note is derived from schedule.yaml, not hardcoded. When a
|
|
120
|
+
# schedule exists it names the real target agents; the fallback is generic.
|
|
121
|
+
note_en = fm_builder._schedule_note("en")
|
|
122
|
+
if note_en is None: # fresh/wiped install -> fallback path
|
|
123
|
+
assert "schedule.yaml" in fm_builder._SCHED_FALLBACK["en"]
|
|
124
|
+
else:
|
|
125
|
+
assert note_en.startswith("<b>Live today:</b>")
|
|
126
|
+
assert 'data-ujump=' in note_en
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Guard: tool.yaml declares exactly the actions the dispatcher registers, and
|
|
2
|
+
each action's manifest args match its argparse (both directions), with
|
|
3
|
+
argparse-required flags marked required in the manifest.
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from tools._lib.manifest import load_tool
|
|
11
|
+
|
|
12
|
+
import fm_main as main
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _manifest():
|
|
16
|
+
return load_tool(Path(main.__file__).resolve().parent / "tool.yaml")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_manifest_actions_match_dispatch():
|
|
20
|
+
m = _manifest()
|
|
21
|
+
assert set(m.action_names()) == set(main.ACTIONS), (
|
|
22
|
+
f"only in manifest: {set(m.action_names()) - set(main.ACTIONS)}; "
|
|
23
|
+
f"only in code: {set(main.ACTIONS) - set(m.action_names())}")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_expected_actions():
|
|
27
|
+
assert set(main.ACTIONS) == {"build", "check"}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _argparse_names(defn):
|
|
31
|
+
parser = argparse.ArgumentParser()
|
|
32
|
+
defn.add_args(parser)
|
|
33
|
+
names, required = set(), set()
|
|
34
|
+
for action in parser._actions:
|
|
35
|
+
for opt in action.option_strings:
|
|
36
|
+
if opt.startswith("--") and opt != "--help":
|
|
37
|
+
names.add(opt[2:])
|
|
38
|
+
if getattr(action, "required", False):
|
|
39
|
+
required.add(opt[2:])
|
|
40
|
+
return names, required
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_manifest_args_match_argparse():
|
|
44
|
+
m = _manifest()
|
|
45
|
+
for name, defn in main.ACTIONS.items():
|
|
46
|
+
argparse_names, _ = _argparse_names(defn)
|
|
47
|
+
manifest_names = {a.name for a in m.get_action(name).args}
|
|
48
|
+
assert manifest_names == argparse_names, (
|
|
49
|
+
f"{name}: only manifest {manifest_names - argparse_names}; "
|
|
50
|
+
f"only argparse {argparse_names - manifest_names}")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_required_args_marked_required():
|
|
54
|
+
m = _manifest()
|
|
55
|
+
for name, defn in main.ACTIONS.items():
|
|
56
|
+
argparse_names, required_argparse = _argparse_names(defn)
|
|
57
|
+
required_manifest = {a.name for a in m.get_action(name).args if a.required}
|
|
58
|
+
assert required_argparse <= required_manifest
|
|
59
|
+
assert required_manifest <= argparse_names
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_no_secrets():
|
|
63
|
+
assert _manifest().secrets == []
|