paperclipai/paperclip · error
projectId or rootIssueId is required
Error message
projectId or rootIssueId is required
What it means
Error "projectId or rootIssueId is required" thrown in paperclipai/paperclip.
Solutions
- Pass projectId or rootIssueId to scope the operation.
When it happens
Trigger: Thrown at packages/plugins/plugin-llm-wiki/src/wiki/core.ts:3338 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@5716fe907e (2026-08-18).
Data as JSON: /api/errors/227fa6e6091ec101.
Report an issue: GitHub.
Appendix: source
Thrown at packages/plugins/plugin-llm-wiki/src/wiki/core.ts:3336
export function getDistillationAutoApplyRestriction(): DistillationAutoApplyRestriction {
const rawMode = process.env.PAPERCLIP_DEPLOYMENT_MODE;
const rawExposure = process.env.PAPERCLIP_DEPLOYMENT_EXPOSURE;
const deploymentMode =
rawMode === "local_trusted" || rawMode === "authenticated" ? rawMode : null;
const deploymentExposure =
rawExposure === "private" || rawExposure === "public" ? rawExposure : null;
const blocked = deploymentMode === "authenticated" && deploymentExposure === "public";
return {
autoApplyAllowed: !blocked,
autoApplyRestriction: blocked ? PUBLIC_DISTILLATION_AUTO_APPLY_RESTRICTION : null,
deploymentMode,
deploymentExposure,
};
}
export async function distillPaperclipProjectPage(ctx: PluginContext, input: PaperclipProjectPageDistillationInput) {
if (!input.projectId && !input.rootIssueId) {
throw new Error("projectId or rootIssueId is required");
}
const wikiId = normalizeWikiId(input.wikiId);
assertPaperclipSourceScopePayload(input);
const space = await requirePaperclipIngestionPolicy(ctx, { companyId: input.companyId, wikiId, spaceSlug: input.spaceSlug }, "execute", { requireEnabledProfile: true });
const scope = paperclipCursorScopeMetadata(input);
const issues = await listPaperclipBundleIssues(ctx, input);
const project = scope.projectId ? await ctx.projects.get(scope.projectId, input.companyId) : null;
const rootIssue = scope.rootIssueId ? await ctx.issues.get(scope.rootIssueId, input.companyId) : null;
const slug = projectPageSlug({ project, rootIssue });
const projectDir = `wiki/projects/${slug}`;
const standupPath = assertPagePath(`${projectDir}/standup.md`);
const pagePath = assertPagePath(`${projectDir}/index.md`);
const run = await createPaperclipDistillationRun(ctx, input);
const bundle = run.bundle;
const current = await readCurrentWithHash(ctx, input.companyId, pagePath, space);
assertExpectedHash(input.expectedProjectPageHash, current.hash, pagePath);
if (!hasDurableSignal(bundle, issues)) {View on GitHub (pinned to 5716fe907e)