submit-use-case

$npx mdskill add sonichi/sutando/submit-use-case

Submit 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

SkillDescription
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.