submit-use-case
$
npx mdskill add sonichi/sutando/submit-use-caseSubmit a Sutando use case to the community via GitHub issue and PR
- Shares external Sutando use cases with the public community
- Uses GitHub API and CLA validation for PR submission
- Checks titles for outcome-framed language consistency
- Creates labeled issues and markdown files for community use cases
SKILL.md
.github/skills/submit-use-caseView on GitHub ↗
---
name: submit-use-case
description: "OSS-facing channel to share a Sutando use case with the community. Opens a labeled GitHub issue on sonichi/sutando and (CLA-gated) a PR adding community-use-cases/<slug>.md. Validates outcome-framed titles with the same checker as add-use-case. Default: both; flags --issue-only / --pr-only opt out."
user-invocable: true
---
# submit-use-case
OSS counterpart to `add-use-case`. `add-use-case` targets the private
`AG2Platform/agent-universe` repo (rendered on sutando.ai) and is for the
internal fleet. `submit-use-case` targets the public `sonichi/sutando` repo
so external contributors can share a use case without needing access to the
private rendering repo.
## Usage
```bash
python3 "$SKILL_DIR/scripts/submit_use_case.py" \
--title "Your AI plays piano while you sleep" \
--summary "Outcome-first summary that appears on tile + detail page." \
--bullets "bullet1" --bullets "bullet2" \
[--video /abs/path/to/clip.mp4] \
[--media-url https://example.com/clip.jpg] \
[--youtube-id ABCDEFG1234] \
[--x-url https://x.com/...] \
[--linkedin-url https://www.linkedin.com/...] \
[--contact "you@example.com or @yourhandle"] \
[--issue-only | --pr-only] \
[--dry-run]
```
`--dry-run` runs the framing check and prints both the rendered issue body
and the rendered `community-use-cases/<slug>.md` file to stdout. No clone, no
gh calls.
## What the skill does
1. **Validate title is outcome-framed.** Reuses `REJECT_PATTERNS` + `validate_title` +
`suggest_reframes` from `add-use-case` verbatim. Capability-listy titles
("Ask your AI to ...", "Sutando can ...", "Send a ...") are rejected with
deterministic reframe suggestions. Same rules, same voice.
2. **Derive slug.** `slugify(title)` — lowercased, non-alphanum→`-`, trimmed to 60 chars.
3. **Idempotency checks** (skipped in `--dry-run`):
- Does a branch `community-use-case/<slug>` already exist on `sonichi/sutando`?
If yes, abort with a pointer to the existing PR.
- Is there an open issue on `sonichi/sutando` with the same `title`? If yes,
abort with the existing issue URL.
4. **Open an issue** (unless `--pr-only`). `gh issue create --repo sonichi/sutando`
with label `use-case-submission`. Body has structured sections: Title,
Summary, Bullets, Links (video / youtube / x / linkedin), Contact, and a
forward-ref to the PR if one is opened in the same invocation.
5. **Open a PR** (unless `--issue-only`).
- Fresh clone: `gh repo clone sonichi/sutando /tmp/sutando-submit-use-case-{ts}/`
- Branch: `community-use-case/<slug>` from `main`
- File: `community-use-cases/<slug>.md` — YAML frontmatter mirroring the
agent-universe `UseCase` shape so the sync script can later promote it.
- Identity: **only** set repo-local `user.email` / `user.name` to
`4250911+sonichi@users.noreply.github.com` / `Chi Wang` when the runner
is on Chi's fleet (detected via `/Users/wangchi/.sutando/workspace/`
existing OR env `SUTANDO_FLEET_OWNER=chi`). For OSS submitters the
script leaves git config alone so their own identity flows through —
that's the whole point of CLA-Assistant signing.
- Commit, push, `gh pr create`. PR body cross-links the issue if one was opened.
6. **Return** both URLs to stdout (issue URL, then PR URL, last two lines).
## File schema (`community-use-cases/<slug>.md`)
```yaml
---
slug: <derived>
title: <user title>
summary: <user summary>
videoUrl: <if --video> # absolute or hosted; raw path uploaded to issue, not PR
youtubeId: <if --youtube-id>
xUrl: <if --x-url>
linkedinUrl: <if --linkedin-url>
thumbnail: /use-cases/<slug>.jpg
contact: <if --contact>
submitted_at: <ISO UTC timestamp>
---
<longDescription stitched from --bullets, or summary if no bullets>
```
The frontmatter intentionally mirrors `AG2Platform/agent-universe`'s
`lib/use-cases.ts` `UseCase` TypeScript type so a later sync script can read
this YAML and emit the literal entry the rendering repo expects. The
submitter is **not** asked to upload the thumbnail in the PR — it stays as a
pending path that the maintainer fills in when promoting.
## Issue label
`use-case-submission` (the maintainer monitors this label to triage incoming
community submissions).
## Idempotency
- Branch name `community-use-case/<slug>` is checked on `origin` before pushing.
- Existing issue with the same `title` (case-insensitive, open state) aborts.
- `--dry-run` skips all remote checks and only prints rendered output.
## Why we don't auto-set git identity for OSS submitters
CLA-Assistant signs the contributor under the email of the commit author.
For OSS contributors that MUST be their own email — that's the whole point
of the CLA channel. If we overwrote it with Chi's `noreply` address, every
external PR would be wrongly attributed and the CLA would be signed under
the wrong identity. The Chi-fleet override exists only so the same script
works for internal demo submissions without an extra step.
## Dependencies
- `git`, `gh` (authenticated to GitHub as the submitter)
- Python ≥ 3.9 (stdlib only — no third-party libs)
More from sonichi/sutando
- agent-registryLocal Agent Registry — a standalone, dependency-free service that tracks running Claude Code (and other) agent instances. Agents self-register on startup and heartbeat while alive; the Electron overlay and Sutando dashboard read the live list. Use when you need to know which coding agents are running, where, and since when.
- bot2bot-postPost a coordination message from this bot to the shared bot2bot channel, @-mentioning the other Sutando node.
- claude-codexBash wrapper around the local Codex CLI for non-interactive runs from inside Sutando (bridges, cron, scripts). For interactive code review or task hand-off from this Claude Code session, prefer the official `/codex:*` plugin commands; this skill is the file-bridge-compatible path that `discord-bridge.py` invokes for team-tier sandboxed delegation.
- claude-geminiUse the local Gemini CLI from Claude Code with the user's existing Gemini authentication or API configuration. Use for large-context repo scans, multimodal analysis, second-opinion planning, or structured Gemini runs in the current workspace.
- claude-routerChoose between the local Codex CLI and Gemini CLI from Claude Code. Use for automatic model selection when the user wants the best local delegate for code review, repo-wide analysis, planning, or implementation.
- cross-node-syncRsync-over-ssh sync between Sutando nodes (Mac Studio and MacBook) for shared memory + notes. Optional — core runs fine without it; enables automatic cross-bot learning and note propagation by running from the proactive-loop cron on each pass.
- deal-finderScan configured sources (Craigslist now; eBay + Facebook Marketplace planned) for used-item listings matching the owner's criteria. Currently configured for a Mac mini search (M2+, 16GB+, 512GB+, ≤$500, near 94566). Notify owner via SMS + Telegram on a match.
- electron-overlay-dimmingReusable pattern for focus-based auto-dimming of Electron overlay windows — when the app loses focus, all overlay windows fade to a low opacity; when an overlay regains focus, they return to their configured opacity. Use when building always-on-top Electron overlays that should recede while the user works in other apps.
- gemini-ttsRender text to mp3 via Google Gemini Flash TTS. Free-tier eligible (1500 req/day). Use for video narration, demo voiceovers, audio notes. Parallels openai-tts; default for make-viral-video.
- macos-toolsmacOS native integrations: screen capture, calendar, reminders, contacts, email (Mail.app), Spotlight search. Use when the user asks about their screen, schedule, to-do list, contacts, or wants to send email on macOS.