@mseep/open-computer-use 1.0.0
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.
- package/.coderabbit.yaml +25 -0
- package/.dockerignore +95 -0
- package/.env.example +137 -0
- package/.githooks/pre-commit +68 -0
- package/.github/CODEOWNERS +125 -0
- package/.github/ISSUE_TEMPLATE/adr-proposal.md +41 -0
- package/.github/ISSUE_TEMPLATE/bug-report.md +49 -0
- package/.github/ISSUE_TEMPLATE/component-proposal.md +38 -0
- package/.github/ISSUE_TEMPLATE/config.yml +15 -0
- package/.github/ISSUE_TEMPLATE/dependency-proposal.md +59 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
- package/.github/ISSUE_TEMPLATE/nfr-proposal.md +44 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- package/.github/codeql/codeql-config.yml +11 -0
- package/.github/codeql/extensions/security-models/python-sanitizers.model.yml +17 -0
- package/.github/codeql/extensions/security-models/qlpack.yml +7 -0
- package/.github/dependabot.yml +23 -0
- package/.github/security-exceptions.yml +23 -0
- package/.github/workflows/build.yml +420 -0
- package/.github/workflows/codeql.yml +33 -0
- package/.github/workflows/contracts-lint.yml +90 -0
- package/.github/workflows/docs-lint.yml +151 -0
- package/.github/workflows/helm.yml +131 -0
- package/.github/workflows/identity-lint.yml +30 -0
- package/.github/workflows/release-chart.yml +177 -0
- package/.github/workflows/release.yml +95 -0
- package/.github/workflows/security.yml +332 -0
- package/.github/workflows/stale.yml +31 -0
- package/.github/workflows/supply-chain.yml +242 -0
- package/.gitleaks.toml +53 -0
- package/.markdownlint.yaml +51 -0
- package/.semgrepignore +85 -0
- package/.vale/styles/Architecture/ap13-data-class-substrate.yml +12 -0
- package/.vale/styles/Architecture/banned-phrases.yml +23 -0
- package/.vale/styles/Architecture/banned-vocab.yml +23 -0
- package/.vale/styles/Architecture/marketing-tone.yml +19 -0
- package/.vale.ini +18 -0
- package/CHANGELOG.md +411 -0
- package/CLAUDE.md +218 -0
- package/CONTRIBUTING.md +82 -0
- package/Dockerfile +676 -0
- package/LICENSE +98 -0
- package/LICENSE-APACHE +202 -0
- package/LICENSE-MIT +21 -0
- package/NOTICE +36 -0
- package/README.md +516 -0
- package/SECURITY.md +45 -0
- package/THIRD-PARTY-LICENSES.md +14 -0
- package/apt-packages.txt +108 -0
- package/computer-use-server/.dockerignore +13 -0
- package/computer-use-server/Dockerfile +44 -0
- package/computer-use-server/README.md +84 -0
- package/computer-use-server/app.py +1544 -0
- package/computer-use-server/bin/list-subagent-models +449 -0
- package/computer-use-server/cli-defaults/README.md +31 -0
- package/computer-use-server/cli-defaults/codex.json +7 -0
- package/computer-use-server/cli-defaults/opencode.json +18 -0
- package/computer-use-server/cli_adapters/__init__.py +46 -0
- package/computer-use-server/cli_adapters/claude.py +163 -0
- package/computer-use-server/cli_adapters/codex.py +163 -0
- package/computer-use-server/cli_adapters/opencode.py +169 -0
- package/computer-use-server/cli_adapters/result.py +34 -0
- package/computer-use-server/cli_runtime.py +316 -0
- package/computer-use-server/context_vars.py +24 -0
- package/computer-use-server/docker_manager.py +1100 -0
- package/computer-use-server/docs_html.py +12 -0
- package/computer-use-server/mcp_resources.py +170 -0
- package/computer-use-server/mcp_tools.py +1430 -0
- package/computer-use-server/requirements.txt +17 -0
- package/computer-use-server/security.py +50 -0
- package/computer-use-server/skill_manager.py +664 -0
- package/computer-use-server/static/browser-viewer.js +445 -0
- package/computer-use-server/static/chart.umd.js +14 -0
- package/computer-use-server/static/docs.html +203 -0
- package/computer-use-server/static/github-dark.min.css +10 -0
- package/computer-use-server/static/github.min.css +10 -0
- package/computer-use-server/static/highlight.min.js +1213 -0
- package/computer-use-server/static/highlightjs-line-numbers.min.js +1 -0
- package/computer-use-server/static/icons.js +74 -0
- package/computer-use-server/static/jszip.min.js +13 -0
- package/computer-use-server/static/katex/auto-render.min.js +1 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/katex.min.css +1 -0
- package/computer-use-server/static/katex/katex.min.js +1 -0
- package/computer-use-server/static/locale.js +242 -0
- package/computer-use-server/static/mammoth.browser.min.js +21 -0
- package/computer-use-server/static/marked.min.js +6 -0
- package/computer-use-server/static/mermaid.min.js +2811 -0
- package/computer-use-server/static/pdf.min.js +22 -0
- package/computer-use-server/static/pdf.worker.min.js +22 -0
- package/computer-use-server/static/pptxviewjs.min.js +1 -0
- package/computer-use-server/static/preact-htm.min.js +1 -0
- package/computer-use-server/static/preview.css +1030 -0
- package/computer-use-server/static/preview.js +1522 -0
- package/computer-use-server/static/xlsx.full.min.js +22 -0
- package/computer-use-server/static/xterm-addon-fit.min.js +2 -0
- package/computer-use-server/static/xterm-addon-web-links.min.js +2 -0
- package/computer-use-server/static/xterm.css +218 -0
- package/computer-use-server/static/xterm.min.js +2 -0
- package/computer-use-server/system_prompt.py +761 -0
- package/computer-use-server/uploads.py +82 -0
- package/contracts/README.md +53 -0
- package/contracts/audit/audit-fanin.asyncapi.yaml +407 -0
- package/contracts/exec/exec-channel.schema.json +240 -0
- package/contracts/mcp/2025-06-18/ocu-constraints.schema.json +178 -0
- package/contracts/storage/file-artifact-api.schema.json +390 -0
- package/contracts/storage/file-ops.schema.json +217 -0
- package/contracts/storage/mount-config.schema.json +197 -0
- package/cron/Dockerfile +15 -0
- package/cron/cleanup-quick.sh +21 -0
- package/cron/cleanup.sh +127 -0
- package/data/outputs/.gitkeep +0 -0
- package/data/uploads/.gitkeep +0 -0
- package/docker-compose.test.yml +54 -0
- package/docker-compose.webui.yml +77 -0
- package/docker-compose.yml +96 -0
- package/docs/CLOUD.md +29 -0
- package/docs/COMPARISON.md +128 -0
- package/docs/DOCKER.md +469 -0
- package/docs/DYNAMIC-SKILLS.md +77 -0
- package/docs/FEATURES.md +100 -0
- package/docs/INSTALL.md +111 -0
- package/docs/KNOWN-BUGS.md +86 -0
- package/docs/MCP.md +320 -0
- package/docs/SCREENSHOTS.md +39 -0
- package/docs/SKILLS-USER-GUIDE.md +86 -0
- package/docs/SKILLS.md +483 -0
- package/docs/TERMINAL-TAB.md +56 -0
- package/docs/architecture/02-trust-boundaries.md +224 -0
- package/docs/architecture/03-c4-context.md +61 -0
- package/docs/architecture/04-bounded-contexts.md +119 -0
- package/docs/architecture/05-c4-container.md +88 -0
- package/docs/architecture/06-threat-model.md +172 -0
- package/docs/architecture/08-contracts.md +105 -0
- package/docs/architecture/MANIFESTO.md +38 -0
- package/docs/architecture/PROCESS.md +64 -0
- package/docs/architecture/README.md +37 -0
- package/docs/architecture/adr/0000-template.md +65 -0
- package/docs/architecture/adr/0001-layer-0-gate-legacy-exclusion.md +75 -0
- package/docs/architecture/adr/0002-session-view-descriptor.md +57 -0
- package/docs/architecture/adr/0003-sandbox-runtime-tier-ladder.md +63 -0
- package/docs/architecture/adr/0004-operator-authentication-substrate.md +63 -0
- package/docs/architecture/adr/0005-egress-credential-delivery-envoy-sds.md +62 -0
- package/docs/architecture/adr/0006-egress-forward-proxy-substrate.md +65 -0
- package/docs/architecture/adr/0007-egress-auth-mechanism.md +72 -0
- package/docs/architecture/adr/0008-session-egress-attribution.md +59 -0
- package/docs/architecture/adr/0009-audit-pipeline-pluggable-by-contract.md +76 -0
- package/docs/architecture/adr/0010-storage-backend-pluggable-adapter.md +60 -0
- package/docs/architecture/adr/0011-storage-egress-lane.md +67 -0
- package/docs/architecture/adr/0012-implementation-language.md +67 -0
- package/docs/architecture/adr/0020-sandbox-image-provisioning.md +82 -0
- package/docs/architecture/adr/README.md +53 -0
- package/docs/architecture/compliance/.gitkeep +0 -0
- package/docs/architecture/components/00-overview.md +42 -0
- package/docs/architecture/components/0000-template.md +50 -0
- package/docs/architecture/components/01-mcp-gateway.md +80 -0
- package/docs/architecture/components/02-control-operator-api.md +80 -0
- package/docs/architecture/components/04-storage-broker.md +104 -0
- package/docs/architecture/components/05-session-sandbox.md +93 -0
- package/docs/architecture/components/06-egress-trust-edge.md +95 -0
- package/docs/architecture/components/07-audit-pipeline.md +110 -0
- package/docs/architecture/diagrams/.gitkeep +0 -0
- package/docs/architecture/diagrams/02-trust-boundaries.mmd +111 -0
- package/docs/architecture/diagrams/06-threat-model.mmd +41 -0
- package/docs/architecture/diagrams/08-contracts.mmd +47 -0
- package/docs/architecture/diagrams/c4-container.mmd +59 -0
- package/docs/architecture/diagrams/c4-context.mmd +46 -0
- package/docs/architecture/glossary.md +172 -0
- package/docs/architecture/manifesto/.gitkeep +0 -0
- package/docs/architecture/manifesto/01-audience-and-buyer.md +57 -0
- package/docs/architecture/manifesto/02-nfrs.md +325 -0
- package/docs/architecture/manifesto/03-non-negotiables.md +35 -0
- package/docs/architecture/manifesto/04-non-goals.md +23 -0
- package/docs/architecture/manifesto/05-licensing-posture.md +61 -0
- package/docs/architecture/manifesto/06-starter-mode-policy.md +49 -0
- package/docs/architecture/manifesto/07-governance.md +60 -0
- package/docs/architecture/primitives-backlog.md +51 -0
- package/docs/architecture.svg +117 -0
- package/docs/claude-code-gateway.md +173 -0
- package/docs/cli-config-templates.md +240 -0
- package/docs/data-flow.svg +72 -0
- package/docs/demo-landing-page.gif +0 -0
- package/docs/demo-qwen-trending.gif +0 -0
- package/docs/dynamic-skills.svg +77 -0
- package/docs/file-flow.svg +126 -0
- package/docs/future-architecture/README.md +152 -0
- package/docs/future-architecture/adr/0001-control-plane-language-go.md +80 -0
- package/docs/future-architecture/adr/0002-guest-agent-language-go.md +84 -0
- package/docs/future-architecture/adr/0003-docker-poc-first-then-k8s.md +37 -0
- package/docs/future-architecture/adr/0004-pluggable-runtime-via-runtimeclass.md +34 -0
- package/docs/future-architecture/adr/0005-mcp-as-control-plane-gateway.md +34 -0
- package/docs/future-architecture/adr/0006-no-agpl-no-bsl-dependencies.md +41 -0
- package/docs/future-architecture/adr/0007-superseded-by-future-architecture.md +37 -0
- package/docs/future-architecture/adr/0008-internal-grpc-external-rest-mcp.md +106 -0
- package/docs/future-architecture/adr/0009-external-protocol-dialects.md +94 -0
- package/docs/future-architecture/adr/0010-lambda-as-inspiration-not-runtime.md +86 -0
- package/docs/future-architecture/adr/0011-kata-as-first-class-dind-runtime.md +84 -0
- package/docs/future-architecture/antipatterns.md +552 -0
- package/docs/future-architecture/architecture/01-layers.md +109 -0
- package/docs/future-architecture/architecture/02-layer4-control-plane.md +122 -0
- package/docs/future-architecture/architecture/03-layer3-providers.md +174 -0
- package/docs/future-architecture/architecture/04-layer2-runtimes.md +114 -0
- package/docs/future-architecture/architecture/04b-credential-broker.md +153 -0
- package/docs/future-architecture/architecture/05-layer1-guest-agent.md +138 -0
- package/docs/future-architecture/architecture/06-storage.md +134 -0
- package/docs/future-architecture/architecture/07-security.md +194 -0
- package/docs/future-architecture/architecture/08-networking.md +149 -0
- package/docs/future-architecture/architecture/09-templates.md +122 -0
- package/docs/future-architecture/architecture/10-observability.md +121 -0
- package/docs/future-architecture/design-notes.md +72 -0
- package/docs/future-architecture/gaps.md +281 -0
- package/docs/future-architecture/phase-template.md +123 -0
- package/docs/future-architecture/references.md +225 -0
- package/docs/future-architecture/research/01-kata-containers.md +100 -0
- package/docs/future-architecture/research/02-e2b-infra.md +133 -0
- package/docs/future-architecture/research/03-coder.md +115 -0
- package/docs/future-architecture/research/04-cloud-hypervisor.md +99 -0
- package/docs/future-architecture/research/05-firecracker.md +114 -0
- package/docs/future-architecture/research/06-agent-sandbox.md +142 -0
- package/docs/future-architecture/research/07-chromedp.md +78 -0
- package/docs/future-architecture/research/08-microsandbox.md +78 -0
- package/docs/future-architecture/research/09-agentbox.md +135 -0
- package/docs/future-architecture/research/10-sysbox.md +100 -0
- package/docs/future-architecture/research/11-firecracker-containerd.md +93 -0
- package/docs/future-architecture/research/12-docker-socket-proxy.md +59 -0
- package/docs/future-architecture/research/14-e2b-desktop-and-surf.md +107 -0
- package/docs/future-architecture/research/18-open-webui-terminals-observed.md +135 -0
- package/docs/future-architecture/research/bank-buyer.md +96 -0
- package/docs/future-architecture/research/enthusiast-audience.md +106 -0
- package/docs/future-architecture/research/proof-uipath-anthropic-2026-05.md +76 -0
- package/docs/future-architecture/research/widemoat-thesis-advisor.md +124 -0
- package/docs/future-architecture/roadmap.md +438 -0
- package/docs/kata-runtime.md +267 -0
- package/docs/kubernetes.md +86 -0
- package/docs/logo.png +0 -0
- package/docs/multi-cli.md +161 -0
- package/docs/openwebui-filter.md +134 -0
- package/docs/roadmap/implementation-roadmap.md +104 -0
- package/docs/sandbox-contents.svg +229 -0
- package/docs/screenshots/01-create-document.png +0 -0
- package/docs/screenshots/02-file-preview.png +0 -0
- package/docs/screenshots/03-browser-viewer.png +0 -0
- package/docs/screenshots/04-sub-agent-terminal.png +0 -0
- package/docs/screenshots/05-chat-overview.png +0 -0
- package/docs/screenshots/06-sub-agent-dashboard.png +0 -0
- package/docs/screenshots/07-frontend-design-skill.png +0 -0
- package/docs/screenshots/08-pptx-skill.png +0 -0
- package/docs/screenshots/09-skill-creator.png +0 -0
- package/docs/screenshots/10-data-chart.png +0 -0
- package/docs/shared-browser.svg +102 -0
- package/docs/system-prompt.md +113 -0
- package/docs/terminal-flow.svg +69 -0
- package/examples/helm/README.md +20 -0
- package/examples/helm/standalone/values.yaml +49 -0
- package/examples/helm/with-open-webui/README.md +99 -0
- package/examples/helm/with-open-webui/values-computer-use.yaml +32 -0
- package/examples/helm/with-open-webui/values-open-webui.yaml +67 -0
- package/fonts/NotoEmoji-Regular.ttf +0 -0
- package/helm/computer-use-server/.helmignore +17 -0
- package/helm/computer-use-server/Chart.yaml +32 -0
- package/helm/computer-use-server/README.md +211 -0
- package/helm/computer-use-server/templates/NOTES.txt +66 -0
- package/helm/computer-use-server/templates/_helpers.tpl +115 -0
- package/helm/computer-use-server/templates/configmap-dind-init.yaml +82 -0
- package/helm/computer-use-server/templates/configmap.yaml +18 -0
- package/helm/computer-use-server/templates/deployment.yaml +248 -0
- package/helm/computer-use-server/templates/ingress.yaml +38 -0
- package/helm/computer-use-server/templates/networkpolicy.yaml +50 -0
- package/helm/computer-use-server/templates/pdb.yaml +16 -0
- package/helm/computer-use-server/templates/pvc-data.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-skills-cache.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-user-data.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-var-lib-docker.yaml +27 -0
- package/helm/computer-use-server/templates/secret.yaml +23 -0
- package/helm/computer-use-server/templates/service.yaml +22 -0
- package/helm/computer-use-server/templates/serviceaccount.yaml +15 -0
- package/helm/computer-use-server/templates/tests/test-health.yaml +23 -0
- package/helm/computer-use-server/values.schema.json +183 -0
- package/helm/computer-use-server/values.yaml +297 -0
- package/lychee.toml +36 -0
- package/openwebui/Dockerfile +52 -0
- package/openwebui/README.md +38 -0
- package/openwebui/functions/README.md +48 -0
- package/openwebui/functions/computer_link_filter.py +487 -0
- package/openwebui/init.sh +305 -0
- package/openwebui/patches/README.md +44 -0
- package/openwebui/patches/fix_artifacts_auto_show.py +441 -0
- package/openwebui/patches/fix_attached_files_position.py +87 -0
- package/openwebui/patches/fix_large_tool_args.py +156 -0
- package/openwebui/patches/fix_large_tool_results.py +289 -0
- package/openwebui/patches/fix_preview_url_detection.py +230 -0
- package/openwebui/patches/fix_skip_embedding_chat_files.py +229 -0
- package/openwebui/patches/fix_skip_rag_files_native_fc.py +100 -0
- package/openwebui/patches/fix_tool_loop_errors.py +510 -0
- package/package.json +39 -0
- package/requirements.txt +112 -0
- package/scripts/check-config.sh +141 -0
- package/scripts/docs-lint/ai-slop-detector.sh +202 -0
- package/scripts/docs-lint/architecture-tree-whitelist.sh +131 -0
- package/scripts/docs-lint/ascii-diagram-detector.sh +58 -0
- package/scripts/docs-lint/front-matter-validator.sh +97 -0
- package/scripts/docs-lint/gitignored-ref-detector.sh +122 -0
- package/scripts/docs-lint/identity-email-detector.sh +48 -0
- package/scripts/docs-lint/test-linters.sh +354 -0
- package/scripts/docs-lint/wc-budget.sh +61 -0
- package/scripts/githooks/pre-push +75 -0
- package/server.json +13 -0
- package/settings-wrapper/Dockerfile +9 -0
- package/settings-wrapper/README.md +119 -0
- package/settings-wrapper/app.py +113 -0
- package/settings-wrapper/requirements.txt +2 -0
- package/settings-wrapper/skills.json +25 -0
- package/skills/README.md +46 -0
- package/skills/examples/algorithmic-art/SKILL.md +405 -0
- package/skills/examples/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/examples/algorithmic-art/templates/viewer.html +601 -0
- package/skills/examples/artifacts-builder/SKILL.md +74 -0
- package/skills/examples/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/examples/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/examples/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/examples/canvas-design/LICENSE.txt +202 -0
- package/skills/examples/canvas-design/SKILL.md +130 -0
- package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/examples/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/examples/copy-editing/SKILL.md +447 -0
- package/skills/examples/copy-editing/evals/evals.json +89 -0
- package/skills/examples/copy-editing/references/plain-english-alternatives.md +394 -0
- package/skills/examples/internal-comms/LICENSE.txt +202 -0
- package/skills/examples/internal-comms/SKILL.md +32 -0
- package/skills/examples/internal-comms/examples/3p-updates.md +47 -0
- package/skills/examples/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/examples/internal-comms/examples/faq-answers.md +30 -0
- package/skills/examples/internal-comms/examples/general-comms.md +16 -0
- package/skills/examples/mcp-builder/SKILL.md +328 -0
- package/skills/examples/mcp-builder/reference/evaluation.md +602 -0
- package/skills/examples/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/examples/mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/examples/mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/examples/mcp-builder/scripts/connections.py +151 -0
- package/skills/examples/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/examples/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/examples/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/examples/product-marketing-context/SKILL.md +241 -0
- package/skills/examples/product-marketing-context/evals/evals.json +85 -0
- package/skills/examples/single-cell-rna-qc/SKILL.md +175 -0
- package/skills/examples/single-cell-rna-qc/references/scverse_qc_guidelines.md +186 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_analysis.py +232 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_core.py +233 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_plotting.py +235 -0
- package/skills/examples/skill-creator/SKILL.md +355 -0
- package/skills/examples/skill-creator/references/output-patterns.md +82 -0
- package/skills/examples/skill-creator/references/workflows.md +28 -0
- package/skills/examples/skill-creator/scripts/init_skill.py +303 -0
- package/skills/examples/skill-creator/scripts/package_skill.py +110 -0
- package/skills/examples/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/examples/slack-gif-creator/SKILL.md +254 -0
- package/skills/examples/slack-gif-creator/core/easing.py +234 -0
- package/skills/examples/slack-gif-creator/core/frame_composer.py +176 -0
- package/skills/examples/slack-gif-creator/core/gif_builder.py +269 -0
- package/skills/examples/slack-gif-creator/core/validators.py +136 -0
- package/skills/examples/slack-gif-creator/requirements.txt +4 -0
- package/skills/examples/social-content/SKILL.md +278 -0
- package/skills/examples/social-content/evals/evals.json +92 -0
- package/skills/examples/social-content/references/platforms.md +170 -0
- package/skills/examples/social-content/references/post-templates.md +177 -0
- package/skills/examples/social-content/references/reverse-engineering.md +195 -0
- package/skills/examples/theme-factory/SKILL.md +59 -0
- package/skills/examples/theme-factory/theme-showcase.pdf +0 -0
- package/skills/examples/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/examples/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/examples/theme-factory/themes/desert-rose.md +19 -0
- package/skills/examples/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/examples/theme-factory/themes/golden-hour.md +19 -0
- package/skills/examples/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/examples/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/examples/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/examples/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/examples/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/examples/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/examples/web-artifacts-builder/SKILL.md +74 -0
- package/skills/examples/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/examples/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/examples/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/examples/writing-skills/SKILL.md +655 -0
- package/skills/examples/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/examples/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/examples/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/examples/writing-skills/persuasion-principles.md +187 -0
- package/skills/examples/writing-skills/render-graphs.js +168 -0
- package/skills/examples/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/public/describe-image/SKILL.md +105 -0
- package/skills/public/describe-image/scripts/describe.py +389 -0
- package/skills/public/doc-coauthoring/SKILL.md +375 -0
- package/skills/public/docx/LICENSE.txt +30 -0
- package/skills/public/docx/SKILL.md +199 -0
- package/skills/public/docx/docx-js.md +350 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/public/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/public/docx/ooxml/scripts/pack.py +159 -0
- package/skills/public/docx/ooxml/scripts/unpack.py +29 -0
- package/skills/public/docx/ooxml/scripts/validate.py +69 -0
- package/skills/public/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/public/docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/public/docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/public/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/public/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/public/docx/ooxml.md +632 -0
- package/skills/public/docx/scripts/__init__.py +1 -0
- package/skills/public/docx/scripts/document.py +1292 -0
- package/skills/public/docx/scripts/templates/comments.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/public/docx/scripts/templates/people.xml +3 -0
- package/skills/public/docx/scripts/utilities.py +374 -0
- package/skills/public/file-reading/LICENSE.txt +30 -0
- package/skills/public/file-reading/SKILL.md +350 -0
- package/skills/public/frontend-design/LICENSE.txt +177 -0
- package/skills/public/frontend-design/SKILL.md +42 -0
- package/skills/public/gitlab-explorer/SKILL.md +174 -0
- package/skills/public/gitlab-explorer/references/git-commands.md +323 -0
- package/skills/public/gitlab-explorer/references/glab-commands.md +282 -0
- package/skills/public/gitlab-explorer/scripts/check_gitlab_auth.sh +109 -0
- package/skills/public/pdf/FORMS.md +205 -0
- package/skills/public/pdf/REFERENCE.md +612 -0
- package/skills/public/pdf/SKILL.md +364 -0
- package/skills/public/pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/public/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/public/pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/public/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/public/pdf/scripts/create_validation_image.py +41 -0
- package/skills/public/pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/public/pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/public/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/public/pdf-reading/LICENSE.txt +30 -0
- package/skills/public/pdf-reading/REFERENCE.md +196 -0
- package/skills/public/pdf-reading/SKILL.md +305 -0
- package/skills/public/playwright-cli/SKILL.md +278 -0
- package/skills/public/playwright-cli/references/request-mocking.md +87 -0
- package/skills/public/playwright-cli/references/running-code.md +232 -0
- package/skills/public/playwright-cli/references/session-management.md +169 -0
- package/skills/public/playwright-cli/references/storage-state.md +275 -0
- package/skills/public/playwright-cli/references/test-generation.md +88 -0
- package/skills/public/playwright-cli/references/tracing.md +139 -0
- package/skills/public/playwright-cli/references/video-recording.md +43 -0
- package/skills/public/pptx/LICENSE.txt +30 -0
- package/skills/public/pptx/SKILL.md +484 -0
- package/skills/public/pptx/css.md +335 -0
- package/skills/public/pptx/html2pptx.md +893 -0
- package/skills/public/pptx/html2pptx.tgz +0 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/public/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/public/pptx/ooxml/scripts/pack.py +159 -0
- package/skills/public/pptx/ooxml/scripts/unpack.py +29 -0
- package/skills/public/pptx/ooxml/scripts/validate.py +69 -0
- package/skills/public/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/public/pptx/ooxml/scripts/validation/base.py +951 -0
- package/skills/public/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/public/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/public/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/public/pptx/ooxml.md +427 -0
- package/skills/public/pptx/scripts/inventory.py +1020 -0
- package/skills/public/pptx/scripts/rearrange.py +231 -0
- package/skills/public/pptx/scripts/replace.py +385 -0
- package/skills/public/pptx/scripts/thumbnail.py +450 -0
- package/skills/public/skill-creator/SKILL.md +356 -0
- package/skills/public/skill-creator/references/output-patterns.md +82 -0
- package/skills/public/skill-creator/references/workflows.md +28 -0
- package/skills/public/skill-creator/scripts/init_skill.py +303 -0
- package/skills/public/skill-creator/scripts/package_skill.py +110 -0
- package/skills/public/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/public/sub-agent/SKILL.md +186 -0
- package/skills/public/sub-agent/references/security-review.md +153 -0
- package/skills/public/sub-agent/references/usage.md +207 -0
- package/skills/public/sub-agent/scripts/list_subagent_models.sh +22 -0
- package/skills/public/test-driven-development/SKILL.md +371 -0
- package/skills/public/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/public/webapp-testing/LICENSE.txt +202 -0
- package/skills/public/webapp-testing/SKILL.md +96 -0
- package/skills/public/webapp-testing/examples/console_logging.py +35 -0
- package/skills/public/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/public/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/public/webapp-testing/scripts/with_server.py +106 -0
- package/skills/public/xlsx/LICENSE.txt +30 -0
- package/skills/public/xlsx/SKILL.md +316 -0
- package/skills/public/xlsx/preview_data.py +93 -0
- package/skills/public/xlsx/recalc.py +178 -0
- package/tests/README.md +42 -0
- package/tests/fixtures/cli/claude_v0.9.2.0_argv.json +46 -0
- package/tests/fixtures/cli/claude_v0.9.2.0_stdout.json +32 -0
- package/tests/fixtures/cli/codex_run.jsonl +4 -0
- package/tests/fixtures/cli/opencode_run.jsonl +6 -0
- package/tests/integration/README.md +56 -0
- package/tests/integration/conftest.py +280 -0
- package/tests/integration/pytest.ini +13 -0
- package/tests/integration/test_mcp_auth.py +85 -0
- package/tests/integration/test_mcp_tools.py +101 -0
- package/tests/integration/test_workspace_lifecycle.py +125 -0
- package/tests/orchestrator/mock_llm_server.py +343 -0
- package/tests/orchestrator/test_cli_adapters.py +566 -0
- package/tests/orchestrator/test_cli_adapters_live.py +527 -0
- package/tests/orchestrator/test_cli_runtime.py +451 -0
- package/tests/orchestrator/test_docker_manager.py +302 -0
- package/tests/orchestrator/test_dynamic_instructions.py +69 -0
- package/tests/orchestrator/test_mcp_resources.py +140 -0
- package/tests/orchestrator/test_mcp_tools.py +224 -0
- package/tests/orchestrator/test_passthrough_isolation.py +201 -0
- package/tests/orchestrator/test_readme_in_container.py +76 -0
- package/tests/orchestrator/test_render_cache.py +84 -0
- package/tests/orchestrator/test_runtime_cli_endpoint.py +108 -0
- package/tests/orchestrator/test_single_user_mode.py +212 -0
- package/tests/orchestrator/test_startup_warnings.py +123 -0
- package/tests/orchestrator/test_sub_agent_dispatch.py +327 -0
- package/tests/orchestrator/test_subagent_claude_compat.py +367 -0
- package/tests/orchestrator/test_system_prompt_endpoint.py +191 -0
- package/tests/orchestrator/test_tool_descriptions.py +52 -0
- package/tests/orchestrator/test_view_image.py +201 -0
- package/tests/patches/conftest.py +30 -0
- package/tests/patches/fixtures/__init__.py +10 -0
- package/tests/patches/fixtures/middleware_v0.9.1.py +5057 -0
- package/tests/patches/fixtures/middleware_v0.9.2.py +5120 -0
- package/tests/patches/fixtures/retrieval_v0.9.1.py +2684 -0
- package/tests/patches/fixtures/retrieval_v0.9.2.py +2700 -0
- package/tests/patches/test_fix_attached_files_position.py +118 -0
- package/tests/patches/test_fix_large_tool_args.py +130 -0
- package/tests/patches/test_fix_large_tool_results.py +531 -0
- package/tests/patches/test_fix_skip_embedding_chat_files.py +160 -0
- package/tests/patches/test_fix_skip_rag_files_native_fc.py +120 -0
- package/tests/patches/test_fix_tool_loop_errors.py +128 -0
- package/tests/security/test_path_traversal_app.py +132 -0
- package/tests/security/test_path_traversal_docker.py +36 -0
- package/tests/security/test_path_traversal_settings.py +87 -0
- package/tests/security/test_safe_path_util.py +166 -0
- package/tests/security/test_xss_preview.py +46 -0
- package/tests/test-default-model-resolution.py +136 -0
- package/tests/test-docker-image.sh +358 -0
- package/tests/test-list-subagent-models.sh +421 -0
- package/tests/test-mcp-endpoint-live.sh +92 -0
- package/tests/test-mcp-native-surface.sh +213 -0
- package/tests/test-no-cyrillic.sh +135 -0
- package/tests/test-opencode-error-mapping.py +130 -0
- package/tests/test-pr88-skills.sh +305 -0
- package/tests/test-project-structure.sh +202 -0
- package/tests/test-single-user-mode.sh +269 -0
- package/tests/test-skill-no-hardcoded-models.sh +65 -0
- package/tests/test-subagent-cli-surface.py +137 -0
- package/tests/test-subagent-runtime.sh +109 -0
- package/tests/test_codex_toml_converter.py +204 -0
- package/tests/test_default_resolver_no_legacy_global.py +159 -0
- package/tests/test_filter.py +648 -0
- package/tests/test_init_sh_unchanged.sh +49 -0
- package/tests/test_opencode_alias_map_drop.py +144 -0
- package/tests/test_requirements.py +91 -0
- package/tests/test_subagent_docstring.py +193 -0
- package/tests/test_tools.py +34 -0
- package/vendor/extract-text/README.md +46 -0
- package/vendor/extract-text/extract-text +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
#
|
|
5
|
+
# gitignored-ref-detector — fail when a doc references a path that the
|
|
6
|
+
# reader cannot open from a clean git clone.
|
|
7
|
+
#
|
|
8
|
+
# The rule: docs under `docs/architecture/` and `docs/future-architecture/`
|
|
9
|
+
# are reference material that someone who cloned the repo must be able to
|
|
10
|
+
# follow. If a doc cites a path that is gitignored, the reader sees a dead
|
|
11
|
+
# link and the architecture becomes self-referential to a private working
|
|
12
|
+
# directory.
|
|
13
|
+
#
|
|
14
|
+
# The set of local-only directory prefixes to treat as private is supplied
|
|
15
|
+
# out-of-band via the LOCAL_REF_DIRS environment variable (colon-separated).
|
|
16
|
+
# It defaults to empty, in which case only `git check-ignore` drives the
|
|
17
|
+
# finding. No literal local directory name is embedded in this script.
|
|
18
|
+
#
|
|
19
|
+
# This linter walks every markdown file under the doc roots, extracts file
|
|
20
|
+
# paths (anything that looks like `path/to/file.ext`), and fails if any of
|
|
21
|
+
# those paths is gitignored.
|
|
22
|
+
#
|
|
23
|
+
# Allowed exceptions (implemented below):
|
|
24
|
+
# - paths that resolve to URLs (http:// https://)
|
|
25
|
+
# - absolute non-repo paths (starting with `/`)
|
|
26
|
+
# - command-fragment heuristic for /dev/null, /proc/*, /tmp/*, /etc/*,
|
|
27
|
+
# /var/*, /home/*, /usr/* — these are filesystem paths in commands,
|
|
28
|
+
# not repo references
|
|
29
|
+
#
|
|
30
|
+
# Currently not separately filtered (rely on `git check-ignore` instead):
|
|
31
|
+
# - paths under `docs/` (docs-tree paths are checked like any other —
|
|
32
|
+
# if a doc path is gitignored, that is itself a finding)
|
|
33
|
+
# - paths under `.planning/` (gitignored by repo policy; would correctly
|
|
34
|
+
# fire here, but `.planning/` is not in the doc roots scanned, so
|
|
35
|
+
# references to it from inside `docs/` would correctly fail)
|
|
36
|
+
#
|
|
37
|
+
# Run from repo root: scripts/docs-lint/gitignored-ref-detector.sh
|
|
38
|
+
|
|
39
|
+
set -euo pipefail
|
|
40
|
+
|
|
41
|
+
ROOT="$(git rev-parse --show-toplevel)"
|
|
42
|
+
cd "$ROOT"
|
|
43
|
+
|
|
44
|
+
DOC_ROOTS=(
|
|
45
|
+
docs/architecture
|
|
46
|
+
docs/future-architecture
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Local-only directory prefixes (colon-separated), supplied out-of-band.
|
|
50
|
+
# Defaults to empty: with no value set, only `git check-ignore` drives the
|
|
51
|
+
# finding and this extra prefix match is a no-op.
|
|
52
|
+
LOCAL_REF_DIRS="${LOCAL_REF_DIRS:-}"
|
|
53
|
+
IFS=':' read -r -a LOCAL_PREFIXES <<< "$LOCAL_REF_DIRS"
|
|
54
|
+
|
|
55
|
+
fail=0
|
|
56
|
+
total_refs=0
|
|
57
|
+
|
|
58
|
+
for root in "${DOC_ROOTS[@]}"; do
|
|
59
|
+
[ -d "$root" ] || continue
|
|
60
|
+
|
|
61
|
+
while IFS= read -r -d '' doc; do
|
|
62
|
+
# Extract candidate filesystem paths:
|
|
63
|
+
# - inside backticks
|
|
64
|
+
# - markdown links [text](path)
|
|
65
|
+
# - bare path/with/slashes.ext occurrences
|
|
66
|
+
# Filter to things that look like a real path (contain `/` and end in
|
|
67
|
+
# a known extension OR look like a directory path).
|
|
68
|
+
candidates=$(grep -ohE '(\[[^]]*\]\(([^)]+)\))|(`[^`]+`)|([A-Za-z0-9_./-]+\.(md|mmd|yaml|yml|json|sh|py|go|rs|ts|tsx|js|jsx|toml|conf|txt|zip|html|svg|png|jpg))' "$doc" \
|
|
69
|
+
| sed -E 's/^\[[^]]*\]\(([^)]+)\)$/\1/' \
|
|
70
|
+
| sed -E 's/^`(.+)`$/\1/' \
|
|
71
|
+
| grep -vE '^https?://' \
|
|
72
|
+
| grep -vE '^#' \
|
|
73
|
+
| grep -E '/' \
|
|
74
|
+
| sort -u || true)
|
|
75
|
+
|
|
76
|
+
while IFS= read -r path; do
|
|
77
|
+
[ -z "$path" ] && continue
|
|
78
|
+
# strip line-number suffix like file.md:42 or file.md#anchor
|
|
79
|
+
clean=$(echo "$path" | sed -E 's/[:#].*$//')
|
|
80
|
+
# strip leading ./ or ../
|
|
81
|
+
clean=$(echo "$clean" | sed -E 's|^\./||; s|^(\.\./)+||')
|
|
82
|
+
# skip URLs and absolute non-repo paths
|
|
83
|
+
case "$clean" in
|
|
84
|
+
http*|/*) continue ;;
|
|
85
|
+
esac
|
|
86
|
+
# skip well-known non-path matches (heuristic: command-like fragments)
|
|
87
|
+
case "$clean" in
|
|
88
|
+
*/dev/null|*/proc/*|*/tmp/*|*/etc/*|*/var/*|*/home/*|*/usr/*) continue ;;
|
|
89
|
+
esac
|
|
90
|
+
|
|
91
|
+
total_refs=$((total_refs + 1))
|
|
92
|
+
|
|
93
|
+
# Local-only prefix match (only when LOCAL_REF_DIRS is set).
|
|
94
|
+
for prefix in "${LOCAL_PREFIXES[@]}"; do
|
|
95
|
+
[ -z "$prefix" ] && continue
|
|
96
|
+
case "$clean" in
|
|
97
|
+
"$prefix"|"$prefix"/*)
|
|
98
|
+
echo "FAIL: $doc references local-only path: $clean"
|
|
99
|
+
fail=1
|
|
100
|
+
;;
|
|
101
|
+
esac
|
|
102
|
+
done
|
|
103
|
+
|
|
104
|
+
# `git check-ignore` exits 0 if path is gitignored
|
|
105
|
+
if git check-ignore -q "$clean" 2>/dev/null; then
|
|
106
|
+
echo "FAIL: $doc references gitignored path: $clean"
|
|
107
|
+
fail=1
|
|
108
|
+
fi
|
|
109
|
+
done <<< "$candidates"
|
|
110
|
+
done < <(find "$root" -type f -name '*.md' -print0)
|
|
111
|
+
done
|
|
112
|
+
|
|
113
|
+
if [ "$fail" -eq 1 ]; then
|
|
114
|
+
echo ""
|
|
115
|
+
echo "gitignored-ref-detector: at least one doc references a path the reader"
|
|
116
|
+
echo "cannot open. Either remove the reference, replace it with a public"
|
|
117
|
+
echo "citation (e.g. a regulator URL, a public Anthropic doc URL, an in-repo"
|
|
118
|
+
echo "file under docs/), or move the cited content into the repo."
|
|
119
|
+
exit 1
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
echo "gitignored-ref-detector: scanned $total_refs refs, all reachable."
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
#
|
|
5
|
+
# Identity-email detector — the project commits and authors under the
|
|
6
|
+
# Wide-Moat org identity, not a personal address.
|
|
7
|
+
#
|
|
8
|
+
# banned: i@yambr.com
|
|
9
|
+
# canonical: developer@widemoat.ai
|
|
10
|
+
#
|
|
11
|
+
# This gate scans tracked file content (docs, code, configs) for the banned
|
|
12
|
+
# address and tells the author to rewrite it. Commit *metadata* (author /
|
|
13
|
+
# committer email) is enforced separately by the pre-push hook; this script
|
|
14
|
+
# only covers the file-content surface so the same rule holds in CI.
|
|
15
|
+
#
|
|
16
|
+
# Exits 1 if the banned address appears in any tracked file.
|
|
17
|
+
|
|
18
|
+
set -uo pipefail
|
|
19
|
+
|
|
20
|
+
ROOT="$(git rev-parse --show-toplevel)"
|
|
21
|
+
cd "$ROOT"
|
|
22
|
+
|
|
23
|
+
BANNED="i@yambr.com"
|
|
24
|
+
CANONICAL="developer@widemoat.ai"
|
|
25
|
+
|
|
26
|
+
# Search tracked files only; never descend into references/ (vendored repos)
|
|
27
|
+
# or .git. -I skips binary files. Fixed-string match so the dot is literal.
|
|
28
|
+
# The two policy scripts (this detector and the pre-push hook) name the banned
|
|
29
|
+
# address on purpose, to define the rule — exclude them so the gate does not
|
|
30
|
+
# flag its own definition.
|
|
31
|
+
hits="$(git grep -InF "$BANNED" -- \
|
|
32
|
+
':(exclude)references/**' \
|
|
33
|
+
':(exclude)*.sample' \
|
|
34
|
+
':(exclude)scripts/docs-lint/identity-email-detector.sh' \
|
|
35
|
+
':(exclude)scripts/githooks/pre-push' \
|
|
36
|
+
2>/dev/null || true)"
|
|
37
|
+
|
|
38
|
+
if [ -n "$hits" ]; then
|
|
39
|
+
echo "-----------------------------------------------------------------"
|
|
40
|
+
echo "BLOCKED: the personal address '$BANNED' appears in tracked files."
|
|
41
|
+
echo "Rewrite it to the project identity: $CANONICAL"
|
|
42
|
+
echo ""
|
|
43
|
+
echo "$hits" | sed 's/^/ /'
|
|
44
|
+
echo "-----------------------------------------------------------------"
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
exit 0
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
#
|
|
5
|
+
# Linter self-test: prove each gate catches the violation it's supposed to.
|
|
6
|
+
#
|
|
7
|
+
# Creates temporary fixtures, runs the matching detection logic against them,
|
|
8
|
+
# and asserts each gate correctly flags / accepts the fixture. Cleans up.
|
|
9
|
+
#
|
|
10
|
+
# Run from repo root: scripts/docs-lint/test-linters.sh
|
|
11
|
+
|
|
12
|
+
set -uo pipefail
|
|
13
|
+
|
|
14
|
+
ROOT="$(git rev-parse --show-toplevel)"
|
|
15
|
+
cd "$ROOT"
|
|
16
|
+
|
|
17
|
+
TMP="$(mktemp -d)"
|
|
18
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
19
|
+
|
|
20
|
+
pass=0
|
|
21
|
+
fail=0
|
|
22
|
+
|
|
23
|
+
ok() { echo " ok: $1"; pass=$((pass + 1)); }
|
|
24
|
+
err() { echo " FAIL: $1"; fail=$((fail + 1)); }
|
|
25
|
+
|
|
26
|
+
# -------- wc-budget --------
|
|
27
|
+
echo "Testing wc-budget.sh:"
|
|
28
|
+
|
|
29
|
+
big_adr="$TMP/big.md"
|
|
30
|
+
{
|
|
31
|
+
echo "---"; echo "status: draft"; echo "---"
|
|
32
|
+
for i in $(seq 1 250); do echo "line $i"; done
|
|
33
|
+
} > "$big_adr"
|
|
34
|
+
|
|
35
|
+
lines=$(wc -l < "$big_adr" | tr -d ' ')
|
|
36
|
+
if (( lines > 200 )); then
|
|
37
|
+
ok "ADR cap (200) would block file with $lines lines"
|
|
38
|
+
else
|
|
39
|
+
err "wc fixture didn't exceed cap"
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# -------- ai-slop-detector --------
|
|
43
|
+
echo "Testing ai-slop-detector.sh:"
|
|
44
|
+
|
|
45
|
+
slop_conclusion="$TMP/slop_conclusion.md"
|
|
46
|
+
cat > "$slop_conclusion" <<'EOF'
|
|
47
|
+
## Conclusion
|
|
48
|
+
|
|
49
|
+
text
|
|
50
|
+
EOF
|
|
51
|
+
if grep -qE '^##+ (Conclusion|Summary|In conclusion|TL;DR)$' "$slop_conclusion"; then
|
|
52
|
+
ok "Conclusion-section regex detects short-doc summary"
|
|
53
|
+
else
|
|
54
|
+
err "Conclusion regex didn't match fixture"
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
slop_toc="$TMP/slop_toc.md"
|
|
58
|
+
cat > "$slop_toc" <<'EOF'
|
|
59
|
+
## Table of Contents
|
|
60
|
+
|
|
61
|
+
- a
|
|
62
|
+
EOF
|
|
63
|
+
if grep -qE '^##+ (Table of [Cc]ontents|TOC|Contents)$' "$slop_toc"; then
|
|
64
|
+
ok "TOC regex detects short-doc TOC"
|
|
65
|
+
else
|
|
66
|
+
err "TOC regex didn't match fixture"
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
slop_stub="$TMP/slop_stub.md"
|
|
70
|
+
cat > "$slop_stub" <<'EOF'
|
|
71
|
+
## Stub
|
|
72
|
+
|
|
73
|
+
## Next section
|
|
74
|
+
|
|
75
|
+
content
|
|
76
|
+
EOF
|
|
77
|
+
result=$(awk '
|
|
78
|
+
/^##+ / {
|
|
79
|
+
cur=$0; line=NR
|
|
80
|
+
while ((getline next_line) > 0) {
|
|
81
|
+
if (next_line ~ /^[ \t]*$/) continue
|
|
82
|
+
if (next_line ~ /^##+ /) { print "HIT:" line; exit }
|
|
83
|
+
break
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
' "$slop_stub")
|
|
87
|
+
if [[ "$result" == HIT:* ]]; then
|
|
88
|
+
ok "stub-heading detection works"
|
|
89
|
+
else
|
|
90
|
+
err "stub-heading regex didn't catch fixture"
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# bank-as-framing fixture: a framing use must flag, a named example must pass.
|
|
94
|
+
slop_bank="$TMP/slop_bank.md"
|
|
95
|
+
cat > "$slop_bank" <<'EOF'
|
|
96
|
+
The bank already runs an audited store, so the platform targets banks.
|
|
97
|
+
EOF
|
|
98
|
+
bank_re="bank's|\bthe bank\b|\ba bank\b|targets? banks|bank-(required|grade|specific|facing|side)|bank (infosec|ciso|reviewer|procurement|architect|auditor)"
|
|
99
|
+
bank_allow='tier-1 (us or eu )?bank|tier-1 banks|US or EU bank|retail-banking|banking convention|banking-vendor convention'
|
|
100
|
+
if grep -nEi "$bank_re" "$slop_bank" | grep -vEi "$bank_allow" | grep -q .; then
|
|
101
|
+
ok "bank-as-framing detection works"
|
|
102
|
+
else
|
|
103
|
+
err "bank-framing regex didn't catch fixture"
|
|
104
|
+
fi
|
|
105
|
+
slop_bank_ok="$TMP/slop_bank_ok.md"
|
|
106
|
+
cat > "$slop_bank_ok" <<'EOF'
|
|
107
|
+
The capability ceiling targets a tier-1 US or EU bank as the named example.
|
|
108
|
+
EOF
|
|
109
|
+
if grep -nEi "$bank_re" "$slop_bank_ok" | grep -vEi "$bank_allow" | grep -q .; then
|
|
110
|
+
err "bank-framing regex wrongly flagged the tier-1 named example"
|
|
111
|
+
else
|
|
112
|
+
ok "bank named-example (tier-1) correctly accepted"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# SAML-as-surface fixture: asserting SAML must flag, a federation clause must pass.
|
|
116
|
+
slop_saml="$TMP/slop_saml.md"
|
|
117
|
+
cat > "$slop_saml" <<'EOF'
|
|
118
|
+
Human action requires SAML/OIDC on the full shelf.
|
|
119
|
+
EOF
|
|
120
|
+
saml_allow='SAML-only (customer )?(idp|pam)|federates? in through (dex|keycloak)|never an OCU SAML|through Dex or Keycloak'
|
|
121
|
+
if grep -nEi '\bSAML\b' "$slop_saml" | grep -vEi "$saml_allow" | grep -q .; then
|
|
122
|
+
ok "SAML-as-surface detection works"
|
|
123
|
+
else
|
|
124
|
+
err "SAML regex didn't catch fixture"
|
|
125
|
+
fi
|
|
126
|
+
slop_saml_ok="$TMP/slop_saml_ok.md"
|
|
127
|
+
cat > "$slop_saml_ok" <<'EOF'
|
|
128
|
+
A SAML-only customer IdP federates in through Dex or Keycloak, never an OCU SAML surface.
|
|
129
|
+
EOF
|
|
130
|
+
if grep -nEi '\bSAML\b' "$slop_saml_ok" | grep -vEi "$saml_allow" | grep -q .; then
|
|
131
|
+
err "SAML regex wrongly flagged the federation clause"
|
|
132
|
+
else
|
|
133
|
+
ok "SAML federation clause correctly accepted"
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# -------- ascii-diagram-detector --------
|
|
137
|
+
echo "Testing ascii-diagram-detector.sh:"
|
|
138
|
+
|
|
139
|
+
ascii_fixture="$TMP/ascii.md"
|
|
140
|
+
cat > "$ascii_fixture" <<'EOF'
|
|
141
|
+
Box-drawing:
|
|
142
|
+
|
|
143
|
+
┌──────┐
|
|
144
|
+
│ box │
|
|
145
|
+
└──────┘
|
|
146
|
+
EOF
|
|
147
|
+
|
|
148
|
+
if python3 -c "
|
|
149
|
+
import re, sys
|
|
150
|
+
pat = re.compile(r'[─-╿▀-▟]')
|
|
151
|
+
with open('$ascii_fixture') as f:
|
|
152
|
+
sys.exit(0 if any(pat.search(l) for l in f) else 1)
|
|
153
|
+
"; then
|
|
154
|
+
ok "Unicode box-drawing detected in fixture"
|
|
155
|
+
else
|
|
156
|
+
err "ascii fixture not detected"
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
table_fixture="$TMP/table.md"
|
|
160
|
+
cat > "$table_fixture" <<'EOF'
|
|
161
|
+
| a | b |
|
|
162
|
+
|---|---|
|
|
163
|
+
| 1 | 2 |
|
|
164
|
+
EOF
|
|
165
|
+
|
|
166
|
+
if python3 -c "
|
|
167
|
+
import re, sys
|
|
168
|
+
pat = re.compile(r'[─-╿▀-▟]')
|
|
169
|
+
with open('$table_fixture') as f:
|
|
170
|
+
sys.exit(1 if any(pat.search(l) for l in f) else 0)
|
|
171
|
+
"; then
|
|
172
|
+
ok "Markdown table not flagged as ASCII diagram"
|
|
173
|
+
else
|
|
174
|
+
err "Markdown table false-positive"
|
|
175
|
+
fi
|
|
176
|
+
|
|
177
|
+
# -------- front-matter-validator --------
|
|
178
|
+
echo "Testing front-matter-validator.sh:"
|
|
179
|
+
|
|
180
|
+
nofm="$TMP/nofm.md"
|
|
181
|
+
echo "Just text. No YAML." > "$nofm"
|
|
182
|
+
|
|
183
|
+
if python3 -c "
|
|
184
|
+
import re, sys, pathlib
|
|
185
|
+
text = pathlib.Path('$nofm').read_text()
|
|
186
|
+
stripped = re.sub(r'^(?:<!--.*?-->\s*\n)+', '', text, flags=re.DOTALL)
|
|
187
|
+
sys.exit(1 if stripped.startswith('---') else 0)
|
|
188
|
+
"; then
|
|
189
|
+
ok "missing-front-matter detected"
|
|
190
|
+
else
|
|
191
|
+
err "missing-FM fixture wasn't caught"
|
|
192
|
+
fi
|
|
193
|
+
|
|
194
|
+
partial_fm="$TMP/partial.md"
|
|
195
|
+
cat > "$partial_fm" <<'EOF'
|
|
196
|
+
---
|
|
197
|
+
status: draft
|
|
198
|
+
owner: "@x"
|
|
199
|
+
---
|
|
200
|
+
content
|
|
201
|
+
EOF
|
|
202
|
+
|
|
203
|
+
if python3 -c "
|
|
204
|
+
import re, sys, pathlib
|
|
205
|
+
text = pathlib.Path('$partial_fm').read_text()
|
|
206
|
+
stripped = re.sub(r'^(?:<!--.*?-->\s*\n)+', '', text, flags=re.DOTALL)
|
|
207
|
+
m = re.match(r'^---\n(.*?)\n---', stripped, flags=re.DOTALL)
|
|
208
|
+
body = m.group(1)
|
|
209
|
+
fields = {}
|
|
210
|
+
for line in body.splitlines():
|
|
211
|
+
if ':' in line and not line.startswith(' '):
|
|
212
|
+
k, _, v = line.partition(':')
|
|
213
|
+
fields[k.strip()] = v.strip().strip('\"').strip(\"'\")
|
|
214
|
+
required = ['status', 'last-reviewed', 'owner', 'applies-to']
|
|
215
|
+
missing = [k for k in required if k not in fields or not fields[k]]
|
|
216
|
+
sys.exit(0 if missing else 1)
|
|
217
|
+
"; then
|
|
218
|
+
ok "missing-field detection works"
|
|
219
|
+
else
|
|
220
|
+
err "partial FM wasn't caught"
|
|
221
|
+
fi
|
|
222
|
+
|
|
223
|
+
# -------- architecture-tree-whitelist --------
|
|
224
|
+
echo "Testing architecture-tree-whitelist.sh:"
|
|
225
|
+
|
|
226
|
+
# Run against an isolated fixture tree so we don't disturb the real
|
|
227
|
+
# docs/architecture/. Invoke the same segment-aware matcher the linter
|
|
228
|
+
# uses, so a future regression that swaps it back for plain fnmatch
|
|
229
|
+
# (which lets `*` cross `/`) is caught here.
|
|
230
|
+
tree_root="$TMP/atree/docs/architecture"
|
|
231
|
+
mkdir -p "$tree_root/adr" "$tree_root/diagrams" "$tree_root/components" \
|
|
232
|
+
"$tree_root/compliance/sub"
|
|
233
|
+
|
|
234
|
+
# Allowed files.
|
|
235
|
+
touch "$tree_root/README.md"
|
|
236
|
+
touch "$tree_root/adr/0001-foo.md"
|
|
237
|
+
touch "$tree_root/diagrams/c4.mmd"
|
|
238
|
+
touch "$tree_root/components/01-control-plane.md"
|
|
239
|
+
touch "$tree_root/compliance/soc2-mapping.md"
|
|
240
|
+
|
|
241
|
+
# Disallowed files.
|
|
242
|
+
touch "$tree_root/notes.txt" # stray scratch note
|
|
243
|
+
touch "$tree_root/LAYER-0-VERIFICATION.md" # AI snapshot
|
|
244
|
+
touch "$tree_root/diagrams/screenshot.png" # binary in diagrams
|
|
245
|
+
touch "$tree_root/compliance/sub/x-mapping.md" # nested-path edge case:
|
|
246
|
+
# plain fnmatch would
|
|
247
|
+
# accept this under
|
|
248
|
+
# compliance/*-mapping.md
|
|
249
|
+
|
|
250
|
+
allow_list=(
|
|
251
|
+
"README.md"
|
|
252
|
+
"adr/[0-9][0-9][0-9][0-9]-*.md"
|
|
253
|
+
"diagrams/*.mmd"
|
|
254
|
+
"components/[0-9][0-9]-*.md"
|
|
255
|
+
"compliance/*-mapping.md"
|
|
256
|
+
)
|
|
257
|
+
violations=$(
|
|
258
|
+
cd "$TMP/atree" && python3 - "${allow_list[@]}" <<'PY'
|
|
259
|
+
import fnmatch, pathlib, sys
|
|
260
|
+
allow = sys.argv[1:]
|
|
261
|
+
root = pathlib.Path("docs/architecture")
|
|
262
|
+
|
|
263
|
+
def match(rel: str, pat: str) -> bool:
|
|
264
|
+
rp = rel.split("/")
|
|
265
|
+
pp = pat.split("/")
|
|
266
|
+
if len(rp) != len(pp):
|
|
267
|
+
return False
|
|
268
|
+
return all(fnmatch.fnmatchcase(r, p) for r, p in zip(rp, pp))
|
|
269
|
+
|
|
270
|
+
bad = []
|
|
271
|
+
for p in root.rglob("*"):
|
|
272
|
+
if not p.is_file():
|
|
273
|
+
continue
|
|
274
|
+
rel = p.relative_to(root).as_posix()
|
|
275
|
+
if not any(match(rel, g) for g in allow):
|
|
276
|
+
bad.append(rel)
|
|
277
|
+
print("\n".join(sorted(bad)))
|
|
278
|
+
PY
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
want_bad=(
|
|
282
|
+
"LAYER-0-VERIFICATION.md"
|
|
283
|
+
"compliance/sub/x-mapping.md"
|
|
284
|
+
"diagrams/screenshot.png"
|
|
285
|
+
"notes.txt"
|
|
286
|
+
)
|
|
287
|
+
all_caught=1
|
|
288
|
+
for needle in "${want_bad[@]}"; do
|
|
289
|
+
if ! grep -qxF "$needle" <<<"$violations"; then
|
|
290
|
+
all_caught=0
|
|
291
|
+
err "tree-whitelist missed expected violation: $needle"
|
|
292
|
+
fi
|
|
293
|
+
done
|
|
294
|
+
if (( all_caught )); then
|
|
295
|
+
ok "tree-whitelist catches stray notes, AI snapshots, binaries, nested-path edge case"
|
|
296
|
+
fi
|
|
297
|
+
|
|
298
|
+
# Allowed files must NOT appear in violations.
|
|
299
|
+
for needle in \
|
|
300
|
+
"README.md" \
|
|
301
|
+
"adr/0001-foo.md" \
|
|
302
|
+
"diagrams/c4.mmd" \
|
|
303
|
+
"components/01-control-plane.md" \
|
|
304
|
+
"compliance/soc2-mapping.md"
|
|
305
|
+
do
|
|
306
|
+
if grep -qxF "$needle" <<<"$violations"; then
|
|
307
|
+
err "tree-whitelist false-positive on legitimate file: $needle"
|
|
308
|
+
fi
|
|
309
|
+
done
|
|
310
|
+
ok "tree-whitelist accepts files that match allowed patterns"
|
|
311
|
+
|
|
312
|
+
# -------- identity-email-detector --------
|
|
313
|
+
echo "Testing identity-email-detector.sh:"
|
|
314
|
+
|
|
315
|
+
# Run the detector end-to-end against a throwaway git repo, so the test covers
|
|
316
|
+
# the script's real behaviour (tracked-file scan, path excludes, git invocation,
|
|
317
|
+
# exit code) rather than re-implementing its grep. The banned address is
|
|
318
|
+
# assembled from parts so the literal never appears in this tracked file (which
|
|
319
|
+
# would itself trip the detector it tests).
|
|
320
|
+
banned="i@yambr$(printf '%s' .com)"
|
|
321
|
+
canonical="developer@widemoat.ai"
|
|
322
|
+
detector="$ROOT/scripts/docs-lint/identity-email-detector.sh"
|
|
323
|
+
|
|
324
|
+
# Fixture repo with one tracked file carrying the banned address.
|
|
325
|
+
fixture="$TMP/identity-fixture"
|
|
326
|
+
git init -q "$fixture"
|
|
327
|
+
git -C "$fixture" config user.email test@example.com
|
|
328
|
+
git -C "$fixture" config user.name test
|
|
329
|
+
printf 'contact %s for help\n' "$banned" > "$fixture/notes.md"
|
|
330
|
+
git -C "$fixture" add notes.md
|
|
331
|
+
git -C "$fixture" commit -q -m fixture
|
|
332
|
+
|
|
333
|
+
if ( cd "$fixture" && bash "$detector" ) >/dev/null 2>&1; then
|
|
334
|
+
err "identity-email-detector did not flag the banned personal address"
|
|
335
|
+
else
|
|
336
|
+
ok "identity-email-detector flags the banned personal address"
|
|
337
|
+
fi
|
|
338
|
+
|
|
339
|
+
# Replace the tracked content with the canonical address and a product URL;
|
|
340
|
+
# neither must trip the detector.
|
|
341
|
+
printf 'contact %s — see https://chat.yambr.com\n' "$canonical" > "$fixture/notes.md"
|
|
342
|
+
git -C "$fixture" commit -q -am clean
|
|
343
|
+
if ( cd "$fixture" && bash "$detector" ) >/dev/null 2>&1; then
|
|
344
|
+
ok "identity-email-detector accepts the canonical address and yambr.com URLs"
|
|
345
|
+
else
|
|
346
|
+
err "identity-email-detector false-positives on the canonical address or a product URL"
|
|
347
|
+
fi
|
|
348
|
+
|
|
349
|
+
# -------- Summary --------
|
|
350
|
+
echo
|
|
351
|
+
echo "Linter self-test: $pass passed, $fail failed."
|
|
352
|
+
if (( fail > 0 )); then
|
|
353
|
+
exit 1
|
|
354
|
+
fi
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
#
|
|
5
|
+
# Line-count budget enforcer for architecture docs.
|
|
6
|
+
#
|
|
7
|
+
# Per CLAUDE.md "Documentation discipline":
|
|
8
|
+
# - ADR ≤ 200 lines (under docs/architecture/adr/, excluding README/template)
|
|
9
|
+
# - Component spec ≤ 600 lines (under docs/architecture/components/, excluding README/template)
|
|
10
|
+
# - MANIFESTO.md ≤ 400 lines
|
|
11
|
+
#
|
|
12
|
+
# Exits 1 if any cap is exceeded.
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
ROOT="$(git rev-parse --show-toplevel)"
|
|
17
|
+
cd "$ROOT"
|
|
18
|
+
|
|
19
|
+
fail=0
|
|
20
|
+
|
|
21
|
+
check_cap() {
|
|
22
|
+
local file="$1" cap="$2" kind="$3"
|
|
23
|
+
if [[ ! -f "$file" ]]; then
|
|
24
|
+
return 0
|
|
25
|
+
fi
|
|
26
|
+
local lines
|
|
27
|
+
lines=$(wc -l < "$file" | tr -d ' ')
|
|
28
|
+
if (( lines > cap )); then
|
|
29
|
+
echo "FAIL: $kind cap exceeded: $file = $lines lines (cap $cap)"
|
|
30
|
+
fail=1
|
|
31
|
+
fi
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# MANIFESTO.md (single file).
|
|
35
|
+
check_cap "docs/architecture/MANIFESTO.md" 400 "MANIFESTO"
|
|
36
|
+
|
|
37
|
+
# All ADRs except the template and the README.
|
|
38
|
+
while IFS= read -r -d '' f; do
|
|
39
|
+
base="$(basename "$f")"
|
|
40
|
+
if [[ "$base" == "README.md" || "$base" == "0000-template.md" ]]; then
|
|
41
|
+
continue
|
|
42
|
+
fi
|
|
43
|
+
check_cap "$f" 200 "ADR"
|
|
44
|
+
done < <(find docs/architecture/adr -name '*.md' -print0 2>/dev/null)
|
|
45
|
+
|
|
46
|
+
# All component specs except the template.
|
|
47
|
+
while IFS= read -r -d '' f; do
|
|
48
|
+
base="$(basename "$f")"
|
|
49
|
+
if [[ "$base" == "0000-template.md" ]]; then
|
|
50
|
+
continue
|
|
51
|
+
fi
|
|
52
|
+
check_cap "$f" 600 "component-spec"
|
|
53
|
+
done < <(find docs/architecture/components -name '*.md' -print0 2>/dev/null)
|
|
54
|
+
|
|
55
|
+
if (( fail )); then
|
|
56
|
+
echo
|
|
57
|
+
echo "Hint: split the doc, move detail into a linked ADR, or trim prose."
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
echo "wc-budget: OK"
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
#
|
|
5
|
+
# Versioned pre-push policy. Git does not run this copy directly — hooks live
|
|
6
|
+
# in .git/hooks/, which is not tracked. Install it once per clone:
|
|
7
|
+
#
|
|
8
|
+
# ln -sf ../../scripts/githooks/pre-push .git/hooks/pre-push
|
|
9
|
+
#
|
|
10
|
+
# (or copy it). CONTRIBUTING.md documents the one-line install. This file is
|
|
11
|
+
# the source of truth; the installed copy must match it.
|
|
12
|
+
#
|
|
13
|
+
# Two gates, both blocking:
|
|
14
|
+
# 1. .planning/ guard — never push planning/roadmap/phase artefacts to the
|
|
15
|
+
# public GitHub remote.
|
|
16
|
+
# 2. Documentation identity gate — the personal address i@yambr.com must not
|
|
17
|
+
# appear in tracked file content; rewrite it to developer@widemoat.ai.
|
|
18
|
+
# (This checks file CONTENT only, not commit author/committer metadata.)
|
|
19
|
+
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
|
|
22
|
+
remote_name="$1"
|
|
23
|
+
remote_url="$2"
|
|
24
|
+
|
|
25
|
+
z40=$(printf '%040d' 0)
|
|
26
|
+
exit_code=0
|
|
27
|
+
|
|
28
|
+
# Recognise the public remote by URL host.
|
|
29
|
+
case "$remote_url" in
|
|
30
|
+
*github.com*) is_public=true ;;
|
|
31
|
+
*) is_public=false ;;
|
|
32
|
+
esac
|
|
33
|
+
|
|
34
|
+
# ---- Gate 1: .planning/ guard (public remote only) --------------------------
|
|
35
|
+
if [ "$is_public" = "true" ]; then
|
|
36
|
+
while read -r local_ref local_sha remote_ref remote_sha; do
|
|
37
|
+
[ "$local_sha" = "$z40" ] && continue # deletion
|
|
38
|
+
|
|
39
|
+
if [ "$remote_sha" = "$z40" ]; then
|
|
40
|
+
range="$local_sha" # new branch
|
|
41
|
+
bad_files=$(git ls-tree -r "$local_sha" --name-only | grep -E '^\.planning/' || true)
|
|
42
|
+
else
|
|
43
|
+
range="${remote_sha}..${local_sha}"
|
|
44
|
+
bad_files=$(git log "$range" --name-only --pretty=format: | grep -E '^\.planning/' | sort -u || true)
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
if [ -n "$bad_files" ]; then
|
|
48
|
+
echo "-----------------------------------------------------------------"
|
|
49
|
+
echo "BLOCKED: this push to $remote_url would include .planning/ files."
|
|
50
|
+
echo "The public GitHub remote must not carry planning/roadmap/phase"
|
|
51
|
+
echo "artefacts."
|
|
52
|
+
echo ""
|
|
53
|
+
echo "Offending paths in range $range:"
|
|
54
|
+
echo "$bad_files" | sed 's/^/ /'
|
|
55
|
+
echo "-----------------------------------------------------------------"
|
|
56
|
+
exit_code=1
|
|
57
|
+
fi
|
|
58
|
+
done
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# ---- Gate 2: banned address in tracked file content -------------------------
|
|
62
|
+
# Run the detector through bash, not as an executable: a checkout that drops the
|
|
63
|
+
# exec bit (no-exec filesystem, archive export) must not silently skip the gate.
|
|
64
|
+
ROOT="$(git rev-parse --show-toplevel)"
|
|
65
|
+
detector="$ROOT/scripts/docs-lint/identity-email-detector.sh"
|
|
66
|
+
if [ -f "$detector" ]; then
|
|
67
|
+
if ! bash "$detector"; then
|
|
68
|
+
exit_code=1
|
|
69
|
+
fi
|
|
70
|
+
else
|
|
71
|
+
echo "BLOCKED: identity detector missing: $detector"
|
|
72
|
+
exit_code=1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
exit $exit_code
|
package/server.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.Wide-Moat/open-computer-use",
|
|
4
|
+
"title": "Open Computer Use",
|
|
5
|
+
"version": "0.8.12.6",
|
|
6
|
+
"description": "Give any LLM its own computer — Docker sandboxes with bash, browser, docs, and sub-agents",
|
|
7
|
+
"websiteUrl": "https://github.com/Wide-Moat/open-computer-use",
|
|
8
|
+
"repository": {
|
|
9
|
+
"url": "https://github.com/Wide-Moat/open-computer-use",
|
|
10
|
+
"source": "github",
|
|
11
|
+
"id": "Wide-Moat/open-computer-use"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
FROM python:3.12-slim
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
COPY requirements.txt .
|
|
6
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
7
|
+
COPY . .
|
|
8
|
+
EXPOSE 8082
|
|
9
|
+
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8082"]
|