tobi/qmd · warning · Error

Unknown skills subcommand: ${subcommand}

Error message

Unknown skills subcommand: ${subcommand}

What it means

Thrown by the `qmd skills` dispatcher when the first subcommand is not one of list|get|path|help. It's a usage error from the CLI argument router.

Source

Thrown at src/cli/qmd.ts:3471

        else paths.forEach((path) => console.log(path));
        return;
      }
      const skill = findSkill(name, true);
      if (!skill) {
        throw new Error(`Skill not found: ${name}`);
      }
      if (jsonMode) outputSkillsJson({ success: true, data: { name: skill.name, path: skill.dir } });
      else console.log(skill.dir);
      return;
    }

    case "help": {
      showSkillsHelp();
      return;
    }

    default:
      throw new Error(`Unknown skills subcommand: ${subcommand}`);
  }
}

function showSkillsHelp(): void {
  console.log("Usage: qmd skills <list|get|path> [options]");
  console.log("");
  console.log("Commands:");
  console.log("  list                 List bundled runtime skills");
  console.log("  get <name>           Print a bundled runtime skill");
  console.log("  get <name> --full    Include references/templates/scripts");
  console.log("  get --all            Print all bundled runtime skills");
  console.log("  path [name]          Print runtime skill directory path(s)");
  console.log("");
  console.log("Options:");
  console.log("  --json               Print structured JSON");
}

function ensureClaudeSymlink(linkPath: string, targetDir: string, force: boolean): boolean {

View on GitHub (pinned to dbfd0b4736)

Solutions

  1. Run `qmd skills help` to see valid subcommands
  2. Use one of list, get, path, or help

Example fix

# before
qmd skills fetch qmd
# after
qmd skills get qmd
Defensive patterns

Strategy: try-catch

Validate before calling

const VALID = new Set(["list", "get", "path", "help"]);
const sub = process.argv[3];
if (!VALID.has(sub)) { console.error(`unknown subcommand: ${sub}`); process.exit(1); }

Type guard

function isSkillsSubcommand(s: string): s is "list" | "get" | "path" | "help" {
  return ["list", "get", "path", "help"].includes(s);
}

Try / catch

null

Prevention

When it happens

Trigger: Running e.g. `qmd skills fetch`, `qmd skills show`, or any unrecognized subcommand token.

Common situations: Version drift — using a subcommand that existed in another version or was assumed to exist; typos; copy-pasting docs for a different tool.

Related errors


AI-assisted analysis of tobi/qmd@dbfd0b4736 (2026-08-28). Data as JSON: /api/errors/aee1ead774cbeec8. Report an issue: GitHub.