@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,269 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
GIF Builder - Core module for assembling frames into GIFs optimized for Slack.
|
|
4
|
+
|
|
5
|
+
This module provides the main interface for creating GIFs from programmatically
|
|
6
|
+
generated frames, with automatic optimization for Slack's requirements.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
import imageio.v3 as imageio
|
|
13
|
+
import numpy as np
|
|
14
|
+
from PIL import Image
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class GIFBuilder:
|
|
18
|
+
"""Builder for creating optimized GIFs from frames."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, width: int = 480, height: int = 480, fps: int = 15):
|
|
21
|
+
"""
|
|
22
|
+
Initialize GIF builder.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
width: Frame width in pixels
|
|
26
|
+
height: Frame height in pixels
|
|
27
|
+
fps: Frames per second
|
|
28
|
+
"""
|
|
29
|
+
self.width = width
|
|
30
|
+
self.height = height
|
|
31
|
+
self.fps = fps
|
|
32
|
+
self.frames: list[np.ndarray] = []
|
|
33
|
+
|
|
34
|
+
def add_frame(self, frame: np.ndarray | Image.Image):
|
|
35
|
+
"""
|
|
36
|
+
Add a frame to the GIF.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
frame: Frame as numpy array or PIL Image (will be converted to RGB)
|
|
40
|
+
"""
|
|
41
|
+
if isinstance(frame, Image.Image):
|
|
42
|
+
frame = np.array(frame.convert("RGB"))
|
|
43
|
+
|
|
44
|
+
# Ensure frame is correct size
|
|
45
|
+
if frame.shape[:2] != (self.height, self.width):
|
|
46
|
+
pil_frame = Image.fromarray(frame)
|
|
47
|
+
pil_frame = pil_frame.resize(
|
|
48
|
+
(self.width, self.height), Image.Resampling.LANCZOS
|
|
49
|
+
)
|
|
50
|
+
frame = np.array(pil_frame)
|
|
51
|
+
|
|
52
|
+
self.frames.append(frame)
|
|
53
|
+
|
|
54
|
+
def add_frames(self, frames: list[np.ndarray | Image.Image]):
|
|
55
|
+
"""Add multiple frames at once."""
|
|
56
|
+
for frame in frames:
|
|
57
|
+
self.add_frame(frame)
|
|
58
|
+
|
|
59
|
+
def optimize_colors(
|
|
60
|
+
self, num_colors: int = 128, use_global_palette: bool = True
|
|
61
|
+
) -> list[np.ndarray]:
|
|
62
|
+
"""
|
|
63
|
+
Reduce colors in all frames using quantization.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
num_colors: Target number of colors (8-256)
|
|
67
|
+
use_global_palette: Use a single palette for all frames (better compression)
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
List of color-optimized frames
|
|
71
|
+
"""
|
|
72
|
+
optimized = []
|
|
73
|
+
|
|
74
|
+
if use_global_palette and len(self.frames) > 1:
|
|
75
|
+
# Create a global palette from all frames
|
|
76
|
+
# Sample frames to build palette
|
|
77
|
+
sample_size = min(5, len(self.frames))
|
|
78
|
+
sample_indices = [
|
|
79
|
+
int(i * len(self.frames) / sample_size) for i in range(sample_size)
|
|
80
|
+
]
|
|
81
|
+
sample_frames = [self.frames[i] for i in sample_indices]
|
|
82
|
+
|
|
83
|
+
# Combine sample frames into a single image for palette generation
|
|
84
|
+
# Flatten each frame to get all pixels, then stack them
|
|
85
|
+
all_pixels = np.vstack(
|
|
86
|
+
[f.reshape(-1, 3) for f in sample_frames]
|
|
87
|
+
) # (total_pixels, 3)
|
|
88
|
+
|
|
89
|
+
# Create a properly-shaped RGB image from the pixel data
|
|
90
|
+
# We'll make a roughly square image from all the pixels
|
|
91
|
+
total_pixels = len(all_pixels)
|
|
92
|
+
width = min(512, int(np.sqrt(total_pixels))) # Reasonable width, max 512
|
|
93
|
+
height = (total_pixels + width - 1) // width # Ceiling division
|
|
94
|
+
|
|
95
|
+
# Pad if necessary to fill the rectangle
|
|
96
|
+
pixels_needed = width * height
|
|
97
|
+
if pixels_needed > total_pixels:
|
|
98
|
+
padding = np.zeros((pixels_needed - total_pixels, 3), dtype=np.uint8)
|
|
99
|
+
all_pixels = np.vstack([all_pixels, padding])
|
|
100
|
+
|
|
101
|
+
# Reshape to proper RGB image format (H, W, 3)
|
|
102
|
+
img_array = (
|
|
103
|
+
all_pixels[:pixels_needed].reshape(height, width, 3).astype(np.uint8)
|
|
104
|
+
)
|
|
105
|
+
combined_img = Image.fromarray(img_array, mode="RGB")
|
|
106
|
+
|
|
107
|
+
# Generate global palette
|
|
108
|
+
global_palette = combined_img.quantize(colors=num_colors, method=2)
|
|
109
|
+
|
|
110
|
+
# Apply global palette to all frames
|
|
111
|
+
for frame in self.frames:
|
|
112
|
+
pil_frame = Image.fromarray(frame)
|
|
113
|
+
quantized = pil_frame.quantize(palette=global_palette, dither=1)
|
|
114
|
+
optimized.append(np.array(quantized.convert("RGB")))
|
|
115
|
+
else:
|
|
116
|
+
# Use per-frame quantization
|
|
117
|
+
for frame in self.frames:
|
|
118
|
+
pil_frame = Image.fromarray(frame)
|
|
119
|
+
quantized = pil_frame.quantize(colors=num_colors, method=2, dither=1)
|
|
120
|
+
optimized.append(np.array(quantized.convert("RGB")))
|
|
121
|
+
|
|
122
|
+
return optimized
|
|
123
|
+
|
|
124
|
+
def deduplicate_frames(self, threshold: float = 0.9995) -> int:
|
|
125
|
+
"""
|
|
126
|
+
Remove duplicate or near-duplicate consecutive frames.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
threshold: Similarity threshold (0.0-1.0). Higher = more strict (0.9995 = nearly identical).
|
|
130
|
+
Use 0.9995+ to preserve subtle animations, 0.98 for aggressive removal.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Number of frames removed
|
|
134
|
+
"""
|
|
135
|
+
if len(self.frames) < 2:
|
|
136
|
+
return 0
|
|
137
|
+
|
|
138
|
+
deduplicated = [self.frames[0]]
|
|
139
|
+
removed_count = 0
|
|
140
|
+
|
|
141
|
+
for i in range(1, len(self.frames)):
|
|
142
|
+
# Compare with previous frame
|
|
143
|
+
prev_frame = np.array(deduplicated[-1], dtype=np.float32)
|
|
144
|
+
curr_frame = np.array(self.frames[i], dtype=np.float32)
|
|
145
|
+
|
|
146
|
+
# Calculate similarity (normalized)
|
|
147
|
+
diff = np.abs(prev_frame - curr_frame)
|
|
148
|
+
similarity = 1.0 - (np.mean(diff) / 255.0)
|
|
149
|
+
|
|
150
|
+
# Keep frame if sufficiently different
|
|
151
|
+
# High threshold (0.9995+) means only remove nearly identical frames
|
|
152
|
+
if similarity < threshold:
|
|
153
|
+
deduplicated.append(self.frames[i])
|
|
154
|
+
else:
|
|
155
|
+
removed_count += 1
|
|
156
|
+
|
|
157
|
+
self.frames = deduplicated
|
|
158
|
+
return removed_count
|
|
159
|
+
|
|
160
|
+
def save(
|
|
161
|
+
self,
|
|
162
|
+
output_path: str | Path,
|
|
163
|
+
num_colors: int = 128,
|
|
164
|
+
optimize_for_emoji: bool = False,
|
|
165
|
+
remove_duplicates: bool = False,
|
|
166
|
+
) -> dict:
|
|
167
|
+
"""
|
|
168
|
+
Save frames as optimized GIF for Slack.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
output_path: Where to save the GIF
|
|
172
|
+
num_colors: Number of colors to use (fewer = smaller file)
|
|
173
|
+
optimize_for_emoji: If True, optimize for emoji size (128x128, fewer colors)
|
|
174
|
+
remove_duplicates: If True, remove duplicate consecutive frames (opt-in)
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
Dictionary with file info (path, size, dimensions, frame_count)
|
|
178
|
+
"""
|
|
179
|
+
if not self.frames:
|
|
180
|
+
raise ValueError("No frames to save. Add frames with add_frame() first.")
|
|
181
|
+
|
|
182
|
+
output_path = Path(output_path)
|
|
183
|
+
|
|
184
|
+
# Remove duplicate frames to reduce file size
|
|
185
|
+
if remove_duplicates:
|
|
186
|
+
removed = self.deduplicate_frames(threshold=0.9995)
|
|
187
|
+
if removed > 0:
|
|
188
|
+
print(
|
|
189
|
+
f" Removed {removed} nearly identical frames (preserved subtle animations)"
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Optimize for emoji if requested
|
|
193
|
+
if optimize_for_emoji:
|
|
194
|
+
if self.width > 128 or self.height > 128:
|
|
195
|
+
print(
|
|
196
|
+
f" Resizing from {self.width}x{self.height} to 128x128 for emoji"
|
|
197
|
+
)
|
|
198
|
+
self.width = 128
|
|
199
|
+
self.height = 128
|
|
200
|
+
# Resize all frames
|
|
201
|
+
resized_frames = []
|
|
202
|
+
for frame in self.frames:
|
|
203
|
+
pil_frame = Image.fromarray(frame)
|
|
204
|
+
pil_frame = pil_frame.resize((128, 128), Image.Resampling.LANCZOS)
|
|
205
|
+
resized_frames.append(np.array(pil_frame))
|
|
206
|
+
self.frames = resized_frames
|
|
207
|
+
num_colors = min(num_colors, 48) # More aggressive color limit for emoji
|
|
208
|
+
|
|
209
|
+
# More aggressive FPS reduction for emoji
|
|
210
|
+
if len(self.frames) > 12:
|
|
211
|
+
print(
|
|
212
|
+
f" Reducing frames from {len(self.frames)} to ~12 for emoji size"
|
|
213
|
+
)
|
|
214
|
+
# Keep every nth frame to get close to 12 frames
|
|
215
|
+
keep_every = max(1, len(self.frames) // 12)
|
|
216
|
+
self.frames = [
|
|
217
|
+
self.frames[i] for i in range(0, len(self.frames), keep_every)
|
|
218
|
+
]
|
|
219
|
+
|
|
220
|
+
# Optimize colors with global palette
|
|
221
|
+
optimized_frames = self.optimize_colors(num_colors, use_global_palette=True)
|
|
222
|
+
|
|
223
|
+
# Calculate frame duration in milliseconds
|
|
224
|
+
frame_duration = 1000 / self.fps
|
|
225
|
+
|
|
226
|
+
# Save GIF
|
|
227
|
+
imageio.imwrite(
|
|
228
|
+
output_path,
|
|
229
|
+
optimized_frames,
|
|
230
|
+
duration=frame_duration,
|
|
231
|
+
loop=0, # Infinite loop
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Get file info
|
|
235
|
+
file_size_kb = output_path.stat().st_size / 1024
|
|
236
|
+
file_size_mb = file_size_kb / 1024
|
|
237
|
+
|
|
238
|
+
info = {
|
|
239
|
+
"path": str(output_path),
|
|
240
|
+
"size_kb": file_size_kb,
|
|
241
|
+
"size_mb": file_size_mb,
|
|
242
|
+
"dimensions": f"{self.width}x{self.height}",
|
|
243
|
+
"frame_count": len(optimized_frames),
|
|
244
|
+
"fps": self.fps,
|
|
245
|
+
"duration_seconds": len(optimized_frames) / self.fps,
|
|
246
|
+
"colors": num_colors,
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# Print info
|
|
250
|
+
print(f"\n✓ GIF created successfully!")
|
|
251
|
+
print(f" Path: {output_path}")
|
|
252
|
+
print(f" Size: {file_size_kb:.1f} KB ({file_size_mb:.2f} MB)")
|
|
253
|
+
print(f" Dimensions: {self.width}x{self.height}")
|
|
254
|
+
print(f" Frames: {len(optimized_frames)} @ {self.fps} fps")
|
|
255
|
+
print(f" Duration: {info['duration_seconds']:.1f}s")
|
|
256
|
+
print(f" Colors: {num_colors}")
|
|
257
|
+
|
|
258
|
+
# Size info
|
|
259
|
+
if optimize_for_emoji:
|
|
260
|
+
print(f" Optimized for emoji (128x128, reduced colors)")
|
|
261
|
+
if file_size_mb > 1.0:
|
|
262
|
+
print(f"\n Note: Large file size ({file_size_kb:.1f} KB)")
|
|
263
|
+
print(" Consider: fewer frames, smaller dimensions, or fewer colors")
|
|
264
|
+
|
|
265
|
+
return info
|
|
266
|
+
|
|
267
|
+
def clear(self):
|
|
268
|
+
"""Clear all frames (useful for creating multiple GIFs)."""
|
|
269
|
+
self.frames = []
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Validators - Check if GIFs meet Slack's requirements.
|
|
4
|
+
|
|
5
|
+
These validators help ensure your GIFs meet Slack's size and dimension constraints.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def validate_gif(
|
|
12
|
+
gif_path: str | Path, is_emoji: bool = True, verbose: bool = True
|
|
13
|
+
) -> tuple[bool, dict]:
|
|
14
|
+
"""
|
|
15
|
+
Validate GIF for Slack (dimensions, size, frame count).
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
gif_path: Path to GIF file
|
|
19
|
+
is_emoji: True for emoji (128x128 recommended), False for message GIF
|
|
20
|
+
verbose: Print validation details
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Tuple of (passes: bool, results: dict with all details)
|
|
24
|
+
"""
|
|
25
|
+
from PIL import Image
|
|
26
|
+
|
|
27
|
+
gif_path = Path(gif_path)
|
|
28
|
+
|
|
29
|
+
if not gif_path.exists():
|
|
30
|
+
return False, {"error": f"File not found: {gif_path}"}
|
|
31
|
+
|
|
32
|
+
# Get file size
|
|
33
|
+
size_bytes = gif_path.stat().st_size
|
|
34
|
+
size_kb = size_bytes / 1024
|
|
35
|
+
size_mb = size_kb / 1024
|
|
36
|
+
|
|
37
|
+
# Get dimensions and frame info
|
|
38
|
+
try:
|
|
39
|
+
with Image.open(gif_path) as img:
|
|
40
|
+
width, height = img.size
|
|
41
|
+
|
|
42
|
+
# Count frames
|
|
43
|
+
frame_count = 0
|
|
44
|
+
try:
|
|
45
|
+
while True:
|
|
46
|
+
img.seek(frame_count)
|
|
47
|
+
frame_count += 1
|
|
48
|
+
except EOFError:
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
# Get duration
|
|
52
|
+
try:
|
|
53
|
+
duration_ms = img.info.get("duration", 100)
|
|
54
|
+
total_duration = (duration_ms * frame_count) / 1000
|
|
55
|
+
fps = frame_count / total_duration if total_duration > 0 else 0
|
|
56
|
+
except:
|
|
57
|
+
total_duration = None
|
|
58
|
+
fps = None
|
|
59
|
+
|
|
60
|
+
except Exception as e:
|
|
61
|
+
return False, {"error": f"Failed to read GIF: {e}"}
|
|
62
|
+
|
|
63
|
+
# Validate dimensions
|
|
64
|
+
if is_emoji:
|
|
65
|
+
optimal = width == height == 128
|
|
66
|
+
acceptable = width == height and 64 <= width <= 128
|
|
67
|
+
dim_pass = acceptable
|
|
68
|
+
else:
|
|
69
|
+
aspect_ratio = (
|
|
70
|
+
max(width, height) / min(width, height)
|
|
71
|
+
if min(width, height) > 0
|
|
72
|
+
else float("inf")
|
|
73
|
+
)
|
|
74
|
+
dim_pass = aspect_ratio <= 2.0 and 320 <= min(width, height) <= 640
|
|
75
|
+
|
|
76
|
+
results = {
|
|
77
|
+
"file": str(gif_path),
|
|
78
|
+
"passes": dim_pass,
|
|
79
|
+
"width": width,
|
|
80
|
+
"height": height,
|
|
81
|
+
"size_kb": size_kb,
|
|
82
|
+
"size_mb": size_mb,
|
|
83
|
+
"frame_count": frame_count,
|
|
84
|
+
"duration_seconds": total_duration,
|
|
85
|
+
"fps": fps,
|
|
86
|
+
"is_emoji": is_emoji,
|
|
87
|
+
"optimal": optimal if is_emoji else None,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
# Print if verbose
|
|
91
|
+
if verbose:
|
|
92
|
+
print(f"\nValidating {gif_path.name}:")
|
|
93
|
+
print(
|
|
94
|
+
f" Dimensions: {width}x{height}"
|
|
95
|
+
+ (
|
|
96
|
+
f" ({'optimal' if optimal else 'acceptable'})"
|
|
97
|
+
if is_emoji and acceptable
|
|
98
|
+
else ""
|
|
99
|
+
)
|
|
100
|
+
)
|
|
101
|
+
print(
|
|
102
|
+
f" Size: {size_kb:.1f} KB"
|
|
103
|
+
+ (f" ({size_mb:.2f} MB)" if size_mb >= 1.0 else "")
|
|
104
|
+
)
|
|
105
|
+
print(
|
|
106
|
+
f" Frames: {frame_count}"
|
|
107
|
+
+ (f" @ {fps:.1f} fps ({total_duration:.1f}s)" if fps else "")
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if not dim_pass:
|
|
111
|
+
print(
|
|
112
|
+
f" Note: {'Emoji should be 128x128' if is_emoji else 'Unusual dimensions for Slack'}"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if size_mb > 5.0:
|
|
116
|
+
print(f" Note: Large file size - consider fewer frames/colors")
|
|
117
|
+
|
|
118
|
+
return dim_pass, results
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def is_slack_ready(
|
|
122
|
+
gif_path: str | Path, is_emoji: bool = True, verbose: bool = True
|
|
123
|
+
) -> bool:
|
|
124
|
+
"""
|
|
125
|
+
Quick check if GIF is ready for Slack.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
gif_path: Path to GIF file
|
|
129
|
+
is_emoji: True for emoji GIF, False for message GIF
|
|
130
|
+
verbose: Print feedback
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
True if dimensions are acceptable
|
|
134
|
+
"""
|
|
135
|
+
passes, _ = validate_gif(gif_path, is_emoji, verbose)
|
|
136
|
+
return passes
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: social-content
|
|
3
|
+
description: "When the user wants help creating, scheduling, or optimizing social media content for LinkedIn, Twitter/X, Instagram, TikTok, Facebook, or other platforms. Also use when the user mentions 'LinkedIn post,' 'Twitter thread,' 'social media,' 'content calendar,' 'social scheduling,' 'engagement,' 'viral content,' 'what should I post,' 'repurpose this content,' 'tweet ideas,' 'LinkedIn carousel,' 'social media strategy,' or 'grow my following.' Use this for any social media content creation, repurposing, or scheduling task. For broader content strategy, see content-strategy."
|
|
4
|
+
metadata:
|
|
5
|
+
version: 1.1.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Social Content
|
|
9
|
+
|
|
10
|
+
You are an expert social media strategist. Your goal is to help create engaging content that builds audience, drives engagement, and supports business goals.
|
|
11
|
+
|
|
12
|
+
## Before Creating Content
|
|
13
|
+
|
|
14
|
+
**Check for product marketing context first:**
|
|
15
|
+
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
|
16
|
+
|
|
17
|
+
Gather this context (ask if not provided):
|
|
18
|
+
|
|
19
|
+
### 1. Goals
|
|
20
|
+
- What's the primary objective? (Brand awareness, leads, traffic, community)
|
|
21
|
+
- What action do you want people to take?
|
|
22
|
+
- Are you building personal brand, company brand, or both?
|
|
23
|
+
|
|
24
|
+
### 2. Audience
|
|
25
|
+
- Who are you trying to reach?
|
|
26
|
+
- What platforms are they most active on?
|
|
27
|
+
- What content do they engage with?
|
|
28
|
+
|
|
29
|
+
### 3. Brand Voice
|
|
30
|
+
- What's your tone? (Professional, casual, witty, authoritative)
|
|
31
|
+
- Any topics to avoid?
|
|
32
|
+
- Any specific terminology or style guidelines?
|
|
33
|
+
|
|
34
|
+
### 4. Resources
|
|
35
|
+
- How much time can you dedicate to social?
|
|
36
|
+
- Do you have existing content to repurpose?
|
|
37
|
+
- Can you create video content?
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Platform Quick Reference
|
|
42
|
+
|
|
43
|
+
| Platform | Best For | Frequency | Key Format |
|
|
44
|
+
|----------|----------|-----------|------------|
|
|
45
|
+
| LinkedIn | B2B, thought leadership | 3-5x/week | Carousels, stories |
|
|
46
|
+
| Twitter/X | Tech, real-time, community | 3-10x/day | Threads, hot takes |
|
|
47
|
+
| Instagram | Visual brands, lifestyle | 1-2 posts + Stories daily | Reels, carousels |
|
|
48
|
+
| TikTok | Brand awareness, younger audiences | 1-4x/day | Short-form video |
|
|
49
|
+
| Facebook | Communities, local businesses | 1-2x/day | Groups, native video |
|
|
50
|
+
|
|
51
|
+
**For detailed platform strategies**: See [references/platforms.md](references/platforms.md)
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Content Pillars Framework
|
|
56
|
+
|
|
57
|
+
Build your content around 3-5 pillars that align with your expertise and audience interests.
|
|
58
|
+
|
|
59
|
+
### Example for a SaaS Founder
|
|
60
|
+
|
|
61
|
+
| Pillar | % of Content | Topics |
|
|
62
|
+
|--------|--------------|--------|
|
|
63
|
+
| Industry insights | 30% | Trends, data, predictions |
|
|
64
|
+
| Behind-the-scenes | 25% | Building the company, lessons learned |
|
|
65
|
+
| Educational | 25% | How-tos, frameworks, tips |
|
|
66
|
+
| Personal | 15% | Stories, values, hot takes |
|
|
67
|
+
| Promotional | 5% | Product updates, offers |
|
|
68
|
+
|
|
69
|
+
### Pillar Development Questions
|
|
70
|
+
|
|
71
|
+
For each pillar, ask:
|
|
72
|
+
1. What unique perspective do you have?
|
|
73
|
+
2. What questions does your audience ask?
|
|
74
|
+
3. What content has performed well before?
|
|
75
|
+
4. What can you create consistently?
|
|
76
|
+
5. What aligns with business goals?
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Hook Formulas
|
|
81
|
+
|
|
82
|
+
The first line determines whether anyone reads the rest.
|
|
83
|
+
|
|
84
|
+
### Curiosity Hooks
|
|
85
|
+
- "I was wrong about [common belief]."
|
|
86
|
+
- "The real reason [outcome] happens isn't what you think."
|
|
87
|
+
- "[Impressive result] — and it only took [surprisingly short time]."
|
|
88
|
+
|
|
89
|
+
### Story Hooks
|
|
90
|
+
- "Last week, [unexpected thing] happened."
|
|
91
|
+
- "I almost [big mistake/failure]."
|
|
92
|
+
- "3 years ago, I [past state]. Today, [current state]."
|
|
93
|
+
|
|
94
|
+
### Value Hooks
|
|
95
|
+
- "How to [desirable outcome] (without [common pain]):"
|
|
96
|
+
- "[Number] [things] that [outcome]:"
|
|
97
|
+
- "Stop [common mistake]. Do this instead:"
|
|
98
|
+
|
|
99
|
+
### Contrarian Hooks
|
|
100
|
+
- "Unpopular opinion: [bold statement]"
|
|
101
|
+
- "[Common advice] is wrong. Here's why:"
|
|
102
|
+
- "I stopped [common practice] and [positive result]."
|
|
103
|
+
|
|
104
|
+
**For post templates and more hooks**: See [references/post-templates.md](references/post-templates.md)
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Content Repurposing System
|
|
109
|
+
|
|
110
|
+
Turn one piece of content into many:
|
|
111
|
+
|
|
112
|
+
### Blog Post → Social Content
|
|
113
|
+
|
|
114
|
+
| Platform | Format |
|
|
115
|
+
|----------|--------|
|
|
116
|
+
| LinkedIn | Key insight + link in comments |
|
|
117
|
+
| LinkedIn | Carousel of main points |
|
|
118
|
+
| Twitter/X | Thread of key takeaways |
|
|
119
|
+
| Instagram | Carousel with visuals |
|
|
120
|
+
| Instagram | Reel summarizing the post |
|
|
121
|
+
|
|
122
|
+
### Repurposing Workflow
|
|
123
|
+
|
|
124
|
+
1. **Create pillar content** (blog, video, podcast)
|
|
125
|
+
2. **Extract key insights** (3-5 per piece)
|
|
126
|
+
3. **Adapt to each platform** (format and tone)
|
|
127
|
+
4. **Schedule across the week** (spread distribution)
|
|
128
|
+
5. **Update and reshare** (evergreen content can repeat)
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Content Calendar Structure
|
|
133
|
+
|
|
134
|
+
### Weekly Planning Template
|
|
135
|
+
|
|
136
|
+
| Day | LinkedIn | Twitter/X | Instagram |
|
|
137
|
+
|-----|----------|-----------|-----------|
|
|
138
|
+
| Mon | Industry insight | Thread | Carousel |
|
|
139
|
+
| Tue | Behind-scenes | Engagement | Story |
|
|
140
|
+
| Wed | Educational | Tips tweet | Reel |
|
|
141
|
+
| Thu | Story post | Thread | Educational |
|
|
142
|
+
| Fri | Hot take | Engagement | Story |
|
|
143
|
+
|
|
144
|
+
### Batching Strategy (2-3 hours weekly)
|
|
145
|
+
|
|
146
|
+
1. Review content pillar topics
|
|
147
|
+
2. Write 5 LinkedIn posts
|
|
148
|
+
3. Write 3 Twitter threads + daily tweets
|
|
149
|
+
4. Create Instagram carousel + Reel ideas
|
|
150
|
+
5. Schedule everything
|
|
151
|
+
6. Leave room for real-time engagement
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Engagement Strategy
|
|
156
|
+
|
|
157
|
+
### Daily Engagement Routine (30 min)
|
|
158
|
+
|
|
159
|
+
1. Respond to all comments on your posts (5 min)
|
|
160
|
+
2. Comment on 5-10 posts from target accounts (15 min)
|
|
161
|
+
3. Share/repost with added insight (5 min)
|
|
162
|
+
4. Send 2-3 DMs to new connections (5 min)
|
|
163
|
+
|
|
164
|
+
### Quality Comments
|
|
165
|
+
|
|
166
|
+
- Add new insight, not just "Great post!"
|
|
167
|
+
- Share a related experience
|
|
168
|
+
- Ask a thoughtful follow-up question
|
|
169
|
+
- Respectfully disagree with nuance
|
|
170
|
+
|
|
171
|
+
### Building Relationships
|
|
172
|
+
|
|
173
|
+
- Identify 20-50 accounts in your space
|
|
174
|
+
- Consistently engage with their content
|
|
175
|
+
- Share their content with credit
|
|
176
|
+
- Eventually collaborate (podcasts, co-created content)
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Analytics & Optimization
|
|
181
|
+
|
|
182
|
+
### Metrics That Matter
|
|
183
|
+
|
|
184
|
+
**Awareness:** Impressions, Reach, Follower growth rate
|
|
185
|
+
|
|
186
|
+
**Engagement:** Engagement rate, Comments (higher value than likes), Shares/reposts, Saves
|
|
187
|
+
|
|
188
|
+
**Conversion:** Link clicks, Profile visits, DMs received, Leads attributed
|
|
189
|
+
|
|
190
|
+
### Weekly Review
|
|
191
|
+
|
|
192
|
+
- Top 3 performing posts (why did they work?)
|
|
193
|
+
- Bottom 3 posts (what can you learn?)
|
|
194
|
+
- Follower growth trend
|
|
195
|
+
- Engagement rate trend
|
|
196
|
+
- Best posting times (from data)
|
|
197
|
+
|
|
198
|
+
### Optimization Actions
|
|
199
|
+
|
|
200
|
+
**If engagement is low:**
|
|
201
|
+
- Test new hooks
|
|
202
|
+
- Post at different times
|
|
203
|
+
- Try different formats
|
|
204
|
+
- Increase engagement with others
|
|
205
|
+
|
|
206
|
+
**If reach is declining:**
|
|
207
|
+
- Avoid external links in post body
|
|
208
|
+
- Increase posting frequency
|
|
209
|
+
- Engage more in comments
|
|
210
|
+
- Test video/visual content
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Content Ideas by Situation
|
|
215
|
+
|
|
216
|
+
### When You're Starting Out
|
|
217
|
+
- Document your journey
|
|
218
|
+
- Share what you're learning
|
|
219
|
+
- Curate and comment on industry content
|
|
220
|
+
- Engage heavily with established accounts
|
|
221
|
+
|
|
222
|
+
### When You're Stuck
|
|
223
|
+
- Repurpose old high-performing content
|
|
224
|
+
- Ask your audience what they want
|
|
225
|
+
- Comment on industry news
|
|
226
|
+
- Share a failure or lesson learned
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Scheduling Best Practices
|
|
231
|
+
|
|
232
|
+
### When to Schedule vs. Post Live
|
|
233
|
+
|
|
234
|
+
**Schedule:** Core content posts, Threads, Carousels, Evergreen content
|
|
235
|
+
|
|
236
|
+
**Post live:** Real-time commentary, Responses to news/trends, Engagement with others
|
|
237
|
+
|
|
238
|
+
### Queue Management
|
|
239
|
+
|
|
240
|
+
- Maintain 1-2 weeks of scheduled content
|
|
241
|
+
- Review queue weekly for relevance
|
|
242
|
+
- Leave gaps for spontaneous posts
|
|
243
|
+
- Adjust timing based on performance data
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Reverse Engineering Viral Content
|
|
248
|
+
|
|
249
|
+
Instead of guessing, analyze what's working for top creators in your niche:
|
|
250
|
+
|
|
251
|
+
1. **Find creators** — 10-20 accounts with high engagement
|
|
252
|
+
2. **Collect data** — 500+ posts for analysis
|
|
253
|
+
3. **Analyze patterns** — Hooks, formats, CTAs that work
|
|
254
|
+
4. **Codify playbook** — Document repeatable patterns
|
|
255
|
+
5. **Layer your voice** — Apply patterns with authenticity
|
|
256
|
+
6. **Convert** — Bridge attention to business results
|
|
257
|
+
|
|
258
|
+
**For the complete framework**: See [references/reverse-engineering.md](references/reverse-engineering.md)
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Task-Specific Questions
|
|
263
|
+
|
|
264
|
+
1. What platform(s) are you focusing on?
|
|
265
|
+
2. What's your current posting frequency?
|
|
266
|
+
3. Do you have existing content to repurpose?
|
|
267
|
+
4. What content has performed well in the past?
|
|
268
|
+
5. How much time can you dedicate weekly?
|
|
269
|
+
6. Are you building personal brand, company brand, or both?
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Related Skills
|
|
274
|
+
|
|
275
|
+
- **copywriting**: For longer-form content that feeds social
|
|
276
|
+
- **launch-strategy**: For coordinating social with launches
|
|
277
|
+
- **email-sequence**: For nurturing social audience via email
|
|
278
|
+
- **marketing-psychology**: For understanding what drives engagement
|