EveryInc/compound-engineering-plugin · info

Moved legacy Pi install manifest to ${backupPath}

Error message

Moved legacy Pi install manifest to ${backupPath}

What it means

archiveLegacyInstallManifestIfOwned in src/targets/pi.ts migrates an old-format Pi install manifest: if the legacy manifest file is present and owned by this plugin, it is moved (fs.rename) into managedDir/legacy-backup/<timestamp>/ and this notice is printed. It is informational — the new manifest format takes over and the old file is preserved as a backup, not deleted.

Source

Thrown at src/targets/pi.ts:308

 * own next install will migrate it).
 */
async function archiveLegacyInstallManifestIfOwned(
  managedDir: string,
  pluginName: string,
): Promise<void> {
  const legacyDir = resolveLegacyManagedDir(managedDir, pluginName)
  if (!legacyDir) return
  const legacyManifestPath = path.join(legacyDir, PI_INSTALL_MANIFEST)
  if (!(await pathExists(legacyManifestPath))) return

  const owned = await readInstallManifest(legacyDir, pluginName)
  if (!owned) return

  const timestamp = new Date().toISOString().replace(/[:.]/g, "-")
  const backupPath = path.join(managedDir, "legacy-backup", timestamp, PI_INSTALL_MANIFEST)
  await ensureDir(path.dirname(backupPath))
  await fs.rename(legacyManifestPath, backupPath)
  console.warn(`Moved legacy Pi install manifest to ${backupPath}`)
}

async function readInstallManifest(
  managedDir: string,
  pluginName: string,
  paths?: PiPaths,
): Promise<PiInstallManifest | null> {
  const manifestPath = path.join(managedDir, PI_INSTALL_MANIFEST)
  try {
    const raw = await readText(manifestPath)
    const parsed = JSON.parse(raw) as Partial<PiInstallManifest>
    if (
      parsed.version === 1 &&
      parsed.pluginName === pluginName &&
      Array.isArray(parsed.skills) &&
      Array.isArray(parsed.prompts) &&
      Array.isArray(parsed.extensions)
    ) {

View on GitHub (pinned to c9c10f8c75)

Solutions

  1. No action needed — this is a successful migration; the legacy manifest is backed up under legacy-backup/.
  2. If you need the old manifest contents, find them at managedDir/legacy-backup/<timestamp>/.
  3. If you see this repeatedly, check that the new manifest is being written in the expected location (permissions/ownership of managedDir) and that no other process is restoring the legacy file.
  4. Delete old legacy-backup directories once you have confirmed the new install works, to keep the managed dir clean.
Defensive patterns

Strategy: fallback

Validate before calling

import { existsSync } from 'node:fs'
// informational migration — no pre-check needed, but you can detect it:
const legacyPresent = existsSync(legacyManifestPath)
const backupDirPattern = /legacy-backup\//
// if legacyPresent is false and backups exist, migration already happened

Prevention

When it happens

Trigger: Running writePiBundle when PI_INSTALL_MANIFEST exists at the legacy location and ownership checks pass (owned); the file is renamed to legacy-backup/<ISO-timestamp>/<manifest-name>.

Common situations: Upgrading the plugin across a manifest-format change after a long-lived install; an install that was created by an older converter version and never re-installed since the format migration.

Related errors


AI-assisted analysis of EveryInc/compound-engineering-plugin@c9c10f8c75 (2026-08-31). Data as JSON: /api/errors/d3a62dbb8c6f53bc. Report an issue: GitHub.