本文へ移動
cccskills
無料GitHub で公開

skillshare-cli-e2e-test

Run isolated E2E tests in devcontainer from ai_docs/tests runbooks. Use this skill whenever the user asks to: run an E2E test, execute a test runbook, validate a feature end-to-end, create a new runbook, or test CLI behavior in isolation. If you need to run a multi-step CLI validation sequence (init → install → sync → verify), this is the skill — it handles ssenv isolation, flag verification, and structured reporting. Prefer this over ad-hoc docker exec sequences for any test that follows a runbook or needs reproducible isolation.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md18.2 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Run isolated E2E tests in devcontainer. $ARGUMENTS specifies runbook name or "new".

Before acting, run python3 scripts/ai-context.py testing. The topic is the source of truth for isolation, runbook quality and reporting rules; this skill retains the execution flow and mdproof recipes.

Flow

Phase 0: Environment Check

  1. Confirm devcontainer is running and get container ID:

    CONTAINER=$(docker compose -f .devcontainer/docker-compose.yml ps -q skillshare-devcontainer)
    
    • If empty → prompt user: docker compose -f .devcontainer/docker-compose.yml up -d
    • Ensure CONTAINER is set for all subsequent docker exec calls.
  2. Confirm Linux binary is available:

    docker exec $CONTAINER bash -c \
      '/workspace/.devcontainer/ensure-skillshare-linux-binary.sh && ss version'
    
  3. Confirm mdproof is installed:

    docker exec $CONTAINER /workspace/.devcontainer/ensure-mdproof.sh
    

    This auto-installs from GitHub release, or falls back to /workspace/bin/mdproof (local dev binary).

  4. Check for lessons learned from previous runs:

    test -f /workspace/.mdproof/lessons-learned.md && cat /workspace/.mdproof/lessons-learned.md
    

    If the file exists, read it before writing or debugging runbooks — it contains known gotchas and assertion patterns.

Phase 1: Detect Scope

  1. Preview all available runbooks via the container:

    docker exec $CONTAINER mdproof --dry-run --report json /workspace/ai_docs/tests/
    

    This returns JSON with every runbook's steps, commands, and expected assertions — no manual markdown parsing needed. Use this to understand what each runbook covers.

  2. Identify recent changes (unstaged + recent commits):

    git diff --name-only HEAD~3
    
  3. Match changes to relevant runbooks (compare changed file paths against step commands in the JSON output).

Phase 2: Select Tests

Prompt user (via AskUserQuestion):

  • Option A: Run existing runbook (list all available + mark those related to recent changes)
  • Option B: Auto-generate new test script based on recent changes
  • Option C: If $ARGUMENTS specifies a runbook, skip to Phase 3

Phase 3: Prepare & Execute

Running existing runbook:

  1. Create isolated environment with auto-initialization:

    ENV_NAME="e2e-$(date +%Y%m%d-%H%M%S)"
    
    # Use --init to automatically run 'ss init -g' with all targets
    docker exec $CONTAINER ssenv create "$ENV_NAME" --init
    
  2. Execute the entire runbook via mdproof inside the container:

    docker exec $CONTAINER env SKILLSHARE_DEV_ALLOW_WORKSPACE_PROJECT=1 \
      ssenv enter "$ENV_NAME" -- \
      mdproof --report json \
      /workspace/ai_docs/tests/<runbook_file>.md
    

    mdproof executes each step (bash -c <command>) in the ssenv-isolated HOME, then returns structured JSON:

    {
      "version": "1",
      "runbook": "<runbook_file>.md",
      "duration_ms": 12345,
      "summary": { "total": 7, "passed": 5, "failed": 1, "skipped": 1 },
      "steps": [
        {
          "step": { "number": 1, "title": "...", "command": "...", "expected": ["..."] },
          "status": "passed",    // "passed" | "failed" | "skipped"
          "exit_code": 0,
          "stdout": "...",
          "stderr": "..."
        }
      ]
    }
    
  3. Analyze the JSON output:

    • All passed → proceed to Phase 4
    • Any failed → filter for failures only (full JSON can be too large for terminal output):
      mdproof --report json runbook.md 2>&1 | jq '{
        summary: .summary,
        failed: [.steps[] | select(.status == "failed") | {
          step: .step.number, title: .step.title,
          exit_code: .exit_code,
          failed_assertions: [.assertions[]? | select(.matched == false) | .pattern],
          stderr: (.stderr // "" | .[0:200])
        }]
      }'
      
    • Skipped steps (executor=manual) → these need manual verification, run them individually:
      docker exec $CONTAINER env SKILLSHARE_DEV_ALLOW_WORKSPACE_PROJECT=1 \
        ssenv enter "$ENV_NAME" -- <command from step.command>
      
  4. For failed steps, debug individually using manual docker exec (same as before):

    docker exec $CONTAINER env SKILLSHARE_DEV_ALLOW_WORKSPACE_PROJECT=1 \
      ssenv enter "$ENV_NAME" -- bash -c '<failed step command>'
    
    • Prefer --json + jq for assertions — see the JSON Reference below

Generating new runbook:

  1. Read git diff HEAD~3 to find changed files in cmd/skillshare/ or internal/
  2. Read changed files to understand new/modified functionality
  3. Validate all CLI flags before writing — for every ss <command> <flag> in the runbook:
    • Grep cmd/skillshare/<command>.go for the exact flag string (e.g. "--force")
    • Run ss <command> --help inside container if needed
    • Common mistakes to avoid:
      • uninstall --yes → wrong, use --force / -f
      • init --target <name> → wrong, init has no --target flag
      • init -p has a completely separate flag set from global init — only supports --targets, --discover, --select, --mode, --dry-run. Global-only flags like --no-copy, --no-skill, --no-git, --all-targets, --force do NOT exist in project mode
      • Audit custom rules: disable by rule ID (e.g. prompt-injection-0, prompt-injection-1), NOT pattern name (e.g. prompt-injection). Rule IDs are in internal/audit/rules.yaml
  4. Generate new runbook to ai_docs/tests/<slug>_runbook.md, following existing conventions:
    • YAML-free, pure Markdown
    • Has Scope, Environment, Steps (each with bash + Expected), Pass Criteria
    • Use jq: assertions in Expected blocks for JSON commands — e.g. - jq: .extras | length == 1. This is a native mdproof assertion type, NOT a bash jq pipe
    • Use --json + jq -e in bash for inline verification within multi-command steps
    • Config idempotency — never bare cat >> config.yaml; always prepend sed -i '/^section:/,$d' to remove existing section first, or use CLI commands (ss extras init, ss extras remove --force) that handle duplicates
    • Check ai_docs/tests/mdproof.json for project-level config (build, setup, teardown, step_setup, timeout) that affects all runbooks
    • Check .mdproof/lessons-learned.md for known assertion patterns and gotchas
  5. Run the runbook quality checklist (see below) before executing
  6. Then execute the new runbook (same flow as above)

Phase 4: Cleanup & Report

  1. Ask user before cleanup (via AskUserQuestion):

    • Option A: Delete ssenv environment now
    • Option B: Keep for manual debugging (print env name for later ssenv delete)
  2. If user chose Option A:

    docker exec $CONTAINER ssenv delete "$ENV_NAME" --force
    
  3. Output summary (derived from the runbook JSON output):

    ── E2E Test Report ──
    
    Runbook:  {runbook name}
    Env:      {ENV_NAME}
    Duration: {duration_ms}ms
    
    Step 1: {title}  PASS
    Step 2: {title}  PASS
    Step 3: {title}  FAIL ← exit_code={N}, stderr: {error detail}
    ...
    
    Result: {passed}/{total} passed ({skipped} skipped)
    

    All values come directly from mdproof's JSON output — summary.passed, summary.total, steps[].step.title, steps[].status.

  4. If any FAIL → distinguish between runbook bug vs real bug:

    • Runbook bug: wrong flag, wrong file path, stale assertion → fix runbook, re-run step
    • Real bug: CLI misbehavior → analyze cause, provide fix suggestions
  5. Retrospective — ask user (via AskUserQuestion):

    Did you encounter any friction during this test run that the skill or runbook could handle better?

    • Option A: Yes, improve e2e skill — review test friction (wrong flags, stale assertions, missing checklist items, unclear instructions), then update SKILL.md and/or runbooks
    • Option B: Yes, but only fix the runbook — fix the specific runbook without changing the skill itself
    • Option C: No, skip

    Improvement targets:

    • SKILL.md: add new checklist items, common-mistake examples, or rule clarifications learned from this run
    • Runbooks: fix stale assertions (e.g. config.yaml → registry.yaml), wrong flags, outdated paths
    • Both: when a systemic issue (e.g. a refactor changed file locations) affects both the skill's guidance and existing runbooks

Runbook Quality Checklist

Before executing a newly generated runbook, verify:

  • All CLI flags exist — every ss <cmd> --flag was grep-verified against source
  • --init interaction — if runbook has ss init, account for ssenv create --init already initializing (add --force to re-init, or skip init step)
  • --init creates default extras — ssenv create --init creates a rules extra by default. Runbooks that assume an empty extras list must add cleanup first: ss extras remove rules --force -g 2>/dev/null || true + rm -rf ~/.claude/rules
  • Correct confirmation flags — uninstall uses --force (not --yes); init re-run needs no flag (just fails gracefully)
  • Skill data in registry.yaml — assertions about installed skills check registry.yaml, NOT config.yaml; config.yaml should never contain skills:
  • File existence timing — registry.yaml is only created after first install/reconcile, not on ss init
  • Project mode paths — project commands use .skillshare/ not ~/.config/skillshare/
  • Project init flags — init -p only supports --targets, --discover, --select, --mode, --dry-run; global-only flags (--no-copy, --no-skill, --no-git, --all-targets, --force) are not available
  • Audit rule IDs — custom rules in audit-rules.yaml use rule IDs (e.g. prompt-injection-0), not pattern names (e.g. prompt-injection). Verify IDs against internal/audit/rules.yaml
  • Use --json for assertions — if the command supports --json, use it with jq instead of grepping human-readable output. Text output changes between versions; JSON structure is stable
  • Expected = actual substrings, NOT descriptions — the runbook assertion engine does case-insensitive substring matching. Write - Installed or - cangjie-docs-navigator, NOT - Install completes without error or - Output contains at least one skill. Negation: use Not <substring> prefix (e.g. - Not cangjie-docs-navigator)
  • Skill name ≠ repo name — after ss install <repo>, the actual skill name may differ from the repo name (e.g. repo cangjie-docs-mcp → skill cangjie-docs-navigator). Always verify the installed skill name via ss list before writing uninstall/check steps
  • /tmp/ cleanup — ssenv only isolates $HOME; /tmp/ is shared across runs. Any step using /tmp/<path> must start with rm -rf /tmp/<path> to avoid stale state from previous runs
  • echo > symlink writes through — echo "content" > path where path is a symlink writes to the symlink's target, it does NOT replace the symlink with a real file. To create a local (non-managed) file at a symlinked path: either use a different filename, or rm the symlink first then echo
  • Extras source path layout — extras use ~/.config/skillshare/extras/<name>/ (not the legacy flat path ~/.config/skillshare/<name>/). Symlink assertions must include extras/ in the path regex (e.g. regex: skillshare/extras/rules/tdd\.md)
  • Prefer jq: over python3 -c — for JSON output validation, use mdproof's native jq: assertion type (e.g. - jq: .extras | length == 1) instead of piping to python3 -c. It's one line vs 10, and mdproof handles failure reporting automatically
  • Config idempotency — re-runs must not duplicate YAML sections: use CLI commands (ss extras init, ss extras remove --force), or prepend sed -i '/^section_key:/,$d' before any cat >>
  • Check lessons-learned — read .mdproof/lessons-learned.md before writing new runbooks for known gotchas and proven assertion patterns

Runbook Assertion Types

mdproof supports 6 assertion types under Expected: blocks. Use the most specific type for each check:

TypeSyntaxWhen to useExample
Substringplain textSimple output check- hello world
NegatedNot/Should NOT prefixVerify absence- Not FAIL
Exit codeexit_code: NEvery step should have this- exit_code: 0
Regexregex: prefixPattern matching- regex: v\d+\.\d+
jqjq: prefixJSON output (preferred)- jq: .extras | length == 1
Snapshotsnapshot: prefixStable output comparison- snapshot: api-response

jq: best practices:

# Simple field check
- jq: .name == "rules"

# Array length
- jq: .extras | length == 3

# Sorted array comparison
- jq: [.extras[].name] | sort | . == ["a","b","c"]

# Null/missing field (omitempty)
- jq: .extras == null

# Nested access
- jq: .[0].targets[0].status == "synced"

# Boolean
- jq: .source_exists == true

Rules

Apply the testing topic. Keep detailed assertion recipes in this workflow consistent with that topic and .mdproof/lessons-learned.md.

ssenv Quick Reference

CommandPurpose
sshelpShow shortcuts and usage
sslsList isolated environments
ssnew <name>Create + enter isolated shell (interactive)
ssuse <name>Enter existing isolated shell (interactive)
ssbackLeave isolated context
ssenv enter <name> -- <cmd>Run single command in isolation (automation)
  • For interactive debugging: ssnew <env> then exit when done
  • For deterministic automation: prefer ssenv enter <env> -- <command> one-liners

Test Command Policy

When running Go tests inside devcontainer (not via runbook):

# ssenv changes HOME, so always cd to /workspace first for Go test commands
cd /workspace
go build -o bin/skillshare ./cmd/skillshare
SKILLSHARE_TEST_BINARY="$PWD/bin/skillshare" go test ./tests/integration -count=1
go test ./...

Always run in devcontainer unless there is a documented exception. Note: ssenv enter changes HOME, which may affect Go module resolution — always cd /workspace before running go test or go build.

--json Quick Reference

Most commands support --json for structured output, making assertions more reliable than text matching.

Command--jsonNotes
ss status--jsonSkills, targets, sync status
ss list--json / -jAll skills with metadata
ss target list--jsonConfigured targets
ss install <src>--jsonImplies --force --all (skip prompts)
ss uninstall <name>--jsonImplies --force (skip prompts)
ss collect <path>--jsonImplies --force (skip prompts)
ss check--jsonUpdate availability per repo
ss update--jsonUpdate results per skill
ss diff--jsonPer-file diff details
ss sync--jsonSync stats per target
ss audit--format jsonAlso accepts --json (deprecated alias)
ss log--jsonRaw JSONL (one object per line)

Key behaviors:

  • --json that implies --force / --all skips interactive prompts — safe for automation
  • Output goes to stdout only (progress/spinners suppressed)
  • audit prefers --format json; --json still works but is the deprecated form
  • log --json outputs JSONL (newline-delimited), not a JSON array

Assertion Patterns with jq

# Count installed skills
ss list --json | jq 'length'

# Check a specific skill exists
ss list --json | jq -e '.[] | select(.name == "my-skill")'

# Verify target is configured
ss target list --json | jq -e '.[] | select(.name == "claude")'

# Assert no critical audit findings
ss audit --format json | jq -e '.summary.critical == 0'

# Check update availability
ss check --json | jq -e '.tracked_repos | length > 0'

# Verify sync succeeded (zero errors)
ss sync --json | jq -e '.errors == 0'

# Install and verify result
ss install https://github.com/user/repo --json | jq -e '.skills | length > 0'

When a jq -e expression fails (exit code 1 = false, 5 = no output), the step FAILs — no ambiguous text matching needed.

Container Command Templates

# Single command
docker exec $CONTAINER ssenv enter "$ENV_NAME" -- ss status

# JSON assertion (preferred for verification)
docker exec $CONTAINER ssenv enter "$ENV_NAME" -- bash -c '
  ss list --json | jq -e ".[] | select(.name == \"my-skill\")"
'

# Multi-line compound command (use bash -c) — global mode flags
docker exec $CONTAINER ssenv enter "$ENV_NAME" -- bash -c '
  ss init --no-copy --all-targets --no-git --no-skill
  ss status
'

# Project mode init (different flag set!)
docker exec $CONTAINER env SKILLSHARE_DEV_ALLOW_WORKSPACE_PROJECT=1 \
  ssenv enter "$ENV_NAME" -- bash -c '
  cd /tmp/test-project && ss init -p --targets claude
'

# Check files (HOME is set to isolated path by ssenv)
docker exec $CONTAINER ssenv enter "$ENV_NAME" -- bash -c '
  cat ~/.config/skillshare/config.yaml
'

# With environment variables
docker exec $CONTAINER ssenv enter "$ENV_NAME" -- bash -c '
  TARGET=~/.claude/skills
  ls -la "$TARGET"
'

# Go tests (must cd /workspace because ssenv changes HOME)
docker exec $CONTAINER ssenv enter "$ENV_NAME" -- bash -c '
  cd /workspace
  go test ./internal/install -run TestParseSource -count=1
'

Runbook authoring

Runbooks use mdproof assertions (jq:, snapshots); read .mdproof/lessons-learned.md for proven patterns before writing one. This skill owns running them in the devcontainer.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Manage skills, agents, extras, hooks, plugins, and MCP connection settings with the Skillshare CLI. Use when the user asks to configure or run Skillshare, install or sync resources across AI tools, manage shared memory notes, import MCP settings, manage targets, audit skills, recover backups, or troubleshoot Skillshare configuration and sync. Covers global and project modes, noninteractive automation, and guidance for the terminal UI.

日本語の概要は準備中です。原文の説明を表示しています。

runkids/skillshare2,7692026年10月11日 更新

Generate CHANGELOG.md entry from recent commits in conventional format. Also syncs the website changelog page. Use this skill whenever the user asks to: generate a changelog, document what changed between tags, or create a new CHANGELOG entry. If you see requests like "write the changelog for v0.17", "what changed since last release", this is the skill to use. Do NOT manually edit CHANGELOG.md without this skill — it ensures proper formatting, user-perspective writing, and website changelog sync. For full release workflows (Release PR review, tests, draft assets, publication, announcements), use /release instead.

日本語の概要は準備中です。原文の説明を表示しています。

runkids/skillshare2,7692026年10月11日 更新

Cross-validate CLI flags, docs, tests, and targets for consistency across the codebase. Use this skill whenever the user asks to: audit the codebase, check for consistency issues, find undocumented flags, verify test coverage, validate targets.yaml, check handler split conventions, or verify oplog instrumentation. This is a read-only audit — it reports issues but never modifies files. Use after large refactors, before releases, or whenever you suspect docs/code/tests have drifted out of sync.

日本語の概要は準備中です。原文の説明を表示しています。

runkids/skillshare2,7692026年10月11日 更新

Run CLI commands, tests, and debugging inside the skillshare devcontainer. Use this skill whenever you need to: execute skillshare CLI commands for verification, run Go tests (unit or integration), reproduce bugs, test new features, start the web UI, or perform any operation that requires a Linux environment. All CLI execution MUST happen inside the devcontainer — never run skillshare commands on the host. If you are about to use Bash to run `ss`, `skillshare`, `go test`, or `make test`, stop and use this skill first to ensure correct container execution.

日本語の概要は準備中です。原文の説明を表示しています。

runkids/skillshare2,7692026年10月11日 更新

Implement a feature from a spec file or description using TDD workflow. Use this skill whenever the user asks to: add a new CLI command, implement a feature from a spec, build new functionality, add a flag, create a new internal package, or write Go code for skillshare. This skill enforces test-first development, proper handler split conventions, oplog instrumentation, and dual-mode (global/project) patterns. If the request involves writing Go code and tests, use this skill — even if the user doesn't explicitly say "implement".

日本語の概要は準備中です。原文の説明を表示しています。

runkids/skillshare2,7692026年10月11日 更新

Prepare and review skillshare releases using the Release Please PR, verify the proposed version and changelog, inspect draft assets, and publish through the manual Publish Release workflow when explicitly authorized. Use when the user says "release", "prepare release", "cut a release", or asks to publish a new version. For changelog-only tasks, use /changelog instead.

日本語の概要は準備中です。原文の説明を表示しています。

runkids/skillshare2,7692026年10月11日 更新

runkids のスキルをすべて見る

このスキルの問題を報告する