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
- Update the submodule to an upstream revision that includes a license file (`git submodule update --remote`).
- 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
- Validate license presence right after submodule init, before spending time on Swift builds.
- Keep the submodule pinned to commits known to carry a license file.
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
- Unsupported BetterSwiftAX constant fallback: ${constantName}
- Building Beeper iMessage local-tool binaries requires macOS
- Missing platform-imessage submodule at ${submoduleRelativePa
- Swift package resolution completed but the BetterSwiftAX Acc
- Swift package resolution completed but BetterSwiftAX ${fileN
AI-assisted analysis of ComposioHQ/composio@64b1b85502 (2026-08-28).
Data as JSON: /api/errors/affc6c31b3f7affe.
Report an issue: GitHub.