ccc-learn · diff

git:20260722.9d3ab82 to git:20261013.fbe187d

117 added, 106 removed. Audit A to A.

---
name: ccc-learn
- description: "CC Commander learning hub — click-first picker across 11 CCC domains (502+ skills). Routes to ccc-design, ccc-marketing, ccc-saas and 8 more domain routers. Use when…"
+ description: "Pick a CC Commander skill domain in one click (design, marketing, SaaS, DevOps, SEO, testing, security, data and more) and hand off to that domain's router skill. Use when the user asks what skills exist, wants the skill catalog, says learn or browse domains, or types $ccc-learn."
allowed-tools:
- Read
- - Write
- - Edit
- Bash
- - Glob
- - Grep
- - Agent
+ - Skill
- AskUserQuestion
- argument-hint: "[domain: design | marketing | saas | devops | seo | testing | security | data | research | mobile | makeover | all]"
+ argument-hint: "[design | marketing | saas | devops | seo | testing | security | data | research | mobile | makeover | all]"
+ model: sonnet
+ effort: low
---
- # $ccc-learn — Discover skills across domains
+ # $ccc-learn — one click to a domain
- Click-first browser over CCC's 11 domain routers. User picks a domain in one click — we load its domain-router skill and hand off. No text menus, no grep-through-502-skills.
+ **CC Commander** · $ccc-learn · a domain picker that loads the matching router skill, which shows its own sub-picker.
- ## Response shape (EVERY time)
+ ## When to use / when not to
- ### 1. Brand header (one line)
+ - Use when the user wants to discover what Commander can do in an area, or names a domain without a specific task.
+ - When the intent already maps to one domain ("set up auth"), invoke that router directly (`ccc-saas`) instead of showing the picker.
+ - Use `$ccc-browse` for the full searchable catalog; this skill never lists every skill.
+ ## What happens
+
+ ### 1. Check the argument first
+
+ If the skill argument names a domain, skip every picker and invoke the router with the Skill tool:
+
+ | Argument | Router skill |
+ |---|---|
+ | `design` | `ccc-design` |
+ | `marketing` | `ccc-marketing` |
+ | `saas` | `ccc-saas` |
+ | `devops` | `ccc-devops` |
+ | `seo` | `ccc-seo` |
+ | `testing` | `ccc-testing` |
+ | `security` | `ccc-security` |
+ | `data` | `ccc-data` |
+ | `research` | `ccc-research` |
+ | `mobile` | `ccc-mobile` |
+ | `makeover` | `ccc-makeover` |
+ | `all` | `ccc-browse` |
+
+ An unrecognized argument: say which domains exist (the argument column) and continue to step 2.
+
+ ### 2. Header and context strip
+
+ Print:
+
```
- **CC Commander · Learn** · 502+ skills · 11 domains · [catalog](https://commanderplugin.com/skills)
+ **CC Commander · Learn** · domain routers · [catalog](https://commanderplugin.com/skills)
```
- ### 2. Context strip (one line)
+ Gather context in one Bash call, silent on failure:
- Run a single parallel Bash probe (silent on failure):
- - `ls ~/.claude/skills/ 2>/dev/null | wc -l` — locally installed skill count
- - `test -f CLAUDE.md && head -2 CLAUDE.md | tail -1` — project name hint
- - `git rev-parse --abbrev-ref HEAD 2>/dev/null` — branch
+ ```bash
+ ls ~/.claude/skills/ 2>/dev/null | wc -l
+ test -f CLAUDE.md && head -2 CLAUDE.md | tail -1
+ git rev-parse --abbrev-ref HEAD 2>/dev/null
+ ls -d src/components docs 2>/dev/null
+ ls tailwind.config.* 2>/dev/null
+ grep -oE '"(stripe|next-auth|@supabase/supabase-js|supabase)"' package.json 2>/dev/null | sort -u
+ ```
- Render:
- > 📚 <N> skills installed locally · project `<name or cwd>` · branch `<name>`
+ Render one line: `📊 <N> user skills installed · project <name or cwd> · branch <name>`. With zero user skills: `📊 No user skills installed — routers load their skills on demand.`
- If nothing installed: "📚 No CCC skills installed yet — pick a domain, I'll fetch on demand."
+ ### 3. Choose the recommendation
- ### 3. The picker — `AskUserQuestion` with 4 options
+ From the probe, mark exactly one root option 🟢 and list it first:
- Read `${CLAUDE_PLUGIN_ROOT}/menus/ccc-learn.json` once. Use its `choices` for labels + descriptions. **Max 4 options** — take the 3 headline domains + "More domains…".
+ - `package.json` names `stripe`, `next-auth` or Supabase → SaaS
+ - `src/components` exists and a Tailwind config exists → Design
+ - no `src/`, but `docs/` or marketing-style files exist → Marketing
+ - nothing to go on → Design
+ ### 4. Ask the root picker
+
+ Read `${CLAUDE_PLUGIN_ROOT}/menus/ccc-learn.json` once and use its `description` for the design, marketing and saas entries; if the file is missing, use the descriptions below. Ask the root picker (Decision points). Then dispatch:
+
+ - Design → Skill `ccc-design`; Marketing → Skill `ccc-marketing`; SaaS → Skill `ccc-saas`.
+ - More domains → ask the second picker. Do not end the flow.
+
+ ### 5. Second and third pickers
+
+ - Second picker: DevOps → `ccc-devops`; SEO → `ccc-seo`; Testing → `ccc-testing`; Even more → third picker.
+ - Third picker: Security → `ccc-security`; Data → `ccc-data`; Browse all → `ccc-browse`; Back → `ccc`.
+ - Research, Mobile and Makeover are reachable by argument (step 1) or when the user names them; route those directly.
+
+ ### 6. Hand off
+
+ Invoke the chosen router with the Skill tool and stop. The router owns everything after that, including its own picker.
+
+ ## Decision points
+
+ Root picker (reorder so the 🟢 option from step 3 is first):
+
```
question: "Which domain?"
header: "CC Commander · Learn"
multiSelect: false
options:
- - label: "🎨 Design (39 skills)"
- description: "UI/UX, animation, responsive, a11y, Impeccable polish suite."
- preview: "Routes to ccc-design. Pick landing / components / polish / figma next."
- - label: "📣 Marketing (45 skills)"
- description: "CRO, email, ads, social, content — 7 specialist pods."
- preview: "Routes to ccc-marketing. Pick campaign / SEO / Product Hunt / influencer next."
- - label: "💼 SaaS (21 skills)"
- description: "Auth, billing, multi-tenant, schema, zero-to-revenue."
- preview: "Routes to ccc-saas. Pick auth / billing / schema / API next."
- - label: "⋯ More domains…"
- description: "DevOps, SEO, Testing, Security, Data, Research, Mobile, Makeover."
- preview: "8 more router skills — click to expand."
+ - label: "🟢 🎨 Design"
+ description: "UI/UX, animation, responsive, a11y, polish. Opens ccc-design's picker next."
+ - label: "Marketing"
+ description: "CRO, email, ads, social, content. Opens ccc-marketing's picker next."
+ - label: "SaaS"
+ description: "Auth, billing, multi-tenant, schema, zero-to-revenue. Opens ccc-saas's picker next."
+ - label: "More domains"
+ description: "DevOps, SEO, testing, security, data, and browse-all."
```
- **Recommendation logic** (prepend ⭐ to ONE option):
- - No `src/` but project has `docs/` or marketing-ish files → ⭐ Marketing
- - `package.json` has `stripe` / `next-auth` / `supabase` → ⭐ SaaS
- - `src/components` populated + Tailwind config → ⭐ Design
- - Nothing to go on → ⭐ Design (safe default)
-
- Also offer "Browse all 502+" as a small footer note under the picker — see handling below.
-
- ### 4. Handle the selection
-
- Dispatch immediately:
-
- - **Design** → invoke `ccc-design` skill. That skill surfaces its own picker (landing / components / polish / figma).
- - **Marketing** → invoke `ccc-marketing` skill. Surfaces its sub-picker.
- - **SaaS** → invoke `ccc-saas` skill. Surfaces its sub-picker.
- - **More domains…** → cascade to the **second AUQ** below. Do NOT exit the flow.
-
- ### 5. Second AUQ (only if "More domains…" picked)
+ Second picker:
```
- question: "Which of the remaining 8?"
+ question: "Which domain?"
header: "CC Commander · Learn · More"
multiSelect: false
options:
- - label: "🛠️ DevOps (21 skills)"
- description: "CI/CD, Docker, AWS, monitoring, IaC, runbooks."
- preview: "Routes to ccc-devops."
- - label: "🔍 SEO (20 skills)"
- description: "Technical SEO, AI search, content strategy, Core Web Vitals."
- preview: "Routes to ccc-seo."
- - label: "🧪 Testing (15 skills)"
- description: "TDD, E2E, verification, QA, regression, visual testing."
- preview: "Routes to ccc-testing."
- - label: "⋯ Even more…"
- description: "Security, Data, Research, Mobile, Makeover + browse-all."
- preview: "5 more — click to cascade."
+ - label: "🟢 DevOps"
+ description: "CI/CD, Docker, cloud, monitoring, IaC, runbooks. Opens ccc-devops."
+ - label: "🌐 SEO"
+ description: "Technical SEO, AI search, content strategy, Core Web Vitals. Opens ccc-seo."
+ - label: "🧪 Testing"
+ description: "TDD, E2E, verification, QA, regression, visual tests. Opens ccc-testing."
+ - label: "Even more"
+ description: "Security, data, browse-all, or back to the main menu."
```
- ### 6. Third AUQ (only if "Even more…" picked)
+ Third picker:
```
- question: "Last page."
+ question: "Which one?"
header: "CC Commander · Learn · Advanced"
multiSelect: false
options:
- - label: "🔐 Security (8 skills)"
- description: "Audits, prompt injection defense, OWASP, incident response."
- preview: "Routes to ccc-security."
- - label: "📊 Data (8 skills)"
- description: "Pipelines, SQL, visualization, ML, quality, vector search."
- preview: "Routes to ccc-data."
- - label: "🔎 Browse all (502+)"
- description: "Searchable grid of every installed skill + command."
- preview: "Routes to ccc-browse."
- - label: "↩️ Back to /ccc"
+ - label: "🟢 🔐 Security"
+ description: "Audits, prompt-injection defense, OWASP, incident response. Opens ccc-security."
+ - label: "📊 Data"
+ description: "Pipelines, SQL, visualization, ML, data quality, vector search. Opens ccc-data."
+ - label: "Browse all"
+ description: "Searchable catalog of every skill and command. Opens ccc-browse."
+ - label: "Back to /ccc"
description: "Return to the main menu."
- preview: "Invokes ccc skill."
```
- **Remaining domain routers** not surfaced in AUQ but available by argument:
- - `ccc-research` (8 skills) — `$ccc-learn research`
- - `ccc-mobile` (8 skills) — `$ccc-learn mobile`
- - `ccc-makeover` (3 skills) — `$ccc-learn makeover`
-
- These tail-end domains are thin. If a user explicitly asks about them, route directly.
-
- ### 7. Argument handling
-
- If the user passed an argument (`$ccc-learn marketing`), skip all AUQs and invoke the matching domain router immediately. Accept: `design` / `marketing` / `saas` / `devops` / `seo` / `testing` / `security` / `data` / `research` / `mobile` / `makeover` / `all` (→ `ccc-browse`).
-
- ## Anti-patterns — DO NOT
-
- - ❌ Render all 11 domains in one AUQ (max 4 per call)
- - ❌ Dump the 502-skill list inline — that's ccc-browse's job
- - ❌ Skip the cascade — users need the "More → Even more" flow for the long tail
- - ❌ Show a numbered text list and ask them to type a number
- - ❌ Forget to check the argument — `$ccc-learn marketing` must skip the root picker
-
- ## When to invoke this skill
+ ## Done when
- - user: what does this do? show me the skill catalog
- - assistant: Loads ccc-learn, renders the 4-option picker. User picks Design → routes to ccc-design.
+ - Exactly one router skill (or `ccc-browse` / `ccc`) was invoked with the Skill tool, and its picker or output followed.
+ - No picker showed more than 4 options, and no skill list was printed inline.
- - user: I need to set up authentication
- - assistant: Loads ccc-learn (or goes straight to ccc-saas if intent is clear). Picks SaaS → ccc-saas auth path.
+ ## Guardrails
- - user: what's in the marketing domain?
- - assistant: Loads ccc-learn with `marketing` argument, skips root picker, dispatches to ccc-marketing directly.
+ - Never render all domains in one picker, and never ask the user to type a number or letter from a text list.
+ - Never dump the skill catalog inline; that is `$ccc-browse`'s job.
+ - Never ignore the argument: `$ccc-learn marketing` goes straight to `ccc-marketing`.
+ - Never print skill counts or versions as literals; routers report their own contents.
+ - Codex: ask each picker as a plain-text question with the same options, then open the chosen router skill by name.
- ---
+ ## See also
- **Bottom line:** one click picks a domain, the domain router takes it from there. Cascade for the long tail. Never dump 502 skills on the user.
+ - `$ccc-browse` — full catalog with search and launch
+ - `$ccc-domains` — alias for this picker
+ - `/ccc` — main menu
+ - `$ccc-knowledge` — lessons from past work
---
> ⚙️ **Fable contract:** plan before build · verifier ≠ worker · prove before alarm · loops need gates · leave durable state — `rules/fable-method.md`
> (On Codex, present these options as a numbered list and ask the user to reply with a number — AskUserQuestion is Claude-only.)