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
- 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)