Skip to content
Hooks
Skill

/add-command

Add support for a new CLI command. Use when implementing a handler or adding to SIMPLE_SAFE.

From plugin
dippy
2425 skills
Install
$ npx -y skills add ldayton/Dippy --skill add-command --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/add-command

Context preview

The summary Claude sees to decide when to auto-load this skill.

Add support for a new CLI command. Use when implementing a handler or adding to SIMPLE_SAFE.

SKILL.md

add-command.SKILL.md
name: add-command
description: Add support for a new CLI command. Use when implementing a handler or adding to SIMPLE_SAFE.
argument-hint: <command>
disable-model-invocation: true

Add support for `$ARGUMENTS` in Dippy.

1. Research

**tldr pages:**

ls ~/source/tldr/pages/*/$ARGUMENTS*.md
cat ~/source/tldr/pages/*/$ARGUMENTS.md

**CLI docs:**

$ARGUMENTS --help
man $ARGUMENTS

Note which operations are read-only vs mutations.

2. Decide: Handler or SIMPLE_SAFE?

  • **SIMPLE_SAFE**: Always safe regardless of arguments (read-only, no destructive flags). Go to step 3A.
  • **Handler**: Needs subcommand/flag analysis. Go to step 3B.

3A. SIMPLE_SAFE Path

Add to `SIMPLE_SAFE` in `src/dippy/core/allowlists.py` and add tests to `tests/test_simple.py` in the appropriate category. Skip to step 5.

3B. Handler Path

Create `tests/cli/test_$ARGUMENTS.py`:

"""Test cases for $ARGUMENTS."""

import pytest
from conftest import is_approved, needs_confirmation

TESTS = [
    # Safe operations
    ("$ARGUMENTS <safe-subcommand>", True),
    ("$ARGUMENTS --help", True),
    # Unsafe operations
    ("$ARGUMENTS <unsafe-subcommand>", False),
]

@pytest.mark.parametrize("command,expected", TESTS)
def test_command(check, command: str, expected: bool):
    result = check(command)
    if expected:
        assert is_approved(result), f"Expected approve: {command}"
    else:
        assert needs_confirmation(result), f"Expected confirm: {command}"

4. Implement Handler

Create `src/dippy/cli/$ARGUMENTS.py`:

"""$ARGUMENTS handler for Dippy."""

from dippy.cli import Classification, HandlerContext

COMMANDS = ["$ARGUMENTS"]

SAFE_ACTIONS = frozenset({"list", "show", "status"})

def classify(ctx: HandlerContext) -> Classification:
    tokens = ctx.tokens
    action = tokens[1] if len(tokens) > 1 else None
    if action in SAFE_ACTIONS:
        return Classification("allow", description=f"$ARGUMENTS {action}")
    return Classification("ask", description="$ARGUMENTS")

For handler patterns (nested subcommands, flag-checking, delegation), see [patterns.md](patterns.md).

5. Iterate

just test

Fix failures until tests pass.

6. Verify

`just check` MUST pass before you're done.

Read more
Ships withdippy

🐤 Less permission fatigue, more momentum. Dippy knows what’s safe to run and keeps Claude on track when plans change.

Get the whole plugin
Stats
241
Stars
22
Forks
Maintained
Maintenance
Python
Language
MIT
License
2mo ago
Last commit
7mo ago
Created

Repo: ldayton/Dippy