Idea Wizard
DavidWells/markdown-magic
Generate and operationalize improvement ideas for projects. An agent skill from DavidWells/markdown-magic.
Use this skill on a fresh Canvas Pilot install when the student has never configured the project before.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-setup --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/canvas-setup .claude/skills/canvas-setup && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "canvas-setup" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.claude/skills/canvas-setup into .claude/skills/canvas-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-setup", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/X-isdoingreat/canvas-pilot/tree/main/.claude/skills/canvas-setupType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-setup --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/canvas-setup .agents/skills/canvas-setup && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "canvas-setup" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.claude/skills/canvas-setup into .agents/skills/canvas-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-setup", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-setup --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/canvas-setup .cursor/skills/canvas-setup && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "canvas-setup" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.claude/skills/canvas-setup into .cursor/skills/canvas-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-setup", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/X-isdoingreat/canvas-pilot.git --path .claude/skills/canvas-setup--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-setup --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/canvas-setup .gemini/skills/canvas-setup && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "canvas-setup" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.claude/skills/canvas-setup into .gemini/skills/canvas-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-setup", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install X-isdoingreat/canvas-pilot canvas-setupInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/canvas-setup .github/skills/canvas-setup && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "canvas-setup" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.claude/skills/canvas-setup into .github/skills/canvas-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-setup", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-setup --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/X-isdoingreat/canvas-pilot.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/canvas-setup .opencode/skills/canvas-setup && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "canvas-setup" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.claude/skills/canvas-setup into .opencode/skills/canvas-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-setup", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
canvas-setupUse this skill on a fresh Canvas Pilot install when the student has never configured the project before.
Canvas Setup is an agent skill from X-isdoingreat/canvas-pilot. Use this skill on a fresh Canvas Pilot install when the student has never configured the project before. Trigger phrases include "set me up", "set up canvas pilot", "install canvas pilot", "/canvas-setup", "first time", "i'm new". Also auto-invoked by canvas-scan §0 when .env is missing or CANVASBASE is empty, and by the SessionStart hook when it detects an unconfigured repo. Walks the student through a deterministic N-step first-run flow — Canvas URL → silent install → silent config → browser login → course…
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows. The repository describes itself as: Local-first Canvas LMS AI agent that learns each course's recurring assignment workflow and reuses it through scan - approval - execute with student review. The licence is AGPL-3.0.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6b79d5b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteEditGlobSkillWebSearchWebFetchFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pythonpipplaywrightFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pip, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
CANVAS_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Canvas Setup loads about 4.5k tokens when it runs. Until then it costs about 178 tokens; SKILL.md has 2,274 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
o auto-invoked by `canvas-scan` §0 when `.env` is missing or `CANVAS_BASE` is empty, and by the SessionStart hook when iwas told to `pip install` herself, edit `.env` herself, navigate Canvas back-office herself — even though CC has Bash/Edriend ever did manually (cp .env.example .env, pip install, edit env vars, run setup.py) is now CC's silent work.a sentence telling the student to "open .env", "run pip install", "go to Canvas → Account → Settings → Approved Integraookie`, `token`, `probe`, `SSO`, `Duo`, `.env`, `courses.yaml`, `SECRETS.md`, `__PROJECT_ROOT__`, `${CLAUDE_PROJECT_DIR}### Step 5 — Write `.env` silentlyCC's silent action: write `.env` file. **Never** ask the student to do this.Use `Write` tool. Do not announce ".env written" or any filename to the student.If a `.env` already exists (e.g. student is re-running setup): read it first; **preserve** any non-Canvas keys the studee hatch preservation**: if the existing `.env` has `CANVAS_AUTH=token` (the student manually configured the undocumentedAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from X-isdoingreat/canvas-pilot at commit 6b79d5b, republished under its AGPL-3.0 licence (© X-isdoingreat). 2,274 words, ~4,457 tokens.
.claude/skills/canvas-setup/SKILL.md (or your agent's skills folder).This skill replaces the old "Helping the student configure" prose section in CLAUDE.md. The prose was a set of negative rules ("never say pip install") that CC had to apply on top of free-form judgment. This skill is the positive version: a fixed N-step script. Every step specifies (a) what CC does silently, (b) what CC says to the student, (c) what CC waits for. CC walks the script; CC does not improvise.
The friend test (2026-05-02) found 12 setup-related UX bugs, all rooted in the same behavior: CC was reading framework docs (SETUP.md, .env.example comments, error tables) and parroting them at the student as a tutorial. Friend was told to pip install herself, edit .env herself, navigate Canvas back-office herself — even though CC has Bash/Edit/Write tools to do all of it. See .claude/plans/public-setup-ux-bugs.md for the full incident list.
The fix is not more prose rules in CLAUDE.md. The fix is making first-run a fixed sequence the SKILL.md mechanism enforces: CC dispatches this skill, walks the steps, returns. The student's only legitimate actions are answering domain questions (Canvas URL, which courses) and logging into Canvas once in a popup browser. Every other "step" the friend ever did manually (cp .env.example .env, pip install, edit env vars, run setup.py) is now CC's silent work.
The student's only legitimate actions during this skill:
Anything else is CC's job. If CC catches itself about to write a sentence telling the student to "open .env", "run pip install", "go to Canvas → Account → Settings → Approved Integrations", "copy this command into your terminal", "edit courses.yaml" — that is the bug this skill exists to prevent. Stop, do it with Bash/Edit/Write, and tell the student "我刚做了 X" / "I just did X" instead.
Internal vocabulary the student never sees: pip, playwright, chromium, cookie, token, probe, SSO, Duo, .env, courses.yaml, SECRETS.md, __PROJECT_ROOT__, ${CLAUDE_PROJECT_DIR}, runs/..., .cookies/..., any Canvas API field name, any course/user/file _id. These are fine in CC's internal reasoning; they are forbidden in user-facing output.
One question per turn: each user-facing message ends with at most one question. Multi-question turns are a bug.
Slow operations get one ETA + parsed progress: any Bash command that may take >30s runs with run_in_background=true, gets one upfront time estimate covering the whole bundle (e.g. "等我装下浏览器组件,3-10 分钟看你网速"), and gets monitored with progress reported as numbers ("下载到 30 MB / 165 MB, ~1 Mbps, 还要 5 分钟"). Never repeat-emit "继续等" with no new information.
Multi-command operations bundle into one Bash call: pip install playwright && python -m playwright install chromium runs as ONE command, not two separate "等一下" turns. Use && so failures stop the chain.
CC's silent action: none yet.
CC says (literal pin, pick the language matching the student's first message):
这是 Canvas 作业自动化工具。我会扫你这学期的 Canvas,列出待交作业,每周帮你处理重复性的(阅读注释、刷题、quiz 之类),交付前给你审批。要开始吗?
This is Canvas Pilot. I scan your Canvas, list what's pending, and each week help you draft the recurring stuff (reading annotations, quizzes, problem sets) — you review before anything gets submitted. Want to start?
CC waits for: any affirmative (yes/好/行/ok/嗯/start/开始). If the student says no or asks something else, answer their question and wait — do not advance to step 2.
CC asks for the school, not the URL — CC will find the URL itself.
CC says:
你哪个学校?学校名或域名都行(比如学校的简称或
<your-school>.edu)。
Which school do you go to? Name or domain works (e.g. your school's short name or
<your-school>.edu).
CC waits for: a school identifier (name / domain / anything searchable). If the student volunteered school context in an earlier message (email domain like name@<school>.edu, or SSO URL like shib.service.<school>.edu/idp/...), CC may skip the question — extract the school silently from the prior message (base domain <school>.edu from email or SSO host).
CC's silent action: discover + verify the Canvas URL.
WebSearch <school> canvas login. From the result list, pick the first URL whose host matches Canvas-shaped patterns:
canvas.<anything>.edu<anything>.instructure.comgocanvas.<anything> (Stanford-style)<anything>.canvas.<anything>If none of the WebSearch results match these patterns → skip to step 4 (fallback).
WebFetch <candidate> (the host root — Canvas root returns the login page or a /login redirect for unauthenticated users, and either way emits Canvas signature strings). The Canvas signature is any of:
Canvas by Instructurecanvas-login or /login/canvas form actioninstructure (case-insensitive)If WebFetch succeeded AND signature matched → silently normalize and use:
import re
host_only = re.match(r"(https?://[^/]+)", candidate).group(1).rstrip("/")
CANVAS_WEB_BASE = host_only
CANVAS_BASE = host_only + "/api/v1"Advance to Step 3. Do NOT confirm with the student — they'll see the domain in Step 6 when the browser pops up.
Fallback — triggered when WebSearch returned no Canvas-shaped candidate, OR WebFetch failed (timeout / non-200 / permission deny), OR signature didn't match.
CC says:
查不到你们学校的 Canvas 地址 — 直接给我 Canvas 登录页的网址就行(比如
canvas.<your-school>.edu)。
Couldn't find your school's Canvas — give me the Canvas login page URL directly (e.g.
canvas.<your-school>.edu).
When the student replies:
4a. If the manual input looks like an SSO URL (host starts with shib. / idp. / sso. / login. subdomain prefix): extract the base domain (e.g. shib.service.<school>.edu → <school>.edu), re-run step 1 + step 2 once with the extracted school. If that round succeeds, use it silently and advance to Step 3. If it still fails, fall through to step 4b.
4b. Otherwise normalize the manual URL as before:
raw = student_input.strip()
if not raw.startswith("http"):
raw = "https://" + raw
host_only = re.match(r"(https?://[^/]+)", raw).group(1).rstrip("/")
CANVAS_WEB_BASE = host_only
CANVAS_BASE = host_only + "/api/v1"If the manual input doesn't match https?://[a-z0-9.-]+ after normalization, ask once more without explaining regex: "我没认出来这是个 Canvas 网址 — 直接给我学校 Canvas 登录页那个地址就行。"
CC's silent action: none yet.
CC says (literal pin):
配 Canvas 连接需要一次浏览器登录——我等会儿弹一个浏览器,你像平时一样登 Canvas 就行。session 偶尔过期了浏览器会再弹一下让你重登几秒,你不需要手动找或粘任何东西。
Setting up the Canvas connection needs a one-time browser login — I'll pop a browser, you log in like normal. If the session ever expires the browser pops up again for ~10 seconds. You don't need to find or copy anything manually.
CC waits for: any affirmative or silence (default: continue). If the student asks why / wants alternatives / is worried, answer their question briefly and continue once they're ready. Do not surface alternative auth paths — there is only one supported path.
First check whether playwright + chromium are already installed (single Python check, not a user-visible question):
import subprocess, sys
result = subprocess.run(
[sys.executable, "-c", "import playwright; from playwright.sync_api import sync_playwright; p=sync_playwright().start(); p.chromium.launch(headless=True).close(); p.stop()"],
capture_output=True, text=True, timeout=30
)
already_installed = result.returncode == 0If already_installed → skip to Step 5 silently, say nothing.
If not installed → CC says (literal pin):
等我装下浏览器组件——3-10 分钟看你网速,第一次比较慢。我会同步进度。
Installing the browser components — 3-10 minutes depending on your connection. I'll keep you posted.
CC then runs ONE bundled Bash command in background:
pip install playwright && python -m playwright install chromium 2>&1 | tee /tmp/canvas_setup_install.log(Use run_in_background=true. On Windows replace /tmp with a project-relative tmp dir.)
CC monitors the log file every 30-60 seconds. Each time CC reports, it must extract numbers from the log:
playwright install chromium prints Downloading Chrome ... [progress bar] X% of YMb — parse to "下载到 X MB / Y MB"CC says (literal pin format):
下载到 30 MB / 165 MB,~1 Mbps,还要 5 分钟。网慢的话再等等就行。
30 MB / 165 MB downloaded, ~1 Mbps, ~5 min left. Hang tight if your connection is slow.
Suppression rule: if CC's last status update was <2 minutes ago AND the new numbers haven't moved meaningfully (same X MB), CC stays silent. Repeat-emitting "继续等" / "still downloading" with no new info is a bug.
If install fails (non-zero exit, network error, disk full): CC reads the tail of the log, surfaces the actual error in plain language ("下载断了,看起来是网络问题——要不要再试一次?"), and waits for the student's call.
.env silentlyCC's silent action: write .env file. Never ask the student to do this.
env_content = (
"CANVAS_AUTH=cookie\n"
f"CANVAS_BASE={CANVAS_BASE}\n"
f"CANVAS_WEB_BASE={CANVAS_WEB_BASE}\n"
)Use Write tool. Do not announce ".env written" or any filename to the student.
If a .env already exists (e.g. student is re-running setup): read it first; preserve any non-Canvas keys the student may have added; only overwrite CANVAS_AUTH=cookie + CANVAS_BASE + CANVAS_WEB_BASE.
Escape hatch preservation: if the existing .env has CANVAS_AUTH=token (the student manually configured the undocumented token escape hatch — knows what they're doing), preserve it as-is. Do not change CANVAS_AUTH, do not touch CANVAS_TOKEN, do not ask the student about it, do not surface that token mode exists. Only update CANVAS_BASE / CANVAS_WEB_BASE if they're missing or empty. This is intentional: the escape hatch is for users who already configured it deliberately; canvas-setup's job is to configure cookie mode without disturbing existing manual config.
CC silently runs a probe that triggers the headed browser:
python -m src.canvas_client --probeThe probe will pop a Chromium login window (handled inside canvas_client.py:_login_interactive).
CC says (literal pin, immediately before running the probe so the student knows what's about to happen):
浏览器要弹出来。你照常登 Canvas,登完它自己关。
Browser is about to pop up. Log in to Canvas like normal, it'll close itself when it's done.
CC waits for: probe to return successfully (Canvas accepted the session, cookies persisted to .cookies/session.json).
If probe fails because the student didn't complete login within 5 minutes: CC says "我没看到你登好——是浏览器没起来,还是中间卡住了?" and waits.
If probe fails because playwright import broke (rare; install was supposed to handle this): CC silently reruns the install bundle once more, then retries the probe. Don't surface the install failure to the student unless it fails twice.
courses.yaml silentlyNote: setup deliberately does NOT list courses or ask the student "which courses?" — that work belongs to canvas-bootstrap, which has a more thorough 4-layer noise filter (Layer 1 active + Layer 2 nonempty + Layer 3 recurring-pattern fold + Layer 4 looks-like-real-course rescue) plus the fingerprint table that shows assignment-pattern signals per course. Setup's job ends at "Canvas authentication works"; selection + design is bootstrap's job.
CC's silent action: use Write to create courses.yaml:
# Generated by canvas-setup. canvas-bootstrap (next) will fill routes.
pending_window_days: 7
routes: {}routes: {} is an empty mapping — bootstrap §1 explicitly handles this (line 38: "or every active course Canvas returns when routes is empty") by listing all active courses with the full filter pipeline.
If courses.yaml already exists with non-empty routes (re-running setup on a partially-configured project), preserve existing entries and skip this write.
If SECRETS.md exists, CC updates the "Active courses" table inside it (read first, replace just that section). If SECRETS.md doesn't exist, CC creates it from SECRETS.example.md (if that template exists; otherwise creates minimal).
CC says nothing about writing these files.
CC says (literal pin):
配好了 Canvas 连接。下面看你这学期有哪几门课,给每门课设计 skill——决定怎么自动化。从最简单的开始。
Canvas connection is set up. Now let's look at your courses this term and design a skill for each — how each course should be automated. Starting with the simplest one.
CC then invokes canvas-bootstrap via the Skill tool, passing this context:
"canvas-setup just finished — Canvas auth works, courses.yaml has empty routes ({}). This is first-run mode: list all active courses with the 3-section fingerprint render (main / likely-real / noise), let the student pick which to track AND name skills in one combined picker, write SKILL.md skeletons + populate routes."
canvas-bootstrap takes over from here. canvas-setup exits.
When canvas-bootstrap returns, CC says (literal pin, three affordances):
配好了。
- 想看这周要交什么 → "scan canvas"
- 还想加更多课 / 改某门课的设计 → "设计 skill"
- 你刚设计的 skill 在
.claude/skills/下面(每门课一个文件夹),里面就是你给自己写的执行步骤,以后想改直接编辑
All set.
- Want to see what's due this week → "scan canvas"
- Want to add more courses / redesign a skill later → "design a skill"
- The skills you just designed are under
.claude/skills/(one folder per course) — those are the playbooks you wrote for yourself; edit anytime
The three affordances cover three real first-run needs:
Note: this is the one place where .claude/skills/ is named to the student. After bootstrap completes, those files are the student's playbook artifacts (not framework internal config), so the path is meaningful and editable, not jargon. This intentional break of the "internal vocabulary the student never sees" rule is per plan 2026-05-03 design.
This skill exits.
Student ctrl+C mid-setup, comes back later: CC detects partial state on next session entry:
.env doesn't exist → started with fresh first-run, restart at Step 1.env exists but CANVAS_BASE empty → restart at Step 2.env complete but no .cookies/session.json and CANVAS_AUTH=cookie → restart at Step 6 (re-trigger login).env has CANVAS_AUTH=token (escape hatch — student configured manually): treat as fully authenticated; verify with a silent python -m src.canvas_client --probe and proceed to Step 7.env complete + auth works but courses.yaml missing or has routes: {} → restart at Step 7 (write empty routes if needed) → continue Step 8 (re-dispatch bootstrap)CC does not ask the student "where did we leave off". CC reads the filesystem state and resumes silently from the right step.
Student wants to redo setup from scratch: explicit trigger phrases like "redo setup" / "重新配", or /canvas-setup invoked manually. CC says "你想全部重来还是只改某一步(学校换了 / 课程列表)?" and routes accordingly. Never silently overwrite working config.
Student wants to uninstall: out of scope for v1. If asked, CC explains what files are involved (.env, .cookies/, the playwright binaries) and lets the student decide what to delete.
canvas_client.py is undocumented and must not be advertised.© X-isdoingreat, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/canvas-setup of X-isdoingreat/canvas-pilot.
Open the folder on GitHubat commit 6b79d5b
Canvas Setup next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Canvas Setup this skillX-isdoingreat/canvas-pilot | 125 | — | ~4.5k | Automated safety check: Notes | AGPL-3.0 | |
| Idea WizardDavidWells/markdown-magic | 871 | — | ~1.1k | Automated safety check: Pass | None | |
| Build A Personal Skill From HistoryTHU-MAIC/OpenMAIC | 40k | — | ~678 | Automated safety check: Pass | MIT | |
| ArenaJakeschincariol/arena-skill | 379 | — | ~4.8k | Automated safety check: Pass | MIT | |
| Abide Compilecoldteadotai/abide | 568 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Proposal AgentOpenRSI-Foundation/OpenRSI-Index | 204 | — | ~5.1k | Automated safety check: Pass | Apache-2.0 |
DavidWells/markdown-magic
Generate and operationalize improvement ideas for projects. An agent skill from DavidWells/markdown-magic.
THU-MAIC/OpenMAIC
Derives a reusable personal skill for course-making from a representative sample of the user's own past classrooms and chat history, confirmed with them before saving.
Jakeschincariol/arena-skill
Make 100 versions of Claude fight to the death over one task.
coldteadotai/abide
Compile a repository's instruction files (AGENTS.md, CLAUDE.md and friends) into an Abide rubric, then validate and calibrate it.
OpenRSI-Foundation/OpenRSI-Index
A skill your agent uses when a contributor wants to create, repair, or complete an OpenRSI-Index AutoResearch task proposal grounded in a remote model-development repository, including…
HelloRuru/claude-memory-engine
Memory management system for Claude Code — Student Loop, Smart Context, Auto Learn, Session Handoff, Correction Cycle.
X-isdoingreat/canvas-pilot
A skill your agent uses when verified work from today or another day should become an X/Twitter post, build-in-public update, ship log, or bilingual draft.
X-isdoingreat/canvas-pilot
A skill your agent uses when a short local academic draft needs role-aware syntax diversification while preserving meaning, locks, source grounding, rubric-critical openings, and document structure.
X-isdoingreat/canvas-pilot
A skill your agent uses when managing Canvas Pilot schedules: install, inspect, pause, change, delete, or safely test scheduled scans and runs.
X-isdoingreat/canvas-pilot
A skill your agent uses for an approved long academic-writing assignment routed by canvas-execute after the deterministic writing router selects essay.
X-isdoingreat/canvas-pilot
A skill your agent uses for an approved Canvas assignment that no specialized course skill can handle.
X-isdoingreat/canvas-pilot
A skill your agent uses when a local academic draft needs a meaning-preserving humanizing pass with less uniform syntax while retaining rubric, source, lock, voice, and length constraints.
Categories
Use this skill on a fresh Canvas Pilot install when the student has never configured the project before. Canvas Setup is an agent skill from X-isdoingreat/canvas-pilot. Use this skill on a fresh Canvas Pilot install when the student has never configured the project before.
Canvas Setup fits situations like: phrases include set me up; set up canvas pilot; install canvas pilot.
Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a claude-code`. Or copy the skill folder (.claude/skills/canvas-setup in X-isdoingreat/canvas-pilot) into .claude/skills/canvas-setup in your project. Claude Code loads it when a task matches its description.
Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a codex`. Or copy the skill folder (.claude/skills/canvas-setup in X-isdoingreat/canvas-pilot) into .agents/skills/canvas-setup in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-setup -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/canvas-setup, .gemini/skills/canvas-setup, .github/skills/canvas-setup and .opencode/skills/canvas-setup in your project.
Going by SKILL.md and its folder, Canvas Setup needs the command-line tools its instructions call (python, pip and playwright) and credentials named CANVAS_TOKEN. Our summary lists: Python 3; A credential in CANVAS_TOKEN. Its frontmatter pre-approves these tools: Bash, Read, Write, Edit, Glob, Skill, WebSearch, WebFetch.
SKILL.md contains no URLs. Its commands use pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Canvas Setup is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Canvas Setup: Idea Wizard (DavidWells/markdown-magic, 871 stars), Build A Personal Skill From History (THU-MAIC/OpenMAIC, 40k stars), Arena (Jakeschincariol/arena-skill, 379 stars) and Abide Compile (coldteadotai/abide, 568 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
X-isdoingreat (a GitHub user) maintains it in X-isdoingreat/canvas-pilot, which has 125 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on July 31, 2026.
Source: X-isdoingreat/canvas-pilot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.