{"record":{"id":"eab6d3ebd88e410f","repo":"ReactiveX/rxjs","slug":"usage-rxjs-migrate-skill-check-install-update-re","errorCode":null,"errorMessage":"Usage: rxjs-migrate-skill <check|install|update|remove> --harness <codex|claude|cursor> [--project-root <dir>] [--force]","messagePattern":"Usage: rxjs-migrate-skill <check\\|install\\|update\\|remove> --harness <codex\\|claude\\|cursor> \\[--project-root <dir>\\] \\[--force\\]","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/migrate/src/skill-cli.ts","lineNumber":73,"sourceCode":"\nexport async function resolveCanonicalSkillRoot(modulePath = process.argv[1]): Promise<string> {\n  if (!modulePath) throw new Error('Cannot locate the @rxjs/migrate package entry point.');\n  const moduleDirectory = dirname(resolve(modulePath));\n  for (const localPath of ['../skill', '../../skill']) {\n    const candidate = resolve(moduleDirectory, localPath);\n    try {\n      if ((await stat(join(candidate, 'SKILL.md'))).isFile()) return candidate;\n    } catch {\n      // Try the source-tree or built-package alternative.\n    }\n  }\n  throw new Error('Cannot locate the canonical Skill shipped by @rxjs/migrate.');\n}\n\nfunction parseSkillArguments(argv: readonly string[]): ParsedSkillCliOptions {\n  const action = argv[0];\n  if (action !== 'check' && action !== 'install' && action !== 'update' && action !== 'remove') {\n    throw new Error(\n      'Usage: rxjs-migrate-skill <check|install|update|remove> --harness <codex|claude|cursor> [--project-root <dir>] [--force]'\n    );\n  }\n  let harness: SkillHarness | undefined;\n  let projectRoot = process.cwd();\n  let force = false;\n  for (let index = 1; index < argv.length; index++) {\n    const argument = argv[index];\n    if (argument === '--harness') {\n      const value = argv[++index];\n      if (!value || !skillHarnesses.includes(value as SkillHarness)) throw new Error('--harness requires codex, claude, or cursor');\n      harness = value as SkillHarness;\n    } else if (argument === '--project-root') {\n      const value = argv[++index];\n      if (!value) throw new Error('--project-root requires a directory');\n      projectRoot = value;\n    } else if (argument === '--force') {\n      force = true;","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/migrate/src/skill-cli.ts#L55-L91","documentation":"Thrown by parseSkillArguments when the first CLI argument is not one of check, install, update, or remove. The skill CLI is strict about its action verb and prints usage in the error message.","triggerScenarios":"Running rxjs-migrate-skill with no arguments, a misspelled action ('instal', 'list'), or an action in the wrong position (after flags).","commonSituations":"Typos, forgetting the action, or assuming a 'list'/'init' subcommand exists.","solutions":["Use exactly one of: rxjs-migrate-skill check|install|update|remove","Put the action first, before --harness and other flags","Check the CLI help/usage string for the accepted verbs"],"exampleFix":"# before\nrxjs-migrate-skill install-skill --harness claude\n# after\nrxjs-migrate-skill install --harness claude","handlingStrategy":"validation","validationCode":"const actions = ['check','install','update','remove'] as const;\nif (!actions.includes(argv[0] as any)) { console.error('Usage: ...'); process.exit(2); }","typeGuard":"const isSkillAction = (a: string): a is 'check'|'install'|'update'|'remove' => ['check','install','update','remove'].includes(a);","tryCatchPattern":null,"preventionTips":["Read the usage string before scripting","Put the action verb first"],"tags":["cli","arguments","usage"],"backgroundTag":"invalid-cli-argument","analyzedSha":"54796b38a57e6309f9861e174737479bb3f63f61","analyzedAt":"2026-08-28T10:21:27.410Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}