Not in the top 1,000 by GitHub stars
flowith-ai/canvas-cowork
Cowork on a spatial canvas from the CLI — create canvases, generate images/text/video/agent responses, read results, recall past work, and manage nodes
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9b80a7fd33e0 → 9b80a7fd33e0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 9b80a7fd33e0
No earlier version was observed for comparison.
Heat
2.9- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
canvas-cowork
When your agent uses it
Generate text, images and videos on Flowith's canvas from the CLI, headless or with a live cursor. Use for any image/video generation (Seedance, Veo, Kling, gpt-image, Gemini image), "canvas", "Flowith", "Neo", drawing/creating visual content, or past canvas work. /canvas-cowork
What it loads into context
Frontmatter
85 tokensAlways available to the agent
SKILL.md
1,175 tokensWhen the skill is activated
Reference documents
7,598 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Cheat sheet (covers 95% of work — no browser needed)
- Three rules
- Seedance 2.x references
- Live cursor (optional, needs a Flowith tab)
- Where things land
Scripts executed separately
scripts/__tests__/canvas.test.tsscripts/__tests__/ergonomics.test.tsscripts/__tests__/generate.test.tsscripts/__tests__/models.test.tsscripts/index.tsscripts/lib/canvas.tsscripts/lib/download.tsscripts/lib/generate.tsscripts/lib/http.tsscripts/lib/models.tsscripts/lib/session.tsscripts/lib/upload.ts
Files
LICENSEasset1,067 bytesREADME.mddoc3,076 bytesSKILL.mdcore4,079 bytesSKILL.mdcore4,079 bytesSKILL.mdcore4,079 bytesreferences/api.mddoc8,148 bytesreferences/cli.mddoc6,747 bytesreferences/creative-dream.mddoc5,823 bytesreferences/troubleshooting.mddoc3,559 bytesscripts/__tests__/canvas.test.tsruns2,546 bytesscripts/__tests__/ergonomics.test.tsruns5,910 bytesscripts/__tests__/generate.test.tsruns7,777 bytesscripts/__tests__/models.test.tsruns5,449 bytesscripts/index.tsruns92,053 bytesscripts/lib/canvas.tsruns9,276 bytesscripts/lib/download.tsruns1,575 bytesscripts/lib/generate.tsruns20,755 bytesscripts/lib/http.tsruns5,960 bytesscripts/lib/models.tsruns13,476 bytesscripts/lib/session.tsruns3,553 bytesscripts/lib/upload.tsruns4,022 bytes
Read SKILL.md
# Canvas Cowork
You are a collaborator on a shared spatial canvas. Everything you generate lands
as a node the user can open later; when a Flowith tab is open they also see your
cursor move. **Be their eyes and hands**: after every generation bring the result
back — images as `` with your honest read of what appeared, video as
`[Watch video](url)` plus what happens in it, text printed directly. Never say
"go look at the canvas." **Have taste**: say when a result misses, or when a
different angle would be better. `recall` is shared memory — use it.
Run from the skill directory with bun. Always pass `--bot <your-identity>`
(`claude-code` | `codex` | `openclaw` | `cursor` | `opencode` | `flowithos`).
## Cheat sheet (covers 95% of work — no browser needed)View the complete source on GitHubSkills included
- canvas-cowork
Repository facts
- License
- MIT
- Created
- Mar 31, 2026
- Last pushed
- Oct 20, 2026
- Forks
- 5
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 2 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 118 network referencesin 12 files: scripts/__tests__/generate.test.ts:31 references/api.md:14 scripts/index.ts:187 and 9 more
- No hidden or obfuscated text
- No instruction overrides
- 12 executable scriptsin 12 files: scripts/__tests__/canvas.test.ts:1 scripts/__tests__/ergonomics.test.ts:1 scripts/__tests__/generate.test.ts:1 and 9 more
- 12 references to secretsin 3 files: references/api.md:22 scripts/lib/session.ts:108 scripts/index.ts:269
- No requests to vote in Hot
Show all 142 signals by file
README.md
- Network accessline 3
Generate images and videos on [Flowith](https://flowith.io)'s spatial canvas from the CLI — **headless** (plain HTTP, for agents and pipelines) or **live** (a cursor on the canvas the user watches). Create canvases, read results, recall pas - Network accessline 25
bun $S --bot claude-code gen video "a red roadster on a coastal road at sunset" # → {"type":"result","data":{"status":"finished","url":"https://vg.flowith.net/....mp4", "model":"seedance-2.0-fast", ...}} - Network accessline 26
# → {"type":"result","data":{"status":"finished","url":"https://vg.flowith.net/....mp4", "model":"seedance-2.0-fast", ...}} - Network accessline 48
- A [Flowith](https://flowith.io) account (log in once through the browser handshake) - Network accessline 49
- [Bun](https://bun.sh) — or call the HTTP API directly, see [references/api.md](./references/api.md)
SKILL.md
- Network accessline 43
Result: `{status:"finished", url|text, nodeId, questionNodeId, convId, model, …}`; failures exit 1 with `{type:"error", code, message}` (`NO_CREDITS` → stop and send https://flowith.io/pricing, don't retry or switch models). - Network accessline 45
https://flowith.io/pricing, don't retry or switch models).
references/api.md
- Network accessline 14
[Credential-related source omitted] - Network accessline 15
[Credential-related source omitted] - Network accessline 16
[Credential-related source omitted] - Network accessline 22
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 31
curl -s 'https://edge.flowith.io/models?logo=1&desc=1' | jq '."seedance-2.5"' - Network accessline 43
[Credential-related source omitted] - Network accessline 45
# → {"url":"https://r2-bucket.flowith.net/f/.../clip.mp4"} - Network accessline 57
[Credential-related source omitted] - Network accessline 58
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Network accessline 63
# list nodes curl -s "$SUPABASE_URL/rest/v1/flow_node?conv_id=eq.$CONV&is_delete=not.is.true&select=id,type,p_id,data,position&order=created_at.asc" \ - Network accessline 64
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Network accessline 93
[Credential-related source omitted] - Network accessline 99
"aspect_ratio":"1:1", // from supportedAspectRatios "image_size":"2k", // from supportedImageSizes (omit for gpt-image-2) "styleUrls":["https://.../ref.png"] // optional reference images - Network accessline 100
"image_size":"2k", // from supportedImageSizes (omit for gpt-image-2) "styleUrls":["https://.../ref.png"] // optional reference images }' - Network accessline 101
"styleUrls":["https://.../ref.png"] // optional reference images - Network accessline 123
[Credential-related source omitted] - Network accessline 132
"resolution":"720p", // supportedResolutions "audio":true, "imageURL":"https://.../start.png", // optional start frame - Network accessline 133
"audio":true, "imageURL":"https://.../start.png", // optional start frame "keyFrames":["https://.../start.png","https://.../end.png"], // optional, both frames - Network accessline 134
"imageURL":"https://.../start.png", // optional start frame - Network accessline 135
"keyFrames":["https://.../start.png","https://.../end.png"], // optional, both frames - Network accessline 161
[Credential-related source omitted] - Network accessline 183
[Credential-related source omitted]
references/troubleshooting.md
- Network accessline 13
| Code | Meaning | What to do | |---|---|---| | `NO_CREDITS` | Account has no remaining credits (HTTP 402 / node type 22) | **Stop immediately. Do NOT retry or switch models.** Send the pricing link: https://flowith.io/pricing | - Network accessline 14
|---|---|---| | `NO_CREDITS` | Account has no remaining credits (HTTP 402 / node type 22) | **Stop immediately. Do NOT retry or switch models.** Send the pricing link: https://flowith.io/pricing | | `MODEL_LOCKED` | Model needs a paid plan - Network accessline 15
| `NO_CREDITS` | Account has no remaining credits (HTTP 402 / node type 22) | **Stop immediately. Do NOT retry or switch models.** Send the pricing link: https://flowith.io/pricing |
scripts/__tests__/canvas.test.ts
- Executable scriptline 1
Executable file - Network accessline 56
test("media detection by extension / url", () => { expect(mediaOf("a.PNG")).toBe("image"); expect(mediaOf("https://x/y/clip.mp4?sig=1")).toBe("video"); - Network accessline 57
expect(mediaOf("a.PNG")).toBe("image"); expect(mediaOf("https://x/y/clip.mp4?sig=1")).toBe("video"); expect(mediaOf("voice.wav")).toBe("audio"); - Network accessline 58
expect(mediaOf("https://x/y/clip.mp4?sig=1")).toBe("video"); - Network accessline 59
expect(mediaOf("voice.wav")).toBe("audio"); expect(mediaOf("doc.pdf")).toBe("file"); expect(extOf("https://x/a.b/c.webp#f")).toBe("webp"); - Network accessline 60
expect(mediaOf("doc.pdf")).toBe("file"); expect(extOf("https://x/a.b/c.webp#f")).toBe("webp"); expect(isUrl("http://a")).toBe(true); - Network accessline 61
expect(extOf("https://x/a.b/c.webp#f")).toBe("webp"); - Network accessline 62
expect(isUrl("http://a")).toBe(true);
scripts/__tests__/ergonomics.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
{ id: "a1", p_id: "q1", type: NODE_TYPE.response, data: { value: "X is a thing.", isImage: false } }, { id: "q2", p_id: "a1", type: NODE_TYPE.question, data: { value: "Draw it" } }, { id: "a2", p_id: "q2", type: NODE_TYPE.response, data - Network accessline 19
{ id: "q2", p_id: "a1", type: NODE_TYPE.question, data: { value: "Draw it" } }, { id: "a2", p_id: "q2", type: NODE_TYPE.response, data: { value: "https://r2/x.png", isImage: true } }, { id: "q3", p_id: "a2", type: NODE_TYPE.question, da - Network accessline 20
{ id: "a2", p_id: "q2", type: NODE_TYPE.response, data: { value: "https://r2/x.png", isImage: true } }, - Network accessline 21
{ id: "q3", p_id: "a2", type: NODE_TYPE.question, data: { value: "Animate it" } }, { id: "v3", p_id: "q3", type: NODE_TYPE.video, data: { value: "https://vg/x.mp4" } }, ]; - Network accessline 22
{ id: "v3", p_id: "q3", type: NODE_TYPE.video, data: { value: "https://vg/x.mp4" } }, - Network accessline 27
{ role: "assistant", content: "X is a thing." }, { role: "user", content: "Draw it" }, { role: "assistant", content: "[image: https://r2/x.png]" }, - Network accessline 28
{ role: "user", content: "Draw it" }, { role: "assistant", content: "[image: https://r2/x.png]" }, { role: "user", content: "Animate it" }, - Network accessline 29
{ role: "assistant", content: "[image: https://r2/x.png]" }, - Network accessline 30
{ role: "user", content: "Animate it" }, { role: "assistant", content: "[video: https://vg/x.mp4]" }, ]); - Network accessline 31
{ role: "assistant", content: "[video: https://vg/x.mp4]" }, - Network accessline 110
test("single file vs batch directory naming", () => { expect(outputPathFor("/tmp/x/out.mp4", { nodeId: "abcdef12-x", kind: "video", batch: false })).toBe("/tmp/x/out.mp4"); expect(outputPathFor("/tmp/x/", { nodeId: "abcdef12-x", index: - Network accessline 111
expect(outputPathFor("/tmp/x/out.mp4", { nodeId: "abcdef12-x", kind: "video", batch: false })).toBe("/tmp/x/out.mp4"); expect(outputPathFor("/tmp/x/", { nodeId: "abcdef12-x", index: 0, url: "https://h/a.mp4?s=1", kind: "video", batch: tru - Network accessline 112
expect(outputPathFor("/tmp/x/", { nodeId: "abcdef12-x", index: 0, url: "https://h/a.mp4?s=1", kind: "video", batch: true })).toBe("/tmp/x/01-abcdef12.mp4");
scripts/__tests__/generate.test.ts
- Executable scriptline 1
Executable file - Network accessline 31
const img = (n: string): UploadedMedia => ({ url: `https://r2/${n}.png`, name: `${n}.png`, type: "image/png", media: "image" }); - Network accessline 32
const wav = (n: string): UploadedMedia => ({ url: `https://r2/${n}.wav`, name: `${n}.wav`, type: "audio/wav", media: "audio" }); - Network accessline 33
const mp4 = (n: string): UploadedMedia => ({ url: `https://r2/${n}.mp4`, name: `${n}.mp4`, type: "video/mp4", media: "video" }); - Network accessline 48
expect(r.questionNode.position).toEqual(POS); expect(r.questionNode.data?.value).toBe("a cat"); expect(r.questionNode.data?.fileList[0].url).toBe("https://r2/ref.png"); - Network accessline 49
expect(r.questionNode.data?.value).toBe("a cat"); expect(r.questionNode.data?.fileList[0].url).toBe("https://r2/ref.png"); expect(r.responseNode.type).toBe(NODE_TYPE.response); - Network accessline 50
expect(r.questionNode.data?.fileList[0].url).toBe("https://r2/ref.png"); - Network accessline 68
aspect_ratio: "16:9", image_size: "2k", styleUrls: ["https://r2/ref.png"], - Network accessline 69
image_size: "2k", styleUrls: ["https://r2/ref.png"], }); - Network accessline 70
styleUrls: ["https://r2/ref.png"], - Network accessline 84
test("numbers references per type and appends unmentioned tokens", () => { const r = applySeedanceReferences("dance to audio1", [img("a"), wav("s"), img("b")]); expect(r.urls).toEqual({ image_urls: ["https://r2/a.png", "https://r2/b.png - Network accessline 85
const r = applySeedanceReferences("dance to audio1", [img("a"), wav("s"), img("b")]); expect(r.urls).toEqual({ image_urls: ["https://r2/a.png", "https://r2/b.png"], video_urls: [], audio_urls: ["https://r2/s.wav"] }); expect(r.tokens).t - Network accessline 86
expect(r.urls).toEqual({ image_urls: ["https://r2/a.png", "https://r2/b.png"], video_urls: [], audio_urls: ["https://r2/s.wav"] }); - Network accessline 87
expect(r.tokens).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/s.wav", image2: "https://r2/b.png" }); - Network accessline 90
test("dedupes the same url", () => { const r = applySeedanceReferences("x", [img("a"), img("a")]); expect(r.urls.image_urls).toEqual(["https://r2/a.png"]); - Network accessline 91
const r = applySeedanceReferences("x", [img("a"), img("a")]); expect(r.urls.image_urls).toEqual(["https://r2/a.png"]); }); - Network accessline 92
expect(r.urls.image_urls).toEqual(["https://r2/a.png"]); - Network accessline 135
test("start/end frames → imageURL + keyFrames + typed fileList", () => { const r = buildVideoRequest({ prompt: "p", model: "kling", start: img("s"), end: img("e"), convId: CONV }, kling, POS); expect(r.body.imageURL).toBe("https://r2/s. - Network accessline 136
const r = buildVideoRequest({ prompt: "p", model: "kling", start: img("s"), end: img("e"), convId: CONV }, kling, POS); expect(r.body.imageURL).toBe("https://r2/s.png"); expect(r.body.keyFrames).toEqual(["https://r2/s.png", "https://r2/ - Network accessline 137
expect(r.body.imageURL).toBe("https://r2/s.png"); - Network accessline 138
expect(r.body.keyFrames).toEqual(["https://r2/s.png", "https://r2/e.png"]); - Network accessline 144
test("Seedance refs become image_urls/audio_urls with tokens; frames + refs are exclusive", () => { const r = buildVideoRequest({ prompt: "sing audio1", model: "seedance-2.5", refs: [img("a"), wav("v")], convId: CONV }, seedance, POS); - Network accessline 145
const r = buildVideoRequest({ prompt: "sing audio1", model: "seedance-2.5", refs: [img("a"), wav("v")], convId: CONV }, seedance, POS); expect(r.body.image_urls).toEqual(["https://r2/a.png"]); expect(r.body.audio_urls).toEqual(["https:/ - Network accessline 146
expect(r.body.image_urls).toEqual(["https://r2/a.png"]); - Network accessline 147
expect(r.body.audio_urls).toEqual(["https://r2/v.wav"]); - Network accessline 149
expect(r.body.prompt).toBe("sing audio1 image1"); expect(r.body.imageURL).toBeUndefined(); expect(r.references).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/v.wav" }); - Network accessline 150
expect(r.body.imageURL).toBeUndefined(); expect(r.references).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/v.wav" }); expect(() => buildVideoRequest({ prompt: "p", model: "seedance-2.5", start: img("s"), refs: [img("a")], c - Network accessline 151
expect(r.references).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/v.wav" }); - Network accessline 158
test("non-Seedance models: a single image ref becomes imageURL; audio/video refs rejected", () => { const r = buildVideoRequest({ prompt: "p", model: "kling", refs: [img("a")], convId: CONV }, kling, POS); expect(r.body.imageURL).toBe(" - Network accessline 159
const r = buildVideoRequest({ prompt: "p", model: "kling", refs: [img("a")], convId: CONV }, kling, POS); expect(r.body.imageURL).toBe("https://r2/a.png"); expect(r.body.image_urls).toBeUndefined(); - Network accessline 160
expect(r.body.imageURL).toBe("https://r2/a.png");
scripts/__tests__/models.test.ts
- Executable scriptline 1
Executable file
scripts/index.ts
- Executable scriptline 1
#!/usr/bin/env bun - Network accessline 187
async function detectFlowithUrl(): Promise<string> { if (process.env.FLOWITH_URL) return process.env.FLOWITH_URL; return "https://flowith.io/blank"; - Network accessline 188
if (process.env.FLOWITH_URL) return process.env.FLOWITH_URL; return "https://flowith.io/blank"; } - Network accessline 189
return "https://flowith.io/blank"; - Access to secretsline 269
[Credential-related source omitted] - Network accessline 622
async function validateToken(session: CanvasBotSession): Promise<boolean> { try { const r = await fetch( - Network accessline 623
try { const r = await fetch( `${session.supabaseUrl}/rest/v1/conversation?select=id&limit=1`, - Network accessline 624
const r = await fetch( - Network accessline 751
// Use WebSocket server instead of HTTP for the session handshake. // Note: Safari blocks both fetch() and ws:// to 127.0.0.1 from HTTPS pages (mixed content). - Network accessline 752
// Note: Safari blocks both fetch() and ws:// to 127.0.0.1 from HTTPS pages (mixed content). - Network accessline 806
port: 0, hostname: "127.0.0.1", fetch(req: Request, srv: any) { - Network accessline 807
hostname: "127.0.0.1", fetch(req: Request, srv: any) { if (srv.upgrade(req)) return undefined as any; - Network accessline 808
fetch(req: Request, srv: any) { - Network accessline 2854
code: "NO_CREDITS", message: "It looks like you've run out of credits. Visit /pricing to subscribe and keep creating: https://flowith.io/pricing", - Network accessline 2855
message: "It looks like you've run out of credits. Visit /pricing to subscribe and keep creating: https://flowith.io/pricing", data: data.node, - Network accessline 2856
"It looks like you've run out of credits. Visit /pricing to subscribe and keep creating: https://flowith.io/pricing",
scripts/lib/canvas.ts
- Executable scriptline 1
Executable file
scripts/lib/download.ts
- Executable scriptline 1
Executable file - Network accessline 29
} if (!content.url) throw new CliError("Nothing to save (no url or text).", "INVALID_PARAM"); const resp = await fetch(content.url, { signal: AbortSignal.timeout(300_000) }); - Network accessline 30
if (!content.url) throw new CliError("Nothing to save (no url or text).", "INVALID_PARAM"); const resp = await fetch(content.url, { signal: AbortSignal.timeout(300_000) }); if (!resp.ok) throw new CliError(`Download failed (HTTP ${resp.st - Network accessline 31
const resp = await fetch(content.url, { signal: AbortSignal.timeout(300_000) });
scripts/lib/generate.ts
- Executable scriptline 1
Executable file
scripts/lib/http.ts
- Executable scriptline 1
Executable file - Network accessline 2
* Direct HTTP access to Flowith — the same two backends the web app talks to: * * - the edge worker (`workerURL`, default https://edge.flowith.io): generation, - Network accessline 3
* * - the edge worker (`workerURL`, default https://edge.flowith.io): generation, * uploads, memory, credits. Auth is the raw Supabase access token in the - Network accessline 4
* - the edge worker (`workerURL`, default https://edge.flowith.io): generation, - Network accessline 20
export const DEFAULT_WORKER_URL = "https://edge.flowith.io"; - Network accessline 78
case 402: return new CliError( `${what}: no credits (${detail || "payment required"}). Top up at https://flowith.io/pricing`, - Network accessline 79
return new CliError( `${what}: no credits (${detail || "payment required"}). Top up at https://flowith.io/pricing`, "NO_CREDITS", - Network accessline 80
`${what}: no credits (${detail || "payment required"}). Top up at https://flowith.io/pricing`, - Network accessline 124
...(init.headers ?? {}), }; const resp = await fetch(`${workerUrl(s)}${path}`, { - Network accessline 125
}; const resp = await fetch(`${workerUrl(s)}${path}`, { method: init.method ?? (init.json !== undefined || init.body ? "POST" : "GET"), - Network accessline 126
const resp = await fetch(`${workerUrl(s)}${path}`, { - Network accessline 162
): Promise<T> { const method = init.method ?? (init.json !== undefined ? "POST" : "GET"); const resp = await fetch(`${s.supabaseUrl.replace(/\/$/, "")}/rest/v1/${query}`, { - Network accessline 163
const method = init.method ?? (init.json !== undefined ? "POST" : "GET"); const resp = await fetch(`${s.supabaseUrl.replace(/\/$/, "")}/rest/v1/${query}`, { method, - Network accessline 164
const resp = await fetch(`${s.supabaseUrl.replace(/\/$/, "")}/rest/v1/${query}`, {
scripts/lib/models.ts
- Executable scriptline 1
Executable file - Network accessline 68
} catch {} } const resp = await fetch(`${workerURL.replace(/\/$/, "")}/models?logo=1&desc=1`, { - Network accessline 69
} const resp = await fetch(`${workerURL.replace(/\/$/, "")}/models?logo=1&desc=1`, { signal: AbortSignal.timeout(20_000), - Network accessline 70
const resp = await fetch(`${workerURL.replace(/\/$/, "")}/models?logo=1&desc=1`, {
scripts/lib/session.ts
- Executable scriptline 1
Executable file - Network accessline 80
refreshToken: string; }): Promise<RefreshedTokens> { const resp = await fetch( - Network accessline 81
}): Promise<RefreshedTokens> { const resp = await fetch( `${params.supabaseUrl.replace(/\/$/, "")}/auth/v1/token?grant_type=refresh_token`, - Network accessline 82
const resp = await fetch( - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 117
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted]
scripts/lib/upload.ts
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Signal confidence: 142 facts
- Network access in prose of documentationREADME.md:3Low confidence
- Network access in code of documentationREADME.md:25Low confidence
- Network access in code of documentationREADME.md:26Low confidence
- Network access in prose of documentationREADME.md:48Low confidence
- Network access in prose of documentationREADME.md:49Low confidence
- Network access in prose of the SKILL.mdSKILL.md:43Low confidence
- Network access in prose of the SKILL.mdSKILL.md:45Low confidence
- Network access in prose of documentationreferences/api.md:14Low confidence
- Network access in prose of documentationreferences/api.md:15Low confidence
- Network access in prose of documentationreferences/api.md:16Low confidence
- Network access in code of documentationreferences/api.md:22Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuereferences/api.md:22Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuereferences/api.md:23Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuereferences/api.md:24Low confidence
- Access to secrets in code of documentationreferences/api.md:25Low confidence
- Network access in code of documentationreferences/api.md:31Low confidence
- Network access in code of documentationreferences/api.md:43Low confidence
- Network access in code of documentationreferences/api.md:45Low confidence
- Network access in code of documentationreferences/api.md:57Low confidence
- Network access in code of documentationreferences/api.md:58Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuereferences/api.md:58Low confidence
- Network access in code of documentationreferences/api.md:63Low confidence
- Network access in code of documentationreferences/api.md:64Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuereferences/api.md:64Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valuereferences/api.md:65Low confidence
- Network access in code of documentationreferences/api.md:93Low confidence
- Network access in code of documentationreferences/api.md:99Low confidence
- Network access in code of documentationreferences/api.md:100Low confidence
- Network access in code of documentationreferences/api.md:101Low confidence
- Network access in code of documentationreferences/api.md:123Low confidence
- Network access in code of documentationreferences/api.md:132Low confidence
- Network access in code of documentationreferences/api.md:133Low confidence
- Network access in code of documentationreferences/api.md:134Low confidence
- Network access in code of documentationreferences/api.md:135Low confidence
- Network access in code of documentationreferences/api.md:161Low confidence
- Network access in code of documentationreferences/api.md:183Low confidence
- Network access in prose of documentationreferences/troubleshooting.md:13Low confidence
- Network access in prose of documentationreferences/troubleshooting.md:14Low confidence
- Network access in prose of documentationreferences/troubleshooting.md:15Low confidence
- Executable script in code of a testscripts/__tests__/canvas.test.ts:1Low confidence
- Network access in code of a testscripts/__tests__/canvas.test.ts:56Low confidence
- Network access in code of a testscripts/__tests__/canvas.test.ts:57Low confidence
- Network access in code of a testscripts/__tests__/canvas.test.ts:58Low confidence
- Network access in code of a testscripts/__tests__/canvas.test.ts:59Low confidence
- Network access in code of a testscripts/__tests__/canvas.test.ts:60Low confidence
- Network access in code of a testscripts/__tests__/canvas.test.ts:61Low confidence
- Network access in code of a testscripts/__tests__/canvas.test.ts:62Low confidence
- Executable script in code of a testscripts/__tests__/ergonomics.test.ts:1Low confidence
- Network access in code of a testscripts/__tests__/ergonomics.test.ts:18Low confidence
- Network access in code of a testscripts/__tests__/ergonomics.test.ts:19Low confidence
and 92 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.