paperclipai/paperclip · error · Error

Invalid --include value. Use one or more of: company,agents,

Error message

Invalid --include value. Use one or more of: company,agents,projects,issues,tasks,skills

What it means

`parseSecretsInclude` splits the `--include` value on commas, lowercases, and checks membership against the allowed set {company, agents, projects, issues, tasks, skills} (tasks is aliased to issues). If after filtering no token matched any allowed value, it throws. An empty/blank input returns the default include set, so this error only fires when a non-empty but wholly-unrecognized value is supplied.

Source

Thrown at cli/src/commands/client/secrets.ts:125

  company: true,
  agents: true,
  projects: true,
  issues: false,
  skills: false,
};

export function parseSecretsInclude(input: string | undefined): CompanyPortabilityInclude {
  if (!input?.trim()) return { ...DEFAULT_DECLARATION_INCLUDE };
  const values = input.split(",").map((part) => part.trim().toLowerCase()).filter(Boolean);
  const include = {
    company: values.includes("company"),
    agents: values.includes("agents"),
    projects: values.includes("projects"),
    issues: values.includes("issues") || values.includes("tasks"),
    skills: values.includes("skills"),
  };
  if (!Object.values(include).some(Boolean)) {
    throw new Error("Invalid --include value. Use one or more of: company,agents,projects,issues,tasks,skills");
  }
  return include;
}

export function isSensitiveEnvKey(key: string): boolean {
  return SENSITIVE_ENV_KEY_RE.test(key);
}

export function toPlainEnvValue(binding: unknown): string | null {
  if (typeof binding === "string") return binding;
  if (typeof binding !== "object" || binding === null || Array.isArray(binding)) return null;
  const record = binding as Record<string, unknown>;
  if (record.type === "plain" && typeof record.value === "string") return record.value;
  return null;
}

export function buildInlineMigrationSecretName(agentId: string, key: string): string {
  return `agent_${agentId.slice(0, 8)}_${key.toLowerCase()}`;

View on GitHub (pinned to 67001ec6eb)

Solutions

  1. Use only documented tokens: `company`, `agents`, `projects`, `issues` (or `tasks`), `skills` — comma-separated
  2. Omit `--include` to accept the default (`company,agents,projects`)
  3. Double-check plurals: it is `agents`/`projects`/`issues`/`skills`, not singular

Example fix

# before
paperclipai secrets declarations -C comp-1 --include agent,issu
# after
paperclipai secrets declarations -C comp-1 --include agents,issues
Defensive patterns

Strategy: validation

Validate before calling

const ALLOWED_INCLUDE = new Set(["company", "agents", "projects", "issues", "tasks", "skills"]);
function validateInclude(input: string | undefined): string[] {
  const tokens = (input ?? "").split(",").map((s) => s.trim().toLowerCase()).filter(Boolean);
  const bad = tokens.filter((t) => !ALLOWED_INCLUDE.has(t));
  if (tokens.length > 0 && bad.length === tokens.length) {
    throw new Error(`Invalid --include tokens: ${bad.join(", ")}`);
  }
  return tokens;
}

Type guard

const INCLUDE_TOKENS = ["company", "agents", "projects", "issues", "tasks", "skills"] as const;
type IncludeToken = typeof INCLUDE_TOKENS[number];
function isIncludeToken(v: unknown): v is IncludeToken {
  return typeof v === "string" && (INCLUDE_TOKENS as readonly string[]).includes(v);
}

Prevention

When it happens

Trigger: Passing `--include foo`, `--include company,bar`, or `--include ,,,` (commas with no valid tokens). The check uses `.some(Boolean)` over the include flags, so all-false triggers the throw.

Common situations: Typo in a token (e.g. `agent` instead of `agents`, `issue` instead of `issues`); passing a free-form string instead of the documented set; copy-paste that introduced a stray character.

Related errors


AI-assisted analysis of paperclipai/paperclip@67001ec6eb (2026-08-12). Data as JSON: /api/errors/ae670803999f27e3. Report an issue: GitHub.