paperclipai/paperclip · error · Error

Paperclip skills must be directories.

Error message

Paperclip skills must be directories.

What it means

Error "Paperclip skills must be directories." thrown in paperclipai/paperclip.

Solutions

  1. Ensure the skill path is a directory containing SKILL.md, not a file.

When it happens

Trigger: Thrown at packages/adapter-utils/src/server-utils.ts:3164 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-08-18). Data as JSON: /api/errors/d79d519bf456ad5a. Report an issue: GitHub.

Appendix: source

Thrown at packages/adapter-utils/src/server-utils.ts:4272

  async function visit(candidate: string, relativePath: string): Promise<void> {
    const stat = await fs.lstat(candidate);
    if (stat.isSymbolicLink()) {
      hash.update(`symlink:${relativePath}\n`);
      return;
    }
    if (stat.isDirectory()) {
      hash.update(`dir:${relativePath}\n`);
      const entries = await fs.readdir(candidate, { withFileTypes: true });
      entries.sort((left, right) => left.name.localeCompare(right.name));
      for (const entry of entries) {
        const childRelativePath = relativePath
          ? `${relativePath}/${entry.name}`
          : entry.name;
        await visit(path.join(candidate, entry.name), childRelativePath);
      }
      return;
    }
    if (stat.isFile()) {
      hash.update(`file:${relativePath}:${stat.mode}\n`);
      hash.update(await fs.readFile(candidate));
      hash.update("\n");
      return;
    }
    hash.update(`other:${relativePath}:${stat.mode}\n`);
  }

  await visit(root, "");
  return hash.digest("hex");
}

async function materializedSkillFingerprintMatches(
  targetRoot: string,
  sourceFingerprint: string,
): Promise<boolean> {
  try {

View on GitHub (pinned to 3f1d897a7c)