{"record":{"id":"affc6c31b3f7affe","repo":"ComposioHQ/composio","slug":"no-upstream-license-file-found-in-platform-imessag","errorCode":null,"errorMessage":"No upstream license file found in platform-imessage submodule.","messagePattern":"No upstream license file found in platform-imessage submodule\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"ts/packages/cli-local-tools/scripts/build-beeper-imessage-binaries.ts","lineNumber":104,"sourceCode":"  (await $`git rev-parse HEAD`.cwd(submodulePath).text()).trim();\n\nconst getSubmoduleVersion = async (): Promise<string> => {\n  const packageJson = await readJson<{ version?: string }>(\n    path.join(submodulePath, 'package.json')\n  );\n  return packageJson.version ?? 'unknown';\n};\n\nconst copyLicense = async () => {\n  const licenseCandidates = ['license.txt', 'LICENSE.txt', 'LICENSE', 'LICENSE.md'];\n  for (const candidate of licenseCandidates) {\n    const sourcePath = path.join(submodulePath, candidate);\n    if (await exists(sourcePath)) {\n      await fs.copyFile(sourcePath, path.join(outputRoot, 'LICENSE.txt'));\n      return;\n    }\n  }\n  throw new Error('No upstream license file found in platform-imessage submodule.');\n};\n\nconst patchBetterSwiftAxForCurrentSdk = async () => {\n  await $`swift package resolve`.cwd(submodulePath);\n\n  const checkoutRoot = path.join(\n    submodulePath,\n    '.build/checkouts/BetterSwiftAX/Sources/AccessibilityControl'\n  );\n  if (!(await exists(checkoutRoot))) {\n    throw new Error(\n      'Swift package resolution completed but the BetterSwiftAX AccessibilityControl checkout was not found.'\n    );\n  }\n\n  let replacementCount = 0;\n  for (const fileName of betterSwiftAxFallbackFiles) {\n    const sourcePath = path.join(checkoutRoot, fileName);","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/ComposioHQ/composio/blob/64b1b85502b1beeb2379e6c9e8bf1104504fa637/ts/packages/cli-local-tools/scripts/build-beeper-imessage-binaries.ts#L86-L122","documentation":"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.","triggerScenarios":"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.","commonSituations":"Upstream repo dropped or renamed its license file; submodule checked out at a commit that predates adding a license; custom forks without license files.","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)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const licenseCandidates = ['LICENSE', 'LICENSE.md', 'LICENSE.txt', 'COPYING'];\nconst found = (await Promise.all(licenseCandidates.map(f => exists(path.join(submodulePath, f))))).some(Boolean);\nif (!found) {/* fail before building */}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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."],"tags":["licensing","build-script","submodule"],"backgroundTag":"missing-license-file","analyzedSha":"64b1b85502b1beeb2379e6c9e8bf1104504fa637","analyzedAt":"2026-08-28T15:39:33.623Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}