DeepTutor CLI
HKUDS/DeepTutor
Teaches the agent to set up and run DeepTutor from the command line: chat and capabilities, knowledge bases, partners, memory, sessions, notebooks and the server or Web app.
Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item.
$ npx skills add X-isdoingreat/canvas-pilot --skill canvas-submit -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-submit --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/.agents/skills/canvas-submit .claude/skills/canvas-submit && 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-submit" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-submit into .claude/skills/canvas-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-submit", 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/.agents/skills/canvas-submitType 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-submit -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-submit --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/.agents/skills/canvas-submit .agents/skills/canvas-submit && 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-submit" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-submit into .agents/skills/canvas-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-submit", 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-submit -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-submit --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/.agents/skills/canvas-submit .cursor/skills/canvas-submit && 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-submit" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-submit into .cursor/skills/canvas-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-submit", 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 .agents/skills/canvas-submit--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-submit -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install X-isdoingreat/canvas-pilot canvas-submit --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/.agents/skills/canvas-submit .gemini/skills/canvas-submit && 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-submit" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-submit into .gemini/skills/canvas-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-submit", 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-submitInstalls 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-submit -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/.agents/skills/canvas-submit .github/skills/canvas-submit && 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-submit" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-submit into .github/skills/canvas-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-submit", 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-submit -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-submit --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/.agents/skills/canvas-submit .opencode/skills/canvas-submit && 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-submit" agent skill from https://github.com/X-isdoingreat/canvas-pilot/tree/main/.agents/skills/canvas-submit into .opencode/skills/canvas-submit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas-submit", 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-submitUse only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item.
Canvas Submit is an agent skill from X-isdoingreat/canvas-pilot. Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item. Create one scoped receipt, perform only that mutation, verify Canvas read-back, and write the canonical result. Reject broad, automatic, ambiguous, or hypothetical requests.
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).
It sits in Education. 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.
8 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 nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Canvas Submit loads about 2.7k tokens when it runs. Until then it costs about 81 tokens; SKILL.md has 1,205 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 found no risky patterns in SKILL.md.
Automated 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). 1,205 words, ~2,670 tokens.
.claude/skills/canvas-submit/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Perform one explicitly authorized Canvas mutation after the scan, approval, and
draft boundary. This skill is the interactive submit entry point; neither
canvas-scan, canvas-execute, nor a course drafting skill may invoke it on
the user's behalf.
Use the raw text of the current user message. Never reconstruct authority from an earlier message, quoted text, a plan decision, an overlay, a schedule, or the agent's own recommendation.
Pass the complete current message to
src.mutation_approval.parse_mutation_command. Accept only one whole
expression recognized by that parser:
submit N or 提交第N项 for one ordinary assignment;take quiz N, 参加测验第N项, or 做测验第N项 for one first quiz attempt;retake quiz N, 重做测验第N项, or 重考测验第N项 for one explicitly
authorized retake.Outer whitespace may be retained, but no other prose is allowed. Reject
submit all, approve all, please submit 1, submit 1 and 2,
take quiz 1 now, hypotheticals, and any command copied from a prior turn. One message
authorizes at most one indexed target. Never translate a vague request into an
accepted command.
Plan approval is not submission authority. approve 1, all, do 1, and a
plan.json decision may authorize drafting through canvas-execute, but they
must never mint or substitute for a mutation receipt. This skill is not an
automatic-submit or cron workflow.
Use only the run directory associated with the current scan presented in this
conversation. Require its non-expired plan.json and matching
assignments.json; do not search older run directories for a convenient
target. Validate them with
src.run_state.validate_plan_assignments(..., run_dir=run_dir, require_current=True).
The requested index must resolve to one contiguous 1-based plan item whose
user_decision is approve or swap:canvas-*, and that item must have a
one-to-one snapshot match. If the plan is absent, stale, unapproved, or
inconsistent, stop and require a fresh scan/approval. Never repair plan state
inside this skill.
Derive the only allowed work directory from immutable IDs:
from src.run_state import stable_work_dir
work_dir = stable_work_dir(run_dir, course_id, assignment_id)It must be named course-<course_id>__assignment-<assignment_id>. Never use a
course name, assignment name, slug, or arbitrary path as identity.
For submit N, perform this local fail-closed preflight before issuing a
receipt:
<work_dir>/result.json to exist.src.run_state.validate_result(result, root=Path.cwd(), work_dir=work_dir); do not trust a status string without validation.draft_ready.draft_path to be substantive and contained inside
the stable work directory. Never submit a path supplied only in chat.src.run_state.validate_verification_log on the verification evidence
selected by the result contract. It must contain at least one PASS line,
no FAIL line, and no unresolved placeholder/skeleton sentinel.A missing draft, directory escape, error/skipped result, failed verification, or ambiguous payload must stop before Canvas mutation. Do not regenerate, edit, or silently replace the draft in this skill; return to the responsible course skill instead.
Quiz commands do not use this ordinary-draft gate. Their read-only reading,
notes, arbitration, pacing, and mutation gates remain owned by
canvas-inside.
After the applicable local preflight, call
src.mutation_approval.issue_interactive_authorization with:
run_dir;src.canvas_client.BASE, never a URL invented
from chat;user_text equal to the verbatim current user message;The helper repeats current-plan validation, derives the exact target/actions, and writes these private artifacts below the stable work directory:
mutation_authority.json
mutation_authorization.jsonUse synthetic_qa=True only inside an independently verified, isolated local
QA Canvas. It is always false for a real Canvas origin. Do not print, copy,
publish, broaden, refresh, or hand-edit a receipt. A receipt for one course,
assignment/quiz, origin, session, or action cannot authorize another.
If authorization issuance fails, stop without mutation. Receipt issuance by itself is not receipt consumption.
Load <work_dir>/mutation_authorization.json with
src.authorization.load_authorization_receipt and pass that same receipt to
every write. Select one payload mode from the validated snapshot:
| Canvas submission type | Exact receipt action(s) | Required canonical payload | Allowed wrapper |
|---|---|---|---|
online_text_entry | assignment.submit_text | one non-empty UTF-8 text draft | src.canvas_submit_origin.submit_text_with_view |
online_upload | assignment.upload_init, assignment.upload_blob, assignment.submit_files | the draft file, or an explicit ordered metadata.submission_files list fully contained below work_dir | src.canvas_submit_origin.upload_and_submit_files_with_view |
online_url | assignment.submit_url | one spec-verified HTTP(S) URL from the canonical draft metadata/artifact | src.canvas_submit_origin.submit_url_with_view |
online_quiz | quiz-scoped actions only | no ordinary payload | hand off to canvas-inside as described below |
When the snapshot declares several supported types, require
result.metadata.submission_type to choose exactly one declared mode. Do not
pick the first type, submit the same artifact through multiple modes, glob a
directory, extract text from a binary document, or infer extra attachments.
Unsupported types such as external_tool, on_paper, and proctored delivery
are not made submit-capable by the user's command.
For file and text submissions, the receipt-aware
python -m scripts.submit_canvas CLI is an allowed adapter, but use only its
single-target mode with --authorization-receipt. Never use
--batch-manifest from this skill. The direct src.canvas_submit_origin
wrappers are preferred because they return the authoritative read-back object.
If the CLI is used, require exit code 0 and perform a fresh read-only Canvas
submission read-back before writing the result.
Never call cv.submit_text, cv.submit_files, cv.submit_url,
cv.upload_submission_file, or raw Canvas mutation endpoints here. The
origin wrappers must perform the pre-read, pass the exact receipt through each
write, and read the submission back after the write.
For take quiz N or retake quiz N, require the snapshot to declare only
online_quiz, include the exact quiz_id, and route to canvas-inside.
Provide its native Codex skill handoff with:
run_dir=<current run directory>
work_dir=<stable ID-based work directory>
course_id=<exact snapshot course ID>
assignment_id=<exact snapshot assignment ID>
quiz_id=<exact snapshot quiz ID>
authorization_receipt_path=<work_dir>/mutation_authorization.json
mutation_operation=quiz_take|quiz_retakeThe first-attempt receipt must not contain quiz.retake. Only the exact
retake quiz N command may issue that action. Do not start, answer, complete,
or retake the quiz inline in this skill. canvas-inside must validate the
receipt, bind its quiz evidence to this work directory/session/attempt, perform
Canvas read-back, finalize receipt usage when required, and write the quiz
result.json. After the handoff, validate that result with
src.run_state.validate_result before reporting success.
For an ordinary successful mutation, require the read-back to contain
workflow_state of submitted or graded and a real submitted_at. Require
src.authorization.authorization_usage_status(receipt) to show the matching
terminal assignment action before claiming consumption. Then atomically
replace <work_dir>/result.json with src.run_state.write_result, preserving
the verified draft path and at least these fields:
{
"status": "submitted",
"draft_path": "<existing verified draft>",
"submitted_at": "<Canvas read-back timestamp>",
"authorization_receipt_id": "<exact receipt id>",
"authorization_consumed": true,
"metadata": {
"skill": "canvas-submit",
"submission_type": "<selected declared type>",
"canvas_workflow_state": "submitted",
"readback_verified": true,
"attempt": 1,
"verification_log_path": "<existing PASS log>"
},
"notes": "Canvas submission verified by read-back."
}Copy actual read-back values; the example values are not defaults. Preserve
attachment metadata when Canvas returns it. Never write submitted from an
HTTP success alone, a CLI exit code alone, an upload response, or an agent
claim.
If the wrapper raises src.canvas_submit_origin.AlreadySubmitted, call
existing_submission_result and atomically write canonical
status=submitted, reason_code=already_submitted using the live read-back.
This branch is read-only: omit authorization_receipt_id, omit
authorization_consumed, and never claim the newly issued receipt was used.
For an authorization, network, mutation, or read-back failure, do not retry
automatically and do not claim submission. Preserve the draft and write an
honest canonical error result with the concrete failure evidence. If a write
outcome is uncertain, perform a read-only Canvas check; report submitted
only when that read-back proves it.
Report only the selected item, Canvas workflow state, attempt, submitted time, and whether read-back proved success. Do not expose the signed receipt, authority record, private origin/token, course identity, or unrelated plan items. Do not initiate another target, a retake, or a second attempt without a new exact later-message command.
© 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
SKILL.md and 1 other file in .agents/skills/canvas-submit of X-isdoingreat/canvas-pilot.
Open the folder on GitHubat commit 6b79d5b
Canvas Submit 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 Submit this skillX-isdoingreat/canvas-pilot | 125 | — | ~2.7k | Automated safety check: Pass | AGPL-3.0 | |
| DeepTutor CLIHKUDS/DeepTutor | 41k | — | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| AI Engineering Placement Quizrohitg00/ai-engineering-from-scratch | 66k | — | ~2k | Automated safety check: Pass | MIT | |
| Deep Reading Analystginobefun/deep-reading-analyst-skill | 353 | 4 repos | ~3.6k | Automated safety check: Pass | MIT | |
| OpenMAIC Setup and ExtensionTHU-MAIC/OpenMAIC | 40k | — | ~1.7k | Automated safety check: Notes | MIT | |
| Codebase to Coursezarazhangrui/codebase-to-course | 5.7k | — | ~4.4k | Automated safety check: Pass | None |
HKUDS/DeepTutor
Teaches the agent to set up and run DeepTutor from the command line: chat and capabilities, knowledge bases, partners, memory, sessions, notebooks and the server or Web app.
rohitg00/ai-engineering-from-scratch
Runs a 10-question quiz across five areas to place a learner in the AI Engineering from Scratch curriculum, so they skip what they already know.
ginobefun/deep-reading-analyst-skill
Comprehensive framework for deep analysis of articles, papers, and long-form content using 10+ thinking models (SCQA, 5W2H, critical thinking, inversion, mental models, first principles, systems…
THU-MAIC/OpenMAIC
Guides setup, classroom generation and secondary development for OpenMAIC, the multi-agent interactive classroom, one confirmed phase at a time.
zarazhangrui/codebase-to-course
Turns a codebase into an interactive single-page HTML course for non-technical learners, with scroll modules, animated diagrams, quizzes and plain-English code translations.
alchaincyf/zhangxuefeng-skill
Answers education and career questions in the voice of Zhang Xuefeng, looking up current employment and admissions data before giving a direct verdict.
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 only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item. Canvas Submit is an agent skill from X-isdoingreat/canvas-pilot. Use only for a separate exact later-message Canvas command (submit N, take quiz N, or retake quiz N) for one current approved item.
Canvas Submit fits situations like: education work in your project.
Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-submit -a claude-code`. Or copy the skill folder (.agents/skills/canvas-submit in X-isdoingreat/canvas-pilot) into .claude/skills/canvas-submit in your project. Claude Code loads it when a task matches its description.
Run `npx skills add X-isdoingreat/canvas-pilot --skill canvas-submit -a codex`. Or copy the skill folder (.agents/skills/canvas-submit in X-isdoingreat/canvas-pilot) into .agents/skills/canvas-submit 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-submit -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-submit, .gemini/skills/canvas-submit, .github/skills/canvas-submit and .opencode/skills/canvas-submit in your project.
Going by SKILL.md and its folder, Canvas Submit needs the command-line tools its instructions call (python). Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Canvas Submit 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 2.7k tokens (SKILL.md is roughly 11k 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 Submit: DeepTutor CLI (HKUDS/DeepTutor, 41k stars), AI Engineering Placement Quiz (rohitg00/ai-engineering-from-scratch, 66k stars), Deep Reading Analyst (ginobefun/deep-reading-analyst-skill, 353 stars) and OpenMAIC Setup and Extension (THU-MAIC/OpenMAIC, 40k 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.