[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C43MBYSHM7X38YXKEBD6DG":3,"skill-same:01M6C43MBYSHM7X38YXKEBD6DG":55},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":34,"install":35,"resources":48},"01M6C43MBYSHM7X38YXKEBD6DG","docs-guide",null,"LLM guide for creating, publishing, and running Enact tools","EnactProtocol\u002Fenact","EnactProtocol","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F194414857?v=4","01M6C43B2F5VYTYADD4J30S5ZJ","Enact","01M6C43B6MAFKP2M81NYCQ2EKD",19,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fdocs-guide\u002FSKILL.md",[],[19,20,21,22],"docs","guide","docs guide","Tools","2026-11-10 10:12:30",false,"---\nname: docs-guide\ndescription: LLM guide for creating, publishing, and running Enact tools\n---\n\n# Enact LLM Guide\n\nEnact: Containerized tools with structured I\u002FO for AI agents.\n\n## Commands\n\n```bash\nenact run .\u002Ftool --input \"key=value\"      # Run local tool\nenact run .\u002Ftool --args '{\"key\":\"value\"}' # Run with JSON\nenact run author\u002Ftool --input \"x=y\"       # Run installed tool\nenact install author\u002Ftool                 # Install to project\nenact install author\u002Ftool -g              # Install globally\nenact search \"query\"                      # Find tools\nenact sign .\u002Ftool && enact publish .\u002Ftool # Publish\n```\n\n## Tool Structure\n\nTools use a two-file model:\n\n```\nmy-tool\u002F\n├── skill.package.yml   # Technical manifest (execution config)\n├── SKILL.md     # Agent-facing documentation\n└── main.py      # Your code (any language)\n```\n\n## skill.package.yml Template\n\n```yaml\nenact: \"2.0.0\"\nname: \"namespace\u002Fcategory\u002Ftool-name\"\nversion: \"1.0.0\"\ndescription: \"What it does\"\nfrom: \"python:3.12-slim\"\nbuild: \"pip install requests pandas\"\ntimeout: \"30s\"\n\nscripts:\n  run:\n    command: \"python \u002Fwork\u002Fmain.py {{input}}\"\n    inputSchema:\n      type: object\n      properties:\n        input:\n          type: string\n          description: \"Input description\"\n      required: [input]\n\noutputSchema:\n  type: object\n  properties:\n    result:\n      type: string\n\nenv:\n  API_KEY:\n    description: \"API key\"\n    secret: true\n  LOG_LEVEL:\n    description: \"Log level\"\n    default: \"info\"\n\ntags: [category, keywords]\n```\n\n## Field Reference\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `name` | Yes | `namespace\u002Fcategory\u002Ftool` |\n| `description` | Yes | What it does |\n| `scripts` | No* | Named scripts with `{{param}}` substitution |\n| `from` | No | Docker image (default: `alpine:latest`) |\n| `build` | No | Build commands (string or array), cached |\n| `inputSchema` | No | JSON Schema for inputs (under each script) |\n| `outputSchema` | No | JSON Schema for outputs |\n| `env` | No | Environment vars (`secret: true` for keyring) |\n| `timeout` | No | Max runtime (default: `30s`) |\n| `version` | No | Semver version |\n| `tags` | No | Discovery keywords |\n\n*Tools without `scripts` are LLM instruction tools (markdown interpreted by AI).\n\n## Examples by Language\n\n### Python\n```yaml\nfrom: \"python:3.12-slim\"\nbuild: \"pip install pandas\"\nscripts:\n  run:\n    command: \"python \u002Fwork\u002Fmain.py {{input}}\"\n```\n\n### Node.js\n```yaml\nfrom: \"node:20-alpine\"\nbuild: \"npm install\"\nscripts:\n  run:\n    command: \"node \u002Fwork\u002Findex.js {{input}}\"\n```\n\n### Rust\n```yaml\nfrom: \"rust:1.83-slim\"\nbuild: \"rustc \u002Fwork\u002Fmain.rs -o \u002Fwork\u002Fapp\"\nscripts:\n  run:\n    command: \"\u002Fwork\u002Fapp {{input}}\"\n```\n\n### Go\n```yaml\nfrom: \"golang:1.22-alpine\"\nbuild: \"go build -o \u002Fwork\u002Fapp \u002Fwork\u002Fmain.go\"\nscripts:\n  run:\n    command: \"\u002Fwork\u002Fapp {{input}}\"\n```\n\n### Shell (no build)\n```yaml\nscripts:\n  run: \"echo {{name}}\"\n```\n\n## Source Code Pattern\n\nAlways output JSON matching `outputSchema`:\n\n```python\n#!\u002Fusr\u002Fbin\u002Fenv python3\nimport sys, json\n\ninput_val = sys.argv[1]\nresult = {\"result\": input_val.upper()}\nprint(json.dumps(result))\n```\n\n## Secrets\n\n```yaml\nenv:\n  API_KEY:\n    description: \"API key\"\n    secret: true  # Stored in OS keyring, not .env\n```\n\nUser sets: `enact env set API_KEY --secret --namespace myorg\u002Ftools`\n\nAccess in code via environment variable: `os.environ['API_KEY']`\n\n## Two Tool Types\n\n1. **Container tools** (has `scripts`): Runs in Docker, deterministic\n2. **Instruction tools** (no `scripts`): Markdown body interpreted by LLM\n\n## Workflow\n\n```bash\n# 1. Create\nmkdir my-tool && cd my-tool\n# Create skill.package.yml, SKILL.md, and source files\n\n# 2. Test\nenact run . --input \"test=value\"\n\n# 3. Publish\nenact auth login\nenact sign .\nenact publish .\n```\n\n## Checklist\n\n- [ ] `name`: namespace\u002Fcategory\u002Ftool format\n- [ ] `description`: clear, searchable\n- [ ] `scripts`: named scripts with `{{param}}` substitution\n- [ ] `inputSchema`: validates inputs (under each script)\n- [ ] `outputSchema`: documents output\n- [ ] `from`: pinned image version (not `latest`)\n- [ ] `build`: installs dependencies\n- [ ] Source outputs valid JSON\n","# Enact LLM Guide\n\nEnact: Containerized tools with structured I\u002FO for AI agents.\n\n## Commands\n\n```bash\nenact run .\u002Ftool --input \"key=value\"      # Run local tool\nenact run .\u002Ftool --args '{\"key\":\"value\"}' # Run with JSON\nenact run author\u002Ftool --input \"x=y\"       # Run installed tool\nenact install author\u002Ftool                 # Install to project\nenact install author\u002Ftool -g              # Install globally\nenact search \"query\"                      # Find tools\nenact sign .\u002Ftool && enact publish .\u002Ftool # Publish\n```\n\n## Tool Structure\n\nTools use a two-file model:\n\n```\nmy-tool\u002F\n├── skill.package.yml   # Technical manifest (execution config)\n├── SKILL.md     # Agent-facing documentation\n└── main.py      # Your code (any language)\n```\n\n## skill.package.yml Template\n\n```yaml\nenact: \"2.0.0\"\nname: \"namespace\u002Fcategory\u002Ftool-name\"\nversion: \"1.0.0\"\ndescription: \"What it does\"\nfrom: \"python:3.12-slim\"\nbuild: \"pip install requests pandas\"\ntimeout: \"30s\"\n\nscripts:\n  run:\n    command: \"python \u002Fwork\u002Fmain.py {{input}}\"\n    inputSchema:\n      type: object\n      properties:\n        input:\n          type: string\n          description: \"Input description\"\n      required: [input]\n\noutputSchema:\n  type: object\n  properties:\n    result:\n      type: string\n\nenv:\n  API_KEY:\n    description: \"API key\"\n    secret: true\n  LOG_LEVEL:\n    description: \"Log level\"\n    default: \"info\"\n\ntags: [category, keywords]\n```\n\n## Field Reference\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `name` | Yes | `namespace\u002Fcategory\u002Ftool` |\n| `description` | Yes | What it does |\n| `scripts` | No* | Named scripts with `{{param}}` substitution |\n| `from` | No | Docker image (default: `alpine:latest`) |\n| `build` | No | Build commands (string or array), cached |\n| `inputSchema` | No | JSON Schema for inputs (under each script) |\n| `outputSchema` | No | JSON Schema for outputs |\n| `env` | No | Environment vars (`secret: true` for keyring) |\n| `timeout` | No | Max runtime (default: `30s`) |\n| `version` | No | Semver version |\n| `tags` | No | Discovery keywords |\n\n*Tools without `scripts` are LLM instruction tools (markdown interpreted by AI).\n\n## Examples by Language\n\n### Python\n```yaml\nfrom: \"python:3.12-slim\"\nbuild: \"pip install pandas\"\nscripts:\n  run:\n    command: \"python \u002Fwork\u002Fmain.py {{input}}\"\n```\n\n### Node.js\n```yaml\nfrom: \"node:20-alpine\"\nbuild: \"npm install\"\nscripts:\n  run:\n    command: \"node \u002Fwork\u002Findex.js {{input}}\"\n```\n\n### Rust\n```yaml\nfrom: \"rust:1.83-slim\"\nbuild: \"rustc \u002Fwork\u002Fmain.rs -o \u002Fwork\u002Fapp\"\nscripts:\n  run:\n    command: \"\u002Fwork\u002Fapp {{input}}\"\n```\n\n### Go\n```yaml\nfrom: \"golang:1.22-alpine\"\nbuild: \"go build -o \u002Fwork\u002Fapp \u002Fwork\u002Fmain.go\"\nscripts:\n  run:\n    command: \"\u002Fwork\u002Fapp {{input}}\"\n```\n\n### Shell (no build)\n```yaml\nscripts:\n  run: \"echo {{name}}\"\n```\n\n## Source Code Pattern\n\nAlways output JSON matching `outputSchema`:\n\n```python\n#!\u002Fusr\u002Fbin\u002Fenv python3\nimport sys, json\n\ninput_val = sys.argv[1]\nresult = {\"result\": input_val.upper()}\nprint(json.dumps(result))\n```\n\n## Secrets\n\n```yaml\nenv:\n  API_KEY:\n    description: \"API key\"\n    secret: true  # Stored in OS keyring, not .env\n```\n\nUser sets: `enact env set API_KEY --secret --namespace myorg\u002Ftools`\n\nAccess in code via environment variable: `os.environ['API_KEY']`\n\n## Two Tool Types\n\n1. **Container tools** (has `scripts`): Runs in Docker, deterministic\n2. **Instruction tools** (no `scripts`): Markdown body interpreted by LLM\n\n## Workflow\n\n```bash\n# 1. Create\nmkdir my-tool && cd my-tool\n# Create skill.package.yml, SKILL.md, and source files\n\n# 2. Test\nenact run . --input \"test=value\"\n\n# 3. Publish\nenact auth login\nenact sign .\nenact publish .\n```\n\n## Checklist\n\n- [ ] `name`: namespace\u002Fcategory\u002Ftool format\n- [ ] `description`: clear, searchable\n- [ ] `scripts`: named scripts with `{{param}}` substitution\n- [ ] `inputSchema`: validates inputs (under each script)\n- [ ] `outputSchema`: documents output\n- [ ] `from`: pinned image version (not `latest`)\n- [ ] `build`: installs dependencies\n- [ ] Source outputs valid JSON\n",{"name":5,"description":7},"main","6f0177ccc353147d443b467a122a0caec89433f4","tools\u002Fdocs-guide",3,"https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact","https:\u002F\u002Fgithub.com\u002FEnactProtocol","2026-03-18 03:30:56",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add EnactProtocol\u002Fenact --skill docs-guide",{"tool":41,"command":42},"bunx","bunx skills add EnactProtocol\u002Fenact --skill docs-guide",{"tool":44,"command":45},"pnpm","pnpm dlx skills add EnactProtocol\u002Fenact --skill docs-guide","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fdocs-guide\u002FSKILL.md",true,[49],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"skill.package.yml","REFERENCE","参考文档",152,"https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fdocs-guide\u002Fskill.package.yml",[56,67,88,98,107,117],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":23},"01M6C441CA6AN9F9QN146CS5N6","whatweb","Web scanner that identifies websites, CMS, frameworks, web servers, and embedded devices","https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fwhatweb\u002FSKILL.md",[],[58,63,64,65,66],"embedded","devices","cms","web",{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":81,"publishedAt":23},"01M6C43ZCXD71CXHNNTE6G3YVK","playwright","Browser automation tool using Playwright - captures screenshots and extracts content from web pages","https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fplaywright\u002FSKILL.md",[73,78],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":79,"categoryName":80,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000023","Skill与智能体开发",[69,82,83,84,85,66,86,87],"automation","tool","content","browser","browser automation","screenshots",{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":23},"01M6C43Y0815A6QR9CMQX8DB93","hello-rust","A simple Rust greeting tool","https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fhello-rust\u002FSKILL.md",[],[95,96,97,83],"hello rust","hello","rust",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":23},"01M6C43WCR3D1ZYE398KA7MGH8","hello-ruby","A simple Ruby greeting tool","https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fhello-ruby\u002FSKILL.md",[],[105,106,96,83],"hello ruby","ruby",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":23},"01M6C43V0DG5K0RNMYPY5T8YBF","hello-js","A simple JavaScript greeting tool","https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fhello-js\u002FSKILL.md",[],[114,96,115,116,83],"js","hello js","javascript",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":23},"01M6C43S98S1SJP1Z3SGXCZZ1Q","hello-go","A simple Go greeting tool","https:\u002F\u002Fgithub.com\u002FEnactProtocol\u002Fenact\u002Fblob\u002Fmain\u002Ftools\u002Fhello-go\u002FSKILL.md",[],[96,124,125,83],"go","hello go"]