ComposioHQ/composio · error · Error

No upstream license file found in platform-imessage submodul

Error message

No upstream license file found in platform-imessage submodule.

What it means

When packaging the built binaries the script copies the upstream license into the output as LICENSE.txt. It probes a list of well-known license filenames inside the platform-imessage submodule; if none exist, redistribution compliance can't be guaranteed and it aborts.

Source

Thrown at ts/packages/cli-local-tools/scripts/build-beeper-imessage-binaries.ts:104

  (await $`git rev-parse HEAD`.cwd(submodulePath).text()).trim();

const getSubmoduleVersion = async (): Promise<string> => {
  const packageJson = await readJson<{ version?: string }>(
    path.join(submodulePath, 'package.json')
  );
  return packageJson.version ?? 'unknown';
};

const copyLicense = async () => {
  const licenseCandidates = ['license.txt', 'LICENSE.txt', 'LICENSE', 'LICENSE.md'];
  for (const candidate of licenseCandidates) {
    const sourcePath = path.join(submodulePath, candidate);
    if (await exists(sourcePath)) {
      await fs.copyFile(sourcePath, path.join(outputRoot, 'LICENSE.txt'));
      return;
    }
  }
  throw new Error('No upstream license file found in platform-imessage submodule.');
};

const patchBetterSwiftAxForCurrentSdk = async () => {
  await $`swift package resolve`.cwd(submodulePath);

  const checkoutRoot = path.join(
    submodulePath,
    '.build/checkouts/BetterSwiftAX/Sources/AccessibilityControl'
  );
  if (!(await exists(checkoutRoot))) {
    throw new Error(
      'Swift package resolution completed but the BetterSwiftAX AccessibilityControl checkout was not found.'
    );
  }

  let replacementCount = 0;
  for (const fileName of betterSwiftAxFallbackFiles) {
    const sourcePath = path.join(checkoutRoot, fileName);

View on GitHub (pinned to 64b1b85502)

Solutions

  1. Update the submodule to an upstream revision that includes a license file (`git submodule update --remote`).
  2. Add the correct license file under the expected candidate path in the submodule (or extend the candidate list in copyLicense).
Defensive patterns

Strategy: validation

Validate before calling

const licenseCandidates = ['LICENSE', 'LICENSE.md', 'LICENSE.txt', 'COPYING'];
const found = (await Promise.all(licenseCandidates.map(f => exists(path.join(submodulePath, f))))).some(Boolean);
if (!found) {/* fail before building */}

Prevention

When it happens

Trigger: The platform-imessage submodule checkout contains no LICENSE/LICENSE.md/LICENSE.txt/COPYING file at the probed candidate paths when the build script runs copyLicense.

Common situations: Upstream repo dropped or renamed its license file; submodule checked out at a commit that predates adding a license; custom forks without license files.

Related errors


AI-assisted analysis of ComposioHQ/composio@64b1b85502 (2026-08-28). Data as JSON: /api/errors/affc6c31b3f7affe. Report an issue: GitHub.