affaan-m/ECC · error · Error
Install manifests not found under ${repoRoot}
Error message
Install manifests not found under ${repoRoot} What it means
loadInstallManifests checks for the existence of install-modules.json and install-profiles.json under <repoRoot>/manifests/ and throws if either is missing. install-components.json is optional, but modules and profiles are mandatory baseline inputs.
Source
Thrown at scripts/lib/install-manifests.js:288
return SUPPORTED_INSTALL_TARGETS.filter(target => (
modules.every(module => Array.isArray(module.targets) && module.targets.includes(target))
));
}
function getManifestPaths(repoRoot = DEFAULT_REPO_ROOT) {
return {
modulesPath: path.join(repoRoot, 'manifests', 'install-modules.json'),
profilesPath: path.join(repoRoot, 'manifests', 'install-profiles.json'),
componentsPath: path.join(repoRoot, 'manifests', 'install-components.json'),
};
}
function loadInstallManifests(options = {}) {
const repoRoot = options.repoRoot || DEFAULT_REPO_ROOT;
const { modulesPath, profilesPath, componentsPath } = getManifestPaths(repoRoot);
if (!fs.existsSync(modulesPath) || !fs.existsSync(profilesPath)) {
throw new Error(`Install manifests not found under ${repoRoot}`);
}
const modulesData = readJson(modulesPath, 'install-modules.json');
const profilesData = readJson(profilesPath, 'install-profiles.json');
const componentsData = fs.existsSync(componentsPath)
? readJson(componentsPath, 'install-components.json')
: { version: null, components: [] };
const modules = Array.isArray(modulesData.modules) ? modulesData.modules.slice() : [];
const profiles = profilesData && typeof profilesData.profiles === 'object'
? profilesData.profiles
: {};
const components = Array.isArray(componentsData.components) ? componentsData.components.slice() : [];
addSyntheticSkillComponents({ repoRoot, modules, components });
for (const module of modules) {
readModuleTargetsOrThrow(module);
}View on GitHub (pinned to 01e15490f0)
Solutions
- Confirm the repoRoot in the error and verify `ls <repoRoot>/manifests/` shows install-modules.json and install-profiles.json.
- If missing, restore from git: `git checkout HEAD -- manifests/` or re-clone with full history.
- Run the installer from the repository root, or pass --repoRoot explicitly pointing at the real repo.
- If packaging a tarball, ensure manifests/ is included.
Example fix
// before: invoked from /tmp, DEFAULT_REPO_ROOT resolves there // after: cd /path/to/ECC ./install.sh --target claude # or: ./install.sh --target claude --repoRoot /path/to/ECC
Defensive patterns
Strategy: validation
Validate before calling
const fs = require('fs');
const path = require('path');
function manifestsExist(repoRoot) {
return fs.existsSync(path.join(repoRoot, 'manifests', 'install-modules.json'))
&& fs.existsSync(path.join(repoRoot, 'manifests', 'install-profiles.json'));
}
// before invoking installer: assert manifestsExist(repoRoot) Type guard
function hasRequiredManifests(repoRoot) {
return manifestsExist(repoRoot);
} Try / catch
try {
loadInstallManifests({ repoRoot });
} catch (err) {
if (err.message.startsWith('Install manifests not found under')) {
// restore manifests/ from git or fix repoRoot, then retry
} else throw err;
} Prevention
- Run the installer from the actual repo root.
- Pass --repoRoot explicitly when invoking from elsewhere.
- Ensure tarballs and Docker images include manifests/.
- Add a smoke check in CI that asserts manifests exist before any install step.
When it happens
Trigger: Calling loadInstallManifests (or any API that calls it — listInstallComponents, resolveInstallModules, createManifestInstallPlan) with a repoRoot that lacks manifests/install-modules.json or manifests/install-profiles.json. Also triggered when DEFAULT_REPO_ROOT is wrong because the installer is invoked from outside the repo.
Common situations: Shallow/partial clone excluded manifests/; manifests/ deleted or not committed; installer invoked from /tmp or a non-repo directory so DEFAULT_REPO_ROOT (__dirname/../..) resolves to a path without manifests; wrong --repoRoot flag value; extracted tarball missing the manifests folder.
Related errors
- Failed to read ${label}: ${error.message}
- Failed to parse ${label} at ${filePath}: ${error.message}
- Invalid ${label} at ${filePath}: expected a JSON object
- Refusing to ${action}: missing destination path.
- Refusing to ${action}: destination parent is not a trusted d
AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13).
Data as JSON: /api/errors/cc9f4f94320d398f.
Report an issue: GitHub.