This document defines the user-facing selective-install design for ECC.
It complements
docs/SELECTIVE-INSTALL-ARCHITECTURE.md, which focuses on internal runtime
architecture and code boundaries.
This document answers the product and operator questions first:
- how users choose ECC components
- what the CLI should feel like
- what config file should exist
- how installation should behave across harness targets
- how the design maps onto the current ECC codebase without requiring a rewrite
Today ECC still feels like a large payload installer even though the repo now has first-pass manifest and lifecycle support.
Users need a simpler mental model:
- install the baseline
- add the language packs they actually use
- add the framework configs they actually want
- add optional capability packs like security, research, or orchestration
The selective-install system should make ECC feel composable instead of all-or-nothing.
In the current substrate, user-facing components are still an alias layer over coarser internal install modules. That means include/exclude is already useful at the module-selection level, but some file-level boundaries remain imperfect until the underlying module graph is split more finely.
- Let users install a small default ECC footprint quickly.
- Let users compose installs from reusable component families:
- core rules
- language packs
- framework packs
- capability packs
- target/platform configs
- Keep one consistent UX across Claude, Cursor, Antigravity, Codex, and OpenCode.
- Keep installs inspectable, repairable, and uninstallable.
- Preserve backward compatibility with the current
ecc-install typescriptstyle during rollout.
- packaging ECC into multiple npm packages in the first phase
- building a remote marketplace
- full control-plane UI in the same phase
- solving every skill-classification problem before selective install ships
A user should be able to get a useful ECC install with one command:
ecc install --target claude --profile coreThe default experience should not assume the user wants every skill family and every framework.
The user should think in terms of:
- "I want the developer baseline"
- "I need TypeScript and Python"
- "I want Next.js and Django"
- "I want the security pack"
The user should not have to know raw internal repo paths.
Every install path should support dry-run planning:
ecc install --target cursor --profile developer --with lang:typescript --with framework:nextjs --dry-runThe plan should clearly show:
- selected components
- skipped components
- target root
- managed paths
- expected install-state location
Teams should be able to commit a project-level install config and use:
ecc install --config ecc-install.jsonThat allows deterministic installs across contributors and CI.
The current manifest already uses install modules and profiles. The user-facing design should keep that internal structure, but present it as four main component families.
Near-term implementation note: some user-facing component IDs still resolve to shared internal modules, especially in the language/framework layer. The catalog improves UX immediately while preserving a clean path toward finer module granularity in later phases.
These are the default ECC building blocks:
- core rules
- baseline agents
- core commands
- runtime hooks
- platform configs
- workflow quality primitives
Examples of current internal modules:
rules-coreagents-corecommands-corehooks-runtimeplatform-configsworkflow-quality
Language packs group rules, guidance, and workflows for a language ecosystem.
Examples:
lang:typescriptlang:pythonlang:golang:javalang:rust
Each language pack should resolve to one or more internal modules plus target-specific assets.
Framework packs sit above language packs and pull in framework-specific rules, skills, and optional setup.
Examples:
framework:reactframework:nextjsframework:djangoframework:springbootframework:laravel
Framework packs should depend on the correct language pack or baseline primitives where appropriate.
Capability packs are cross-cutting ECC feature bundles.
Examples:
capability:securitycapability:researchcapability:orchestrationcapability:mediacapability:content
These should map onto the current module families already being introduced in the manifests.
Profiles remain the fastest on-ramp.
Recommended user-facing profiles:
coreminimal baseline, safe default for most users trying ECCdeveloperbest default for active software engineering worksecuritybaseline plus security-heavy guidanceresearchbaseline plus research/content/investigation toolsfulleverything classified and currently supported
Profiles should be composable with additional --with and --without flags.
Example:
ecc install --target claude --profile developer --with lang:typescript --with framework:nextjs --without capability:orchestrationecc install
ecc plan
ecc list-installed
ecc doctor
ecc repair
ecc uninstall
ecc catalogRecommended shape:
ecc install [--target <target>] [--profile <name>] [--with <component>]... [--without <component>]... [--config <path>] [--dry-run] [--json]Examples:
ecc install --target claude --profile core
ecc install --target cursor --profile developer --with lang:typescript --with framework:nextjs
ecc install --target antigravity --with capability:security --with lang:python
ecc install --config ecc-install.jsonRecommended shape:
ecc plan [same selection flags as install]Purpose:
- produce a preview without mutation
- act as the canonical debugging surface for selective install
Recommended shape:
ecc catalog profiles
ecc catalog components
ecc catalog components --family language
ecc catalog show framework:nextjsPurpose:
- let users discover valid component names without reading docs
- keep config authoring approachable
These legacy flows should still work during migration:
ecc-install typescript
ecc-install --target cursor typescript
ecc typescriptInternally these should normalize into the new request model and write install-state the same way as modern installs.
Recommended default:
ecc-install.json
Optional future support:
.ecc/install.json
{
"$schema": "./schemas/ecc-install-config.schema.json",
"version": 1,
"target": "cursor",
"profile": "developer",
"include": [
"lang:typescript",
"lang:python",
"framework:nextjs",
"capability:security"
],
"exclude": [
"capability:media"
],
"options": {
"hooksProfile": "standard",
"mcpCatalog": "baseline",
"includeExamples": false
}
}targetselected harness target such asclaude,cursor, orantigravityprofilebaseline profile to start fromincludeadditional components to addexcludecomponents to subtract from the profile resultoptionstarget/runtime tuning flags that do not change component identity
- CLI arguments override config file values.
- config file overrides profile defaults.
- profile defaults override internal module defaults.
This keeps the behavior predictable and easy to explain.
The user-facing flow should be:
- load config file if provided or auto-detected
- merge CLI intent on top of config intent
- normalize the request into a canonical selection
- expand profile into baseline components
- add
includecomponents - subtract
excludecomponents - resolve dependencies and target compatibility
- render a plan
- apply operations if not in dry-run mode
- write install-state
The important UX property is that the exact same flow powers:
installplanrepairuninstall
The commands differ in action, not in how ECC understands the selected install.
Selective install should preserve the same conceptual component graph across all targets, while letting target adapters decide how content lands.
Best fit for:
- home-scoped ECC baseline
- commands, agents, rules, hooks, platform config, orchestration
Best fit for:
- project-scoped installs
- rules plus project-local automation and config
Best fit for:
- project-scoped agent/rule/workflow installs
Should remain additive targets rather than special forks of the installer.
The selective-install design should make these just new adapters plus new target-specific mapping rules, not new installer architectures.
This design is feasible because the repo already has:
- install module and profile manifests
- target adapters with install-state paths
- plan inspection
- install-state recording
- lifecycle commands
- a unified
eccCLI surface
The missing work is not conceptual invention. The missing work is productizing the current substrate into a cleaner user-facing component model.
- profile + include/exclude selection
ecc-install.jsonconfig file parsing- catalog/discovery command
- alias mapping from user-facing component IDs to internal module sets
- dry-run and JSON planning
- richer target adapter semantics
- merge-aware operations for config-like assets
- stronger repair/uninstall behavior for non-copy operations
- reduced publish surface
- generated slim bundles
- remote component fetch
The current manifests do not yet expose a true user-facing lang:* /
framework:* / capability:* taxonomy. That should be introduced as a
presentation layer on top of the existing modules, not as a second installer
engine.
Recommended approach:
- keep
install-modules.jsonas the internal resolution catalog - add a user-facing component catalog that maps friendly component IDs to one or more internal modules
- let profiles reference either internal modules or user-facing component IDs during the migration window
That avoids breaking the current selective-install substrate while improving UX.
- finalize the user-facing component taxonomy
- add the config schema
- add CLI design and precedence rules
- implement component aliases
- implement config-file parsing
- implement
include/exclude - implement
catalog
- move more logic into target-owned planning
- support merge/generate operations cleanly
- improve repair/uninstall fidelity
- narrow published surface
- evaluate generated bundles
The next implementation move should not be "rewrite the installer."
It should be:
- keep the current manifest/runtime substrate
- add a user-facing component catalog and config file
- add
include/excludeselection and catalog discovery - let the existing planner and lifecycle stack consume that model
That is the shortest path from the current ECC codebase to a real selective install experience that feels like ECC 2.0 instead of a large legacy installer.