[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M78ZPY4XDBP8VVNPPSVG4ZYA":3,"skill-same:01M78ZPY4XDBP8VVNPPSVG4ZYA":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M78ZPY4XDBP8VVNPPSVG4ZYA","canvas",null,"Canvas LMS integration — fetch enrolled courses and assignments using API token authentication.","ZDStudios\u002FAIOS","ZDStudios","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F121779558?v=4","01M788P61KMHSJ87R41BH4MSQM","01M788P627Y27KK5MQ1KG3TW5H",7,"MIT","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fhermes-agent-main\u002Fhermes-agent-main\u002Foptional-skills\u002Fproductivity\u002Fcanvas\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: canvas\ndescription: Canvas LMS integration — fetch enrolled courses and assignments using API token authentication.\nversion: 1.0.0\nauthor: community\nlicense: MIT\nplatforms: [linux, macos, windows]\nprerequisites:\n  env_vars: [CANVAS_API_TOKEN, CANVAS_BASE_URL]\nmetadata:\n  hermes:\n    tags: [Canvas, LMS, Education, Courses, Assignments]\n---\n\n# Canvas LMS — Course & Assignment Access\n\nRead-only access to Canvas LMS for listing courses and assignments.\n\n## Scripts\n\n- `scripts\u002Fcanvas_api.py` — Python CLI for Canvas API calls\n\n## Setup\n\n1. Log in to your Canvas instance in a browser\n2. Go to **Account → Settings** (click your profile icon, then Settings)\n3. Scroll to **Approved Integrations** and click **+ New Access Token**\n4. Name the token (e.g., \"Hermes Agent\"), set an optional expiry, and click **Generate Token**\n5. Copy the token and add to `${HERMES_HOME:-~\u002F.hermes}\u002F.env`:\n\n```\nCANVAS_API_TOKEN=your_token_here\nCANVAS_BASE_URL=https:\u002F\u002Fyourschool.instructure.com\n```\n\nThe base URL is whatever appears in your browser when you're logged into Canvas (no trailing slash).\n\n## Usage\n\n```bash\nCANVAS=\"python $HERMES_HOME\u002Fskills\u002Fproductivity\u002Fcanvas\u002Fscripts\u002Fcanvas_api.py\"\n\n# List all active courses\n$CANVAS list_courses --enrollment-state active\n\n# List all courses (any state)\n$CANVAS list_courses\n\n# List assignments for a specific course\n$CANVAS list_assignments 12345\n\n# List assignments ordered by due date\n$CANVAS list_assignments 12345 --order-by due_at\n```\n\n## Output Format\n\n**list_courses** returns:\n```json\n[{\"id\": 12345, \"name\": \"Intro to CS\", \"course_code\": \"CS101\", \"workflow_state\": \"available\", \"start_at\": \"...\", \"end_at\": \"...\"}]\n```\n\n**list_assignments** returns:\n```json\n[{\"id\": 67890, \"name\": \"Homework 1\", \"due_at\": \"2025-02-15T23:59:00Z\", \"points_possible\": 100, \"submission_types\": [\"online_upload\"], \"html_url\": \"...\", \"description\": \"...\", \"course_id\": 12345}]\n```\n\nNote: Assignment descriptions are truncated to 500 characters. The `html_url` field links to the full assignment page in Canvas.\n\n## API Reference (curl)\n\n```bash\n# List courses\ncurl -s -H \"Authorization: Bearer $CANVAS_API_TOKEN\" \\\n  \"$CANVAS_BASE_URL\u002Fapi\u002Fv1\u002Fcourses?enrollment_state=active&per_page=10\"\n\n# List assignments for a course\ncurl -s -H \"Authorization: Bearer $CANVAS_API_TOKEN\" \\\n  \"$CANVAS_BASE_URL\u002Fapi\u002Fv1\u002Fcourses\u002FCOURSE_ID\u002Fassignments?per_page=10&order_by=due_at\"\n```\n\nCanvas uses `Link` headers for pagination. The Python script handles pagination automatically.\n\n## Rules\n\n- This skill is **read-only** — it only fetches data, never modifies courses or assignments\n- On first use, verify auth by running `$CANVAS list_courses` — if it fails with 401, guide the user through setup\n- Canvas rate-limits to ~700 requests per 10 minutes; check `X-Rate-Limit-Remaining` header if hitting limits\n\n## Troubleshooting\n\n| Problem | Fix |\n|---------|-----|\n| 401 Unauthorized | Token invalid or expired — regenerate in Canvas Settings |\n| 403 Forbidden | Token lacks permission for this course |\n| Empty course list | Try `--enrollment-state active` or omit the flag to see all states |\n| Wrong institution | Verify `CANVAS_BASE_URL` matches the URL in your browser |\n| Timeout errors | Check network connectivity to your Canvas instance |\n","# Canvas LMS — Course & Assignment Access\n\nRead-only access to Canvas LMS for listing courses and assignments.\n\n## Scripts\n\n- `scripts\u002Fcanvas_api.py` — Python CLI for Canvas API calls\n\n## Setup\n\n1. Log in to your Canvas instance in a browser\n2. Go to **Account → Settings** (click your profile icon, then Settings)\n3. Scroll to **Approved Integrations** and click **+ New Access Token**\n4. Name the token (e.g., \"Hermes Agent\"), set an optional expiry, and click **Generate Token**\n5. Copy the token and add to `${HERMES_HOME:-~\u002F.hermes}\u002F.env`:\n\n```\nCANVAS_API_TOKEN=your_token_here\nCANVAS_BASE_URL=https:\u002F\u002Fyourschool.instructure.com\n```\n\nThe base URL is whatever appears in your browser when you're logged into Canvas (no trailing slash).\n\n## Usage\n\n```bash\nCANVAS=\"python $HERMES_HOME\u002Fskills\u002Fproductivity\u002Fcanvas\u002Fscripts\u002Fcanvas_api.py\"\n\n# List all active courses\n$CANVAS list_courses --enrollment-state active\n\n# List all courses (any state)\n$CANVAS list_courses\n\n# List assignments for a specific course\n$CANVAS list_assignments 12345\n\n# List assignments ordered by due date\n$CANVAS list_assignments 12345 --order-by due_at\n```\n\n## Output Format\n\n**list_courses** returns:\n```json\n[{\"id\": 12345, \"name\": \"Intro to CS\", \"course_code\": \"CS101\", \"workflow_state\": \"available\", \"start_at\": \"...\", \"end_at\": \"...\"}]\n```\n\n**list_assignments** returns:\n```json\n[{\"id\": 67890, \"name\": \"Homework 1\", \"due_at\": \"2025-02-15T23:59:00Z\", \"points_possible\": 100, \"submission_types\": [\"online_upload\"], \"html_url\": \"...\", \"description\": \"...\", \"course_id\": 12345}]\n```\n\nNote: Assignment descriptions are truncated to 500 characters. The `html_url` field links to the full assignment page in Canvas.\n\n## API Reference (curl)\n\n```bash\n# List courses\ncurl -s -H \"Authorization: Bearer $CANVAS_API_TOKEN\" \\\n  \"$CANVAS_BASE_URL\u002Fapi\u002Fv1\u002Fcourses?enrollment_state=active&per_page=10\"\n\n# List assignments for a course\ncurl -s -H \"Authorization: Bearer $CANVAS_API_TOKEN\" \\\n  \"$CANVAS_BASE_URL\u002Fapi\u002Fv1\u002Fcourses\u002FCOURSE_ID\u002Fassignments?per_page=10&order_by=due_at\"\n```\n\nCanvas uses `Link` headers for pagination. The Python script handles pagination automatically.\n\n## Rules\n\n- This skill is **read-only** — it only fetches data, never modifies courses or assignments\n- On first use, verify auth by running `$CANVAS list_courses` — if it fails with 401, guide the user through setup\n- Canvas rate-limits to ~700 requests per 10 minutes; check `X-Rate-Limit-Remaining` header if hitting limits\n\n## Troubleshooting\n\n| Problem | Fix |\n|---------|-----|\n| 401 Unauthorized | Token invalid or expired — regenerate in Canvas Settings |\n| 403 Forbidden | Token lacks permission for this course |\n| Empty course list | Try `--enrollment-state active` or omit the flag to see all states |\n| Wrong institution | Verify `CANVAS_BASE_URL` matches the URL in your browser |\n| Timeout errors | Check network connectivity to your Canvas instance |\n",{"name":5,"author":23,"license":14,"version":24,"metadata":25,"platforms":33,"description":7,"prerequisites":37},"community","1.0.0",{"hermes":26},{"tags":27},[28,29,30,31,32],"Canvas","LMS","Education","Courses","Assignments",[34,35,36],"linux","macos","windows",{"env_vars":38},[39,40],"CANVAS_API_TOKEN","CANVAS_BASE_URL","main","4faa79f92720631ffd00755d9a1018f8c68d3619","hermes-agent-main\u002Fhermes-agent-main\u002Foptional-skills\u002Fproductivity\u002Fcanvas",1,"https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS","https:\u002F\u002Fzdstudios.github.io\u002FAIOS\u002F","https:\u002F\u002Fgithub.com\u002FZDStudios","zdstudios.network","Hacker, Coder and Machine Learning Engineer \r\n","2026-10-06 21:45:38",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add ZDStudios\u002FAIOS --skill canvas",{"tool":57,"command":58},"bunx","bunx skills add ZDStudios\u002FAIOS --skill canvas",{"tool":60,"command":61},"pnpm","pnpm dlx skills add ZDStudios\u002FAIOS --skill canvas","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fhermes-agent-main\u002Fhermes-agent-main\u002Foptional-skills\u002Fproductivity\u002Fcanvas\u002FSKILL.md",true,[65],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"scripts\u002Fcanvas_api.py","SCRIPT","脚本",5224,"https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fhermes-agent-main\u002Fhermes-agent-main\u002Foptional-skills\u002Fproductivity\u002Fcanvas\u002Fscripts\u002Fcanvas_api.py",[72,80,87,93,100,107],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":76,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":18},"01M7910QACPXVF8QY3ZMK6MD2M","ruflo","Ruflo is a multi-agent orchestration platform for AI coding agents (Claude Code, Cursor, Codex, Copilot, Gemini, Amp, +12 more). Use this skill when the user wants to (1) install\u002Finit ruflo in a project, (2) run multi-agent swarms with hierarchical coordination, (3) use ruflo's 314+ MCP tools for memory, routing, hooks, sub-agents, or workflows, (4) check ruflo status\u002Fversion\u002Fdoctor health, or (5) discover which of ruflo's 30+ plugins fits their task.","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fruflo-main\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fruflo-main\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":18},"01M790G7AX480HX5959531CWBK","ponytail","Forces the laziest solution that actually works, simplest, shortest, most minimal. Channels a senior dev who has seen everything: question whether the task needs to exist at all (YAGNI), reach for the standard library before custom code, native platform features before dependencies, one line before fifty. Supports intensity levels: lite, full (default), ultra. Use on ANY coding task: writing, adding, refactoring, fixing, reviewing, or designing code, and choosing libraries or dependencies. Also use whenever the user says \"ponytail\", \"be lazy\", \"lazy mode\", \"simplest solution\", \"minimal solution\", \"yagni\", \"do less\", or \"shortest path\", or complains about over-engineering, bloat, boilerplate, or unnecessary dependencies. Do NOT use for non-coding requests (general knowledge, prose, translation, summaries, recipes).","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fponytail-main\u002Fskills\u002Fponytail\u002FSKILL.md",[],[],{"skillNo":88,"name":82,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":18},"01M790FD2BC49T1M774T6NND33","Lazy senior dev mode for any coding task (write, refactor, fix, review): YAGNI, stdlib first, no unrequested abstractions. Not for non-coding requests.","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fponytail-main\u002F.openclaw\u002Fskills\u002Fponytail\u002FSKILL.md",[],[],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":18},"01M790FANKMMJJQK23GQEESEXP","ponytail-review","Review a diff for over-engineering. Finds what to delete: reinvented stdlib, needless deps, speculative abstractions. One line per finding.","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fponytail-main\u002F.openclaw\u002Fskills\u002Fponytail-review\u002FSKILL.md",[],[],{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":18},"01M790F7Q3SJZCR6BYQ97TVFEJ","ponytail-help","Quick reference for ponytail's modes, skills, and commands. One-shot display.","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fponytail-main\u002F.openclaw\u002Fskills\u002Fponytail-help\u002FSKILL.md",[],[],{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":18},"01M790F3TX7VZG0J4VVXE9BSNT","ponytail-gain","Show ponytail measured impact as a scoreboard: less code, less cost, more speed, from the benchmark medians. One-shot display.","https:\u002F\u002Fgithub.com\u002FZDStudios\u002FAIOS\u002Fblob\u002Fmain\u002Fponytail-main\u002F.openclaw\u002Fskills\u002Fponytail-gain\u002FSKILL.md",[],[]]