mirror of
https://github.com/affaan-m/ECC.git
synced 2026-08-17 21:15:40 +02:00
The guided installer asks how ECC hooks should run, but that consent lived only in the wizard path. Running install-apply directly with a profile that includes hooks-runtime still materialized the hook runtime with no disclosure and no decision. Gate the apply layer instead, so every entry point is covered: - disclose the six hook capability groups when a plan would materialize the hook runtime, and refuse to apply until the caller decides - --enable-hooks confirms the hook runtime; --no-hooks installs the rest of the selection without it and records the reduced module closure in install-state - surface the pending decision as a dry-run warning - show the same capability disclosure in the guided installer's plan preview, so the wizard's hook question states what it is asking about Plans that never materialize hooks (Kimi, --profile minimal, --without baseline:hooks) are unaffected and need no flag. Repair and uninstall operate on already-recorded state and stay unchanged. The capability taxonomy and the held-materialization behavior come from Samarjeet Singh Tomar's PR #2634, reworked to fit the single-decision consent model that shipped with the guided installer in #2649. Co-Authored-By: Samarjeet Singh Tomar <samar_tomar@hotmail.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
'use strict';
|
|
|
|
const {
|
|
createLegacyCompatInstallPlan,
|
|
createLegacyInstallPlan,
|
|
createManifestInstallPlan,
|
|
} = require('../install-executor');
|
|
const { withHookConsent } = require('./hook-consent');
|
|
|
|
function createInstallPlanFromRequest(request, options = {}) {
|
|
if (!request || typeof request !== 'object') {
|
|
throw new Error('A normalized install request is required');
|
|
}
|
|
|
|
return withHookConsent(createRawInstallPlan(request, options), request.hookConsent || null);
|
|
}
|
|
|
|
function createRawInstallPlan(request, options = {}) {
|
|
if (request.mode === 'manifest') {
|
|
return createManifestInstallPlan({
|
|
target: request.target,
|
|
profileId: request.profileId,
|
|
moduleIds: request.moduleIds,
|
|
includeComponentIds: request.includeComponentIds,
|
|
excludeComponentIds: request.excludeComponentIds,
|
|
projectRoot: options.projectRoot,
|
|
homeDir: options.homeDir,
|
|
sourceRoot: options.sourceRoot,
|
|
});
|
|
}
|
|
|
|
if (request.mode === 'legacy-compat') {
|
|
return createLegacyCompatInstallPlan({
|
|
target: request.target,
|
|
legacyLanguages: request.legacyLanguages,
|
|
includeComponentIds: request.includeComponentIds,
|
|
excludeComponentIds: request.excludeComponentIds,
|
|
projectRoot: options.projectRoot,
|
|
homeDir: options.homeDir,
|
|
claudeRulesDir: options.claudeRulesDir,
|
|
sourceRoot: options.sourceRoot,
|
|
});
|
|
}
|
|
|
|
if (request.mode === 'legacy') {
|
|
return createLegacyInstallPlan({
|
|
target: request.target,
|
|
languages: request.languages,
|
|
projectRoot: options.projectRoot,
|
|
homeDir: options.homeDir,
|
|
claudeRulesDir: options.claudeRulesDir,
|
|
sourceRoot: options.sourceRoot,
|
|
});
|
|
}
|
|
|
|
throw new Error(`Unsupported install request mode: ${request.mode}`);
|
|
}
|
|
|
|
module.exports = {
|
|
createInstallPlanFromRequest,
|
|
};
|