



  

<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

<script type="importmap">{"imports":{"react":"https://github.githubassets.com/assets/react-e27d1b3e03961e68.js","react-dom":"https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js","react-dom/client":"https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js","react-is":"https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js","react-reconciler":"https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js","react/compiler-runtime":"https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js","react/jsx-dev-runtime":"https://github.githubassets.com/assets/react-jsx-dev-runtime-ea55d68667d559e5.js","react/jsx-runtime":"https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js","scheduler":"https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js"}}</script>
<meta name="react-profiling" content="0" data-turbo-transient="true" />
<meta name="react-import-map" content="react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@777f63f87cd0" data-turbo-track="reload" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-e27d1b3e03961e68.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js" />

  


  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-0f910d8806d5761b.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-a7abd4d4c49ac593.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-5fc4c4a9cb41e596.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-ed0cee9214dedabd.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-78a2491d538dab5a.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-c26b63d7c532d0a2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-a6f60cea68c08405.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-f66faf28b2ea18b6.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-6701f6218c53cf5b.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-7037fa46ae124d97.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-97df7784617ce1ea.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-9be9fe6313f476af.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-62747e27e61258dc.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-7a418ea859d1654d.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-72bd7d974b5ac1cc.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-4c5c0895f723f870.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_caches_react_shell","actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","actions_runners_react_shell","activity_diff_file_tree","activity_repos_file_tree","activity_repos_overview_header","activity_repos_overview_sidebar","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","async_conversion_coverage_enabled","billing_billable_licenses_cost_center_bucket_fix","billing_budget_expiration","billing_cost_center_list_assigned_resources","billing_discount_threshold_notification","code_quality_enablement_banner_targeting","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_automation_repo_mcp_servers","copilot_automations_pagination","copilot_base_model_policy_row","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_early_task_provisioning","copilot_chat_persist_session_drafts","copilot_chat_vision_dotcom_chat_ga_gate","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_fix_failed_workflows_all_skus","copilot_hide_hovercard","copilot_immersive_task_hyperlinking","copilot_mc_cli_resume_any_users_task","copilot_mission_control_agent_merge_fix_ci","copilot_mission_control_agent_merge_resolve_conflicts","copilot_mission_control_awps_batching","copilot_mission_control_early_stop","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_discussion_comment_trigger","copilot_swe_agent_discussion_opened_trigger","copilot_swe_agent_discussion_updated_trigger","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_assigned_trigger","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_issue_labeled_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_assigned_trigger","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_labeled_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_ready_for_review_trigger","copilot_swe_agent_pull_request_review_requested_trigger","copilot_swe_agent_pull_request_review_submitted_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_sub_issue_added_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_task_scoped_alive_channel","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_sunset_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","fgpat_permissions_selector_redesign","glc_code_quality_repo_settings_workflow_config","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_team_vs_personal","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_index_data_router","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","labels_archiving","labels_archiving_info","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_cookie_consent_banner","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_header_feedback","milestone_closed_issues_prioritization","milestone_show_data_router","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_merge_control","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_navigation_shortcuts","pull_request_virtualization_image_estimate","pull_request_virtualization_loader_batching","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","quick_search_lazy_suggestions","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_tanstack_allowed","react_logged_out_repository_header","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_declutter","repo_pulls_dashboard_ga","repo_pulls_dashboard_persistence","repo_pulls_dashboard_sidebar_links","repos_contributors_limited_default_range","review_involves_filter","rule_ignored_file_paths","rulesets_actor_list_editor","sample_network_conn_type","security_center_artifact_filters_popover","see_who_reacted","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","set_sha256_on_repo_creation_form","site_banner_desktop_copilot_app","site_ghca_pixel_mona","site_github_app_ga_page","site_github_app_ga_page_highlight","site_github_app_mobile_native_share","site_global_banner_dev_days_attendee","site_global_nav_spark_models_removed","speculation_rules_ui_service","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","update_issue_suggestions","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workstream_plugin_bootstrap"],"githubDomain":"https://github.com","copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-b752d992928a526c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-81e2b8334c3d06e9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-2f08c823163591a8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-633ad94fa06c334b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-0fb4c544a797ec0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-7c872b58ac9f1b39.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-7e9817cf5c068979.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-55602924fdf21863.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.bef03fb24bb03be8.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-52ed81112a548e10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e8810f64c443fb9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-0417f617ad744a0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-9da36843ba9d191d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-9a1160b939f2cd52.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3h-55903cf2303047ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hk-f1498fec45311acd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-7aa1ff0a0e750f41.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-1d800d09e9a8720a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-9697c1c8f5cbf523.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-e067f5c4473bffff.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-40ea91c5fde7f30c.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-5e0b3ae3c4036207.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-524a06aa946df6fc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-b1ee53c2200b172a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-7bf7b9d689fe3d10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-ca3bc10b816bcc1f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-21ec1e439ee2d87c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t-4c39f7195fc42cc8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb-53cfff089eaac51b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6n-afcf86ccabc4cad2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zj-4d9cf83cf08e1643.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wo-6991af5b3829ffe8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nfv-a6c14301d3ea6d67.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b5-a2fde30ce0c692b9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sw-9d0489dbf9a9c942.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ttf-7d5abe1b447ced2c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sj-c7a44023ee90d468.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0pd-c46d8dfae89c2b64.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-c8ee397a71bcb700.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.255cab819a92f7e1.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-073e7d742fb703f1.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-8503588299651923.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-66e64888bc4615bb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qmp-c7cfba40cf5a93b0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-148a74299e5a01ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-a9404625ec30bbc7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-8f9f1d6be01d6a22.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-68d09e5e8a80cb94.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-0cb3f75cec297941.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4u-cd9039ad946274ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8s-00bd469c4017a543.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-27679061f16e1495.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iu-2d03f5e6d4fdd54d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gru-2b0fac8887ff8c57.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a0-234e967e7c6d22ce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gz3-5bdfbfceac967bb6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/15m-64f3034430471048.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1e-c15441bdb94d54ae.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gzu-6ad9a0527a5d7afd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bi-3a42b8714e06c4d0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tu1-37e16844272ddefa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b1-ac66ededed061993.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gmn-1e5497c041b66231.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0l5-d1b2a63015b5eb6d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/c2-e85522be441acf73.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/f9-baf0a4193779952e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sp-87dce99c82a27004.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zkm-116b01b8485bbe3f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/og-518d12c9e011601d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b9-947db365ea875cfa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/14-8c7b4ad3c845664c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dsj-2e7d883cb843e9e6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ec-38012819307fd539.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/du-6607da3b8b579202.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/20-f43eb09c2be69457.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ql0-107312645ac2b72d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-fa7cdc0f7656d876.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p0l-fe491d943adf7508.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v1e-d099d9fd21ad25e5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fn-7b298a45c55fb6fb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7cw-6e493a20eaaa04b5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ok-290e4b9465ba9c5b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6d-ca6d584a0fd6368c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y8-e2f18f5a24733f3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xc-3fd4a2e7dcbad8e2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vjg-2874f95f389c4d3f.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-16afdcf183d11968.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/xc.de2b1dde0494f261.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.85de0b1d47e09052.module.css" />


  <title>ECC/README.md at main · 96loveslife/ECC · GitHub</title>



  <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
  <meta name="route-controller" content="blob" data-turbo-transient>
  <meta name="route-action" content="show" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:ad48ad77-bc8a-2ccd-457c-d7a24b9a847d">

    
  <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">


  <meta name="request-id" content="CDE0:3637F6:104766E:F7E1AF:6AC77C3B" data-pjax-transient="true"/><meta name="html-safe-nonce" content="f21bdde60faf2760a2683eca4b3293e59447dcd6b2041fe57c4ca5896e093bda" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDREUwOjM2MzdGNjoxMDQ3NjZFOkY3RTFBRjo2QUM3N0MzQiIsInZpc2l0b3JfaWQiOiIxNDYxODEyOTA4NjI2NzcxMDAzIiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="8c6935d0fc82b3de3d72de34c329078353cd22f6aef4cb7a1c5c271e32d49454" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1272056243" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_source" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />





  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond. - ECC/README.md at main · 96loveslife/ECC">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/96loveslife/ECC/blob/main/README.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/2a3ecd89845a5efd9d455936c0003bc886dbc3a21f3ca0fe4680bf3c2cf4587d/96loveslife/ECC" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="ECC/README.md at main · 96loveslife/ECC" /><meta name="twitter:description" content="The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond. - 96loveslife/ECC" />
  <meta property="og:image" content="https://opengraph.githubassets.com/2a3ecd89845a5efd9d455936c0003bc886dbc3a21f3ca0fe4680bf3c2cf4587d/96loveslife/ECC" /><meta property="og:image:alt" content="The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond. - 96loveslife/ECC" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="ECC/README.md at main · 96loveslife/ECC" /><meta property="og:url" content="https://github.com/96loveslife/ECC/blob/main/README.md" /><meta property="og:description" content="The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond. - 96loveslife/ECC" />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="f705e3cc2e7cb8ce0afdb7b21fc6ff6d7afede52aee40bf0eab14ca8b0d69dd6" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="c4a65e47b0c850e1157ae8e66298070851d7e3b558038de5a3b4ff7a93e630ed" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="1ff3f1d4e1abd61f6f135b47d3b815e2f7169f8dd418f0118c6b1cf4de6cbc86" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="1246934c1e1d4eb010e1cfa4ca517994cfab78ea050086b069045122415a52dd" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="turbo-cache-control" content="no-cache" data-turbo-transient>

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/96loveslife/ECC git https://github.com/96loveslife/ECC.git">

  <meta name="octolytics-dimension-user_id" content="28110502" /><meta name="octolytics-dimension-user_login" content="96loveslife" /><meta name="octolytics-dimension-repository_id" content="1272056243" /><meta name="octolytics-dimension-repository_nwo" content="96loveslife/ECC" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="true" /><meta name="octolytics-dimension-repository_parent_id" content="1136590548" /><meta name="octolytics-dimension-repository_parent_nwo" content="affaan-m/ECC" /><meta name="octolytics-dimension-repository_network_root_id" content="1136590548" /><meta name="octolytics-dimension-repository_network_root_nwo" content="affaan-m/ECC" />
  



    

    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">
  <meta name="disable-turbo" content="false">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">


  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

  <meta name="release" content="3ea5e9da9090cfec2f1df3ba60c98d7d544d5137" data-turbo-track="reload">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
      <div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
      

    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qc-1bbbe8787ea1cd4b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-10dbdab24559c7cd.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.4dd73a4e016c1ca2.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-install-banner-partial-0087e2c1d400f8c6.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.b50f287c48a7f94a.module.css" />

<react-partial
  partial-name="app-install-banner-partial"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2l-e468179ba7123a2e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rwd-069fc3d9814ff9fe.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz-e662bc3745e171e7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-3559ee48016881a2.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3d-7f22b36f29a9dd94.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tua-4998592d21eb16f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8i-756d611a52e5f265.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-3c37549fa4cc7814.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.05b219cdb8e80c43.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/8i.779dd52a6bc5b0b6.module.css" />

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2F96loveslife%2FECC%2Fblob%2Fmain%2FREADME.md","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow\u0026source=header-repo\u0026source_repo=96loveslife%2FECC","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/96loveslife/ECC/blob/main/README.md\",\"user_id\":null}}","auth_hydro_click_hmac":"73ce84ae50b91b53898e77ab3d5a8609563d6bbbaec1aec0eae3fbf3a001ddba","overlay":false,"fixed":false}}</script>
  <div data-target="react-partial.reactRoot"><div data-color-mode="dark" data-light-theme="light" data-dark-theme="dark"><header class="MarketingHeader-module__root__Tk7n3 HeaderMktg header-logged-out" role="banner" data-marketing-header="true" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" data-is-top="true"><h2 class="MarketingHeader-module__visuallyHidden__sqKsl">Navigation Menu</h2><button type="button" class="MarketingHeader-module__backdrop__sw4RU" aria-label="Close navigation menu"></button><div class="MarketingHeader-module__bar__mBSyE"><div class="MarketingHeader-module__topRow__yeury"><div class="MarketingHeader-module__toggleSlot__hDxbh"><button type="button" class="HeaderMenuToggle-module__toggle__i8EiC" aria-label="Toggle navigation" aria-expanded="false"><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span></button></div><a href="/" aria-label="Homepage" class="HeaderLogo-module__logo__UFyHI" data-analytics-event="{&quot;action&quot;:&quot;homepage&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;logo&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;homepage_link_logo_header&quot;}"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path></svg></a><div class="AuthCTAs-module__mobileActions__NNzeV"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/login?return_to=https%3A%2F%2Fgithub.com%2F96loveslife%2FECC%2Fblob%2Fmain%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/96loveslife/ECC/blob/main/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="73ce84ae50b91b53898e77ab3d5a8609563d6bbbaec1aec0eae3fbf3a001ddba"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_3dd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_3dd_">Appearance settings</div></div></div><div class="MarketingHeader-module__menu__GIy3y"><div class="MarketingHeader-module__menuWrapper__owstH"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_nd_">Platform<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5knd_">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot" data-analytics-event="{&quot;action&quot;:&quot;github_copilot&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>GitHub Copilot</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Write better code with AI</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/ai/github-app" data-analytics-event="{&quot;action&quot;:&quot;github_copilot_app&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_app_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.766 11.328c-2.063-.25-3.516-1.734-3.516-3.656 0-.781.281-1.625.75-2.188-.203-.515-.172-1.609.063-2.062.625-.078 1.468.25 1.968.703.594-.187 1.219-.281 1.985-.281.765 0 1.39.094 1.953.265.484-.437 1.344-.765 1.969-.687.218.422.25 1.515.046 2.047.5.593.766 1.39.766 2.203 0 1.922-1.453 3.375-3.547 3.64.531.344.89 1.094.89 1.954v1.625c0 .468.391.734.86.547C13.781 14.359 16 11.53 16 8.03 16 3.61 12.406 0 7.984 0 3.563 0 0 3.61 0 8.031a7.88 7.88 0 0 0 5.172 7.422c.422.156.828-.125.828-.547v-1.25c-.219.094-.5.156-.75.156-1.031 0-1.64-.562-2.078-1.609-.172-.422-.36-.672-.719-.719-.187-.015-.25-.093-.25-.187 0-.188.313-.328.625-.328.453 0 .844.281 1.25.86.313.452.64.655 1.031.655s.641-.14 1-.5c.266-.265.47-.5.657-.656"></path></svg>GitHub Copilot app</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Direct agents from issue to merge</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/mcp" data-analytics-event="{&quot;action&quot;:&quot;mcp_registry&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.52 1.12a3.578 3.578 0 0 1 6.078 2.98 3.578 3.578 0 0 1 2.982 6.08l-3.292 3.293a.252.252 0 0 0 0 .354l.843.843a.749.749 0 1 1-1.06 1.06l-.844-.843a1.75 1.75 0 0 1 0-2.474L13.52 9.12a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0L7.731 9.03A.75.75 0 0 1 6.67 7.97l2.85-2.85a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0l-4.799 4.8A.75.75 0 0 1 .72 5.92Z"></path><path d="M7.52 3.12a.749.749 0 1 1 1.06 1.06L5.731 7.03A2.079 2.079 0 0 0 8.67 9.97l2.85-2.85a.749.749 0 1 1 1.06 1.06l-2.849 2.85A3.578 3.578 0 0 1 4.67 5.97Z"></path></svg>MCP Registry</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Integrate external tools</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9knd_">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/actions" data-analytics-event="{&quot;action&quot;:&quot;actions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path></svg>Actions</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Automate any workflow</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/codespaces" data-analytics-event="{&quot;action&quot;:&quot;codespaces&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg>Codespaces</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Instant dev environments</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/issues" data-analytics-event="{&quot;action&quot;:&quot;issues&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg>Issues</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Plan and track work</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-review" data-analytics-event="{&quot;action&quot;:&quot;code_review&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg>Code Review</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Manage code changes</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-quality" data-analytics-event="{&quot;action&quot;:&quot;code_quality&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_quality_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codescan-checkmark NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.28 6.28a.75.75 0 1 0-1.06-1.06L6.25 8.19l-.97-.97a.75.75 0 0 0-1.06 1.06l1.5 1.5a.75.75 0 0 0 1.06 0l3.5-3.5Z"></path><path d="M7.5 15a7.5 7.5 0 1 1 5.807-2.754l2.473 2.474a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2.474-2.473A7.472 7.472 0 0 1 7.5 15Zm0-13.5a6 6 0 1 0 4.094 10.386.748.748 0 0 1 .293-.292 6.002 6.002 0 0 0 1.117-6.486A6.002 6.002 0 0 0 7.5 1.5Z"></path></svg>Code Quality</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enforce quality at merge</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dknd_">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/code-security" data-analytics-event="{&quot;action&quot;:&quot;code_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Code security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Secure your code as you build</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{&quot;action&quot;:&quot;secret_protection&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;secret_protection_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M4 4a4 4 0 0 1 8 0v2h.25c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 12.25 15h-8.5A1.75 1.75 0 0 1 2 13.25v-5.5C2 6.784 2.784 6 3.75 6H4Zm8.25 3.5h-8.5a.25.25 0 0 0-.25.25v5.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25ZM10.5 6V4a2.5 2.5 0 1 0-5 0v2Z"></path></svg>Secret protection</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_hknd_">EXPLORE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_hknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/why-github" data-analytics-event="{&quot;action&quot;:&quot;why_github&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Why GitHub</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog" data-analytics-event="{&quot;action&quot;:&quot;blog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Blog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog/changelog" data-analytics-event="{&quot;action&quot;:&quot;changelog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;changelog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Changelog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/marketplace" data-analytics-event="{&quot;action&quot;:&quot;marketplace&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;marketplace_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/features" data-analytics-event="{&quot;action&quot;:&quot;view_all_features&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all features</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_17d_">Solutions<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_17d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5l7d_">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprises&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Enterprises</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/team" data-analytics-event="{&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Small and medium teams</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise/startups" data-analytics-event="{&quot;action&quot;:&quot;startups&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Startups</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{&quot;action&quot;:&quot;nonprofits&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9l7d_">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{&quot;action&quot;:&quot;app_modernization&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">App Modernization</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{&quot;action&quot;:&quot;devsecops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevSecOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{&quot;action&quot;:&quot;ci/cd&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ci/cd_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">CI/CD</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/use-case" data-analytics-event="{&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all use cases</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dl7d_">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dl7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/healthcare" data-analytics-event="{&quot;action&quot;:&quot;healthcare&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Healthcare</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/financial-services" data-analytics-event="{&quot;action&quot;:&quot;financial_services&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Financial services</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{&quot;action&quot;:&quot;manufacturing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Manufacturing</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/government" data-analytics-event="{&quot;action&quot;:&quot;government&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Government</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/industry" data-analytics-event="{&quot;action&quot;:&quot;view_all_industries&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all industries</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions" data-analytics-event="{&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all solutions</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_1nd_">Resources<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_1nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5lnd_">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=ai" data-analytics-event="{&quot;action&quot;:&quot;ai&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">AI</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{&quot;action&quot;:&quot;software_development&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Software Development</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=security" data-analytics-event="{&quot;action&quot;:&quot;security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources/articles" data-analytics-event="{&quot;action&quot;:&quot;view_all_topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_topics_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all topics</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9lnd_">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/customer-stories" data-analytics-event="{&quot;action&quot;:&quot;customer_stories&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer stories</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/events" data-analytics-event="{&quot;action&quot;:&quot;events__webinars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;events__webinars_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Events &amp; webinars</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/whitepapers" data-analytics-event="{&quot;action&quot;:&quot;ebooks__reports&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ebooks__reports_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Ebooks &amp; reports</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/executive-insights" data-analytics-event="{&quot;action&quot;:&quot;business_insights&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;business_insights_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Business insights</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://skills.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_skills&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_skills_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Skills</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dlnd_">SUPPORT &amp; SERVICES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dlnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://support.github.com" data-analytics-event="{&quot;action&quot;:&quot;customer_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_support_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer support</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/orgs/community/discussions" data-analytics-event="{&quot;action&quot;:&quot;community_forum&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;community_forum_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Community forum</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trust-center" data-analytics-event="{&quot;action&quot;:&quot;trust_center&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trust_center_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trust center</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/partners" data-analytics-event="{&quot;action&quot;:&quot;partners&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Partners</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources" data-analytics-event="{&quot;action&quot;:&quot;view_all_resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_resources_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all resources</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_27d_">Open Source<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_27d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5m7d_">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/open-source/sponsors" data-analytics-event="{&quot;action&quot;:&quot;github_sponsors&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.586 1C12.268 1 13.5 2.37 13.5 4.25c0 1.745-.996 3.359-2.622 4.831-.166.15-.336.297-.509.438l1.116 5.584a.75.75 0 0 1-.991.852l-2.409-.876a.25.25 0 0 0-.17 0l-2.409.876a.75.75 0 0 1-.991-.852L5.63 9.519a13.78 13.78 0 0 1-.51-.438C3.497 7.609 2.5 5.995 2.5 4.25 2.5 2.37 3.732 1 5.414 1c.963 0 1.843.403 2.474 1.073L8 2.198l.112-.125a3.385 3.385 0 0 1 2.283-1.068L10.586 1Zm-3.621 9.495-.718 3.594 1.155-.42a1.75 1.75 0 0 1 1.028-.051l.168.051 1.154.42-.718-3.592c-.199.13-.37.235-.505.314l-.169.097a.75.75 0 0 1-.72 0 9.54 9.54 0 0 1-.515-.308l-.16-.105ZM10.586 2.5c-.863 0-1.611.58-1.866 1.459-.209.721-1.231.721-1.44 0C7.025 3.08 6.277 2.5 5.414 2.5 4.598 2.5 4 3.165 4 4.25c0 1.23.786 2.504 2.128 3.719.49.443 1.018.846 1.546 1.198l.325.21.076-.047.251-.163a13.341 13.341 0 0 0 1.546-1.198C11.214 6.754 12 5.479 12 4.25c0-1.085-.598-1.75-1.414-1.75Z"></path></svg>GitHub Sponsors</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Fund open source developers</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9m7d_">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://securitylab.github.com" data-analytics-event="{&quot;action&quot;:&quot;security_lab&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_lab_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security Lab</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://maintainers.github.com" data-analytics-event="{&quot;action&quot;:&quot;maintainer_community&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;maintainer_community_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Maintainer Community</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://stars.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_stars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_stars_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Stars</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://archiveprogram.github.com" data-analytics-event="{&quot;action&quot;:&quot;archive_program&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;archive_program_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Archive Program</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dm7d_">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dm7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/topics" data-analytics-event="{&quot;action&quot;:&quot;topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Topics</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trending" data-analytics-event="{&quot;action&quot;:&quot;trending&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trending</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/collections" data-analytics-event="{&quot;action&quot;:&quot;collections&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_2nd_">Enterprise<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_2nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5mnd_">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg>Enterprise platform</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9mnd_">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot/copilot-business" data-analytics-event="{&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>Copilot for Business</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise/premium-support" data-analytics-event="{&quot;action&quot;:&quot;premium_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path></svg>Premium Support</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></span></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{&quot;action&quot;:&quot;pricing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;pricing&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;pricing_link_pricing_navbar&quot;}" class="MarketingNavigation-module__navLink__hUomM">Pricing</a></li></ul></nav><div class="MarketingHeader-module__ctaContainer__tBmPz"><div class="HeaderSearch-module__searchSlot__oVOUS"><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderSearch-module__trigger__zsF9q" type="button" aria-haspopup="dialog" aria-expanded="false" aria-label="Search or jump to, type / to search" data-analytics-event="{&quot;action&quot;:&quot;searchbar&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;context&quot;:&quot;global&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"><span class="HeaderSearch-module__content__kMpxU"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search HeaderSearch-module__icon__wcrHX" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg><span class="HeaderSearch-module__label__d1iWG">Search</span><kbd class="HeaderSearch-module__kbd__HNG0o" aria-hidden="true">/</kbd></span></span></span></button><div class="d-none"></div></div><div class="AuthCTAs-module__signInWrap__q2P60"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq AuthCTAs-module__desktopActionGap__UZuXT AuthCTAs-module__hiddenBelowLg__BfKBw" href="/login?return_to=https%3A%2F%2Fgithub.com%2F96loveslife%2FECC%2Fblob%2Fmain%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/96loveslife/ECC/blob/main/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="73ce84ae50b91b53898e77ab3d5a8609563d6bbbaec1aec0eae3fbf3a001ddba"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a></div><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--secondary___gHnw_ Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=96loveslife%2FECC" data-analytics-event="{&quot;action&quot;:&quot;sign_up&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_up_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/96loveslife/ECC/blob/main/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="73ce84ae50b91b53898e77ab3d5a8609563d6bbbaec1aec0eae3fbf3a001ddba"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-secondary___eJ0_a">Sign up</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_fbd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_fbd_">Appearance settings</div></div></div></div></div><div class="MarketingHeader-module__bottomBorder__uZT38" aria-hidden="true"></div></header></div></div>
</react-partial>



      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-1e4e6481-882a-4a82-bca1-e43e9e15b78f" aria-labelledby="tooltip-b8f197c3-e33f-4ab2-8831-f18fa2fdd5a2" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-b8f197c3-e33f-4ab2-8831-f18fa2fdd5a2" for="icon-button-1e4e6481-882a-4a82-bca1-e43e9e15b78f" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>






  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      








  

    <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ym-1a7ce813a378e1f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mn-bb458474353a279e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t5-26d19272bbf73ca3.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2d5-9abb2f6ba5c935d0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/24-b11e1c4108322883.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mrn-12afac2ecd2be980.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dgq-bbf7670f9cdba2e0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7w-740b4e942974ccba.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/we-c9f93392098ad6c9.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/775-5adcc74216a7c5ae.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bn-fcef0645a47703fc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xgw-6c6cb7b2ed77f52e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ge-ca1c0ba8656f9680.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9f-e543bc691db8262e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-c7f96cdc425f375d.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.1943548049515ee8.module.css" />

<react-partial
  partial-name="global-nav-bar"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"contextRegion":{"crumbs":[{"crumb_type":"user","label":"96loveslife","is_root":false,"href":"/96loveslife"},{"crumb_type":"repository","label":"ECC","is_root":false,"octicon":"repo-forked","href":"/96loveslife/ECC"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/96loveslife/ECC","selectedLinks":["repo_source","repo_downloads","repo_commits","repo_releases","repo_tags","repo_branches","repo_packages","repo_deployments","repo_attestations"],"popoverTarget":false,"commandId":"repositories:go-to-code","reactNav":{"appTarget":"code-view","anchor":"code-view-repo-link"},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"pull-requests","icon":"git-pull-request","label":"Pull requests","href":"/96loveslife/ECC/pulls","selectedLinks":["repo_pulls","checks"],"count":0,"popoverTarget":false,"commandId":"repositories:go-to-pull-requests","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"actions","icon":"play","label":"Actions","href":"/96loveslife/ECC/actions","selectedLinks":["repo_actions"],"popoverTarget":false,"commandId":"repositories:go-to-actions","reactNav":{"appTarget":"actions-workflows","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"projects","icon":"table","label":"Projects","href":"/96loveslife/ECC/projects","selectedLinks":["repo_projects","new_repo_project","repo_project"],"popoverTarget":false,"commandId":"repositories:go-to-projects","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"security-and-quality","icon":"shield","label":"Security and quality","href":"/96loveslife/ECC/security","selectedLinks":["security","overview","alerts","policy","token_scanning","code_scanning"],"count":0,"popoverTarget":false,"commandId":"repositories:go-to-security","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"insights","icon":"graph","label":"Insights","href":"/96loveslife/ECC/pulse","selectedLinks":["repo_graphs","repo_contributors","dependency_graph","dependabot_updates","pulse","people","community"],"popoverTarget":false,"commandId":"repositories:go-to-insights","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}}],"localNavigationUpdateChannel":null,"selectedLink":"repo_source"},"owner":null,"headerLogo":{"href":"/","aria-label":"Homepage "},"notifications":{"indicatorMode":"disabled","websocketChannel":null,"fetchIndicatorSrc":"/notifications/indicator","fetchIndicatorEnabled":false},"issues":{"href":"/issues"},"pulls":{"href":"/pulls"},"contributedRepos":{"href":"/repos"},"copilot":{"show":false,"showAgentsButton":false,"showRelaunchAnnouncement":false,"copilotChatUrl":null,"copilotApiUrl":"https://api.githubcopilot.com"},"search":{"show":true,"showCommandPalette":false,"isSearchPage":false,"isJumpToSearch":false,"searchContext":{"scope":"repo:96loveslife/ECC","current_repo_name":"ECC","current_repo_nwo":"96loveslife/ECC","user_id":"96loveslife"}},"commandPalette":null,"enterpriseBar":{"show":false},"globalTransactionalMessage":[],"payloadsUrl":"/_global-navigation/payloads.json?can_toggle_site_admin_and_employee_status=0\u0026is_admin_mode_on=0\u0026is_ui_opted_out=0\u0026show_ui_opt_out=0\u0026v=6","contextRegionUrl":"/_global-navigation/context-region.json"}}</script>
  <div data-target="react-partial.reactRoot"><header aria-label="Global navigation menu" data-component="Stack" class="GlobalNav styles-module__appHeader__YzYWk prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div data-component="Stack" class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-center" data-component="Stack" class="styles-module__center__R3QRv styles-module__withLocalNavigation__rjTJ_ GlobalNavBar-module__loggedOut__Jv1rk prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion__VbSp2 prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal" data-component="Breadcrumbs"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/96loveslife" data-discover="true"><span class="">96loveslife</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/96loveslife/ECC" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">ECC</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-repo-forked styles-module__trailingIcon__sCKDh" viewBox="0 0 16 16" width="12" height="12" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path></svg></a></li></ol></nav></div><div data-testid="top-nav-right" data-component="Stack" class="styles-module__right__mlBQg styles-module__withLocalNavigation__rjTJ_ styles-module__rightWithResponsiveCreateButton__SKn2W prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="start" data-padding="normal"></div></div><h2 class="prc-src-InternalVisuallyHidden-2YaI6">Repository navigation</h2><nav class="prc-components-UnderlineWrapper-eT-Yj prc-UnderlineNav-UnderlineWrapper-GWONT LocalNavigation-module__LocalNavigation__b0Xc0" aria-label="Repository" data-variant="inset" data-overflow-mode="wrap" data-hide-icons-breakpoint="medium"><ul class="prc-UnderlineNav-ItemsList-oj8gN prc-components-UnderlineItemList-xKlKC" role="list"><li role="presentation" aria-hidden="true" class="prc-UnderlineNav-WrapSpacer--aLgz"></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a aria-current="page" data-tab-item="code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/96loveslife/ECC" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" data-content="Code">Code</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="pull-requests" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/96loveslife/ECC/pulls" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path></svg></span><span data-component="text" data-content="Pull requests">Pull requests</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="actions" data-react-nav="actions-workflows" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/96loveslife/ECC/actions" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-play" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg></span><span data-component="text" data-content="Actions">Actions</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="projects" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/96loveslife/ECC/projects" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-table" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path></svg></span><span data-component="text" data-content="Projects">Projects</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="security-and-quality" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/96loveslife/ECC/security" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg></span><span data-component="text" data-content="Security and quality">Security and quality</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="insights" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/96loveslife/ECC/pulse" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></span><span data-component="text" data-content="Insights">Insights</span></a></li></ul><div class="prc-UnderlineNav-MoreButtonContainer-Dnrq6"><div class="prc-UnderlineNav-MoreButtonDivider-dN0a-"></div><button data-component="overflow-menu-button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk prc-UnderlineNav-MoreButton-Y8soj" data-loading="false" data-size="medium" data-variant="invisible" id="_R_2ktl_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><span>More<span class="prc-src-InternalVisuallyHidden-2YaI6"> items</span></span></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></nav><div class="d-none"></div></header></div>
</react-partial>


  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








<react-app
  app-name="code-view"
  initial-path="/96loveslife/ECC/blob/main/README.md"
  style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobRoute":{"csv":null,"csvError":null,"headerInfo":{"toc":[{"level":2,"text":"Install with Claude Code","anchor":"install-with-claude-code","htmlText":"Install with Claude Code"},{"level":1,"text":"ECC","anchor":"ecc","htmlText":"ECC"},{"level":2,"text":"Install ECC","anchor":"install-ecc","htmlText":"Install ECC"},{"level":3,"text":"Recommended: universal guided setup","anchor":"recommended-universal-guided-setup","htmlText":"Recommended: universal guided setup"},{"level":4,"text":"Windows first-time walkthrough","anchor":"windows-first-time-walkthrough","htmlText":"Windows first-time walkthrough"},{"level":3,"text":"Pick one path only (per harness)","anchor":"pick-one-path-only-per-harness","htmlText":"Pick one path only (per harness)"},{"level":3,"text":"Claude Code details","anchor":"claude-code-details","htmlText":"Claude Code details"},{"level":3,"text":"Codex App and CLI","anchor":"codex-app-and-cli","htmlText":"Codex App and CLI"},{"level":3,"text":"Other agents and editors","anchor":"other-agents-and-editors","htmlText":"Other agents and editors"},{"level":2,"text":"Advanced Install Options","anchor":"advanced-install-options","htmlText":"Advanced Install Options"},{"level":3,"text":"Low-context / no-hooks path","anchor":"low-context--no-hooks-path","htmlText":"Low-context / no-hooks path"},{"level":3,"text":"Find the right components first","anchor":"find-the-right-components-first","htmlText":"Find the right components first"},{"level":4,"text":"Install hooks","anchor":"install-hooks","htmlText":"Install hooks"},{"level":4,"text":"Configure MCPs","anchor":"configure-mcps","htmlText":"Configure MCPs"},{"level":3,"text":"Reset / Uninstall ECC","anchor":"reset--uninstall-ecc","htmlText":"Reset / Uninstall ECC"},{"level":2,"text":"Start Using ECC","anchor":"start-using-ecc","htmlText":"Start Using ECC"},{"level":2,"text":"Self-Hosted Models and Custom Endpoints","anchor":"self-hosted-models-and-custom-endpoints","htmlText":"Self-Hosted Models and Custom Endpoints"},{"level":3,"text":"Self-host Kimi with ECC + Itô compute","anchor":"self-host-kimi-with-ecc--itô-compute","htmlText":"Self-host Kimi with ECC + Itô compute"},{"level":3,"text":"Itô compute CLI bridge","anchor":"itô-compute-cli-bridge","htmlText":"Itô compute CLI bridge"},{"level":2,"text":"What's New","anchor":"whats-new","htmlText":"What's New"},{"level":3,"text":"v2.0.0: The Agent Harness Operating System (Jun 2026)","anchor":"v200-the-agent-harness-operating-system-jun-2026","htmlText":"v2.0.0: The Agent Harness Operating System (Jun 2026)"},{"level":2,"text":"What's Inside","anchor":"whats-inside","htmlText":"What's Inside"},{"level":2,"text":"Key Concepts","anchor":"key-concepts","htmlText":"Key Concepts"},{"level":3,"text":"Agents","anchor":"agents","htmlText":"Agents"},{"level":3,"text":"Skills","anchor":"skills","htmlText":"Skills"},{"level":3,"text":"Hooks","anchor":"hooks","htmlText":"Hooks"},{"level":3,"text":"Rules","anchor":"rules","htmlText":"Rules"},{"level":2,"text":"Guides","anchor":"guides","htmlText":"Guides"},{"level":2,"text":"Why Choose ECC?","anchor":"why-choose-ecc","htmlText":"Why Choose ECC?"},{"level":3,"text":"TDD: Test-Driven Development","anchor":"tdd-test-driven-development","htmlText":"TDD: Test-Driven Development"},{"level":3,"text":"Skills keep the context focused","anchor":"skills-keep-the-context-focused","htmlText":"Skills keep the context focused"},{"level":3,"text":"Share context between harnesses","anchor":"share-context-between-harnesses","htmlText":"Share context between harnesses"},{"level":2,"text":"Platform Support","anchor":"platform-support","htmlText":"Platform Support"},{"level":3,"text":"Cross-tool capability map","anchor":"cross-tool-capability-map","htmlText":"Cross-tool capability map"},{"level":4,"text":"What's included for Cursor","anchor":"whats-included-for-cursor","htmlText":"What's included for Cursor"},{"level":4,"text":"Cursor loading notes","anchor":"cursor-loading-notes","htmlText":"Cursor loading notes"},{"level":4,"text":"Memory and data isolation (Cursor + Claude Code)","anchor":"memory-and-data-isolation-cursor--claude-code","htmlText":"Memory and data isolation (Cursor + Claude Code)"},{"level":4,"text":"Hook architecture (DRY adapter pattern)","anchor":"hook-architecture-dry-adapter-pattern","htmlText":"Hook architecture (DRY adapter pattern)"},{"level":4,"text":"Rules format","anchor":"rules-format","htmlText":"Rules format"},{"level":4,"text":"What's included in the repo and legacy configuration layer","anchor":"whats-included-in-the-repo-and-legacy-configuration-layer","htmlText":"What's included in the repo and legacy configuration layer"},{"level":4,"text":"Key limitation","anchor":"key-limitation","htmlText":"Key limitation"},{"level":4,"text":"Multi-agent support","anchor":"multi-agent-support","htmlText":"Multi-agent support"},{"level":4,"text":"Hook support via plugins","anchor":"hook-support-via-plugins","htmlText":"Hook support via plugins"},{"level":4,"text":"Plugin installation","anchor":"plugin-installation","htmlText":"Plugin installation"},{"level":4,"text":"Documentation","anchor":"documentation","htmlText":"Documentation"},{"level":4,"text":"What's included for GitHub Copilot","anchor":"whats-included-for-github-copilot","htmlText":"What's included for GitHub Copilot"},{"level":4,"text":"Feature coverage","anchor":"feature-coverage","htmlText":"Feature coverage"},{"level":4,"text":"Limitations","anchor":"limitations","htmlText":"Limitations"},{"level":2,"text":"Token Optimization","anchor":"token-optimization","htmlText":"Token Optimization"},{"level":2,"text":"Requirements","anchor":"requirements","htmlText":"Requirements"},{"level":3,"text":"Claude Code CLI version","anchor":"claude-code-cli-version","htmlText":"Claude Code CLI version"},{"level":3,"text":"Important: hooks auto-loading behavior","anchor":"important-hooks-auto-loading-behavior","htmlText":"Important: hooks auto-loading behavior"},{"level":2,"text":"Security","anchor":"security","htmlText":"Security"},{"level":2,"text":"Ecosystem Tools","anchor":"ecosystem-tools","htmlText":"Ecosystem Tools"},{"level":3,"text":"Option A: Local Analysis (Built-in)","anchor":"option-a-local-analysis-built-in","htmlText":"Option A: Local Analysis (Built-in)"},{"level":3,"text":"Option B: GitHub App (Advanced)","anchor":"option-b-github-app-advanced","htmlText":"Option B: GitHub App (Advanced)"},{"level":2,"text":"Troubleshooting","anchor":"troubleshooting","htmlText":"Troubleshooting"},{"level":2,"text":"Running Tests","anchor":"running-tests","htmlText":"Running Tests"},{"level":2,"text":"Background","anchor":"background","htmlText":"Background"},{"level":2,"text":"Community and Project","anchor":"community-and-project","htmlText":"Community and Project"},{"level":2,"text":"Links","anchor":"links","htmlText":"Links"},{"level":2,"text":"License","anchor":"license","htmlText":"License"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/96loveslife/ECC/blob/main/assets/hero.png\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/hero.png\" alt=\"ECC - the agent harness operating system\" width=\"100%\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://www.star-history.com/affaan-m/ecc\" rel=\"nofollow\"\u003e\n    \u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://camo.githubusercontent.com/89e23204f4479e2102777593dd15e472b836635279ecf88fdc7cb07a92e2adcc/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d7472656e64696e67267468656d653d6461726b\" data-canonical-src=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026amp;type=trending\u0026amp;theme=dark\"\u003e\n      \u003cimg src=\"https://camo.githubusercontent.com/77eabde1160297b928231b6d4f1a52e498f1b8f692d844582833bd7f5953e01e/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d7472656e64696e67\" alt=\"GitHub Trending Repository of the Day\" height=\"46\" data-canonical-src=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026amp;type=trending\"\u003e\n    \u003c/picture\u003e\u003c/themed-picture\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.star-history.com/affaan-m/ecc\" rel=\"nofollow\"\u003e\n    \u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://camo.githubusercontent.com/30115847fc806c8e13a20d1073fb4bc867fafb70919765f91fd751372ce9d77e/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d72616e6b267468656d653d6461726b\" data-canonical-src=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026amp;type=rank\u0026amp;theme=dark\"\u003e\n      \u003cimg src=\"https://camo.githubusercontent.com/3136630c523b4020a57af66c24d84bf23a8a011acbdf3a879359c7e622f14785/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d72616e6b\" alt=\"Star History Global Rank\" height=\"46\" data-canonical-src=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026amp;type=rank\"\u003e\n    \u003c/picture\u003e\u003c/themed-picture\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003cstrong\u003eLanguage:\u003c/strong\u003e\n  \u003ca href=\"/96loveslife/ECC/blob/main/README.md\"\u003eEnglish\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/pt-BR/README.md\"\u003ePortuguês (Brasil)\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/README.zh-CN.md\"\u003e简体中文\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/zh-TW/README.md\"\u003e繁體中文\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/ja-JP/README.md\"\u003e日本語\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/ko-KR/README.md\"\u003e한국어\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/tr/README.md\"\u003eTürkçe\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/ru/README.md\"\u003eРусский\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/vi-VN/README.md\"\u003eTiếng Việt\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/th/README.md\"\u003eไทย\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/de-DE/README.md\"\u003eDeutsch\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/es/README.md\"\u003eEspañol\u003c/a\u003e |\n  \u003ca href=\"/96loveslife/ECC/blob/main/docs/uk-UA/README.md\"\u003eУкраїнська\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://discord.gg/36yGMHGFbR\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/77717a21d31c41e48dcfc10bbc055bf8c73689ef7d11e4bb8cabea52844f1cf0/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f313439363634343430303539303039343534303f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465266c6162656c3d446973636f726426636f6c6f723d353836354632\" alt=\"Discord\" data-canonical-src=\"https://img.shields.io/discord/1496644400590094540?logo=discord\u0026amp;logoColor=white\u0026amp;label=Discord\u0026amp;color=5865F2\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://ecc.tools\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/1ada92aaab0ab6e0df7f5025ed0b6d8471148bb34cd768dd74ac713ac23cbc74/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f576562736974652d6563632e746f6f6c732d4530373835363f6c6f676f3d676f6f676c656368726f6d65266c6f676f436f6c6f723d7768697465\" alt=\"Website\" data-canonical-src=\"https://img.shields.io/badge/Website-ecc.tools-E07856?logo=googlechrome\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/apps/ecc-tools\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4e91ad3bc3029b083dc5087c99f0b1de828b95dccb029f553a3859136e5bb29d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769744875622532304170702d454343253230546f6f6c732d3138313731373f6c6f676f3d676974687562266c6f676f436f6c6f723d7768697465\" alt=\"GitHub App\" data-canonical-src=\"https://img.shields.io/badge/GitHub%20App-ECC%20Tools-181717?logo=github\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"/96loveslife/ECC/blob/main/LICENSE\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667\" alt=\"MIT license\" data-canonical-src=\"https://img.shields.io/badge/license-MIT-blue.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://github.com/affaan-m/ECC\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9ab2c0d5048e035817aa6d87e5a8f574a74fbb223dc343b974989ff1c2a0b9e2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f61666661616e2d6d2f4543433f7374796c653d666c6174\" alt=\"GitHub stars\" data-canonical-src=\"https://img.shields.io/github/stars/affaan-m/ECC?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/affaan-m/ECC/forks\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/33a5979991b05c0db1b1fcde6da576ebb0e81554256d88dba83406a1fe2c48b7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f61666661616e2d6d2f4543433f7374796c653d666c6174\" alt=\"GitHub forks\" data-canonical-src=\"https://img.shields.io/github/forks/affaan-m/ECC?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/affaan-m/ECC/graphs/contributors\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5a0d83fabc720cc81aa3c6732e5760bde825d566dcf467ede3019fd3a2535630/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f61666661616e2d6d2f4543433f7374796c653d666c6174\" alt=\"Contributors\" data-canonical-src=\"https://img.shields.io/github/contributors/affaan-m/ECC?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/marketplace/ecc-tools\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/742364151c03913182f055ebbbcae77890450184ebde87dfd0ae9419f9690b11/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470732533412532462532466170692e6563632e746f6f6c732532466261646765253246696e7374616c6c73266c6f676f3d676974687562\" alt=\"GitHub App installs\" data-canonical-src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.ecc.tools%2Fbadge%2Finstalls\u0026amp;logo=github\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/ecc-universal\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/02c234671fee6ff50f779d8ddbed321b50ab2decffefd85e3c0ca4181ed80c39/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6563632d756e6976657273616c3f6c6162656c3d6563632d756e6976657273616c266c6f676f3d6e706d\" alt=\"ecc-universal npm downloads\" data-canonical-src=\"https://img.shields.io/npm/dw/ecc-universal?label=ecc-universal\u0026amp;logo=npm\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/ecc-agentshield\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ee6c87f7675899b8498f57a5a0ae75ab6196e6f8a7bb74651e36d52740e94255/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6563632d6167656e74736869656c643f6c6162656c3d6563632d6167656e74736869656c64266c6f676f3d6e706d\" alt=\"ecc-agentshield npm downloads\" data-canonical-src=\"https://img.shields.io/npm/dw/ecc-agentshield?label=ecc-agentshield\u0026amp;logo=npm\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/47d7f79e8524602f5b32c57347c8302258c70edb254c31655ab99452165cfcc0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5368656c6c2d3445414132353f6c6f676f3d676e752d62617368266c6f676f436f6c6f723d7768697465\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/47d7f79e8524602f5b32c57347c8302258c70edb254c31655ab99452165cfcc0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5368656c6c2d3445414132353f6c6f676f3d676e752d62617368266c6f676f436f6c6f723d7768697465\" alt=\"Shell\" data-canonical-src=\"https://img.shields.io/badge/-Shell-4EAA25?logo=gnu-bash\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/10350e1c35e1cdfee8ae471db125c23bd37448d6fec75b7baf39edb6f351482a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d547970655363726970742d3331373843363f6c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/10350e1c35e1cdfee8ae471db125c23bd37448d6fec75b7baf39edb6f351482a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d547970655363726970742d3331373843363f6c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465\" alt=\"TypeScript\" data-canonical-src=\"https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/75f630e9fdd61ed09f6651d5e22192b7b90dd55b80d52f70145b2f5e693e6197/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d507974686f6e2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/75f630e9fdd61ed09f6651d5e22192b7b90dd55b80d52f70145b2f5e693e6197/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d507974686f6e2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465\" alt=\"Python\" data-canonical-src=\"https://img.shields.io/badge/-Python-3776AB?logo=python\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/166dcd0f9ef7af21be18a1c8b5a39b1c8bf5aa881032a24e0fa1f566196d6a92/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d476f2d3030414444383f6c6f676f3d676f266c6f676f436f6c6f723d7768697465\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/166dcd0f9ef7af21be18a1c8b5a39b1c8bf5aa881032a24e0fa1f566196d6a92/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d476f2d3030414444383f6c6f676f3d676f266c6f676f436f6c6f723d7768697465\" alt=\"Go\" data-canonical-src=\"https://img.shields.io/badge/-Go-00ADD8?logo=go\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/79f88e1f86ed963337905d6efe3a263af5f2e297b3f2f2a51f2dbc95f77d64aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4a6176612d4544384230303f6c6f676f3d6f70656e6a646b266c6f676f436f6c6f723d7768697465\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/79f88e1f86ed963337905d6efe3a263af5f2e297b3f2f2a51f2dbc95f77d64aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4a6176612d4544384230303f6c6f676f3d6f70656e6a646b266c6f676f436f6c6f723d7768697465\" alt=\"Java\" data-canonical-src=\"https://img.shields.io/badge/-Java-ED8B00?logo=openjdk\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/5b8542cc58a252055e3d55d8d08c6164afad743f44b05a6d0b1bd1d3979f6743/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5065726c2d3339343537453f6c6f676f3d7065726c266c6f676f436f6c6f723d7768697465\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5b8542cc58a252055e3d55d8d08c6164afad743f44b05a6d0b1bd1d3979f6743/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5065726c2d3339343537453f6c6f676f3d7065726c266c6f676f436f6c6f723d7768697465\" alt=\"Perl\" data-canonical-src=\"https://img.shields.io/badge/-Perl-39457E?logo=perl\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/7ccf587ad1350a6018f00f16cfa83000bbc186e4f713e0fd63ed79f43dd6e1d9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4d61726b646f776e2d3030303030303f6c6f676f3d6d61726b646f776e266c6f676f436f6c6f723d7768697465\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/7ccf587ad1350a6018f00f16cfa83000bbc186e4f713e0fd63ed79f43dd6e1d9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4d61726b646f776e2d3030303030303f6c6f676f3d6d61726b646f776e266c6f676f436f6c6f723d7768697465\" alt=\"Markdown\" data-canonical-src=\"https://img.shields.io/badge/-Markdown-000000?logo=markdown\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-alert markdown-alert-warning\" dir=\"auto\"\u003e\u003cp class=\"markdown-alert-title\" dir=\"auto\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-alert mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\u003e\u003c/path\u003e\u003c/svg\u003eWarning\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003cstrong\u003eOfficial sources only.\u003c/strong\u003e Install ECC only from verified channels: the GitHub repository \u003ca href=\"https://github.com/affaan-m/ECC\"\u003egithub.com/affaan-m/ECC\u003c/a\u003e, the npm packages \u003ca href=\"https://www.npmjs.com/package/ecc-universal\" rel=\"nofollow\"\u003e\u003ccode\u003eecc-universal\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://www.npmjs.com/package/ecc-agentshield\" rel=\"nofollow\"\u003e\u003ccode\u003eecc-agentshield\u003c/code\u003e\u003c/a\u003e, the \u003ca href=\"https://github.com/apps/ecc-tools\"\u003eGitHub App\u003c/a\u003e, the plugin slug \u003ccode\u003eecc@ecc\u003c/code\u003e, and the project website \u003ca href=\"https://ecc.tools\" rel=\"nofollow\"\u003eecc.tools\u003c/a\u003e. Third-party re-uploads and unofficial mirrors are not maintained or reviewed by the project and may contain malware.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstall with Claude Code\u003c/h2\u003e\u003ca id=\"user-content-install-with-claude-code\" class=\"anchor\" aria-label=\"Permalink: Install with Claude Code\" href=\"#install-with-claude-code\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse the \u003ca href=\"#install-ecc\"\u003eguided setup\u003c/a\u003e or \u003ca href=\"#claude-code-details\"\u003enative plugin commands\u003c/a\u003e. Both install the same \u003ccode\u003eecc@ecc\u003c/code\u003e plugin. Choose one and do not stack a full manual Claude install on top.\u003c/p\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable aria-label=\"ECC primary links\"\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n  \u003ca href=\"https://ecc.tools/pricing\" rel=\"nofollow\"\u003e\n    \u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/community/ecc-tools-mark.svg\" height=\"42\" alt=\"ECC Tools\" style=\"max-width: 100%; height: auto; max-height: 42px;\"\u003e\u003cbr\u003e\n    \u003cstrong\u003eECC Pro + GitHub App\u003c/strong\u003e\n  \u003c/a\u003e\u003cbr\u003e\n  \u003csub\u003e\u003ca href=\"https://github.com/apps/ecc-tools\"\u003eInstall free\u003c/a\u003e · \u003ca href=\"https://ecc.tools/pricing\" rel=\"nofollow\"\u003ePrivate repos from $19/seat/mo\u003c/a\u003e\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n  \u003ca href=\"https://github.com/sponsors/affaan-m\"\u003e\n    \u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/community/heart.svg\" height=\"42\" alt=\"\" style=\"max-width: 100%; height: auto; max-height: 42px;\"\u003e\u003cbr\u003e\n    \u003cstrong\u003eSponsor ECC\u003c/strong\u003e\n  \u003c/a\u003e\u003cbr\u003e\n  \u003csub\u003eFund the open-source project\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n  \u003ca href=\"https://discord.gg/36yGMHGFbR\" rel=\"nofollow\"\u003e\n    \u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/community/discord.svg\" height=\"42\" alt=\"Discord\" style=\"max-width: 100%; height: auto; max-height: 42px;\"\u003e\u003cbr\u003e\n    \u003cstrong\u003eCommunity\u003c/strong\u003e\n  \u003c/a\u003e\u003cbr\u003e\n  \u003csub\u003eDiscord · Q\u0026amp;A · Show and Tell\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003csub\u003e\u003cstrong\u003eOSS stays free.\u003c/strong\u003e This repo is MIT-licensed forever. ECC Pro is the hosted GitHub App for private repos. \u003ca href=\"https://github.com/sponsors/affaan-m\"\u003eSponsors\u003c/a\u003e and \u003ca href=\"https://ecc.tools/pricing\" rel=\"nofollow\"\u003ePro subscribers\u003c/a\u003e fund the work. That's why a single maintainer ships weekly across 7 harnesses.\u003c/sub\u003e\u003c/p\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cp dir=\"auto\"\u003e\u003csub\u003e\u003cstrong\u003ePartners \u0026amp; sponsors\u003c/strong\u003e\u003c/sub\u003e\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://www.coderabbit.ai\" title=\"CodeRabbit\" rel=\"nofollow\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/sponsors/coderabbit.png\" height=\"54\" alt=\"CodeRabbit\" style=\"max-width: 100%; height: auto; max-height: 54px;\"\u003e\u003c/a\u003e   \n  \u003ca href=\"https://www.greptile.com/go/ecc\" title=\"Greptile\" rel=\"nofollow\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/sponsors/greptile.png\" height=\"54\" alt=\"Greptile\" style=\"max-width: 100%; height: auto; max-height: 54px;\"\u003e\u003c/a\u003e   \n  \u003ca href=\"https://platform.kimi.ai?aff=ecc\" title=\"Moonshot AI - Kimi\" rel=\"nofollow\"\u003e\u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot-dark.png\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot.png\" width=\"132\" alt=\"Moonshot AI - Kimi\"\u003e\u003c/picture\u003e\u003c/themed-picture\u003e\u003c/a\u003e   \n  \u003ca href=\"https://compute.itomarkets.com\" title=\"Itô Markets\" rel=\"nofollow\"\u003e\u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: light)\" srcset=\"/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent-light.png\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent.png\" width=\"96\" alt=\"Itô Markets\"\u003e\u003c/picture\u003e\u003c/themed-picture\u003e\u003c/a\u003e   \n  \u003ca href=\"https://serpapi.com/github-ecc\" title=\"SerpApi: Web Search API\" rel=\"nofollow\"\u003e\u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"/96loveslife/ECC/raw/main/assets/images/sponsors/serpapi-logo-dark-mode.svg\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/sponsors/serpapi-logo-light-mode.svg\" width=\"200\" alt=\"SerpApi: Web Search API\"\u003e\u003c/picture\u003e\u003c/themed-picture\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003csub\u003e\u003cstrong\u003ePast sponsors:\u003c/strong\u003e \u003ca href=\"https://www.atlascloud.ai/?utm_source=github\u0026amp;utm_medium=link\u0026amp;utm_campaign=ECC\" rel=\"nofollow\"\u003eAtlas Cloud\u003c/a\u003e\u003c/sub\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003csub\u003e\u003cstrong\u003eCommunity sponsors:\u003c/strong\u003e \u003ca href=\"https://github.com/mikejmorgan-ai\"\u003eMike Morgan\u003c/a\u003e · \u003ca href=\"https://github.com/jasonwu513\"\u003e@jasonwu513\u003c/a\u003e · \u003ca href=\"https://github.com/1anter\"\u003e@1anter\u003c/a\u003e · \u003ca href=\"https://github.com/massimotodaro\"\u003e@massimotodaro\u003c/a\u003e · \u003ca href=\"https://github.com/meadmccabe\"\u003e@meadmccabe\u003c/a\u003e\u003c/sub\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003csub\u003e\u003ca href=\"https://github.com/sponsors/affaan-m\"\u003e\u003cstrong\u003eBecome a Sponsor\u003c/strong\u003e\u003c/a\u003e · \u003ca href=\"/96loveslife/ECC/blob/main/SPONSORS.md\"\u003eSponsor Tiers\u003c/a\u003e · \u003ca href=\"/96loveslife/ECC/blob/main/SPONSORING.md\"\u003eSponsorship Program\u003c/a\u003e\u003c/sub\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca href=\"#install-ecc\"\u003eJump to install ↓\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eECC\u003c/h1\u003e\u003ca id=\"user-content-ecc\" class=\"anchor\" aria-label=\"Permalink: ECC\" href=\"#ecc\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYour agent can write code, but ECC gives it a coordinated engineering system and toolbox: it plans before it builds, verifies changes with tests, reviews its own work from a fresh context, remembers what matters, and turns repeated wins into reusable skills and workflows.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"plan -\u0026gt; test -\u0026gt; implement -\u0026gt; review -\u0026gt; verify -\u0026gt; remember -\u0026gt; improve\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003eplan -\u0026gt; test -\u0026gt; implement -\u0026gt; review -\u0026gt; verify -\u0026gt; remember -\u0026gt; improve\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eInstead of rebuilding that process in every prompt, you install it once and make it part of how your agent works.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eOptimize the context window. Persist everything else.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eECC is MIT-licensed open source. It works best with Claude Code today, has a supported Codex sync path, and provides capability-limited adapters for Cursor, OpenCode, Gemini, Zed, GitHub Copilot, Antigravity, Qwen, and other harnesses. See the \u003ca href=\"#platform-support\"\u003esupport status matrix\u003c/a\u003e before assuming feature parity.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAccess to 68 agents, 292 skills, and 94 legacy command shims, plus hooks, rules, memory, continuous learning, and AgentShield security scanning. The agents are specialized for planning, review, build repair, security, architecture, and domain work.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eIncluded\u003c/th\u003e\n\u003cth align=\"right\"\u003eCount\u003c/th\u003e\n\u003cth\u003eWhat it gives you\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgents\u003c/td\u003e\n\u003ctd align=\"right\"\u003e68 agents\u003c/td\u003e\n\u003ctd\u003ePlanning, review, build repair, security, architecture, and domain work\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSkills\u003c/td\u003e\n\u003ctd align=\"right\"\u003e292 skills\u003c/td\u003e\n\u003ctd\u003eTDD, research, security, docs, frontend, data, ML, operations, and more\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCommands\u003c/td\u003e\n\u003ctd align=\"right\"\u003e94 commands\u003c/td\u003e\n\u003ctd\u003eConvenient entry points while ECC moves to a skills-first surface\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHooks and memory\u003c/td\u003e\n\u003ctd align=\"right\"\u003eRuntime\u003c/td\u003e\n\u003ctd\u003eEnforcement, session summaries, continuous learning, instincts, and context controls\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRules\u003c/td\u003e\n\u003ctd align=\"right\"\u003eSelective\u003c/td\u003e\n\u003ctd\u003eAlways-loaded standards you choose by language or project\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgentShield\u003c/td\u003e\n\u003ctd align=\"right\"\u003eIncluded\u003c/td\u003e\n\u003ctd\u003eScanning for prompts, hooks, MCP config, permissions, secrets, and agent files\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://www.star-history.com/affaan-m/ecc\" rel=\"nofollow\"\u003e\n    \u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://camo.githubusercontent.com/5f9c74099d0017cc0bdd72d85ac3832f241a94c7263f0ba56f1a39feb1fb845a/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d61666661616e2d6d2f45434326747970653d44617465267468656d653d6461726b\" data-canonical-src=\"https://api.star-history.com/svg?repos=affaan-m/ECC\u0026amp;type=Date\u0026amp;theme=dark\"\u003e\n      \u003cimg src=\"https://camo.githubusercontent.com/17589e705dc9b9e877e7e45acb7281c298fdc5a55f3e86d61fa1acf10677493a/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d61666661616e2d6d2f45434326747970653d44617465\" alt=\"Live star history chart for affaan-m/ECC\" width=\"100%\" data-canonical-src=\"https://api.star-history.com/svg?repos=affaan-m/ECC\u0026amp;type=Date\"\u003e\n    \u003c/picture\u003e\u003c/themed-picture\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstall ECC\u003c/h2\u003e\u003ca id=\"user-content-install-ecc\" class=\"anchor\" aria-label=\"Permalink: Install ECC\" href=\"#install-ecc\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-alert markdown-alert-important\" dir=\"auto\"\u003e\u003cp class=\"markdown-alert-title\" dir=\"auto\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-report mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\u003e\u003c/path\u003e\u003c/svg\u003eImportant\u003c/p\u003e\u003cp dir=\"auto\"\u003eECC 2.2 includes guided package setup for Claude Code, Codex, and Kimi Code.\nThe universal package requires Node.js 18 or newer. Claude plugin setup also\nrequires Git and Claude Code 2.1 or newer on \u003ccode\u003ePATH\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRecommended: universal guided setup\u003c/h3\u003e\u003ca id=\"user-content-recommended-universal-guided-setup\" class=\"anchor\" aria-label=\"Permalink: Recommended: universal guided setup\" href=\"#recommended-universal-guided-setup\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor Claude Code plugin setup, updates, scope changes, and hook-profile changes:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 setup\"\u003e\u003cpre\u003enpx ecc-universal@2.2.2 setup\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWindows first-time walkthrough\u003c/h4\u003e\u003ca id=\"user-content-windows-first-time-walkthrough\" class=\"anchor\" aria-label=\"Permalink: Windows first-time walkthrough\" href=\"#windows-first-time-walkthrough\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you are new to command-line tools, use this copy-and-paste path:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eInstall Node.js 18 or newer, Git, and Claude Code.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOpen \u003cstrong\u003ePowerShell\u003c/strong\u003e from the Windows Start menu.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eConfirm that each prerequisite is available:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"node --version\ngit --version\nclaude --version\"\u003e\u003cpre\u003enode \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003eversion\ngit \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003eversion\nclaude \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003eversion\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eRun the guided installer:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 setup\"\u003e\u003cpre\u003enpx ecc\u003cspan class=\"pl-k\"\u003e-\u003c/span\u003euniversal\u003cspan class=\"pl-smi\"\u003e@2\u003cspan class=\"pl-smi\"\u003e.2.2\u003c/span\u003e\u003c/span\u003e setup\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eFor a typical personal setup, choose \u003cstrong\u003eGlobal user\u003c/strong\u003e, choose \u003cstrong\u003eStandard\u003c/strong\u003e hooks, and confirm.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eStart a new Claude Code session and run \u003ccode\u003e/plugin list\u003c/code\u003e to verify that \u003ccode\u003eecc@ecc\u003c/code\u003e is enabled.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eThis path does not require cloning the repository. If any prerequisite command is not found, install or repair that prerequisite before rerunning ECC setup.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf npm reports a version or cache error, confirm the registry version before retrying:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm view ecc-universal version\"\u003e\u003cpre\u003enpm view ecc-universal version\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eECC 2.2 supports the same guided setup through modern package runners:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePackage runner\u003c/th\u003e\n\u003cth\u003eGuided setup command\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003enpm / npx\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enpx ecc-universal@2.2.2 setup\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003epnpm\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epnpm dlx ecc-universal@2.2.2 setup\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eYarn 2+\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eyarn dlx ecc-universal@2.2.2 setup\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBun\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebunx ecc-universal@2.2.2 setup\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eThe examples select \u003ca href=\"https://www.npmjs.com/package/ecc-universal/v/2.2.2\" rel=\"nofollow\"\u003ethe published ECC 2.2.2 release\u003c/a\u003e, matching this repository's release version. A version pin is not a security audit or an integrity check. Review the release source and registry integrity before running package code; use a reviewed checkout for unreleased changes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYarn Classic 1 does not provide \u003ccode\u003eyarn dlx\u003c/code\u003e; use \u003ccode\u003enpx\u003c/code\u003e, install the package globally, or upgrade Yarn for a temporary one-shot run.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe wizard inventories the official marketplace and every native Claude install scope before making changes, then installs, updates, or safely moves \u003ccode\u003eecc@ecc\u003c/code\u003e to the scope you choose. Rerun the same command whenever you want to update ECC, change scope, or change its hook profile. This setup wizard currently configures the Claude Code plugin; use the multi-harness wizard below for Codex or Kimi Code.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo configure more than one coding agent in one reviewed flow, use the multi-harness wizard:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 install --guided\"\u003e\u003cpre\u003enpx ecc-universal@2.2.2 install --guided\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt lets you select any combination of Claude Code, Codex, and Kimi Code, shows each install channel and destination, preflights every selection before the first write, and asks for one final confirmation.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eHarness\u003c/th\u003e\n\u003cth\u003eGuided install behavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eClaude Code\u003c/td\u003e\n\u003ctd\u003eNative \u003ccode\u003eecc@ecc\u003c/code\u003e plugin with one \u003ccode\u003euser\u003c/code\u003e, \u003ccode\u003eproject\u003c/code\u003e, or \u003ccode\u003elocal\u003c/code\u003e scope and an ECC hook profile\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCodex\u003c/td\u003e\n\u003ctd\u003eNative Codex marketplace/plugin lifecycle; hook review and trust remain Codex-owned\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKimi Code\u003c/td\u003e\n\u003ctd\u003eManaged project files under \u003ccode\u003e./.kimi-code\u003c/code\u003e; ECC hooks, model/provider settings, and authentication are not configured\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eFor automation, make every provider-specific choice explicit:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 install --guided \\\n  --harness claude --harness codex --harness kimi \\\n  --claude-scope local --claude-hooks standard \\\n  --profile core --yes\"\u003e\u003cpre\u003enpx ecc-universal@2.2.2 install --guided \\\n  --harness claude --harness codex --harness kimi \\\n  --claude-scope \u003cspan class=\"pl-k\"\u003elocal\u003c/span\u003e --claude-hooks standard \\\n  --profile core --yes\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eVerify the native guided Codex path and managed Kimi path without writing first:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 install --guided --harness codex --dry-run\nnpx ecc-universal@2.2.2 install --profile core --target kimi --dry-run\"\u003e\u003cpre\u003enpx ecc-universal@2.2.2 install --guided --harness codex --dry-run\nnpx ecc-universal@2.2.2 install --profile core --target kimi --dry-run\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdditional package-name commands are also available through the 2.2 alias:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 consult \u0026quot;security reviews\u0026quot; --target claude\nnpx ecc-universal@2.2.2 install --profile minimal --target claude --with capability:machine-learning\nnpx ecc-universal@2.2.2 doctor --target kimi\"\u003e\u003cpre\u003enpx ecc-universal@2.2.2 consult \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esecurity reviews\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --target claude\nnpx ecc-universal@2.2.2 install --profile minimal --target claude --with capability:machine-learning\nnpx ecc-universal@2.2.2 doctor --target kimi\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDo not use \u003ccode\u003enpx ecc-install --profile minimal --target claude\u003c/code\u003e: \u003ccode\u003eecc-install\u003c/code\u003e is a binary name inside \u003ccode\u003eecc-universal\u003c/code\u003e, not a separately published npm package.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eECC also ships advanced managed adapters for \u003ccode\u003ecursor\u003c/code\u003e, \u003ccode\u003eantigravity\u003c/code\u003e, \u003ccode\u003egemini\u003c/code\u003e, \u003ccode\u003eopencode\u003c/code\u003e, \u003ccode\u003ecodebuddy\u003c/code\u003e, \u003ccode\u003ejoycode\u003c/code\u003e, \u003ccode\u003eqwen\u003c/code\u003e, \u003ccode\u003ezed\u003c/code\u003e, \u003ccode\u003ehermes\u003c/code\u003e, and \u003ccode\u003eopenclaw\u003c/code\u003e. Those targets still use their documented \u003ccode\u003eecc install --target ...\u003c/code\u003e paths until each adapter has passed the guided collision, update, repair, and uninstall lifecycle matrix. Neither wizard silently installs into every detected harness.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePick one path only (per harness)\u003c/h3\u003e\u003ca id=\"user-content-pick-one-path-only-per-harness\" class=\"anchor\" aria-label=\"Permalink: Pick one path only (per harness)\" href=\"#pick-one-path-only-per-harness\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can use ECC with Claude Code, Codex, and other harnesses at the same time. Choose one install method for each harness:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eRecommended default:\u003c/strong\u003e run the guided Claude plugin setup above\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAlso supported for Claude Code:\u003c/strong\u003e use the \u003ca href=\"#claude-code-details\"\u003enative plugin commands\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAvailable in release 2.2:\u003c/strong\u003e guided package setup for Claude Code, Codex, and Kimi Code\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWorks:\u003c/strong\u003e Claude Code plugin + Codex native plugin\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWorks:\u003c/strong\u003e Claude Code plugin + the legacy Codex sync flow\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAvoid:\u003c/strong\u003e Claude Code plugin + full Claude manual install\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAvoid:\u003c/strong\u003e Codex sync + Codex marketplace plugin\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDo not stack install methods.\u003c/strong\u003e Installing ECC twice into the same harness can duplicate skills, commands, hooks, or configuration; installing it once into multiple harnesses does not.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you already layered multiple installs and things look duplicated, skip straight to \u003ca href=\"#reset--uninstall-ecc\"\u003eReset / Uninstall ECC\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eInstall trouble?\u003c/strong\u003e Open the short \u003ca href=\"https://github.com/affaan-m/ECC/issues/new?template=install-problem.yml\"\u003einstall or runtime problem form\u003c/a\u003e, or run \u003ccode\u003eecc feedback\u003c/code\u003e. ECC never uploads diagnostics automatically.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eClaude Code details\u003c/h3\u003e\u003ca id=\"user-content-claude-code-details\" class=\"anchor\" aria-label=\"Permalink: Claude Code details\" href=\"#claude-code-details\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAlternatively, run Claude Code's native plugin commands inside Claude Code:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/plugin marketplace add https://github.com/affaan-m/ECC\n/plugin install ecc@ecc\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003e/plugin marketplace add https://github.com/affaan-m/ECC\n/plugin install ecc@ecc\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe native path installs ECC's skills, agents, commands, and plugin-managed hooks. If you choose it, stop there. Do not also run a full manual install into Claude Code.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eClaude Code owns these built-in commands, including their errors when a marketplace, plugin, or conflicting scope already exists. ECC cannot intercept that parser. If either native command reports an existing install or scope conflict, use the 2.2 guided setup or resolve the conflicting Claude plugin scope before retrying; do not layer a manual install on top.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter ECC is installed, \u003ccode\u003e/ecc:configure-ecc\u003c/code\u003e is the namespaced in-Claude reconfiguration skill. It delegates to the same safe setup flow, but it is available only after the plugin is installed and cannot replace Claude Code's built-in \u003ccode\u003e/plugin\u003c/code\u003e command during a first install.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eClaude Code plugins cannot distribute \u003ccode\u003erules\u003c/code\u003e, so add only the rule packs you actually want:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/affaan-m/ECC.git\ncd ECC\nmkdir -p ~/.claude/rules/ecc\ncp -R rules/common ~/.claude/rules/ecc/\ncp -R rules/typescript ~/.claude/rules/ecc/  # replace with your stack\"\u003e\u003cpre\u003egit clone https://github.com/affaan-m/ECC.git\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e ECC\nmkdir -p \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/rules/ecc\ncp -R rules/common \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/rules/ecc/\ncp -R rules/typescript \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/rules/ecc/  \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e replace with your stack\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eStart with \u003ccode\u003erules/common\u003c/code\u003e plus one language or framework pack you actually use. If you install the plugin, do not run \u003ccode\u003e./install.sh --profile full\u003c/code\u003e afterward.\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePrefer settings.json? Add the marketplace declaratively\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eAdd directly to your \u003ccode\u003e~/.claude/settings.json\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;extraKnownMarketplaces\u0026quot;: {\n    \u0026quot;ecc\u0026quot;: {\n      \u0026quot;source\u0026quot;: {\n        \u0026quot;source\u0026quot;: \u0026quot;github\u0026quot;,\n        \u0026quot;repo\u0026quot;: \u0026quot;affaan-m/ECC\u0026quot;\n      }\n    }\n  },\n  \u0026quot;enabledPlugins\u0026quot;: {\n    \u0026quot;ecc@ecc\u0026quot;: true\n  }\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"extraKnownMarketplaces\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"ecc\"\u003c/span\u003e: {\n      \u003cspan class=\"pl-ent\"\u003e\"source\"\u003c/span\u003e: {\n        \u003cspan class=\"pl-ent\"\u003e\"source\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003egithub\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n        \u003cspan class=\"pl-ent\"\u003e\"repo\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eaffaan-m/ECC\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n      }\n    }\n  },\n  \u003cspan class=\"pl-ent\"\u003e\"enabledPlugins\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"ecc@ecc\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\n  }\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis gives you the same result as the two \u003ccode\u003e/plugin\u003c/code\u003e commands above.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eNaming + migration note (ecc@ecc, affaan-m/ECC, ecc-universal)\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC has three public identifiers, and they are not interchangeable:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eGitHub source repo: \u003ccode\u003eaffaan-m/ECC\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eClaude marketplace/plugin identifier: \u003ccode\u003eecc@ecc\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003enpm package: \u003ccode\u003eecc-universal\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThis is intentional. Anthropic marketplace/plugin installs are keyed by a canonical plugin identifier, so ECC uses \u003ccode\u003eecc@ecc\u003c/code\u003e to keep tool names and slash-command namespaces short enough for strict Desktop/API validators. Older posts may still show the former long marketplace identifier; treat that as a legacy alias only. Separately, the npm package stayed on \u003ccode\u003eecc-universal\u003c/code\u003e, so npm installs and marketplace installs intentionally use different names.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003enpm releases are cut per version tag, not per commit, so \u003ccode\u003eecc-universal\u003c/code\u003e tracks releases (2.1, 2.2, ...) rather than every push to \u003ccode\u003emain\u003c/code\u003e. Install from git if you want the bleeding edge.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf your local Claude setup was wiped or reset, that does not mean you need to repurchase anything. Start with \u003ccode\u003enode scripts/ecc.js list-installed\u003c/code\u003e, then run \u003ccode\u003enode scripts/ecc.js doctor\u003c/code\u003e and \u003ccode\u003enode scripts/ecc.js repair\u003c/code\u003e before reinstalling. That usually restores ECC-managed files without rebuilding your setup.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCodex App and CLI\u003c/h3\u003e\u003ca id=\"user-content-codex-app-and-cli\" class=\"anchor\" aria-label=\"Permalink: Codex App and CLI\" href=\"#codex-app-and-cli\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCurrent Codex releases can install ECC as a native repo-marketplace plugin. The marketplace entry uses the repository root so Codex's cache receives the manifest together with all referenced skills, MCP configuration, hook runtime, scripts, and assets:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"codex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\nnode scripts/codex/check-plugin-cache.js\"\u003e\u003cpre\u003ecodex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\nnode scripts/codex/check-plugin-cache.js\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBoth add commands are idempotent. To refresh later, run \u003ccode\u003ecodex plugin marketplace upgrade ecc\u003c/code\u003e followed by \u003ccode\u003ecodex plugin add ecc@ecc\u003c/code\u003e. Codex stores one enabled plugin state in the active \u003ccode\u003eCODEX_HOME\u003c/code\u003e; it does not offer Claude's \u003ccode\u003euser\u003c/code\u003e, \u003ccode\u003eproject\u003c/code\u003e, and \u003ccode\u003elocal\u003c/code\u003e scopes. Its native hooks require an explicit trust decision and do not use Claude's four ECC hook profiles. Inside Codex, invoke \u003ccode\u003e$configure-ecc\u003c/code\u003e for the guided provider-aware flow.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe older \u003ccode\u003escripts/sync-ecc-to-codex.sh\u003c/code\u003e path is a deprecated compatibility option for users who intentionally need copied and merged configuration in \u003ccode\u003e~/.codex\u003c/code\u003e; it is not required for the native plugin. New sync runs write an ownership manifest so cleanup can preserve modified user files. Run Codex once first so \u003ccode\u003e~/.codex/config.toml\u003c/code\u003e exists, then:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/affaan-m/ECC.git\ncd ECC\nnpm install\nbash scripts/sync-ecc-to-codex.sh\"\u003e\u003cpre\u003egit clone https://github.com/affaan-m/ECC.git\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e ECC\nnpm install\nbash scripts/sync-ecc-to-codex.sh\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo inspect or remove that legacy layer without touching Codex conversations or native plugin caches:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"node scripts/ecc.js uninstall --legacy-codex-sync --dry-run\nnode scripts/ecc.js uninstall --legacy-codex-sync\"\u003e\u003cpre\u003enode scripts/ecc.js uninstall --legacy-codex-sync --dry-run\nnode scripts/ecc.js uninstall --legacy-codex-sync\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePre-manifest installations are handled conservatively: ECC removes its marked \u003ccode\u003eAGENTS.md\u003c/code\u003e block but preserves copied files it cannot prove it owns and reports them for review.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can also open the ECC repository directly in Codex for a project-local setup. Codex reads the root \u003ccode\u003eAGENTS.md\u003c/code\u003e and the trusted project configuration in \u003ccode\u003e.codex/\u003c/code\u003e without a global sync. Do not add the native marketplace plugin on top of the sync flow.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor repo navigation, surface ownership, and PR diff packet guidance, read the \u003ca href=\"/96loveslife/ECC/blob/main/docs/CODEX-NAVIGATION-GUIDE.md\"\u003eCodex ECC Navigation Map\u003c/a\u003e. See the \u003ca href=\"/96loveslife/ECC/blob/main/.codex-plugin/README.md\"\u003e.codex plugin notes\u003c/a\u003e for native lifecycle details.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOther agents and editors\u003c/h3\u003e\u003ca id=\"user-content-other-agents-and-editors\" class=\"anchor\" aria-label=\"Permalink: Other agents and editors\" href=\"#other-agents-and-editors\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCursor, OpenCode, Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode, Copilot\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eClone ECC once, then choose the target that matches your harness:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/affaan-m/ECC.git\ncd ECC\"\u003e\u003cpre\u003egit clone https://github.com/affaan-m/ECC.git\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e ECC\u003c/pre\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eHarness\u003c/th\u003e\n\u003cth\u003eInstall or setup\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eCursor\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target cursor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProject-local \u003ccode\u003e.cursor/\u003c/code\u003e adapter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOpenCode\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003enpm install \u0026amp;\u0026amp; npm run build:opencode \u0026amp;\u0026amp; ./install.sh --profile full --target opencode --enable-hooks\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBuilds the plugin payload before the full install\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGemini CLI\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target gemini\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProject-local \u003ccode\u003e.gemini/\u003c/code\u003e config\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZed\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target zed\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProject-local \u003ccode\u003e.zed/\u003c/code\u003e adapter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAntigravity\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target antigravity\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSee the \u003ca href=\"/96loveslife/ECC/blob/main/docs/ANTIGRAVITY-GUIDE.md\"\u003eAntigravity guide\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eQwen CLI\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target qwen\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSee the \u003ca href=\"/96loveslife/ECC/blob/main/docs/QWEN-GUIDE.md\"\u003eQwen guide\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHermes\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target hermes\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSee the \u003ca href=\"/96loveslife/ECC/blob/main/docs/HERMES-SETUP.md\"\u003eHermes setup guide\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOpenClaw\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target openclaw\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eManaged home-directory install\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKimi Code CLI\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target kimi\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProject-local \u003ccode\u003e.kimi-code/\u003c/code\u003e install · \u003ca href=\"https://www.kimi.com/code?aff=ecc\" rel=\"nofollow\"\u003eGet Kimi Code\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCodeBuddy\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target codebuddy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProject-local \u003ccode\u003e.codebuddy/\u003c/code\u003e install\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJoyCode\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e./install.sh --profile minimal --target joycode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProject-local \u003ccode\u003e.joycode/\u003c/code\u003e install\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eGitHub Copilot support is already included in this repository. \u003ccode\u003e.github/copilot-instructions.md\u003c/code\u003e provides the instruction layer, \u003ccode\u003e.github/prompts/\u003c/code\u003e contains the reusable \u003ccode\u003e/plan\u003c/code\u003e, \u003ccode\u003e/tdd\u003c/code\u003e, \u003ccode\u003e/security-review\u003c/code\u003e, \u003ccode\u003e/build-fix\u003c/code\u003e, and \u003ccode\u003e/refactor\u003c/code\u003e prompts, and \u003ccode\u003e.vscode/settings.json\u003c/code\u003e enables \u003ccode\u003echat.promptFiles\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor a harness without a native ECC target, use the \u003ca href=\"/96loveslife/ECC/blob/main/docs/MANUAL-ADAPTATION-GUIDE.md\"\u003emanual adaptation guide\u003c/a\u003e. It explains how to carry a small set of ECC skills and workflow instructions into chat-style tools without pretending hooks or native skill discovery are available.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCursor installs agent definitions under \u003ccode\u003e.cursor/agents/ecc-*.md\u003c/code\u003e. Cursor-native loading behavior can vary by Cursor build. ECC does not install root \u003ccode\u003eAGENTS.md\u003c/code\u003e into \u003ccode\u003e.cursor/\u003c/code\u003e. The adapter keeps Cursor's context scoped to its native rules and agent surfaces.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eDeep per-harness notes (feature parity, hook adapters, limitations) live in \u003ca href=\"#platform-support\"\u003ePlatform Support\u003c/a\u003e below.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAdvanced Install Options\u003c/h2\u003e\u003ca id=\"user-content-advanced-install-options\" class=\"anchor\" aria-label=\"Permalink: Advanced Install Options\" href=\"#advanced-install-options\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eLow-context install with no hook runtime\u003c/strong\u003e\u003c/summary\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLow-context / no-hooks path\u003c/h3\u003e\u003ca id=\"user-content-low-context--no-hooks-path\" class=\"anchor\" aria-label=\"Permalink: Low-context / no-hooks path\" href=\"#low-context--no-hooks-path\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse this when you want ECC's rules, agents, commands, platform config, and core workflows without runtime hooks:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 install --profile minimal --target claude\"\u003e\u003cpre\u003enpx ecc-universal@2.2.2 install --profile minimal --target claude\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFrom a source checkout, the equivalent command is:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./install.sh --profile minimal --target claude\"\u003e\u003cpre\u003e./install.sh --profile minimal --target claude\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWindows:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\".\\install.ps1 --profile minimal --target claude\"\u003e\u003cpre\u003e.\\install.ps1 \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003eprofile minimal \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003etarget claude\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis profile intentionally excludes \u003ccode\u003ehooks-runtime\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eClaude manual installs place each skill directly under \u003ccode\u003e~/.claude/skills/\u0026lt;skill-name\u0026gt;/\u003c/code\u003e (or \u003ccode\u003e.claude/skills/\u0026lt;skill-name\u0026gt;/\u003c/code\u003e for \u003ccode\u003eclaude-project\u003c/code\u003e) so Claude Code can discover it. When upgrading an older ECC manual install, the installer migrates only nested \u003ccode\u003eskills/ecc/\u003c/code\u003e files recorded in ECC install-state. If a flat skill directory is user-owned, ECC preserves it, prints a conflict warning, and keeps any older managed copy tracked for a safe uninstall instead of overwriting user files.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor the normal core profile with hooks disabled:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./install.sh --profile core --without baseline:hooks --target claude\n./install.sh --profile core --no-hooks --target claude\"\u003e\u003cpre\u003e./install.sh --profile core --without baseline:hooks --target claude\n./install.sh --profile core --no-hooks --target claude\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdd the hook runtime later only if you want it:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./install.sh --target claude --modules hooks-runtime --enable-hooks\"\u003e\u003cpre\u003e./install.sh --target claude --modules hooks-runtime --enable-hooks\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAny install whose profile or modules would materialize the hook runtime requires\nan explicit decision. Without \u003ccode\u003e--enable-hooks\u003c/code\u003e or \u003ccode\u003e--no-hooks\u003c/code\u003e, the installer\nprints what the hooks can do and stops before writing anything. The guided\ninstaller (\u003ccode\u003eecc install --guided\u003c/code\u003e) asks for this choice interactively.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eChoose only the components you need\u003c/strong\u003e\u003c/summary\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFind the right components first\u003c/h3\u003e\u003ca id=\"user-content-find-the-right-components-first\" class=\"anchor\" aria-label=\"Permalink: Find the right components first\" href=\"#find-the-right-components-first\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAsk the packaged advisor which components match your work:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"node scripts/ecc.js consult \u0026quot;security reviews\u0026quot; --target claude\"\u003e\u003cpre\u003enode scripts/ecc.js consult \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esecurity reviews\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --target claude\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt returns matching components, related profiles, and preview/install commands. Use the preview command before installing if you want to inspect the exact file plan.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can also install explicit skills or capabilities:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./install.sh --target claude --skills tdd-workflow,security-review\nnode scripts/ecc.js install --profile minimal --target claude --with capability:machine-learning\"\u003e\u003cpre\u003e./install.sh --target claude --skills tdd-workflow,security-review\nnode scripts/ecc.js install --profile minimal --target claude --with capability:machine-learning\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eManual component-by-component copying also works. Each component is fully independent:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Just agents\ncp agents/*.md ~/.claude/agents/\n\n# Rules directories (common + language-specific)\nmkdir -p ~/.claude/rules/ecc\ncp -r rules/common ~/.claude/rules/ecc/\ncp -r rules/typescript ~/.claude/rules/ecc/   # pick your stack\n\n# Core/general skills only (Claude Code loads skills from direct children\n# of ~/.claude/skills; do not nest manual installs under ~/.claude/skills/ecc/)\nmkdir -p ~/.claude/skills\ncp -r .agents/skills/* ~/.claude/skills/\ncp -r skills/search-first ~/.claude/skills/\n\n# Optional: maintained slash-command compatibility during migration\nmkdir -p ~/.claude/commands\ncp commands/*.md ~/.claude/commands/\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Just agents\u003c/span\u003e\ncp agents/\u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e.md \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/agents/\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Rules directories (common + language-specific)\u003c/span\u003e\nmkdir -p \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/rules/ecc\ncp -r rules/common \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/rules/ecc/\ncp -r rules/typescript \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/rules/ecc/   \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e pick your stack\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Core/general skills only (Claude Code loads skills from direct children\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e of ~/.claude/skills; do not nest manual installs under ~/.claude/skills/ecc/)\u003c/span\u003e\nmkdir -p \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/skills\ncp -r .agents/skills/\u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/skills/\ncp -r skills/search-first \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/skills/\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Optional: maintained slash-command compatibility during migration\u003c/span\u003e\nmkdir -p \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/commands\ncp commands/\u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e.md \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.claude/commands/\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRetired shims live in \u003ccode\u003elegacy-command-shims/\u003c/code\u003e. Copy individual files from there only if you still need old names such as \u003ccode\u003e/tdd\u003c/code\u003e.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eProject-local rules instead of global rules\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eUse project-local rules when ECC's standards should apply to one repository rather than every Claude Code session:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd your-project\nmkdir -p .claude/rules/ecc\ncp -R /path/to/ECC/rules/common .claude/rules/ecc/\ncp -R /path/to/ECC/rules/typescript .claude/rules/ecc/\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e your-project\nmkdir -p .claude/rules/ecc\ncp -R /path/to/ECC/rules/common .claude/rules/ecc/\ncp -R /path/to/ECC/rules/typescript .claude/rules/ecc/\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRules are always-loaded context, so begin with \u003ccode\u003ecommon\u003c/code\u003e and one pack for the stack you actually use. When copying rules manually, copy the whole language directory (for example \u003ccode\u003erules/common\u003c/code\u003e or \u003ccode\u003erules/golang\u003c/code\u003e), not the files inside it, so relative references keep working and filenames do not collide.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eFully manual Claude install\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eUse this only when you are intentionally skipping the plugin path:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/affaan-m/ECC.git\ncd ECC\n./install.sh --profile full\"\u003e\u003cpre\u003egit clone https://github.com/affaan-m/ECC.git\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e ECC\n./install.sh --profile full\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWindows:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/affaan-m/ECC.git\ncd ECC\n.\\install.ps1 --profile full\"\u003e\u003cpre\u003egit clone https:\u003cspan class=\"pl-k\"\u003e//\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003egithub.com\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e/\u003c/span\u003eaffaan\u003cspan class=\"pl-k\"\u003e-\u003c/span\u003em\u003cspan class=\"pl-k\"\u003e/\u003c/span\u003eECC.git\ncd ECC\n.\\install.ps1 \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003eprofile full\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you choose this path, stop there. Do not also run \u003ccode\u003e/plugin install\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor hand-picked manual installs, Claude discovers skills as direct children of \u003ccode\u003e~/.claude/skills/\u003c/code\u003e; do not nest them under \u003ccode\u003e~/.claude/skills/ecc/\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstall hooks\u003c/h4\u003e\u003ca id=\"user-content-install-hooks\" class=\"anchor\" aria-label=\"Permalink: Install hooks\" href=\"#install-hooks\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDo not copy the raw repo \u003ccode\u003ehooks/hooks.json\u003c/code\u003e into \u003ccode\u003e~/.claude/settings.json\u003c/code\u003e or \u003ccode\u003e~/.claude/hooks/hooks.json\u003c/code\u003e. That file is plugin/repo-oriented; use the installer so hook command paths are rewritten correctly:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"bash ./install.sh --target claude --modules hooks-runtime --enable-hooks\"\u003e\u003cpre\u003ebash ./install.sh --target claude --modules hooks-runtime --enable-hooks\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThat installs the hook scripts under \u003ccode\u003e~/.claude/\u003c/code\u003e and registers the resolved\nhook entries in \u003ccode\u003e~/.claude/settings.json\u003c/code\u003e. Existing user settings and hooks are\npreserved; ECC-owned entries are tracked by stable ID for idempotent updates\nand safe uninstall.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you installed ECC via \u003ccode\u003e/plugin install\u003c/code\u003e, do not copy those hooks into \u003ccode\u003esettings.json\u003c/code\u003e. Claude Code v2.1+ already auto-loads plugin \u003ccode\u003ehooks/hooks.json\u003c/code\u003e, and duplicating them in \u003ccode\u003esettings.json\u003c/code\u003e causes duplicate execution and cross-platform hook conflicts.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOn Windows, Claude's config root is \u003ccode\u003e%USERPROFILE%\\.claude\u003c/code\u003e; install the hook runtime with:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pwsh -File .\\install.ps1 --target claude --modules hooks-runtime --enable-hooks\"\u003e\u003cpre\u003epwsh \u003cspan class=\"pl-k\"\u003e-\u003c/span\u003eFile .\\install.ps1 \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003etarget claude \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003emodules hooks\u003cspan class=\"pl-k\"\u003e-\u003c/span\u003eruntime \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eenable-hooks\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfigure MCPs\u003c/h4\u003e\u003ca id=\"user-content-configure-mcps\" class=\"anchor\" aria-label=\"Permalink: Configure MCPs\" href=\"#configure-mcps\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eClaude plugin installs intentionally do not auto-enable ECC's bundled MCP server definitions. This avoids overlong plugin MCP tool names on strict third-party gateways while keeping manual MCP setup available.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUse Claude Code's \u003ccode\u003e/mcp\u003c/code\u003e command or CLI-managed MCP setup for live Claude Code server changes; Claude Code persists those choices in \u003ccode\u003e~/.claude.json\u003c/code\u003e. For repo-local MCP access, copy desired MCP server definitions from \u003ccode\u003emcp-configs/mcp-servers.json\u003c/code\u003e into a project-scoped \u003ccode\u003e.mcp.json\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eECC ships exactly one default connector (\u003ccode\u003echrome-devtools\u003c/code\u003e); everything else is a skill wrapping a CLI/REST API or an opt-in catalog entry. The rule and the June 2026 audit that retired the previous six defaults live in \u003ca href=\"/96loveslife/ECC/blob/main/docs/MCP-CONNECTOR-POLICY.md\"\u003edocs/MCP-CONNECTOR-POLICY.md\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you already run your own copies of ECC-bundled MCPs, set:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export ECC_DISABLED_MCPS=\u0026quot;chrome-devtools\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_DISABLED_MCPS=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003echrome-devtools\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eECC-managed install and Codex sync flows will skip or remove those bundled servers instead of re-adding duplicates. \u003ccode\u003eECC_DISABLED_MCPS\u003c/code\u003e is an ECC install/sync filter, not a live Claude Code toggle.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eImportant:\u003c/strong\u003e Replace \u003ccode\u003eYOUR_*_HERE\u003c/code\u003e placeholders with your actual API keys.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eMulti-model commands require additional setup\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003emulti-*\u003c/code\u003e commands are \u003cstrong\u003enot\u003c/strong\u003e covered by the base plugin/rules install.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo use \u003ccode\u003e/multi-plan\u003c/code\u003e, \u003ccode\u003e/multi-execute\u003c/code\u003e, \u003ccode\u003e/multi-backend\u003c/code\u003e, \u003ccode\u003e/multi-frontend\u003c/code\u003e, and \u003ccode\u003e/multi-workflow\u003c/code\u003e, you must also install the \u003ccode\u003eccg-workflow\u003c/code\u003e runtime. Choose and review an exact release using the \u003ca href=\"https://github.com/fengshao1227/ccg-workflow#readme\"\u003eupstream CCG installation guide\u003c/a\u003e, then initialize that installed runtime. ECC does not bundle CCG or attest to a compatible, audited CCG release; this guide does not bootstrap an unspecified registry version.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThat runtime provides the external dependencies these commands expect, including:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e~/.claude/bin/codeagent-wrapper\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e~/.claude/.ccg/prompts/*\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eWithout \u003ccode\u003eccg-workflow\u003c/code\u003e, these \u003ccode\u003emulti-*\u003c/code\u003e commands will not run correctly.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eReset, repair, or uninstall\u003c/strong\u003e\u003c/summary\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eReset / Uninstall ECC\u003c/h3\u003e\u003ca id=\"user-content-reset--uninstall-ecc\" class=\"anchor\" aria-label=\"Permalink: Reset / Uninstall ECC\" href=\"#reset--uninstall-ecc\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you installed from the universal package, run these commands from the same\nproject directory used for installation:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npx ecc-universal@2.2.2 list-installed\nnpx ecc-universal@2.2.2 doctor\nnpx ecc-universal@2.2.2 repair\nnpx ecc-universal@2.2.2 uninstall --dry-run\nnpx ecc-universal@2.2.2 uninstall\"\u003e\u003cpre\u003enpx ecc-universal@2.2.2 list-installed\nnpx ecc-universal@2.2.2 doctor\nnpx ecc-universal@2.2.2 repair\nnpx ecc-universal@2.2.2 uninstall --dry-run\nnpx ecc-universal@2.2.2 uninstall\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFrom a source checkout, inspect the managed state before reinstalling:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"node scripts/ecc.js list-installed\nnode scripts/ecc.js doctor\nnode scripts/ecc.js repair\nnode scripts/ecc.js uninstall --dry-run\"\u003e\u003cpre\u003enode scripts/ecc.js list-installed\nnode scripts/ecc.js doctor\nnode scripts/ecc.js repair\nnode scripts/ecc.js uninstall --dry-run\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor a direct source-checkout uninstall:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"node scripts/uninstall.js --dry-run\nnode scripts/uninstall.js\"\u003e\u003cpre\u003enode scripts/uninstall.js --dry-run\nnode scripts/uninstall.js\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you are leaving, the uninstall command prints an optional \u003ca href=\"https://github.com/affaan-m/ECC/issues/new?template=quick-feedback.yml\"\u003e20-second feedback form\u003c/a\u003e. It is a public GitHub issue, never blocks uninstall, and ECC does not upload diagnostics. You can also run \u003ccode\u003eecc feedback\u003c/code\u003e at any time to see the problem, feedback, and feature routes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePlugin users should remove the plugin from Claude Code, then delete only the rule folders they manually copied and no longer want. ECC only removes files recorded in its install-state. It does not claim unrelated files in your harness directories.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you stacked methods, clean up in this order:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eRemove the Claude Code plugin install.\u003c/li\u003e\n\u003cli\u003eRun the ECC uninstall command from the project directory that contains the managed install-state.\u003c/li\u003e\n\u003cli\u003eDelete any extra rule folders you copied manually and no longer want.\u003c/li\u003e\n\u003cli\u003eReinstall once, using a single path.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStart Using ECC\u003c/h2\u003e\u003ca id=\"user-content-start-using-ecc\" class=\"anchor\" aria-label=\"Permalink: Start Using ECC\" href=\"#start-using-ecc\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eStart with the workflow you need, not the full catalog.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eWhat you are doing\u003c/th\u003e\n\u003cth\u003eStart here\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilding a feature\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/ecc:plan \"describe the feature\"\u003c/code\u003e, then \u003ccode\u003etdd-workflow\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFixing a bug\u003c/td\u003e\n\u003ctd\u003eReproduce it with a failing test, then use \u003ccode\u003etdd-workflow\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReviewing new code\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/code-review\u003c/code\u003e for a fresh-context review\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRepairing a build\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/build-fix\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCleaning a codebase\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/refactor-clean\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChecking context pressure\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/context-budget\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEnding a long session\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/save-session\u003c/code\u003e or \u003ccode\u003e/learn-eval\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eResuming later\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/resume-session\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuditing agent config\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/security-scan\u003c/code\u003e with a reviewed scanner, or installed \u003ccode\u003eagentshield scan --path .\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePlugin commands and manual commands\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eClaude Code plugin commands use the namespaced form:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/ecc:plan \u0026quot;Add authentication\u0026quot;\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003e/ecc:plan \"Add authentication\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eManual installs may expose the shorter compatibility form:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/plan \u0026quot;Add authentication\u0026quot;\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003e/plan \"Add authentication\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSkills are the primary workflow surface. Commands remain convenient entry points and compatibility shims. Check what is installed with:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"/plugin list ecc@ecc\"\u003e\u003cpre\u003e/plugin list ecc@ecc\u003c/pre\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhich agent should I use?\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eSkills are the canonical workflow surface; maintained slash entries stay available for command-first workflows.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eI want to...\u003c/th\u003e\n\u003cth\u003eUse this surface\u003c/th\u003e\n\u003cth\u003eAgent used\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlan a new feature\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/ecc:plan \"Add auth\"\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eplanner\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesign system architecture\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/ecc:plan\u003c/code\u003e + architect agent\u003c/td\u003e\n\u003ctd\u003earchitect\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWrite code with tests first\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etdd-workflow\u003c/code\u003e skill\u003c/td\u003e\n\u003ctd\u003etdd-guide\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReview code I just wrote\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/code-review\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ecode-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFix a failing build\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/build-fix\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebuild-error-resolver\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRun end-to-end tests\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ee2e-testing\u003c/code\u003e skill\u003c/td\u003e\n\u003ctd\u003ee2e-runner\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFind security vulnerabilities\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/security-scan\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003esecurity-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRemove dead code\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/refactor-clean\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003erefactor-cleaner\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUpdate documentation\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/update-docs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003edoc-updater\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReview Go code\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/go-review\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ego-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReview Python code\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e/python-review\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003epython-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReview F# code\u003c/td\u003e\n\u003ctd\u003e\u003cem\u003e(invoke \u003ccode\u003efsharp-reviewer\u003c/code\u003e directly)\u003c/em\u003e\u003c/td\u003e\n\u003ctd\u003efsharp-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReview TypeScript/JavaScript code\u003c/td\u003e\n\u003ctd\u003e\u003cem\u003e(invoke \u003ccode\u003etypescript-reviewer\u003c/code\u003e directly)\u003c/em\u003e\u003c/td\u003e\n\u003ctd\u003etypescript-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDevelop HarmonyOS apps\u003c/td\u003e\n\u003ctd\u003e\u003cem\u003e(invoke \u003ccode\u003eharmonyos-app-resolver\u003c/code\u003e directly)\u003c/em\u003e\u003c/td\u003e\n\u003ctd\u003eharmonyos-app-resolver\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAudit database queries\u003c/td\u003e\n\u003ctd\u003e\u003cem\u003e(auto-delegated)\u003c/em\u003e\u003c/td\u003e\n\u003ctd\u003edatabase-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReview production ML changes\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emle-workflow\u003c/code\u003e skill + \u003ccode\u003emle-reviewer\u003c/code\u003e agent\u003c/td\u003e\n\u003ctd\u003emle-reviewer\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCommon workflows\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eSlash forms below are shown where they remain part of the maintained command surface. Retired short-name shims such as \u003ccode\u003e/tdd\u003c/code\u003e and \u003ccode\u003e/eval\u003c/code\u003e live in \u003ccode\u003elegacy-command-shims/\u003c/code\u003e for explicit opt-in only.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStarting a new feature:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/ecc:plan \u0026quot;Add user authentication with OAuth\u0026quot;\n                                              -\u0026gt; planner creates implementation blueprint\ntdd-workflow skill                            -\u0026gt; tdd-guide enforces write-tests-first\n/code-review                                  -\u0026gt; code-reviewer checks your work\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e/ecc:plan \"Add user authentication with OAuth\"\n                                              -\u0026gt; planner creates implementation blueprint\ntdd-workflow skill                            -\u0026gt; tdd-guide enforces write-tests-first\n/code-review                                  -\u0026gt; code-reviewer checks your work\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eFixing a bug:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"tdd-workflow skill                            -\u0026gt; tdd-guide: write a failing test that reproduces it\n                                              -\u0026gt; implement the fix, verify test passes\n/code-review                                  -\u0026gt; code-reviewer: catch regressions\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003etdd-workflow skill                            -\u0026gt; tdd-guide: write a failing test that reproduces it\n                                              -\u0026gt; implement the fix, verify test passes\n/code-review                                  -\u0026gt; code-reviewer: catch regressions\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ePreparing for production:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/security-scan                                -\u0026gt; security-reviewer: OWASP Top 10 audit\ne2e-testing skill                             -\u0026gt; e2e-runner: critical user flow tests\n/test-coverage                                -\u0026gt; verify 80%+ coverage\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e/security-scan                                -\u0026gt; security-reviewer: OWASP Top 10 audit\ne2e-testing skill                             -\u0026gt; e2e-runner: critical user flow tests\n/test-coverage                                -\u0026gt; verify 80%+ coverage\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSelf-Hosted Models and Custom Endpoints\u003c/h2\u003e\u003ca id=\"user-content-self-hosted-models-and-custom-endpoints\" class=\"anchor\" aria-label=\"Permalink: Self-Hosted Models and Custom Endpoints\" href=\"#self-hosted-models-and-custom-endpoints\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eECC works through each harness's normal configuration, so you can use an official provider, a compatible custom API endpoint or model gateway, or a self-hosted model without changing ECC's workflows.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor Claude Code, ECC does not hardcode Anthropic-hosted transport settings. Minimal gateway example:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export ANTHROPIC_BASE_URL=https://your-gateway.example.com\nexport ANTHROPIC_AUTH_TOKEN=your-token\nclaude\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ANTHROPIC_BASE_URL=https://your-gateway.example.com\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ANTHROPIC_AUTH_TOKEN=your-token\nclaude\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf your gateway remaps model names, configure that in Claude Code rather than in ECC. ECC's hooks, skills, commands, and rules are model-provider agnostic once the \u003ccode\u003eclaude\u003c/code\u003e CLI is already working. See Anthropic's \u003ca href=\"https://docs.anthropic.com/en/docs/claude-code/llm-gateway\" rel=\"nofollow\"\u003eLLM gateway documentation\u003c/a\u003e and \u003ca href=\"https://docs.anthropic.com/en/docs/claude-code/model-config\" rel=\"nofollow\"\u003emodel configuration documentation\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRun or self-host any open-source model behind that gateway using separate compute and serving setup. If you need GPU capacity, \u003ca href=\"https://compute.itomarkets.com\" rel=\"nofollow\"\u003eItô\u003c/a\u003e is ECC's preferred compute sponsor; any GPU provider works. The sponsorship link is passive: it does not invoke an RFQ, reserve capacity, provision compute, or configure serving. Separately, \u003ccode\u003eecc ito find\u003c/code\u003e invokes the explicitly configured canonical Itô CLI and submits a live authenticated RFQ; it does not reserve capacity. Managed inference through Itô is not live yet.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSelf-host Kimi with ECC + Itô compute\u003c/h3\u003e\u003ca id=\"user-content-self-host-kimi-with-ecc--itô-compute\" class=\"anchor\" aria-label=\"Permalink: Self-host Kimi with ECC + Itô compute\" href=\"#self-host-kimi-with-ecc--itô-compute\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe Kimi Code harness and the model-serving layer are separate. ECC configures the agent harness; you bring an API endpoint (\u003ca href=\"https://platform.kimi.ai?aff=ecc\" rel=\"nofollow\"\u003eget a Kimi API key\u003c/a\u003e) or self-host an open-weight Kimi model on your own GPU capacity. This adapter is verified against Kimi Code 0.31.x (\u003ccode\u003e@moonshot-ai/kimi-code\u003c/code\u003e):\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable aria-label=\"Local Kimi model path\" width=\"100%\"\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n  \u003ca href=\"https://compute.itomarkets.com\" rel=\"nofollow\"\u003e\n    \u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: light)\" srcset=\"/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent-light.png\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent.png\" width=\"92\" alt=\"Itô Markets\"\u003e\u003c/picture\u003e\u003c/themed-picture\u003e\u003cbr\u003e\n    \u003cstrong\u003e1. Get GPU capacity\u003c/strong\u003e\n  \u003c/a\u003e\u003cbr\u003e\n  \u003csub\u003eUse Itô or any GPU provider.\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n  \u003ca href=\"https://www.moonshot.ai\" rel=\"nofollow\"\u003e\n    \u003cthemed-picture data-catalyst-inline=\"true\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot-dark.png\"\u003e\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot.png\" width=\"126\" alt=\"Moonshot AI - Kimi\"\u003e\u003c/picture\u003e\u003c/themed-picture\u003e\u003cbr\u003e\n    \u003cstrong\u003e2. Serve Kimi\u003c/strong\u003e\n  \u003c/a\u003e\u003cbr\u003e\n  \u003csub\u003eExpose the chosen checkpoint through a compatible endpoint.\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n  \u003ca href=\"/96loveslife/ECC/blob/main/.kimi/README.md\"\u003e\n    \u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/community/ecc-tools-mark.svg\" height=\"52\" alt=\"ECC Tools\" style=\"max-width: 100%; height: auto; max-height: 52px;\"\u003e\u003cbr\u003e\n    \u003cstrong\u003e3. Run Kimi Code with ECC\u003c/strong\u003e\n  \u003c/a\u003e\u003cbr\u003e\n  \u003csub\u003eInstall project instructions and skills, then start Kimi Code.\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eConfigure the endpoint with Kimi Code's \u003ca href=\"https://moonshotai.github.io/kimi-cli/en/configuration/providers.html\" rel=\"nofollow\"\u003eofficial provider guide\u003c/a\u003e, then install ECC:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"bash ./install.sh --target kimi --profile minimal\nnode scripts/ecc.js doctor --target kimi\nkimi\"\u003e\u003cpre\u003ebash ./install.sh --target kimi --profile minimal\nnode scripts/ecc.js doctor --target kimi\nkimi\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eKimi Code discovers the installed \u003ccode\u003e.kimi-code/AGENTS.md\u003c/code\u003e instructions and \u003ccode\u003e.kimi-code/skills/\u003c/code\u003e workflows natively; project-level \u003ccode\u003e.agents/skills/\u003c/code\u003e is also an official discovery location. ECC safely merges project MCP entries into \u003ccode\u003e.kimi-code/mcp.json\u003c/code\u003e and does not change the user-level \u003ccode\u003e~/.kimi-code/config.toml\u003c/code\u003e. Kimi Code supports native hooks, but ECC's current managed-project adapter does not configure them, so this installer does not offer Kimi hook profiles. The installer dry-run and regression suite verify that every managed Kimi write stays inside the project-local \u003ccode\u003e.kimi-code/\u003c/code\u003e root.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eItô compute CLI bridge\u003c/h3\u003e\u003ca id=\"user-content-itô-compute-cli-bridge\" class=\"anchor\" aria-label=\"Permalink: Itô compute CLI bridge\" href=\"#itô-compute-cli-bridge\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eecc ito\u003c/code\u003e delegates to the separately installed canonical Itô client; ECC does not maintain a second API client. \u003ccode\u003eecc ito login [--no-browser]\u003c/code\u003e performs device authorization, opens the Itô verification page by default, and persists a device token in macOS Keychain; \u003ccode\u003e--no-browser\u003c/code\u003e suppresses the page handoff. ECC itself does no browser automation. \u003ccode\u003eecc ito auth\u003c/code\u003e is validation-only and rejects \u003ccode\u003e--no-browser\u003c/code\u003e. The available operations are \u003ccode\u003eecc ito login\u003c/code\u003e, \u003ccode\u003eecc ito auth\u003c/code\u003e, \u003ccode\u003eecc ito find\u003c/code\u003e, \u003ccode\u003eecc ito status\u003c/code\u003e, and the separately gated \u003ccode\u003eecc ito evals\u003c/code\u003e. The matching MCP tools remain \u003ccode\u003eito_auth\u003c/code\u003e, \u003ccode\u003eito_find\u003c/code\u003e, and \u003ccode\u003eito_status\u003c/code\u003e; \u003ccode\u003eito_auth\u003c/code\u003e validates existing credentials and node qualification is CLI-only.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eito-compute-cli\u003c/code\u003e package is currently unpublished. Build it locally from the Itô runtime repo (private while the desk hardens; design partners get access) under \u003ccode\u003ecli/ito-compute-cli\u003c/code\u003e, run \u003ccode\u003enpm ci\u003c/code\u003e and \u003ccode\u003enpm run check\u003c/code\u003e, then set \u003ccode\u003eECC_ITO_CLI_EXECUTABLE\u003c/code\u003e to that build's absolute \u003ccode\u003edist/bin/ito.js\u003c/code\u003e path. Login never inherits \u003ccode\u003eITO_API_KEY\u003c/code\u003e; auth, find, and status forward \u003ccode\u003eITO_API_KEY\u003c/code\u003e directly when configured, and \u003ccode\u003eITO_AUTH_MODE=legacy\u003c/code\u003e is not required. \u003ccode\u003eecc ito logout\u003c/code\u003e revokes the current device credential and retains its local copy if remote revocation cannot be confirmed. Device tokens use macOS Keychain by default; explicit file fallback must retain owner-only directory/file permissions. ECC does not discover this credential-bearing client through \u003ccode\u003ePATH\u003c/code\u003e. See the \u003ca href=\"/96loveslife/ECC/blob/main/skills/ito-compute/SKILL.md\"\u003e\u003ccode\u003eito-compute\u003c/code\u003e skill\u003c/a\u003e for the full RFQ authority and MCP setup contract.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003efind\u003c/code\u003e submits a live authenticated RFQ. It does not reserve capacity. \u003ccode\u003eevals\u003c/code\u003e requires both \u003ccode\u003eITO_ENABLE_SIXTYTWO_LIVE=1\u003c/code\u003e and \u003ccode\u003e--live-sixtytwo\u003c/code\u003e, a separately installed \u003ccode\u003esixtytwo-cli==0.3.33\u003c/code\u003e, an explicit node list, and an existing absolute configuration directory. It cannot rent, launch, recover, repair, or purchase. ECC exposes no quote lock, purchase, workload, or inference path, and it never replaces a missing client or failed live call with a local result.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat's New\u003c/h2\u003e\u003ca id=\"user-content-whats-new\" class=\"anchor\" aria-label=\"Permalink: What's New\" href=\"#whats-new\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCurrent release: \u003cstrong\u003e2.2.2\u003c/strong\u003e (2026-08-31). Highlights of the 2.2 line:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eGuided, manifest-driven setup across Claude Code, Codex, and Kimi Code, with install-state ownership, doctor, repair, and uninstall.\u003c/li\u003e\n\u003cli\u003eNative Antigravity install, a thin Pi adapter, and the packed-artifact release gate tested on Linux, macOS, and Windows.\u003c/li\u003e\n\u003cli\u003ePlan Canvas browser review, the unified memory vault (\u003ccode\u003eecc memory\u003c/code\u003e), and the Itô compute skill family.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFull history: \u003ca href=\"/96loveslife/ECC/blob/main/CHANGELOG.md\"\u003eCHANGELOG.md\u003c/a\u003e. Per-release notes and evidence live under \u003ca href=\"/96loveslife/ECC/blob/main/docs/releases\"\u003edocs/releases/\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev2.0.0: The Agent Harness Operating System (Jun 2026)\u003c/h3\u003e\u003ca id=\"user-content-v200-the-agent-harness-operating-system-jun-2026\" class=\"anchor\" aria-label=\"Permalink: v2.0.0: The Agent Harness Operating System (Jun 2026)\" href=\"#v200-the-agent-harness-operating-system-jun-2026\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eStable graduation of the 2.0 line: control-pane substrate, worktree lifecycle service, the \u003ccode\u003eorch-*\u003c/code\u003e orchestrator family, and the Discord community. Notes: \u003ca href=\"/96loveslife/ECC/blob/main/docs/releases/2.0.0/release-notes.md\"\u003edocs/releases/2.0.0/release-notes.md\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat's Inside\u003c/h2\u003e\u003ca id=\"user-content-whats-inside\" class=\"anchor\" aria-label=\"Permalink: What's Inside\" href=\"#whats-inside\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"ECC/\n|-- agents/           # 68 specialized subagents for delegation\n|-- skills/           # 292 reusable workflows loaded on demand\n|-- commands/         # 94 maintained slash-command shims\n|-- rules/            # opt-in common and language standards\n|-- hooks/            # runtime automation and enforcement\n|-- scripts/          # install, repair, sync, orchestration, and checks\n|-- .claude-plugin/   # Claude Code marketplace manifest\n|-- .codex/           # Codex reference configuration and agent roles\n|-- .opencode/        # OpenCode plugin, commands, and instructions\n|-- .cursor/          # Cursor rules and hook adapter\n|-- docs/             # public setup, architecture, and operating guides\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003eECC/\n|-- agents/           # 68 specialized subagents for delegation\n|-- skills/           # 292 reusable workflows loaded on demand\n|-- commands/         # 94 maintained slash-command shims\n|-- rules/            # opt-in common and language standards\n|-- hooks/            # runtime automation and enforcement\n|-- scripts/          # install, repair, sync, orchestration, and checks\n|-- .claude-plugin/   # Claude Code marketplace manifest\n|-- .codex/           # Codex reference configuration and agent roles\n|-- .opencode/        # OpenCode plugin, commands, and instructions\n|-- .cursor/          # Cursor rules and hook adapter\n|-- docs/             # public setup, architecture, and operating guides\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe root is the source of truth. Platform adapters package or map these same workflows instead of maintaining separate copies.\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAnnotated component catalog\u003c/strong\u003e\u003c/summary\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"ECC/\n|-- .claude-plugin/   # Plugin and marketplace manifests\n|   |-- plugin.json         # Plugin metadata and component paths\n|   |-- marketplace.json    # Marketplace catalog for /plugin marketplace add\n|\n|-- agents/           # 67 specialized subagents for delegation\n|   |-- planner.md           # Feature implementation planning\n|   |-- architect.md         # System design decisions\n|   |-- tdd-guide.md         # Test-driven development\n|   |-- code-reviewer.md     # Quality and security review\n|   |-- security-reviewer.md # Vulnerability analysis\n|   |-- build-error-resolver.md\n|   |-- e2e-runner.md        # Playwright E2E testing\n|   |-- refactor-cleaner.md  # Dead code cleanup\n|   |-- doc-updater.md       # Documentation sync\n|   |-- docs-lookup.md       # Documentation/API lookup\n|   |-- chief-of-staff.md    # Communication triage and drafts\n|   |-- loop-operator.md     # Autonomous loop execution\n|   |-- harness-optimizer.md # Harness config tuning\n|   |-- cpp-reviewer.md      # C++ code review\n|   |-- cpp-build-resolver.md # C++ build error resolution\n|   |-- fsharp-reviewer.md   # F# functional code review\n|   |-- go-reviewer.md       # Go code review\n|   |-- go-build-resolver.md # Go build error resolution\n|   |-- python-reviewer.md   # Python code review\n|   |-- database-reviewer.md # Database/Supabase review\n|   |-- typescript-reviewer.md # TypeScript/JavaScript code review\n|   |-- java-reviewer.md     # Java/Spring Boot code review\n|   |-- java-build-resolver.md # Java/Maven/Gradle build errors\n|   |-- kotlin-reviewer.md   # Kotlin/Android/KMP code review\n|   |-- kotlin-build-resolver.md # Kotlin/Gradle build errors\n|   |-- harmonyos-app-resolver.md # HarmonyOS/ArkTS app development\n|   |-- rust-reviewer.md     # Rust code review\n|   |-- rust-build-resolver.md # Rust build error resolution\n|   |-- pytorch-build-resolver.md # PyTorch/CUDA training errors\n|   |-- mle-reviewer.md      # Production ML pipeline, eval, serving, and monitoring review\n|\n|-- skills/           # Workflow definitions and domain knowledge\n|   |-- coding-standards/           # Language best practices\n|   |-- clickhouse-io/              # ClickHouse analytics, queries, data engineering\n|   |-- backend-patterns/           # API, database, caching patterns\n|   |-- frontend-patterns/          # React, Next.js patterns\n|   |-- frontend-slides/            # HTML slide decks and PPTX-to-web presentation workflows\n|   |-- article-writing/            # Long-form writing in a supplied voice without generic AI tone\n|   |-- content-engine/             # Multi-platform social content and repurposing workflows\n|   |-- market-research/            # Source-attributed market, competitor, and investor research\n|   |-- investor-materials/         # Pitch decks, one-pagers, memos, and financial models\n|   |-- investor-outreach/          # Personalized fundraising outreach and follow-up\n|   |-- continuous-learning/        # Legacy v1 Stop-hook pattern extraction\n|   |-- continuous-learning-v2/     # Instinct-based learning with confidence scoring\n|   |-- iterative-retrieval/        # Progressive context refinement for subagents\n|   |-- strategic-compact/          # Manual compaction suggestions (Longform Guide)\n|   |-- tdd-workflow/               # TDD methodology\n|   |-- security-review/            # Security checklist\n|   |-- eval-harness/               # Verification loop evaluation (Longform Guide)\n|   |-- verification-loop/          # Continuous verification (Longform Guide)\n|   |-- videodb/                    # Video and audio: ingest, search, edit, generate, stream\n|   |-- golang-patterns/            # Go idioms and best practices\n|   |-- golang-testing/             # Go testing patterns, TDD, benchmarks\n|   |-- cpp-coding-standards/       # C++ coding standards from C++ Core Guidelines\n|   |-- cpp-testing/                # C++ testing with GoogleTest, CMake/CTest\n|   |-- django-patterns/            # Django patterns, models, views\n|   |-- django-security/            # Django security best practices\n|   |-- django-tdd/                 # Django TDD workflow\n|   |-- django-verification/        # Django verification loops\n|   |-- laravel-patterns/           # Laravel architecture patterns\n|   |-- laravel-security/           # Laravel security best practices\n|   |-- laravel-tdd/                # Laravel TDD workflow\n|   |-- laravel-verification/       # Laravel verification loops\n|   |-- python-patterns/            # Python idioms and best practices\n|   |-- python-testing/             # Python testing with pytest\n|   |-- quarkus-patterns/           # Java Quarkus patterns\n|   |-- quarkus-security/           # Quarkus security\n|   |-- quarkus-tdd/                # Quarkus TDD\n|   |-- quarkus-verification/       # Quarkus verification\n|   |-- rails-patterns/             # Rails architecture patterns\n|   |-- springboot-patterns/        # Java Spring Boot patterns\n|   |-- springboot-security/        # Spring Boot security\n|   |-- springboot-tdd/             # Spring Boot TDD\n|   |-- springboot-verification/    # Spring Boot verification\n|   |-- configure-ecc/              # Interactive installation wizard\n|   |-- security-scan/              # AgentShield security auditor integration\n|   |-- java-coding-standards/      # Java coding standards\n|   |-- jpa-patterns/               # JPA/Hibernate patterns\n|   |-- postgres-patterns/          # PostgreSQL optimization patterns\n|   |-- nutrient-document-processing/ # Document processing with Nutrient API\n|   |-- database-migrations/        # Migration patterns (Prisma, Drizzle, Django, Go)\n|   |-- api-design/                 # REST API design, pagination, error responses\n|   |-- deployment-patterns/        # CI/CD, Docker, health checks, rollbacks\n|   |-- docker-patterns/            # Docker Compose, networking, volumes, container security\n|   |-- e2e-testing/                # Playwright E2E patterns and Page Object Model\n|   |-- content-hash-cache-pattern/ # SHA-256 content hash caching for file processing\n|   |-- cost-aware-llm-pipeline/    # LLM cost optimization, model routing, budget tracking\n|   |-- regex-vs-llm-structured-text/ # Decision framework: regex vs LLM for text parsing\n|   |-- swift-actor-persistence/    # Thread-safe Swift data persistence with actors\n|   |-- swift-protocol-di-testing/  # Protocol-based DI for testable Swift code\n|   |-- search-first/               # Research-before-coding workflow\n|   |-- skill-stocktake/            # Audit skills and commands for quality\n|   |-- liquid-glass-design/        # iOS 26 Liquid Glass design system\n|   |-- foundation-models-on-device/ # Apple on-device LLM with FoundationModels\n|   |-- swift-concurrency-6-2/      # Swift 6.2 Approachable Concurrency\n|   |-- mle-workflow/               # Production ML data contracts, evals, deployment, monitoring\n|   |-- perl-patterns/              # Modern Perl 5.36+ idioms and best practices\n|   |-- perl-security/              # Perl security patterns, taint mode, safe I/O\n|   |-- perl-testing/               # Perl TDD with Test2::V0, prove, Devel::Cover\n|   |-- autonomous-loops/           # Autonomous loop patterns: sequential pipelines, PR loops, DAG orchestration\n|   |-- plankton-code-quality/      # Write-time code quality enforcement with Plankton hooks\n|   |-- codehealth-mcp/             # Optional CodeScene Code Health MCP skill (opt-in)\n|   |-- docs/examples/project-guidelines-template.md  # Template for project-specific skills\n|\n|-- commands/         # Maintained slash-entry compatibility; prefer skills/\n|   |-- plan.md             # /plan - Implementation planning\n|   |-- code-review.md      # /code-review - Quality review\n|   |-- build-fix.md        # /build-fix - Fix build errors\n|   |-- refactor-clean.md   # /refactor-clean - Dead code removal\n|   |-- quality-gate.md     # /quality-gate - Verification gate\n|   |-- learn.md            # /learn - Extract patterns mid-session (Longform Guide)\n|   |-- learn-eval.md       # /learn-eval - Extract, evaluate, and save patterns\n|   |-- checkpoint.md       # /checkpoint - Save verification state (Longform Guide)\n|   |-- setup-pm.md         # /setup-pm - Configure package manager\n|   |-- go-review.md        # /go-review - Go code review\n|   |-- go-test.md          # /go-test - Go TDD workflow\n|   |-- go-build.md         # /go-build - Fix Go build errors\n|   |-- skill-create.md     # /skill-create - Generate skills from git history\n|   |-- instinct-status.md  # /instinct-status - View learned instincts\n|   |-- instinct-import.md  # /instinct-import - Import instincts\n|   |-- instinct-export.md  # /instinct-export - Export instincts\n|   |-- evolve.md           # /evolve - Cluster instincts into skills\n|   |-- prune.md            # /prune - Delete expired pending instincts\n|   |-- pm2.md              # /pm2 - PM2 service lifecycle management\n|   |-- multi-plan.md       # /multi-plan - Multi-agent task decomposition\n|   |-- multi-execute.md    # /multi-execute - Orchestrated multi-agent workflows\n|   |-- multi-backend.md    # /multi-backend - Backend multi-service orchestration\n|   |-- multi-frontend.md   # /multi-frontend - Frontend multi-service orchestration\n|   |-- multi-workflow.md   # /multi-workflow - General multi-service workflows\n|   |-- sessions.md         # /sessions - Session history management\n|   |-- test-coverage.md    # /test-coverage - Test coverage analysis\n|   |-- update-docs.md      # /update-docs - Update documentation\n|   |-- update-codemaps.md  # /update-codemaps - Update codemaps\n|   |-- python-review.md    # /python-review - Python code review\n|-- legacy-command-shims/   # Opt-in archive for retired shims such as /tdd and /eval\n|   |-- tdd.md              # /tdd - Prefer the tdd-workflow skill\n|   |-- e2e.md              # /e2e - Prefer the e2e-testing skill\n|   |-- eval.md             # /eval - Prefer the eval-harness skill\n|   |-- verify.md           # /verify - Prefer the verification-loop skill\n|   |-- orchestrate.md      # /orchestrate - Prefer dmux-workflows or multi-workflow\n|\n|-- rules/            # Always-follow guidelines (copy to ~/.claude/rules/ecc/)\n|   |-- README.md            # Structure overview and installation guide\n|   |-- common/              # Language-agnostic principles\n|   |   |-- coding-style.md    # Immutability, file organization\n|   |   |-- git-workflow.md    # Commit format, PR process\n|   |   |-- testing.md         # TDD, 80% coverage requirement\n|   |   |-- performance.md     # Model selection, context management\n|   |   |-- patterns.md        # Design patterns, skeleton projects\n|   |   |-- hooks.md           # Hook architecture, TodoWrite\n|   |   |-- agents.md          # When to delegate to subagents\n|   |   |-- security.md        # Mandatory security checks\n|   |-- typescript/          # TypeScript/JavaScript specific\n|   |-- python/              # Python specific\n|   |-- golang/              # Go specific\n|   |-- swift/               # Swift specific\n|   |-- php/                 # PHP specific\n|   |-- arkts/               # HarmonyOS / ArkTS specific\n|\n|-- hooks/            # Trigger-based automations\n|   |-- README.md                 # Hook documentation, recipes, and customization guide\n|   |-- hooks.json                # All hooks config (PreToolUse, PostToolUse, Stop, etc.)\n|   |-- memory-persistence/       # Session lifecycle hooks (Longform Guide)\n|   |-- strategic-compact/        # Compaction suggestions (Longform Guide)\n|\n|-- scripts/          # Cross-platform Node.js scripts\n|   |-- lib/                     # Shared utilities\n|   |   |-- utils.js             # Cross-platform file/path/system utilities\n|   |   |-- package-manager.js   # Package manager detection and selection\n|   |-- hooks/                   # Hook implementations\n|   |   |-- session-start.js     # Load context on session start\n|   |   |-- session-end.js       # Save state on session end\n|   |   |-- pre-compact.js       # Pre-compaction state saving\n|   |   |-- suggest-compact.js   # Strategic compaction suggestions\n|   |   |-- evaluate-session.js  # Extract patterns from sessions\n|   |-- setup-package-manager.js # Interactive PM setup\n|\n|-- tests/            # Test suite\n|   |-- lib/                     # Library tests\n|   |-- hooks/                   # Hook tests\n|   |-- run-all.js               # Run all tests\n|\n|-- contexts/         # Dynamic system prompt injection contexts (Longform Guide)\n|   |-- dev.md              # Development mode context\n|   |-- review.md           # Code review mode context\n|   |-- research.md         # Research/exploration mode context\n|\n|-- examples/         # Example configurations and sessions\n|   |-- CLAUDE.md             # Example project-level config\n|   |-- user-CLAUDE.md        # Example user-level config\n|   |-- saas-nextjs-CLAUDE.md   # Real-world SaaS (Next.js + Supabase + Stripe)\n|   |-- go-microservice-CLAUDE.md # Real-world Go microservice (gRPC + PostgreSQL)\n|   |-- django-api-CLAUDE.md      # Real-world Django REST API (DRF + Celery)\n|   |-- laravel-api-CLAUDE.md     # Real-world Laravel API (PostgreSQL + Redis)\n|   |-- rust-api-CLAUDE.md        # Real-world Rust API (Axum + SQLx + PostgreSQL)\n|\n|-- mcp-configs/      # MCP server configurations\n|   |-- mcp-servers.json    # GitHub, Supabase, Vercel, Railway, etc.\n|\n|-- ecc_dashboard.py  # Desktop GUI dashboard (Tkinter)\n|\n|-- marketplace.json  # Self-hosted marketplace config (for /plugin marketplace add)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eECC/\n|-- .claude-plugin/   # Plugin and marketplace manifests\n|   |-- plugin.json         # Plugin metadata and component paths\n|   |-- marketplace.json    # Marketplace catalog for /plugin marketplace add\n|\n|-- agents/           # 67 specialized subagents for delegation\n|   |-- planner.md           # Feature implementation planning\n|   |-- architect.md         # System design decisions\n|   |-- tdd-guide.md         # Test-driven development\n|   |-- code-reviewer.md     # Quality and security review\n|   |-- security-reviewer.md # Vulnerability analysis\n|   |-- build-error-resolver.md\n|   |-- e2e-runner.md        # Playwright E2E testing\n|   |-- refactor-cleaner.md  # Dead code cleanup\n|   |-- doc-updater.md       # Documentation sync\n|   |-- docs-lookup.md       # Documentation/API lookup\n|   |-- chief-of-staff.md    # Communication triage and drafts\n|   |-- loop-operator.md     # Autonomous loop execution\n|   |-- harness-optimizer.md # Harness config tuning\n|   |-- cpp-reviewer.md      # C++ code review\n|   |-- cpp-build-resolver.md # C++ build error resolution\n|   |-- fsharp-reviewer.md   # F# functional code review\n|   |-- go-reviewer.md       # Go code review\n|   |-- go-build-resolver.md # Go build error resolution\n|   |-- python-reviewer.md   # Python code review\n|   |-- database-reviewer.md # Database/Supabase review\n|   |-- typescript-reviewer.md # TypeScript/JavaScript code review\n|   |-- java-reviewer.md     # Java/Spring Boot code review\n|   |-- java-build-resolver.md # Java/Maven/Gradle build errors\n|   |-- kotlin-reviewer.md   # Kotlin/Android/KMP code review\n|   |-- kotlin-build-resolver.md # Kotlin/Gradle build errors\n|   |-- harmonyos-app-resolver.md # HarmonyOS/ArkTS app development\n|   |-- rust-reviewer.md     # Rust code review\n|   |-- rust-build-resolver.md # Rust build error resolution\n|   |-- pytorch-build-resolver.md # PyTorch/CUDA training errors\n|   |-- mle-reviewer.md      # Production ML pipeline, eval, serving, and monitoring review\n|\n|-- skills/           # Workflow definitions and domain knowledge\n|   |-- coding-standards/           # Language best practices\n|   |-- clickhouse-io/              # ClickHouse analytics, queries, data engineering\n|   |-- backend-patterns/           # API, database, caching patterns\n|   |-- frontend-patterns/          # React, Next.js patterns\n|   |-- frontend-slides/            # HTML slide decks and PPTX-to-web presentation workflows\n|   |-- article-writing/            # Long-form writing in a supplied voice without generic AI tone\n|   |-- content-engine/             # Multi-platform social content and repurposing workflows\n|   |-- market-research/            # Source-attributed market, competitor, and investor research\n|   |-- investor-materials/         # Pitch decks, one-pagers, memos, and financial models\n|   |-- investor-outreach/          # Personalized fundraising outreach and follow-up\n|   |-- continuous-learning/        # Legacy v1 Stop-hook pattern extraction\n|   |-- continuous-learning-v2/     # Instinct-based learning with confidence scoring\n|   |-- iterative-retrieval/        # Progressive context refinement for subagents\n|   |-- strategic-compact/          # Manual compaction suggestions (Longform Guide)\n|   |-- tdd-workflow/               # TDD methodology\n|   |-- security-review/            # Security checklist\n|   |-- eval-harness/               # Verification loop evaluation (Longform Guide)\n|   |-- verification-loop/          # Continuous verification (Longform Guide)\n|   |-- videodb/                    # Video and audio: ingest, search, edit, generate, stream\n|   |-- golang-patterns/            # Go idioms and best practices\n|   |-- golang-testing/             # Go testing patterns, TDD, benchmarks\n|   |-- cpp-coding-standards/       # C++ coding standards from C++ Core Guidelines\n|   |-- cpp-testing/                # C++ testing with GoogleTest, CMake/CTest\n|   |-- django-patterns/            # Django patterns, models, views\n|   |-- django-security/            # Django security best practices\n|   |-- django-tdd/                 # Django TDD workflow\n|   |-- django-verification/        # Django verification loops\n|   |-- laravel-patterns/           # Laravel architecture patterns\n|   |-- laravel-security/           # Laravel security best practices\n|   |-- laravel-tdd/                # Laravel TDD workflow\n|   |-- laravel-verification/       # Laravel verification loops\n|   |-- python-patterns/            # Python idioms and best practices\n|   |-- python-testing/             # Python testing with pytest\n|   |-- quarkus-patterns/           # Java Quarkus patterns\n|   |-- quarkus-security/           # Quarkus security\n|   |-- quarkus-tdd/                # Quarkus TDD\n|   |-- quarkus-verification/       # Quarkus verification\n|   |-- rails-patterns/             # Rails architecture patterns\n|   |-- springboot-patterns/        # Java Spring Boot patterns\n|   |-- springboot-security/        # Spring Boot security\n|   |-- springboot-tdd/             # Spring Boot TDD\n|   |-- springboot-verification/    # Spring Boot verification\n|   |-- configure-ecc/              # Interactive installation wizard\n|   |-- security-scan/              # AgentShield security auditor integration\n|   |-- java-coding-standards/      # Java coding standards\n|   |-- jpa-patterns/               # JPA/Hibernate patterns\n|   |-- postgres-patterns/          # PostgreSQL optimization patterns\n|   |-- nutrient-document-processing/ # Document processing with Nutrient API\n|   |-- database-migrations/        # Migration patterns (Prisma, Drizzle, Django, Go)\n|   |-- api-design/                 # REST API design, pagination, error responses\n|   |-- deployment-patterns/        # CI/CD, Docker, health checks, rollbacks\n|   |-- docker-patterns/            # Docker Compose, networking, volumes, container security\n|   |-- e2e-testing/                # Playwright E2E patterns and Page Object Model\n|   |-- content-hash-cache-pattern/ # SHA-256 content hash caching for file processing\n|   |-- cost-aware-llm-pipeline/    # LLM cost optimization, model routing, budget tracking\n|   |-- regex-vs-llm-structured-text/ # Decision framework: regex vs LLM for text parsing\n|   |-- swift-actor-persistence/    # Thread-safe Swift data persistence with actors\n|   |-- swift-protocol-di-testing/  # Protocol-based DI for testable Swift code\n|   |-- search-first/               # Research-before-coding workflow\n|   |-- skill-stocktake/            # Audit skills and commands for quality\n|   |-- liquid-glass-design/        # iOS 26 Liquid Glass design system\n|   |-- foundation-models-on-device/ # Apple on-device LLM with FoundationModels\n|   |-- swift-concurrency-6-2/      # Swift 6.2 Approachable Concurrency\n|   |-- mle-workflow/               # Production ML data contracts, evals, deployment, monitoring\n|   |-- perl-patterns/              # Modern Perl 5.36+ idioms and best practices\n|   |-- perl-security/              # Perl security patterns, taint mode, safe I/O\n|   |-- perl-testing/               # Perl TDD with Test2::V0, prove, Devel::Cover\n|   |-- autonomous-loops/           # Autonomous loop patterns: sequential pipelines, PR loops, DAG orchestration\n|   |-- plankton-code-quality/      # Write-time code quality enforcement with Plankton hooks\n|   |-- codehealth-mcp/             # Optional CodeScene Code Health MCP skill (opt-in)\n|   |-- docs/examples/project-guidelines-template.md  # Template for project-specific skills\n|\n|-- commands/         # Maintained slash-entry compatibility; prefer skills/\n|   |-- plan.md             # /plan - Implementation planning\n|   |-- code-review.md      # /code-review - Quality review\n|   |-- build-fix.md        # /build-fix - Fix build errors\n|   |-- refactor-clean.md   # /refactor-clean - Dead code removal\n|   |-- quality-gate.md     # /quality-gate - Verification gate\n|   |-- learn.md            # /learn - Extract patterns mid-session (Longform Guide)\n|   |-- learn-eval.md       # /learn-eval - Extract, evaluate, and save patterns\n|   |-- checkpoint.md       # /checkpoint - Save verification state (Longform Guide)\n|   |-- setup-pm.md         # /setup-pm - Configure package manager\n|   |-- go-review.md        # /go-review - Go code review\n|   |-- go-test.md          # /go-test - Go TDD workflow\n|   |-- go-build.md         # /go-build - Fix Go build errors\n|   |-- skill-create.md     # /skill-create - Generate skills from git history\n|   |-- instinct-status.md  # /instinct-status - View learned instincts\n|   |-- instinct-import.md  # /instinct-import - Import instincts\n|   |-- instinct-export.md  # /instinct-export - Export instincts\n|   |-- evolve.md           # /evolve - Cluster instincts into skills\n|   |-- prune.md            # /prune - Delete expired pending instincts\n|   |-- pm2.md              # /pm2 - PM2 service lifecycle management\n|   |-- multi-plan.md       # /multi-plan - Multi-agent task decomposition\n|   |-- multi-execute.md    # /multi-execute - Orchestrated multi-agent workflows\n|   |-- multi-backend.md    # /multi-backend - Backend multi-service orchestration\n|   |-- multi-frontend.md   # /multi-frontend - Frontend multi-service orchestration\n|   |-- multi-workflow.md   # /multi-workflow - General multi-service workflows\n|   |-- sessions.md         # /sessions - Session history management\n|   |-- test-coverage.md    # /test-coverage - Test coverage analysis\n|   |-- update-docs.md      # /update-docs - Update documentation\n|   |-- update-codemaps.md  # /update-codemaps - Update codemaps\n|   |-- python-review.md    # /python-review - Python code review\n|-- legacy-command-shims/   # Opt-in archive for retired shims such as /tdd and /eval\n|   |-- tdd.md              # /tdd - Prefer the tdd-workflow skill\n|   |-- e2e.md              # /e2e - Prefer the e2e-testing skill\n|   |-- eval.md             # /eval - Prefer the eval-harness skill\n|   |-- verify.md           # /verify - Prefer the verification-loop skill\n|   |-- orchestrate.md      # /orchestrate - Prefer dmux-workflows or multi-workflow\n|\n|-- rules/            # Always-follow guidelines (copy to ~/.claude/rules/ecc/)\n|   |-- README.md            # Structure overview and installation guide\n|   |-- common/              # Language-agnostic principles\n|   |   |-- coding-style.md    # Immutability, file organization\n|   |   |-- git-workflow.md    # Commit format, PR process\n|   |   |-- testing.md         # TDD, 80% coverage requirement\n|   |   |-- performance.md     # Model selection, context management\n|   |   |-- patterns.md        # Design patterns, skeleton projects\n|   |   |-- hooks.md           # Hook architecture, TodoWrite\n|   |   |-- agents.md          # When to delegate to subagents\n|   |   |-- security.md        # Mandatory security checks\n|   |-- typescript/          # TypeScript/JavaScript specific\n|   |-- python/              # Python specific\n|   |-- golang/              # Go specific\n|   |-- swift/               # Swift specific\n|   |-- php/                 # PHP specific\n|   |-- arkts/               # HarmonyOS / ArkTS specific\n|\n|-- hooks/            # Trigger-based automations\n|   |-- README.md                 # Hook documentation, recipes, and customization guide\n|   |-- hooks.json                # All hooks config (PreToolUse, PostToolUse, Stop, etc.)\n|   |-- memory-persistence/       # Session lifecycle hooks (Longform Guide)\n|   |-- strategic-compact/        # Compaction suggestions (Longform Guide)\n|\n|-- scripts/          # Cross-platform Node.js scripts\n|   |-- lib/                     # Shared utilities\n|   |   |-- utils.js             # Cross-platform file/path/system utilities\n|   |   |-- package-manager.js   # Package manager detection and selection\n|   |-- hooks/                   # Hook implementations\n|   |   |-- session-start.js     # Load context on session start\n|   |   |-- session-end.js       # Save state on session end\n|   |   |-- pre-compact.js       # Pre-compaction state saving\n|   |   |-- suggest-compact.js   # Strategic compaction suggestions\n|   |   |-- evaluate-session.js  # Extract patterns from sessions\n|   |-- setup-package-manager.js # Interactive PM setup\n|\n|-- tests/            # Test suite\n|   |-- lib/                     # Library tests\n|   |-- hooks/                   # Hook tests\n|   |-- run-all.js               # Run all tests\n|\n|-- contexts/         # Dynamic system prompt injection contexts (Longform Guide)\n|   |-- dev.md              # Development mode context\n|   |-- review.md           # Code review mode context\n|   |-- research.md         # Research/exploration mode context\n|\n|-- examples/         # Example configurations and sessions\n|   |-- CLAUDE.md             # Example project-level config\n|   |-- user-CLAUDE.md        # Example user-level config\n|   |-- saas-nextjs-CLAUDE.md   # Real-world SaaS (Next.js + Supabase + Stripe)\n|   |-- go-microservice-CLAUDE.md # Real-world Go microservice (gRPC + PostgreSQL)\n|   |-- django-api-CLAUDE.md      # Real-world Django REST API (DRF + Celery)\n|   |-- laravel-api-CLAUDE.md     # Real-world Laravel API (PostgreSQL + Redis)\n|   |-- rust-api-CLAUDE.md        # Real-world Rust API (Axum + SQLx + PostgreSQL)\n|\n|-- mcp-configs/      # MCP server configurations\n|   |-- mcp-servers.json    # GitHub, Supabase, Vercel, Railway, etc.\n|\n|-- ecc_dashboard.py  # Desktop GUI dashboard (Tkinter)\n|\n|-- marketplace.json  # Self-hosted marketplace config (for /plugin marketplace add)\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eDashboard GUI\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eLaunch the desktop dashboard to visually explore ECC components:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm run dashboard\n# or\npython3 ./ecc_dashboard.py\"\u003e\u003cpre\u003enpm run dashboard\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e or\u003c/span\u003e\npython3 ./ecc_dashboard.py\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eTabbed interface: Agents, Skills, Commands, Rules, Settings\u003c/li\u003e\n\u003cli\u003eDark/Light theme toggle\u003c/li\u003e\n\u003cli\u003eFont customization (family and size)\u003c/li\u003e\n\u003cli\u003eProject logo in header and taskbar\u003c/li\u003e\n\u003cli\u003eSearch and filter across all components\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eKey Concepts\u003c/h2\u003e\u003ca id=\"user-content-key-concepts\" class=\"anchor\" aria-label=\"Permalink: Key Concepts\" href=\"#key-concepts\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAgents, skills, hooks, and rules explained\u003c/strong\u003e\u003c/summary\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAgents\u003c/h3\u003e\u003ca id=\"user-content-agents\" class=\"anchor\" aria-label=\"Permalink: Agents\" href=\"#agents\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSubagents handle delegated tasks with limited scope. Example:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-text-md notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"---\nname: code-reviewer\ndescription: Reviews code for quality, security, and maintainability\ntools: Read, Grep, Glob, Bash\nmodel: opus\n---\n\nYou are a senior code reviewer...\"\u003e\u003cpre\u003e\u003cspan class=\"pl-s\"\u003e---\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003ename\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003ecode-reviewer\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003edescription\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eReviews code for quality, security, and maintainability\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003etools\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eRead, Grep, Glob, Bash\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003emodel\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eopus\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e---\u003c/span\u003e\n\nYou are a senior code reviewer...\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSkills\u003c/h3\u003e\u003ca id=\"user-content-skills\" class=\"anchor\" aria-label=\"Permalink: Skills\" href=\"#skills\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSkills are the primary workflow surface. They can be invoked directly, suggested automatically, and reused by agents. ECC still ships maintained \u003ccode\u003ecommands/\u003c/code\u003e during migration, while retired short-name shims live under \u003ccode\u003elegacy-command-shims/\u003c/code\u003e for explicit opt-in only. New workflow development should land in \u003ccode\u003eskills/\u003c/code\u003e first.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-text-md notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# TDD Workflow\n\n1. Define interfaces first\n2. Write failing tests (RED)\n3. Implement minimal code (GREEN)\n4. Refactor (IMPROVE)\n5. Verify 80%+ coverage\"\u003e\u003cpre\u003e\u003cspan class=\"pl-mh\"\u003e# \u003cspan class=\"pl-en\"\u003eTDD Workflow\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-s\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-v\"\u003e.\u003c/span\u003e Define interfaces first\n\u003cspan class=\"pl-s\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-v\"\u003e.\u003c/span\u003e Write failing tests (RED)\n\u003cspan class=\"pl-s\"\u003e3\u003c/span\u003e\u003cspan class=\"pl-v\"\u003e.\u003c/span\u003e Implement minimal code (GREEN)\n\u003cspan class=\"pl-s\"\u003e4\u003c/span\u003e\u003cspan class=\"pl-v\"\u003e.\u003c/span\u003e Refactor (IMPROVE)\n\u003cspan class=\"pl-s\"\u003e5\u003c/span\u003e\u003cspan class=\"pl-v\"\u003e.\u003c/span\u003e Verify 80%+ coverage\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHooks\u003c/h3\u003e\u003ca id=\"user-content-hooks\" class=\"anchor\" aria-label=\"Permalink: Hooks\" href=\"#hooks\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eHooks fire on tool events. Example: warn about console.log:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;matcher\u0026quot;: \u0026quot;tool == \\\u0026quot;Edit\\\u0026quot; \u0026amp;\u0026amp; tool_input.file_path matches \\\u0026quot;\\\\\\\\.(ts|tsx|js|jsx)$\\\u0026quot;\u0026quot;,\n  \u0026quot;hooks\u0026quot;: [{\n    \u0026quot;type\u0026quot;: \u0026quot;command\u0026quot;,\n    \u0026quot;command\u0026quot;: \u0026quot;#!/bin/bash\\ngrep -n 'console\\\\.log' \\\u0026quot;$file_path\\\u0026quot; \u0026amp;\u0026amp; echo '[Hook] Remove console.log' \u0026gt;\u0026amp;2\u0026quot;\n  }]\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"matcher\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003etool == \u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003eEdit\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e \u0026amp;\u0026amp; tool_input.file_path matches \u003cspan class=\"pl-cce\"\u003e\\\"\\\\\\\\\u003c/span\u003e.(ts|tsx|js|jsx)$\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n  \u003cspan class=\"pl-ent\"\u003e\"hooks\"\u003c/span\u003e: [{\n    \u003cspan class=\"pl-ent\"\u003e\"type\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ecommand\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"command\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e#!/bin/bash\u003cspan class=\"pl-cce\"\u003e\\n\u003c/span\u003egrep -n 'console\u003cspan class=\"pl-cce\"\u003e\\\\\u003c/span\u003e.log' \u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e$file_path\u003cspan class=\"pl-cce\"\u003e\\\"\u003c/span\u003e \u0026amp;\u0026amp; echo '[Hook] Remove console.log' \u0026gt;\u0026amp;2\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n  }]\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRules\u003c/h3\u003e\u003ca id=\"user-content-rules\" class=\"anchor\" aria-label=\"Permalink: Rules\" href=\"#rules\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRules are always-follow guidelines, organized into \u003ccode\u003ecommon/\u003c/code\u003e (language-agnostic) + language-specific directories:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"rules/\n  common/          # Universal principles (always install)\n  typescript/      # TS/JS specific patterns and tools\n  python/          # Python specific patterns and tools\n  golang/          # Go specific patterns and tools\n  swift/           # Swift specific patterns and tools\n  php/             # PHP specific patterns and tools\n  arkts/           # HarmonyOS / ArkTS patterns and constraints\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003erules/\n  common/          # Universal principles (always install)\n  typescript/      # TS/JS specific patterns and tools\n  python/          # Python specific patterns and tools\n  golang/          # Go specific patterns and tools\n  swift/           # Swift specific patterns and tools\n  php/             # PHP specific patterns and tools\n  arkts/           # HarmonyOS / ArkTS patterns and constraints\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSee \u003ca href=\"/96loveslife/ECC/blob/main/rules/README.md\"\u003e\u003ccode\u003erules/README.md\u003c/code\u003e\u003c/a\u003e for installation and structure details.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGuides\u003c/h2\u003e\u003ca id=\"user-content-guides\" class=\"anchor\" aria-label=\"Permalink: Guides\" href=\"#guides\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis repo is the raw code. The guides explain everything.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable aria-label=\"ECC guides\" width=\"100%\"\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n\u003ca href=\"/96loveslife/ECC/blob/main/the-shortform-guide.md\"\u003e\n\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/guides/shorthand-guide.png\" width=\"213\" height=\"120\" alt=\"The Shorthand Guide to ECC\" style=\"max-width: 100%; height: auto; max-height: 120px;\"\u003e\u003cbr\u003e\n\u003cstrong\u003eThe Shorthand Guide\u003c/strong\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003csub\u003eSetup, foundations, and day-one use. \u003cb\u003eRead this first.\u003c/b\u003e (\u003ca href=\"https://x.com/affaan/status/2012378465664745795\" rel=\"nofollow\"\u003ethread\u003c/a\u003e)\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n\u003ca href=\"/96loveslife/ECC/blob/main/the-longform-guide.md\"\u003e\n\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/guides/longform-guide.png\" width=\"213\" height=\"120\" alt=\"The Longform Guide to ECC\" style=\"max-width: 100%; height: auto; max-height: 120px;\"\u003e\u003cbr\u003e\n\u003cstrong\u003eThe Longform Guide\u003c/strong\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003csub\u003eContext economics, memory, evals, and parallel agents. (\u003ca href=\"https://x.com/affaan/status/2014040193557471352\" rel=\"nofollow\"\u003ethread\u003c/a\u003e)\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd width=\"33%\" align=\"center\"\u003e\n\u003ca href=\"/96loveslife/ECC/blob/main/the-security-guide.md\"\u003e\n\u003cimg src=\"/96loveslife/ECC/raw/main/assets/images/guides/security-guide.png\" width=\"213\" height=\"120\" alt=\"The Security Guide to ECC\" style=\"max-width: 100%; height: auto; max-height: 120px;\"\u003e\u003cbr\u003e\n\u003cstrong\u003eThe Security Guide\u003c/strong\u003e\n\u003c/a\u003e\n\u003cbr\u003e\u003csub\u003ePrompt injection, hooks, MCP, and AgentShield. (\u003ca href=\"https://x.com/affaan/status/2033263813387223421\" rel=\"nofollow\"\u003ethread\u003c/a\u003e)\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTopic\u003c/th\u003e\n\u003cth\u003eWhat You'll Learn\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eToken Optimization\u003c/td\u003e\n\u003ctd\u003eModel selection, system prompt slimming, background processes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMemory Persistence\u003c/td\u003e\n\u003ctd\u003eHooks that save/load context across sessions automatically\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eContinuous Learning\u003c/td\u003e\n\u003ctd\u003eAuto-extract patterns from sessions into reusable skills\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVerification Loops\u003c/td\u003e\n\u003ctd\u003eCheckpoint vs continuous evals, grader types, pass@k metrics\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eParallelization\u003c/td\u003e\n\u003ctd\u003eGit worktrees, cascade method, when to scale instances\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSubagent Orchestration\u003c/td\u003e\n\u003ctd\u003eThe context problem, iterative retrieval pattern\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"/96loveslife/ECC/blob/main/COMMANDS-QUICK-REF.md\"\u003eCommands Quick Reference\u003c/a\u003e | \u003ca href=\"/96loveslife/ECC/blob/main/docs/MANUAL-ADAPTATION-GUIDE.md\"\u003eManual Adaptation Guide\u003c/a\u003e | \u003ca href=\"/96loveslife/ECC/blob/main/TROUBLESHOOTING.md\"\u003eTroubleshooting FAQ\u003c/a\u003e | \u003ca href=\"/96loveslife/ECC/blob/main/docs/ROADMAP.md\"\u003eRoadmap\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhy Choose ECC?\u003c/h2\u003e\u003ca id=\"user-content-why-choose-ecc\" class=\"anchor\" aria-label=\"Permalink: Why Choose ECC?\" href=\"#why-choose-ecc\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eWithout a system\u003c/th\u003e\n\u003cth\u003eWith ECC\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlans disappear into chat history\u003c/td\u003e\n\u003ctd\u003ePlans become editable artifacts before implementation starts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\"Please use TDD\" is an instruction the model may forget\u003c/td\u003e\n\u003ctd\u003eTDD becomes a gated RED -\u0026gt; GREEN -\u0026gt; REFACTOR workflow with evidence\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eThe same context writes and reviews the code\u003c/td\u003e\n\u003ctd\u003eA fresh-context reviewer looks for regressions and blind spots\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMemory means saving an enormous transcript\u003c/td\u003e\n\u003ctd\u003eSessions are distilled into summaries, instincts, and reusable skills\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eQuality checks depend on reminders\u003c/td\u003e\n\u003ctd\u003eHooks can enforce deterministic checks outside the prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgent configuration is trusted by default\u003c/td\u003e\n\u003ctd\u003eAgentShield scans the harness itself as an attack surface\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTDD: Test-Driven Development\u003c/h3\u003e\u003ca id=\"user-content-tdd-test-driven-development\" class=\"anchor\" aria-label=\"Permalink: TDD: Test-Driven Development\" href=\"#tdd-test-driven-development\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/ecc:plan \u0026quot;Add usage-based billing alerts\u0026quot;\n  -\u0026gt; confirm or edit the plan\n  -\u0026gt; activate tdd-workflow\n  -\u0026gt; capture RED evidence before implementation\n  -\u0026gt; implement until GREEN\n  -\u0026gt; review from fresh context\n  -\u0026gt; fix findings with regression tests\n  -\u0026gt; verify build, lint, types, and tests\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003e/ecc:plan \"Add usage-based billing alerts\"\n  -\u0026gt; confirm or edit the plan\n  -\u0026gt; activate tdd-workflow\n  -\u0026gt; capture RED evidence before implementation\n  -\u0026gt; implement until GREEN\n  -\u0026gt; review from fresh context\n  -\u0026gt; fix findings with regression tests\n  -\u0026gt; verify build, lint, types, and tests\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA result is not just code. It's a trail of evidence: the plan, the failing test, the passing test, the review findings, and the final verification.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSkills keep the context focused\u003c/h3\u003e\u003ca id=\"user-content-skills-keep-the-context-focused\" class=\"anchor\" aria-label=\"Permalink: Skills keep the context focused\" href=\"#skills-keep-the-context-focused\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRules, skills, agents, and hooks solve different problems. Keeping those jobs separate is how ECC adds capability without dumping the entire repository into every session.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eConcept\u003c/th\u003e\n\u003cth\u003eWhat it does\u003c/th\u003e\n\u003cth\u003eContext behavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSkills\u003c/td\u003e\n\u003ctd\u003eReusable workflows such as TDD, security review, or deep research\u003c/td\u003e\n\u003ctd\u003eLoaded when the task needs them\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgents\u003c/td\u003e\n\u003ctd\u003eScoped workers with their own context and tool permissions\u003c/td\u003e\n\u003ctd\u003eIsolate planning, implementation, and review\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRules\u003c/td\u003e\n\u003ctd\u003eDurable project or language standards\u003c/td\u003e\n\u003ctd\u003eAlways loaded, so install them selectively\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHooks\u003c/td\u003e\n\u003ctd\u003eScripts triggered by harness events\u003c/td\u003e\n\u003ctd\u003eRun outside the model context\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstincts\u003c/td\u003e\n\u003ctd\u003ePatterns learned from real sessions with confidence scores\u003c/td\u003e\n\u003ctd\u003eRecalled when relevant\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eShare context between harnesses\u003c/h3\u003e\u003ca id=\"user-content-share-context-between-harnesses\" class=\"anchor\" aria-label=\"Permalink: Share context between harnesses\" href=\"#share-context-between-harnesses\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eECC's Memory Vault gives Claude, Codex, Hermes, OpenClaw, Kimi, and other harnesses one local, inspectable Markdown format for durable context and handoffs. Project and team memories live under \u003ccode\u003e.ecc/memory/\u003c/code\u003e; user memories live under \u003ccode\u003e~/.ecc/memory/\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSkill-only, minimal, manual, and Claude plugin installs do not put the Memory Vault runtime on \u003ccode\u003ePATH\u003c/code\u003e. Install the npm runtime separately before using the CLI or optional MCP server:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm install -g ecc-universal@2.2.2\necc memory init --scope project\necc memory search \u0026quot;authentication migration\u0026quot; --target-harness codex\necc memory doctor\"\u003e\u003cpre\u003enpm install -g ecc-universal@2.2.2\necc memory init --scope project\necc memory search \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eauthentication migration\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --target-harness codex\necc memory doctor\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMemory is unreviewed context, not executable policy. Verify important claims against authoritative sources and promote accepted knowledge into governed project documentation. The optional \u003ccode\u003eecc-memory-mcp\u003c/code\u003e server exposes the same bounded save, search, read, and doctor surface without enabling itself by default.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"/96loveslife/ECC/blob/main/skills/unified-memory/SKILL.md\"\u003eOpen the Unified Memory workflow →\u003c/a\u003e\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eMemory Vault in depth: scopes, handoffs, and trust boundaries\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eThe Memory Vault stores portable \u003ccode\u003eecc.memory.v1\u003c/code\u003e Markdown documents instead of copying vendor transcripts or emailing context between agents. Project memories are protected by a fail-closed \u003ccode\u003e.gitignore\u003c/code\u003e; use the team scope only for human-inspected, version-controlled sharing. Team memories remain unreviewed context even after they are committed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter installing the runtime above, check that the CLI and optional MCP entry point are available:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ecc memory --help\ncommand -v ecc-memory-mcp\"\u003e\u003cpre\u003eecc memory --help\n\u003cspan class=\"pl-c1\"\u003ecommand\u003c/span\u003e -v ecc-memory-mcp\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Initialize the project vault.\necc memory init --scope project\n\n# Write a handoff body to a regular file, then target the next harness.\necc memory handoff \\\n  --from hermes \\\n  --target codex \\\n  --title \u0026quot;Continue authentication migration\u0026quot; \\\n  --body-file ./handoff.md\n\n# Recall it from another harness.\necc memory search \u0026quot;authentication migration\u0026quot; --target-harness codex\necc memory read \u0026lt;memory-id\u0026gt;\n\n# Validate the vault before sharing team memories.\necc memory doctor\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Initialize the project vault.\u003c/span\u003e\necc memory init --scope project\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Write a handoff body to a regular file, then target the next harness.\u003c/span\u003e\necc memory handoff \\\n  --from hermes \\\n  --target codex \\\n  --title \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eContinue authentication migration\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n  --body-file ./handoff.md\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Recall it from another harness.\u003c/span\u003e\necc memory search \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eauthentication migration\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --target-harness codex\necc memory \u003cspan class=\"pl-c1\"\u003eread\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u0026lt;\u003c/span\u003ememory-id\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Validate the vault before sharing team memories.\u003c/span\u003e\necc memory doctor\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMemory bodies are accepted only through \u003ccode\u003e--stdin\u003c/code\u003e or \u003ccode\u003e--body-file\u003c/code\u003e, not as command-line values. The first release keeps every vault entry unreviewed and create-only; human review promotes accepted knowledge into governed project documentation rather than changing memory trust. Normal search recall returns active project and team memories. A direct ID read may inspect a non-active entry. User-scope recall must be requested explicitly. Agents must verify important claims against authoritative sources and must never treat recalled bodies as executable instructions or policy.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor opt-in MCP access, add the \u003ccode\u003eecc-memory-vault\u003c/code\u003e entry from \u003ca href=\"/96loveslife/ECC/blob/main/mcp-configs/mcp-servers.json\"\u003e\u003ccode\u003emcp-configs/mcp-servers.json\u003c/code\u003e\u003c/a\u003e to each harness that needs it, then run \u003ccode\u003eecc-memory-mcp\u003c/code\u003e. The server exposes only \u003ccode\u003ememory_save\u003c/code\u003e, \u003ccode\u003ememory_search\u003c/code\u003e, \u003ccode\u003ememory_read\u003c/code\u003e, and \u003ccode\u003ememory_doctor\u003c/code\u003e. Each server must launch with a lowercase \u003ccode\u003eECC_MEMORY_HARNESS\u003c/code\u003e identity; the identity is server-bound and cannot be supplied by a tool caller. User scope additionally requires the operator-controlled \u003ccode\u003eECC_MEMORY_ALLOW_USER_SCOPE=1\u003c/code\u003e opt-in. See \u003ca href=\"/96loveslife/ECC/blob/main/skills/unified-memory/SKILL.md\"\u003e\u003ccode\u003eskills/unified-memory/SKILL.md\u003c/code\u003e\u003c/a\u003e for the workflow and trust boundaries, and \u003ca href=\"/96loveslife/ECC/blob/main/docs/design/ecc-memory-vault.md\"\u003e\u003ccode\u003edocs/design/ecc-memory-vault.md\u003c/code\u003e\u003c/a\u003e for the capability contract.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePlatform Support\u003c/h2\u003e\u003ca id=\"user-content-platform-support\" class=\"anchor\" aria-label=\"Permalink: Platform Support\" href=\"#platform-support\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eECC's core Node.js CLI and managed installers run on \u003cstrong\u003eWindows, macOS, and Linux\u003c/strong\u003e, but optional capabilities are not at full parity. Some continuous-learning, GAN, and orchestration paths still require Bash or Python; harnesses also expose different hook, agent, and skill APIs.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlatform\u003c/th\u003e\n\u003cth\u003eStatus\u003c/th\u003e\n\u003cth\u003eCurrent limitation\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eLinux\u003c/td\u003e\n\u003ctd\u003eSupported core\u003c/td\u003e\n\u003ctd\u003eOptional features may require Bash, Python, or provider-specific tools.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003emacOS\u003c/td\u003e\n\u003ctd\u003eSupported core\u003c/td\u003e\n\u003ctd\u003eThe standalone GAN shell path is not compatible with the system Bash 3.2 and currently has a score-parsing defect (\u003ca href=\"https://github.com/affaan-m/ECC/issues/2674\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/2674/hovercard\"\u003e#2674\u003c/a\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWindows + WSL\u003c/td\u003e\n\u003ctd\u003eSupported core\u003c/td\u003e\n\u003ctd\u003eWSL follows the Linux paths; Windows host integrations still vary by harness.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWindows native\u003c/td\u003e\n\u003ctd\u003eSupported with limitations\u003c/td\u003e\n\u003ctd\u003eContinuous-learning v2's observer daemon and memory-vault writes have open native-Windows defects (\u003ca href=\"https://github.com/affaan-m/ECC/issues/2489\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/2489/hovercard\"\u003e#2489\u003c/a\u003e, \u003ca href=\"https://github.com/affaan-m/ECC/issues/2626\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/2626/hovercard\"\u003e#2626\u003c/a\u003e). Shell-backed optional features require Git Bash/WSL or are unavailable.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eTreat \u003ccode\u003estable\u003c/code\u003e, \u003ccode\u003ebeta\u003c/code\u003e, \u003ccode\u003eexperimental\u003c/code\u003e, and \u003ccode\u003einstruction-only\u003c/code\u003e below as capability statements, not marketing tiers.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eHarness\u003c/th\u003e\n\u003cth\u003eStatus\u003c/th\u003e\n\u003cth\u003eRecommended distribution\u003c/th\u003e\n\u003cth\u003eImportant limitation\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eClaude Code\u003c/td\u003e\n\u003ctd\u003eStable primary\u003c/td\u003e\n\u003ctd\u003ePlugin or selective installer\u003c/td\u003e\n\u003ctd\u003eThe plugin advertises the installed catalog to the model; use a selective/manual profile when context footprint matters. Optional shell-backed skills are not portable to every OS.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCodex\u003c/td\u003e\n\u003ctd\u003eSupported native plugin\u003c/td\u003e\n\u003ctd\u003eCodex marketplace plugin or repo config\u003c/td\u003e\n\u003ctd\u003eNative hooks require an explicit trust decision and do not use Claude's hook profiles. The legacy sync is compatibility-only.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCursor\u003c/td\u003e\n\u003ctd\u003eBeta project adapter\u003c/td\u003e\n\u003ctd\u003eSelective installer into \u003ccode\u003e.cursor/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAgent discovery varies by Cursor build, and ECC's installer paths do not yet expose identical hook sets (\u003ca href=\"https://github.com/affaan-m/ECC/issues/2419\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/2419/hovercard\"\u003e#2419\u003c/a\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eOpenCode\u003c/td\u003e\n\u003ctd\u003eBeta built plugin\u003c/td\u003e\n\u003ctd\u003eBuild plugin, then selective installer\u003c/td\u003e\n\u003ctd\u003eECC ships a subset of the catalog; connect a provider and select a model in OpenCode (\u003ca href=\"https://github.com/affaan-m/ECC/issues/2617\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/2617/hovercard\"\u003e#2617\u003c/a\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGitHub Copilot\u003c/td\u003e\n\u003ctd\u003eInstruction-only\u003c/td\u003e\n\u003ctd\u003eChecked-in instructions and prompt files\u003c/td\u003e\n\u003ctd\u003eNo ECC hooks, runtime agents, delegation, or native skill discovery.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode\u003c/td\u003e\n\u003ctd\u003eExperimental/minimal adapters\u003c/td\u003e\n\u003ctd\u003eHarness-specific selective target\u003c/td\u003e\n\u003ctd\u003eFile placement and instruction portability are tested; full Claude feature parity is not claimed.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePackage manager detection\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eThe plugin automatically detects your preferred package manager (npm, pnpm, yarn, or bun) with the following priority:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eEnvironment variable\u003c/strong\u003e: \u003ccode\u003eCLAUDE_PACKAGE_MANAGER\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eProject config\u003c/strong\u003e: \u003ccode\u003e.claude/package-manager.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003epackage.json\u003c/strong\u003e: \u003ccode\u003epackageManager\u003c/code\u003e field\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLock file\u003c/strong\u003e: Detection from package-lock.json, yarn.lock, pnpm-lock.yaml, or bun.lockb\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGlobal config\u003c/strong\u003e: \u003ccode\u003e~/.claude/package-manager.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFallback\u003c/strong\u003e: First available package manager\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eTo set your preferred package manager:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Via environment variable\nexport CLAUDE_PACKAGE_MANAGER=pnpm\n\n# Via global config\nnode scripts/setup-package-manager.js --global pnpm\n\n# Via project config\nnode scripts/setup-package-manager.js --project bun\n\n# Detect current setting\nnode scripts/setup-package-manager.js --detect\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Via environment variable\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CLAUDE_PACKAGE_MANAGER=pnpm\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Via global config\u003c/span\u003e\nnode scripts/setup-package-manager.js --global pnpm\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Via project config\u003c/span\u003e\nnode scripts/setup-package-manager.js --project bun\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Detect current setting\u003c/span\u003e\nnode scripts/setup-package-manager.js --detect\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOr use the \u003ccode\u003e/setup-pm\u003c/code\u003e command.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHook runtime controls (env vars)\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eUse runtime flags to tune strictness or disable specific hooks temporarily:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Hook strictness profile (default: standard)\nexport ECC_HOOK_PROFILE=standard\n\n# Comma-separated hook IDs to disable\nexport ECC_DISABLED_HOOKS=\u0026quot;pre:bash:tmux-reminder,post:edit:typecheck\u0026quot;\n\n# Cap SessionStart additional context (default: 8000 chars)\nexport ECC_SESSION_START_MAX_CHARS=4000\n\n# Disable SessionStart additional context entirely for low-context/local-model setups\nexport ECC_SESSION_START_CONTEXT=off\n\n# Session-tmp retention window in days (default: 30).\n# Set to 0, off, false, disabled, never, or none to keep all sessions (disable pruning).\nexport ECC_SESSION_RETENTION_DAYS=14\n\n# Cap how many learned instincts SessionStart injects into context (default: 6)\nexport ECC_MAX_INJECTED_INSTINCTS=6\n\n# Minimum confidence an instinct needs to be injected, 0-1 (default: 0.7)\nexport ECC_INSTINCT_CONFIDENCE_THRESHOLD=0.7\n\n# SessionStart ranks injected instincts by confidence + project/stack relevance\n# (default: on). Project-scoped instincts, and instincts whose domain/trigger\n# matches the detected stack (languages, frameworks, plus terraform/dbt markers),\n# get a small ranking boost so they surface above unrelated higher-confidence\n# ones. Set to off/false/0/no to rank by confidence alone.\nexport ECC_INSTINCT_RELEVANCE_RANKING=on\n\n# Keep context/scope/loop warnings but suppress API-rate cost estimates\nexport ECC_CONTEXT_MONITOR_COST_WARNINGS=off\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Hook strictness profile (default: standard)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_HOOK_PROFILE=standard\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Comma-separated hook IDs to disable\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_DISABLED_HOOKS=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003epre:bash:tmux-reminder,post:edit:typecheck\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Cap SessionStart additional context (default: 8000 chars)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_SESSION_START_MAX_CHARS=4000\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Disable SessionStart additional context entirely for low-context/local-model setups\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_SESSION_START_CONTEXT=off\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Session-tmp retention window in days (default: 30).\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Set to 0, off, false, disabled, never, or none to keep all sessions (disable pruning).\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_SESSION_RETENTION_DAYS=14\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Cap how many learned instincts SessionStart injects into context (default: 6)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_MAX_INJECTED_INSTINCTS=6\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Minimum confidence an instinct needs to be injected, 0-1 (default: 0.7)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_INSTINCT_CONFIDENCE_THRESHOLD=0.7\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e SessionStart ranks injected instincts by confidence + project/stack relevance\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e (default: on). Project-scoped instincts, and instincts whose domain/trigger\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e matches the detected stack (languages, frameworks, plus terraform/dbt markers),\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e get a small ranking boost so they surface above unrelated higher-confidence\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e ones. Set to off/false/0/no to rank by confidence alone.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_INSTINCT_RELEVANCE_RANKING=on\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Keep context/scope/loop warnings but suppress API-rate cost estimates\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_CONTEXT_MONITOR_COST_WARNINGS=off\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWindows PowerShell:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[Environment]::SetEnvironmentVariable('ECC_CONTEXT_MONITOR_COST_WARNINGS', 'off', 'User')\n[Environment]::SetEnvironmentVariable('ECC_SESSION_RETENTION_DAYS', '14', 'User')\"\u003e\u003cpre\u003e[\u003cspan class=\"pl-k\"\u003eEnvironment\u003c/span\u003e]::SetEnvironmentVariable(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eECC_CONTEXT_MONITOR_COST_WARNINGS\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eoff\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eUser\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e)\n[\u003cspan class=\"pl-k\"\u003eEnvironment\u003c/span\u003e]::SetEnvironmentVariable(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eECC_SESSION_RETENTION_DAYS\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e14\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eUser\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAgent data home (multi-harness isolation)\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eMemory persistence hooks (session summaries, learned skills, session aliases, metrics) store data under a single agent data root. By default that root is \u003ccode\u003e~/.claude\u003c/code\u003e. When you use ECC in both Claude Code and Cursor on the same machine, set a separate root for Cursor so the two environments do not overwrite each other's session files:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Cursor-only boundary (Claude Code keeps the default ~/.claude)\nexport ECC_AGENT_DATA_HOME=\u0026quot;$HOME/.cursor/ecc\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Cursor-only boundary (Claude Code keeps the default ~/.claude)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_AGENT_DATA_HOME=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$HOME\u003c/span\u003e/.cursor/ecc\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePaths resolved under that root include:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e$ECC_AGENT_DATA_HOME/session-data/\u003c/code\u003e: session summaries\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$ECC_AGENT_DATA_HOME/skills/learned/\u003c/code\u003e: learned skills from evaluate-session\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$ECC_AGENT_DATA_HOME/session-aliases.json\u003c/code\u003e: session aliases\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$ECC_AGENT_DATA_HOME/metrics/\u003c/code\u003e: cost and activity metrics\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eSee \u003ca href=\"https://github.com/affaan-m/ECC/issues/2065\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/2065/hovercard\"\u003eaffaan-m/ECC#2065\u003c/a\u003e.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCross-tool capability map and per-harness notes\u003c/strong\u003e\u003c/summary\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCross-tool capability map\u003c/h3\u003e\u003ca id=\"user-content-cross-tool-capability-map\" class=\"anchor\" aria-label=\"Permalink: Cross-tool capability map\" href=\"#cross-tool-capability-map\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCapability\u003c/th\u003e\n\u003cth\u003eClaude Code\u003c/th\u003e\n\u003cth\u003eCodex\u003c/th\u003e\n\u003cth\u003eCursor\u003c/th\u003e\n\u003cth\u003eOpenCode\u003c/th\u003e\n\u003cth\u003eGitHub Copilot\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eInstructions\u003c/td\u003e\n\u003ctd\u003eNative\u003c/td\u003e\n\u003ctd\u003eNative \u003ccode\u003eAGENTS.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eProject rules\u003c/td\u003e\n\u003ctd\u003ePlugin instructions\u003c/td\u003e\n\u003ctd\u003eNative instruction file\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSkills\u003c/td\u003e\n\u003ctd\u003eNative installed set\u003c/td\u003e\n\u003ctd\u003eNative plugin set\u003c/td\u003e\n\u003ctd\u003eBuild-dependent/project set\u003c/td\u003e\n\u003ctd\u003eBuilt subset\u003c/td\u003e\n\u003ctd\u003ePrompt/instruction references only\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgents/delegation\u003c/td\u003e\n\u003ctd\u003eNative agents\u003c/td\u003e\n\u003ctd\u003eCodex multi-agent roles; Claude agent files are not installed as roles\u003c/td\u003e\n\u003ctd\u003eBuild-dependent project agents\u003c/td\u003e\n\u003ctd\u003ePlugin agents\u003c/td\u003e\n\u003ctd\u003eNot supported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eECC hooks\u003c/td\u003e\n\u003ctd\u003eNative plugin hooks\u003c/td\u003e\n\u003ctd\u003eNative reviewed subset with explicit trust\u003c/td\u003e\n\u003ctd\u003eCursor hook adapter; install-path differences remain\u003c/td\u003e\n\u003ctd\u003ePlugin events\u003c/td\u003e\n\u003ctd\u003eNot supported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMCP configuration\u003c/td\u003e\n\u003ctd\u003eAvailable, explicit activation\u003c/td\u003e\n\u003ctd\u003eNative plugin manifest; legacy sync can merge TOML\u003c/td\u003e\n\u003ctd\u003eExplicit project/user config\u003c/td\u003e\n\u003ctd\u003eProvider/plugin config\u003c/td\u003e\n\u003ctd\u003eNot supplied by ECC\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eParity with Claude Code\u003c/td\u003e\n\u003ctd\u003ePrimary reference\u003c/td\u003e\n\u003ctd\u003ePartial\u003c/td\u003e\n\u003ctd\u003ePartial\u003c/td\u003e\n\u003ctd\u003ePartial\u003c/td\u003e\n\u003ctd\u003eNot a parity target\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eKey architectural decisions:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eAGENTS.md\u003c/strong\u003e at root is the universal cross-tool file (read by Claude Code, Cursor, Codex, and OpenCode; GitHub Copilot uses \u003ccode\u003e.github/copilot-instructions.md\u003c/code\u003e instead)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDRY adapter pattern\u003c/strong\u003e lets Cursor reuse Claude Code's hook scripts without duplication\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkills format\u003c/strong\u003e (SKILL.md with YAML frontmatter) works across Claude Code, Codex, and OpenCode\u003c/li\u003e\n\u003cli\u003eCodex's narrower native hook set is supplemented by \u003ccode\u003eAGENTS.md\u003c/code\u003e, optional \u003ccode\u003emodel_instructions_file\u003c/code\u003e overrides, and sandbox permissions\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCursor IDE support in depth\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC provides Cursor IDE support with hooks, rules, agents, skills, commands, and MCP configs adapted for Cursor's project layout.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# macOS/Linux\n./install.sh --target cursor typescript\n./install.sh --target cursor python golang swift php\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e macOS/Linux\u003c/span\u003e\n./install.sh --target cursor typescript\n./install.sh --target cursor python golang swift php\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Windows PowerShell\n.\\install.ps1 --target cursor typescript\n.\\install.ps1 --target cursor python golang swift php\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Windows PowerShell\u003c/span\u003e\n.\\install.ps1 \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003etarget cursor typescript\n.\\install.ps1 \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003etarget cursor python golang swift php\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat's included for Cursor\u003c/h4\u003e\u003ca id=\"user-content-whats-included-for-cursor\" class=\"anchor\" aria-label=\"Permalink: What's included for Cursor\" href=\"#whats-included-for-cursor\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eComponent\u003c/th\u003e\n\u003cth\u003eCount\u003c/th\u003e\n\u003cth\u003eDetails\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eHook Events\u003c/td\u003e\n\u003ctd\u003e15\u003c/td\u003e\n\u003ctd\u003esessionStart, beforeShellExecution, afterFileEdit, beforeMCPExecution, beforeSubmitPrompt, and 10 more\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHook Scripts\u003c/td\u003e\n\u003ctd\u003e16\u003c/td\u003e\n\u003ctd\u003eThin Node.js scripts delegating to \u003ccode\u003escripts/hooks/\u003c/code\u003e via shared adapter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRules\u003c/td\u003e\n\u003ctd\u003e34\u003c/td\u003e\n\u003ctd\u003e9 common (alwaysApply) + 25 language-specific (TypeScript, Python, Go, Swift, PHP)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgents\u003c/td\u003e\n\u003ctd\u003e48\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.cursor/agents/ecc-*.md\u003c/code\u003e when installed; prefixed to avoid collisions with user or marketplace agents\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSkills\u003c/td\u003e\n\u003ctd\u003eShared + Bundled\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.cursor/skills/\u003c/code\u003e for translated additions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCommands\u003c/td\u003e\n\u003ctd\u003eShared\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.cursor/commands/\u003c/code\u003e if installed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMCP Config\u003c/td\u003e\n\u003ctd\u003eShared\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.cursor/mcp.json\u003c/code\u003e if installed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCursor loading notes\u003c/h4\u003e\u003ca id=\"user-content-cursor-loading-notes\" class=\"anchor\" aria-label=\"Permalink: Cursor loading notes\" href=\"#cursor-loading-notes\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eECC does not install root \u003ccode\u003eAGENTS.md\u003c/code\u003e into \u003ccode\u003e.cursor/\u003c/code\u003e. Cursor treats nested \u003ccode\u003eAGENTS.md\u003c/code\u003e files as directory context, so copying ECC's repo identity into a host project would pollute that project.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCursor-native loading behavior can vary by Cursor build. ECC installs agents as \u003ccode\u003e.cursor/agents/ecc-*.md\u003c/code\u003e; if your Cursor build does not expose project agents, those files still work as explicit reference definitions instead of hidden global prompt context.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMemory and data isolation (Cursor + Claude Code)\u003c/h4\u003e\u003ca id=\"user-content-memory-and-data-isolation-cursor--claude-code\" class=\"anchor\" aria-label=\"Permalink: Memory and data isolation (Cursor + Claude Code)\" href=\"#memory-and-data-isolation-cursor--claude-code\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eECC memory hooks reuse the same \u003ccode\u003escripts/hooks/*.js\u003c/code\u003e as Claude Code. For Cursor, ECC tries to keep memory \u003cstrong\u003eout of \u003ccode\u003e~/.claude\u003c/code\u003e automatically\u003c/strong\u003e:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eCursor \u003ccode\u003esessionStart\u003c/code\u003e hook\u003c/strong\u003e (installed to \u003ccode\u003e.cursor/hooks.json\u003c/code\u003e on \u003ccode\u003e--target cursor\u003c/code\u003e) injects \u003ccode\u003eECC_AGENT_DATA_HOME\u003c/code\u003e for the whole composer session.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHook runtime default\u003c/strong\u003e: when \u003ccode\u003eCURSOR_VERSION\u003c/code\u003e or \u003ccode\u003eCURSOR_PROJECT_DIR\u003c/code\u003e is present, hooks default to \u003ccode\u003e~/.cursor/ecc\u003c/code\u003e if the env var is unset.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eProject config\u003c/strong\u003e: \u003ccode\u003e.cursor/ecc-agent-data.json\u003c/code\u003e documents and overrides the path (\u003ccode\u003eagentDataHome\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAlways-on rule\u003c/strong\u003e: \u003ccode\u003e.cursor/rules/ecc-agent-data-home.mdc\u003c/code\u003e reminds the agent where memory lives.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eYou can still override explicitly:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export ECC_AGENT_DATA_HOME=\u0026quot;$HOME/.cursor/ecc\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e ECC_AGENT_DATA_HOME=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$HOME\u003c/span\u003e/.cursor/ecc\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo \u003cstrong\u003eshare\u003c/strong\u003e memory with Claude Code on purpose, set \u003ccode\u003eECC_AGENT_DATA_HOME=~/.claude\u003c/code\u003e in the shell or in \u003ccode\u003e.cursor/ecc-agent-data.json\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eContinuous learning v2 instincts remain separate under \u003ccode\u003eCLV2_HOMUNCULUS_DIR\u003c/code\u003e (default \u003ccode\u003e~/.local/share/ecc-homunculus\u003c/code\u003e).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHook architecture (DRY adapter pattern)\u003c/h4\u003e\u003ca id=\"user-content-hook-architecture-dry-adapter-pattern\" class=\"anchor\" aria-label=\"Permalink: Hook architecture (DRY adapter pattern)\" href=\"#hook-architecture-dry-adapter-pattern\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCursor has \u003cstrong\u003emore hook events than Claude Code\u003c/strong\u003e (20 vs 8). The \u003ccode\u003e.cursor/hooks/adapter.js\u003c/code\u003e module transforms Cursor's stdin JSON to Claude Code's format, allowing existing \u003ccode\u003escripts/hooks/*.js\u003c/code\u003e to be reused without duplication.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Cursor stdin JSON -\u0026gt; adapter.js -\u0026gt; transforms -\u0026gt; scripts/hooks/*.js\n                                                (shared with Claude Code)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eCursor stdin JSON -\u0026gt; adapter.js -\u0026gt; transforms -\u0026gt; scripts/hooks/*.js\n                                                (shared with Claude Code)\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eKey hooks:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003ebeforeShellExecution\u003c/strong\u003e: Blocks dev servers outside tmux (exit 2), git push review\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eafterFileEdit\u003c/strong\u003e: Auto-format + TypeScript check + console.log warning\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ebeforeSubmitPrompt\u003c/strong\u003e: Detects secrets (sk-, ghp_, AKIA patterns) in prompts\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ebeforeTabFileRead\u003c/strong\u003e: Blocks Tab from reading .env, .key, .pem files (exit 2)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ebeforeMCPExecution / afterMCPExecution\u003c/strong\u003e: MCP audit logging\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRules format\u003c/h4\u003e\u003ca id=\"user-content-rules-format\" class=\"anchor\" aria-label=\"Permalink: Rules format\" href=\"#rules-format\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCursor rules use YAML frontmatter with \u003ccode\u003edescription\u003c/code\u003e, \u003ccode\u003eglobs\u003c/code\u003e, and \u003ccode\u003ealwaysApply\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"---\ndescription: \u0026quot;TypeScript coding style extending common rules\u0026quot;\nglobs: [\u0026quot;**/*.ts\u0026quot;, \u0026quot;**/*.tsx\u0026quot;, \u0026quot;**/*.js\u0026quot;, \u0026quot;**/*.jsx\u0026quot;]\nalwaysApply: false\n---\"\u003e\u003cpre\u003e---\n\u003cspan class=\"pl-ent\"\u003edescription\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eTypeScript coding style extending common rules\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003eglobs\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e[\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003ealwaysApply\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\n---\u003c/pre\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCodex macOS app + CLI support in depth\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC provides a supported native Codex marketplace plugin and repo-local configuration for the macOS app and CLI. The native plugin carries shared skills, MCP configuration, and a reviewed hook subset; Codex keeps hook trust under explicit user control. The older sync path remains compatibility-only. For repo navigation, surface ownership, and PR diff packet guidance, start with \u003ca href=\"/96loveslife/ECC/blob/main/docs/CODEX-NAVIGATION-GUIDE.md\"\u003e\u003ccode\u003edocs/CODEX-NAVIGATION-GUIDE.md\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Recommended current install: add ECC's native plugin from the repo marketplace\ncodex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\n\n# Or run Codex CLI in the repo: AGENTS.md and .codex/ are auto-detected\ncodex\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Recommended current install: add ECC's native plugin from the repo marketplace\u003c/span\u003e\ncodex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Or run Codex CLI in the repo: AGENTS.md and .codex/ are auto-detected\u003c/span\u003e\ncodex\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLegacy copied-configuration compatibility is still available when you intentionally need it:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Compatibility-only managed sync into ~/.codex\nnpm install \u0026amp;\u0026amp; bash scripts/sync-ecc-to-codex.sh\n\n# Or copy only the reference config manually\ncp .codex/config.toml ~/.codex/config.toml\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Compatibility-only managed sync into ~/.codex\u003c/span\u003e\nnpm install \u003cspan class=\"pl-k\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e bash scripts/sync-ecc-to-codex.sh\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Or copy only the reference config manually\u003c/span\u003e\ncp .codex/config.toml \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.codex/config.toml\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe sync script safely merges ECC MCP servers into your existing \u003ccode\u003e~/.codex/config.toml\u003c/code\u003e using an \u003cstrong\u003eadd-only\u003c/strong\u003e strategy: it never removes or modifies your existing servers. Run with \u003ccode\u003e--dry-run\u003c/code\u003e to preview changes, or \u003ccode\u003e--update-mcp\u003c/code\u003e to force-refresh ECC servers to the latest recommended config.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor Context7, ECC uses the canonical Codex section name \u003ccode\u003e[mcp_servers.context7]\u003c/code\u003e while still launching the \u003ccode\u003e@upstash/context7-mcp\u003c/code\u003e package. If you already have a legacy \u003ccode\u003e[mcp_servers.context7-mcp]\u003c/code\u003e entry, \u003ccode\u003e--update-mcp\u003c/code\u003e migrates it to the canonical section name.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCodex macOS app:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eOpen this repository as your workspace.\u003c/li\u003e\n\u003cli\u003eThe root \u003ccode\u003eAGENTS.md\u003c/code\u003e is auto-detected.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.codex/config.toml\u003c/code\u003e and \u003ccode\u003e.codex/agents/*.toml\u003c/code\u003e work best when kept project-local.\u003c/li\u003e\n\u003cli\u003eThe reference \u003ccode\u003e.codex/config.toml\u003c/code\u003e intentionally does not pin \u003ccode\u003emodel\u003c/code\u003e or \u003ccode\u003emodel_provider\u003c/code\u003e, so Codex uses its own current default unless you override it.\u003c/li\u003e\n\u003cli\u003eOptional: copy \u003ccode\u003e.codex/config.toml\u003c/code\u003e to \u003ccode\u003e~/.codex/config.toml\u003c/code\u003e for global defaults; keep the multi-agent role files project-local unless you also copy \u003ccode\u003e.codex/agents/\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat's included in the repo and legacy configuration layer\u003c/h4\u003e\u003ca id=\"user-content-whats-included-in-the-repo-and-legacy-configuration-layer\" class=\"anchor\" aria-label=\"Permalink: What's included in the repo and legacy configuration layer\" href=\"#whats-included-in-the-repo-and-legacy-configuration-layer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eComponent\u003c/th\u003e\n\u003cth\u003eCount\u003c/th\u003e\n\u003cth\u003eDetails\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eConfig\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.codex/config.toml\u003c/code\u003e: top-level approvals/sandbox/web_search, MCP servers, notifications, profiles\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAGENTS.md\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003eRoot (universal) + \u003ccode\u003e.codex/AGENTS.md\u003c/code\u003e (Codex-specific supplement)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSkills\u003c/td\u003e\n\u003ctd\u003e32\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.agents/skills/\u003c/code\u003e: SKILL.md + agents/openai.yaml per skill\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMCP Servers\u003c/td\u003e\n\u003ctd\u003e6\u003c/td\u003e\n\u003ctd\u003eGitHub, Context7, Exa, Memory, Playwright, Sequential Thinking (7 with Supabase via \u003ccode\u003e--update-mcp\u003c/code\u003e sync)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eProfiles\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003estrict\u003c/code\u003e (read-only sandbox) and \u003ccode\u003eyolo\u003c/code\u003e (full auto-approve)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgent Roles\u003c/td\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.codex/agents/\u003c/code\u003e: explorer, reviewer, docs-researcher\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eSkills at \u003ccode\u003e.agents/skills/\u003c/code\u003e are auto-loaded by Codex. Canonical Anthropic skills such as \u003ccode\u003eclaude-api\u003c/code\u003e, \u003ccode\u003efrontend-design\u003c/code\u003e, and \u003ccode\u003eskill-creator\u003c/code\u003e are intentionally not re-bundled here. Install those from \u003ca href=\"https://github.com/anthropics/skills\"\u003e\u003ccode\u003eanthropics/skills\u003c/code\u003e\u003c/a\u003e when you want the official versions.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eKey limitation\u003c/h4\u003e\u003ca id=\"user-content-key-limitation\" class=\"anchor\" aria-label=\"Permalink: Key limitation\" href=\"#key-limitation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCodex does \u003cstrong\u003enot provide Claude-style hook execution parity\u003c/strong\u003e. The native ECC plugin includes a reviewed hook subset that requires explicit trust in \u003ccode\u003e/hooks\u003c/code\u003e; \u003ccode\u003eAGENTS.md\u003c/code\u003e, optional \u003ccode\u003emodel_instructions_file\u003c/code\u003e overrides, and sandbox/approval settings provide the remaining instruction and policy layers.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMulti-agent support\u003c/h4\u003e\u003ca id=\"user-content-multi-agent-support\" class=\"anchor\" aria-label=\"Permalink: Multi-agent support\" href=\"#multi-agent-support\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCurrent Codex builds support stable multi-agent workflows.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eEnable \u003ccode\u003efeatures.multi_agent = true\u003c/code\u003e in \u003ccode\u003e.codex/config.toml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eDefine roles under \u003ccode\u003e[agents.\u0026lt;name\u0026gt;]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePoint each role at a file under \u003ccode\u003e.codex/agents/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003e/agent\u003c/code\u003e in the CLI to inspect or steer child agents\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eECC ships three sample role configs:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eRole\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexplorer\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRead-only codebase evidence gathering before edits\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereviewer\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCorrectness, security, and missing-test review\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edocs_researcher\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDocumentation and API verification before release/docs changes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eZed support\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC provides Zed project support through a conservative \u003ccode\u003e.zed\u003c/code\u003e adapter for project-local settings, flattened rules, agents, commands, and skills.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./install.sh --profile minimal --target zed\"\u003e\u003cpre\u003e./install.sh --profile minimal --target zed\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\".\\install.ps1 --profile minimal --target zed\"\u003e\u003cpre\u003e.\\install.ps1 \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003eprofile minimal \u003cspan class=\"pl-k\"\u003e--\u003c/span\u003etarget zed\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe adapter writes ECC-managed files under \u003ccode\u003e.zed/\u003c/code\u003e and keeps BYOK/OpenRouter credentials out of the repo. Configure Zed account or API keys through Zed's own settings UI or your local user settings.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eOpenCode support in depth\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC provides a beta OpenCode plugin integration with instructions, a catalog subset, commands, custom tools, and hook events. It does not provide feature parity with Claude Code. The reference config inherits the user's OpenCode model selection instead of pinning a provider-specific model.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Run your reviewed OpenCode installation in the repository root\nopencode\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Run your reviewed OpenCode installation in the repository root\u003c/span\u003e\nopencode\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor installation, use the \u003ca href=\"https://opencode.ai/docs/\" rel=\"nofollow\"\u003eofficial OpenCode instructions\u003c/a\u003e, select an exact release, and verify it before execution. The upstream npm package is \u003ccode\u003eopencode-ai\u003c/code\u003e, not \u003ccode\u003eopencode\u003c/code\u003e. ECC does not attest to an audited OpenCode runtime version.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe configuration is automatically detected from \u003ccode\u003e.opencode/opencode.json\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHook support via plugins\u003c/h4\u003e\u003ca id=\"user-content-hook-support-via-plugins\" class=\"anchor\" aria-label=\"Permalink: Hook support via plugins\" href=\"#hook-support-via-plugins\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpenCode's plugin system has 20+ event types:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eClaude Code Hook\u003c/th\u003e\n\u003cth\u003eOpenCode Plugin Event\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePreToolUse\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etool.execute.before\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePostToolUse\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etool.execute.after\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eStop\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esession.idle\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSessionStart\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esession.created\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSessionEnd\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003esession.deleted\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAdditional OpenCode events\u003c/strong\u003e: \u003ccode\u003efile.edited\u003c/code\u003e, \u003ccode\u003efile.watcher.updated\u003c/code\u003e, \u003ccode\u003emessage.updated\u003c/code\u003e, \u003ccode\u003elsp.client.diagnostics\u003c/code\u003e, \u003ccode\u003etui.toast.show\u003c/code\u003e, and more.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePlugin installation\u003c/h4\u003e\u003ca id=\"user-content-plugin-installation\" class=\"anchor\" aria-label=\"Permalink: Plugin installation\" href=\"#plugin-installation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eOption 1: Use directly\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd ECC\nopencode\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e ECC\nopencode\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eOption 2: Install as npm package\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm install ecc-universal@2.2.2\"\u003e\u003cpre\u003enpm install ecc-universal@2.2.2\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen add to your \u003ccode\u003eopencode.json\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;plugin\u0026quot;: [\u0026quot;ecc-universal\u0026quot;]\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"plugin\"\u003c/span\u003e: [\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eecc-universal\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e]\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThat npm plugin entry enables ECC's published OpenCode plugin module (hooks/events and plugin tools). It does \u003cstrong\u003enot\u003c/strong\u003e automatically add ECC's full command/agent/instruction catalog to your project config.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor the full ECC OpenCode setup, either:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003erun OpenCode inside this repository, or\u003c/li\u003e\n\u003cli\u003ecopy the bundled \u003ccode\u003e.opencode/\u003c/code\u003e config assets into your project and wire the \u003ccode\u003einstructions\u003c/code\u003e, \u003ccode\u003eagent\u003c/code\u003e, and \u003ccode\u003ecommand\u003c/code\u003e entries in \u003ccode\u003eopencode.json\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDocumentation\u003c/h4\u003e\u003ca id=\"user-content-documentation\" class=\"anchor\" aria-label=\"Permalink: Documentation\" href=\"#documentation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eMigration Guide\u003c/strong\u003e: \u003ccode\u003e.opencode/MIGRATION.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOpenCode Plugin README\u003c/strong\u003e: \u003ccode\u003e.opencode/README.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConsolidated Rules\u003c/strong\u003e: \u003ccode\u003e.opencode/instructions/INSTRUCTIONS.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLLM Documentation\u003c/strong\u003e: \u003ccode\u003ellms.txt\u003c/code\u003e (complete OpenCode docs for LLMs)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGitHub Copilot support in depth\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC provides \u003cstrong\u003eGitHub Copilot support\u003c/strong\u003e for VS Code via Copilot Chat's native instruction and prompt file system. No extra tooling required.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat's included for GitHub Copilot\u003c/h4\u003e\u003ca id=\"user-content-whats-included-for-github-copilot\" class=\"anchor\" aria-label=\"Permalink: What's included for GitHub Copilot\" href=\"#whats-included-for-github-copilot\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eComponent\u003c/th\u003e\n\u003cth\u003eFile\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eCore instructions\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.github/copilot-instructions.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlways-loaded rules: coding style, security, testing, git workflow\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVS Code settings\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.vscode/settings.json\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePer-task instruction files for code gen, test gen, and commit messages\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlan prompt\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.github/prompts/plan.prompt.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePhased implementation planning\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTDD prompt\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.github/prompts/tdd.prompt.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRed-Green-Improve cycle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSecurity review prompt\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.github/prompts/security-review.prompt.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDeep OWASP-aligned security analysis\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild fix prompt\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.github/prompts/build-fix.prompt.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSystematic build and CI error resolution\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRefactor prompt\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e.github/prompts/refactor.prompt.md\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDead code cleanup and simplification\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eThe files are already in place: open any repo that contains this project and GitHub Copilot Chat will automatically pick up \u003ccode\u003e.github/copilot-instructions.md\u003c/code\u003e. The committed \u003ccode\u003e.vscode/settings.json\u003c/code\u003e enables \u003ccode\u003echat.promptFiles\u003c/code\u003e so VS Code can load the reusable prompts from \u003ccode\u003e.github/prompts/\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo use the workflow prompts in Copilot Chat:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eOpen the Copilot Chat panel in VS Code.\u003c/li\u003e\n\u003cli\u003eClick the \u003cstrong\u003epaperclip / attach\u003c/strong\u003e icon and select \u003cstrong\u003ePrompt...\u003c/strong\u003e, or type \u003ccode\u003e/\u003c/code\u003e and choose a prompt.\u003c/li\u003e\n\u003cli\u003eSelect the prompt (e.g. \u003ccode\u003eplan\u003c/code\u003e, \u003ccode\u003etdd\u003c/code\u003e, \u003ccode\u003esecurity-review\u003c/code\u003e).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFeature coverage\u003c/h4\u003e\u003ca id=\"user-content-feature-coverage\" class=\"anchor\" aria-label=\"Permalink: Feature coverage\" href=\"#feature-coverage\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eECC Feature\u003c/th\u003e\n\u003cth\u003eCopilot equivalent\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eCoding standards\u003c/td\u003e\n\u003ctd\u003eAlways-on via \u003ccode\u003ecopilot-instructions.md\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSecurity checklist\u003c/td\u003e\n\u003ctd\u003eAlways-on + \u003ccode\u003esecurity-review\u003c/code\u003e prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTesting / TDD\u003c/td\u003e\n\u003ctd\u003eAlways-on + \u003ccode\u003etdd\u003c/code\u003e prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eImplementation planning\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eplan\u003c/code\u003e prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCode review\u003c/td\u003e\n\u003ctd\u003eExternal PR review via CodeRabbit + Greptile\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuild error resolution\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebuild-fix\u003c/code\u003e prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRefactoring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erefactor\u003c/code\u003e prompt\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCommit message format\u003c/td\u003e\n\u003ctd\u003ePer-task instruction in \u003ccode\u003esettings.json\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHooks / automation\u003c/td\u003e\n\u003ctd\u003eNot supported (Copilot has no hook system)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAgents / delegation\u003c/td\u003e\n\u003ctd\u003eNot supported (Copilot has no subagent API)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLimitations\u003c/h4\u003e\u003ca id=\"user-content-limitations\" class=\"anchor\" aria-label=\"Permalink: Limitations\" href=\"#limitations\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eGitHub Copilot does not have a hook system or a subagent API, so ECC's hook automations (auto-format, TypeScript check, session persistence, dev-server guard) and agent delegation are unavailable. The instruction and prompt layer still brings the full ECC coding philosophy (standards, security, TDD, and workflow) into every Copilot Chat session.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat changed in v2.0.0\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC v2.0.0 stabilizes the 2.0 line with the public Hermes operator story, 281 skills, 67 agents, 94 command shims, session adapters, MCP inventory, worktree lifecycle services, orchestrator workflows, and the ECC Discord community.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/releases/2.0.0/release-notes.md\"\u003ev2.0.0 release notes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/ECC-2.0-REFERENCE-ARCHITECTURE.md\"\u003eECC 2.0 reference architecture\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/HERMES-SETUP.md\"\u003eHermes setup guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/MIGRATION-1X-TO-2.0.md\"\u003eMigration guide from 1.x\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eToken Optimization\u003c/h2\u003e\u003ca id=\"user-content-token-optimization\" class=\"anchor\" aria-label=\"Permalink: Token Optimization\" href=\"#token-optimization\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAgent usage can be expensive if you don't manage token consumption. These settings significantly reduce costs without sacrificing quality. Full guide: \u003ca href=\"/96loveslife/ECC/blob/main/docs/token-optimization.md\"\u003edocs/token-optimization.md\u003c/a\u003e.\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eRecommended settings\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eAdd to \u003ccode\u003e~/.claude/settings.json\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;model\u0026quot;: \u0026quot;sonnet\u0026quot;,\n  \u0026quot;env\u0026quot;: {\n    \u0026quot;MAX_THINKING_TOKENS\u0026quot;: \u0026quot;10000\u0026quot;,\n    \u0026quot;CLAUDE_AUTOCOMPACT_PCT_OVERRIDE\u0026quot;: \u0026quot;50\u0026quot;,\n    \u0026quot;CLAUDE_CODE_SUBAGENT_MODEL\u0026quot;: \u0026quot;haiku\u0026quot;\n  }\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"model\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esonnet\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n  \u003cspan class=\"pl-ent\"\u003e\"env\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"MAX_THINKING_TOKENS\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e10000\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e50\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"CLAUDE_CODE_SUBAGENT_MODEL\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehaiku\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n  }\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSetting\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eRecommended\u003c/th\u003e\n\u003cth\u003eImpact\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emodel\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eopus\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003esonnet\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e~60% cost reduction; handles 80%+ of coding tasks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eMAX_THINKING_TOKENS\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e31,999\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003e10,000\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e~70% reduction in hidden thinking cost per request\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCLAUDE_AUTOCOMPACT_PCT_OVERRIDE\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e95\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003e50\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eCompacts earlier, better quality in long sessions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eECC_CONTEXT_MONITOR_COST_WARNINGS\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eon\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eoff for subscription users\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eSuppresses agent-facing API-rate estimate warnings while keeping context/scope/loop warnings\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eSwitch to Opus only when you need deep architectural reasoning:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/model opus\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e/model opus\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eDaily workflow commands\u003c/strong\u003e\u003c/summary\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCommand\u003c/th\u003e\n\u003cth\u003eWhen to Use\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/model sonnet\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefault for most tasks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/model opus\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eComplex architecture, debugging, deep reasoning\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/clear\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBetween unrelated tasks (free, instant reset)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/compact\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAt logical task breakpoints (research done, milestone complete)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/cost\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMonitor token spending during session\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eIf you use a subscription and the context monitor's API-rate estimates are not useful, set \u003ccode\u003eECC_CONTEXT_MONITOR_COST_WARNINGS=off\u003c/code\u003e. This only suppresses the agent-facing cost warnings; it does not disable context exhaustion, scope, or loop warnings.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eStrategic compaction\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003estrategic-compact\u003c/code\u003e skill suggests \u003ccode\u003e/compact\u003c/code\u003e at logical breakpoints instead of relying on auto-compaction at 95% context. See \u003ccode\u003eskills/strategic-compact/SKILL.md\u003c/code\u003e for the full decision guide.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhen to compact:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAfter research/exploration, before implementation\u003c/li\u003e\n\u003cli\u003eAfter completing a milestone, before starting the next\u003c/li\u003e\n\u003cli\u003eAfter debugging, before continuing feature work\u003c/li\u003e\n\u003cli\u003eAfter a failed approach, before trying a new one\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhen NOT to compact:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eMid-implementation (you'll lose variable names, file paths, partial state)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eContext window management\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eCritical:\u003c/strong\u003e Don't enable all MCPs at once. Each MCP tool description consumes tokens from your 200k window, potentially reducing it to ~70k.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eKeep under 10 MCPs enabled per project\u003c/li\u003e\n\u003cli\u003eKeep under 80 tools active\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003e/mcp\u003c/code\u003e to disable unused Claude Code MCP servers; those runtime choices persist in \u003ccode\u003e~/.claude.json\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003eECC_DISABLED_MCPS\u003c/code\u003e only to filter ECC-generated MCP configs during install/sync flows\u003c/li\u003e\n\u003cli\u003eIf context is getting heavy, run \u003ccode\u003e/context-budget\u003c/code\u003e and remove rules you do not need\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAgent teams cost warning:\u003c/strong\u003e Agent Teams spawns multiple context windows. Each teammate consumes tokens independently. Only use for tasks where parallelism provides clear value (multi-module work, parallel reviews). For simple sequential tasks, subagents are more token-efficient.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRequirements\u003c/h2\u003e\u003ca id=\"user-content-requirements\" class=\"anchor\" aria-label=\"Permalink: Requirements\" href=\"#requirements\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eClaude Code CLI version + hooks auto-loading behavior\u003c/strong\u003e\u003c/summary\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eClaude Code CLI version\u003c/h3\u003e\u003ca id=\"user-content-claude-code-cli-version\" class=\"anchor\" aria-label=\"Permalink: Claude Code CLI version\" href=\"#claude-code-cli-version\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eMinimum version: v2.1.0 or later.\u003c/strong\u003e The plugin requires Claude Code CLI v2.1.0+ due to changes in how the plugin system handles hooks.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCheck your version:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"claude --version\"\u003e\u003cpre\u003eclaude --version\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eImportant: hooks auto-loading behavior\u003c/h3\u003e\u003ca id=\"user-content-important-hooks-auto-loading-behavior\" class=\"anchor\" aria-label=\"Permalink: Important: hooks auto-loading behavior\" href=\"#important-hooks-auto-loading-behavior\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eWARNING: \u003cstrong\u003eFor Contributors:\u003c/strong\u003e Do NOT add a \u003ccode\u003e\"hooks\"\u003c/code\u003e field to \u003ccode\u003e.claude-plugin/plugin.json\u003c/code\u003e. This is enforced by a regression test.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eClaude Code v2.1+ \u003cstrong\u003eautomatically loads\u003c/strong\u003e \u003ccode\u003ehooks/hooks.json\u003c/code\u003e from any installed plugin by convention. Explicitly declaring it in \u003ccode\u003eplugin.json\u003c/code\u003e causes a duplicate detection error:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Duplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eDuplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eHistory:\u003c/strong\u003e This has caused repeated fix/revert cycles in this repo (\u003ca href=\"https://github.com/affaan-m/ECC/issues/29\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/29/hovercard\"\u003e#29\u003c/a\u003e, \u003ca href=\"https://github.com/affaan-m/ECC/issues/52\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/52/hovercard\"\u003e#52\u003c/a\u003e, \u003ca href=\"https://github.com/affaan-m/ECC/issues/103\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/103/hovercard\"\u003e#103\u003c/a\u003e). The behavior changed between Claude Code versions, leading to confusion. There is now a regression test to prevent this from being reintroduced.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSecurity\u003c/h2\u003e\u003ca id=\"user-content-security\" class=\"anchor\" aria-label=\"Permalink: Security\" href=\"#security\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eInstall ECC only from official sources:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eGitHub repository: \u003ca href=\"https://github.com/affaan-m/ECC\"\u003ehttps://github.com/affaan-m/ECC\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClaude Code plugin: \u003ccode\u003eecc@ecc\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003enpm packages: \u003ca href=\"https://www.npmjs.com/package/ecc-universal\" rel=\"nofollow\"\u003e\u003ccode\u003eecc-universal\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://www.npmjs.com/package/ecc-agentshield\" rel=\"nofollow\"\u003e\u003ccode\u003eecc-agentshield\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGitHub App: \u003ca href=\"https://github.com/apps/ecc-tools\"\u003ehttps://github.com/apps/ecc-tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWebsite: \u003ca href=\"https://ecc.tools\" rel=\"nofollow\"\u003ehttps://ecc.tools\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eScan a project with an already installed, reviewed AgentShield binary (see \u003ca href=\"#agentshield-runner-provenance\"\u003erunner provenance\u003c/a\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"agentshield scan --path .\"\u003e\u003cpre\u003eagentshield scan --path \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eReport a vulnerability.\u003c/strong\u003e Use the private process in \u003ca href=\"/96loveslife/ECC/blob/main/SECURITY.md\"\u003eSECURITY.md\u003c/a\u003e (GitHub private vulnerability reporting). Please do not open public issues for security reports.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuilt-in guardrails.\u003c/strong\u003e GateGuard gates destructive shell commands (including \u003ccode\u003erm\u003c/code\u003e, force/path \u003ccode\u003egit checkout\u003c/code\u003e, and destructive \u003ccode\u003efind -exec\u003c/code\u003e) before they run; the supply-chain IOC scanner runs in CI; and AgentShield audits your own agent, hook, MCP, permission, and secret surfaces (\u003ccode\u003e/security-scan\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHooks, MCP servers, and context controls\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eHooks can run shell commands, MCP servers can hold credentials, and project instructions can enter an agent's context. Treat all three as executable configuration.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eDo not copy raw \u003ccode\u003ehooks/hooks.json\u003c/code\u003e into \u003ccode\u003e~/.claude/settings.json\u003c/code\u003e after a plugin install. Modern Claude Code versions load plugin hooks automatically, and a second copy can make them fire twice.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003e/mcp\u003c/code\u003e for Claude Code runtime disables; Claude Code persists those choices in \u003ccode\u003e~/.claude.json\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eECC_DISABLED_MCPS\u003c/code\u003e is an ECC install/sync filter, not a live Claude Code toggle.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf context is getting heavy, run \u003ccode\u003e/context-budget\u003c/code\u003e, remove rules you do not need, and disable unused MCP servers. See the \u003ca href=\"/96loveslife/ECC/blob/main/docs/token-optimization.md\"\u003etoken optimization guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/details\u003e\n\u003cp dir=\"auto\"\u003eSecurity references:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/SECURITY.md\"\u003eSecurity policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/the-security-guide.md\"\u003eSecurity guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/MCP-CONNECTOR-POLICY.md\"\u003eMCP connector policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/security/supply-chain-incident-response.md\"\u003eSupply-chain incident response\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eEcosystem Tools\u003c/h2\u003e\u003ca id=\"user-content-ecosystem-tools\" class=\"anchor\" aria-label=\"Permalink: Ecosystem Tools\" href=\"#ecosystem-tools\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eSkill Creator: generate skills from your git history\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eTwo ways to generate skills from your repository:\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOption A: Local Analysis (Built-in)\u003c/h3\u003e\u003ca id=\"user-content-option-a-local-analysis-built-in\" class=\"anchor\" aria-label=\"Permalink: Option A: Local Analysis (Built-in)\" href=\"#option-a-local-analysis-built-in\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse the \u003ccode\u003e/skill-create\u003c/code\u003e command for local analysis without external services:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"/skill-create                    # Analyze current repo\n/skill-create --instincts        # Also generate instincts for continuous-learning-v2\"\u003e\u003cpre\u003e/skill-create                    \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Analyze current repo\u003c/span\u003e\n/skill-create --instincts        \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Also generate instincts for continuous-learning-v2\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis analyzes your git history locally and generates SKILL.md files.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOption B: GitHub App (Advanced)\u003c/h3\u003e\u003ca id=\"user-content-option-b-github-app-advanced\" class=\"anchor\" aria-label=\"Permalink: Option B: GitHub App (Advanced)\" href=\"#option-b-github-app-advanced\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor advanced features (10k+ commits, auto-PRs, team sharing):\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/apps/ecc-tools\"\u003eInstall ECC Tools GitHub App\u003c/a\u003e | \u003ca href=\"https://ecc.tools\" rel=\"nofollow\"\u003eecc.tools\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Comment on any issue:\n/ecc-tools analyze\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Comment on any issue:\u003c/span\u003e\n/ecc-tools analyze\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBoth options create:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eSKILL.md files\u003c/strong\u003e: Ready-to-use skills for the active harness\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInstinct collections\u003c/strong\u003e: For continuous-learning-v2\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePattern extraction\u003c/strong\u003e: Learns from your commit history\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAgentShield: security auditor for agent configs\u003c/strong\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eBuilt at the Claude Code Hackathon (Cerebral Valley x Anthropic, Feb 2026). 1282 tests, 98% coverage, 102 static analysis rules.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eScan your agent configuration for vulnerabilities, misconfigurations, and injection risks.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca id=\"user-content-agentshield-runner-provenance\"\u003e\u003c/a\u003e\n\u003cstrong\u003eRunner provenance:\u003c/strong\u003e these commands require an already installed, reviewed AgentShield binary from \u003ccode\u003eecc-agentshield\u003c/code\u003e. The \u003ca href=\"https://www.npmjs.com/package/ecc-agentshield\" rel=\"nofollow\"\u003eofficial package\u003c/a\u003e documents the \u003ccode\u003eagentshield\u003c/code\u003e CLI. Record the selected release, reviewed source and verified package integrity in your installation record. Registry publication alone does not establish an audit; ECC does not supply an audited AgentShield pin here. Do not substitute an unversioned one-shot download. \u003ccode\u003e/security-scan\u003c/code\u003e is workflow guidance and has the same runner prerequisite.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Scan only the intended project directory\nagentshield scan --path .\n\n# Auto-fix safe issues\nagentshield scan --path . --fix\n\n# Deep analysis with three Opus 4.6 agents\nagentshield scan --path . --opus --stream\n\n# Generate secure config from scratch\nagentshield init\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Scan only the intended project directory\u003c/span\u003e\nagentshield scan --path \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Auto-fix safe issues\u003c/span\u003e\nagentshield scan --path \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e --fix\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Deep analysis with three Opus 4.6 agents\u003c/span\u003e\nagentshield scan --path \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e --opus --stream\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Generate secure config from scratch\u003c/span\u003e\nagentshield init\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhat it scans:\u003c/strong\u003e CLAUDE.md, settings.json, MCP configs, hooks, agent definitions, and skills across 5 categories: secrets detection (14 patterns), permission auditing, hook injection analysis, MCP server risk profiling, and agent config review.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eThe \u003ccode\u003e--opus\u003c/code\u003e flag\u003c/strong\u003e runs three Claude Opus 4.6 agents in a red-team/blue-team/auditor pipeline. The attacker finds exploit chains, the defender evaluates protections, and the auditor synthesizes both into a prioritized risk assessment. Adversarial reasoning, not just pattern matching.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eOutput formats:\u003c/strong\u003e Terminal (color-graded A-F), JSON (CI pipelines), Markdown, HTML. Exit code 2 on critical findings for build gates.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003e/security-scan\u003c/code\u003e in Claude Code to run it, or add to CI with the \u003ca href=\"https://github.com/affaan-m/agentshield\"\u003eGitHub Action\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/affaan-m/agentshield\"\u003eGitHub\u003c/a\u003e | \u003ca href=\"https://www.npmjs.com/package/ecc-agentshield\" rel=\"nofollow\"\u003enpm\u003c/a\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eContinuous Learning v2: instincts\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eThe instinct-based learning system automatically learns your patterns:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"/instinct-status        # Show learned instincts with confidence\n/instinct-import \u0026lt;file\u0026gt; # Import instincts from others\n/instinct-export        # Export your instincts for sharing\n/evolve                 # Cluster related instincts into skills\"\u003e\u003cpre\u003e/instinct-status        \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Show learned instincts with confidence\u003c/span\u003e\n/instinct-import \u003cspan class=\"pl-k\"\u003e\u0026lt;\u003c/span\u003efile\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Import instincts from others\u003c/span\u003e\n/instinct-export        \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Export your instincts for sharing\u003c/span\u003e\n/evolve                 \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Cluster related instincts into skills\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSee \u003ccode\u003eskills/continuous-learning-v2/\u003c/code\u003e for full documentation. Keep \u003ccode\u003econtinuous-learning/\u003c/code\u003e only when you explicitly want the legacy v1 Stop-hook learned-skill flow.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTroubleshooting\u003c/h2\u003e\u003ca id=\"user-content-troubleshooting\" class=\"anchor\" aria-label=\"Permalink: Troubleshooting\" href=\"#troubleshooting\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eECC appears twice or hooks fire twice\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eThe usual cause is installing the Claude plugin and then running \u003ccode\u003e./install.sh --profile full\u003c/code\u003e on top of it.\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eRemove the Claude Code plugin install.\u003c/li\u003e\n\u003cli\u003eRun \u003ccode\u003enode scripts/ecc.js uninstall --dry-run\u003c/code\u003e from the ECC checkout.\u003c/li\u003e\n\u003cli\u003eRemove extra rule folders you manually copied and no longer want.\u003c/li\u003e\n\u003cli\u003eReinstall once, using one path.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eFor hook-specific checks, see the \u003ca href=\"/96loveslife/ECC/blob/main/hooks/README.md\"\u003ehooks README\u003c/a\u003e.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eMy hooks aren't working / \"Duplicate hooks file\" errors\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDo NOT add a \u003ccode\u003e\"hooks\"\u003c/code\u003e field to \u003ccode\u003e.claude-plugin/plugin.json\u003c/code\u003e.\u003c/strong\u003e Claude Code v2.1+ automatically loads \u003ccode\u003ehooks/hooks.json\u003c/code\u003e from installed plugins. Explicitly declaring it causes duplicate detection errors. See \u003ca href=\"https://github.com/affaan-m/ECC/issues/29\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/29/hovercard\"\u003e#29\u003c/a\u003e, \u003ca href=\"https://github.com/affaan-m/ECC/issues/52\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/52/hovercard\"\u003e#52\u003c/a\u003e, \u003ca href=\"https://github.com/affaan-m/ECC/issues/103\" data-hovercard-type=\"issue\" data-hovercard-url=\"/affaan-m/ECC/issues/103/hovercard\"\u003e#103\u003c/a\u003e.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCodex marketplace installs but skills do not load\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eRun the cache check from an ECC checkout:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"node scripts/codex/check-plugin-cache.js\"\u003e\u003cpre\u003enode scripts/codex/check-plugin-cache.js\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf it reports unresolved parent references, refresh the native cache with \u003ccode\u003ecodex plugin marketplace upgrade ecc\u003c/code\u003e, run \u003ccode\u003ecodex plugin add ecc@ecc\u003c/code\u003e again, and restart Codex. Registration in \u003ccode\u003ecodex plugin list\u003c/code\u003e confirms the marketplace entry, while the cache check verifies that the installed manifest can resolve its skills, MCP configuration, and assets. Use \u003ccode\u003ebash scripts/sync-ecc-to-codex.sh\u003c/code\u003e only when you intentionally need the legacy copied-configuration compatibility path.\u003c/p\u003e\n\u003c/details\u003e\n\u003cp dir=\"auto\"\u003eMore answers: \u003ca href=\"/96loveslife/ECC/blob/main/TROUBLESHOOTING.md\"\u003eTROUBLESHOOTING.md\u003c/a\u003e covers memory, hooks, installation, performance, and common error messages. \u003ca href=\"/96loveslife/ECC/blob/main/docs/TROUBLESHOOTING.md\"\u003edocs/TROUBLESHOOTING.md\u003c/a\u003e tracks workarounds for open Claude Code bugs.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRunning Tests\u003c/h2\u003e\u003ca id=\"user-content-running-tests\" class=\"anchor\" aria-label=\"Permalink: Running Tests\" href=\"#running-tests\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe plugin includes a comprehensive test suite:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Run all tests\nnode tests/run-all.js\n\n# Run individual test files\nnode tests/lib/utils.test.js\nnode tests/lib/package-manager.test.js\nnode tests/hooks/hooks.test.js\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Run all tests\u003c/span\u003e\nnode tests/run-all.js\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Run individual test files\u003c/span\u003e\nnode tests/lib/utils.test.js\nnode tests/lib/package-manager.test.js\nnode tests/hooks/hooks.test.js\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBackground\u003c/h2\u003e\u003ca id=\"user-content-background\" class=\"anchor\" aria-label=\"Permalink: Background\" href=\"#background\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eI've been using Claude Code since the experimental rollout. Won the Anthropic x Forum Ventures hackathon in Sep 2025 with \u003ca href=\"https://x.com/DRodriguezFX\" rel=\"nofollow\"\u003e@DRodriguezFX\u003c/a\u003e, built \u003ca href=\"https://zenith.chat\" rel=\"nofollow\"\u003ezenith.chat\u003c/a\u003e entirely with agentic workflows.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThese configs are battle-tested across multiple production applications.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCommunity and Project\u003c/h2\u003e\u003ca id=\"user-content-community-and-project\" class=\"anchor\" aria-label=\"Permalink: Community and Project\" href=\"#community-and-project\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eSponsors and ECC Pro\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eECC stays free because sponsors and Pro users fund the work. Sponsor logos are at the top of this README; the full roster and tiers are in \u003ca href=\"/96loveslife/ECC/blob/main/SPONSORS.md\"\u003eSPONSORS.md\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eECC Pro adds private-repo analysis, PR-triggered audits, AgentShield-backed scanning, automatic push and PR checks, pooled team usage, and priority support through the hosted GitHub App.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://ecc.tools/pricing\" rel=\"nofollow\"\u003e\u003cstrong\u003eECC Pro\u003c/strong\u003e\u003cbr\u003e\u003csub\u003eHosted GitHub App for private repos\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://github.com/sponsors/affaan-m\"\u003e\u003cstrong\u003eSponsor ECC\u003c/strong\u003e\u003cbr\u003e\u003csub\u003eFund the OSS work\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://github.com/affaan-m/ECC/discussions\"\u003e\u003cstrong\u003eCommunity\u003c/strong\u003e\u003cbr\u003e\u003csub\u003eQ\u0026amp;A, ideas, and Show and Tell\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://github.com/apps/ecc-tools\"\u003e\u003cstrong\u003eGitHub App\u003c/strong\u003e\u003cbr\u003e\u003csub\u003ePR audits and hosted workflows\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/sponsors/affaan-m\"\u003eBecome a sponsor\u003c/a\u003e | \u003ca href=\"/96loveslife/ECC/blob/main/SPONSORS.md\"\u003eSponsor tiers\u003c/a\u003e | \u003ca href=\"/96loveslife/ECC/blob/main/SPONSORING.md\"\u003eSponsorship program\u003c/a\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eContributing\u003c/strong\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eContributions are welcome across skills, agents, rules, hooks, docs, tests, adapters, and security improvements.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/CONTRIBUTING.md\"\u003eContributing guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/SKILL-DEVELOPMENT-GUIDE.md\"\u003eSkill development guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/docs/SKILL-PLACEMENT-POLICY.md\"\u003eSkill placement policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/96loveslife/ECC/blob/main/COMMANDS-QUICK-REF.md\"\u003eCommand quick reference\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe short version:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eFork the repo\u003c/li\u003e\n\u003cli\u003eCreate your skill in \u003ccode\u003eskills/your-skill-name/SKILL.md\u003c/code\u003e (with YAML frontmatter)\u003c/li\u003e\n\u003cli\u003eOr create an agent in \u003ccode\u003eagents/your-agent.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSubmit a PR with a clear description of what it does and when to use it\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eIdeas for contributions:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eLanguage-specific skills (Rust, C#, Kotlin, Java): Go, Python, Perl, Swift, TypeScript, and HarmonyOS/ArkTS already included\u003c/li\u003e\n\u003cli\u003eFramework-specific configs (Rails, FastAPI): Django, NestJS, Spring Boot, and Laravel already included\u003c/li\u003e\n\u003cli\u003eDevOps agents (Kubernetes, Terraform, AWS, Docker)\u003c/li\u003e\n\u003cli\u003eTesting strategies (different frameworks, visual regression)\u003c/li\u003e\n\u003cli\u003eDomain-specific knowledge (ML, data engineering, mobile)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLinks\u003c/h2\u003e\u003ca id=\"user-content-links\" class=\"anchor\" aria-label=\"Permalink: Links\" href=\"#links\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eShorthand Guide (Start Here):\u003c/strong\u003e \u003ca href=\"https://x.com/affaan/status/2012378465664745795\" rel=\"nofollow\"\u003eThe Shorthand Guide to ECC\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLongform Guide (Advanced):\u003c/strong\u003e \u003ca href=\"https://x.com/affaan/status/2014040193557471352\" rel=\"nofollow\"\u003eThe Longform Guide to ECC\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSecurity Guide:\u003c/strong\u003e \u003ca href=\"/96loveslife/ECC/blob/main/the-security-guide.md\"\u003eSecurity Guide\u003c/a\u003e | \u003ca href=\"https://x.com/affaan/status/2033263813387223421\" rel=\"nofollow\"\u003eThread\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFollow:\u003c/strong\u003e \u003ca href=\"https://x.com/affaan\" rel=\"nofollow\"\u003e@affaan\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicense\u003c/h2\u003e\u003ca id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: License\" href=\"#license\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMIT. Use it freely, adapt it to your workflow, and contribute back when you can.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStar this repo if it helps. Read the guides. Build something great.\u003c/strong\u003e\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Install with Claude Code","fully_qualified_name":"Install with Claude Code","kind":"section_2","ident_start":4566,"ident_end":4590,"extent_start":4563,"extent_end":8211,"ident_utf16":{"start":{"line_number":68,"utf16_col":3},"end":{"line_number":68,"utf16_col":27}},"extent_utf16":{"start":{"line_number":68,"utf16_col":0},"end":{"line_number":126,"utf16_col":0}}},{"name":"ECC","fully_qualified_name":"ECC","kind":"section_1","ident_start":8213,"ident_end":8216,"extent_start":8211,"extent_end":106075,"ident_utf16":{"start":{"line_number":126,"utf16_col":2},"end":{"line_number":126,"utf16_col":5}},"extent_utf16":{"start":{"line_number":126,"utf16_col":0},"end":{"line_number":2039,"utf16_col":0}}},{"name":"Install ECC","fully_qualified_name":"Install ECC","kind":"section_2","ident_start":10690,"ident_end":10701,"extent_start":10687,"extent_end":24442,"ident_utf16":{"start":{"line_number":160,"utf16_col":3},"end":{"line_number":160,"utf16_col":14}},"extent_utf16":{"start":{"line_number":160,"utf16_col":0},"end":{"line_number":418,"utf16_col":0}}},{"name":"Recommended: universal guided setup","fully_qualified_name":"Recommended: universal guided setup","kind":"section_3","ident_start":10936,"ident_end":10971,"extent_start":10932,"extent_end":15276,"ident_utf16":{"start":{"line_number":167,"utf16_col":4},"end":{"line_number":167,"utf16_col":39}},"extent_utf16":{"start":{"line_number":167,"utf16_col":0},"end":{"line_number":263,"utf16_col":0}}},{"name":"Windows first-time walkthrough","fully_qualified_name":"Windows first-time walkthrough","kind":"section_4","ident_start":11102,"ident_end":11132,"extent_start":11097,"extent_end":15276,"ident_utf16":{"start":{"line_number":175,"utf16_col":5},"end":{"line_number":175,"utf16_col":35}},"extent_utf16":{"start":{"line_number":175,"utf16_col":0},"end":{"line_number":263,"utf16_col":0}}},{"name":"Pick one path only (per harness)","fully_qualified_name":"Pick one path only (per harness)","kind":"section_3","ident_start":15280,"ident_end":15312,"extent_start":15276,"extent_end":16454,"ident_utf16":{"start":{"line_number":263,"utf16_col":4},"end":{"line_number":263,"utf16_col":36}},"extent_utf16":{"start":{"line_number":263,"utf16_col":0},"end":{"line_number":281,"utf16_col":0}}},{"name":"Claude Code details","fully_qualified_name":"Claude Code details","kind":"section_3","ident_start":16458,"ident_end":16477,"extent_start":16454,"extent_end":19619,"ident_utf16":{"start":{"line_number":281,"utf16_col":4},"end":{"line_number":281,"utf16_col":23}},"extent_utf16":{"start":{"line_number":281,"utf16_col":0},"end":{"line_number":348,"utf16_col":0}}},{"name":"Codex App and CLI","fully_qualified_name":"Codex App and CLI","kind":"section_3","ident_start":19623,"ident_end":19640,"extent_start":19619,"extent_end":21832,"ident_utf16":{"start":{"line_number":348,"utf16_col":4},"end":{"line_number":348,"utf16_col":21}},"extent_utf16":{"start":{"line_number":348,"utf16_col":0},"end":{"line_number":383,"utf16_col":0}}},{"name":"Other agents and editors","fully_qualified_name":"Other agents and editors","kind":"section_3","ident_start":21836,"ident_end":21860,"extent_start":21832,"extent_end":24442,"ident_utf16":{"start":{"line_number":383,"utf16_col":4},"end":{"line_number":383,"utf16_col":28}},"extent_utf16":{"start":{"line_number":383,"utf16_col":0},"end":{"line_number":418,"utf16_col":0}}},{"name":"Advanced Install Options","fully_qualified_name":"Advanced Install Options","kind":"section_2","ident_start":24445,"ident_end":24469,"extent_start":24442,"extent_end":33675,"ident_utf16":{"start":{"line_number":418,"utf16_col":3},"end":{"line_number":418,"utf16_col":27}},"extent_utf16":{"start":{"line_number":418,"utf16_col":0},"end":{"line_number":648,"utf16_col":0}}},{"name":"Low-context / no-hooks path","fully_qualified_name":"Low-context / no-hooks path","kind":"section_3","ident_start":24563,"ident_end":24590,"extent_start":24559,"extent_end":26236,"ident_utf16":{"start":{"line_number":423,"utf16_col":4},"end":{"line_number":423,"utf16_col":31}},"extent_utf16":{"start":{"line_number":423,"utf16_col":0},"end":{"line_number":469,"utf16_col":0}}},{"name":"Find the right components first","fully_qualified_name":"Find the right components first","kind":"section_3","ident_start":26240,"ident_end":26271,"extent_start":26236,"extent_end":32095,"ident_utf16":{"start":{"line_number":469,"utf16_col":4},"end":{"line_number":469,"utf16_col":35}},"extent_utf16":{"start":{"line_number":469,"utf16_col":0},"end":{"line_number":607,"utf16_col":0}}},{"name":"Install hooks","fully_qualified_name":"Install hooks","kind":"section_4","ident_start":28939,"ident_end":28952,"extent_start":28934,"extent_end":29953,"ident_utf16":{"start":{"line_number":549,"utf16_col":5},"end":{"line_number":549,"utf16_col":18}},"extent_utf16":{"start":{"line_number":549,"utf16_col":0},"end":{"line_number":570,"utf16_col":0}}},{"name":"Configure MCPs","fully_qualified_name":"Configure MCPs","kind":"section_4","ident_start":29958,"ident_end":29972,"extent_start":29953,"extent_end":32095,"ident_utf16":{"start":{"line_number":570,"utf16_col":5},"end":{"line_number":570,"utf16_col":19}},"extent_utf16":{"start":{"line_number":570,"utf16_col":0},"end":{"line_number":607,"utf16_col":0}}},{"name":"Reset / Uninstall ECC","fully_qualified_name":"Reset / Uninstall ECC","kind":"section_3","ident_start":32099,"ident_end":32120,"extent_start":32095,"extent_end":33675,"ident_utf16":{"start":{"line_number":607,"utf16_col":4},"end":{"line_number":607,"utf16_col":25}},"extent_utf16":{"start":{"line_number":607,"utf16_col":0},"end":{"line_number":648,"utf16_col":0}}},{"name":"Start Using ECC","fully_qualified_name":"Start Using ECC","kind":"section_2","ident_start":33678,"ident_end":33693,"extent_start":33675,"extent_end":37438,"ident_utf16":{"start":{"line_number":648,"utf16_col":3},"end":{"line_number":648,"utf16_col":18}},"extent_utf16":{"start":{"line_number":648,"utf16_col":0},"end":{"line_number":740,"utf16_col":0}}},{"name":"Self-Hosted Models and Custom Endpoints","fully_qualified_name":"Self-Hosted Models and Custom Endpoints","kind":"section_2","ident_start":37441,"ident_end":37480,"extent_start":37438,"extent_end":43358,"ident_utf16":{"start":{"line_number":740,"utf16_col":3},"end":{"line_number":740,"utf16_col":42}},"extent_utf16":{"start":{"line_number":740,"utf16_col":0},"end":{"line_number":804,"utf16_col":0}}},{"name":"Self-host Kimi with ECC + Itô compute","fully_qualified_name":"Self-host Kimi with ECC + Itô compute","kind":"section_3","ident_start":38853,"ident_end":38891,"extent_start":38849,"extent_end":41280,"ident_utf16":{"start":{"line_number":756,"utf16_col":4},"end":{"line_number":756,"utf16_col":41}},"extent_utf16":{"start":{"line_number":756,"utf16_col":0},"end":{"line_number":796,"utf16_col":0}}},{"name":"Itô compute CLI bridge","fully_qualified_name":"Itô compute CLI bridge","kind":"section_3","ident_start":41284,"ident_end":41307,"extent_start":41280,"extent_end":43358,"ident_utf16":{"start":{"line_number":796,"utf16_col":4},"end":{"line_number":796,"utf16_col":26}},"extent_utf16":{"start":{"line_number":796,"utf16_col":0},"end":{"line_number":804,"utf16_col":0}}},{"name":"What's New","fully_qualified_name":"What's New","kind":"section_2","ident_start":43361,"ident_end":43371,"extent_start":43358,"extent_end":44222,"ident_utf16":{"start":{"line_number":804,"utf16_col":3},"end":{"line_number":804,"utf16_col":13}},"extent_utf16":{"start":{"line_number":804,"utf16_col":0},"end":{"line_number":818,"utf16_col":0}}},{"name":"v2.0.0: The Agent Harness Operating System (Jun 2026)","fully_qualified_name":"v2.0.0: The Agent Harness Operating System (Jun 2026)","kind":"section_3","ident_start":43933,"ident_end":43986,"extent_start":43929,"extent_end":44222,"ident_utf16":{"start":{"line_number":814,"utf16_col":4},"end":{"line_number":814,"utf16_col":57}},"extent_utf16":{"start":{"line_number":814,"utf16_col":0},"end":{"line_number":818,"utf16_col":0}}},{"name":"What's Inside","fully_qualified_name":"What's Inside","kind":"section_2","ident_start":44225,"ident_end":44238,"extent_start":44222,"extent_end":59051,"ident_utf16":{"start":{"line_number":818,"utf16_col":3},"end":{"line_number":818,"utf16_col":16}},"extent_utf16":{"start":{"line_number":818,"utf16_col":0},"end":{"line_number":1071,"utf16_col":0}}},{"name":"Key Concepts","fully_qualified_name":"Key Concepts","kind":"section_2","ident_start":59054,"ident_end":59066,"extent_start":59051,"extent_end":60890,"ident_utf16":{"start":{"line_number":1071,"utf16_col":3},"end":{"line_number":1071,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1071,"utf16_col":0},"end":{"line_number":1137,"utf16_col":0}}},{"name":"Agents","fully_qualified_name":"Agents","kind":"section_3","ident_start":59162,"ident_end":59168,"extent_start":59158,"extent_end":59424,"ident_utf16":{"start":{"line_number":1076,"utf16_col":4},"end":{"line_number":1076,"utf16_col":10}},"extent_utf16":{"start":{"line_number":1076,"utf16_col":0},"end":{"line_number":1091,"utf16_col":0}}},{"name":"Skills","fully_qualified_name":"Skills","kind":"section_3","ident_start":59428,"ident_end":59434,"extent_start":59424,"extent_end":59930,"ident_utf16":{"start":{"line_number":1091,"utf16_col":4},"end":{"line_number":1091,"utf16_col":10}},"extent_utf16":{"start":{"line_number":1091,"utf16_col":0},"end":{"line_number":1105,"utf16_col":0}}},{"name":"Hooks","fully_qualified_name":"Hooks","kind":"section_3","ident_start":59934,"ident_end":59939,"extent_start":59930,"extent_end":60261,"ident_utf16":{"start":{"line_number":1105,"utf16_col":4},"end":{"line_number":1105,"utf16_col":9}},"extent_utf16":{"start":{"line_number":1105,"utf16_col":0},"end":{"line_number":1119,"utf16_col":0}}},{"name":"Rules","fully_qualified_name":"Rules","kind":"section_3","ident_start":60265,"ident_end":60270,"extent_start":60261,"extent_end":60890,"ident_utf16":{"start":{"line_number":1119,"utf16_col":4},"end":{"line_number":1119,"utf16_col":9}},"extent_utf16":{"start":{"line_number":1119,"utf16_col":0},"end":{"line_number":1137,"utf16_col":0}}},{"name":"Guides","fully_qualified_name":"Guides","kind":"section_2","ident_start":60893,"ident_end":60899,"extent_start":60890,"extent_end":62895,"ident_utf16":{"start":{"line_number":1137,"utf16_col":3},"end":{"line_number":1137,"utf16_col":9}},"extent_utf16":{"start":{"line_number":1137,"utf16_col":0},"end":{"line_number":1178,"utf16_col":0}}},{"name":"Why Choose ECC?","fully_qualified_name":"Why Choose ECC?","kind":"section_2","ident_start":62898,"ident_end":62913,"extent_start":62895,"extent_end":68676,"ident_utf16":{"start":{"line_number":1178,"utf16_col":3},"end":{"line_number":1178,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1178,"utf16_col":0},"end":{"line_number":1269,"utf16_col":0}}},{"name":"TDD: Test-Driven Development","fully_qualified_name":"TDD: Test-Driven Development","kind":"section_3","ident_start":63976,"ident_end":64004,"extent_start":63972,"extent_end":64456,"ident_utf16":{"start":{"line_number":1189,"utf16_col":4},"end":{"line_number":1189,"utf16_col":32}},"extent_utf16":{"start":{"line_number":1189,"utf16_col":0},"end":{"line_number":1204,"utf16_col":0}}},{"name":"Skills keep the context focused","fully_qualified_name":"Skills keep the context focused","kind":"section_3","ident_start":64460,"ident_end":64491,"extent_start":64456,"extent_end":65234,"ident_utf16":{"start":{"line_number":1204,"utf16_col":4},"end":{"line_number":1204,"utf16_col":35}},"extent_utf16":{"start":{"line_number":1204,"utf16_col":0},"end":{"line_number":1216,"utf16_col":0}}},{"name":"Share context between harnesses","fully_qualified_name":"Share context between harnesses","kind":"section_3","ident_start":65238,"ident_end":65269,"extent_start":65234,"extent_end":68676,"ident_utf16":{"start":{"line_number":1216,"utf16_col":4},"end":{"line_number":1216,"utf16_col":35}},"extent_utf16":{"start":{"line_number":1216,"utf16_col":0},"end":{"line_number":1269,"utf16_col":0}}},{"name":"Platform Support","fully_qualified_name":"Platform Support","kind":"section_2","ident_start":68679,"ident_end":68695,"extent_start":68676,"extent_end":90413,"ident_utf16":{"start":{"line_number":1269,"utf16_col":3},"end":{"line_number":1269,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1269,"utf16_col":0},"end":{"line_number":1698,"utf16_col":0}}},{"name":"Cross-tool capability map","fully_qualified_name":"Cross-tool capability map","kind":"section_3","ident_start":75009,"ident_end":75034,"extent_start":75005,"extent_end":90413,"ident_utf16":{"start":{"line_number":1392,"utf16_col":4},"end":{"line_number":1392,"utf16_col":29}},"extent_utf16":{"start":{"line_number":1392,"utf16_col":0},"end":{"line_number":1698,"utf16_col":0}}},{"name":"What's included for Cursor","fully_qualified_name":"What's included for Cursor","kind":"section_4","ident_start":77012,"ident_end":77038,"extent_start":77007,"extent_end":77737,"ident_utf16":{"start":{"line_number":1426,"utf16_col":5},"end":{"line_number":1426,"utf16_col":31}},"extent_utf16":{"start":{"line_number":1426,"utf16_col":0},"end":{"line_number":1438,"utf16_col":0}}},{"name":"Cursor loading notes","fully_qualified_name":"Cursor loading notes","kind":"section_4","ident_start":77742,"ident_end":77762,"extent_start":77737,"extent_end":78219,"ident_utf16":{"start":{"line_number":1438,"utf16_col":5},"end":{"line_number":1438,"utf16_col":25}},"extent_utf16":{"start":{"line_number":1438,"utf16_col":0},"end":{"line_number":1444,"utf16_col":0}}},{"name":"Memory and data isolation (Cursor + Claude Code)","fully_qualified_name":"Memory and data isolation (Cursor + Claude Code)","kind":"section_4","ident_start":78224,"ident_end":78272,"extent_start":78219,"extent_end":79277,"ident_utf16":{"start":{"line_number":1444,"utf16_col":5},"end":{"line_number":1444,"utf16_col":53}},"extent_utf16":{"start":{"line_number":1444,"utf16_col":0},"end":{"line_number":1463,"utf16_col":0}}},{"name":"Hook architecture (DRY adapter pattern)","fully_qualified_name":"Hook architecture (DRY adapter pattern)","kind":"section_4","ident_start":79282,"ident_end":79321,"extent_start":79277,"extent_end":80099,"ident_utf16":{"start":{"line_number":1463,"utf16_col":5},"end":{"line_number":1463,"utf16_col":44}},"extent_utf16":{"start":{"line_number":1463,"utf16_col":0},"end":{"line_number":1479,"utf16_col":0}}},{"name":"Rules format","fully_qualified_name":"Rules format","kind":"section_4","ident_start":80104,"ident_end":80116,"extent_start":80099,"extent_end":82532,"ident_utf16":{"start":{"line_number":1479,"utf16_col":5},"end":{"line_number":1479,"utf16_col":17}},"extent_utf16":{"start":{"line_number":1479,"utf16_col":0},"end":{"line_number":1528,"utf16_col":0}}},{"name":"What's included in the repo and legacy configuration layer","fully_qualified_name":"What's included in the repo and legacy configuration layer","kind":"section_4","ident_start":82537,"ident_end":82595,"extent_start":82532,"extent_end":83521,"ident_utf16":{"start":{"line_number":1528,"utf16_col":5},"end":{"line_number":1528,"utf16_col":63}},"extent_utf16":{"start":{"line_number":1528,"utf16_col":0},"end":{"line_number":1541,"utf16_col":0}}},{"name":"Key limitation","fully_qualified_name":"Key limitation","kind":"section_4","ident_start":83526,"ident_end":83540,"extent_start":83521,"extent_end":83844,"ident_utf16":{"start":{"line_number":1541,"utf16_col":5},"end":{"line_number":1541,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1541,"utf16_col":0},"end":{"line_number":1545,"utf16_col":0}}},{"name":"Multi-agent support","fully_qualified_name":"Multi-agent support","kind":"section_4","ident_start":83849,"ident_end":83868,"extent_start":83844,"extent_end":85782,"ident_utf16":{"start":{"line_number":1545,"utf16_col":5},"end":{"line_number":1545,"utf16_col":24}},"extent_utf16":{"start":{"line_number":1545,"utf16_col":0},"end":{"line_number":1594,"utf16_col":0}}},{"name":"Hook support via plugins","fully_qualified_name":"Hook support via plugins","kind":"section_4","ident_start":85787,"ident_end":85811,"extent_start":85782,"extent_end":86270,"ident_utf16":{"start":{"line_number":1594,"utf16_col":5},"end":{"line_number":1594,"utf16_col":29}},"extent_utf16":{"start":{"line_number":1594,"utf16_col":0},"end":{"line_number":1608,"utf16_col":0}}},{"name":"Plugin installation","fully_qualified_name":"Plugin installation","kind":"section_4","ident_start":86275,"ident_end":86294,"extent_start":86270,"extent_end":86948,"ident_utf16":{"start":{"line_number":1608,"utf16_col":5},"end":{"line_number":1608,"utf16_col":24}},"extent_utf16":{"start":{"line_number":1608,"utf16_col":0},"end":{"line_number":1634,"utf16_col":0}}},{"name":"Documentation","fully_qualified_name":"Documentation","kind":"section_4","ident_start":86953,"ident_end":86966,"extent_start":86948,"extent_end":87438,"ident_utf16":{"start":{"line_number":1634,"utf16_col":5},"end":{"line_number":1634,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1634,"utf16_col":0},"end":{"line_number":1647,"utf16_col":0}}},{"name":"What's included for GitHub Copilot","fully_qualified_name":"What's included for GitHub Copilot","kind":"section_4","ident_start":87443,"ident_end":87477,"extent_start":87438,"extent_end":88804,"ident_utf16":{"start":{"line_number":1647,"utf16_col":5},"end":{"line_number":1647,"utf16_col":39}},"extent_utf16":{"start":{"line_number":1647,"utf16_col":0},"end":{"line_number":1666,"utf16_col":0}}},{"name":"Feature coverage","fully_qualified_name":"Feature coverage","kind":"section_4","ident_start":88809,"ident_end":88825,"extent_start":88804,"extent_end":89468,"ident_utf16":{"start":{"line_number":1666,"utf16_col":5},"end":{"line_number":1666,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1666,"utf16_col":0},"end":{"line_number":1681,"utf16_col":0}}},{"name":"Limitations","fully_qualified_name":"Limitations","kind":"section_4","ident_start":89473,"ident_end":89484,"extent_start":89468,"extent_end":90413,"ident_utf16":{"start":{"line_number":1681,"utf16_col":5},"end":{"line_number":1681,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1681,"utf16_col":0},"end":{"line_number":1698,"utf16_col":0}}},{"name":"Token Optimization","fully_qualified_name":"Token Optimization","kind":"section_2","ident_start":90416,"ident_end":90434,"extent_start":90413,"extent_end":93745,"ident_utf16":{"start":{"line_number":1698,"utf16_col":3},"end":{"line_number":1698,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1698,"utf16_col":0},"end":{"line_number":1774,"utf16_col":0}}},{"name":"Requirements","fully_qualified_name":"Requirements","kind":"section_2","ident_start":93748,"ident_end":93760,"extent_start":93745,"extent_end":94910,"ident_utf16":{"start":{"line_number":1774,"utf16_col":3},"end":{"line_number":1774,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1774,"utf16_col":0},"end":{"line_number":1801,"utf16_col":0}}},{"name":"Claude Code CLI version","fully_qualified_name":"Claude Code CLI version","kind":"section_3","ident_start":93867,"ident_end":93890,"extent_start":93863,"extent_end":94080,"ident_utf16":{"start":{"line_number":1779,"utf16_col":4},"end":{"line_number":1779,"utf16_col":27}},"extent_utf16":{"start":{"line_number":1779,"utf16_col":0},"end":{"line_number":1788,"utf16_col":0}}},{"name":"Important: hooks auto-loading behavior","fully_qualified_name":"Important: hooks auto-loading behavior","kind":"section_3","ident_start":94084,"ident_end":94122,"extent_start":94080,"extent_end":94910,"ident_utf16":{"start":{"line_number":1788,"utf16_col":4},"end":{"line_number":1788,"utf16_col":42}},"extent_utf16":{"start":{"line_number":1788,"utf16_col":0},"end":{"line_number":1801,"utf16_col":0}}},{"name":"Security","fully_qualified_name":"Security","kind":"section_2","ident_start":94913,"ident_end":94921,"extent_start":94910,"extent_end":97001,"ident_utf16":{"start":{"line_number":1801,"utf16_col":3},"end":{"line_number":1801,"utf16_col":11}},"extent_utf16":{"start":{"line_number":1801,"utf16_col":0},"end":{"line_number":1841,"utf16_col":0}}},{"name":"Ecosystem Tools","fully_qualified_name":"Ecosystem Tools","kind":"section_2","ident_start":97004,"ident_end":97019,"extent_start":97001,"extent_end":100696,"ident_utf16":{"start":{"line_number":1841,"utf16_col":3},"end":{"line_number":1841,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1841,"utf16_col":0},"end":{"line_number":1926,"utf16_col":0}}},{"name":"Option A: Local Analysis (Built-in)","fully_qualified_name":"Option A: Local Analysis (Built-in)","kind":"section_3","ident_start":97176,"ident_end":97211,"extent_start":97172,"extent_end":97517,"ident_utf16":{"start":{"line_number":1848,"utf16_col":4},"end":{"line_number":1848,"utf16_col":39}},"extent_utf16":{"start":{"line_number":1848,"utf16_col":0},"end":{"line_number":1859,"utf16_col":0}}},{"name":"Option B: GitHub App (Advanced)","fully_qualified_name":"Option B: GitHub App (Advanced)","kind":"section_3","ident_start":97521,"ident_end":97552,"extent_start":97517,"extent_end":100696,"ident_utf16":{"start":{"line_number":1859,"utf16_col":4},"end":{"line_number":1859,"utf16_col":35}},"extent_utf16":{"start":{"line_number":1859,"utf16_col":0},"end":{"line_number":1926,"utf16_col":0}}},{"name":"Troubleshooting","fully_qualified_name":"Troubleshooting","kind":"section_2","ident_start":100699,"ident_end":100714,"extent_start":100696,"extent_end":102599,"ident_utf16":{"start":{"line_number":1926,"utf16_col":3},"end":{"line_number":1926,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1926,"utf16_col":0},"end":{"line_number":1961,"utf16_col":0}}},{"name":"Running Tests","fully_qualified_name":"Running Tests","kind":"section_2","ident_start":102602,"ident_end":102615,"extent_start":102599,"extent_end":102845,"ident_utf16":{"start":{"line_number":1961,"utf16_col":3},"end":{"line_number":1961,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1961,"utf16_col":0},"end":{"line_number":1975,"utf16_col":0}}},{"name":"Background","fully_qualified_name":"Background","kind":"section_2","ident_start":102848,"ident_end":102858,"extent_start":102845,"extent_end":103176,"ident_utf16":{"start":{"line_number":1975,"utf16_col":3},"end":{"line_number":1975,"utf16_col":13}},"extent_utf16":{"start":{"line_number":1975,"utf16_col":0},"end":{"line_number":1981,"utf16_col":0}}},{"name":"Community and Project","fully_qualified_name":"Community and Project","kind":"section_2","ident_start":103179,"ident_end":103200,"extent_start":103176,"extent_end":105504,"ident_utf16":{"start":{"line_number":1981,"utf16_col":3},"end":{"line_number":1981,"utf16_col":24}},"extent_utf16":{"start":{"line_number":1981,"utf16_col":0},"end":{"line_number":2027,"utf16_col":0}}},{"name":"Links","fully_qualified_name":"Links","kind":"section_2","ident_start":105507,"ident_end":105512,"extent_start":105504,"extent_end":105909,"ident_utf16":{"start":{"line_number":2027,"utf16_col":3},"end":{"line_number":2027,"utf16_col":8}},"extent_utf16":{"start":{"line_number":2027,"utf16_col":0},"end":{"line_number":2034,"utf16_col":0}}},{"name":"License","fully_qualified_name":"License","kind":"section_2","ident_start":105912,"ident_end":105919,"extent_start":105909,"extent_end":106075,"ident_utf16":{"start":{"line_number":2034,"utf16_col":3},"end":{"line_number":2034,"utf16_col":10}},"extent_utf16":{"start":{"line_number":2034,"utf16_col":0},"end":{"line_number":2039,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1272056243,"defaultBranch":"main","name":"ECC","ownerLogin":"96loveslife","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2026-06-17T08:47:57.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/28110502?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"UsXk91yKsNW3F4HtAiQGbn6WvhAKRxZagSpwmC0JmJg6nLHoBNs4laNsGeVKH4kQ1wbzbXoApXMEsS3w0AOsSw","allShortcutsEnabled":false,"treeExpanded":true,"path":"README.md","symbolsExpanded":false,"refInfo":{"name":"main","listCacheKey":"v0:1781686086.238323","canEdit":false,"currentOid":"bf70150eb2df8070024e5bdf08e4aa08959e2735"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".adal","path":".adal","contentType":"directory"},{"name":".agents","path":".agents","contentType":"directory"},{"name":".claude-plugin","path":".claude-plugin","contentType":"directory"},{"name":".claude","path":".claude","contentType":"directory"},{"name":".codebuddy","path":".codebuddy","contentType":"directory"},{"name":".codex-plugin","path":".codex-plugin","contentType":"directory"},{"name":".codex","path":".codex","contentType":"directory"},{"name":".cursor","path":".cursor","contentType":"directory"},{"name":".gemini","path":".gemini","contentType":"directory"},{"name":".github","path":".github","contentType":"directory"},{"name":".hermes","path":".hermes","contentType":"directory"},{"name":".kimi","path":".kimi","contentType":"directory"},{"name":".kiro","path":".kiro","contentType":"directory"},{"name":".openclaw","path":".openclaw","contentType":"directory"},{"name":".opencode","path":".opencode","contentType":"directory"},{"name":".pi","path":".pi","contentType":"directory"},{"name":".pr","path":".pr","contentType":"directory"},{"name":".qwen","path":".qwen","contentType":"directory"},{"name":".trae","path":".trae","contentType":"directory"},{"name":".vscode","path":".vscode","contentType":"directory"},{"name":".zed","path":".zed","contentType":"directory"},{"name":"agents","path":"agents","contentType":"directory"},{"name":"assets","path":"assets","contentType":"directory"},{"name":"commands","path":"commands","contentType":"directory"},{"name":"config","path":"config","contentType":"directory"},{"name":"contexts","path":"contexts","contentType":"directory"},{"name":"docker","path":"docker","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"ecc2","path":"ecc2","contentType":"directory"},{"name":"examples","path":"examples","contentType":"directory"},{"name":"hooks","path":"hooks","contentType":"directory"},{"name":"integrations","path":"integrations","contentType":"directory"},{"name":"legacy-command-shims","path":"legacy-command-shims","contentType":"directory"},{"name":"manifests","path":"manifests","contentType":"directory"},{"name":"mcp-configs","path":"mcp-configs","contentType":"directory"},{"name":"plugins","path":"plugins","contentType":"directory"},{"name":"rules","path":"rules","contentType":"directory"},{"name":"scaffolds","path":"scaffolds","contentType":"directory"},{"name":"schemas","path":"schemas","contentType":"directory"},{"name":"scripts","path":"scripts","contentType":"directory"},{"name":"skills","path":"skills","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":"workflows","path":"workflows","contentType":"directory"},{"name":".coderabbit.yaml","path":".coderabbit.yaml","contentType":"file"},{"name":".env.example","path":".env.example","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".gitleaksignore","path":".gitleaksignore","contentType":"file"},{"name":".markdownlint.json","path":".markdownlint.json","contentType":"file"},{"name":".mcp.json","path":".mcp.json","contentType":"file"},{"name":".npmignore","path":".npmignore","contentType":"file"},{"name":".prettierrc","path":".prettierrc","contentType":"file"},{"name":".tool-versions","path":".tool-versions","contentType":"file"},{"name":".yarnrc.yml","path":".yarnrc.yml","contentType":"file"},{"name":"AGENTS.md","path":"AGENTS.md","contentType":"file"},{"name":"CHANGELOG.md","path":"CHANGELOG.md","contentType":"file"},{"name":"CLAUDE.md","path":"CLAUDE.md","contentType":"file"},{"name":"CODE_OF_CONDUCT.md","path":"CODE_OF_CONDUCT.md","contentType":"file"},{"name":"COMMANDS-QUICK-REF.md","path":"COMMANDS-QUICK-REF.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"README.zh-CN.md","path":"README.zh-CN.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"SOUL.md","path":"SOUL.md","contentType":"file"},{"name":"SPONSORING.md","path":"SPONSORING.md","contentType":"file"},{"name":"SPONSORS.md","path":"SPONSORS.md","contentType":"file"},{"name":"TROUBLESHOOTING.md","path":"TROUBLESHOOTING.md","contentType":"file"},{"name":"VERSION","path":"VERSION","contentType":"file"},{"name":"agent.yaml","path":"agent.yaml","contentType":"file"},{"name":"commitlint.config.js","path":"commitlint.config.js","contentType":"file"},{"name":"ecc_dashboard.py","path":"ecc_dashboard.py","contentType":"file"},{"name":"eslint.config.js","path":"eslint.config.js","contentType":"file"},{"name":"greptile.json","path":"greptile.json","contentType":"file"},{"name":"install.ps1","path":"install.ps1","contentType":"file"},{"name":"install.sh","path":"install.sh","contentType":"file"},{"name":"package-lock.json","path":"package-lock.json","contentType":"file"},{"name":"package.json","path":"package.json","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"the-longform-guide.md","path":"the-longform-guide.md","contentType":"file"},{"name":"the-security-guide.md","path":"the-security-guide.md","contentType":"file"},{"name":"the-shortform-guide.md","path":"the-shortform-guide.md","contentType":"file"},{"name":"yarn.lock","path":"yarn.lock","contentType":"file"}],"totalCount":84}},"fileTreeProcessingTime":26.828063999999998,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"main","listCacheKey":"v0:1781686086.238323","canEdit":false,"refType":"branch","currentOid":"bf70150eb2df8070024e5bdf08e4aa08959e2735","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"README.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/96loveslife/ECC/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"README.md","displayUrl":"https://github.com/96loveslife/ECC/blob/main/README.md?raw=true","headerInfo":{"blobSize":"104 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"9156c72","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2F96loveslife%2FECC%2Fblob%2Fmain%2FREADME.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"2039","truncatedSloc":"1540"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"isIssueTemplate":false,"isDiscussionTemplate":false,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/96loveslife/ECC/blob/main/README.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/96loveslife/ECC/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/96loveslife/ECC/raw/refs/heads/main/README.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["\u003cp align=\"center\"\u003e","  \u003cimg src=\"assets/hero.png\" alt=\"ECC - the agent harness operating system\" width=\"100%\" /\u003e","\u003c/p\u003e","","\u003cp align=\"center\"\u003e","  \u003ca href=\"https://www.star-history.com/affaan-m/ecc\"\u003e","    \u003cpicture\u003e","      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026type=trending\u0026theme=dark\" /\u003e","      \u003cimg src=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026type=trending\" alt=\"GitHub Trending Repository of the Day\" height=\"46\" /\u003e","    \u003c/picture\u003e","  \u003c/a\u003e","  \u003ca href=\"https://www.star-history.com/affaan-m/ecc\"\u003e","    \u003cpicture\u003e","      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026type=rank\u0026theme=dark\" /\u003e","      \u003cimg src=\"https://api.star-history.com/badge?repo=affaan-m/ECC\u0026type=rank\" alt=\"Star History Global Rank\" height=\"46\" /\u003e","    \u003c/picture\u003e","  \u003c/a\u003e","\u003c/p\u003e","","\u003cp align=\"center\"\u003e","  \u003cstrong\u003eLanguage:\u003c/strong\u003e","  \u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e |","  \u003ca href=\"docs/pt-BR/README.md\"\u003ePortuguês (Brasil)\u003c/a\u003e |","  \u003ca href=\"README.zh-CN.md\"\u003e简体中文\u003c/a\u003e |","  \u003ca href=\"docs/zh-TW/README.md\"\u003e繁體中文\u003c/a\u003e |","  \u003ca href=\"docs/ja-JP/README.md\"\u003e日本語\u003c/a\u003e |","  \u003ca href=\"docs/ko-KR/README.md\"\u003e한국어\u003c/a\u003e |","  \u003ca href=\"docs/tr/README.md\"\u003eTürkçe\u003c/a\u003e |","  \u003ca href=\"docs/ru/README.md\"\u003eРусский\u003c/a\u003e |","  \u003ca href=\"docs/vi-VN/README.md\"\u003eTiếng Việt\u003c/a\u003e |","  \u003ca href=\"docs/th/README.md\"\u003eไทย\u003c/a\u003e |","  \u003ca href=\"docs/de-DE/README.md\"\u003eDeutsch\u003c/a\u003e |","  \u003ca href=\"docs/es/README.md\"\u003eEspañol\u003c/a\u003e |","  \u003ca href=\"docs/uk-UA/README.md\"\u003eУкраїнська\u003c/a\u003e","\u003c/p\u003e","","\u003cp align=\"center\"\u003e","  \u003ca href=\"https://discord.gg/36yGMHGFbR\"\u003e\u003cimg src=\"https://img.shields.io/discord/1496644400590094540?logo=discord\u0026logoColor=white\u0026label=Discord\u0026color=5865F2\" alt=\"Discord\" /\u003e\u003c/a\u003e","  \u003ca href=\"https://ecc.tools\"\u003e\u003cimg src=\"https://img.shields.io/badge/Website-ecc.tools-E07856?logo=googlechrome\u0026logoColor=white\" alt=\"Website\" /\u003e\u003c/a\u003e","  \u003ca href=\"https://github.com/apps/ecc-tools\"\u003e\u003cimg src=\"https://img.shields.io/badge/GitHub%20App-ECC%20Tools-181717?logo=github\u0026logoColor=white\" alt=\"GitHub App\" /\u003e\u003c/a\u003e","  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT license\" /\u003e\u003c/a\u003e","\u003c/p\u003e","","\u003cp align=\"center\"\u003e","  \u003ca href=\"https://github.com/affaan-m/ECC\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/affaan-m/ECC?style=flat\" alt=\"GitHub stars\" /\u003e\u003c/a\u003e","  \u003ca href=\"https://github.com/affaan-m/ECC/forks\"\u003e\u003cimg src=\"https://img.shields.io/github/forks/affaan-m/ECC?style=flat\" alt=\"GitHub forks\" /\u003e\u003c/a\u003e","  \u003ca href=\"https://github.com/affaan-m/ECC/graphs/contributors\"\u003e\u003cimg src=\"https://img.shields.io/github/contributors/affaan-m/ECC?style=flat\" alt=\"Contributors\" /\u003e\u003c/a\u003e","  \u003ca href=\"https://github.com/marketplace/ecc-tools\"\u003e\u003cimg src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.ecc.tools%2Fbadge%2Finstalls\u0026logo=github\" alt=\"GitHub App installs\" /\u003e\u003c/a\u003e","\u003c/p\u003e","","\u003cp align=\"center\"\u003e","  \u003ca href=\"https://www.npmjs.com/package/ecc-universal\"\u003e\u003cimg src=\"https://img.shields.io/npm/dw/ecc-universal?label=ecc-universal\u0026logo=npm\" alt=\"ecc-universal npm downloads\" /\u003e\u003c/a\u003e","  \u003ca href=\"https://www.npmjs.com/package/ecc-agentshield\"\u003e\u003cimg src=\"https://img.shields.io/npm/dw/ecc-agentshield?label=ecc-agentshield\u0026logo=npm\" alt=\"ecc-agentshield npm downloads\" /\u003e\u003c/a\u003e","\u003c/p\u003e","","\u003cp align=\"center\"\u003e","  \u003cimg src=\"https://img.shields.io/badge/-Shell-4EAA25?logo=gnu-bash\u0026logoColor=white\" alt=\"Shell\" /\u003e","  \u003cimg src=\"https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript\u0026logoColor=white\" alt=\"TypeScript\" /\u003e","  \u003cimg src=\"https://img.shields.io/badge/-Python-3776AB?logo=python\u0026logoColor=white\" alt=\"Python\" /\u003e","  \u003cimg src=\"https://img.shields.io/badge/-Go-00ADD8?logo=go\u0026logoColor=white\" alt=\"Go\" /\u003e","  \u003cimg src=\"https://img.shields.io/badge/-Java-ED8B00?logo=openjdk\u0026logoColor=white\" alt=\"Java\" /\u003e","  \u003cimg src=\"https://img.shields.io/badge/-Perl-39457E?logo=perl\u0026logoColor=white\" alt=\"Perl\" /\u003e","  \u003cimg src=\"https://img.shields.io/badge/-Markdown-000000?logo=markdown\u0026logoColor=white\" alt=\"Markdown\" /\u003e","\u003c/p\u003e","","\u003e [!WARNING]","\u003e **Official sources only.** Install ECC only from verified channels: the GitHub repository [github.com/affaan-m/ECC](https://github.com/affaan-m/ECC), the npm packages [`ecc-universal`](https://www.npmjs.com/package/ecc-universal) and [`ecc-agentshield`](https://www.npmjs.com/package/ecc-agentshield), the [GitHub App](https://github.com/apps/ecc-tools), the plugin slug `ecc@ecc`, and the project website [ecc.tools](https://ecc.tools). Third-party re-uploads and unofficial mirrors are not maintained or reviewed by the project and may contain malware.","","## Install with Claude Code","","Use the [guided setup](#install-ecc) or [native plugin commands](#claude-code-details). Both install the same `ecc@ecc` plugin. Choose one and do not stack a full manual Claude install on top.","","\u003cdiv align=\"center\"\u003e","","\u003ctable aria-label=\"ECC primary links\"\u003e","\u003ctr\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","  \u003ca href=\"https://ecc.tools/pricing\"\u003e","    \u003cimg src=\"assets/images/community/ecc-tools-mark.svg\" height=\"42\" alt=\"ECC Tools\" /\u003e\u003cbr /\u003e","    \u003cstrong\u003eECC Pro + GitHub App\u003c/strong\u003e","  \u003c/a\u003e\u003cbr /\u003e","  \u003csub\u003e\u003ca href=\"https://github.com/apps/ecc-tools\"\u003eInstall free\u003c/a\u003e · \u003ca href=\"https://ecc.tools/pricing\"\u003ePrivate repos from $19/seat/mo\u003c/a\u003e\u003c/sub\u003e","\u003c/td\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","  \u003ca href=\"https://github.com/sponsors/affaan-m\"\u003e","    \u003cimg src=\"assets/images/community/heart.svg\" height=\"42\" alt=\"\" /\u003e\u003cbr /\u003e","    \u003cstrong\u003eSponsor ECC\u003c/strong\u003e","  \u003c/a\u003e\u003cbr /\u003e","  \u003csub\u003eFund the open-source project\u003c/sub\u003e","\u003c/td\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","  \u003ca href=\"https://discord.gg/36yGMHGFbR\"\u003e","    \u003cimg src=\"assets/images/community/discord.svg\" height=\"42\" alt=\"Discord\" /\u003e\u003cbr /\u003e","    \u003cstrong\u003eCommunity\u003c/strong\u003e","  \u003c/a\u003e\u003cbr /\u003e","  \u003csub\u003eDiscord · Q\u0026amp;A · Show and Tell\u003c/sub\u003e","\u003c/td\u003e","\u003c/tr\u003e","\u003c/table\u003e","","\u003c/div\u003e","","\u003csub\u003e**OSS stays free.** This repo is MIT-licensed forever. ECC Pro is the hosted GitHub App for private repos. \u003ca href=\"https://github.com/sponsors/affaan-m\"\u003eSponsors\u003c/a\u003e and \u003ca href=\"https://ecc.tools/pricing\"\u003ePro subscribers\u003c/a\u003e fund the work. That's why a single maintainer ships weekly across 7 harnesses.\u003c/sub\u003e","","\u003cdiv align=\"center\"\u003e","","\u003csub\u003e\u003cstrong\u003ePartners \u0026amp; sponsors\u003c/strong\u003e\u003c/sub\u003e","","\u003cp align=\"center\" aria-label=\"Partners and sponsors\"\u003e","  \u003ca href=\"https://www.coderabbit.ai\" title=\"CodeRabbit\"\u003e\u003cimg src=\"assets/images/sponsors/coderabbit.png\" height=\"54\" alt=\"CodeRabbit\" /\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;","  \u003ca href=\"https://www.greptile.com/go/ecc\" title=\"Greptile\"\u003e\u003cimg src=\"assets/images/sponsors/greptile.png\" height=\"54\" alt=\"Greptile\" /\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;","  \u003ca href=\"https://platform.kimi.ai?aff=ecc\" title=\"Moonshot AI - Kimi\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/images/sponsors/moonshot-dark.png\" /\u003e\u003cimg src=\"assets/images/sponsors/moonshot.png\" width=\"132\" alt=\"Moonshot AI - Kimi\" /\u003e\u003c/picture\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;","  \u003ca href=\"https://compute.itomarkets.com\" title=\"Itô Markets\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: light)\" srcset=\"assets/images/sponsors/ito-transparent-light.png\" /\u003e\u003cimg src=\"assets/images/sponsors/ito-transparent.png\" width=\"96\" alt=\"Itô Markets\" /\u003e\u003c/picture\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;","  \u003ca href=\"https://serpapi.com/github-ecc\" title=\"SerpApi: Web Search API\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/images/sponsors/serpapi-logo-dark-mode.svg\" /\u003e\u003cimg src=\"assets/images/sponsors/serpapi-logo-light-mode.svg\" width=\"200\" alt=\"SerpApi: Web Search API\" /\u003e\u003c/picture\u003e\u003c/a\u003e","\u003c/p\u003e","","\u003csub\u003e\u003cstrong\u003ePast sponsors:\u003c/strong\u003e \u003ca href=\"https://www.atlascloud.ai/?utm_source=github\u0026amp;utm_medium=link\u0026amp;utm_campaign=ECC\"\u003eAtlas Cloud\u003c/a\u003e\u003c/sub\u003e","","\u003csub\u003e\u003cstrong\u003eCommunity sponsors:\u003c/strong\u003e \u003ca href=\"https://github.com/mikejmorgan-ai\"\u003eMike Morgan\u003c/a\u003e · \u003ca href=\"https://github.com/jasonwu513\"\u003e@jasonwu513\u003c/a\u003e · \u003ca href=\"https://github.com/1anter\"\u003e@1anter\u003c/a\u003e · \u003ca href=\"https://github.com/massimotodaro\"\u003e@massimotodaro\u003c/a\u003e · \u003ca href=\"https://github.com/meadmccabe\"\u003e@meadmccabe\u003c/a\u003e\u003c/sub\u003e","","\u003csub\u003e\u003ca href=\"https://github.com/sponsors/affaan-m\"\u003e\u003cstrong\u003eBecome a Sponsor\u003c/strong\u003e\u003c/a\u003e · \u003ca href=\"SPONSORS.md\"\u003eSponsor Tiers\u003c/a\u003e · \u003ca href=\"SPONSORING.md\"\u003eSponsorship Program\u003c/a\u003e\u003c/sub\u003e","","\u003c/div\u003e","","\u003cp align=\"center\"\u003e\u003ca href=\"#install-ecc\"\u003eJump to install ↓\u003c/a\u003e\u003c/p\u003e","","# ECC","","Your agent can write code, but ECC gives it a coordinated engineering system and toolbox: it plans before it builds, verifies changes with tests, reviews its own work from a fresh context, remembers what matters, and turns repeated wins into reusable skills and workflows.","","```text","plan -\u003e test -\u003e implement -\u003e review -\u003e verify -\u003e remember -\u003e improve","```","","Instead of rebuilding that process in every prompt, you install it once and make it part of how your agent works.","","\u003e Optimize the context window. Persist everything else.","","ECC is MIT-licensed open source. It works best with Claude Code today, has a supported Codex sync path, and provides capability-limited adapters for Cursor, OpenCode, Gemini, Zed, GitHub Copilot, Antigravity, Qwen, and other harnesses. See the [support status matrix](#platform-support) before assuming feature parity.","","Access to 68 agents, 292 skills, and 94 legacy command shims, plus hooks, rules, memory, continuous learning, and AgentShield security scanning. The agents are specialized for planning, review, build repair, security, architecture, and domain work.","","| Included         |       Count | What it gives you                                                                    |","| ---------------- | ----------: | ------------------------------------------------------------------------------------ |","| Agents           |   68 agents | Planning, review, build repair, security, architecture, and domain work              |","| Skills           |  292 skills | TDD, research, security, docs, frontend, data, ML, operations, and more              |","| Commands         | 94 commands | Convenient entry points while ECC moves to a skills-first surface                    |","| Hooks and memory |     Runtime | Enforcement, session summaries, continuous learning, instincts, and context controls |","| Rules            |   Selective | Always-loaded standards you choose by language or project                            |","| AgentShield      |    Included | Scanning for prompts, hooks, MCP config, permissions, secrets, and agent files       |","","\u003cp align=\"center\"\u003e","  \u003ca href=\"https://www.star-history.com/affaan-m/ecc\"\u003e","    \u003cpicture\u003e","      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=affaan-m/ECC\u0026type=Date\u0026theme=dark\" /\u003e","      \u003cimg src=\"https://api.star-history.com/svg?repos=affaan-m/ECC\u0026type=Date\" alt=\"Live star history chart for affaan-m/ECC\" width=\"100%\" /\u003e","    \u003c/picture\u003e","  \u003c/a\u003e","\u003c/p\u003e","","## Install ECC","","\u003e [!IMPORTANT]","\u003e ECC 2.2 includes guided package setup for Claude Code, Codex, and Kimi Code.","\u003e The universal package requires Node.js 18 or newer. Claude plugin setup also","\u003e requires Git and Claude Code 2.1 or newer on `PATH`.","","### Recommended: universal guided setup","","For Claude Code plugin setup, updates, scope changes, and hook-profile changes:","","```bash","npx ecc-universal@2.2.2 setup","```","","#### Windows first-time walkthrough","","If you are new to command-line tools, use this copy-and-paste path:","","1. Install Node.js 18 or newer, Git, and Claude Code.","2. Open **PowerShell** from the Windows Start menu.","3. Confirm that each prerequisite is available:","","   ```powershell","   node --version","   git --version","   claude --version","   ```","","4. Run the guided installer:","","   ```powershell","   npx ecc-universal@2.2.2 setup","   ```","","5. For a typical personal setup, choose **Global user**, choose **Standard** hooks, and confirm.","6. Start a new Claude Code session and run `/plugin list` to verify that `ecc@ecc` is enabled.","","This path does not require cloning the repository. If any prerequisite command is not found, install or repair that prerequisite before rerunning ECC setup.","","If npm reports a version or cache error, confirm the registry version before retrying:","","```bash","npm view ecc-universal version","```","","ECC 2.2 supports the same guided setup through modern package runners:","","| Package runner | Guided setup command |","|---|---|","| npm / npx | `npx ecc-universal@2.2.2 setup` |","| pnpm | `pnpm dlx ecc-universal@2.2.2 setup` |","| Yarn 2+ | `yarn dlx ecc-universal@2.2.2 setup` |","| Bun | `bunx ecc-universal@2.2.2 setup` |","","The examples select [the published ECC 2.2.2 release](https://www.npmjs.com/package/ecc-universal/v/2.2.2), matching this repository's release version. A version pin is not a security audit or an integrity check. Review the release source and registry integrity before running package code; use a reviewed checkout for unreleased changes.","","Yarn Classic 1 does not provide `yarn dlx`; use `npx`, install the package globally, or upgrade Yarn for a temporary one-shot run.","","The wizard inventories the official marketplace and every native Claude install scope before making changes, then installs, updates, or safely moves `ecc@ecc` to the scope you choose. Rerun the same command whenever you want to update ECC, change scope, or change its hook profile. This setup wizard currently configures the Claude Code plugin; use the multi-harness wizard below for Codex or Kimi Code.","","To configure more than one coding agent in one reviewed flow, use the multi-harness wizard:","","```bash","npx ecc-universal@2.2.2 install --guided","```","","It lets you select any combination of Claude Code, Codex, and Kimi Code, shows each install channel and destination, preflights every selection before the first write, and asks for one final confirmation.","","| Harness | Guided install behavior |","|---|---|","| Claude Code | Native `ecc@ecc` plugin with one `user`, `project`, or `local` scope and an ECC hook profile |","| Codex | Native Codex marketplace/plugin lifecycle; hook review and trust remain Codex-owned |","| Kimi Code | Managed project files under `./.kimi-code`; ECC hooks, model/provider settings, and authentication are not configured |","","For automation, make every provider-specific choice explicit:","","```bash","npx ecc-universal@2.2.2 install --guided \\","  --harness claude --harness codex --harness kimi \\","  --claude-scope local --claude-hooks standard \\","  --profile core --yes","```","","Verify the native guided Codex path and managed Kimi path without writing first:","","```bash","npx ecc-universal@2.2.2 install --guided --harness codex --dry-run","npx ecc-universal@2.2.2 install --profile core --target kimi --dry-run","```","","Additional package-name commands are also available through the 2.2 alias:","","```bash","npx ecc-universal@2.2.2 consult \"security reviews\" --target claude","npx ecc-universal@2.2.2 install --profile minimal --target claude --with capability:machine-learning","npx ecc-universal@2.2.2 doctor --target kimi","```","","Do not use `npx ecc-install --profile minimal --target claude`: `ecc-install` is a binary name inside `ecc-universal`, not a separately published npm package.","","ECC also ships advanced managed adapters for `cursor`, `antigravity`, `gemini`, `opencode`, `codebuddy`, `joycode`, `qwen`, `zed`, `hermes`, and `openclaw`. Those targets still use their documented `ecc install --target ...` paths until each adapter has passed the guided collision, update, repair, and uninstall lifecycle matrix. Neither wizard silently installs into every detected harness.","","### Pick one path only (per harness)","","You can use ECC with Claude Code, Codex, and other harnesses at the same time. Choose one install method for each harness:","","- **Recommended default:** run the guided Claude plugin setup above","- **Also supported for Claude Code:** use the [native plugin commands](#claude-code-details)","- **Available in release 2.2:** guided package setup for Claude Code, Codex, and Kimi Code","- **Works:** Claude Code plugin + Codex native plugin","- **Works:** Claude Code plugin + the legacy Codex sync flow","- **Avoid:** Claude Code plugin + full Claude manual install","- **Avoid:** Codex sync + Codex marketplace plugin","","**Do not stack install methods.** Installing ECC twice into the same harness can duplicate skills, commands, hooks, or configuration; installing it once into multiple harnesses does not.","","If you already layered multiple installs and things look duplicated, skip straight to [Reset / Uninstall ECC](#reset--uninstall-ecc).","","**Install trouble?** Open the short [install or runtime problem form](https://github.com/affaan-m/ECC/issues/new?template=install-problem.yml), or run `ecc feedback`. ECC never uploads diagnostics automatically.","","### Claude Code details","","Alternatively, run Claude Code's native plugin commands inside Claude Code:","","```text","/plugin marketplace add https://github.com/affaan-m/ECC","/plugin install ecc@ecc","```","","The native path installs ECC's skills, agents, commands, and plugin-managed hooks. If you choose it, stop there. Do not also run a full manual install into Claude Code.","","Claude Code owns these built-in commands, including their errors when a marketplace, plugin, or conflicting scope already exists. ECC cannot intercept that parser. If either native command reports an existing install or scope conflict, use the 2.2 guided setup or resolve the conflicting Claude plugin scope before retrying; do not layer a manual install on top.","","After ECC is installed, `/ecc:configure-ecc` is the namespaced in-Claude reconfiguration skill. It delegates to the same safe setup flow, but it is available only after the plugin is installed and cannot replace Claude Code's built-in `/plugin` command during a first install.","","Claude Code plugins cannot distribute `rules`, so add only the rule packs you actually want:","","```bash","git clone https://github.com/affaan-m/ECC.git","cd ECC","mkdir -p ~/.claude/rules/ecc","cp -R rules/common ~/.claude/rules/ecc/","cp -R rules/typescript ~/.claude/rules/ecc/  # replace with your stack","```","","Start with `rules/common` plus one language or framework pack you actually use. If you install the plugin, do not run `./install.sh --profile full` afterward.","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003ePrefer settings.json? Add the marketplace declaratively\u003c/strong\u003e\u003c/summary\u003e","","Add directly to your `~/.claude/settings.json`:","","```json","{","  \"extraKnownMarketplaces\": {","    \"ecc\": {","      \"source\": {","        \"source\": \"github\",","        \"repo\": \"affaan-m/ECC\"","      }","    }","  },","  \"enabledPlugins\": {","    \"ecc@ecc\": true","  }","}","```","","This gives you the same result as the two `/plugin` commands above.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eNaming + migration note (ecc@ecc, affaan-m/ECC, ecc-universal)\u003c/strong\u003e\u003c/summary\u003e","","ECC has three public identifiers, and they are not interchangeable:","","- GitHub source repo: `affaan-m/ECC`","- Claude marketplace/plugin identifier: `ecc@ecc`","- npm package: `ecc-universal`","","This is intentional. Anthropic marketplace/plugin installs are keyed by a canonical plugin identifier, so ECC uses `ecc@ecc` to keep tool names and slash-command namespaces short enough for strict Desktop/API validators. Older posts may still show the former long marketplace identifier; treat that as a legacy alias only. Separately, the npm package stayed on `ecc-universal`, so npm installs and marketplace installs intentionally use different names.","","npm releases are cut per version tag, not per commit, so `ecc-universal` tracks releases (2.1, 2.2, ...) rather than every push to `main`. Install from git if you want the bleeding edge.","","If your local Claude setup was wiped or reset, that does not mean you need to repurchase anything. Start with `node scripts/ecc.js list-installed`, then run `node scripts/ecc.js doctor` and `node scripts/ecc.js repair` before reinstalling. That usually restores ECC-managed files without rebuilding your setup.","\u003c/details\u003e","","### Codex App and CLI","","Current Codex releases can install ECC as a native repo-marketplace plugin. The marketplace entry uses the repository root so Codex's cache receives the manifest together with all referenced skills, MCP configuration, hook runtime, scripts, and assets:","","```bash","codex plugin marketplace add affaan-m/ECC","codex plugin add ecc@ecc","codex plugin list --json","node scripts/codex/check-plugin-cache.js","```","","Both add commands are idempotent. To refresh later, run `codex plugin marketplace upgrade ecc` followed by `codex plugin add ecc@ecc`. Codex stores one enabled plugin state in the active `CODEX_HOME`; it does not offer Claude's `user`, `project`, and `local` scopes. Its native hooks require an explicit trust decision and do not use Claude's four ECC hook profiles. Inside Codex, invoke `$configure-ecc` for the guided provider-aware flow.","","The older `scripts/sync-ecc-to-codex.sh` path is a deprecated compatibility option for users who intentionally need copied and merged configuration in `~/.codex`; it is not required for the native plugin. New sync runs write an ownership manifest so cleanup can preserve modified user files. Run Codex once first so `~/.codex/config.toml` exists, then:","","```bash","git clone https://github.com/affaan-m/ECC.git","cd ECC","npm install","bash scripts/sync-ecc-to-codex.sh","```","","To inspect or remove that legacy layer without touching Codex conversations or native plugin caches:","","```bash","node scripts/ecc.js uninstall --legacy-codex-sync --dry-run","node scripts/ecc.js uninstall --legacy-codex-sync","```","","Pre-manifest installations are handled conservatively: ECC removes its marked `AGENTS.md` block but preserves copied files it cannot prove it owns and reports them for review.","","You can also open the ECC repository directly in Codex for a project-local setup. Codex reads the root `AGENTS.md` and the trusted project configuration in `.codex/` without a global sync. Do not add the native marketplace plugin on top of the sync flow.","","For repo navigation, surface ownership, and PR diff packet guidance, read the [Codex ECC Navigation Map](docs/CODEX-NAVIGATION-GUIDE.md). See the [.codex plugin notes](.codex-plugin/README.md) for native lifecycle details.","","### Other agents and editors","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eCursor, OpenCode, Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode, Copilot\u003c/strong\u003e\u003c/summary\u003e","","Clone ECC once, then choose the target that matches your harness:","","```bash","git clone https://github.com/affaan-m/ECC.git","cd ECC","```","","| Harness | Install or setup | Notes |","|---|---|---|","| Cursor | `./install.sh --profile minimal --target cursor` | Project-local `.cursor/` adapter |","| OpenCode | `npm install \u0026\u0026 npm run build:opencode \u0026\u0026 ./install.sh --profile full --target opencode --enable-hooks` | Builds the plugin payload before the full install |","| Gemini CLI | `./install.sh --profile minimal --target gemini` | Project-local `.gemini/` config |","| Zed | `./install.sh --profile minimal --target zed` | Project-local `.zed/` adapter |","| Antigravity | `./install.sh --profile minimal --target antigravity` | See the [Antigravity guide](docs/ANTIGRAVITY-GUIDE.md) |","| Qwen CLI | `./install.sh --profile minimal --target qwen` | See the [Qwen guide](docs/QWEN-GUIDE.md) |","| Hermes | `./install.sh --profile minimal --target hermes` | See the [Hermes setup guide](docs/HERMES-SETUP.md) |","| OpenClaw | `./install.sh --profile minimal --target openclaw` | Managed home-directory install |","| Kimi Code CLI | `./install.sh --profile minimal --target kimi` | Project-local `.kimi-code/` install · [Get Kimi Code](https://www.kimi.com/code?aff=ecc) |","| CodeBuddy | `./install.sh --profile minimal --target codebuddy` | Project-local `.codebuddy/` install |","| JoyCode | `./install.sh --profile minimal --target joycode` | Project-local `.joycode/` install |","","GitHub Copilot support is already included in this repository. `.github/copilot-instructions.md` provides the instruction layer, `.github/prompts/` contains the reusable `/plan`, `/tdd`, `/security-review`, `/build-fix`, and `/refactor` prompts, and `.vscode/settings.json` enables `chat.promptFiles`.","","For a harness without a native ECC target, use the [manual adaptation guide](docs/MANUAL-ADAPTATION-GUIDE.md). It explains how to carry a small set of ECC skills and workflow instructions into chat-style tools without pretending hooks or native skill discovery are available.","","Cursor installs agent definitions under `.cursor/agents/ecc-*.md`. Cursor-native loading behavior can vary by Cursor build. ECC does not install root `AGENTS.md` into `.cursor/`. The adapter keeps Cursor's context scoped to its native rules and agent surfaces.","","Deep per-harness notes (feature parity, hook adapters, limitations) live in [Platform Support](#platform-support) below.","\u003c/details\u003e","","## Advanced Install Options","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eLow-context install with no hook runtime\u003c/strong\u003e\u003c/summary\u003e","","### Low-context / no-hooks path","","Use this when you want ECC's rules, agents, commands, platform config, and core workflows without runtime hooks:","","```bash","npx ecc-universal@2.2.2 install --profile minimal --target claude","```","","From a source checkout, the equivalent command is:","","```bash","./install.sh --profile minimal --target claude","```","","Windows:","","```powershell",".\\install.ps1 --profile minimal --target claude","```","","This profile intentionally excludes `hooks-runtime`.","","Claude manual installs place each skill directly under `~/.claude/skills/\u003cskill-name\u003e/` (or `.claude/skills/\u003cskill-name\u003e/` for `claude-project`) so Claude Code can discover it. When upgrading an older ECC manual install, the installer migrates only nested `skills/ecc/` files recorded in ECC install-state. If a flat skill directory is user-owned, ECC preserves it, prints a conflict warning, and keeps any older managed copy tracked for a safe uninstall instead of overwriting user files.","","For the normal core profile with hooks disabled:","","```bash","./install.sh --profile core --without baseline:hooks --target claude","./install.sh --profile core --no-hooks --target claude","```","","Add the hook runtime later only if you want it:","","```bash","./install.sh --target claude --modules hooks-runtime --enable-hooks","```","","Any install whose profile or modules would materialize the hook runtime requires","an explicit decision. Without `--enable-hooks` or `--no-hooks`, the installer","prints what the hooks can do and stops before writing anything. The guided","installer (`ecc install --guided`) asks for this choice interactively.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eChoose only the components you need\u003c/strong\u003e\u003c/summary\u003e","","### Find the right components first","","Ask the packaged advisor which components match your work:","","```bash","node scripts/ecc.js consult \"security reviews\" --target claude","```","","It returns matching components, related profiles, and preview/install commands. Use the preview command before installing if you want to inspect the exact file plan.","","You can also install explicit skills or capabilities:","","```bash","./install.sh --target claude --skills tdd-workflow,security-review","node scripts/ecc.js install --profile minimal --target claude --with capability:machine-learning","```","","Manual component-by-component copying also works. Each component is fully independent:","","```bash","# Just agents","cp agents/*.md ~/.claude/agents/","","# Rules directories (common + language-specific)","mkdir -p ~/.claude/rules/ecc","cp -r rules/common ~/.claude/rules/ecc/","cp -r rules/typescript ~/.claude/rules/ecc/   # pick your stack","","# Core/general skills only (Claude Code loads skills from direct children","# of ~/.claude/skills; do not nest manual installs under ~/.claude/skills/ecc/)","mkdir -p ~/.claude/skills","cp -r .agents/skills/* ~/.claude/skills/","cp -r skills/search-first ~/.claude/skills/","","# Optional: maintained slash-command compatibility during migration","mkdir -p ~/.claude/commands","cp commands/*.md ~/.claude/commands/","```","","Retired shims live in `legacy-command-shims/`. Copy individual files from there only if you still need old names such as `/tdd`.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eProject-local rules instead of global rules\u003c/strong\u003e\u003c/summary\u003e","","Use project-local rules when ECC's standards should apply to one repository rather than every Claude Code session:","","```bash","cd your-project","mkdir -p .claude/rules/ecc","cp -R /path/to/ECC/rules/common .claude/rules/ecc/","cp -R /path/to/ECC/rules/typescript .claude/rules/ecc/","```","","Rules are always-loaded context, so begin with `common` and one pack for the stack you actually use. When copying rules manually, copy the whole language directory (for example `rules/common` or `rules/golang`), not the files inside it, so relative references keep working and filenames do not collide.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eFully manual Claude install\u003c/strong\u003e\u003c/summary\u003e","","Use this only when you are intentionally skipping the plugin path:","","```bash","git clone https://github.com/affaan-m/ECC.git","cd ECC","./install.sh --profile full","```","","Windows:","","```powershell","git clone https://github.com/affaan-m/ECC.git","cd ECC",".\\install.ps1 --profile full","```","","If you choose this path, stop there. Do not also run `/plugin install`.","","For hand-picked manual installs, Claude discovers skills as direct children of `~/.claude/skills/`; do not nest them under `~/.claude/skills/ecc/`.","","#### Install hooks","","Do not copy the raw repo `hooks/hooks.json` into `~/.claude/settings.json` or `~/.claude/hooks/hooks.json`. That file is plugin/repo-oriented; use the installer so hook command paths are rewritten correctly:","","```bash","bash ./install.sh --target claude --modules hooks-runtime --enable-hooks","```","","That installs the hook scripts under `~/.claude/` and registers the resolved","hook entries in `~/.claude/settings.json`. Existing user settings and hooks are","preserved; ECC-owned entries are tracked by stable ID for idempotent updates","and safe uninstall.","","If you installed ECC via `/plugin install`, do not copy those hooks into `settings.json`. Claude Code v2.1+ already auto-loads plugin `hooks/hooks.json`, and duplicating them in `settings.json` causes duplicate execution and cross-platform hook conflicts.","","On Windows, Claude's config root is `%USERPROFILE%\\.claude`; install the hook runtime with:","","```powershell","pwsh -File .\\install.ps1 --target claude --modules hooks-runtime --enable-hooks","```","","#### Configure MCPs","","Claude plugin installs intentionally do not auto-enable ECC's bundled MCP server definitions. This avoids overlong plugin MCP tool names on strict third-party gateways while keeping manual MCP setup available.","","Use Claude Code's `/mcp` command or CLI-managed MCP setup for live Claude Code server changes; Claude Code persists those choices in `~/.claude.json`. For repo-local MCP access, copy desired MCP server definitions from `mcp-configs/mcp-servers.json` into a project-scoped `.mcp.json`.","","ECC ships exactly one default connector (`chrome-devtools`); everything else is a skill wrapping a CLI/REST API or an opt-in catalog entry. The rule and the June 2026 audit that retired the previous six defaults live in [docs/MCP-CONNECTOR-POLICY.md](docs/MCP-CONNECTOR-POLICY.md).","","If you already run your own copies of ECC-bundled MCPs, set:","","```bash","export ECC_DISABLED_MCPS=\"chrome-devtools\"","```","","ECC-managed install and Codex sync flows will skip or remove those bundled servers instead of re-adding duplicates. `ECC_DISABLED_MCPS` is an ECC install/sync filter, not a live Claude Code toggle.","","**Important:** Replace `YOUR_*_HERE` placeholders with your actual API keys.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eMulti-model commands require additional setup\u003c/strong\u003e\u003c/summary\u003e","","`multi-*` commands are **not** covered by the base plugin/rules install.","","To use `/multi-plan`, `/multi-execute`, `/multi-backend`, `/multi-frontend`, and `/multi-workflow`, you must also install the `ccg-workflow` runtime. Choose and review an exact release using the [upstream CCG installation guide](https://github.com/fengshao1227/ccg-workflow#readme), then initialize that installed runtime. ECC does not bundle CCG or attest to a compatible, audited CCG release; this guide does not bootstrap an unspecified registry version.","","That runtime provides the external dependencies these commands expect, including:","","- `~/.claude/bin/codeagent-wrapper`","- `~/.claude/.ccg/prompts/*`","","Without `ccg-workflow`, these `multi-*` commands will not run correctly.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eReset, repair, or uninstall\u003c/strong\u003e\u003c/summary\u003e","","### Reset / Uninstall ECC","","If you installed from the universal package, run these commands from the same","project directory used for installation:","","```bash","npx ecc-universal@2.2.2 list-installed","npx ecc-universal@2.2.2 doctor","npx ecc-universal@2.2.2 repair","npx ecc-universal@2.2.2 uninstall --dry-run","npx ecc-universal@2.2.2 uninstall","```","","From a source checkout, inspect the managed state before reinstalling:","","```bash","node scripts/ecc.js list-installed","node scripts/ecc.js doctor","node scripts/ecc.js repair","node scripts/ecc.js uninstall --dry-run","```","","For a direct source-checkout uninstall:","","```bash","node scripts/uninstall.js --dry-run","node scripts/uninstall.js","```","","If you are leaving, the uninstall command prints an optional [20-second feedback form](https://github.com/affaan-m/ECC/issues/new?template=quick-feedback.yml). It is a public GitHub issue, never blocks uninstall, and ECC does not upload diagnostics. You can also run `ecc feedback` at any time to see the problem, feedback, and feature routes.","","Plugin users should remove the plugin from Claude Code, then delete only the rule folders they manually copied and no longer want. ECC only removes files recorded in its install-state. It does not claim unrelated files in your harness directories.","","If you stacked methods, clean up in this order:","","1. Remove the Claude Code plugin install.","2. Run the ECC uninstall command from the project directory that contains the managed install-state.","3. Delete any extra rule folders you copied manually and no longer want.","4. Reinstall once, using a single path.","\u003c/details\u003e","","## Start Using ECC","","Start with the workflow you need, not the full catalog.","","| What you are doing | Start here |","|---|---|","| Building a feature | `/ecc:plan \"describe the feature\"`, then `tdd-workflow` |","| Fixing a bug | Reproduce it with a failing test, then use `tdd-workflow` |","| Reviewing new code | `/code-review` for a fresh-context review |","| Repairing a build | `/build-fix` |","| Cleaning a codebase | `/refactor-clean` |","| Checking context pressure | `/context-budget` |","| Ending a long session | `/save-session` or `/learn-eval` |","| Resuming later | `/resume-session` |","| Auditing agent config | `/security-scan` with a reviewed scanner, or installed `agentshield scan --path .` |","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003ePlugin commands and manual commands\u003c/strong\u003e\u003c/summary\u003e","","Claude Code plugin commands use the namespaced form:","","```text","/ecc:plan \"Add authentication\"","```","","Manual installs may expose the shorter compatibility form:","","```text","/plan \"Add authentication\"","```","","Skills are the primary workflow surface. Commands remain convenient entry points and compatibility shims. Check what is installed with:","","```bash","/plugin list ecc@ecc","```","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eWhich agent should I use?\u003c/strong\u003e\u003c/summary\u003e","","Skills are the canonical workflow surface; maintained slash entries stay available for command-first workflows.","","| I want to... | Use this surface | Agent used |","|--------------|-----------------|------------|","| Plan a new feature | `/ecc:plan \"Add auth\"` | planner |","| Design system architecture | `/ecc:plan` + architect agent | architect |","| Write code with tests first | `tdd-workflow` skill | tdd-guide |","| Review code I just wrote | `/code-review` | code-reviewer |","| Fix a failing build | `/build-fix` | build-error-resolver |","| Run end-to-end tests | `e2e-testing` skill | e2e-runner |","| Find security vulnerabilities | `/security-scan` | security-reviewer |","| Remove dead code | `/refactor-clean` | refactor-cleaner |","| Update documentation | `/update-docs` | doc-updater |","| Review Go code | `/go-review` | go-reviewer |","| Review Python code | `/python-review` | python-reviewer |","| Review F# code | *(invoke `fsharp-reviewer` directly)* | fsharp-reviewer |","| Review TypeScript/JavaScript code | *(invoke `typescript-reviewer` directly)* | typescript-reviewer |","| Develop HarmonyOS apps | *(invoke `harmonyos-app-resolver` directly)* | harmonyos-app-resolver |","| Audit database queries | *(auto-delegated)* | database-reviewer |","| Review production ML changes | `mle-workflow` skill + `mle-reviewer` agent | mle-reviewer |","","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eCommon workflows\u003c/strong\u003e\u003c/summary\u003e","","Slash forms below are shown where they remain part of the maintained command surface. Retired short-name shims such as `/tdd` and `/eval` live in `legacy-command-shims/` for explicit opt-in only.","","**Starting a new feature:**","```","/ecc:plan \"Add user authentication with OAuth\"","                                              -\u003e planner creates implementation blueprint","tdd-workflow skill                            -\u003e tdd-guide enforces write-tests-first","/code-review                                  -\u003e code-reviewer checks your work","```","","**Fixing a bug:**","```","tdd-workflow skill                            -\u003e tdd-guide: write a failing test that reproduces it","                                              -\u003e implement the fix, verify test passes","/code-review                                  -\u003e code-reviewer: catch regressions","```","","**Preparing for production:**","```","/security-scan                                -\u003e security-reviewer: OWASP Top 10 audit","e2e-testing skill                             -\u003e e2e-runner: critical user flow tests","/test-coverage                                -\u003e verify 80%+ coverage","```","\u003c/details\u003e","","## Self-Hosted Models and Custom Endpoints","","ECC works through each harness's normal configuration, so you can use an official provider, a compatible custom API endpoint or model gateway, or a self-hosted model without changing ECC's workflows.","","For Claude Code, ECC does not hardcode Anthropic-hosted transport settings. Minimal gateway example:","","```bash","export ANTHROPIC_BASE_URL=https://your-gateway.example.com","export ANTHROPIC_AUTH_TOKEN=your-token","claude","```","","If your gateway remaps model names, configure that in Claude Code rather than in ECC. ECC's hooks, skills, commands, and rules are model-provider agnostic once the `claude` CLI is already working. See Anthropic's [LLM gateway documentation](https://docs.anthropic.com/en/docs/claude-code/llm-gateway) and [model configuration documentation](https://docs.anthropic.com/en/docs/claude-code/model-config).","","Run or self-host any open-source model behind that gateway using separate compute and serving setup. If you need GPU capacity, [Itô](https://compute.itomarkets.com) is ECC's preferred compute sponsor; any GPU provider works. The sponsorship link is passive: it does not invoke an RFQ, reserve capacity, provision compute, or configure serving. Separately, `ecc ito find` invokes the explicitly configured canonical Itô CLI and submits a live authenticated RFQ; it does not reserve capacity. Managed inference through Itô is not live yet.","","### Self-host Kimi with ECC + Itô compute","","The Kimi Code harness and the model-serving layer are separate. ECC configures the agent harness; you bring an API endpoint ([get a Kimi API key](https://platform.kimi.ai?aff=ecc)) or self-host an open-weight Kimi model on your own GPU capacity. This adapter is verified against Kimi Code 0.31.x (`@moonshot-ai/kimi-code`):","","\u003ctable aria-label=\"Local Kimi model path\" width=\"100%\"\u003e","\u003ctr\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","  \u003ca href=\"https://compute.itomarkets.com\"\u003e","    \u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: light)\" srcset=\"assets/images/sponsors/ito-transparent-light.png\" /\u003e\u003cimg src=\"assets/images/sponsors/ito-transparent.png\" width=\"92\" alt=\"Itô Markets\" /\u003e\u003c/picture\u003e\u003cbr /\u003e","    \u003cstrong\u003e1. Get GPU capacity\u003c/strong\u003e","  \u003c/a\u003e\u003cbr /\u003e","  \u003csub\u003eUse Itô or any GPU provider.\u003c/sub\u003e","\u003c/td\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","  \u003ca href=\"https://www.moonshot.ai\"\u003e","    \u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/images/sponsors/moonshot-dark.png\" /\u003e\u003cimg src=\"assets/images/sponsors/moonshot.png\" width=\"126\" alt=\"Moonshot AI - Kimi\" /\u003e\u003c/picture\u003e\u003cbr /\u003e","    \u003cstrong\u003e2. Serve Kimi\u003c/strong\u003e","  \u003c/a\u003e\u003cbr /\u003e","  \u003csub\u003eExpose the chosen checkpoint through a compatible endpoint.\u003c/sub\u003e","\u003c/td\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","  \u003ca href=\".kimi/README.md\"\u003e","    \u003cimg src=\"assets/images/community/ecc-tools-mark.svg\" height=\"52\" alt=\"ECC Tools\" /\u003e\u003cbr /\u003e","    \u003cstrong\u003e3. Run Kimi Code with ECC\u003c/strong\u003e","  \u003c/a\u003e\u003cbr /\u003e","  \u003csub\u003eInstall project instructions and skills, then start Kimi Code.\u003c/sub\u003e","\u003c/td\u003e","\u003c/tr\u003e","\u003c/table\u003e","","Configure the endpoint with Kimi Code's \u003ca href=\"https://moonshotai.github.io/kimi-cli/en/configuration/providers.html\"\u003eofficial provider guide\u003c/a\u003e, then install ECC:","","```bash","bash ./install.sh --target kimi --profile minimal","node scripts/ecc.js doctor --target kimi","kimi","```","","Kimi Code discovers the installed `.kimi-code/AGENTS.md` instructions and `.kimi-code/skills/` workflows natively; project-level `.agents/skills/` is also an official discovery location. ECC safely merges project MCP entries into `.kimi-code/mcp.json` and does not change the user-level `~/.kimi-code/config.toml`. Kimi Code supports native hooks, but ECC's current managed-project adapter does not configure them, so this installer does not offer Kimi hook profiles. The installer dry-run and regression suite verify that every managed Kimi write stays inside the project-local `.kimi-code/` root.","","### Itô compute CLI bridge","","`ecc ito` delegates to the separately installed canonical Itô client; ECC does not maintain a second API client. `ecc ito login [--no-browser]` performs device authorization, opens the Itô verification page by default, and persists a device token in macOS Keychain; `--no-browser` suppresses the page handoff. ECC itself does no browser automation. `ecc ito auth` is validation-only and rejects `--no-browser`. The available operations are `ecc ito login`, `ecc ito auth`, `ecc ito find`, `ecc ito status`, and the separately gated `ecc ito evals`. The matching MCP tools remain `ito_auth`, `ito_find`, and `ito_status`; `ito_auth` validates existing credentials and node qualification is CLI-only.","","The `ito-compute-cli` package is currently unpublished. Build it locally from the Itô runtime repo (private while the desk hardens; design partners get access) under `cli/ito-compute-cli`, run `npm ci` and `npm run check`, then set `ECC_ITO_CLI_EXECUTABLE` to that build's absolute `dist/bin/ito.js` path. Login never inherits `ITO_API_KEY`; auth, find, and status forward `ITO_API_KEY` directly when configured, and `ITO_AUTH_MODE=legacy` is not required. `ecc ito logout` revokes the current device credential and retains its local copy if remote revocation cannot be confirmed. Device tokens use macOS Keychain by default; explicit file fallback must retain owner-only directory/file permissions. ECC does not discover this credential-bearing client through `PATH`. See the [`ito-compute` skill](skills/ito-compute/SKILL.md) for the full RFQ authority and MCP setup contract.","","`find` submits a live authenticated RFQ. It does not reserve capacity. `evals` requires both `ITO_ENABLE_SIXTYTWO_LIVE=1` and `--live-sixtytwo`, a separately installed `sixtytwo-cli==0.3.33`, an explicit node list, and an existing absolute configuration directory. It cannot rent, launch, recover, repair, or purchase. ECC exposes no quote lock, purchase, workload, or inference path, and it never replaces a missing client or failed live call with a local result.","","## What's New","","Current release: **2.2.2** (2026-08-31). Highlights of the 2.2 line:","","- Guided, manifest-driven setup across Claude Code, Codex, and Kimi Code, with install-state ownership, doctor, repair, and uninstall.","- Native Antigravity install, a thin Pi adapter, and the packed-artifact release gate tested on Linux, macOS, and Windows.","- Plan Canvas browser review, the unified memory vault (`ecc memory`), and the Itô compute skill family.","","Full history: [CHANGELOG.md](CHANGELOG.md). Per-release notes and evidence live under [docs/releases/](docs/releases/).","","### v2.0.0: The Agent Harness Operating System (Jun 2026)","","Stable graduation of the 2.0 line: control-pane substrate, worktree lifecycle service, the `orch-*` orchestrator family, and the Discord community. Notes: [docs/releases/2.0.0/release-notes.md](docs/releases/2.0.0/release-notes.md).","","## What's Inside","","```text","ECC/","|-- agents/           # 68 specialized subagents for delegation","|-- skills/           # 292 reusable workflows loaded on demand","|-- commands/         # 94 maintained slash-command shims","|-- rules/            # opt-in common and language standards","|-- hooks/            # runtime automation and enforcement","|-- scripts/          # install, repair, sync, orchestration, and checks","|-- .claude-plugin/   # Claude Code marketplace manifest","|-- .codex/           # Codex reference configuration and agent roles","|-- .opencode/        # OpenCode plugin, commands, and instructions","|-- .cursor/          # Cursor rules and hook adapter","|-- docs/             # public setup, architecture, and operating guides","```","","The root is the source of truth. Platform adapters package or map these same workflows instead of maintaining separate copies.","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eAnnotated component catalog\u003c/strong\u003e\u003c/summary\u003e","","```","ECC/","|-- .claude-plugin/   # Plugin and marketplace manifests","|   |-- plugin.json         # Plugin metadata and component paths","|   |-- marketplace.json    # Marketplace catalog for /plugin marketplace add","|","|-- agents/           # 67 specialized subagents for delegation","|   |-- planner.md           # Feature implementation planning","|   |-- architect.md         # System design decisions","|   |-- tdd-guide.md         # Test-driven development","|   |-- code-reviewer.md     # Quality and security review","|   |-- security-reviewer.md # Vulnerability analysis","|   |-- build-error-resolver.md","|   |-- e2e-runner.md        # Playwright E2E testing","|   |-- refactor-cleaner.md  # Dead code cleanup","|   |-- doc-updater.md       # Documentation sync","|   |-- docs-lookup.md       # Documentation/API lookup","|   |-- chief-of-staff.md    # Communication triage and drafts","|   |-- loop-operator.md     # Autonomous loop execution","|   |-- harness-optimizer.md # Harness config tuning","|   |-- cpp-reviewer.md      # C++ code review","|   |-- cpp-build-resolver.md # C++ build error resolution","|   |-- fsharp-reviewer.md   # F# functional code review","|   |-- go-reviewer.md       # Go code review","|   |-- go-build-resolver.md # Go build error resolution","|   |-- python-reviewer.md   # Python code review","|   |-- database-reviewer.md # Database/Supabase review","|   |-- typescript-reviewer.md # TypeScript/JavaScript code review","|   |-- java-reviewer.md     # Java/Spring Boot code review","|   |-- java-build-resolver.md # Java/Maven/Gradle build errors","|   |-- kotlin-reviewer.md   # Kotlin/Android/KMP code review","|   |-- kotlin-build-resolver.md # Kotlin/Gradle build errors","|   |-- harmonyos-app-resolver.md # HarmonyOS/ArkTS app development","|   |-- rust-reviewer.md     # Rust code review","|   |-- rust-build-resolver.md # Rust build error resolution","|   |-- pytorch-build-resolver.md # PyTorch/CUDA training errors","|   |-- mle-reviewer.md      # Production ML pipeline, eval, serving, and monitoring review","|","|-- skills/           # Workflow definitions and domain knowledge","|   |-- coding-standards/           # Language best practices","|   |-- clickhouse-io/              # ClickHouse analytics, queries, data engineering","|   |-- backend-patterns/           # API, database, caching patterns","|   |-- frontend-patterns/          # React, Next.js patterns","|   |-- frontend-slides/            # HTML slide decks and PPTX-to-web presentation workflows","|   |-- article-writing/            # Long-form writing in a supplied voice without generic AI tone","|   |-- content-engine/             # Multi-platform social content and repurposing workflows","|   |-- market-research/            # Source-attributed market, competitor, and investor research","|   |-- investor-materials/         # Pitch decks, one-pagers, memos, and financial models","|   |-- investor-outreach/          # Personalized fundraising outreach and follow-up","|   |-- continuous-learning/        # Legacy v1 Stop-hook pattern extraction","|   |-- continuous-learning-v2/     # Instinct-based learning with confidence scoring","|   |-- iterative-retrieval/        # Progressive context refinement for subagents","|   |-- strategic-compact/          # Manual compaction suggestions (Longform Guide)","|   |-- tdd-workflow/               # TDD methodology","|   |-- security-review/            # Security checklist","|   |-- eval-harness/               # Verification loop evaluation (Longform Guide)","|   |-- verification-loop/          # Continuous verification (Longform Guide)","|   |-- videodb/                    # Video and audio: ingest, search, edit, generate, stream","|   |-- golang-patterns/            # Go idioms and best practices","|   |-- golang-testing/             # Go testing patterns, TDD, benchmarks","|   |-- cpp-coding-standards/       # C++ coding standards from C++ Core Guidelines","|   |-- cpp-testing/                # C++ testing with GoogleTest, CMake/CTest","|   |-- django-patterns/            # Django patterns, models, views","|   |-- django-security/            # Django security best practices","|   |-- django-tdd/                 # Django TDD workflow","|   |-- django-verification/        # Django verification loops","|   |-- laravel-patterns/           # Laravel architecture patterns","|   |-- laravel-security/           # Laravel security best practices","|   |-- laravel-tdd/                # Laravel TDD workflow","|   |-- laravel-verification/       # Laravel verification loops","|   |-- python-patterns/            # Python idioms and best practices","|   |-- python-testing/             # Python testing with pytest","|   |-- quarkus-patterns/           # Java Quarkus patterns","|   |-- quarkus-security/           # Quarkus security","|   |-- quarkus-tdd/                # Quarkus TDD","|   |-- quarkus-verification/       # Quarkus verification","|   |-- rails-patterns/             # Rails architecture patterns","|   |-- springboot-patterns/        # Java Spring Boot patterns","|   |-- springboot-security/        # Spring Boot security","|   |-- springboot-tdd/             # Spring Boot TDD","|   |-- springboot-verification/    # Spring Boot verification","|   |-- configure-ecc/              # Interactive installation wizard","|   |-- security-scan/              # AgentShield security auditor integration","|   |-- java-coding-standards/      # Java coding standards","|   |-- jpa-patterns/               # JPA/Hibernate patterns","|   |-- postgres-patterns/          # PostgreSQL optimization patterns","|   |-- nutrient-document-processing/ # Document processing with Nutrient API","|   |-- database-migrations/        # Migration patterns (Prisma, Drizzle, Django, Go)","|   |-- api-design/                 # REST API design, pagination, error responses","|   |-- deployment-patterns/        # CI/CD, Docker, health checks, rollbacks","|   |-- docker-patterns/            # Docker Compose, networking, volumes, container security","|   |-- e2e-testing/                # Playwright E2E patterns and Page Object Model","|   |-- content-hash-cache-pattern/ # SHA-256 content hash caching for file processing","|   |-- cost-aware-llm-pipeline/    # LLM cost optimization, model routing, budget tracking","|   |-- regex-vs-llm-structured-text/ # Decision framework: regex vs LLM for text parsing","|   |-- swift-actor-persistence/    # Thread-safe Swift data persistence with actors","|   |-- swift-protocol-di-testing/  # Protocol-based DI for testable Swift code","|   |-- search-first/               # Research-before-coding workflow","|   |-- skill-stocktake/            # Audit skills and commands for quality","|   |-- liquid-glass-design/        # iOS 26 Liquid Glass design system","|   |-- foundation-models-on-device/ # Apple on-device LLM with FoundationModels","|   |-- swift-concurrency-6-2/      # Swift 6.2 Approachable Concurrency","|   |-- mle-workflow/               # Production ML data contracts, evals, deployment, monitoring","|   |-- perl-patterns/              # Modern Perl 5.36+ idioms and best practices","|   |-- perl-security/              # Perl security patterns, taint mode, safe I/O","|   |-- perl-testing/               # Perl TDD with Test2::V0, prove, Devel::Cover","|   |-- autonomous-loops/           # Autonomous loop patterns: sequential pipelines, PR loops, DAG orchestration","|   |-- plankton-code-quality/      # Write-time code quality enforcement with Plankton hooks","|   |-- codehealth-mcp/             # Optional CodeScene Code Health MCP skill (opt-in)","|   |-- docs/examples/project-guidelines-template.md  # Template for project-specific skills","|","|-- commands/         # Maintained slash-entry compatibility; prefer skills/","|   |-- plan.md             # /plan - Implementation planning","|   |-- code-review.md      # /code-review - Quality review","|   |-- build-fix.md        # /build-fix - Fix build errors","|   |-- refactor-clean.md   # /refactor-clean - Dead code removal","|   |-- quality-gate.md     # /quality-gate - Verification gate","|   |-- learn.md            # /learn - Extract patterns mid-session (Longform Guide)","|   |-- learn-eval.md       # /learn-eval - Extract, evaluate, and save patterns","|   |-- checkpoint.md       # /checkpoint - Save verification state (Longform Guide)","|   |-- setup-pm.md         # /setup-pm - Configure package manager","|   |-- go-review.md        # /go-review - Go code review","|   |-- go-test.md          # /go-test - Go TDD workflow","|   |-- go-build.md         # /go-build - Fix Go build errors","|   |-- skill-create.md     # /skill-create - Generate skills from git history","|   |-- instinct-status.md  # /instinct-status - View learned instincts","|   |-- instinct-import.md  # /instinct-import - Import instincts","|   |-- instinct-export.md  # /instinct-export - Export instincts","|   |-- evolve.md           # /evolve - Cluster instincts into skills","|   |-- prune.md            # /prune - Delete expired pending instincts","|   |-- pm2.md              # /pm2 - PM2 service lifecycle management","|   |-- multi-plan.md       # /multi-plan - Multi-agent task decomposition","|   |-- multi-execute.md    # /multi-execute - Orchestrated multi-agent workflows","|   |-- multi-backend.md    # /multi-backend - Backend multi-service orchestration","|   |-- multi-frontend.md   # /multi-frontend - Frontend multi-service orchestration","|   |-- multi-workflow.md   # /multi-workflow - General multi-service workflows","|   |-- sessions.md         # /sessions - Session history management","|   |-- test-coverage.md    # /test-coverage - Test coverage analysis","|   |-- update-docs.md      # /update-docs - Update documentation","|   |-- update-codemaps.md  # /update-codemaps - Update codemaps","|   |-- python-review.md    # /python-review - Python code review","|-- legacy-command-shims/   # Opt-in archive for retired shims such as /tdd and /eval","|   |-- tdd.md              # /tdd - Prefer the tdd-workflow skill","|   |-- e2e.md              # /e2e - Prefer the e2e-testing skill","|   |-- eval.md             # /eval - Prefer the eval-harness skill","|   |-- verify.md           # /verify - Prefer the verification-loop skill","|   |-- orchestrate.md      # /orchestrate - Prefer dmux-workflows or multi-workflow","|","|-- rules/            # Always-follow guidelines (copy to ~/.claude/rules/ecc/)","|   |-- README.md            # Structure overview and installation guide","|   |-- common/              # Language-agnostic principles","|   |   |-- coding-style.md    # Immutability, file organization","|   |   |-- git-workflow.md    # Commit format, PR process","|   |   |-- testing.md         # TDD, 80% coverage requirement","|   |   |-- performance.md     # Model selection, context management","|   |   |-- patterns.md        # Design patterns, skeleton projects","|   |   |-- hooks.md           # Hook architecture, TodoWrite","|   |   |-- agents.md          # When to delegate to subagents","|   |   |-- security.md        # Mandatory security checks","|   |-- typescript/          # TypeScript/JavaScript specific","|   |-- python/              # Python specific","|   |-- golang/              # Go specific","|   |-- swift/               # Swift specific","|   |-- php/                 # PHP specific","|   |-- arkts/               # HarmonyOS / ArkTS specific","|","|-- hooks/            # Trigger-based automations","|   |-- README.md                 # Hook documentation, recipes, and customization guide","|   |-- hooks.json                # All hooks config (PreToolUse, PostToolUse, Stop, etc.)","|   |-- memory-persistence/       # Session lifecycle hooks (Longform Guide)","|   |-- strategic-compact/        # Compaction suggestions (Longform Guide)","|","|-- scripts/          # Cross-platform Node.js scripts","|   |-- lib/                     # Shared utilities","|   |   |-- utils.js             # Cross-platform file/path/system utilities","|   |   |-- package-manager.js   # Package manager detection and selection","|   |-- hooks/                   # Hook implementations","|   |   |-- session-start.js     # Load context on session start","|   |   |-- session-end.js       # Save state on session end","|   |   |-- pre-compact.js       # Pre-compaction state saving","|   |   |-- suggest-compact.js   # Strategic compaction suggestions","|   |   |-- evaluate-session.js  # Extract patterns from sessions","|   |-- setup-package-manager.js # Interactive PM setup","|","|-- tests/            # Test suite","|   |-- lib/                     # Library tests","|   |-- hooks/                   # Hook tests","|   |-- run-all.js               # Run all tests","|","|-- contexts/         # Dynamic system prompt injection contexts (Longform Guide)","|   |-- dev.md              # Development mode context","|   |-- review.md           # Code review mode context","|   |-- research.md         # Research/exploration mode context","|","|-- examples/         # Example configurations and sessions","|   |-- CLAUDE.md             # Example project-level config","|   |-- user-CLAUDE.md        # Example user-level config","|   |-- saas-nextjs-CLAUDE.md   # Real-world SaaS (Next.js + Supabase + Stripe)","|   |-- go-microservice-CLAUDE.md # Real-world Go microservice (gRPC + PostgreSQL)","|   |-- django-api-CLAUDE.md      # Real-world Django REST API (DRF + Celery)","|   |-- laravel-api-CLAUDE.md     # Real-world Laravel API (PostgreSQL + Redis)","|   |-- rust-api-CLAUDE.md        # Real-world Rust API (Axum + SQLx + PostgreSQL)","|","|-- mcp-configs/      # MCP server configurations","|   |-- mcp-servers.json    # GitHub, Supabase, Vercel, Railway, etc.","|","|-- ecc_dashboard.py  # Desktop GUI dashboard (Tkinter)","|","|-- marketplace.json  # Self-hosted marketplace config (for /plugin marketplace add)","```","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eDashboard GUI\u003c/strong\u003e\u003c/summary\u003e","","Launch the desktop dashboard to visually explore ECC components:","","```bash","npm run dashboard","# or","python3 ./ecc_dashboard.py","```","","**Features:**","- Tabbed interface: Agents, Skills, Commands, Rules, Settings","- Dark/Light theme toggle","- Font customization (family and size)","- Project logo in header and taskbar","- Search and filter across all components","\u003c/details\u003e","","## Key Concepts","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eAgents, skills, hooks, and rules explained\u003c/strong\u003e\u003c/summary\u003e","","### Agents","","Subagents handle delegated tasks with limited scope. Example:","","```markdown","---","name: code-reviewer","description: Reviews code for quality, security, and maintainability","tools: Read, Grep, Glob, Bash","model: opus","---","","You are a senior code reviewer...","```","","### Skills","","Skills are the primary workflow surface. They can be invoked directly, suggested automatically, and reused by agents. ECC still ships maintained `commands/` during migration, while retired short-name shims live under `legacy-command-shims/` for explicit opt-in only. New workflow development should land in `skills/` first.","","```markdown","# TDD Workflow","","1. Define interfaces first","2. Write failing tests (RED)","3. Implement minimal code (GREEN)","4. Refactor (IMPROVE)","5. Verify 80%+ coverage","```","","### Hooks","","Hooks fire on tool events. Example: warn about console.log:","","```json","{","  \"matcher\": \"tool == \\\"Edit\\\" \u0026\u0026 tool_input.file_path matches \\\"\\\\\\\\.(ts|tsx|js|jsx)$\\\"\",","  \"hooks\": [{","    \"type\": \"command\",","    \"command\": \"#!/bin/bash\\ngrep -n 'console\\\\.log' \\\"$file_path\\\" \u0026\u0026 echo '[Hook] Remove console.log' \u003e\u00262\"","  }]","}","```","","### Rules","","Rules are always-follow guidelines, organized into `common/` (language-agnostic) + language-specific directories:","","```","rules/","  common/          # Universal principles (always install)","  typescript/      # TS/JS specific patterns and tools","  python/          # Python specific patterns and tools","  golang/          # Go specific patterns and tools","  swift/           # Swift specific patterns and tools","  php/             # PHP specific patterns and tools","  arkts/           # HarmonyOS / ArkTS patterns and constraints","```","","See [`rules/README.md`](rules/README.md) for installation and structure details.","\u003c/details\u003e","","## Guides","","This repo is the raw code. The guides explain everything.","","\u003ctable aria-label=\"ECC guides\" width=\"100%\"\u003e","\u003ctr\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","\u003ca href=\"./the-shortform-guide.md\"\u003e","\u003cimg src=\"assets/images/guides/shorthand-guide.png\" width=\"213\" height=\"120\" alt=\"The Shorthand Guide to ECC\" /\u003e\u003cbr /\u003e","\u003cstrong\u003eThe Shorthand Guide\u003c/strong\u003e","\u003c/a\u003e","\u003cbr /\u003e\u003csub\u003eSetup, foundations, and day-one use. \u003cb\u003eRead this first.\u003c/b\u003e (\u003ca href=\"https://x.com/affaan/status/2012378465664745795\"\u003ethread\u003c/a\u003e)\u003c/sub\u003e","\u003c/td\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","\u003ca href=\"./the-longform-guide.md\"\u003e","\u003cimg src=\"assets/images/guides/longform-guide.png\" width=\"213\" height=\"120\" alt=\"The Longform Guide to ECC\" /\u003e\u003cbr /\u003e","\u003cstrong\u003eThe Longform Guide\u003c/strong\u003e","\u003c/a\u003e","\u003cbr /\u003e\u003csub\u003eContext economics, memory, evals, and parallel agents. (\u003ca href=\"https://x.com/affaan/status/2014040193557471352\"\u003ethread\u003c/a\u003e)\u003c/sub\u003e","\u003c/td\u003e","\u003ctd width=\"33%\" align=\"center\"\u003e","\u003ca href=\"./the-security-guide.md\"\u003e","\u003cimg src=\"assets/images/guides/security-guide.png\" width=\"213\" height=\"120\" alt=\"The Security Guide to ECC\" /\u003e\u003cbr /\u003e","\u003cstrong\u003eThe Security Guide\u003c/strong\u003e","\u003c/a\u003e","\u003cbr /\u003e\u003csub\u003ePrompt injection, hooks, MCP, and AgentShield. (\u003ca href=\"https://x.com/affaan/status/2033263813387223421\"\u003ethread\u003c/a\u003e)\u003c/sub\u003e","\u003c/td\u003e","\u003c/tr\u003e","\u003c/table\u003e","","| Topic | What You'll Learn |","|-------|-------------------|","| Token Optimization | Model selection, system prompt slimming, background processes |","| Memory Persistence | Hooks that save/load context across sessions automatically |","| Continuous Learning | Auto-extract patterns from sessions into reusable skills |","| Verification Loops | Checkpoint vs continuous evals, grader types, pass@k metrics |","| Parallelization | Git worktrees, cascade method, when to scale instances |","| Subagent Orchestration | The context problem, iterative retrieval pattern |","","[Commands Quick Reference](./COMMANDS-QUICK-REF.md) | [Manual Adaptation Guide](docs/MANUAL-ADAPTATION-GUIDE.md) | [Troubleshooting FAQ](./TROUBLESHOOTING.md) | [Roadmap](docs/ROADMAP.md)","","## Why Choose ECC?","","| Without a system                                        | With ECC                                                              |","| ------------------------------------------------------- | --------------------------------------------------------------------- |","| Plans disappear into chat history                       | Plans become editable artifacts before implementation starts          |","| \"Please use TDD\" is an instruction the model may forget | TDD becomes a gated RED -\u003e GREEN -\u003e REFACTOR workflow with evidence   |","| The same context writes and reviews the code            | A fresh-context reviewer looks for regressions and blind spots        |","| Memory means saving an enormous transcript              | Sessions are distilled into summaries, instincts, and reusable skills |","| Quality checks depend on reminders                      | Hooks can enforce deterministic checks outside the prompt             |","| Agent configuration is trusted by default               | AgentShield scans the harness itself as an attack surface             |","","### TDD: Test-Driven Development","","```text","/ecc:plan \"Add usage-based billing alerts\"","  -\u003e confirm or edit the plan","  -\u003e activate tdd-workflow","  -\u003e capture RED evidence before implementation","  -\u003e implement until GREEN","  -\u003e review from fresh context","  -\u003e fix findings with regression tests","  -\u003e verify build, lint, types, and tests","```","","A result is not just code. It's a trail of evidence: the plan, the failing test, the passing test, the review findings, and the final verification.","","### Skills keep the context focused","","Rules, skills, agents, and hooks solve different problems. Keeping those jobs separate is how ECC adds capability without dumping the entire repository into every session.","","| Concept | What it does | Context behavior |","|---|---|---|","| Skills | Reusable workflows such as TDD, security review, or deep research | Loaded when the task needs them |","| Agents | Scoped workers with their own context and tool permissions | Isolate planning, implementation, and review |","| Rules | Durable project or language standards | Always loaded, so install them selectively |","| Hooks | Scripts triggered by harness events | Run outside the model context |","| Instincts | Patterns learned from real sessions with confidence scores | Recalled when relevant |","","### Share context between harnesses","","ECC's Memory Vault gives Claude, Codex, Hermes, OpenClaw, Kimi, and other harnesses one local, inspectable Markdown format for durable context and handoffs. Project and team memories live under `.ecc/memory/`; user memories live under `~/.ecc/memory/`.","","Skill-only, minimal, manual, and Claude plugin installs do not put the Memory Vault runtime on `PATH`. Install the npm runtime separately before using the CLI or optional MCP server:","","```bash","npm install -g ecc-universal@2.2.2","ecc memory init --scope project","ecc memory search \"authentication migration\" --target-harness codex","ecc memory doctor","```","","Memory is unreviewed context, not executable policy. Verify important claims against authoritative sources and promote accepted knowledge into governed project documentation. The optional `ecc-memory-mcp` server exposes the same bounded save, search, read, and doctor surface without enabling itself by default.","","[Open the Unified Memory workflow →](skills/unified-memory/SKILL.md)","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eMemory Vault in depth: scopes, handoffs, and trust boundaries\u003c/strong\u003e\u003c/summary\u003e","","The Memory Vault stores portable `ecc.memory.v1` Markdown documents instead of copying vendor transcripts or emailing context between agents. Project memories are protected by a fail-closed `.gitignore`; use the team scope only for human-inspected, version-controlled sharing. Team memories remain unreviewed context even after they are committed.","","After installing the runtime above, check that the CLI and optional MCP entry point are available:","","```bash","ecc memory --help","command -v ecc-memory-mcp","```","","```bash","# Initialize the project vault.","ecc memory init --scope project","","# Write a handoff body to a regular file, then target the next harness.","ecc memory handoff \\","  --from hermes \\","  --target codex \\","  --title \"Continue authentication migration\" \\","  --body-file ./handoff.md","","# Recall it from another harness.","ecc memory search \"authentication migration\" --target-harness codex","ecc memory read \u003cmemory-id\u003e","","# Validate the vault before sharing team memories.","ecc memory doctor","```","","Memory bodies are accepted only through `--stdin` or `--body-file`, not as command-line values. The first release keeps every vault entry unreviewed and create-only; human review promotes accepted knowledge into governed project documentation rather than changing memory trust. Normal search recall returns active project and team memories. A direct ID read may inspect a non-active entry. User-scope recall must be requested explicitly. Agents must verify important claims against authoritative sources and must never treat recalled bodies as executable instructions or policy.","","For opt-in MCP access, add the `ecc-memory-vault` entry from [`mcp-configs/mcp-servers.json`](mcp-configs/mcp-servers.json) to each harness that needs it, then run `ecc-memory-mcp`. The server exposes only `memory_save`, `memory_search`, `memory_read`, and `memory_doctor`. Each server must launch with a lowercase `ECC_MEMORY_HARNESS` identity; the identity is server-bound and cannot be supplied by a tool caller. User scope additionally requires the operator-controlled `ECC_MEMORY_ALLOW_USER_SCOPE=1` opt-in. See [`skills/unified-memory/SKILL.md`](skills/unified-memory/SKILL.md) for the workflow and trust boundaries, and [`docs/design/ecc-memory-vault.md`](docs/design/ecc-memory-vault.md) for the capability contract.","\u003c/details\u003e","","## Platform Support","","ECC's core Node.js CLI and managed installers run on **Windows, macOS, and Linux**, but optional capabilities are not at full parity. Some continuous-learning, GAN, and orchestration paths still require Bash or Python; harnesses also expose different hook, agent, and skill APIs.","","| Platform | Status | Current limitation |","|---|---|---|","| Linux | Supported core | Optional features may require Bash, Python, or provider-specific tools. |","| macOS | Supported core | The standalone GAN shell path is not compatible with the system Bash 3.2 and currently has a score-parsing defect ([#2674](https://github.com/affaan-m/ECC/issues/2674)). |","| Windows + WSL | Supported core | WSL follows the Linux paths; Windows host integrations still vary by harness. |","| Windows native | Supported with limitations | Continuous-learning v2's observer daemon and memory-vault writes have open native-Windows defects ([#2489](https://github.com/affaan-m/ECC/issues/2489), [#2626](https://github.com/affaan-m/ECC/issues/2626)). Shell-backed optional features require Git Bash/WSL or are unavailable. |","","Treat `stable`, `beta`, `experimental`, and `instruction-only` below as capability statements, not marketing tiers.","","| Harness | Status | Recommended distribution | Important limitation |","|---|---|---|---|","| Claude Code | Stable primary | Plugin or selective installer | The plugin advertises the installed catalog to the model; use a selective/manual profile when context footprint matters. Optional shell-backed skills are not portable to every OS. |","| Codex | Supported native plugin | Codex marketplace plugin or repo config | Native hooks require an explicit trust decision and do not use Claude's hook profiles. The legacy sync is compatibility-only. |","| Cursor | Beta project adapter | Selective installer into `.cursor/` | Agent discovery varies by Cursor build, and ECC's installer paths do not yet expose identical hook sets ([#2419](https://github.com/affaan-m/ECC/issues/2419)). |","| OpenCode | Beta built plugin | Build plugin, then selective installer | ECC ships a subset of the catalog; connect a provider and select a model in OpenCode ([#2617](https://github.com/affaan-m/ECC/issues/2617)). |","| GitHub Copilot | Instruction-only | Checked-in instructions and prompt files | No ECC hooks, runtime agents, delegation, or native skill discovery. |","| Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode | Experimental/minimal adapters | Harness-specific selective target | File placement and instruction portability are tested; full Claude feature parity is not claimed. |","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003ePackage manager detection\u003c/strong\u003e\u003c/summary\u003e","","The plugin automatically detects your preferred package manager (npm, pnpm, yarn, or bun) with the following priority:","","1. **Environment variable**: `CLAUDE_PACKAGE_MANAGER`","2. **Project config**: `.claude/package-manager.json`","3. **package.json**: `packageManager` field","4. **Lock file**: Detection from package-lock.json, yarn.lock, pnpm-lock.yaml, or bun.lockb","5. **Global config**: `~/.claude/package-manager.json`","6. **Fallback**: First available package manager","","To set your preferred package manager:","","```bash","# Via environment variable","export CLAUDE_PACKAGE_MANAGER=pnpm","","# Via global config","node scripts/setup-package-manager.js --global pnpm","","# Via project config","node scripts/setup-package-manager.js --project bun","","# Detect current setting","node scripts/setup-package-manager.js --detect","```","","Or use the `/setup-pm` command.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eHook runtime controls (env vars)\u003c/strong\u003e\u003c/summary\u003e","","Use runtime flags to tune strictness or disable specific hooks temporarily:","","```bash","# Hook strictness profile (default: standard)","export ECC_HOOK_PROFILE=standard","","# Comma-separated hook IDs to disable","export ECC_DISABLED_HOOKS=\"pre:bash:tmux-reminder,post:edit:typecheck\"","","# Cap SessionStart additional context (default: 8000 chars)","export ECC_SESSION_START_MAX_CHARS=4000","","# Disable SessionStart additional context entirely for low-context/local-model setups","export ECC_SESSION_START_CONTEXT=off","","# Session-tmp retention window in days (default: 30).","# Set to 0, off, false, disabled, never, or none to keep all sessions (disable pruning).","export ECC_SESSION_RETENTION_DAYS=14","","# Cap how many learned instincts SessionStart injects into context (default: 6)","export ECC_MAX_INJECTED_INSTINCTS=6","","# Minimum confidence an instinct needs to be injected, 0-1 (default: 0.7)","export ECC_INSTINCT_CONFIDENCE_THRESHOLD=0.7","","# SessionStart ranks injected instincts by confidence + project/stack relevance","# (default: on). Project-scoped instincts, and instincts whose domain/trigger","# matches the detected stack (languages, frameworks, plus terraform/dbt markers),","# get a small ranking boost so they surface above unrelated higher-confidence","# ones. Set to off/false/0/no to rank by confidence alone.","export ECC_INSTINCT_RELEVANCE_RANKING=on","","# Keep context/scope/loop warnings but suppress API-rate cost estimates","export ECC_CONTEXT_MONITOR_COST_WARNINGS=off","```","","Windows PowerShell:","","```powershell","[Environment]::SetEnvironmentVariable('ECC_CONTEXT_MONITOR_COST_WARNINGS', 'off', 'User')","[Environment]::SetEnvironmentVariable('ECC_SESSION_RETENTION_DAYS', '14', 'User')","```","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eAgent data home (multi-harness isolation)\u003c/strong\u003e\u003c/summary\u003e","","Memory persistence hooks (session summaries, learned skills, session aliases, metrics) store data under a single agent data root. By default that root is `~/.claude`. When you use ECC in both Claude Code and Cursor on the same machine, set a separate root for Cursor so the two environments do not overwrite each other's session files:","","```bash","# Cursor-only boundary (Claude Code keeps the default ~/.claude)","export ECC_AGENT_DATA_HOME=\"$HOME/.cursor/ecc\"","```","","Paths resolved under that root include:","","- `$ECC_AGENT_DATA_HOME/session-data/`: session summaries","- `$ECC_AGENT_DATA_HOME/skills/learned/`: learned skills from evaluate-session","- `$ECC_AGENT_DATA_HOME/session-aliases.json`: session aliases","- `$ECC_AGENT_DATA_HOME/metrics/`: cost and activity metrics","","See [affaan-m/ECC#2065](https://github.com/affaan-m/ECC/issues/2065).","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eCross-tool capability map and per-harness notes\u003c/strong\u003e\u003c/summary\u003e","","### Cross-tool capability map","","| Capability | Claude Code | Codex | Cursor | OpenCode | GitHub Copilot |","|---|---|---|---|---|---|","| Instructions | Native | Native `AGENTS.md` | Project rules | Plugin instructions | Native instruction file |","| Skills | Native installed set | Native plugin set | Build-dependent/project set | Built subset | Prompt/instruction references only |","| Agents/delegation | Native agents | Codex multi-agent roles; Claude agent files are not installed as roles | Build-dependent project agents | Plugin agents | Not supported |","| ECC hooks | Native plugin hooks | Native reviewed subset with explicit trust | Cursor hook adapter; install-path differences remain | Plugin events | Not supported |","| MCP configuration | Available, explicit activation | Native plugin manifest; legacy sync can merge TOML | Explicit project/user config | Provider/plugin config | Not supplied by ECC |","| Parity with Claude Code | Primary reference | Partial | Partial | Partial | Not a parity target |","","**Key architectural decisions:**","- **AGENTS.md** at root is the universal cross-tool file (read by Claude Code, Cursor, Codex, and OpenCode; GitHub Copilot uses `.github/copilot-instructions.md` instead)","- **DRY adapter pattern** lets Cursor reuse Claude Code's hook scripts without duplication","- **Skills format** (SKILL.md with YAML frontmatter) works across Claude Code, Codex, and OpenCode","- Codex's narrower native hook set is supplemented by `AGENTS.md`, optional `model_instructions_file` overrides, and sandbox permissions","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eCursor IDE support in depth\u003c/strong\u003e\u003c/summary\u003e","","ECC provides Cursor IDE support with hooks, rules, agents, skills, commands, and MCP configs adapted for Cursor's project layout.","","```bash","# macOS/Linux","./install.sh --target cursor typescript","./install.sh --target cursor python golang swift php","```","","```powershell","# Windows PowerShell",".\\install.ps1 --target cursor typescript",".\\install.ps1 --target cursor python golang swift php","```","","#### What's included for Cursor","","| Component | Count | Details |","|-----------|-------|---------|","| Hook Events | 15 | sessionStart, beforeShellExecution, afterFileEdit, beforeMCPExecution, beforeSubmitPrompt, and 10 more |","| Hook Scripts | 16 | Thin Node.js scripts delegating to `scripts/hooks/` via shared adapter |","| Rules | 34 | 9 common (alwaysApply) + 25 language-specific (TypeScript, Python, Go, Swift, PHP) |","| Agents | 48 | `.cursor/agents/ecc-*.md` when installed; prefixed to avoid collisions with user or marketplace agents |","| Skills | Shared + Bundled | `.cursor/skills/` for translated additions |","| Commands | Shared | `.cursor/commands/` if installed |","| MCP Config | Shared | `.cursor/mcp.json` if installed |","","#### Cursor loading notes","","ECC does not install root `AGENTS.md` into `.cursor/`. Cursor treats nested `AGENTS.md` files as directory context, so copying ECC's repo identity into a host project would pollute that project.","","Cursor-native loading behavior can vary by Cursor build. ECC installs agents as `.cursor/agents/ecc-*.md`; if your Cursor build does not expose project agents, those files still work as explicit reference definitions instead of hidden global prompt context.","","#### Memory and data isolation (Cursor + Claude Code)","","ECC memory hooks reuse the same `scripts/hooks/*.js` as Claude Code. For Cursor, ECC tries to keep memory **out of `~/.claude` automatically**:","","1. **Cursor `sessionStart` hook** (installed to `.cursor/hooks.json` on `--target cursor`) injects `ECC_AGENT_DATA_HOME` for the whole composer session.","2. **Hook runtime default**: when `CURSOR_VERSION` or `CURSOR_PROJECT_DIR` is present, hooks default to `~/.cursor/ecc` if the env var is unset.","3. **Project config**: `.cursor/ecc-agent-data.json` documents and overrides the path (`agentDataHome`).","4. **Always-on rule**: `.cursor/rules/ecc-agent-data-home.mdc` reminds the agent where memory lives.","","You can still override explicitly:","","```bash","export ECC_AGENT_DATA_HOME=\"$HOME/.cursor/ecc\"","```","","To **share** memory with Claude Code on purpose, set `ECC_AGENT_DATA_HOME=~/.claude` in the shell or in `.cursor/ecc-agent-data.json`.","","Continuous learning v2 instincts remain separate under `CLV2_HOMUNCULUS_DIR` (default `~/.local/share/ecc-homunculus`).","","#### Hook architecture (DRY adapter pattern)","","Cursor has **more hook events than Claude Code** (20 vs 8). The `.cursor/hooks/adapter.js` module transforms Cursor's stdin JSON to Claude Code's format, allowing existing `scripts/hooks/*.js` to be reused without duplication.","","```","Cursor stdin JSON -\u003e adapter.js -\u003e transforms -\u003e scripts/hooks/*.js","                                                (shared with Claude Code)","```","","Key hooks:","- **beforeShellExecution**: Blocks dev servers outside tmux (exit 2), git push review","- **afterFileEdit**: Auto-format + TypeScript check + console.log warning","- **beforeSubmitPrompt**: Detects secrets (sk-, ghp_, AKIA patterns) in prompts","- **beforeTabFileRead**: Blocks Tab from reading .env, .key, .pem files (exit 2)","- **beforeMCPExecution / afterMCPExecution**: MCP audit logging","","#### Rules format","","Cursor rules use YAML frontmatter with `description`, `globs`, and `alwaysApply`:","","```yaml","---","description: \"TypeScript coding style extending common rules\"","globs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]","alwaysApply: false","---","```","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eCodex macOS app + CLI support in depth\u003c/strong\u003e\u003c/summary\u003e","","ECC provides a supported native Codex marketplace plugin and repo-local configuration for the macOS app and CLI. The native plugin carries shared skills, MCP configuration, and a reviewed hook subset; Codex keeps hook trust under explicit user control. The older sync path remains compatibility-only. For repo navigation, surface ownership, and PR diff packet guidance, start with [`docs/CODEX-NAVIGATION-GUIDE.md`](docs/CODEX-NAVIGATION-GUIDE.md).","","```bash","# Recommended current install: add ECC's native plugin from the repo marketplace","codex plugin marketplace add affaan-m/ECC","codex plugin add ecc@ecc","codex plugin list --json","","# Or run Codex CLI in the repo: AGENTS.md and .codex/ are auto-detected","codex","```","","Legacy copied-configuration compatibility is still available when you intentionally need it:","","```bash","# Compatibility-only managed sync into ~/.codex","npm install \u0026\u0026 bash scripts/sync-ecc-to-codex.sh","","# Or copy only the reference config manually","cp .codex/config.toml ~/.codex/config.toml","```","","The sync script safely merges ECC MCP servers into your existing `~/.codex/config.toml` using an **add-only** strategy: it never removes or modifies your existing servers. Run with `--dry-run` to preview changes, or `--update-mcp` to force-refresh ECC servers to the latest recommended config.","","For Context7, ECC uses the canonical Codex section name `[mcp_servers.context7]` while still launching the `@upstash/context7-mcp` package. If you already have a legacy `[mcp_servers.context7-mcp]` entry, `--update-mcp` migrates it to the canonical section name.","","Codex macOS app:","- Open this repository as your workspace.","- The root `AGENTS.md` is auto-detected.","- `.codex/config.toml` and `.codex/agents/*.toml` work best when kept project-local.","- The reference `.codex/config.toml` intentionally does not pin `model` or `model_provider`, so Codex uses its own current default unless you override it.","- Optional: copy `.codex/config.toml` to `~/.codex/config.toml` for global defaults; keep the multi-agent role files project-local unless you also copy `.codex/agents/`.","","#### What's included in the repo and legacy configuration layer","","| Component | Count | Details |","|-----------|-------|---------|","| Config | 1 | `.codex/config.toml`: top-level approvals/sandbox/web_search, MCP servers, notifications, profiles |","| AGENTS.md | 2 | Root (universal) + `.codex/AGENTS.md` (Codex-specific supplement) |","| Skills | 32 | `.agents/skills/`: SKILL.md + agents/openai.yaml per skill |","| MCP Servers | 6 | GitHub, Context7, Exa, Memory, Playwright, Sequential Thinking (7 with Supabase via `--update-mcp` sync) |","| Profiles | 2 | `strict` (read-only sandbox) and `yolo` (full auto-approve) |","| Agent Roles | 3 | `.codex/agents/`: explorer, reviewer, docs-researcher |","","Skills at `.agents/skills/` are auto-loaded by Codex. Canonical Anthropic skills such as `claude-api`, `frontend-design`, and `skill-creator` are intentionally not re-bundled here. Install those from [`anthropics/skills`](https://github.com/anthropics/skills) when you want the official versions.","","#### Key limitation","","Codex does **not provide Claude-style hook execution parity**. The native ECC plugin includes a reviewed hook subset that requires explicit trust in `/hooks`; `AGENTS.md`, optional `model_instructions_file` overrides, and sandbox/approval settings provide the remaining instruction and policy layers.","","#### Multi-agent support","","Current Codex builds support stable multi-agent workflows.","","- Enable `features.multi_agent = true` in `.codex/config.toml`","- Define roles under `[agents.\u003cname\u003e]`","- Point each role at a file under `.codex/agents/`","- Use `/agent` in the CLI to inspect or steer child agents","","ECC ships three sample role configs:","","| Role | Purpose |","|------|---------|","| `explorer` | Read-only codebase evidence gathering before edits |","| `reviewer` | Correctness, security, and missing-test review |","| `docs_researcher` | Documentation and API verification before release/docs changes |","","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eZed support\u003c/strong\u003e\u003c/summary\u003e","","ECC provides Zed project support through a conservative `.zed` adapter for project-local settings, flattened rules, agents, commands, and skills.","","```bash","./install.sh --profile minimal --target zed","```","","```powershell",".\\install.ps1 --profile minimal --target zed","```","","The adapter writes ECC-managed files under `.zed/` and keeps BYOK/OpenRouter credentials out of the repo. Configure Zed account or API keys through Zed's own settings UI or your local user settings.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eOpenCode support in depth\u003c/strong\u003e\u003c/summary\u003e","","ECC provides a beta OpenCode plugin integration with instructions, a catalog subset, commands, custom tools, and hook events. It does not provide feature parity with Claude Code. The reference config inherits the user's OpenCode model selection instead of pinning a provider-specific model.","","```bash","# Run your reviewed OpenCode installation in the repository root","opencode","```","","For installation, use the [official OpenCode instructions](https://opencode.ai/docs/), select an exact release, and verify it before execution. The upstream npm package is `opencode-ai`, not `opencode`. ECC does not attest to an audited OpenCode runtime version.","","The configuration is automatically detected from `.opencode/opencode.json`.","","#### Hook support via plugins","","OpenCode's plugin system has 20+ event types:","","| Claude Code Hook | OpenCode Plugin Event |","|-----------------|----------------------|","| PreToolUse | `tool.execute.before` |","| PostToolUse | `tool.execute.after` |","| Stop | `session.idle` |","| SessionStart | `session.created` |","| SessionEnd | `session.deleted` |","","**Additional OpenCode events**: `file.edited`, `file.watcher.updated`, `message.updated`, `lsp.client.diagnostics`, `tui.toast.show`, and more.","","#### Plugin installation","","**Option 1: Use directly**","```bash","cd ECC","opencode","```","","**Option 2: Install as npm package**","```bash","npm install ecc-universal@2.2.2","```","","Then add to your `opencode.json`:","```json","{","  \"plugin\": [\"ecc-universal\"]","}","```","","That npm plugin entry enables ECC's published OpenCode plugin module (hooks/events and plugin tools). It does **not** automatically add ECC's full command/agent/instruction catalog to your project config.","","For the full ECC OpenCode setup, either:","- run OpenCode inside this repository, or","- copy the bundled `.opencode/` config assets into your project and wire the `instructions`, `agent`, and `command` entries in `opencode.json`","","#### Documentation","","- **Migration Guide**: `.opencode/MIGRATION.md`","- **OpenCode Plugin README**: `.opencode/README.md`","- **Consolidated Rules**: `.opencode/instructions/INSTRUCTIONS.md`","- **LLM Documentation**: `llms.txt` (complete OpenCode docs for LLMs)","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eGitHub Copilot support in depth\u003c/strong\u003e\u003c/summary\u003e","","ECC provides **GitHub Copilot support** for VS Code via Copilot Chat's native instruction and prompt file system. No extra tooling required.","","#### What's included for GitHub Copilot","","| Component | File | Purpose |","|-----------|------|---------|","| Core instructions | `.github/copilot-instructions.md` | Always-loaded rules: coding style, security, testing, git workflow |","| VS Code settings | `.vscode/settings.json` | Per-task instruction files for code gen, test gen, and commit messages |","| Plan prompt | `.github/prompts/plan.prompt.md` | Phased implementation planning |","| TDD prompt | `.github/prompts/tdd.prompt.md` | Red-Green-Improve cycle |","| Security review prompt | `.github/prompts/security-review.prompt.md` | Deep OWASP-aligned security analysis |","| Build fix prompt | `.github/prompts/build-fix.prompt.md` | Systematic build and CI error resolution |","| Refactor prompt | `.github/prompts/refactor.prompt.md` | Dead code cleanup and simplification |","","The files are already in place: open any repo that contains this project and GitHub Copilot Chat will automatically pick up `.github/copilot-instructions.md`. The committed `.vscode/settings.json` enables `chat.promptFiles` so VS Code can load the reusable prompts from `.github/prompts/`.","","To use the workflow prompts in Copilot Chat:","1. Open the Copilot Chat panel in VS Code.","2. Click the **paperclip / attach** icon and select **Prompt...**, or type `/` and choose a prompt.","3. Select the prompt (e.g. `plan`, `tdd`, `security-review`).","","#### Feature coverage","","| ECC Feature | Copilot equivalent |","|-------------|-------------------|","| Coding standards | Always-on via `copilot-instructions.md` |","| Security checklist | Always-on + `security-review` prompt |","| Testing / TDD | Always-on + `tdd` prompt |","| Implementation planning | `plan` prompt |","| Code review | External PR review via CodeRabbit + Greptile |","| Build error resolution | `build-fix` prompt |","| Refactoring | `refactor` prompt |","| Commit message format | Per-task instruction in `settings.json` |","| Hooks / automation | Not supported (Copilot has no hook system) |","| Agents / delegation | Not supported (Copilot has no subagent API) |","","#### Limitations","","GitHub Copilot does not have a hook system or a subagent API, so ECC's hook automations (auto-format, TypeScript check, session persistence, dev-server guard) and agent delegation are unavailable. The instruction and prompt layer still brings the full ECC coding philosophy (standards, security, TDD, and workflow) into every Copilot Chat session.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eWhat changed in v2.0.0\u003c/strong\u003e\u003c/summary\u003e","","ECC v2.0.0 stabilizes the 2.0 line with the public Hermes operator story, 281 skills, 67 agents, 94 command shims, session adapters, MCP inventory, worktree lifecycle services, orchestrator workflows, and the ECC Discord community.","","- [v2.0.0 release notes](docs/releases/2.0.0/release-notes.md)","- [ECC 2.0 reference architecture](docs/ECC-2.0-REFERENCE-ARCHITECTURE.md)","- [Hermes setup guide](docs/HERMES-SETUP.md)","- [Migration guide from 1.x](docs/MIGRATION-1X-TO-2.0.md)","\u003c/details\u003e","\u003c/details\u003e","","## Token Optimization","","Agent usage can be expensive if you don't manage token consumption. These settings significantly reduce costs without sacrificing quality. Full guide: [docs/token-optimization.md](docs/token-optimization.md).","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eRecommended settings\u003c/strong\u003e\u003c/summary\u003e","","Add to `~/.claude/settings.json`:","","```json","{","  \"model\": \"sonnet\",","  \"env\": {","    \"MAX_THINKING_TOKENS\": \"10000\",","    \"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE\": \"50\",","    \"CLAUDE_CODE_SUBAGENT_MODEL\": \"haiku\"","  }","}","```","","| Setting | Default | Recommended | Impact |","|---------|---------|-------------|--------|","| `model` | opus | **sonnet** | ~60% cost reduction; handles 80%+ of coding tasks |","| `MAX_THINKING_TOKENS` | 31,999 | **10,000** | ~70% reduction in hidden thinking cost per request |","| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | 95 | **50** | Compacts earlier, better quality in long sessions |","| `ECC_CONTEXT_MONITOR_COST_WARNINGS` | on | **off for subscription users** | Suppresses agent-facing API-rate estimate warnings while keeping context/scope/loop warnings |","","Switch to Opus only when you need deep architectural reasoning:","```","/model opus","```","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eDaily workflow commands\u003c/strong\u003e\u003c/summary\u003e","","| Command | When to Use |","|---------|-------------|","| `/model sonnet` | Default for most tasks |","| `/model opus` | Complex architecture, debugging, deep reasoning |","| `/clear` | Between unrelated tasks (free, instant reset) |","| `/compact` | At logical task breakpoints (research done, milestone complete) |","| `/cost` | Monitor token spending during session |","","If you use a subscription and the context monitor's API-rate estimates are not useful, set `ECC_CONTEXT_MONITOR_COST_WARNINGS=off`. This only suppresses the agent-facing cost warnings; it does not disable context exhaustion, scope, or loop warnings.","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eStrategic compaction\u003c/strong\u003e\u003c/summary\u003e","","The `strategic-compact` skill suggests `/compact` at logical breakpoints instead of relying on auto-compaction at 95% context. See `skills/strategic-compact/SKILL.md` for the full decision guide.","","**When to compact:**","- After research/exploration, before implementation","- After completing a milestone, before starting the next","- After debugging, before continuing feature work","- After a failed approach, before trying a new one","","**When NOT to compact:**","- Mid-implementation (you'll lose variable names, file paths, partial state)","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eContext window management\u003c/strong\u003e\u003c/summary\u003e","","**Critical:** Don't enable all MCPs at once. Each MCP tool description consumes tokens from your 200k window, potentially reducing it to ~70k.","","- Keep under 10 MCPs enabled per project","- Keep under 80 tools active","- Use `/mcp` to disable unused Claude Code MCP servers; those runtime choices persist in `~/.claude.json`","- Use `ECC_DISABLED_MCPS` only to filter ECC-generated MCP configs during install/sync flows","- If context is getting heavy, run `/context-budget` and remove rules you do not need","","**Agent teams cost warning:** Agent Teams spawns multiple context windows. Each teammate consumes tokens independently. Only use for tasks where parallelism provides clear value (multi-module work, parallel reviews). For simple sequential tasks, subagents are more token-efficient.","\u003c/details\u003e","","## Requirements","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eClaude Code CLI version + hooks auto-loading behavior\u003c/strong\u003e\u003c/summary\u003e","","### Claude Code CLI version","","**Minimum version: v2.1.0 or later.** The plugin requires Claude Code CLI v2.1.0+ due to changes in how the plugin system handles hooks.","","Check your version:","```bash","claude --version","```","","### Important: hooks auto-loading behavior","","\u003e WARNING: **For Contributors:** Do NOT add a `\"hooks\"` field to `.claude-plugin/plugin.json`. This is enforced by a regression test.","","Claude Code v2.1+ **automatically loads** `hooks/hooks.json` from any installed plugin by convention. Explicitly declaring it in `plugin.json` causes a duplicate detection error:","","```","Duplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file","```","","**History:** This has caused repeated fix/revert cycles in this repo ([#29](https://github.com/affaan-m/ECC/issues/29), [#52](https://github.com/affaan-m/ECC/issues/52), [#103](https://github.com/affaan-m/ECC/issues/103)). The behavior changed between Claude Code versions, leading to confusion. There is now a regression test to prevent this from being reintroduced.","\u003c/details\u003e","","## Security","","Install ECC only from official sources:","","- GitHub repository: \u003chttps://github.com/affaan-m/ECC\u003e","- Claude Code plugin: `ecc@ecc`","- npm packages: [`ecc-universal`](https://www.npmjs.com/package/ecc-universal) and [`ecc-agentshield`](https://www.npmjs.com/package/ecc-agentshield)","- GitHub App: \u003chttps://github.com/apps/ecc-tools\u003e","- Website: \u003chttps://ecc.tools\u003e","","Scan a project with an already installed, reviewed AgentShield binary (see [runner provenance](#agentshield-runner-provenance)):","","```bash","agentshield scan --path .","```","","- **Report a vulnerability.** Use the private process in [SECURITY.md](SECURITY.md) (GitHub private vulnerability reporting). Please do not open public issues for security reports.","- **Built-in guardrails.** GateGuard gates destructive shell commands (including `rm`, force/path `git checkout`, and destructive `find -exec`) before they run; the supply-chain IOC scanner runs in CI; and AgentShield audits your own agent, hook, MCP, permission, and secret surfaces (`/security-scan`).","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eHooks, MCP servers, and context controls\u003c/strong\u003e\u003c/summary\u003e","","Hooks can run shell commands, MCP servers can hold credentials, and project instructions can enter an agent's context. Treat all three as executable configuration.","","Do not copy raw `hooks/hooks.json` into `~/.claude/settings.json` after a plugin install. Modern Claude Code versions load plugin hooks automatically, and a second copy can make them fire twice.","","Use `/mcp` for Claude Code runtime disables; Claude Code persists those choices in `~/.claude.json`.","","`ECC_DISABLED_MCPS` is an ECC install/sync filter, not a live Claude Code toggle.","","If context is getting heavy, run `/context-budget`, remove rules you do not need, and disable unused MCP servers. See the [token optimization guide](docs/token-optimization.md).","\u003c/details\u003e","","Security references:","","- [Security policy](SECURITY.md)","- [Security guide](./the-security-guide.md)","- [MCP connector policy](docs/MCP-CONNECTOR-POLICY.md)","- [Supply-chain incident response](docs/security/supply-chain-incident-response.md)","","## Ecosystem Tools","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eSkill Creator: generate skills from your git history\u003c/strong\u003e\u003c/summary\u003e","","Two ways to generate skills from your repository:","","### Option A: Local Analysis (Built-in)","","Use the `/skill-create` command for local analysis without external services:","","```bash","/skill-create                    # Analyze current repo","/skill-create --instincts        # Also generate instincts for continuous-learning-v2","```","","This analyzes your git history locally and generates SKILL.md files.","","### Option B: GitHub App (Advanced)","","For advanced features (10k+ commits, auto-PRs, team sharing):","","[Install ECC Tools GitHub App](https://github.com/apps/ecc-tools) | [ecc.tools](https://ecc.tools)","","```bash","# Comment on any issue:","/ecc-tools analyze","```","","Both options create:","- **SKILL.md files**: Ready-to-use skills for the active harness","- **Instinct collections**: For continuous-learning-v2","- **Pattern extraction**: Learns from your commit history","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eAgentShield: security auditor for agent configs\u003c/strong\u003e\u003c/summary\u003e","","\u003e Built at the Claude Code Hackathon (Cerebral Valley x Anthropic, Feb 2026). 1282 tests, 98% coverage, 102 static analysis rules.","","Scan your agent configuration for vulnerabilities, misconfigurations, and injection risks.","","\u003ca id=\"agentshield-runner-provenance\"\u003e\u003c/a\u003e","**Runner provenance:** these commands require an already installed, reviewed AgentShield binary from `ecc-agentshield`. The [official package](https://www.npmjs.com/package/ecc-agentshield) documents the `agentshield` CLI. Record the selected release, reviewed source and verified package integrity in your installation record. Registry publication alone does not establish an audit; ECC does not supply an audited AgentShield pin here. Do not substitute an unversioned one-shot download. `/security-scan` is workflow guidance and has the same runner prerequisite.","","```bash","# Scan only the intended project directory","agentshield scan --path .","","# Auto-fix safe issues","agentshield scan --path . --fix","","# Deep analysis with three Opus 4.6 agents","agentshield scan --path . --opus --stream","","# Generate secure config from scratch","agentshield init","```","","**What it scans:** CLAUDE.md, settings.json, MCP configs, hooks, agent definitions, and skills across 5 categories: secrets detection (14 patterns), permission auditing, hook injection analysis, MCP server risk profiling, and agent config review.","","**The `--opus` flag** runs three Claude Opus 4.6 agents in a red-team/blue-team/auditor pipeline. The attacker finds exploit chains, the defender evaluates protections, and the auditor synthesizes both into a prioritized risk assessment. Adversarial reasoning, not just pattern matching.","","**Output formats:** Terminal (color-graded A-F), JSON (CI pipelines), Markdown, HTML. Exit code 2 on critical findings for build gates.","","Use `/security-scan` in Claude Code to run it, or add to CI with the [GitHub Action](https://github.com/affaan-m/agentshield).","","[GitHub](https://github.com/affaan-m/agentshield) | [npm](https://www.npmjs.com/package/ecc-agentshield)","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eContinuous Learning v2: instincts\u003c/strong\u003e\u003c/summary\u003e","","The instinct-based learning system automatically learns your patterns:","","```bash","/instinct-status        # Show learned instincts with confidence","/instinct-import \u003cfile\u003e # Import instincts from others","/instinct-export        # Export your instincts for sharing","/evolve                 # Cluster related instincts into skills","```","","See `skills/continuous-learning-v2/` for full documentation. Keep `continuous-learning/` only when you explicitly want the legacy v1 Stop-hook learned-skill flow.","\u003c/details\u003e","","## Troubleshooting","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eECC appears twice or hooks fire twice\u003c/strong\u003e\u003c/summary\u003e","","The usual cause is installing the Claude plugin and then running `./install.sh --profile full` on top of it.","","1. Remove the Claude Code plugin install.","2. Run `node scripts/ecc.js uninstall --dry-run` from the ECC checkout.","3. Remove extra rule folders you manually copied and no longer want.","4. Reinstall once, using one path.","","For hook-specific checks, see the [hooks README](hooks/README.md).","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eMy hooks aren't working / \"Duplicate hooks file\" errors\u003c/strong\u003e\u003c/summary\u003e","","**Do NOT add a `\"hooks\"` field to `.claude-plugin/plugin.json`.** Claude Code v2.1+ automatically loads `hooks/hooks.json` from installed plugins. Explicitly declaring it causes duplicate detection errors. See [#29](https://github.com/affaan-m/ECC/issues/29), [#52](https://github.com/affaan-m/ECC/issues/52), [#103](https://github.com/affaan-m/ECC/issues/103).","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eCodex marketplace installs but skills do not load\u003c/strong\u003e\u003c/summary\u003e","","Run the cache check from an ECC checkout:","","```bash","node scripts/codex/check-plugin-cache.js","```","","If it reports unresolved parent references, refresh the native cache with `codex plugin marketplace upgrade ecc`, run `codex plugin add ecc@ecc` again, and restart Codex. Registration in `codex plugin list` confirms the marketplace entry, while the cache check verifies that the installed manifest can resolve its skills, MCP configuration, and assets. Use `bash scripts/sync-ecc-to-codex.sh` only when you intentionally need the legacy copied-configuration compatibility path.","\u003c/details\u003e","","More answers: [TROUBLESHOOTING.md](TROUBLESHOOTING.md) covers memory, hooks, installation, performance, and common error messages. [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) tracks workarounds for open Claude Code bugs.","","## Running Tests","","The plugin includes a comprehensive test suite:","","```bash","# Run all tests","node tests/run-all.js","","# Run individual test files","node tests/lib/utils.test.js","node tests/lib/package-manager.test.js","node tests/hooks/hooks.test.js","```","","## Background","","I've been using Claude Code since the experimental rollout. Won the Anthropic x Forum Ventures hackathon in Sep 2025 with [@DRodriguezFX](https://x.com/DRodriguezFX), built [zenith.chat](https://zenith.chat) entirely with agentic workflows.","","These configs are battle-tested across multiple production applications.","","## Community and Project","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eSponsors and ECC Pro\u003c/strong\u003e\u003c/summary\u003e","","ECC stays free because sponsors and Pro users fund the work. Sponsor logos are at the top of this README; the full roster and tiers are in [SPONSORS.md](SPONSORS.md).","","ECC Pro adds private-repo analysis, PR-triggered audits, AgentShield-backed scanning, automatic push and PR checks, pooled team usage, and priority support through the hosted GitHub App.","","\u003ctable\u003e","\u003ctr\u003e","\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://ecc.tools/pricing\"\u003e\u003cstrong\u003eECC Pro\u003c/strong\u003e\u003cbr /\u003e\u003csub\u003eHosted GitHub App for private repos\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e","\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://github.com/sponsors/affaan-m\"\u003e\u003cstrong\u003eSponsor ECC\u003c/strong\u003e\u003cbr /\u003e\u003csub\u003eFund the OSS work\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e","\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://github.com/affaan-m/ECC/discussions\"\u003e\u003cstrong\u003eCommunity\u003c/strong\u003e\u003cbr /\u003e\u003csub\u003eQ\u0026amp;A, ideas, and Show and Tell\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e","\u003ctd width=\"25%\" align=\"center\"\u003e\u003ca href=\"https://github.com/apps/ecc-tools\"\u003e\u003cstrong\u003eGitHub App\u003c/strong\u003e\u003cbr /\u003e\u003csub\u003ePR audits and hosted workflows\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e","\u003c/tr\u003e","\u003c/table\u003e","","[Become a sponsor](https://github.com/sponsors/affaan-m) | [Sponsor tiers](SPONSORS.md) | [Sponsorship program](SPONSORING.md)","\u003c/details\u003e","","\u003cdetails\u003e","\u003csummary\u003e\u003cstrong\u003eContributing\u003c/strong\u003e\u003c/summary\u003e","","Contributions are welcome across skills, agents, rules, hooks, docs, tests, adapters, and security improvements.","","- [Contributing guide](CONTRIBUTING.md)","- [Skill development guide](docs/SKILL-DEVELOPMENT-GUIDE.md)","- [Skill placement policy](docs/SKILL-PLACEMENT-POLICY.md)","- [Command quick reference](COMMANDS-QUICK-REF.md)","","The short version:","1. Fork the repo","2. Create your skill in `skills/your-skill-name/SKILL.md` (with YAML frontmatter)","3. Or create an agent in `agents/your-agent.md`","4. Submit a PR with a clear description of what it does and when to use it","","**Ideas for contributions:**","","- Language-specific skills (Rust, C#, Kotlin, Java): Go, Python, Perl, Swift, TypeScript, and HarmonyOS/ArkTS already included","- Framework-specific configs (Rails, FastAPI): Django, NestJS, Spring Boot, and Laravel already included","- DevOps agents (Kubernetes, Terraform, AWS, Docker)","- Testing strategies (different frameworks, visual regression)","- Domain-specific knowledge (ML, data engineering, mobile)","\u003c/details\u003e","","## Links","","- **Shorthand Guide (Start Here):** [The Shorthand Guide to ECC](https://x.com/affaan/status/2012378465664745795)","- **Longform Guide (Advanced):** [The Longform Guide to ECC](https://x.com/affaan/status/2014040193557471352)","- **Security Guide:** [Security Guide](./the-security-guide.md) | [Thread](https://x.com/affaan/status/2033263813387223421)","- **Follow:** [@affaan](https://x.com/affaan)","","## License","","MIT. Use it freely, adapt it to your workflow, and contribute back when you can.","","**Star this repo if it helps. Read the guides. Build something great.**"],"stylingDirectives":[[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,27,"pl-s"],[27,28,"pl-s"],[29,32,"pl-e"],[33,34,"pl-s"],[34,74,"pl-s"],[74,75,"pl-s"],[76,81,"pl-e"],[82,83,"pl-s"],[83,87,"pl-s"],[87,88,"pl-s"]],[[2,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,52,"pl-s"],[52,53,"pl-s"]],[[4,13,"pl-c1"]],[[4,140,"pl-c1"]],[[4,142,"pl-c1"]],[[4,14,"pl-c1"]],[[4,5,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,52,"pl-s"],[52,53,"pl-s"]],[[4,13,"pl-c1"]],[[4,136,"pl-c1"]],[[4,125,"pl-c1"]],[[4,14,"pl-c1"]],[[4,5,"pl-ent"]],[[2,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,9,"pl-ent"],[21,27,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,20,"pl-s"],[20,21,"pl-s"],[31,32,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,31,"pl-s"],[31,32,"pl-s"],[53,54,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,26,"pl-s"],[26,27,"pl-s"],[34,35,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,31,"pl-s"],[31,32,"pl-s"],[39,40,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,31,"pl-s"],[31,32,"pl-s"],[38,39,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,31,"pl-s"],[31,32,"pl-s"],[38,39,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,28,"pl-s"],[28,29,"pl-s"],[38,39,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,28,"pl-s"],[28,29,"pl-s"],[39,40,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,31,"pl-s"],[31,32,"pl-s"],[45,46,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,28,"pl-s"],[28,29,"pl-s"],[35,36,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,31,"pl-s"],[31,32,"pl-s"],[42,43,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,28,"pl-s"],[28,29,"pl-s"],[39,40,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,31,"pl-s"],[31,32,"pl-s"],[45,46,"pl-ent"]],[[2,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,40,"pl-s"],[40,41,"pl-s"],[43,46,"pl-ent"],[47,50,"pl-e"],[51,52,"pl-s"],[52,158,"pl-s"],[158,159,"pl-s"],[160,163,"pl-e"],[164,165,"pl-s"],[165,172,"pl-s"],[172,173,"pl-s"],[178,179,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,28,"pl-s"],[28,29,"pl-s"],[31,34,"pl-ent"],[35,38,"pl-e"],[39,40,"pl-s"],[40,127,"pl-s"],[127,128,"pl-s"],[129,132,"pl-e"],[133,134,"pl-s"],[134,141,"pl-s"],[141,142,"pl-s"],[147,148,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,44,"pl-s"],[44,45,"pl-s"],[47,50,"pl-ent"],[51,54,"pl-e"],[55,56,"pl-s"],[56,144,"pl-s"],[144,145,"pl-s"],[146,149,"pl-e"],[150,151,"pl-s"],[151,161,"pl-s"],[161,162,"pl-s"],[167,168,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,18,"pl-s"],[18,19,"pl-s"],[21,24,"pl-ent"],[25,28,"pl-e"],[29,30,"pl-s"],[30,79,"pl-s"],[79,80,"pl-s"],[81,84,"pl-e"],[85,86,"pl-s"],[86,97,"pl-s"],[97,98,"pl-s"],[103,104,"pl-ent"]],[[2,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,42,"pl-s"],[42,43,"pl-s"],[45,48,"pl-ent"],[49,52,"pl-e"],[53,54,"pl-s"],[54,113,"pl-s"],[113,114,"pl-s"],[115,118,"pl-e"],[119,120,"pl-s"],[120,132,"pl-s"],[132,133,"pl-s"],[138,139,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,48,"pl-s"],[48,49,"pl-s"],[51,54,"pl-ent"],[55,58,"pl-e"],[59,60,"pl-s"],[60,119,"pl-s"],[119,120,"pl-s"],[121,124,"pl-e"],[125,126,"pl-s"],[126,138,"pl-s"],[138,139,"pl-s"],[144,145,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,62,"pl-s"],[62,63,"pl-s"],[65,68,"pl-ent"],[69,72,"pl-e"],[73,74,"pl-s"],[74,140,"pl-s"],[140,141,"pl-s"],[142,145,"pl-e"],[146,147,"pl-s"],[147,159,"pl-s"],[159,160,"pl-s"],[165,166,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,51,"pl-s"],[51,52,"pl-s"],[54,57,"pl-ent"],[58,61,"pl-e"],[62,63,"pl-s"],[63,157,"pl-s"],[157,158,"pl-s"],[159,162,"pl-e"],[163,164,"pl-s"],[164,183,"pl-s"],[183,184,"pl-s"],[189,190,"pl-ent"]],[[2,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,54,"pl-s"],[54,55,"pl-s"],[57,60,"pl-ent"],[61,64,"pl-e"],[65,66,"pl-s"],[66,138,"pl-s"],[138,139,"pl-s"],[140,143,"pl-e"],[144,145,"pl-s"],[145,172,"pl-s"],[172,173,"pl-s"],[178,179,"pl-ent"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,56,"pl-s"],[56,57,"pl-s"],[59,62,"pl-ent"],[63,66,"pl-e"],[67,68,"pl-s"],[68,144,"pl-s"],[144,145,"pl-s"],[146,149,"pl-e"],[150,151,"pl-s"],[151,180,"pl-s"],[180,181,"pl-s"],[186,187,"pl-ent"]],[[2,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,84,"pl-s"],[84,85,"pl-s"],[86,89,"pl-e"],[90,91,"pl-s"],[91,96,"pl-s"],[96,97,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,91,"pl-s"],[91,92,"pl-s"],[93,96,"pl-e"],[97,98,"pl-s"],[98,108,"pl-s"],[108,109,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,83,"pl-s"],[83,84,"pl-s"],[85,88,"pl-e"],[89,90,"pl-s"],[90,96,"pl-s"],[96,97,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,75,"pl-s"],[75,76,"pl-s"],[77,80,"pl-e"],[81,82,"pl-s"],[82,84,"pl-s"],[84,85,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,82,"pl-s"],[82,83,"pl-s"],[84,87,"pl-e"],[88,89,"pl-s"],[89,93,"pl-s"],[93,94,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,79,"pl-s"],[79,80,"pl-s"],[81,84,"pl-e"],[85,86,"pl-s"],[86,90,"pl-s"],[90,91,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,87,"pl-s"],[87,88,"pl-s"],[89,92,"pl-e"],[93,94,"pl-s"],[94,102,"pl-s"],[102,103,"pl-s"]],[[2,3,"pl-ent"]],[],[[0,12,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-s"],[11,12,"pl-s"]],[[0,556,"pl-ent"],[0,2,"pl-ent"],[2,4,"pl-s"],[26,28,"pl-s"],[92,93,"pl-s"],[116,117,"pl-s"],[117,118,"pl-s"],[118,149,"pl-corl"],[149,150,"pl-s"],[169,170,"pl-s"],[170,171,"pl-s"],[171,184,"pl-c1"],[184,185,"pl-s"],[185,186,"pl-s"],[186,187,"pl-s"],[187,230,"pl-corl"],[230,231,"pl-s"],[236,237,"pl-s"],[237,238,"pl-s"],[238,253,"pl-c1"],[253,254,"pl-s"],[254,255,"pl-s"],[255,256,"pl-s"],[256,301,"pl-corl"],[301,302,"pl-s"],[308,309,"pl-s"],[319,320,"pl-s"],[320,321,"pl-s"],[321,354,"pl-corl"],[354,355,"pl-s"],[373,374,"pl-s"],[374,381,"pl-c1"],[381,382,"pl-s"],[408,409,"pl-s"],[418,419,"pl-s"],[419,420,"pl-s"],[420,437,"pl-corl"],[437,438,"pl-s"]],[[0,0,"pl-ent"]],[[0,27,"pl-mh"],[3,27,"pl-en"]],[],[[8,9,"pl-s"],[21,22,"pl-s"],[22,23,"pl-s"],[23,35,"pl-corl"],[35,36,"pl-s"],[40,41,"pl-s"],[63,64,"pl-s"],[64,65,"pl-s"],[65,85,"pl-corl"],[85,86,"pl-s"],[110,111,"pl-s"],[111,118,"pl-c1"],[118,119,"pl-s"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[1,6,"pl-ent"],[7,17,"pl-e"],[18,19,"pl-s"],[19,36,"pl-s"],[36,37,"pl-s"]],[[1,3,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,36,"pl-s"],[36,37,"pl-s"]],[[4,94,"pl-c1"]],[[4,41,"pl-c1"]],[[4,5,"pl-ent"],[7,9,"pl-ent"]],[[3,6,"pl-ent"],[8,9,"pl-ent"],[10,14,"pl-e"],[15,16,"pl-s"],[16,49,"pl-s"],[49,50,"pl-s"],[65,66,"pl-ent"],[71,72,"pl-ent"],[73,77,"pl-e"],[78,79,"pl-s"],[79,104,"pl-s"],[104,105,"pl-s"],[138,139,"pl-ent"],[142,145,"pl-ent"]],[[2,4,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,47,"pl-s"],[47,48,"pl-s"]],[[4,76,"pl-c1"]],[[4,32,"pl-c1"]],[[4,5,"pl-ent"],[7,9,"pl-ent"]],[[3,6,"pl-ent"],[37,40,"pl-ent"]],[[2,4,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,40,"pl-s"],[40,41,"pl-s"]],[[4,85,"pl-c1"]],[[4,30,"pl-c1"]],[[4,5,"pl-ent"],[7,9,"pl-ent"]],[[3,6,"pl-ent"],[18,23,"pl-c1"],[19,22,"pl-k"],[42,45,"pl-ent"]],[[2,4,"pl-ent"]],[[2,4,"pl-ent"]],[[2,7,"pl-ent"]],[],[[2,5,"pl-ent"]],[],[[1,4,"pl-ent"],[5,7,"pl-s"],[22,24,"pl-s"],[113,114,"pl-ent"],[115,119,"pl-e"],[120,121,"pl-s"],[121,157,"pl-s"],[157,158,"pl-s"],[169,170,"pl-ent"],[177,178,"pl-ent"],[179,183,"pl-e"],[184,185,"pl-s"],[185,210,"pl-s"],[210,211,"pl-s"],[229,230,"pl-ent"],[312,315,"pl-ent"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[1,4,"pl-ent"],[6,12,"pl-ent"],[22,27,"pl-c1"],[23,26,"pl-k"],[38,44,"pl-ent"],[47,50,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"],[18,28,"pl-e"],[29,30,"pl-s"],[30,51,"pl-s"],[51,52,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,36,"pl-s"],[36,37,"pl-s"],[38,43,"pl-e"],[44,45,"pl-s"],[45,55,"pl-s"],[55,56,"pl-s"],[58,61,"pl-ent"],[62,65,"pl-e"],[66,67,"pl-s"],[67,104,"pl-s"],[104,105,"pl-s"],[106,112,"pl-e"],[113,114,"pl-s"],[114,116,"pl-s"],[116,117,"pl-s"],[118,121,"pl-e"],[122,123,"pl-s"],[123,133,"pl-s"],[133,134,"pl-s"],[139,140,"pl-ent"],[141,159,"pl-c1"],[142,146,"pl-k"],[148,152,"pl-k"],[154,158,"pl-k"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,42,"pl-s"],[42,43,"pl-s"],[44,49,"pl-e"],[50,51,"pl-s"],[51,59,"pl-s"],[59,60,"pl-s"],[62,65,"pl-ent"],[66,69,"pl-e"],[70,71,"pl-s"],[71,106,"pl-s"],[106,107,"pl-s"],[108,114,"pl-e"],[115,116,"pl-s"],[116,118,"pl-s"],[118,119,"pl-s"],[120,123,"pl-e"],[124,125,"pl-s"],[125,133,"pl-s"],[133,134,"pl-s"],[139,140,"pl-ent"],[141,159,"pl-c1"],[142,146,"pl-k"],[148,152,"pl-k"],[154,158,"pl-k"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,43,"pl-s"],[43,44,"pl-s"],[45,50,"pl-e"],[51,52,"pl-s"],[52,70,"pl-s"],[70,71,"pl-s"],[73,80,"pl-ent"],[82,88,"pl-ent"],[89,94,"pl-e"],[95,96,"pl-s"],[96,124,"pl-s"],[124,125,"pl-s"],[126,132,"pl-e"],[133,134,"pl-s"],[134,174,"pl-s"],[174,175,"pl-s"],[179,182,"pl-ent"],[183,186,"pl-e"],[187,188,"pl-s"],[188,223,"pl-s"],[223,224,"pl-s"],[225,230,"pl-e"],[231,232,"pl-s"],[232,235,"pl-s"],[235,236,"pl-s"],[237,240,"pl-e"],[241,242,"pl-s"],[242,260,"pl-s"],[260,261,"pl-s"],[266,273,"pl-ent"],[276,277,"pl-ent"],[278,296,"pl-c1"],[279,283,"pl-k"],[285,289,"pl-k"],[291,295,"pl-k"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,41,"pl-s"],[41,42,"pl-s"],[43,48,"pl-e"],[49,50,"pl-s"],[50,61,"pl-s"],[61,62,"pl-s"],[64,71,"pl-ent"],[73,79,"pl-ent"],[80,85,"pl-e"],[86,87,"pl-s"],[87,116,"pl-s"],[116,117,"pl-s"],[118,124,"pl-e"],[125,126,"pl-s"],[126,174,"pl-s"],[174,175,"pl-s"],[179,182,"pl-ent"],[183,186,"pl-e"],[187,188,"pl-s"],[188,230,"pl-s"],[230,231,"pl-s"],[232,237,"pl-e"],[238,239,"pl-s"],[239,241,"pl-s"],[241,242,"pl-s"],[243,246,"pl-e"],[247,248,"pl-s"],[248,259,"pl-s"],[259,260,"pl-s"],[265,272,"pl-ent"],[275,276,"pl-ent"],[277,295,"pl-c1"],[278,282,"pl-k"],[284,288,"pl-k"],[290,294,"pl-k"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,41,"pl-s"],[41,42,"pl-s"],[43,48,"pl-e"],[49,50,"pl-s"],[50,73,"pl-s"],[73,74,"pl-s"],[76,83,"pl-ent"],[85,91,"pl-ent"],[92,97,"pl-e"],[98,99,"pl-s"],[99,127,"pl-s"],[127,128,"pl-s"],[129,135,"pl-e"],[136,137,"pl-s"],[137,186,"pl-s"],[186,187,"pl-s"],[191,194,"pl-ent"],[195,198,"pl-e"],[199,200,"pl-s"],[200,250,"pl-s"],[250,251,"pl-s"],[252,257,"pl-e"],[258,259,"pl-s"],[259,262,"pl-s"],[262,263,"pl-s"],[264,267,"pl-e"],[268,269,"pl-s"],[269,292,"pl-s"],[292,293,"pl-s"],[298,305,"pl-ent"],[308,309,"pl-ent"]],[[2,3,"pl-ent"]],[],[[1,4,"pl-ent"],[6,12,"pl-ent"],[29,35,"pl-ent"],[38,39,"pl-ent"],[40,44,"pl-e"],[45,46,"pl-s"],[46,131,"pl-s"],[90,95,"pl-c1"],[91,94,"pl-k"],[110,115,"pl-c1"],[111,114,"pl-k"],[131,132,"pl-s"],[146,147,"pl-ent"],[150,153,"pl-ent"]],[],[[1,4,"pl-ent"],[6,12,"pl-ent"],[34,40,"pl-ent"],[43,44,"pl-ent"],[45,49,"pl-e"],[50,51,"pl-s"],[51,84,"pl-s"],[84,85,"pl-s"],[99,100,"pl-ent"],[105,106,"pl-ent"],[107,111,"pl-e"],[112,113,"pl-s"],[113,142,"pl-s"],[142,143,"pl-s"],[144,155,"pl-s"],[145,155,"pl-corl"],[157,158,"pl-ent"],[163,164,"pl-ent"],[165,169,"pl-e"],[170,171,"pl-s"],[171,196,"pl-s"],[196,197,"pl-s"],[198,205,"pl-s"],[199,205,"pl-corl"],[207,208,"pl-ent"],[213,214,"pl-ent"],[215,219,"pl-e"],[220,221,"pl-s"],[221,253,"pl-s"],[253,254,"pl-s"],[255,269,"pl-s"],[256,269,"pl-corl"],[271,272,"pl-ent"],[277,278,"pl-ent"],[279,283,"pl-e"],[284,285,"pl-s"],[285,314,"pl-s"],[314,315,"pl-s"],[316,327,"pl-s"],[317,327,"pl-corl"],[329,330,"pl-ent"],[333,336,"pl-ent"]],[],[[1,4,"pl-ent"],[6,7,"pl-ent"],[8,12,"pl-e"],[13,14,"pl-s"],[14,50,"pl-s"],[50,51,"pl-s"],[53,59,"pl-ent"],[78,84,"pl-ent"],[87,88,"pl-ent"],[93,94,"pl-ent"],[95,99,"pl-e"],[100,101,"pl-s"],[101,112,"pl-s"],[112,113,"pl-s"],[129,130,"pl-ent"],[135,136,"pl-ent"],[137,141,"pl-e"],[142,143,"pl-s"],[143,156,"pl-s"],[156,157,"pl-s"],[179,180,"pl-ent"],[183,186,"pl-ent"]],[],[[2,5,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"],[19,20,"pl-ent"],[21,25,"pl-e"],[26,27,"pl-s"],[27,39,"pl-s"],[39,40,"pl-s"],[60,61,"pl-ent"],[64,65,"pl-ent"]],[],[[0,5,"pl-mh"],[2,5,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,68,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,55,"pl-ent"],[0,2,"pl-ent"]],[[0,0,"pl-ent"]],[[244,245,"pl-s"],[266,267,"pl-s"],[267,268,"pl-s"],[268,285,"pl-corl"],[285,286,"pl-s"]],[],[],[],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[33,34,"pl-ml"],[120,121,"pl-ml"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,52,"pl-s"],[52,53,"pl-s"]],[[4,13,"pl-c1"]],[[4,135,"pl-c1"]],[[4,141,"pl-c1"]],[[4,14,"pl-c1"]],[[4,5,"pl-ent"]],[[2,3,"pl-ent"]],[],[[0,14,"pl-mh"],[3,14,"pl-en"]],[],[[0,14,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-s"],[13,14,"pl-s"]],[[0,78,"pl-ent"],[0,2,"pl-ent"]],[[0,78,"pl-ent"],[0,2,"pl-ent"]],[[0,54,"pl-ent"],[0,2,"pl-ent"],[47,48,"pl-s"],[48,52,"pl-c1"],[52,53,"pl-s"]],[[0,0,"pl-ent"]],[[0,39,"pl-mh"],[4,39,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[0,35,"pl-mh"],[5,35,"pl-en"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[8,10,"pl-s"],[20,22,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[3,6,"pl-s"],[6,16,"pl-en"],[16,16,"pl-c1"]],[[0,17,"pl-c1"]],[[0,16,"pl-c1"]],[[0,19,"pl-c1"]],[[0,0,"pl-c1"],[3,6,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[3,6,"pl-s"],[6,16,"pl-en"],[16,16,"pl-c1"]],[[0,32,"pl-c1"]],[[0,0,"pl-c1"],[3,6,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[40,42,"pl-s"],[53,55,"pl-s"],[64,66,"pl-s"],[74,76,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[43,44,"pl-s"],[44,56,"pl-c1"],[56,57,"pl-s"],[73,74,"pl-s"],[74,81,"pl-c1"],[81,82,"pl-s"]],[],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[],[],[[0,1,"pl-ml"],[17,18,"pl-ml"],[40,41,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[14,15,"pl-s"],[15,44,"pl-c1"],[44,45,"pl-s"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[9,10,"pl-s"],[10,44,"pl-c1"],[44,45,"pl-s"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[10,11,"pl-ml"],[12,13,"pl-s"],[13,47,"pl-c1"],[47,48,"pl-s"],[49,50,"pl-ml"]],[[0,1,"pl-ml"],[6,7,"pl-ml"],[8,9,"pl-s"],[9,39,"pl-c1"],[39,40,"pl-s"],[41,42,"pl-ml"]],[],[[20,21,"pl-s"],[52,53,"pl-s"],[53,54,"pl-s"],[54,105,"pl-corl"],[105,106,"pl-s"]],[],[[32,33,"pl-s"],[33,41,"pl-c1"],[41,42,"pl-s"],[48,49,"pl-s"],[49,52,"pl-c1"],[52,53,"pl-s"]],[],[[149,150,"pl-s"],[150,157,"pl-c1"],[157,158,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[36,37,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[23,24,"pl-s"],[24,31,"pl-c1"],[31,32,"pl-s"],[49,50,"pl-s"],[50,54,"pl-c1"],[54,55,"pl-s"],[57,58,"pl-s"],[58,65,"pl-c1"],[65,66,"pl-s"],[71,72,"pl-s"],[72,77,"pl-c1"],[77,78,"pl-s"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[94,95,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[42,43,"pl-s"],[43,55,"pl-c1"],[55,56,"pl-s"],[132,133,"pl-ml"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[17,22,"pl-k"]],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[32,50,"pl-s"],[32,33,"pl-pds"],[49,50,"pl-pds"]],[],[],[[0,3,"pl-s"]],[],[[11,12,"pl-s"],[12,61,"pl-c1"],[61,62,"pl-s"],[64,65,"pl-s"],[65,76,"pl-c1"],[76,77,"pl-s"],[102,103,"pl-s"],[103,116,"pl-c1"],[116,117,"pl-s"]],[],[[45,46,"pl-s"],[46,52,"pl-c1"],[52,53,"pl-s"],[55,56,"pl-s"],[56,67,"pl-c1"],[67,68,"pl-s"],[70,71,"pl-s"],[71,77,"pl-c1"],[77,78,"pl-s"],[80,81,"pl-s"],[81,89,"pl-c1"],[89,90,"pl-s"],[92,93,"pl-s"],[93,102,"pl-c1"],[102,103,"pl-s"],[105,106,"pl-s"],[106,113,"pl-c1"],[113,114,"pl-s"],[116,117,"pl-s"],[117,121,"pl-c1"],[121,122,"pl-s"],[124,125,"pl-s"],[125,128,"pl-c1"],[128,129,"pl-s"],[131,132,"pl-s"],[132,138,"pl-c1"],[138,139,"pl-s"],[145,146,"pl-s"],[146,154,"pl-c1"],[154,155,"pl-s"],[198,199,"pl-s"],[199,223,"pl-c1"],[223,224,"pl-s"]],[],[[0,36,"pl-mh"],[4,36,"pl-en"]],[],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[24,26,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[35,37,"pl-s"],[46,47,"pl-s"],[69,70,"pl-s"],[70,71,"pl-s"],[71,91,"pl-corl"],[91,92,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[29,31,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[10,12,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[10,12,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[10,12,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[10,12,"pl-s"]],[],[[0,2,"pl-s"],[31,33,"pl-s"]],[],[[86,87,"pl-s"],[108,109,"pl-s"],[109,110,"pl-s"],[110,131,"pl-corl"],[131,132,"pl-s"]],[],[[0,2,"pl-s"],[18,20,"pl-s"],[36,37,"pl-s"],[68,69,"pl-s"],[69,70,"pl-s"],[70,141,"pl-corl"],[141,142,"pl-s"],[151,152,"pl-s"],[152,164,"pl-c1"],[164,165,"pl-s"]],[],[[0,23,"pl-mh"],[4,23,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,55,"pl-c1"]],[[0,23,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[],[[24,25,"pl-s"],[25,43,"pl-c1"],[43,44,"pl-s"],[235,236,"pl-s"],[236,243,"pl-c1"],[243,244,"pl-s"]],[],[[38,39,"pl-s"],[39,44,"pl-c1"],[44,45,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,2,"pl-c1"]],[[9,10,"pl-k"]],[[19,20,"pl-k"]],[[23,24,"pl-k"],[45,70,"pl-c"],[45,46,"pl-c"]],[[0,3,"pl-s"]],[],[[11,12,"pl-s"],[12,24,"pl-c1"],[24,25,"pl-s"],[118,119,"pl-s"],[119,146,"pl-c1"],[146,147,"pl-s"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[74,80,"pl-ent"],[83,90,"pl-ent"]],[],[[21,22,"pl-s"],[22,45,"pl-c1"],[45,46,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,26,"pl-ent"]],[[4,9,"pl-ent"]],[[6,14,"pl-ent"]],[[8,16,"pl-ent"],[18,26,"pl-s"],[18,19,"pl-pds"],[25,26,"pl-pds"]],[[8,14,"pl-ent"],[16,30,"pl-s"],[16,17,"pl-pds"],[29,30,"pl-pds"]],[],[],[],[[2,18,"pl-ent"]],[[4,13,"pl-ent"],[15,19,"pl-c1"]],[],[],[[0,3,"pl-s"]],[],[[42,43,"pl-s"],[43,50,"pl-c1"],[50,51,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[81,87,"pl-ent"],[90,97,"pl-ent"]],[],[],[],[[0,1,"pl-v"],[22,23,"pl-s"],[23,35,"pl-c1"],[35,36,"pl-s"]],[[0,1,"pl-v"],[40,41,"pl-s"],[41,48,"pl-c1"],[48,49,"pl-s"]],[[0,1,"pl-v"],[15,16,"pl-s"],[16,29,"pl-c1"],[29,30,"pl-s"]],[],[[115,116,"pl-s"],[116,123,"pl-c1"],[123,124,"pl-s"],[361,362,"pl-s"],[362,375,"pl-c1"],[375,376,"pl-s"]],[],[[57,58,"pl-s"],[58,71,"pl-c1"],[71,72,"pl-s"],[131,132,"pl-s"],[132,136,"pl-c1"],[136,137,"pl-s"]],[],[[110,111,"pl-s"],[111,145,"pl-c1"],[145,146,"pl-s"],[157,158,"pl-s"],[158,184,"pl-c1"],[184,185,"pl-s"],[190,191,"pl-s"],[191,217,"pl-c1"],[217,218,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,21,"pl-mh"],[4,21,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[],[],[[0,3,"pl-s"]],[],[[56,57,"pl-s"],[57,93,"pl-c1"],[93,94,"pl-s"],[107,108,"pl-s"],[108,132,"pl-c1"],[132,133,"pl-s"],[187,188,"pl-s"],[188,198,"pl-c1"],[198,199,"pl-s"],[228,229,"pl-s"],[229,233,"pl-c1"],[233,234,"pl-s"],[236,237,"pl-s"],[237,244,"pl-c1"],[244,245,"pl-s"],[251,252,"pl-s"],[252,257,"pl-c1"],[257,258,"pl-s"],[388,389,"pl-s"],[389,403,"pl-c1"],[403,404,"pl-s"]],[],[[10,11,"pl-s"],[11,39,"pl-c1"],[39,40,"pl-s"],[151,152,"pl-s"],[152,160,"pl-c1"],[160,161,"pl-s"],[316,317,"pl-s"],[317,337,"pl-c1"],[337,338,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,2,"pl-c1"]],[],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[[78,79,"pl-s"],[79,88,"pl-c1"],[88,89,"pl-s"]],[],[[103,104,"pl-s"],[104,113,"pl-c1"],[113,114,"pl-s"],[156,157,"pl-s"],[157,164,"pl-c1"],[164,165,"pl-s"]],[],[[78,79,"pl-s"],[103,104,"pl-s"],[104,105,"pl-s"],[105,135,"pl-corl"],[135,136,"pl-s"],[146,147,"pl-s"],[166,167,"pl-s"],[167,168,"pl-s"],[168,191,"pl-corl"],[191,192,"pl-s"]],[],[[0,28,"pl-mh"],[4,28,"pl-en"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[120,126,"pl-ent"],[129,136,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,2,"pl-c1"]],[[0,3,"pl-s"]],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[29,30,"pl-ml"],[37,38,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[11,12,"pl-s"],[12,58,"pl-c1"],[58,59,"pl-s"],[60,61,"pl-ml"],[76,77,"pl-s"],[77,85,"pl-c1"],[85,86,"pl-s"],[95,96,"pl-ml"]],[[0,1,"pl-ml"],[11,12,"pl-ml"],[13,14,"pl-s"],[14,115,"pl-c1"],[115,116,"pl-s"],[117,118,"pl-ml"],[169,170,"pl-ml"]],[[0,1,"pl-ml"],[13,14,"pl-ml"],[15,16,"pl-s"],[16,62,"pl-c1"],[62,63,"pl-s"],[64,65,"pl-ml"],[80,81,"pl-s"],[81,89,"pl-c1"],[89,90,"pl-s"],[98,99,"pl-ml"]],[[0,1,"pl-ml"],[6,7,"pl-ml"],[8,9,"pl-s"],[9,52,"pl-c1"],[52,53,"pl-s"],[54,55,"pl-ml"],[70,71,"pl-s"],[71,76,"pl-c1"],[76,77,"pl-s"],[86,87,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[16,17,"pl-s"],[17,68,"pl-c1"],[68,69,"pl-s"],[70,71,"pl-ml"],[80,81,"pl-s"],[98,99,"pl-s"],[99,100,"pl-s"],[100,125,"pl-corl"],[125,126,"pl-s"],[127,128,"pl-ml"]],[[0,1,"pl-ml"],[11,12,"pl-ml"],[13,14,"pl-s"],[14,58,"pl-c1"],[58,59,"pl-s"],[60,61,"pl-ml"],[70,71,"pl-s"],[81,82,"pl-s"],[82,83,"pl-s"],[83,101,"pl-corl"],[101,102,"pl-s"],[103,104,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[11,12,"pl-s"],[12,58,"pl-c1"],[58,59,"pl-s"],[60,61,"pl-ml"],[70,71,"pl-s"],[89,90,"pl-s"],[90,91,"pl-s"],[91,111,"pl-corl"],[111,112,"pl-s"],[113,114,"pl-ml"]],[[0,1,"pl-ml"],[11,12,"pl-ml"],[13,14,"pl-s"],[14,62,"pl-c1"],[62,63,"pl-s"],[64,65,"pl-ml"],[97,98,"pl-ml"]],[[0,1,"pl-ml"],[16,17,"pl-ml"],[18,19,"pl-s"],[19,63,"pl-c1"],[63,64,"pl-s"],[65,66,"pl-ml"],[81,82,"pl-s"],[82,93,"pl-c1"],[93,94,"pl-s"],[105,106,"pl-s"],[119,120,"pl-s"],[120,121,"pl-s"],[121,154,"pl-corl"],[154,155,"pl-s"],[156,157,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[14,15,"pl-s"],[15,64,"pl-c1"],[64,65,"pl-s"],[66,67,"pl-ml"],[82,83,"pl-s"],[83,94,"pl-c1"],[94,95,"pl-s"],[104,105,"pl-ml"]],[[0,1,"pl-ml"],[10,11,"pl-ml"],[12,13,"pl-s"],[13,60,"pl-c1"],[60,61,"pl-s"],[62,63,"pl-ml"],[78,79,"pl-s"],[79,88,"pl-c1"],[88,89,"pl-s"],[98,99,"pl-ml"]],[],[[63,64,"pl-s"],[64,95,"pl-c1"],[95,96,"pl-s"],[129,130,"pl-s"],[130,146,"pl-c1"],[146,147,"pl-s"],[170,171,"pl-s"],[171,176,"pl-c1"],[176,177,"pl-s"],[179,180,"pl-s"],[180,184,"pl-c1"],[184,185,"pl-s"],[187,188,"pl-s"],[188,204,"pl-c1"],[204,205,"pl-s"],[207,208,"pl-s"],[208,218,"pl-c1"],[218,219,"pl-s"],[225,226,"pl-s"],[226,235,"pl-c1"],[235,236,"pl-s"],[250,251,"pl-s"],[251,272,"pl-c1"],[272,273,"pl-s"],[282,283,"pl-s"],[283,299,"pl-c1"],[299,300,"pl-s"]],[],[[51,52,"pl-s"],[75,76,"pl-s"],[76,77,"pl-s"],[77,108,"pl-corl"],[108,109,"pl-s"]],[],[[40,41,"pl-s"],[41,64,"pl-c1"],[64,65,"pl-s"],[150,151,"pl-s"],[151,160,"pl-c1"],[160,161,"pl-s"],[167,168,"pl-s"],[168,176,"pl-c1"],[176,177,"pl-s"]],[],[[76,77,"pl-s"],[93,94,"pl-s"],[94,95,"pl-s"],[95,112,"pl-corl"],[112,113,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,27,"pl-mh"],[3,27,"pl-en"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[59,65,"pl-ent"],[68,75,"pl-ent"]],[],[[0,31,"pl-mh"],[4,31,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,47,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[36,37,"pl-s"],[37,50,"pl-c1"],[50,51,"pl-s"]],[],[[55,56,"pl-s"],[56,86,"pl-c1"],[86,87,"pl-s"],[92,93,"pl-s"],[93,121,"pl-c1"],[121,122,"pl-s"],[127,128,"pl-s"],[128,142,"pl-c1"],[142,143,"pl-s"],[256,257,"pl-s"],[257,268,"pl-c1"],[268,269,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[],[[30,31,"pl-s"],[31,45,"pl-c1"],[45,46,"pl-s"],[50,51,"pl-s"],[51,61,"pl-c1"],[61,62,"pl-s"]],[],[[11,12,"pl-s"],[12,32,"pl-c1"],[32,33,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[54,60,"pl-ent"],[63,70,"pl-ent"]],[],[[0,35,"pl-mh"],[4,35,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[28,46,"pl-s"],[28,29,"pl-pds"],[45,46,"pl-pds"]],[[0,3,"pl-s"]],[],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,13,"pl-c"],[0,1,"pl-c"]],[[10,11,"pl-k"],[15,16,"pl-k"]],[],[[0,48,"pl-c"],[0,1,"pl-c"]],[[9,10,"pl-k"]],[[19,20,"pl-k"]],[[23,24,"pl-k"],[46,63,"pl-c"],[46,47,"pl-c"]],[],[[0,73,"pl-c"],[0,1,"pl-c"]],[[0,79,"pl-c"],[0,1,"pl-c"]],[[9,10,"pl-k"]],[[21,22,"pl-k"],[23,24,"pl-k"]],[[26,27,"pl-k"]],[],[[0,67,"pl-c"],[0,1,"pl-c"]],[[9,10,"pl-k"]],[[12,13,"pl-k"],[17,18,"pl-k"]],[[0,3,"pl-s"]],[],[[22,23,"pl-s"],[23,44,"pl-c1"],[44,45,"pl-s"],[121,122,"pl-s"],[122,126,"pl-c1"],[126,127,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[62,68,"pl-ent"],[71,78,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,2,"pl-c1"]],[],[],[],[[0,3,"pl-s"]],[],[[47,48,"pl-s"],[48,54,"pl-c1"],[54,55,"pl-s"],[177,178,"pl-s"],[178,190,"pl-c1"],[190,191,"pl-s"],[195,196,"pl-s"],[196,208,"pl-c1"],[208,209,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[46,52,"pl-ent"],[55,62,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,2,"pl-c1"]],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,45,"pl-c1"]],[[0,6,"pl-c1"]],[[0,28,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[53,54,"pl-s"],[54,69,"pl-c1"],[69,70,"pl-s"]],[],[[79,80,"pl-s"],[80,97,"pl-c1"],[97,98,"pl-s"],[123,124,"pl-s"],[124,145,"pl-c1"],[145,146,"pl-s"]],[],[[0,18,"pl-mh"],[5,18,"pl-en"]],[],[[25,26,"pl-s"],[26,42,"pl-c1"],[42,43,"pl-s"],[49,50,"pl-s"],[50,73,"pl-c1"],[73,74,"pl-s"],[78,79,"pl-s"],[79,105,"pl-c1"],[105,106,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[37,38,"pl-s"],[38,48,"pl-c1"],[48,49,"pl-s"]],[[16,17,"pl-s"],[17,40,"pl-c1"],[40,41,"pl-s"]],[],[],[],[[25,26,"pl-s"],[26,41,"pl-c1"],[41,42,"pl-s"],[73,74,"pl-s"],[74,87,"pl-c1"],[87,88,"pl-s"],[134,135,"pl-s"],[135,151,"pl-c1"],[151,152,"pl-s"],[178,179,"pl-s"],[179,192,"pl-c1"],[192,193,"pl-s"]],[],[[36,37,"pl-s"],[37,58,"pl-c1"],[58,59,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,79,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,19,"pl-mh"],[5,19,"pl-en"]],[],[],[],[[18,19,"pl-s"],[19,23,"pl-c1"],[23,24,"pl-s"],[133,134,"pl-s"],[134,148,"pl-c1"],[148,149,"pl-s"],[219,220,"pl-s"],[220,248,"pl-c1"],[248,249,"pl-s"],[272,273,"pl-s"],[273,282,"pl-c1"],[282,283,"pl-s"]],[],[[41,42,"pl-s"],[42,57,"pl-c1"],[57,58,"pl-s"],[220,221,"pl-s"],[249,250,"pl-s"],[250,251,"pl-s"],[251,279,"pl-corl"],[279,280,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,6,"pl-k"],[25,42,"pl-s"],[25,26,"pl-pds"],[41,42,"pl-pds"]],[[0,3,"pl-s"]],[],[[116,117,"pl-s"],[117,134,"pl-c1"],[134,135,"pl-s"]],[],[[0,2,"pl-s"],[12,14,"pl-s"],[23,24,"pl-s"],[24,35,"pl-c1"],[35,36,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[64,70,"pl-ent"],[73,80,"pl-ent"]],[],[[0,1,"pl-s"],[1,8,"pl-c1"],[8,9,"pl-s"],[23,25,"pl-s"],[28,30,"pl-s"]],[],[[7,8,"pl-s"],[8,19,"pl-c1"],[19,20,"pl-s"],[22,23,"pl-s"],[23,37,"pl-c1"],[37,38,"pl-s"],[40,41,"pl-s"],[41,55,"pl-c1"],[55,56,"pl-s"],[58,59,"pl-s"],[59,74,"pl-c1"],[74,75,"pl-s"],[81,82,"pl-s"],[82,97,"pl-c1"],[97,98,"pl-s"],[126,127,"pl-s"],[127,139,"pl-c1"],[139,140,"pl-s"],[195,196,"pl-s"],[227,228,"pl-s"],[228,229,"pl-s"],[229,280,"pl-corl"],[280,281,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,34,"pl-c1"],[34,35,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,27,"pl-c1"],[27,28,"pl-s"]],[],[[8,9,"pl-s"],[9,21,"pl-c1"],[21,22,"pl-s"],[30,31,"pl-s"],[31,38,"pl-c1"],[38,39,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[46,52,"pl-ent"],[55,62,"pl-ent"]],[],[[0,25,"pl-mh"],[4,25,"pl-en"]],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[],[],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[[61,62,"pl-s"],[85,86,"pl-s"],[86,87,"pl-s"],[87,157,"pl-corl"],[157,158,"pl-s"],[267,268,"pl-s"],[268,280,"pl-c1"],[280,281,"pl-s"]],[],[],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[2,9,"pl-ent"]],[],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[],[],[[0,1,"pl-ml"],[21,22,"pl-ml"],[34,35,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,56,"pl-c1"],[56,57,"pl-s"],[64,65,"pl-s"],[65,77,"pl-c1"],[77,78,"pl-s"],[79,80,"pl-ml"]],[[0,1,"pl-ml"],[15,16,"pl-ml"],[60,61,"pl-s"],[61,73,"pl-c1"],[73,74,"pl-s"],[75,76,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,36,"pl-c1"],[36,37,"pl-s"],[65,66,"pl-ml"]],[[0,1,"pl-ml"],[20,21,"pl-ml"],[22,23,"pl-s"],[23,33,"pl-c1"],[33,34,"pl-s"],[35,36,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[24,25,"pl-s"],[25,40,"pl-c1"],[40,41,"pl-s"],[42,43,"pl-ml"]],[[0,1,"pl-ml"],[28,29,"pl-ml"],[30,31,"pl-s"],[31,46,"pl-c1"],[46,47,"pl-s"],[48,49,"pl-ml"]],[[0,1,"pl-ml"],[24,25,"pl-ml"],[26,27,"pl-s"],[27,40,"pl-c1"],[40,41,"pl-s"],[45,46,"pl-s"],[46,57,"pl-c1"],[57,58,"pl-s"],[59,60,"pl-ml"]],[[0,1,"pl-ml"],[17,18,"pl-ml"],[19,20,"pl-s"],[20,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"]],[[0,1,"pl-ml"],[24,25,"pl-ml"],[26,27,"pl-s"],[27,41,"pl-c1"],[41,42,"pl-s"],[81,82,"pl-s"],[82,107,"pl-c1"],[107,108,"pl-s"],[109,110,"pl-ml"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[54,60,"pl-ent"],[63,70,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,30,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,26,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[44,50,"pl-ent"],[53,60,"pl-ent"]],[],[],[],[[0,1,"pl-ml"],[15,16,"pl-ml"],[34,35,"pl-ml"],[47,48,"pl-ml"]],[[0,1,"pl-ml"],[15,16,"pl-ml"],[33,34,"pl-ml"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,44,"pl-c1"],[44,45,"pl-s"],[46,47,"pl-ml"],[56,57,"pl-ml"]],[[0,1,"pl-ml"],[29,30,"pl-ml"],[31,32,"pl-s"],[32,41,"pl-c1"],[41,42,"pl-s"],[61,62,"pl-ml"],[73,74,"pl-ml"]],[[0,1,"pl-ml"],[30,31,"pl-ml"],[32,33,"pl-s"],[33,45,"pl-c1"],[45,46,"pl-s"],[53,54,"pl-ml"],[65,66,"pl-ml"]],[[0,1,"pl-ml"],[27,28,"pl-ml"],[29,30,"pl-s"],[30,42,"pl-c1"],[42,43,"pl-s"],[44,45,"pl-ml"],[60,61,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[24,25,"pl-s"],[25,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"],[60,61,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,37,"pl-c1"],[37,38,"pl-s"],[45,46,"pl-ml"],[58,59,"pl-ml"]],[[0,1,"pl-ml"],[32,33,"pl-ml"],[34,35,"pl-s"],[35,49,"pl-c1"],[49,50,"pl-s"],[51,52,"pl-ml"],[71,72,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[21,22,"pl-s"],[22,37,"pl-c1"],[37,38,"pl-s"],[39,40,"pl-ml"],[58,59,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,38,"pl-c1"],[38,39,"pl-s"],[40,41,"pl-ml"],[54,55,"pl-ml"]],[[0,1,"pl-ml"],[17,18,"pl-ml"],[19,20,"pl-s"],[20,30,"pl-c1"],[30,31,"pl-s"],[32,33,"pl-ml"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,38,"pl-c1"],[38,39,"pl-s"],[40,41,"pl-ml"],[58,59,"pl-ml"]],[[0,1,"pl-ml"],[17,18,"pl-ml"],[19,20,"pl-s"],[28,29,"pl-s"],[29,44,"pl-c1"],[44,45,"pl-s"],[55,56,"pl-s"],[57,58,"pl-ml"],[75,76,"pl-ml"]],[[0,1,"pl-ml"],[36,37,"pl-ml"],[38,39,"pl-s"],[47,48,"pl-s"],[48,67,"pl-c1"],[67,68,"pl-s"],[78,79,"pl-s"],[80,81,"pl-ml"],[102,103,"pl-ml"]],[[0,1,"pl-ml"],[25,26,"pl-ml"],[27,28,"pl-s"],[36,37,"pl-s"],[37,59,"pl-c1"],[59,60,"pl-s"],[70,71,"pl-s"],[72,73,"pl-ml"],[97,98,"pl-ml"]],[[0,1,"pl-ml"],[25,26,"pl-ml"],[27,28,"pl-s"],[44,45,"pl-s"],[46,47,"pl-ml"],[66,67,"pl-ml"]],[[0,1,"pl-ml"],[31,32,"pl-ml"],[33,34,"pl-s"],[34,46,"pl-c1"],[46,47,"pl-s"],[56,57,"pl-s"],[57,69,"pl-c1"],[69,70,"pl-s"],[77,78,"pl-ml"],[92,93,"pl-ml"]],[],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[35,41,"pl-ent"],[44,51,"pl-ent"]],[],[[119,120,"pl-s"],[120,124,"pl-c1"],[124,125,"pl-s"],[130,131,"pl-s"],[131,136,"pl-c1"],[136,137,"pl-s"],[146,147,"pl-s"],[147,168,"pl-c1"],[168,169,"pl-s"]],[],[[0,2,"pl-s"],[25,27,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,46,"pl-c1"]],[[0,89,"pl-c1"]],[[0,85,"pl-c1"]],[[0,79,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,2,"pl-s"],[15,17,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,99,"pl-c1"]],[[0,86,"pl-c1"]],[[0,81,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,2,"pl-s"],[27,29,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,86,"pl-c1"]],[[0,85,"pl-c1"]],[[0,69,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,42,"pl-mh"],[3,42,"pl-en"]],[],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,6,"pl-k"]],[[0,6,"pl-k"]],[],[[0,3,"pl-s"]],[],[[164,165,"pl-s"],[165,171,"pl-c1"],[171,172,"pl-s"],[213,214,"pl-s"],[239,240,"pl-s"],[240,241,"pl-s"],[241,299,"pl-corl"],[299,300,"pl-s"],[305,306,"pl-s"],[339,340,"pl-s"],[340,341,"pl-s"],[341,400,"pl-corl"],[400,401,"pl-s"]],[],[[127,128,"pl-s"],[131,132,"pl-s"],[132,133,"pl-s"],[133,163,"pl-corl"],[163,164,"pl-s"],[356,357,"pl-s"],[357,369,"pl-c1"],[369,370,"pl-s"]],[],[[0,41,"pl-mh"],[4,41,"pl-en"]],[],[[125,126,"pl-s"],[144,145,"pl-s"],[145,146,"pl-s"],[146,178,"pl-corl"],[178,179,"pl-s"],[297,298,"pl-s"],[298,320,"pl-c1"],[320,321,"pl-s"]],[],[[1,6,"pl-ent"],[7,17,"pl-e"],[18,19,"pl-s"],[19,40,"pl-s"],[40,41,"pl-s"],[42,47,"pl-e"],[48,49,"pl-s"],[49,53,"pl-s"],[53,54,"pl-s"]],[[1,3,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,41,"pl-s"],[41,42,"pl-s"]],[[4,220,"pl-c1"]],[[4,40,"pl-c1"]],[[4,5,"pl-ent"],[7,9,"pl-ent"]],[[3,6,"pl-ent"],[37,40,"pl-ent"]],[[2,4,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,34,"pl-s"],[34,35,"pl-s"]],[[4,212,"pl-c1"]],[[4,34,"pl-c1"]],[[4,5,"pl-ent"],[7,9,"pl-ent"]],[[3,6,"pl-ent"],[68,71,"pl-ent"]],[[2,4,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,26,"pl-s"],[26,27,"pl-s"]],[[4,94,"pl-c1"]],[[4,46,"pl-c1"]],[[4,5,"pl-ent"],[7,9,"pl-ent"]],[[3,6,"pl-ent"],[71,74,"pl-ent"]],[[2,4,"pl-ent"]],[[2,4,"pl-ent"]],[[2,7,"pl-ent"]],[],[[41,42,"pl-ent"],[43,47,"pl-e"],[48,49,"pl-s"],[49,118,"pl-s"],[118,119,"pl-s"],[145,146,"pl-ent"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[],[[0,3,"pl-s"]],[],[[34,35,"pl-s"],[35,55,"pl-c1"],[55,56,"pl-s"],[74,75,"pl-s"],[75,93,"pl-c1"],[93,94,"pl-s"],[129,130,"pl-s"],[130,145,"pl-c1"],[145,146,"pl-s"],[230,231,"pl-s"],[231,250,"pl-c1"],[250,251,"pl-s"],[287,288,"pl-s"],[288,312,"pl-c1"],[312,313,"pl-s"],[579,580,"pl-s"],[580,591,"pl-c1"],[591,592,"pl-s"]],[],[[0,26,"pl-mh"],[4,26,"pl-en"]],[],[[0,1,"pl-s"],[1,8,"pl-c1"],[8,9,"pl-s"],[113,114,"pl-s"],[114,142,"pl-c1"],[142,143,"pl-s"],[266,267,"pl-s"],[267,279,"pl-c1"],[279,280,"pl-s"],[349,350,"pl-s"],[350,362,"pl-c1"],[362,363,"pl-s"],[395,396,"pl-s"],[396,408,"pl-c1"],[408,409,"pl-s"],[440,441,"pl-s"],[441,454,"pl-c1"],[454,455,"pl-s"],[457,458,"pl-s"],[458,470,"pl-c1"],[470,471,"pl-s"],[473,474,"pl-s"],[474,486,"pl-c1"],[486,487,"pl-s"],[489,490,"pl-s"],[490,504,"pl-c1"],[504,505,"pl-s"],[532,533,"pl-s"],[533,546,"pl-c1"],[546,547,"pl-s"],[579,580,"pl-s"],[580,588,"pl-c1"],[588,589,"pl-s"],[591,592,"pl-s"],[592,600,"pl-c1"],[600,601,"pl-s"],[607,608,"pl-s"],[608,618,"pl-c1"],[618,619,"pl-s"],[621,622,"pl-s"],[622,630,"pl-c1"],[630,631,"pl-s"]],[],[[4,5,"pl-s"],[5,20,"pl-c1"],[20,21,"pl-s"],[166,167,"pl-s"],[167,186,"pl-c1"],[186,187,"pl-s"],[193,194,"pl-s"],[194,200,"pl-c1"],[200,201,"pl-s"],[206,207,"pl-s"],[207,220,"pl-c1"],[220,221,"pl-s"],[232,233,"pl-s"],[233,255,"pl-c1"],[255,256,"pl-s"],[282,283,"pl-s"],[283,298,"pl-c1"],[298,299,"pl-s"],[327,328,"pl-s"],[328,339,"pl-c1"],[339,340,"pl-s"],[373,374,"pl-s"],[374,385,"pl-c1"],[385,386,"pl-s"],[417,418,"pl-s"],[418,438,"pl-c1"],[438,439,"pl-s"],[457,458,"pl-s"],[458,472,"pl-c1"],[472,473,"pl-s"],[761,762,"pl-s"],[762,766,"pl-c1"],[766,767,"pl-s"],[777,778,"pl-s"],[778,779,"pl-s"],[779,790,"pl-c1"],[790,791,"pl-s"],[797,798,"pl-s"],[798,799,"pl-s"],[799,826,"pl-corl"],[826,827,"pl-s"]],[],[[0,1,"pl-s"],[1,5,"pl-c1"],[5,6,"pl-s"],[71,72,"pl-s"],[72,77,"pl-c1"],[77,78,"pl-s"],[93,94,"pl-s"],[94,120,"pl-c1"],[120,121,"pl-s"],[126,127,"pl-s"],[127,142,"pl-c1"],[142,143,"pl-s"],[168,169,"pl-s"],[169,189,"pl-c1"],[189,190,"pl-s"]],[],[[0,13,"pl-mh"],[3,13,"pl-en"]],[],[[17,19,"pl-s"],[24,26,"pl-s"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"],[56,57,"pl-s"],[57,67,"pl-c1"],[67,68,"pl-s"]],[],[[14,15,"pl-s"],[27,28,"pl-s"],[28,29,"pl-s"],[29,41,"pl-corl"],[41,42,"pl-s"],[86,87,"pl-s"],[101,102,"pl-s"],[102,103,"pl-s"],[103,117,"pl-corl"],[117,118,"pl-s"]],[],[[0,57,"pl-mh"],[4,57,"pl-en"]],[],[[91,92,"pl-s"],[92,98,"pl-c1"],[98,99,"pl-s"],[155,156,"pl-s"],[192,193,"pl-s"],[193,194,"pl-s"],[194,230,"pl-corl"],[230,231,"pl-s"]],[],[[0,16,"pl-mh"],[3,16,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,4,"pl-c1"]],[[0,63,"pl-c1"]],[[0,63,"pl-c1"]],[[0,57,"pl-c1"]],[[0,60,"pl-c1"]],[[0,58,"pl-c1"]],[[0,72,"pl-c1"]],[[0,56,"pl-c1"]],[[0,69,"pl-c1"]],[[0,67,"pl-c1"]],[[0,53,"pl-c1"]],[[0,72,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[46,52,"pl-ent"],[55,62,"pl-ent"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,4,"pl-c1"]],[[0,56,"pl-c1"]],[[0,65,"pl-c1"]],[[0,77,"pl-c1"]],[[0,1,"pl-c1"]],[[0,63,"pl-c1"]],[[0,62,"pl-c1"]],[[0,54,"pl-c1"]],[[0,54,"pl-c1"]],[[0,58,"pl-c1"]],[[0,53,"pl-c1"]],[[0,31,"pl-c1"]],[[0,53,"pl-c1"]],[[0,48,"pl-c1"]],[[0,49,"pl-c1"]],[[0,55,"pl-c1"]],[[0,62,"pl-c1"]],[[0,56,"pl-c1"]],[[0,52,"pl-c1"]],[[0,46,"pl-c1"]],[[0,58,"pl-c1"]],[[0,56,"pl-c1"]],[[0,45,"pl-c1"]],[[0,56,"pl-c1"]],[[0,49,"pl-c1"]],[[0,55,"pl-c1"]],[[0,66,"pl-c1"]],[[0,59,"pl-c1"]],[[0,63,"pl-c1"]],[[0,61,"pl-c1"]],[[0,61,"pl-c1"]],[[0,67,"pl-c1"]],[[0,47,"pl-c1"]],[[0,60,"pl-c1"]],[[0,64,"pl-c1"]],[[0,91,"pl-c1"]],[[0,1,"pl-c1"]],[[0,65,"pl-c1"]],[[0,61,"pl-c1"]],[[0,85,"pl-c1"]],[[0,69,"pl-c1"]],[[0,61,"pl-c1"]],[[0,93,"pl-c1"]],[[0,99,"pl-c1"]],[[0,93,"pl-c1"]],[[0,97,"pl-c1"]],[[0,90,"pl-c1"]],[[0,85,"pl-c1"]],[[0,76,"pl-c1"]],[[0,85,"pl-c1"]],[[0,82,"pl-c1"]],[[0,84,"pl-c1"]],[[0,53,"pl-c1"]],[[0,56,"pl-c1"]],[[0,83,"pl-c1"]],[[0,78,"pl-c1"]],[[0,93,"pl-c1"]],[[0,66,"pl-c1"]],[[0,74,"pl-c1"]],[[0,83,"pl-c1"]],[[0,78,"pl-c1"]],[[0,68,"pl-c1"]],[[0,68,"pl-c1"]],[[0,57,"pl-c1"]],[[0,63,"pl-c1"]],[[0,67,"pl-c1"]],[[0,69,"pl-c1"]],[[0,58,"pl-c1"]],[[0,64,"pl-c1"]],[[0,70,"pl-c1"]],[[0,64,"pl-c1"]],[[0,59,"pl-c1"]],[[0,54,"pl-c1"]],[[0,49,"pl-c1"]],[[0,58,"pl-c1"]],[[0,65,"pl-c1"]],[[0,63,"pl-c1"]],[[0,58,"pl-c1"]],[[0,53,"pl-c1"]],[[0,62,"pl-c1"]],[[0,69,"pl-c1"]],[[0,78,"pl-c1"]],[[0,59,"pl-c1"]],[[0,60,"pl-c1"]],[[0,70,"pl-c1"]],[[0,77,"pl-c1"]],[[0,86,"pl-c1"]],[[0,82,"pl-c1"]],[[0,77,"pl-c1"]],[[0,93,"pl-c1"]],[[0,83,"pl-c1"]],[[0,86,"pl-c1"]],[[0,91,"pl-c1"]],[[0,89,"pl-c1"]],[[0,84,"pl-c1"]],[[0,79,"pl-c1"]],[[0,69,"pl-c1"]],[[0,75,"pl-c1"]],[[0,71,"pl-c1"]],[[0,80,"pl-c1"]],[[0,72,"pl-c1"]],[[0,97,"pl-c1"]],[[0,81,"pl-c1"]],[[0,82,"pl-c1"]],[[0,82,"pl-c1"]],[[0,113,"pl-c1"]],[[0,93,"pl-c1"]],[[0,87,"pl-c1"]],[[0,92,"pl-c1"]],[[0,1,"pl-c1"]],[[0,76,"pl-c1"]],[[0,61,"pl-c1"]],[[0,59,"pl-c1"]],[[0,59,"pl-c1"]],[[0,65,"pl-c1"]],[[0,63,"pl-c1"]],[[0,84,"pl-c1"]],[[0,80,"pl-c1"]],[[0,84,"pl-c1"]],[[0,67,"pl-c1"]],[[0,57,"pl-c1"]],[[0,56,"pl-c1"]],[[0,61,"pl-c1"]],[[0,78,"pl-c1"]],[[0,71,"pl-c1"]],[[0,65,"pl-c1"]],[[0,65,"pl-c1"]],[[0,69,"pl-c1"]],[[0,71,"pl-c1"]],[[0,69,"pl-c1"]],[[0,74,"pl-c1"]],[[0,81,"pl-c1"]],[[0,82,"pl-c1"]],[[0,84,"pl-c1"]],[[0,79,"pl-c1"]],[[0,68,"pl-c1"]],[[0,69,"pl-c1"]],[[0,65,"pl-c1"]],[[0,64,"pl-c1"]],[[0,65,"pl-c1"]],[[0,85,"pl-c1"]],[[0,66,"pl-c1"]],[[0,65,"pl-c1"]],[[0,67,"pl-c1"]],[[0,74,"pl-c1"]],[[0,84,"pl-c1"]],[[0,1,"pl-c1"]],[[0,79,"pl-c1"]],[[0,72,"pl-c1"]],[[0,59,"pl-c1"]],[[0,64,"pl-c1"]],[[0,58,"pl-c1"]],[[0,62,"pl-c1"]],[[0,68,"pl-c1"]],[[0,67,"pl-c1"]],[[0,61,"pl-c1"]],[[0,62,"pl-c1"]],[[0,58,"pl-c1"]],[[0,61,"pl-c1"]],[[0,46,"pl-c1"]],[[0,42,"pl-c1"]],[[0,45,"pl-c1"]],[[0,43,"pl-c1"]],[[0,57,"pl-c1"]],[[0,1,"pl-c1"]],[[0,49,"pl-c1"]],[[0,88,"pl-c1"]],[[0,90,"pl-c1"]],[[0,76,"pl-c1"]],[[0,75,"pl-c1"]],[[0,1,"pl-c1"]],[[0,54,"pl-c1"]],[[0,51,"pl-c1"]],[[0,76,"pl-c1"]],[[0,74,"pl-c1"]],[[0,55,"pl-c1"]],[[0,64,"pl-c1"]],[[0,60,"pl-c1"]],[[0,62,"pl-c1"]],[[0,67,"pl-c1"]],[[0,65,"pl-c1"]],[[0,55,"pl-c1"]],[[0,1,"pl-c1"]],[[0,34,"pl-c1"]],[[0,48,"pl-c1"]],[[0,45,"pl-c1"]],[[0,48,"pl-c1"]],[[0,1,"pl-c1"]],[[0,81,"pl-c1"]],[[0,54,"pl-c1"]],[[0,54,"pl-c1"]],[[0,63,"pl-c1"]],[[0,1,"pl-c1"]],[[0,59,"pl-c1"]],[[0,60,"pl-c1"]],[[0,57,"pl-c1"]],[[0,79,"pl-c1"]],[[0,82,"pl-c1"]],[[0,77,"pl-c1"]],[[0,79,"pl-c1"]],[[0,82,"pl-c1"]],[[0,1,"pl-c1"]],[[0,49,"pl-c1"]],[[0,69,"pl-c1"]],[[0,1,"pl-c1"]],[[0,55,"pl-c1"]],[[0,1,"pl-c1"]],[[0,84,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[32,38,"pl-ent"],[41,48,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,4,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[11,13,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[2,9,"pl-ent"]],[],[[0,15,"pl-mh"],[3,15,"pl-en"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[61,67,"pl-ent"],[70,77,"pl-ent"]],[],[[0,10,"pl-mh"],[4,10,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,11,"pl-en"]],[[0,3,"pl-ms"]],[],[],[],[],[[0,3,"pl-ms"]],[],[],[[0,3,"pl-s"]],[],[[0,10,"pl-mh"],[4,10,"pl-en"]],[],[[145,146,"pl-s"],[146,155,"pl-c1"],[155,156,"pl-s"],[217,218,"pl-s"],[218,239,"pl-c1"],[239,240,"pl-s"],[307,308,"pl-s"],[308,315,"pl-c1"],[315,316,"pl-s"]],[],[[0,3,"pl-s"],[3,11,"pl-en"]],[[0,14,"pl-mh"],[2,14,"pl-en"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,3,"pl-s"]],[],[[0,9,"pl-mh"],[4,9,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,11,"pl-ent"],[13,89,"pl-s"],[13,14,"pl-pds"],[22,24,"pl-cce"],[28,30,"pl-cce"],[63,69,"pl-cce"],[86,88,"pl-cce"],[88,89,"pl-pds"]],[[2,9,"pl-ent"]],[[4,10,"pl-ent"],[12,21,"pl-s"],[12,13,"pl-pds"],[20,21,"pl-pds"]],[[4,13,"pl-ent"],[15,108,"pl-s"],[15,16,"pl-pds"],[27,29,"pl-cce"],[45,47,"pl-cce"],[53,55,"pl-cce"],[65,67,"pl-cce"],[107,108,"pl-pds"]],[],[],[[0,3,"pl-s"]],[],[[0,9,"pl-mh"],[4,9,"pl-en"]],[],[[51,52,"pl-s"],[52,59,"pl-c1"],[59,60,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,6,"pl-c1"]],[[0,58,"pl-c1"]],[[0,54,"pl-c1"]],[[0,55,"pl-c1"]],[[0,51,"pl-c1"]],[[0,54,"pl-c1"]],[[0,52,"pl-c1"]],[[0,63,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[4,5,"pl-s"],[5,6,"pl-s"],[6,21,"pl-c1"],[21,22,"pl-s"],[22,23,"pl-s"],[23,24,"pl-s"],[24,39,"pl-corl"],[39,40,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,9,"pl-mh"],[3,9,"pl-en"]],[],[],[],[[1,6,"pl-ent"],[7,17,"pl-e"],[18,19,"pl-s"],[19,29,"pl-s"],[29,30,"pl-s"],[31,36,"pl-e"],[37,38,"pl-s"],[38,42,"pl-s"],[42,43,"pl-s"]],[[1,3,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[1,2,"pl-ent"],[3,7,"pl-e"],[8,9,"pl-s"],[9,33,"pl-s"],[33,34,"pl-s"]],[[1,4,"pl-ent"],[5,8,"pl-e"],[9,10,"pl-s"],[10,50,"pl-s"],[50,51,"pl-s"],[52,57,"pl-e"],[58,59,"pl-s"],[59,62,"pl-s"],[62,63,"pl-s"],[64,70,"pl-e"],[71,72,"pl-s"],[72,75,"pl-s"],[75,76,"pl-s"],[77,80,"pl-e"],[81,82,"pl-s"],[82,108,"pl-s"],[108,109,"pl-s"],[113,115,"pl-ent"]],[[1,7,"pl-ent"],[29,35,"pl-ent"]],[[2,3,"pl-ent"]],[[1,3,"pl-ent"],[7,10,"pl-ent"],[49,50,"pl-ent"],[69,70,"pl-ent"],[74,75,"pl-ent"],[76,80,"pl-e"],[81,82,"pl-s"],[82,129,"pl-s"],[129,130,"pl-s"],[139,140,"pl-ent"],[144,147,"pl-ent"]],[[2,4,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[1,2,"pl-ent"],[3,7,"pl-e"],[8,9,"pl-s"],[9,32,"pl-s"],[32,33,"pl-s"]],[[1,4,"pl-ent"],[5,8,"pl-e"],[9,10,"pl-s"],[10,49,"pl-s"],[49,50,"pl-s"],[51,56,"pl-e"],[57,58,"pl-s"],[58,61,"pl-s"],[61,62,"pl-s"],[63,69,"pl-e"],[70,71,"pl-s"],[71,74,"pl-s"],[74,75,"pl-s"],[76,79,"pl-e"],[80,81,"pl-s"],[81,106,"pl-s"],[106,107,"pl-s"],[111,113,"pl-ent"]],[[1,7,"pl-ent"],[28,34,"pl-ent"]],[[2,3,"pl-ent"]],[[1,3,"pl-ent"],[7,10,"pl-ent"],[68,69,"pl-ent"],[70,74,"pl-e"],[75,76,"pl-s"],[76,123,"pl-s"],[123,124,"pl-s"],[133,134,"pl-ent"],[138,141,"pl-ent"]],[[2,4,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"]],[[1,2,"pl-ent"],[3,7,"pl-e"],[8,9,"pl-s"],[9,32,"pl-s"],[32,33,"pl-s"]],[[1,4,"pl-ent"],[5,8,"pl-e"],[9,10,"pl-s"],[10,49,"pl-s"],[49,50,"pl-s"],[51,56,"pl-e"],[57,58,"pl-s"],[58,61,"pl-s"],[61,62,"pl-s"],[63,69,"pl-e"],[70,71,"pl-s"],[71,74,"pl-s"],[74,75,"pl-s"],[76,79,"pl-e"],[80,81,"pl-s"],[81,106,"pl-s"],[106,107,"pl-s"],[111,113,"pl-ent"]],[[1,7,"pl-ent"],[28,34,"pl-ent"]],[[2,3,"pl-ent"]],[[1,3,"pl-ent"],[7,10,"pl-ent"],[60,61,"pl-ent"],[62,66,"pl-e"],[67,68,"pl-s"],[68,115,"pl-s"],[115,116,"pl-s"],[125,126,"pl-ent"],[130,133,"pl-ent"]],[[2,4,"pl-ent"]],[[2,4,"pl-ent"]],[[2,7,"pl-ent"]],[],[[0,1,"pl-ml"],[8,9,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[85,86,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[82,83,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[81,82,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[18,19,"pl-ml"],[75,76,"pl-ml"]],[[0,1,"pl-ml"],[25,26,"pl-ml"],[76,77,"pl-ml"]],[],[[0,1,"pl-s"],[25,26,"pl-s"],[26,27,"pl-s"],[27,50,"pl-corl"],[50,51,"pl-s"],[54,55,"pl-s"],[78,79,"pl-s"],[79,80,"pl-s"],[80,111,"pl-corl"],[111,112,"pl-s"],[115,116,"pl-s"],[135,136,"pl-s"],[136,137,"pl-s"],[137,157,"pl-corl"],[157,158,"pl-s"],[161,162,"pl-s"],[169,170,"pl-s"],[170,171,"pl-s"],[171,186,"pl-corl"],[186,187,"pl-s"]],[],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[[0,1,"pl-ml"],[58,59,"pl-ml"],[130,131,"pl-ml"]],[],[[0,32,"pl-mh"],[4,32,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,42,"pl-c1"]],[[0,29,"pl-c1"]],[[0,26,"pl-c1"]],[[0,47,"pl-c1"]],[[0,26,"pl-c1"]],[[0,30,"pl-c1"]],[[0,39,"pl-c1"]],[[0,41,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,35,"pl-mh"],[4,35,"pl-en"]],[],[],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[25,26,"pl-ml"],[44,45,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[77,78,"pl-ml"],[111,112,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[70,71,"pl-ml"],[117,118,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[48,49,"pl-ml"],[93,94,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[46,47,"pl-ml"],[78,79,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[73,74,"pl-ml"],[98,99,"pl-ml"]],[],[[0,35,"pl-mh"],[4,35,"pl-en"]],[],[[194,195,"pl-s"],[195,207,"pl-c1"],[207,208,"pl-s"],[235,236,"pl-s"],[236,250,"pl-c1"],[250,251,"pl-s"]],[],[[95,96,"pl-s"],[96,100,"pl-c1"],[100,101,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[18,44,"pl-s"],[18,19,"pl-pds"],[43,44,"pl-pds"]],[],[[0,3,"pl-s"]],[],[[188,189,"pl-s"],[189,203,"pl-c1"],[203,204,"pl-s"]],[],[[0,1,"pl-s"],[35,36,"pl-s"],[36,37,"pl-s"],[37,67,"pl-corl"],[67,68,"pl-s"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[80,86,"pl-ent"],[89,96,"pl-ent"]],[],[[33,34,"pl-s"],[34,47,"pl-c1"],[47,48,"pl-s"],[190,191,"pl-s"],[191,201,"pl-c1"],[201,202,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,7,"pl-c1"]],[[0,3,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,31,"pl-c"],[0,1,"pl-c"]],[],[],[[0,71,"pl-c"],[0,1,"pl-c"]],[],[],[],[[10,45,"pl-s"],[10,11,"pl-pds"],[44,45,"pl-pds"]],[],[],[[0,33,"pl-c"],[0,1,"pl-c"]],[[18,44,"pl-s"],[18,19,"pl-pds"],[43,44,"pl-pds"]],[[11,15,"pl-c1"],[16,17,"pl-k"],[26,27,"pl-k"]],[],[[0,50,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[[40,41,"pl-s"],[41,48,"pl-c1"],[48,49,"pl-s"],[53,54,"pl-s"],[54,65,"pl-c1"],[65,66,"pl-s"]],[],[[31,32,"pl-s"],[32,48,"pl-c1"],[48,49,"pl-s"],[61,62,"pl-s"],[62,63,"pl-s"],[63,91,"pl-c1"],[91,92,"pl-s"],[92,93,"pl-s"],[93,94,"pl-s"],[94,122,"pl-corl"],[122,123,"pl-s"],[164,165,"pl-s"],[165,179,"pl-c1"],[179,180,"pl-s"],[206,207,"pl-s"],[207,218,"pl-c1"],[218,219,"pl-s"],[221,222,"pl-s"],[222,235,"pl-c1"],[235,236,"pl-s"],[238,239,"pl-s"],[239,250,"pl-c1"],[250,251,"pl-s"],[257,258,"pl-s"],[258,271,"pl-c1"],[271,272,"pl-s"],[315,316,"pl-s"],[316,334,"pl-c1"],[334,335,"pl-s"],[473,474,"pl-s"],[474,503,"pl-c1"],[503,504,"pl-s"],[517,518,"pl-s"],[518,519,"pl-s"],[519,549,"pl-c1"],[549,550,"pl-s"],[550,551,"pl-s"],[551,552,"pl-s"],[552,582,"pl-corl"],[582,583,"pl-s"],[627,628,"pl-s"],[628,629,"pl-s"],[629,660,"pl-c1"],[660,661,"pl-s"],[661,662,"pl-s"],[662,663,"pl-s"],[663,694,"pl-corl"],[694,695,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,19,"pl-mh"],[3,19,"pl-en"]],[],[[53,55,"pl-s"],[80,82,"pl-s"]],[],[[0,1,"pl-ml"],[11,12,"pl-ml"],[20,21,"pl-ml"],[41,42,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[25,26,"pl-ml"],[99,100,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[25,26,"pl-ml"],[142,143,"pl-s"],[143,148,"pl-s"],[144,148,"pl-corl"],[148,149,"pl-s"],[149,150,"pl-s"],[150,193,"pl-corl"],[193,194,"pl-s"],[197,198,"pl-ml"]],[[0,1,"pl-ml"],[16,17,"pl-ml"],[33,34,"pl-ml"],[113,114,"pl-ml"]],[[0,1,"pl-ml"],[17,18,"pl-ml"],[46,47,"pl-ml"],[147,148,"pl-s"],[148,153,"pl-s"],[149,153,"pl-corl"],[153,154,"pl-s"],[154,155,"pl-s"],[155,198,"pl-corl"],[198,199,"pl-s"],[201,202,"pl-s"],[202,207,"pl-s"],[203,207,"pl-corl"],[207,208,"pl-s"],[208,209,"pl-s"],[209,252,"pl-corl"],[252,253,"pl-s"],[328,329,"pl-ml"]],[],[[6,7,"pl-s"],[7,13,"pl-c1"],[13,14,"pl-s"],[16,17,"pl-s"],[17,21,"pl-c1"],[21,22,"pl-s"],[24,25,"pl-s"],[25,37,"pl-c1"],[37,38,"pl-s"],[44,45,"pl-s"],[45,61,"pl-c1"],[61,62,"pl-s"]],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[19,20,"pl-ml"],[46,47,"pl-ml"],[69,70,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"],[16,17,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[31,32,"pl-ml"],[63,64,"pl-ml"],[245,246,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[34,35,"pl-ml"],[76,77,"pl-ml"],[204,205,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[32,33,"pl-ml"],[59,60,"pl-s"],[60,68,"pl-c1"],[68,69,"pl-s"],[70,71,"pl-ml"],[177,178,"pl-s"],[178,183,"pl-s"],[179,183,"pl-corl"],[183,184,"pl-s"],[184,185,"pl-s"],[185,228,"pl-corl"],[228,229,"pl-s"],[232,233,"pl-ml"]],[[0,1,"pl-ml"],[11,12,"pl-ml"],[31,32,"pl-ml"],[72,73,"pl-ml"],[160,161,"pl-s"],[161,166,"pl-s"],[162,166,"pl-corl"],[166,167,"pl-s"],[167,168,"pl-s"],[168,211,"pl-corl"],[211,212,"pl-s"],[215,216,"pl-ml"]],[[0,1,"pl-ml"],[17,18,"pl-ml"],[36,37,"pl-ml"],[79,80,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[77,78,"pl-ml"],[109,110,"pl-ml"],[145,146,"pl-ml"],[245,246,"pl-ml"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[44,50,"pl-ent"],[53,60,"pl-ent"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[25,27,"pl-s"],[29,30,"pl-s"],[30,52,"pl-c1"],[52,53,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[19,21,"pl-s"],[23,24,"pl-s"],[24,52,"pl-c1"],[52,53,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[17,19,"pl-s"],[21,22,"pl-s"],[22,36,"pl-c1"],[36,37,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[14,16,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[18,20,"pl-s"],[22,23,"pl-s"],[23,53,"pl-c1"],[53,54,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[13,15,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,26,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,19,"pl-c"],[0,1,"pl-c"]],[],[],[[0,20,"pl-c"],[0,1,"pl-c"]],[],[],[[0,24,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[[11,12,"pl-s"],[12,21,"pl-c1"],[21,22,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[51,57,"pl-ent"],[60,67,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,45,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,37,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[26,70,"pl-s"],[26,27,"pl-pds"],[69,70,"pl-pds"]],[],[[0,59,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,85,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,53,"pl-c"],[0,1,"pl-c"]],[[0,88,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,79,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,73,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,79,"pl-c"],[0,1,"pl-c"]],[[0,77,"pl-c"],[0,1,"pl-c"]],[[0,81,"pl-c"],[0,1,"pl-c"]],[[0,77,"pl-c"],[0,1,"pl-c"]],[[0,58,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[],[[0,71,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"]],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,89,"pl-c1"]],[[0,81,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[60,66,"pl-ent"],[69,76,"pl-ent"]],[],[[154,155,"pl-s"],[155,164,"pl-c1"],[164,165,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,64,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-k"],[27,46,"pl-s"],[27,28,"pl-pds"],[28,33,"pl-smi"],[45,46,"pl-pds"]],[[0,3,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,37,"pl-c1"],[37,38,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,39,"pl-c1"],[39,40,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,44,"pl-c1"],[44,45,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,32,"pl-c1"],[32,33,"pl-s"]],[],[[4,5,"pl-s"],[5,22,"pl-s"],[5,17,"pl-corl"],[18,22,"pl-corl"],[22,23,"pl-s"],[23,24,"pl-s"],[24,67,"pl-corl"],[67,68,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[66,72,"pl-ent"],[75,82,"pl-ent"]],[],[[0,29,"pl-mh"],[4,29,"pl-en"]],[],[[0,1,"pl-ml"],[13,14,"pl-ml"],[27,28,"pl-ml"],[35,36,"pl-ml"],[44,45,"pl-ml"],[55,56,"pl-ml"],[72,73,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"],[16,17,"pl-ml"],[20,21,"pl-ml"],[24,25,"pl-ml"]],[[0,1,"pl-ml"],[15,16,"pl-ml"],[24,25,"pl-ml"],[33,34,"pl-s"],[34,43,"pl-c1"],[43,44,"pl-s"],[45,46,"pl-ml"],[61,62,"pl-ml"],[83,84,"pl-ml"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[32,33,"pl-ml"],[52,53,"pl-ml"],[82,83,"pl-ml"],[97,98,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[20,21,"pl-ml"],[36,37,"pl-ml"],[109,110,"pl-ml"],[142,143,"pl-ml"],[158,159,"pl-ml"],[174,175,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[34,35,"pl-ml"],[79,80,"pl-ml"],[134,135,"pl-ml"],[150,151,"pl-ml"],[166,167,"pl-ml"]],[[0,1,"pl-ml"],[20,21,"pl-ml"],[53,54,"pl-ml"],[106,107,"pl-ml"],[137,138,"pl-ml"],[162,163,"pl-ml"],[184,185,"pl-ml"]],[[0,1,"pl-ml"],[26,27,"pl-ml"],[46,47,"pl-ml"],[56,57,"pl-ml"],[66,67,"pl-ml"],[76,77,"pl-ml"],[98,99,"pl-ml"]],[],[[0,2,"pl-s"],[30,32,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[13,15,"pl-s"],[128,129,"pl-s"],[129,160,"pl-c1"],[160,161,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[23,25,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[17,19,"pl-s"]],[[0,1,"pl-v"],[54,55,"pl-s"],[55,64,"pl-c1"],[64,65,"pl-s"],[76,77,"pl-s"],[77,100,"pl-c1"],[100,101,"pl-s"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[46,52,"pl-ent"],[55,62,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,13,"pl-c"],[0,1,"pl-c"]],[],[],[[0,3,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,20,"pl-c1"]],[[0,40,"pl-c1"]],[[0,53,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,31,"pl-mh"],[5,31,"pl-en"]],[],[[0,1,"pl-ml"],[12,13,"pl-ml"],[20,21,"pl-ml"],[30,31,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[20,21,"pl-ml"],[30,31,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[19,20,"pl-ml"],[124,125,"pl-ml"]],[[0,1,"pl-ml"],[15,16,"pl-ml"],[20,21,"pl-ml"],[57,58,"pl-s"],[58,72,"pl-c1"],[72,73,"pl-s"],[93,94,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[13,14,"pl-ml"],[98,99,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[14,15,"pl-ml"],[16,17,"pl-s"],[17,40,"pl-c1"],[40,41,"pl-s"],[119,120,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[28,29,"pl-ml"],[30,31,"pl-s"],[31,46,"pl-c1"],[46,47,"pl-s"],[73,74,"pl-ml"]],[[0,1,"pl-ml"],[11,12,"pl-ml"],[20,21,"pl-ml"],[22,23,"pl-s"],[23,40,"pl-c1"],[40,41,"pl-s"],[55,56,"pl-ml"]],[[0,1,"pl-ml"],[13,14,"pl-ml"],[22,23,"pl-ml"],[24,25,"pl-s"],[25,41,"pl-c1"],[41,42,"pl-s"],[56,57,"pl-ml"]],[],[[0,25,"pl-mh"],[5,25,"pl-en"]],[],[[26,27,"pl-s"],[27,36,"pl-c1"],[36,37,"pl-s"],[43,44,"pl-s"],[44,52,"pl-c1"],[52,53,"pl-s"],[76,77,"pl-s"],[77,86,"pl-c1"],[86,87,"pl-s"]],[],[[80,81,"pl-s"],[81,104,"pl-c1"],[104,105,"pl-s"]],[],[[0,53,"pl-mh"],[5,53,"pl-en"]],[],[[32,33,"pl-s"],[33,51,"pl-c1"],[51,52,"pl-s"],[106,108,"pl-s"],[115,116,"pl-s"],[116,125,"pl-c1"],[125,126,"pl-s"],[140,142,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[12,13,"pl-s"],[13,25,"pl-c1"],[25,26,"pl-s"],[31,33,"pl-s"],[48,49,"pl-s"],[49,67,"pl-c1"],[67,68,"pl-s"],[72,73,"pl-s"],[73,88,"pl-c1"],[88,89,"pl-s"],[99,100,"pl-s"],[100,119,"pl-c1"],[119,120,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[25,27,"pl-s"],[34,35,"pl-s"],[35,49,"pl-c1"],[49,50,"pl-s"],[54,55,"pl-s"],[55,73,"pl-c1"],[73,74,"pl-s"],[104,105,"pl-s"],[105,118,"pl-c1"],[118,119,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[19,21,"pl-s"],[23,24,"pl-s"],[24,51,"pl-c1"],[51,52,"pl-s"],[87,88,"pl-s"],[88,101,"pl-c1"],[101,102,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[19,21,"pl-s"],[23,24,"pl-s"],[24,61,"pl-c1"],[61,62,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,6,"pl-k"],[27,46,"pl-s"],[27,28,"pl-pds"],[28,33,"pl-smi"],[45,46,"pl-pds"]],[[0,3,"pl-s"]],[],[[3,5,"pl-s"],[10,12,"pl-s"],[53,54,"pl-s"],[54,83,"pl-c1"],[83,84,"pl-s"],[104,105,"pl-s"],[105,132,"pl-c1"],[132,133,"pl-s"]],[],[[55,56,"pl-s"],[56,75,"pl-c1"],[75,76,"pl-s"],[86,87,"pl-s"],[87,116,"pl-c1"],[116,117,"pl-s"]],[],[[0,44,"pl-mh"],[5,44,"pl-en"]],[],[[11,13,"pl-s"],[46,48,"pl-s"],[64,65,"pl-s"],[65,89,"pl-c1"],[89,90,"pl-s"],[172,173,"pl-s"],[173,191,"pl-c1"],[191,192,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,67,"pl-c1"]],[[0,73,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[24,26,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[17,19,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[22,24,"pl-s"],[51,52,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[21,23,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[42,44,"pl-s"]],[],[[0,17,"pl-mh"],[5,17,"pl-en"]],[],[[39,40,"pl-s"],[40,51,"pl-c1"],[51,52,"pl-s"],[54,55,"pl-s"],[55,60,"pl-c1"],[60,61,"pl-s"],[67,68,"pl-s"],[68,79,"pl-c1"],[79,80,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,11,"pl-ent"],[13,61,"pl-s"],[13,14,"pl-pds"],[60,61,"pl-pds"]],[[0,5,"pl-ent"],[7,53,"pl-s"]],[[0,11,"pl-ent"],[13,18,"pl-c1"]],[],[[0,3,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[57,63,"pl-ent"],[66,73,"pl-ent"]],[],[[381,382,"pl-s"],[382,383,"pl-s"],[383,413,"pl-c1"],[413,414,"pl-s"],[414,415,"pl-s"],[415,416,"pl-s"],[416,446,"pl-corl"],[446,447,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,80,"pl-c"],[0,1,"pl-c"]],[],[],[],[],[[0,71,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,47,"pl-c"],[0,1,"pl-c"]],[[12,14,"pl-k"]],[],[[0,44,"pl-c"],[0,1,"pl-c"]],[[22,23,"pl-k"]],[[0,3,"pl-s"]],[],[[65,66,"pl-s"],[66,86,"pl-c1"],[86,87,"pl-s"],[97,99,"pl-s"],[107,109,"pl-s"],[181,182,"pl-s"],[182,191,"pl-c1"],[191,192,"pl-s"],[216,217,"pl-s"],[217,229,"pl-c1"],[229,230,"pl-s"]],[],[[56,57,"pl-s"],[57,79,"pl-c1"],[79,80,"pl-s"],[107,108,"pl-s"],[108,129,"pl-c1"],[129,130,"pl-s"],[169,170,"pl-s"],[170,196,"pl-c1"],[196,197,"pl-s"],[205,206,"pl-s"],[206,218,"pl-c1"],[218,219,"pl-s"]],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"],[11,12,"pl-s"],[12,21,"pl-c1"],[21,22,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[27,28,"pl-s"],[28,48,"pl-c1"],[48,49,"pl-s"]],[[0,1,"pl-v"],[16,17,"pl-s"],[17,35,"pl-c1"],[35,36,"pl-s"],[64,65,"pl-s"],[65,70,"pl-c1"],[70,71,"pl-s"],[75,76,"pl-s"],[76,90,"pl-c1"],[90,91,"pl-s"]],[[0,1,"pl-v"],[17,18,"pl-s"],[18,36,"pl-c1"],[36,37,"pl-s"],[41,42,"pl-s"],[42,62,"pl-c1"],[62,63,"pl-s"],[152,153,"pl-s"],[153,167,"pl-c1"],[167,168,"pl-s"]],[],[[0,63,"pl-mh"],[5,63,"pl-en"]],[],[[0,1,"pl-ml"],[12,13,"pl-ml"],[20,21,"pl-ml"],[30,31,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[20,21,"pl-ml"],[30,31,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[13,14,"pl-ml"],[15,16,"pl-s"],[16,34,"pl-c1"],[34,35,"pl-s"],[114,115,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[16,17,"pl-ml"],[37,38,"pl-s"],[38,54,"pl-c1"],[54,55,"pl-s"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[9,10,"pl-ml"],[14,15,"pl-ml"],[16,17,"pl-s"],[17,32,"pl-c1"],[32,33,"pl-s"],[75,76,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[18,19,"pl-ml"],[104,105,"pl-s"],[105,117,"pl-c1"],[117,118,"pl-s"],[125,126,"pl-ml"]],[[0,1,"pl-ml"],[11,12,"pl-ml"],[15,16,"pl-ml"],[17,18,"pl-s"],[18,24,"pl-c1"],[24,25,"pl-s"],[50,51,"pl-s"],[51,55,"pl-c1"],[55,56,"pl-s"],[77,78,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[18,19,"pl-ml"],[20,21,"pl-s"],[21,35,"pl-c1"],[35,36,"pl-s"],[74,75,"pl-ml"]],[],[[10,11,"pl-s"],[11,26,"pl-c1"],[26,27,"pl-s"],[89,90,"pl-s"],[90,100,"pl-c1"],[100,101,"pl-s"],[103,104,"pl-s"],[104,119,"pl-c1"],[119,120,"pl-s"],[126,127,"pl-s"],[127,140,"pl-c1"],[140,141,"pl-s"],[200,201,"pl-s"],[201,202,"pl-s"],[202,219,"pl-c1"],[219,220,"pl-s"],[220,221,"pl-s"],[221,222,"pl-s"],[222,258,"pl-corl"],[258,259,"pl-s"]],[],[[0,19,"pl-mh"],[5,19,"pl-en"]],[],[[11,13,"pl-s"],[59,61,"pl-s"],[149,150,"pl-s"],[150,156,"pl-c1"],[156,157,"pl-s"],[159,160,"pl-s"],[160,169,"pl-c1"],[169,170,"pl-s"],[181,182,"pl-s"],[182,205,"pl-c1"],[205,206,"pl-s"]],[],[[0,24,"pl-mh"],[5,24,"pl-en"]],[],[],[],[[0,1,"pl-v"],[9,10,"pl-s"],[10,37,"pl-c1"],[37,38,"pl-s"],[42,43,"pl-s"],[43,61,"pl-c1"],[61,62,"pl-s"]],[[0,1,"pl-v"],[21,22,"pl-s"],[22,37,"pl-c1"],[37,38,"pl-s"]],[[0,1,"pl-v"],[34,35,"pl-s"],[35,49,"pl-c1"],[49,50,"pl-s"]],[[0,1,"pl-v"],[6,7,"pl-s"],[7,13,"pl-c1"],[13,14,"pl-s"]],[],[],[],[[0,1,"pl-ml"],[7,8,"pl-ml"],[17,18,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[17,18,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[13,14,"pl-ml"],[66,67,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[13,14,"pl-ml"],[62,63,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[20,21,"pl-ml"],[85,86,"pl-ml"]],[],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[30,36,"pl-ent"],[39,46,"pl-ent"]],[],[[56,57,"pl-s"],[57,61,"pl-c1"],[61,62,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,44,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[43,44,"pl-s"],[44,49,"pl-c1"],[49,50,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[44,50,"pl-ent"],[53,60,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,64,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[[26,27,"pl-s"],[57,58,"pl-s"],[58,59,"pl-s"],[59,84,"pl-corl"],[84,85,"pl-s"],[172,173,"pl-s"],[173,184,"pl-c1"],[184,185,"pl-s"],[191,192,"pl-s"],[192,200,"pl-c1"],[200,201,"pl-s"]],[],[[49,50,"pl-s"],[50,73,"pl-c1"],[73,74,"pl-s"]],[],[[0,29,"pl-mh"],[5,29,"pl-en"]],[],[],[],[[0,1,"pl-ml"],[19,20,"pl-ml"],[43,44,"pl-ml"]],[[0,1,"pl-ml"],[18,19,"pl-ml"],[41,42,"pl-ml"]],[[0,1,"pl-ml"],[13,14,"pl-ml"],[15,16,"pl-s"],[16,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[16,17,"pl-s"],[17,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[9,10,"pl-s"],[10,22,"pl-c1"],[22,23,"pl-s"],[24,25,"pl-ml"]],[[0,1,"pl-ml"],[15,16,"pl-ml"],[17,18,"pl-s"],[18,33,"pl-c1"],[33,34,"pl-s"],[35,36,"pl-ml"]],[[0,1,"pl-ml"],[13,14,"pl-ml"],[15,16,"pl-s"],[16,31,"pl-c1"],[31,32,"pl-s"],[33,34,"pl-ml"]],[],[[0,2,"pl-s"],[28,30,"pl-s"],[32,33,"pl-s"],[33,44,"pl-c1"],[44,45,"pl-s"],[47,48,"pl-s"],[48,68,"pl-c1"],[68,69,"pl-s"],[71,72,"pl-s"],[72,87,"pl-c1"],[87,88,"pl-s"],[90,91,"pl-s"],[91,113,"pl-c1"],[113,114,"pl-s"],[116,117,"pl-s"],[117,131,"pl-c1"],[131,132,"pl-s"]],[],[[0,24,"pl-mh"],[5,24,"pl-en"]],[],[[0,2,"pl-s"],[24,26,"pl-s"]],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,2,"pl-c1"]],[],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[34,36,"pl-s"]],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[17,18,"pl-s"],[18,31,"pl-c1"],[31,32,"pl-s"]],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,10,"pl-ent"],[13,28,"pl-s"],[13,14,"pl-pds"],[27,28,"pl-pds"]],[],[[0,3,"pl-s"]],[],[[110,112,"pl-s"],[115,117,"pl-s"]],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"],[19,20,"pl-s"],[20,30,"pl-c1"],[30,31,"pl-s"],[77,78,"pl-s"],[78,90,"pl-c1"],[90,91,"pl-s"],[93,94,"pl-s"],[94,99,"pl-c1"],[99,100,"pl-s"],[106,107,"pl-s"],[107,114,"pl-c1"],[114,115,"pl-s"],[127,128,"pl-s"],[128,141,"pl-c1"],[141,142,"pl-s"]],[],[[0,18,"pl-mh"],[5,18,"pl-en"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[19,21,"pl-s"],[23,24,"pl-s"],[24,46,"pl-c1"],[46,47,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[26,28,"pl-s"],[30,31,"pl-s"],[31,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[22,24,"pl-s"],[26,27,"pl-s"],[27,65,"pl-c1"],[65,66,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[21,23,"pl-s"],[25,26,"pl-s"],[26,34,"pl-c1"],[34,35,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[50,56,"pl-ent"],[59,66,"pl-ent"]],[],[[13,15,"pl-s"],[37,39,"pl-s"]],[],[[0,39,"pl-mh"],[5,39,"pl-en"]],[],[[0,1,"pl-ml"],[12,13,"pl-ml"],[19,20,"pl-ml"],[29,30,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[19,20,"pl-ml"],[29,30,"pl-ml"]],[[0,1,"pl-ml"],[20,21,"pl-ml"],[22,23,"pl-s"],[23,54,"pl-c1"],[54,55,"pl-s"],[56,57,"pl-ml"],[125,126,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[21,22,"pl-s"],[22,43,"pl-c1"],[43,44,"pl-s"],[45,46,"pl-ml"],[118,119,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[16,17,"pl-s"],[17,47,"pl-c1"],[47,48,"pl-s"],[49,50,"pl-ml"],[82,83,"pl-ml"]],[[0,1,"pl-ml"],[13,14,"pl-ml"],[15,16,"pl-s"],[16,45,"pl-c1"],[45,46,"pl-s"],[47,48,"pl-ml"],[73,74,"pl-ml"]],[[0,1,"pl-ml"],[25,26,"pl-ml"],[27,28,"pl-s"],[28,69,"pl-c1"],[69,70,"pl-s"],[71,72,"pl-ml"],[110,111,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[21,22,"pl-s"],[22,57,"pl-c1"],[57,58,"pl-s"],[59,60,"pl-ml"],[102,103,"pl-ml"]],[[0,1,"pl-ml"],[18,19,"pl-ml"],[20,21,"pl-s"],[21,55,"pl-c1"],[55,56,"pl-s"],[57,58,"pl-ml"],[96,97,"pl-ml"]],[],[[124,125,"pl-s"],[125,156,"pl-c1"],[156,157,"pl-s"],[173,174,"pl-s"],[174,195,"pl-c1"],[195,196,"pl-s"],[205,206,"pl-s"],[206,222,"pl-c1"],[222,223,"pl-s"],[270,271,"pl-s"],[271,287,"pl-c1"],[287,288,"pl-s"]],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[13,15,"pl-s"],[33,35,"pl-s"],[52,54,"pl-s"],[63,65,"pl-s"],[75,76,"pl-s"],[76,77,"pl-c1"],[77,78,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[27,28,"pl-s"],[28,32,"pl-c1"],[32,33,"pl-s"],[35,36,"pl-s"],[36,39,"pl-c1"],[39,40,"pl-s"],[42,43,"pl-s"],[43,58,"pl-c1"],[58,59,"pl-s"]],[],[[0,21,"pl-mh"],[5,21,"pl-en"]],[],[[0,1,"pl-ml"],[14,15,"pl-ml"],[35,36,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[34,35,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[35,36,"pl-s"],[36,59,"pl-c1"],[59,60,"pl-s"],[61,62,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[35,36,"pl-s"],[36,51,"pl-c1"],[51,52,"pl-s"],[60,61,"pl-ml"]],[[0,1,"pl-ml"],[16,17,"pl-ml"],[30,31,"pl-s"],[31,34,"pl-c1"],[34,35,"pl-s"],[43,44,"pl-ml"]],[[0,1,"pl-ml"],[26,27,"pl-ml"],[28,29,"pl-s"],[29,33,"pl-c1"],[33,34,"pl-s"],[42,43,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[61,62,"pl-ml"]],[[0,1,"pl-ml"],[25,26,"pl-ml"],[27,28,"pl-s"],[28,37,"pl-c1"],[37,38,"pl-s"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[14,15,"pl-ml"],[16,17,"pl-s"],[17,25,"pl-c1"],[25,26,"pl-s"],[34,35,"pl-ml"]],[[0,1,"pl-ml"],[24,25,"pl-ml"],[50,51,"pl-s"],[51,64,"pl-c1"],[64,65,"pl-s"],[66,67,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[66,67,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[68,69,"pl-ml"]],[],[[0,16,"pl-mh"],[5,16,"pl-en"]],[],[],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[41,47,"pl-ent"],[50,57,"pl-ent"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[23,24,"pl-s"],[24,25,"pl-s"],[25,61,"pl-corl"],[61,62,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[33,34,"pl-s"],[34,35,"pl-s"],[35,73,"pl-corl"],[73,74,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[21,22,"pl-s"],[22,23,"pl-s"],[23,43,"pl-corl"],[43,44,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[27,28,"pl-s"],[28,29,"pl-s"],[29,56,"pl-corl"],[56,57,"pl-s"]],[[2,9,"pl-ent"]],[[2,9,"pl-ent"]],[],[[0,21,"pl-mh"],[3,21,"pl-en"]],[],[[151,152,"pl-s"],[178,179,"pl-s"],[179,180,"pl-s"],[180,206,"pl-corl"],[206,207,"pl-s"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[39,45,"pl-ent"],[48,55,"pl-ent"]],[],[[7,8,"pl-s"],[8,31,"pl-c1"],[31,32,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,9,"pl-ent"],[11,19,"pl-s"],[11,12,"pl-pds"],[18,19,"pl-pds"]],[[2,7,"pl-ent"]],[[4,25,"pl-ent"],[27,34,"pl-s"],[27,28,"pl-pds"],[33,34,"pl-pds"]],[[4,37,"pl-ent"],[39,43,"pl-s"],[39,40,"pl-pds"],[42,43,"pl-pds"]],[[4,32,"pl-ent"],[34,41,"pl-s"],[34,35,"pl-pds"],[40,41,"pl-pds"]],[],[],[[0,3,"pl-s"]],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[20,21,"pl-ml"],[34,35,"pl-ml"],[43,44,"pl-ml"]],[[0,1,"pl-ml"],[10,11,"pl-ml"],[20,21,"pl-ml"],[34,35,"pl-ml"],[43,44,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[10,11,"pl-ml"],[17,18,"pl-ml"],[19,21,"pl-s"],[27,29,"pl-s"],[30,31,"pl-ml"],[32,33,"pl-s"],[82,83,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,22,"pl-c1"],[22,23,"pl-s"],[24,25,"pl-ml"],[33,34,"pl-ml"],[35,37,"pl-s"],[43,45,"pl-s"],[46,47,"pl-ml"],[48,49,"pl-s"],[99,100,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,34,"pl-c1"],[34,35,"pl-s"],[36,37,"pl-ml"],[41,42,"pl-ml"],[43,45,"pl-s"],[47,49,"pl-s"],[50,51,"pl-ml"],[102,103,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,36,"pl-c1"],[36,37,"pl-s"],[38,39,"pl-ml"],[43,44,"pl-ml"],[45,47,"pl-s"],[73,75,"pl-s"],[76,77,"pl-ml"],[171,172,"pl-ml"]],[],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,11,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[42,48,"pl-ent"],[51,58,"pl-ent"]],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[24,25,"pl-ml"]],[[0,1,"pl-ml"],[10,11,"pl-ml"],[24,25,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[43,44,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"],[16,17,"pl-ml"],[66,67,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"],[11,12,"pl-ml"],[59,60,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[13,14,"pl-ml"],[79,80,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[10,11,"pl-ml"],[50,51,"pl-ml"]],[],[[91,92,"pl-s"],[92,129,"pl-c1"],[129,130,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[39,45,"pl-ent"],[48,55,"pl-ent"]],[],[[4,5,"pl-s"],[5,22,"pl-c1"],[22,23,"pl-s"],[39,40,"pl-s"],[40,48,"pl-c1"],[48,49,"pl-s"],[131,132,"pl-s"],[132,165,"pl-c1"],[165,166,"pl-s"]],[],[[0,2,"pl-s"],[18,20,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,2,"pl-s"],[22,24,"pl-s"]],[[0,1,"pl-v"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[44,50,"pl-ent"],[53,60,"pl-ent"]],[],[[0,2,"pl-s"],[11,13,"pl-s"],[137,138,"pl-s"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"],[6,7,"pl-s"],[7,11,"pl-c1"],[11,12,"pl-s"],[89,90,"pl-s"],[90,104,"pl-c1"],[104,105,"pl-s"]],[[0,1,"pl-v"],[6,7,"pl-s"],[7,24,"pl-c1"],[24,25,"pl-s"]],[[0,1,"pl-v"],[35,36,"pl-s"],[36,51,"pl-c1"],[51,52,"pl-s"]],[],[[0,2,"pl-s"],[27,29,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,15,"pl-mh"],[3,15,"pl-en"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[72,78,"pl-ent"],[81,88,"pl-ent"]],[],[[0,27,"pl-mh"],[4,27,"pl-en"]],[],[[0,2,"pl-s"],[35,37,"pl-s"]],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[0,42,"pl-mh"],[4,42,"pl-en"]],[],[[0,133,"pl-ent"],[0,2,"pl-ent"],[11,13,"pl-s"],[30,32,"pl-s"],[46,47,"pl-s"],[47,54,"pl-c1"],[54,55,"pl-s"],[65,66,"pl-s"],[66,92,"pl-c1"],[92,93,"pl-s"]],[[0,0,"pl-ent"]],[[18,20,"pl-s"],[39,41,"pl-s"],[42,43,"pl-s"],[43,59,"pl-c1"],[59,60,"pl-s"],[129,130,"pl-s"],[130,141,"pl-c1"],[141,142,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,81,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,2,"pl-s"],[10,12,"pl-s"],[70,71,"pl-s"],[71,74,"pl-s"],[72,74,"pl-corl"],[74,75,"pl-s"],[75,76,"pl-s"],[76,117,"pl-corl"],[117,118,"pl-s"],[120,121,"pl-s"],[121,124,"pl-s"],[122,124,"pl-corl"],[124,125,"pl-s"],[125,126,"pl-s"],[126,167,"pl-corl"],[167,168,"pl-s"],[170,171,"pl-s"],[171,175,"pl-s"],[172,175,"pl-corl"],[175,176,"pl-s"],[176,177,"pl-s"],[177,219,"pl-corl"],[219,220,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,11,"pl-mh"],[3,11,"pl-en"]],[],[],[],[[0,1,"pl-v"],[21,22,"pl-s"],[22,53,"pl-corl"],[53,54,"pl-s"]],[[0,1,"pl-v"],[22,23,"pl-s"],[23,30,"pl-c1"],[30,31,"pl-s"]],[[0,1,"pl-v"],[16,17,"pl-s"],[17,18,"pl-s"],[18,31,"pl-c1"],[31,32,"pl-s"],[32,33,"pl-s"],[33,34,"pl-s"],[34,77,"pl-corl"],[77,78,"pl-s"],[83,84,"pl-s"],[84,85,"pl-s"],[85,100,"pl-c1"],[100,101,"pl-s"],[101,102,"pl-s"],[102,103,"pl-s"],[103,148,"pl-corl"],[148,149,"pl-s"]],[[0,1,"pl-v"],[14,15,"pl-s"],[15,48,"pl-corl"],[48,49,"pl-s"]],[[0,1,"pl-v"],[11,12,"pl-s"],[12,29,"pl-corl"],[29,30,"pl-s"]],[],[[75,76,"pl-s"],[93,94,"pl-s"],[94,95,"pl-s"],[95,125,"pl-corl"],[125,126,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[24,25,"pl-c1"]],[[0,3,"pl-s"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[27,29,"pl-s"],[57,58,"pl-s"],[69,70,"pl-s"],[70,71,"pl-s"],[71,82,"pl-corl"],[82,83,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[24,26,"pl-s"],[81,82,"pl-s"],[82,84,"pl-c1"],[84,85,"pl-s"],[98,99,"pl-s"],[99,111,"pl-c1"],[111,112,"pl-s"],[130,131,"pl-s"],[131,141,"pl-c1"],[141,142,"pl-s"],[285,286,"pl-s"],[286,300,"pl-c1"],[300,301,"pl-s"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[59,65,"pl-ent"],[68,75,"pl-ent"]],[],[],[],[[16,17,"pl-s"],[17,33,"pl-c1"],[33,34,"pl-s"],[40,41,"pl-s"],[41,64,"pl-c1"],[64,65,"pl-s"]],[],[[4,5,"pl-s"],[5,9,"pl-c1"],[9,10,"pl-s"],[83,84,"pl-s"],[84,98,"pl-c1"],[98,99,"pl-s"]],[],[[0,1,"pl-s"],[1,18,"pl-c1"],[18,19,"pl-s"]],[],[[33,34,"pl-s"],[34,49,"pl-c1"],[49,50,"pl-s"],[122,123,"pl-s"],[147,148,"pl-s"],[148,149,"pl-s"],[149,175,"pl-corl"],[175,176,"pl-s"]],[[2,9,"pl-ent"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[18,19,"pl-s"],[19,20,"pl-s"],[20,31,"pl-corl"],[31,32,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[17,18,"pl-s"],[18,19,"pl-s"],[19,42,"pl-corl"],[42,43,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[23,24,"pl-s"],[24,25,"pl-s"],[25,53,"pl-corl"],[53,54,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[33,34,"pl-s"],[34,35,"pl-s"],[35,82,"pl-corl"],[82,83,"pl-s"]],[],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[71,77,"pl-ent"],[80,87,"pl-ent"]],[],[],[],[[0,39,"pl-mh"],[4,39,"pl-en"]],[],[[8,9,"pl-s"],[9,22,"pl-c1"],[22,23,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[33,55,"pl-c"],[33,34,"pl-c"]],[[33,85,"pl-c"],[33,34,"pl-c"]],[[0,3,"pl-s"]],[],[],[],[[0,35,"pl-mh"],[4,35,"pl-en"]],[],[],[],[[0,1,"pl-s"],[29,30,"pl-s"],[30,31,"pl-s"],[31,64,"pl-corl"],[64,65,"pl-s"],[68,69,"pl-s"],[78,79,"pl-s"],[79,80,"pl-s"],[80,97,"pl-corl"],[97,98,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,23,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[18,20,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[24,26,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[22,24,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[66,72,"pl-ent"],[75,82,"pl-ent"]],[],[[0,130,"pl-ent"],[0,2,"pl-ent"]],[[0,0,"pl-ent"]],[],[],[[1,2,"pl-ent"],[3,5,"pl-e"],[6,7,"pl-s"],[7,36,"pl-s"],[36,37,"pl-s"],[40,41,"pl-ent"]],[[0,2,"pl-s"],[20,22,"pl-s"],[101,102,"pl-s"],[102,117,"pl-c1"],[117,118,"pl-s"],[124,125,"pl-s"],[141,142,"pl-s"],[142,143,"pl-s"],[143,188,"pl-corl"],[188,189,"pl-s"],[204,205,"pl-s"],[205,216,"pl-c1"],[216,217,"pl-s"],[489,490,"pl-s"],[490,504,"pl-c1"],[504,505,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,42,"pl-c"],[0,1,"pl-c"]],[[24,25,"pl-c1"]],[],[[0,22,"pl-c"],[0,1,"pl-c"]],[[24,25,"pl-c1"]],[],[[0,42,"pl-c"],[0,1,"pl-c"]],[[24,25,"pl-c1"]],[],[[0,37,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[16,18,"pl-s"]],[],[[0,2,"pl-s"],[6,7,"pl-s"],[7,13,"pl-c1"],[13,14,"pl-s"],[19,21,"pl-s"]],[],[[0,2,"pl-s"],[17,19,"pl-s"]],[],[[4,5,"pl-s"],[5,19,"pl-c1"],[19,20,"pl-s"],[69,70,"pl-s"],[83,84,"pl-s"],[84,85,"pl-s"],[85,124,"pl-corl"],[124,125,"pl-s"]],[],[[0,1,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,48,"pl-corl"],[48,49,"pl-s"],[52,53,"pl-s"],[56,57,"pl-s"],[57,58,"pl-s"],[58,103,"pl-corl"],[103,104,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[52,58,"pl-ent"],[61,68,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[24,64,"pl-c"],[24,25,"pl-c"]],[[17,18,"pl-k"],[22,23,"pl-k"],[24,54,"pl-c"],[24,25,"pl-c"]],[[24,59,"pl-c"],[24,25,"pl-c"]],[[24,63,"pl-c"],[24,25,"pl-c"]],[[0,3,"pl-s"]],[],[[4,5,"pl-s"],[5,35,"pl-c1"],[35,36,"pl-s"],[66,67,"pl-s"],[67,87,"pl-c1"],[87,88,"pl-s"]],[[2,9,"pl-ent"]],[],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[56,62,"pl-ent"],[65,72,"pl-ent"]],[],[[65,66,"pl-s"],[66,93,"pl-c1"],[93,94,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[7,8,"pl-s"],[8,47,"pl-c1"],[47,48,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[34,35,"pl-s"],[47,48,"pl-s"],[48,49,"pl-s"],[49,64,"pl-corl"],[64,65,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[74,80,"pl-ent"],[83,90,"pl-ent"]],[],[[0,2,"pl-s"],[15,16,"pl-s"],[16,23,"pl-c1"],[23,24,"pl-s"],[34,35,"pl-s"],[35,61,"pl-c1"],[61,62,"pl-s"],[63,65,"pl-s"],[104,105,"pl-s"],[105,121,"pl-c1"],[121,122,"pl-s"],[210,211,"pl-s"],[211,214,"pl-s"],[212,214,"pl-corl"],[214,215,"pl-s"],[215,216,"pl-s"],[216,257,"pl-corl"],[257,258,"pl-s"],[260,261,"pl-s"],[261,264,"pl-s"],[262,264,"pl-corl"],[264,265,"pl-s"],[265,266,"pl-s"],[266,307,"pl-corl"],[307,308,"pl-s"],[310,311,"pl-s"],[311,315,"pl-s"],[312,315,"pl-corl"],[315,316,"pl-s"],[316,317,"pl-s"],[317,359,"pl-corl"],[359,360,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[68,74,"pl-ent"],[77,84,"pl-ent"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[74,75,"pl-s"],[75,111,"pl-c1"],[111,112,"pl-s"],[118,119,"pl-s"],[119,143,"pl-c1"],[143,144,"pl-s"],[187,188,"pl-s"],[188,205,"pl-c1"],[205,206,"pl-s"],[357,358,"pl-s"],[358,391,"pl-c1"],[391,392,"pl-s"]],[[2,9,"pl-ent"]],[],[[14,15,"pl-s"],[33,34,"pl-s"],[34,35,"pl-s"],[35,53,"pl-corl"],[53,54,"pl-s"],[131,132,"pl-s"],[155,156,"pl-s"],[156,157,"pl-s"],[157,180,"pl-corl"],[180,181,"pl-s"]],[],[[0,16,"pl-mh"],[3,16,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,15,"pl-c"],[0,1,"pl-c"]],[],[],[[0,27,"pl-c"],[0,1,"pl-c"]],[],[],[],[[0,3,"pl-s"]],[],[[0,13,"pl-mh"],[3,13,"pl-en"]],[],[[122,123,"pl-s"],[123,136,"pl-s"],[124,136,"pl-corl"],[136,137,"pl-s"],[137,138,"pl-s"],[138,164,"pl-corl"],[164,165,"pl-s"],[173,174,"pl-s"],[185,186,"pl-s"],[186,187,"pl-s"],[187,206,"pl-corl"],[206,207,"pl-s"]],[],[],[],[[0,24,"pl-mh"],[3,24,"pl-en"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[39,45,"pl-ent"],[48,55,"pl-ent"]],[],[[139,140,"pl-s"],[151,152,"pl-s"],[152,153,"pl-s"],[153,164,"pl-corl"],[164,165,"pl-s"]],[],[],[],[[1,6,"pl-ent"]],[[1,3,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"],[32,33,"pl-ent"],[34,38,"pl-e"],[39,40,"pl-s"],[40,65,"pl-s"],[65,66,"pl-s"],[68,74,"pl-ent"],[84,90,"pl-ent"],[92,94,"pl-ent"],[98,101,"pl-ent"],[139,142,"pl-ent"],[145,146,"pl-ent"],[149,151,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"],[32,33,"pl-ent"],[34,38,"pl-e"],[39,40,"pl-s"],[40,76,"pl-s"],[76,77,"pl-s"],[79,85,"pl-ent"],[99,105,"pl-ent"],[107,109,"pl-ent"],[113,116,"pl-ent"],[136,139,"pl-ent"],[142,143,"pl-ent"],[146,148,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"],[32,33,"pl-ent"],[34,38,"pl-e"],[39,40,"pl-s"],[40,83,"pl-s"],[83,84,"pl-s"],[86,92,"pl-ent"],[104,110,"pl-ent"],[112,114,"pl-ent"],[118,121,"pl-ent"],[123,128,"pl-c1"],[124,127,"pl-k"],[157,160,"pl-ent"],[163,164,"pl-ent"],[167,169,"pl-ent"]],[[1,3,"pl-ent"],[4,9,"pl-e"],[10,11,"pl-s"],[11,14,"pl-s"],[14,15,"pl-s"],[16,21,"pl-e"],[22,23,"pl-s"],[23,29,"pl-s"],[29,30,"pl-s"],[32,33,"pl-ent"],[34,38,"pl-e"],[39,40,"pl-s"],[40,73,"pl-s"],[73,74,"pl-s"],[76,82,"pl-ent"],[95,101,"pl-ent"],[103,105,"pl-ent"],[109,112,"pl-ent"],[145,148,"pl-ent"],[151,152,"pl-ent"],[155,157,"pl-ent"]],[[2,4,"pl-ent"]],[[2,7,"pl-ent"]],[],[[0,1,"pl-s"],[17,18,"pl-s"],[18,19,"pl-s"],[19,55,"pl-corl"],[55,56,"pl-s"],[59,60,"pl-s"],[73,74,"pl-s"],[74,75,"pl-s"],[75,86,"pl-corl"],[86,87,"pl-s"],[90,91,"pl-s"],[110,111,"pl-s"],[111,112,"pl-s"],[112,125,"pl-corl"],[125,126,"pl-s"]],[[2,9,"pl-ent"]],[],[[1,8,"pl-ent"]],[[1,8,"pl-ent"],[10,16,"pl-ent"],[31,37,"pl-ent"],[40,47,"pl-ent"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[21,22,"pl-s"],[22,23,"pl-s"],[23,38,"pl-corl"],[38,39,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[26,27,"pl-s"],[27,28,"pl-s"],[28,59,"pl-corl"],[59,60,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[25,26,"pl-s"],[26,27,"pl-s"],[27,57,"pl-corl"],[57,58,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[26,27,"pl-s"],[27,28,"pl-s"],[28,49,"pl-corl"],[49,50,"pl-s"]],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[24,25,"pl-s"],[25,56,"pl-c1"],[56,57,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[25,26,"pl-s"],[26,46,"pl-c1"],[46,47,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,2,"pl-s"],[26,28,"pl-s"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[2,9,"pl-ent"]],[],[[0,8,"pl-mh"],[3,8,"pl-en"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[33,35,"pl-s"],[36,37,"pl-s"],[63,64,"pl-s"],[64,65,"pl-s"],[65,112,"pl-corl"],[112,113,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[30,32,"pl-s"],[33,34,"pl-s"],[59,60,"pl-s"],[60,61,"pl-s"],[61,108,"pl-corl"],[108,109,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[19,21,"pl-s"],[22,23,"pl-s"],[37,38,"pl-s"],[38,39,"pl-s"],[39,62,"pl-corl"],[62,63,"pl-s"],[66,67,"pl-s"],[73,74,"pl-s"],[74,75,"pl-s"],[75,122,"pl-corl"],[122,123,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[11,13,"pl-s"],[14,15,"pl-s"],[15,22,"pl-s"],[16,22,"pl-corl"],[22,23,"pl-s"],[23,24,"pl-s"],[24,44,"pl-corl"],[44,45,"pl-s"]],[],[[0,10,"pl-mh"],[3,10,"pl-en"]],[],[],[],[[0,2,"pl-s"],[69,71,"pl-s"]]],"colorizedLines":null}},"title":"ECC/README.md at main · 96loveslife/ECC","appPayload":{},"meta":{"title":"ECC/README.md at main · 96loveslife/ECC"}}</script>
  <div data-target="react-app.reactRoot"><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <a hidden="" id="code-view-repo-link" href="/96loveslife/ECC" data-discover="true"></a> <div class="d-none"></div><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d" data-component="SplitPageLayout" data-has-sidebar="true"><div class="prc-PageLayout-SidebarWrapper-kLG4B CopilotSidePanelSidebar-module__SidePanel__L3O0C CopilotSidePanelSidebar-module__HiddenSidePanel__TBRGn" style="--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="end" data-sticky="true" data-responsive-variant="fullscreen"><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-SidebarVerticalDivider-0Rl0V" data-component="PageLayout.VerticalDivider" data-variant="line" data-position="end" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="450" aria-valuemax="768" aria-valuenow="544" aria-valuetext="Pane width 544 pixels" tabindex="0"></div></div><div class="prc-PageLayout-Sidebar-iciWg" data-component="SplitPageLayout.Sidebar" data-resizable="true" style="--spacing:var(--spacing-normal);--pane-min-width:450px;--pane-max-width:768px;--pane-width-custom:544px;--pane-width-size:var(--pane-width-custom);--pane-width:544px"><div class="height-full" data-testid="copilot-code-view-side-panel"><div id="copilot-side-panel-content" class="height-full"></div></div></div></div><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div id="repos-file-tree-sidebar" class="CodeViewFileTreeLayout-module__sidebar__n_Aau" tabindex="0"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane__rBZpI ReposFileTreePane-module__HideTree__AYZnm ReposFileTreePane-module__HidePane__VHAVt" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-component="PageLayout.HorizontalDivider" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-component="SplitPageLayout.Pane" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-component="PageLayout.VerticalDivider" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div data-component="SplitPageLayout.Content" class="prc-PageLayout-ContentWrapper-gR9eG"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div class="SharedPageLayout-module__content__IwGAp" data-selector="repos-split-pane-content" id="repos-split-pane-content" tabindex="0"> <!-- --> <div class="container CodeViewHeader-module__Box__JkPOb"><div class="CodeViewHeader-module__StickyHeader__Qn7UN" id="StickyHeader"><div class="CodeViewHeader-module__Box_1__SbNDV"><div class="CodeViewHeader-module__Box_2__TB46f"><div class="react-code-view-header-wrap--narrow CodeViewHeader-module__Box_3__q1zUL"><div class="CodeViewHeader-module__treeToggleWrapper__RQ__9"><h2 class="use-tree-pane-module__Heading__s4QbZ prc-Heading-Heading-MtWFE" data-component="Heading"><button data-component="Button" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1__Svs95" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton__hDOcv ExpandFileTreeButton-module__filesButtonBreakpoint__zEvz3 fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_4lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" data-component="Tooltip" aria-hidden="true" id="_R_4lla9lik5_">Expand file tree</span><div class="d-none"></div></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="main branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">main</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="react-code-view-header-mb--narrow CodeViewHeader-module__Box_5__MQ0hL"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__lg__Rjz0A"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/96loveslife/ECC/tree/main" data-discover="true">ECC</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__lg__Rjz0A prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lla9lik5_">Copy path</span></div></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div><div class="CodeViewHeader-module__FileResultsList__JDzUy"><span class="d-flex FileResultsList-module__FilesSearchBox__ivVkc TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-no-trailing-action="true" data-component="TextInput" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_1cpla9lik5_" aria-hidden="true" data-component="TextInput.LeadingVisual"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_1cpla9lik5_ _R_1cpla9lik5H1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_1cpla9lik5H1_" aria-hidden="true" data-component="TextInput.TrailingVisual"></span></span></div><div class="d-none"></div></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7p9la9lik5_" id="_R_99la9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7p9la9lik5_">More file actions</span></div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7pdla9lik5_" id="_R_9dla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7pdla9lik5_">More file actions</span></div></div></div></div></div></div></div><div class="CodeView-module__contentWrapper__cG2JH"><div class="react-code-view-bottom-padding"><div class="BlobTopBanners-module__Box__v_nvx"></div></div> <div class="d-none"></div><div class="d-flex flex-column border rounded-2 tmp-mb-3 pl-1"><div class="LatestCommit-module__Box__B25ZT"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">History</h2><a data-component="LinkButton" href="/96loveslife/ECC/commits/main/README.md" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><a data-component="LinkButton" aria-label="View commit history for this file." href="/96loveslife/ECC/commits/main/README.md" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="_R_4mlala9lik5_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" role="tooltip" aria-hidden="true" id="_R_4mlala9lik5_">History</span></div></div></div></div></div><div class="d-flex flex-row"><div class="container BlobViewContent-module__blobContainer__DtH2d"><div class="react-code-size-details-banner BlobViewContent-module__codeSizeDetails__e5sUw"><div class="react-code-size-details-banner CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="104 KB" style="--truncate-max-width:100%"><span>2039 lines (1540 loc) · 104 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="main branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">main</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/96loveslife/ECC/tree/main" data-discover="true">ECC</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__md__Wb1Gs prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="sticky-file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lcpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lcpala9lik5_">Copy path</span></div></div></div><button data-component="Button" type="button" class="prc-Button-ButtonBase-9n-Xk FileNameStickyHeader-module__Button__LSEU_ FileNameStickyHeader-module__GoToTopButton__nxAFn" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="BlobViewHeader-module__Box_1__VEmuQ"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2__icUs2"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl__jen2u" data-variant="default" data-size="small" data-component="SegmentedControl"><li class="prc-SegmentedControl-Item-tSCQh" data-selected="" data-component="SegmentedControl.Button"><button aria-pressed="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Preview">Preview</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><div class="d-none"></div><div class="react-code-size-details-in-header CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="104 KB" style="--truncate-max-width:100%"><span>2039 lines (1540 loc) · 104 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/96loveslife/ECC/raw/refs/heads/main/README.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_qaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_qaucpala9lik5_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_eaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_eaucpala9lik5_">Download raw file</span></div></div></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk tmp-mr-2 TableOfContents-module__IconButton__jrlNM prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3ucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_3ucpala9lik5_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkecpala9lik5_" id="_R_kecpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_fkecpala9lik5_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq BlobContent-module__blobContentSectionMarkdown__mPLOK" style="margin-top:46px"><div class="js-snippet-clipboard-copy-unpositioned BlobContent-module__markdownBlob__T8jpG" data-hpc="true" containertiming="hpc"><article class="markdown-body entry-content container-lg" itemprop="text"><p align="center" dir="auto">
  <a target="_blank" rel="noopener noreferrer" href="/96loveslife/ECC/blob/main/assets/hero.png"><img src="/96loveslife/ECC/raw/main/assets/hero.png" alt="ECC - the agent harness operating system" width="100%" style="max-width: 100%;"></a>
</p>
<p align="center" dir="auto">
  <a href="https://www.star-history.com/affaan-m/ecc" rel="nofollow">
    <themed-picture data-catalyst-inline="true"><picture>
      <source media="(prefers-color-scheme: dark)" srcset="https://camo.githubusercontent.com/89e23204f4479e2102777593dd15e472b836635279ecf88fdc7cb07a92e2adcc/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d7472656e64696e67267468656d653d6461726b" data-canonical-src="https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=trending&amp;theme=dark">
      <img src="https://camo.githubusercontent.com/77eabde1160297b928231b6d4f1a52e498f1b8f692d844582833bd7f5953e01e/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d7472656e64696e67" alt="GitHub Trending Repository of the Day" height="46" data-canonical-src="https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=trending">
    </picture></themed-picture>
  </a>
  <a href="https://www.star-history.com/affaan-m/ecc" rel="nofollow">
    <themed-picture data-catalyst-inline="true"><picture>
      <source media="(prefers-color-scheme: dark)" srcset="https://camo.githubusercontent.com/30115847fc806c8e13a20d1073fb4bc867fafb70919765f91fd751372ce9d77e/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d72616e6b267468656d653d6461726b" data-canonical-src="https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=rank&amp;theme=dark">
      <img src="https://camo.githubusercontent.com/3136630c523b4020a57af66c24d84bf23a8a011acbdf3a879359c7e622f14785/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f62616467653f7265706f3d61666661616e2d6d2f45434326747970653d72616e6b" alt="Star History Global Rank" height="46" data-canonical-src="https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=rank">
    </picture></themed-picture>
  </a>
</p>
<p align="center" dir="auto">
  <strong>Language:</strong>
  <a href="/96loveslife/ECC/blob/main/README.md">English</a> |
  <a href="/96loveslife/ECC/blob/main/docs/pt-BR/README.md">Português (Brasil)</a> |
  <a href="/96loveslife/ECC/blob/main/README.zh-CN.md">简体中文</a> |
  <a href="/96loveslife/ECC/blob/main/docs/zh-TW/README.md">繁體中文</a> |
  <a href="/96loveslife/ECC/blob/main/docs/ja-JP/README.md">日本語</a> |
  <a href="/96loveslife/ECC/blob/main/docs/ko-KR/README.md">한국어</a> |
  <a href="/96loveslife/ECC/blob/main/docs/tr/README.md">Türkçe</a> |
  <a href="/96loveslife/ECC/blob/main/docs/ru/README.md">Русский</a> |
  <a href="/96loveslife/ECC/blob/main/docs/vi-VN/README.md">Tiếng Việt</a> |
  <a href="/96loveslife/ECC/blob/main/docs/th/README.md">ไทย</a> |
  <a href="/96loveslife/ECC/blob/main/docs/de-DE/README.md">Deutsch</a> |
  <a href="/96loveslife/ECC/blob/main/docs/es/README.md">Español</a> |
  <a href="/96loveslife/ECC/blob/main/docs/uk-UA/README.md">Українська</a>
</p>
<p align="center" dir="auto">
  <a href="https://discord.gg/36yGMHGFbR" rel="nofollow"><img src="https://camo.githubusercontent.com/77717a21d31c41e48dcfc10bbc055bf8c73689ef7d11e4bb8cabea52844f1cf0/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f313439363634343430303539303039343534303f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465266c6162656c3d446973636f726426636f6c6f723d353836354632" alt="Discord" data-canonical-src="https://img.shields.io/discord/1496644400590094540?logo=discord&amp;logoColor=white&amp;label=Discord&amp;color=5865F2" style="max-width: 100%;"></a>
  <a href="https://ecc.tools" rel="nofollow"><img src="https://camo.githubusercontent.com/1ada92aaab0ab6e0df7f5025ed0b6d8471148bb34cd768dd74ac713ac23cbc74/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f576562736974652d6563632e746f6f6c732d4530373835363f6c6f676f3d676f6f676c656368726f6d65266c6f676f436f6c6f723d7768697465" alt="Website" data-canonical-src="https://img.shields.io/badge/Website-ecc.tools-E07856?logo=googlechrome&amp;logoColor=white" style="max-width: 100%;"></a>
  <a href="https://github.com/apps/ecc-tools"><img src="https://camo.githubusercontent.com/4e91ad3bc3029b083dc5087c99f0b1de828b95dccb029f553a3859136e5bb29d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769744875622532304170702d454343253230546f6f6c732d3138313731373f6c6f676f3d676974687562266c6f676f436f6c6f723d7768697465" alt="GitHub App" data-canonical-src="https://img.shields.io/badge/GitHub%20App-ECC%20Tools-181717?logo=github&amp;logoColor=white" style="max-width: 100%;"></a>
  <a href="/96loveslife/ECC/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="MIT license" data-canonical-src="https://img.shields.io/badge/license-MIT-blue.svg" style="max-width: 100%;"></a>
</p>
<p align="center" dir="auto">
  <a href="https://github.com/affaan-m/ECC"><img src="https://camo.githubusercontent.com/9ab2c0d5048e035817aa6d87e5a8f574a74fbb223dc343b974989ff1c2a0b9e2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f61666661616e2d6d2f4543433f7374796c653d666c6174" alt="GitHub stars" data-canonical-src="https://img.shields.io/github/stars/affaan-m/ECC?style=flat" style="max-width: 100%;"></a>
  <a href="https://github.com/affaan-m/ECC/forks"><img src="https://camo.githubusercontent.com/33a5979991b05c0db1b1fcde6da576ebb0e81554256d88dba83406a1fe2c48b7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f61666661616e2d6d2f4543433f7374796c653d666c6174" alt="GitHub forks" data-canonical-src="https://img.shields.io/github/forks/affaan-m/ECC?style=flat" style="max-width: 100%;"></a>
  <a href="https://github.com/affaan-m/ECC/graphs/contributors"><img src="https://camo.githubusercontent.com/5a0d83fabc720cc81aa3c6732e5760bde825d566dcf467ede3019fd3a2535630/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f61666661616e2d6d2f4543433f7374796c653d666c6174" alt="Contributors" data-canonical-src="https://img.shields.io/github/contributors/affaan-m/ECC?style=flat" style="max-width: 100%;"></a>
  <a href="https://github.com/marketplace/ecc-tools"><img src="https://camo.githubusercontent.com/742364151c03913182f055ebbbcae77890450184ebde87dfd0ae9419f9690b11/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470732533412532462532466170692e6563632e746f6f6c732532466261646765253246696e7374616c6c73266c6f676f3d676974687562" alt="GitHub App installs" data-canonical-src="https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.ecc.tools%2Fbadge%2Finstalls&amp;logo=github" style="max-width: 100%;"></a>
</p>
<p align="center" dir="auto">
  <a href="https://www.npmjs.com/package/ecc-universal" rel="nofollow"><img src="https://camo.githubusercontent.com/02c234671fee6ff50f779d8ddbed321b50ab2decffefd85e3c0ca4181ed80c39/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6563632d756e6976657273616c3f6c6162656c3d6563632d756e6976657273616c266c6f676f3d6e706d" alt="ecc-universal npm downloads" data-canonical-src="https://img.shields.io/npm/dw/ecc-universal?label=ecc-universal&amp;logo=npm" style="max-width: 100%;"></a>
  <a href="https://www.npmjs.com/package/ecc-agentshield" rel="nofollow"><img src="https://camo.githubusercontent.com/ee6c87f7675899b8498f57a5a0ae75ab6196e6f8a7bb74651e36d52740e94255/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f6563632d6167656e74736869656c643f6c6162656c3d6563632d6167656e74736869656c64266c6f676f3d6e706d" alt="ecc-agentshield npm downloads" data-canonical-src="https://img.shields.io/npm/dw/ecc-agentshield?label=ecc-agentshield&amp;logo=npm" style="max-width: 100%;"></a>
</p>
<p align="center" dir="auto">
  <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/47d7f79e8524602f5b32c57347c8302258c70edb254c31655ab99452165cfcc0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5368656c6c2d3445414132353f6c6f676f3d676e752d62617368266c6f676f436f6c6f723d7768697465"><img src="https://camo.githubusercontent.com/47d7f79e8524602f5b32c57347c8302258c70edb254c31655ab99452165cfcc0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5368656c6c2d3445414132353f6c6f676f3d676e752d62617368266c6f676f436f6c6f723d7768697465" alt="Shell" data-canonical-src="https://img.shields.io/badge/-Shell-4EAA25?logo=gnu-bash&amp;logoColor=white" style="max-width: 100%;"></a>
  <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/10350e1c35e1cdfee8ae471db125c23bd37448d6fec75b7baf39edb6f351482a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d547970655363726970742d3331373843363f6c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465"><img src="https://camo.githubusercontent.com/10350e1c35e1cdfee8ae471db125c23bd37448d6fec75b7baf39edb6f351482a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d547970655363726970742d3331373843363f6c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript" data-canonical-src="https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript&amp;logoColor=white" style="max-width: 100%;"></a>
  <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/75f630e9fdd61ed09f6651d5e22192b7b90dd55b80d52f70145b2f5e693e6197/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d507974686f6e2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"><img src="https://camo.githubusercontent.com/75f630e9fdd61ed09f6651d5e22192b7b90dd55b80d52f70145b2f5e693e6197/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d507974686f6e2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python" data-canonical-src="https://img.shields.io/badge/-Python-3776AB?logo=python&amp;logoColor=white" style="max-width: 100%;"></a>
  <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/166dcd0f9ef7af21be18a1c8b5a39b1c8bf5aa881032a24e0fa1f566196d6a92/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d476f2d3030414444383f6c6f676f3d676f266c6f676f436f6c6f723d7768697465"><img src="https://camo.githubusercontent.com/166dcd0f9ef7af21be18a1c8b5a39b1c8bf5aa881032a24e0fa1f566196d6a92/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d476f2d3030414444383f6c6f676f3d676f266c6f676f436f6c6f723d7768697465" alt="Go" data-canonical-src="https://img.shields.io/badge/-Go-00ADD8?logo=go&amp;logoColor=white" style="max-width: 100%;"></a>
  <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/79f88e1f86ed963337905d6efe3a263af5f2e297b3f2f2a51f2dbc95f77d64aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4a6176612d4544384230303f6c6f676f3d6f70656e6a646b266c6f676f436f6c6f723d7768697465"><img src="https://camo.githubusercontent.com/79f88e1f86ed963337905d6efe3a263af5f2e297b3f2f2a51f2dbc95f77d64aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4a6176612d4544384230303f6c6f676f3d6f70656e6a646b266c6f676f436f6c6f723d7768697465" alt="Java" data-canonical-src="https://img.shields.io/badge/-Java-ED8B00?logo=openjdk&amp;logoColor=white" style="max-width: 100%;"></a>
  <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5b8542cc58a252055e3d55d8d08c6164afad743f44b05a6d0b1bd1d3979f6743/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5065726c2d3339343537453f6c6f676f3d7065726c266c6f676f436f6c6f723d7768697465"><img src="https://camo.githubusercontent.com/5b8542cc58a252055e3d55d8d08c6164afad743f44b05a6d0b1bd1d3979f6743/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d5065726c2d3339343537453f6c6f676f3d7065726c266c6f676f436f6c6f723d7768697465" alt="Perl" data-canonical-src="https://img.shields.io/badge/-Perl-39457E?logo=perl&amp;logoColor=white" style="max-width: 100%;"></a>
  <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7ccf587ad1350a6018f00f16cfa83000bbc186e4f713e0fd63ed79f43dd6e1d9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4d61726b646f776e2d3030303030303f6c6f676f3d6d61726b646f776e266c6f676f436f6c6f723d7768697465"><img src="https://camo.githubusercontent.com/7ccf587ad1350a6018f00f16cfa83000bbc186e4f713e0fd63ed79f43dd6e1d9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2d4d61726b646f776e2d3030303030303f6c6f676f3d6d61726b646f776e266c6f676f436f6c6f723d7768697465" alt="Markdown" data-canonical-src="https://img.shields.io/badge/-Markdown-000000?logo=markdown&amp;logoColor=white" style="max-width: 100%;"></a>
</p>
<div class="markdown-alert markdown-alert-warning" dir="auto"><p class="markdown-alert-title" dir="auto"><svg data-component="Octicon" class="octicon octicon-alert mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Warning</p><p dir="auto"><strong>Official sources only.</strong> Install ECC only from verified channels: the GitHub repository <a href="https://github.com/affaan-m/ECC">github.com/affaan-m/ECC</a>, the npm packages <a href="https://www.npmjs.com/package/ecc-universal" rel="nofollow"><code>ecc-universal</code></a> and <a href="https://www.npmjs.com/package/ecc-agentshield" rel="nofollow"><code>ecc-agentshield</code></a>, the <a href="https://github.com/apps/ecc-tools">GitHub App</a>, the plugin slug <code>ecc@ecc</code>, and the project website <a href="https://ecc.tools" rel="nofollow">ecc.tools</a>. Third-party re-uploads and unofficial mirrors are not maintained or reviewed by the project and may contain malware.</p>
</div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Install with Claude Code</h2><a id="user-content-install-with-claude-code" class="anchor" aria-label="Permalink: Install with Claude Code" href="#install-with-claude-code"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Use the <a href="#install-ecc">guided setup</a> or <a href="#claude-code-details">native plugin commands</a>. Both install the same <code>ecc@ecc</code> plugin. Choose one and do not stack a full manual Claude install on top.</p>
<div align="center" dir="auto">
<markdown-accessiblity-table><table aria-label="ECC primary links">
<tbody><tr>
<td width="33%" align="center">
  <a href="https://ecc.tools/pricing" rel="nofollow">
    <img src="/96loveslife/ECC/raw/main/assets/images/community/ecc-tools-mark.svg" height="42" alt="ECC Tools" style="max-width: 100%; height: auto; max-height: 42px;"><br>
    <strong>ECC Pro + GitHub App</strong>
  </a><br>
  <sub><a href="https://github.com/apps/ecc-tools">Install free</a> · <a href="https://ecc.tools/pricing" rel="nofollow">Private repos from $19/seat/mo</a></sub>
</td>
<td width="33%" align="center">
  <a href="https://github.com/sponsors/affaan-m">
    <img src="/96loveslife/ECC/raw/main/assets/images/community/heart.svg" height="42" alt="" style="max-width: 100%; height: auto; max-height: 42px;"><br>
    <strong>Sponsor ECC</strong>
  </a><br>
  <sub>Fund the open-source project</sub>
</td>
<td width="33%" align="center">
  <a href="https://discord.gg/36yGMHGFbR" rel="nofollow">
    <img src="/96loveslife/ECC/raw/main/assets/images/community/discord.svg" height="42" alt="Discord" style="max-width: 100%; height: auto; max-height: 42px;"><br>
    <strong>Community</strong>
  </a><br>
  <sub>Discord · Q&amp;A · Show and Tell</sub>
</td>
</tr>
</tbody></table></markdown-accessiblity-table>
</div>
<p dir="auto"><sub><strong>OSS stays free.</strong> This repo is MIT-licensed forever. ECC Pro is the hosted GitHub App for private repos. <a href="https://github.com/sponsors/affaan-m">Sponsors</a> and <a href="https://ecc.tools/pricing" rel="nofollow">Pro subscribers</a> fund the work. That's why a single maintainer ships weekly across 7 harnesses.</sub></p>
<div align="center" dir="auto">
<p dir="auto"><sub><strong>Partners &amp; sponsors</strong></sub></p>
<p align="center" dir="auto">
  <a href="https://www.coderabbit.ai" title="CodeRabbit" rel="nofollow"><img src="/96loveslife/ECC/raw/main/assets/images/sponsors/coderabbit.png" height="54" alt="CodeRabbit" style="max-width: 100%; height: auto; max-height: 54px;"></a>   
  <a href="https://www.greptile.com/go/ecc" title="Greptile" rel="nofollow"><img src="/96loveslife/ECC/raw/main/assets/images/sponsors/greptile.png" height="54" alt="Greptile" style="max-width: 100%; height: auto; max-height: 54px;"></a>   
  <a href="https://platform.kimi.ai?aff=ecc" title="Moonshot AI - Kimi" rel="nofollow"><themed-picture data-catalyst-inline="true"><picture><source media="(prefers-color-scheme: dark)" srcset="/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot-dark.png"><img src="/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot.png" width="132" alt="Moonshot AI - Kimi"></picture></themed-picture></a>   
  <a href="https://compute.itomarkets.com" title="Itô Markets" rel="nofollow"><themed-picture data-catalyst-inline="true"><picture><source media="(prefers-color-scheme: light)" srcset="/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent-light.png"><img src="/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent.png" width="96" alt="Itô Markets"></picture></themed-picture></a>   
  <a href="https://serpapi.com/github-ecc" title="SerpApi: Web Search API" rel="nofollow"><themed-picture data-catalyst-inline="true"><picture><source media="(prefers-color-scheme: dark)" srcset="/96loveslife/ECC/raw/main/assets/images/sponsors/serpapi-logo-dark-mode.svg"><img src="/96loveslife/ECC/raw/main/assets/images/sponsors/serpapi-logo-light-mode.svg" width="200" alt="SerpApi: Web Search API"></picture></themed-picture></a>
</p>
<p dir="auto"><sub><strong>Past sponsors:</strong> <a href="https://www.atlascloud.ai/?utm_source=github&amp;utm_medium=link&amp;utm_campaign=ECC" rel="nofollow">Atlas Cloud</a></sub></p>
<p dir="auto"><sub><strong>Community sponsors:</strong> <a href="https://github.com/mikejmorgan-ai">Mike Morgan</a> · <a href="https://github.com/jasonwu513">@jasonwu513</a> · <a href="https://github.com/1anter">@1anter</a> · <a href="https://github.com/massimotodaro">@massimotodaro</a> · <a href="https://github.com/meadmccabe">@meadmccabe</a></sub></p>
<p dir="auto"><sub><a href="https://github.com/sponsors/affaan-m"><strong>Become a Sponsor</strong></a> · <a href="/96loveslife/ECC/blob/main/SPONSORS.md">Sponsor Tiers</a> · <a href="/96loveslife/ECC/blob/main/SPONSORING.md">Sponsorship Program</a></sub></p>
</div>
<p align="center" dir="auto"><a href="#install-ecc">Jump to install ↓</a></p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">ECC</h1><a id="user-content-ecc" class="anchor" aria-label="Permalink: ECC" href="#ecc"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Your agent can write code, but ECC gives it a coordinated engineering system and toolbox: it plans before it builds, verifies changes with tests, reviews its own work from a fresh context, remembers what matters, and turns repeated wins into reusable skills and workflows.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="plan -&gt; test -&gt; implement -&gt; review -&gt; verify -&gt; remember -&gt; improve"><pre lang="text" class="notranslate"><code>plan -&gt; test -&gt; implement -&gt; review -&gt; verify -&gt; remember -&gt; improve
</code></pre></div>
<p dir="auto">Instead of rebuilding that process in every prompt, you install it once and make it part of how your agent works.</p>
<blockquote>
<p dir="auto">Optimize the context window. Persist everything else.</p>
</blockquote>
<p dir="auto">ECC is MIT-licensed open source. It works best with Claude Code today, has a supported Codex sync path, and provides capability-limited adapters for Cursor, OpenCode, Gemini, Zed, GitHub Copilot, Antigravity, Qwen, and other harnesses. See the <a href="#platform-support">support status matrix</a> before assuming feature parity.</p>
<p dir="auto">Access to 68 agents, 292 skills, and 94 legacy command shims, plus hooks, rules, memory, continuous learning, and AgentShield security scanning. The agents are specialized for planning, review, build repair, security, architecture, and domain work.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Included</th>
<th align="right">Count</th>
<th>What it gives you</th>
</tr>
</thead>
<tbody>
<tr>
<td>Agents</td>
<td align="right">68 agents</td>
<td>Planning, review, build repair, security, architecture, and domain work</td>
</tr>
<tr>
<td>Skills</td>
<td align="right">292 skills</td>
<td>TDD, research, security, docs, frontend, data, ML, operations, and more</td>
</tr>
<tr>
<td>Commands</td>
<td align="right">94 commands</td>
<td>Convenient entry points while ECC moves to a skills-first surface</td>
</tr>
<tr>
<td>Hooks and memory</td>
<td align="right">Runtime</td>
<td>Enforcement, session summaries, continuous learning, instincts, and context controls</td>
</tr>
<tr>
<td>Rules</td>
<td align="right">Selective</td>
<td>Always-loaded standards you choose by language or project</td>
</tr>
<tr>
<td>AgentShield</td>
<td align="right">Included</td>
<td>Scanning for prompts, hooks, MCP config, permissions, secrets, and agent files</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p align="center" dir="auto">
  <a href="https://www.star-history.com/affaan-m/ecc" rel="nofollow">
    <themed-picture data-catalyst-inline="true"><picture>
      <source media="(prefers-color-scheme: dark)" srcset="https://camo.githubusercontent.com/5f9c74099d0017cc0bdd72d85ac3832f241a94c7263f0ba56f1a39feb1fb845a/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d61666661616e2d6d2f45434326747970653d44617465267468656d653d6461726b" data-canonical-src="https://api.star-history.com/svg?repos=affaan-m/ECC&amp;type=Date&amp;theme=dark">
      <img src="https://camo.githubusercontent.com/17589e705dc9b9e877e7e45acb7281c298fdc5a55f3e86d61fa1acf10677493a/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d61666661616e2d6d2f45434326747970653d44617465" alt="Live star history chart for affaan-m/ECC" width="100%" data-canonical-src="https://api.star-history.com/svg?repos=affaan-m/ECC&amp;type=Date">
    </picture></themed-picture>
  </a>
</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Install ECC</h2><a id="user-content-install-ecc" class="anchor" aria-label="Permalink: Install ECC" href="#install-ecc"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-alert markdown-alert-important" dir="auto"><p class="markdown-alert-title" dir="auto"><svg data-component="Octicon" class="octicon octicon-report mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Important</p><p dir="auto">ECC 2.2 includes guided package setup for Claude Code, Codex, and Kimi Code.
The universal package requires Node.js 18 or newer. Claude plugin setup also
requires Git and Claude Code 2.1 or newer on <code>PATH</code>.</p>
</div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Recommended: universal guided setup</h3><a id="user-content-recommended-universal-guided-setup" class="anchor" aria-label="Permalink: Recommended: universal guided setup" href="#recommended-universal-guided-setup"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">For Claude Code plugin setup, updates, scope changes, and hook-profile changes:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 setup"><pre>npx ecc-universal@2.2.2 setup</pre></div>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Windows first-time walkthrough</h4><a id="user-content-windows-first-time-walkthrough" class="anchor" aria-label="Permalink: Windows first-time walkthrough" href="#windows-first-time-walkthrough"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">If you are new to command-line tools, use this copy-and-paste path:</p>
<ol dir="auto">
<li>
<p dir="auto">Install Node.js 18 or newer, Git, and Claude Code.</p>
</li>
<li>
<p dir="auto">Open <strong>PowerShell</strong> from the Windows Start menu.</p>
</li>
<li>
<p dir="auto">Confirm that each prerequisite is available:</p>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="node --version
git --version
claude --version"><pre>node <span class="pl-k">--</span>version
git <span class="pl-k">--</span>version
claude <span class="pl-k">--</span>version</pre></div>
</li>
<li>
<p dir="auto">Run the guided installer:</p>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 setup"><pre>npx ecc<span class="pl-k">-</span>universal<span class="pl-smi">@2<span class="pl-smi">.2.2</span></span> setup</pre></div>
</li>
<li>
<p dir="auto">For a typical personal setup, choose <strong>Global user</strong>, choose <strong>Standard</strong> hooks, and confirm.</p>
</li>
<li>
<p dir="auto">Start a new Claude Code session and run <code>/plugin list</code> to verify that <code>ecc@ecc</code> is enabled.</p>
</li>
</ol>
<p dir="auto">This path does not require cloning the repository. If any prerequisite command is not found, install or repair that prerequisite before rerunning ECC setup.</p>
<p dir="auto">If npm reports a version or cache error, confirm the registry version before retrying:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npm view ecc-universal version"><pre>npm view ecc-universal version</pre></div>
<p dir="auto">ECC 2.2 supports the same guided setup through modern package runners:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Package runner</th>
<th>Guided setup command</th>
</tr>
</thead>
<tbody>
<tr>
<td>npm / npx</td>
<td><code>npx ecc-universal@2.2.2 setup</code></td>
</tr>
<tr>
<td>pnpm</td>
<td><code>pnpm dlx ecc-universal@2.2.2 setup</code></td>
</tr>
<tr>
<td>Yarn 2+</td>
<td><code>yarn dlx ecc-universal@2.2.2 setup</code></td>
</tr>
<tr>
<td>Bun</td>
<td><code>bunx ecc-universal@2.2.2 setup</code></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">The examples select <a href="https://www.npmjs.com/package/ecc-universal/v/2.2.2" rel="nofollow">the published ECC 2.2.2 release</a>, matching this repository's release version. A version pin is not a security audit or an integrity check. Review the release source and registry integrity before running package code; use a reviewed checkout for unreleased changes.</p>
<p dir="auto">Yarn Classic 1 does not provide <code>yarn dlx</code>; use <code>npx</code>, install the package globally, or upgrade Yarn for a temporary one-shot run.</p>
<p dir="auto">The wizard inventories the official marketplace and every native Claude install scope before making changes, then installs, updates, or safely moves <code>ecc@ecc</code> to the scope you choose. Rerun the same command whenever you want to update ECC, change scope, or change its hook profile. This setup wizard currently configures the Claude Code plugin; use the multi-harness wizard below for Codex or Kimi Code.</p>
<p dir="auto">To configure more than one coding agent in one reviewed flow, use the multi-harness wizard:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 install --guided"><pre>npx ecc-universal@2.2.2 install --guided</pre></div>
<p dir="auto">It lets you select any combination of Claude Code, Codex, and Kimi Code, shows each install channel and destination, preflights every selection before the first write, and asks for one final confirmation.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Harness</th>
<th>Guided install behavior</th>
</tr>
</thead>
<tbody>
<tr>
<td>Claude Code</td>
<td>Native <code>ecc@ecc</code> plugin with one <code>user</code>, <code>project</code>, or <code>local</code> scope and an ECC hook profile</td>
</tr>
<tr>
<td>Codex</td>
<td>Native Codex marketplace/plugin lifecycle; hook review and trust remain Codex-owned</td>
</tr>
<tr>
<td>Kimi Code</td>
<td>Managed project files under <code>./.kimi-code</code>; ECC hooks, model/provider settings, and authentication are not configured</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">For automation, make every provider-specific choice explicit:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 install --guided \
  --harness claude --harness codex --harness kimi \
  --claude-scope local --claude-hooks standard \
  --profile core --yes"><pre>npx ecc-universal@2.2.2 install --guided \
  --harness claude --harness codex --harness kimi \
  --claude-scope <span class="pl-k">local</span> --claude-hooks standard \
  --profile core --yes</pre></div>
<p dir="auto">Verify the native guided Codex path and managed Kimi path without writing first:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 install --guided --harness codex --dry-run
npx ecc-universal@2.2.2 install --profile core --target kimi --dry-run"><pre>npx ecc-universal@2.2.2 install --guided --harness codex --dry-run
npx ecc-universal@2.2.2 install --profile core --target kimi --dry-run</pre></div>
<p dir="auto">Additional package-name commands are also available through the 2.2 alias:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 consult &quot;security reviews&quot; --target claude
npx ecc-universal@2.2.2 install --profile minimal --target claude --with capability:machine-learning
npx ecc-universal@2.2.2 doctor --target kimi"><pre>npx ecc-universal@2.2.2 consult <span class="pl-s"><span class="pl-pds">"</span>security reviews<span class="pl-pds">"</span></span> --target claude
npx ecc-universal@2.2.2 install --profile minimal --target claude --with capability:machine-learning
npx ecc-universal@2.2.2 doctor --target kimi</pre></div>
<p dir="auto">Do not use <code>npx ecc-install --profile minimal --target claude</code>: <code>ecc-install</code> is a binary name inside <code>ecc-universal</code>, not a separately published npm package.</p>
<p dir="auto">ECC also ships advanced managed adapters for <code>cursor</code>, <code>antigravity</code>, <code>gemini</code>, <code>opencode</code>, <code>codebuddy</code>, <code>joycode</code>, <code>qwen</code>, <code>zed</code>, <code>hermes</code>, and <code>openclaw</code>. Those targets still use their documented <code>ecc install --target ...</code> paths until each adapter has passed the guided collision, update, repair, and uninstall lifecycle matrix. Neither wizard silently installs into every detected harness.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Pick one path only (per harness)</h3><a id="user-content-pick-one-path-only-per-harness" class="anchor" aria-label="Permalink: Pick one path only (per harness)" href="#pick-one-path-only-per-harness"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">You can use ECC with Claude Code, Codex, and other harnesses at the same time. Choose one install method for each harness:</p>
<ul dir="auto">
<li><strong>Recommended default:</strong> run the guided Claude plugin setup above</li>
<li><strong>Also supported for Claude Code:</strong> use the <a href="#claude-code-details">native plugin commands</a></li>
<li><strong>Available in release 2.2:</strong> guided package setup for Claude Code, Codex, and Kimi Code</li>
<li><strong>Works:</strong> Claude Code plugin + Codex native plugin</li>
<li><strong>Works:</strong> Claude Code plugin + the legacy Codex sync flow</li>
<li><strong>Avoid:</strong> Claude Code plugin + full Claude manual install</li>
<li><strong>Avoid:</strong> Codex sync + Codex marketplace plugin</li>
</ul>
<p dir="auto"><strong>Do not stack install methods.</strong> Installing ECC twice into the same harness can duplicate skills, commands, hooks, or configuration; installing it once into multiple harnesses does not.</p>
<p dir="auto">If you already layered multiple installs and things look duplicated, skip straight to <a href="#reset--uninstall-ecc">Reset / Uninstall ECC</a>.</p>
<p dir="auto"><strong>Install trouble?</strong> Open the short <a href="https://github.com/affaan-m/ECC/issues/new?template=install-problem.yml">install or runtime problem form</a>, or run <code>ecc feedback</code>. ECC never uploads diagnostics automatically.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Claude Code details</h3><a id="user-content-claude-code-details" class="anchor" aria-label="Permalink: Claude Code details" href="#claude-code-details"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Alternatively, run Claude Code's native plugin commands inside Claude Code:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/plugin marketplace add https://github.com/affaan-m/ECC
/plugin install ecc@ecc"><pre lang="text" class="notranslate"><code>/plugin marketplace add https://github.com/affaan-m/ECC
/plugin install ecc@ecc
</code></pre></div>
<p dir="auto">The native path installs ECC's skills, agents, commands, and plugin-managed hooks. If you choose it, stop there. Do not also run a full manual install into Claude Code.</p>
<p dir="auto">Claude Code owns these built-in commands, including their errors when a marketplace, plugin, or conflicting scope already exists. ECC cannot intercept that parser. If either native command reports an existing install or scope conflict, use the 2.2 guided setup or resolve the conflicting Claude plugin scope before retrying; do not layer a manual install on top.</p>
<p dir="auto">After ECC is installed, <code>/ecc:configure-ecc</code> is the namespaced in-Claude reconfiguration skill. It delegates to the same safe setup flow, but it is available only after the plugin is installed and cannot replace Claude Code's built-in <code>/plugin</code> command during a first install.</p>
<p dir="auto">Claude Code plugins cannot distribute <code>rules</code>, so add only the rule packs you actually want:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/affaan-m/ECC.git
cd ECC
mkdir -p ~/.claude/rules/ecc
cp -R rules/common ~/.claude/rules/ecc/
cp -R rules/typescript ~/.claude/rules/ecc/  # replace with your stack"><pre>git clone https://github.com/affaan-m/ECC.git
<span class="pl-c1">cd</span> ECC
mkdir -p <span class="pl-k">~</span>/.claude/rules/ecc
cp -R rules/common <span class="pl-k">~</span>/.claude/rules/ecc/
cp -R rules/typescript <span class="pl-k">~</span>/.claude/rules/ecc/  <span class="pl-c"><span class="pl-c">#</span> replace with your stack</span></pre></div>
<p dir="auto">Start with <code>rules/common</code> plus one language or framework pack you actually use. If you install the plugin, do not run <code>./install.sh --profile full</code> afterward.</p>
<details>
<summary><strong>Prefer settings.json? Add the marketplace declaratively</strong></summary>
<p dir="auto">Add directly to your <code>~/.claude/settings.json</code>:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;extraKnownMarketplaces&quot;: {
    &quot;ecc&quot;: {
      &quot;source&quot;: {
        &quot;source&quot;: &quot;github&quot;,
        &quot;repo&quot;: &quot;affaan-m/ECC&quot;
      }
    }
  },
  &quot;enabledPlugins&quot;: {
    &quot;ecc@ecc&quot;: true
  }
}"><pre>{
  <span class="pl-ent">"extraKnownMarketplaces"</span>: {
    <span class="pl-ent">"ecc"</span>: {
      <span class="pl-ent">"source"</span>: {
        <span class="pl-ent">"source"</span>: <span class="pl-s"><span class="pl-pds">"</span>github<span class="pl-pds">"</span></span>,
        <span class="pl-ent">"repo"</span>: <span class="pl-s"><span class="pl-pds">"</span>affaan-m/ECC<span class="pl-pds">"</span></span>
      }
    }
  },
  <span class="pl-ent">"enabledPlugins"</span>: {
    <span class="pl-ent">"ecc@ecc"</span>: <span class="pl-c1">true</span>
  }
}</pre></div>
<p dir="auto">This gives you the same result as the two <code>/plugin</code> commands above.</p>
</details>
<details>
<summary><strong>Naming + migration note (ecc@ecc, affaan-m/ECC, ecc-universal)</strong></summary>
<p dir="auto">ECC has three public identifiers, and they are not interchangeable:</p>
<ul dir="auto">
<li>GitHub source repo: <code>affaan-m/ECC</code></li>
<li>Claude marketplace/plugin identifier: <code>ecc@ecc</code></li>
<li>npm package: <code>ecc-universal</code></li>
</ul>
<p dir="auto">This is intentional. Anthropic marketplace/plugin installs are keyed by a canonical plugin identifier, so ECC uses <code>ecc@ecc</code> to keep tool names and slash-command namespaces short enough for strict Desktop/API validators. Older posts may still show the former long marketplace identifier; treat that as a legacy alias only. Separately, the npm package stayed on <code>ecc-universal</code>, so npm installs and marketplace installs intentionally use different names.</p>
<p dir="auto">npm releases are cut per version tag, not per commit, so <code>ecc-universal</code> tracks releases (2.1, 2.2, ...) rather than every push to <code>main</code>. Install from git if you want the bleeding edge.</p>
<p dir="auto">If your local Claude setup was wiped or reset, that does not mean you need to repurchase anything. Start with <code>node scripts/ecc.js list-installed</code>, then run <code>node scripts/ecc.js doctor</code> and <code>node scripts/ecc.js repair</code> before reinstalling. That usually restores ECC-managed files without rebuilding your setup.</p>
</details>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Codex App and CLI</h3><a id="user-content-codex-app-and-cli" class="anchor" aria-label="Permalink: Codex App and CLI" href="#codex-app-and-cli"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Current Codex releases can install ECC as a native repo-marketplace plugin. The marketplace entry uses the repository root so Codex's cache receives the manifest together with all referenced skills, MCP configuration, hook runtime, scripts, and assets:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="codex plugin marketplace add affaan-m/ECC
codex plugin add ecc@ecc
codex plugin list --json
node scripts/codex/check-plugin-cache.js"><pre>codex plugin marketplace add affaan-m/ECC
codex plugin add ecc@ecc
codex plugin list --json
node scripts/codex/check-plugin-cache.js</pre></div>
<p dir="auto">Both add commands are idempotent. To refresh later, run <code>codex plugin marketplace upgrade ecc</code> followed by <code>codex plugin add ecc@ecc</code>. Codex stores one enabled plugin state in the active <code>CODEX_HOME</code>; it does not offer Claude's <code>user</code>, <code>project</code>, and <code>local</code> scopes. Its native hooks require an explicit trust decision and do not use Claude's four ECC hook profiles. Inside Codex, invoke <code>$configure-ecc</code> for the guided provider-aware flow.</p>
<p dir="auto">The older <code>scripts/sync-ecc-to-codex.sh</code> path is a deprecated compatibility option for users who intentionally need copied and merged configuration in <code>~/.codex</code>; it is not required for the native plugin. New sync runs write an ownership manifest so cleanup can preserve modified user files. Run Codex once first so <code>~/.codex/config.toml</code> exists, then:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/affaan-m/ECC.git
cd ECC
npm install
bash scripts/sync-ecc-to-codex.sh"><pre>git clone https://github.com/affaan-m/ECC.git
<span class="pl-c1">cd</span> ECC
npm install
bash scripts/sync-ecc-to-codex.sh</pre></div>
<p dir="auto">To inspect or remove that legacy layer without touching Codex conversations or native plugin caches:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="node scripts/ecc.js uninstall --legacy-codex-sync --dry-run
node scripts/ecc.js uninstall --legacy-codex-sync"><pre>node scripts/ecc.js uninstall --legacy-codex-sync --dry-run
node scripts/ecc.js uninstall --legacy-codex-sync</pre></div>
<p dir="auto">Pre-manifest installations are handled conservatively: ECC removes its marked <code>AGENTS.md</code> block but preserves copied files it cannot prove it owns and reports them for review.</p>
<p dir="auto">You can also open the ECC repository directly in Codex for a project-local setup. Codex reads the root <code>AGENTS.md</code> and the trusted project configuration in <code>.codex/</code> without a global sync. Do not add the native marketplace plugin on top of the sync flow.</p>
<p dir="auto">For repo navigation, surface ownership, and PR diff packet guidance, read the <a href="/96loveslife/ECC/blob/main/docs/CODEX-NAVIGATION-GUIDE.md">Codex ECC Navigation Map</a>. See the <a href="/96loveslife/ECC/blob/main/.codex-plugin/README.md">.codex plugin notes</a> for native lifecycle details.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Other agents and editors</h3><a id="user-content-other-agents-and-editors" class="anchor" aria-label="Permalink: Other agents and editors" href="#other-agents-and-editors"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<details>
<summary><strong>Cursor, OpenCode, Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode, Copilot</strong></summary>
<p dir="auto">Clone ECC once, then choose the target that matches your harness:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/affaan-m/ECC.git
cd ECC"><pre>git clone https://github.com/affaan-m/ECC.git
<span class="pl-c1">cd</span> ECC</pre></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Harness</th>
<th>Install or setup</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Cursor</td>
<td><code>./install.sh --profile minimal --target cursor</code></td>
<td>Project-local <code>.cursor/</code> adapter</td>
</tr>
<tr>
<td>OpenCode</td>
<td><code>npm install &amp;&amp; npm run build:opencode &amp;&amp; ./install.sh --profile full --target opencode --enable-hooks</code></td>
<td>Builds the plugin payload before the full install</td>
</tr>
<tr>
<td>Gemini CLI</td>
<td><code>./install.sh --profile minimal --target gemini</code></td>
<td>Project-local <code>.gemini/</code> config</td>
</tr>
<tr>
<td>Zed</td>
<td><code>./install.sh --profile minimal --target zed</code></td>
<td>Project-local <code>.zed/</code> adapter</td>
</tr>
<tr>
<td>Antigravity</td>
<td><code>./install.sh --profile minimal --target antigravity</code></td>
<td>See the <a href="/96loveslife/ECC/blob/main/docs/ANTIGRAVITY-GUIDE.md">Antigravity guide</a></td>
</tr>
<tr>
<td>Qwen CLI</td>
<td><code>./install.sh --profile minimal --target qwen</code></td>
<td>See the <a href="/96loveslife/ECC/blob/main/docs/QWEN-GUIDE.md">Qwen guide</a></td>
</tr>
<tr>
<td>Hermes</td>
<td><code>./install.sh --profile minimal --target hermes</code></td>
<td>See the <a href="/96loveslife/ECC/blob/main/docs/HERMES-SETUP.md">Hermes setup guide</a></td>
</tr>
<tr>
<td>OpenClaw</td>
<td><code>./install.sh --profile minimal --target openclaw</code></td>
<td>Managed home-directory install</td>
</tr>
<tr>
<td>Kimi Code CLI</td>
<td><code>./install.sh --profile minimal --target kimi</code></td>
<td>Project-local <code>.kimi-code/</code> install · <a href="https://www.kimi.com/code?aff=ecc" rel="nofollow">Get Kimi Code</a></td>
</tr>
<tr>
<td>CodeBuddy</td>
<td><code>./install.sh --profile minimal --target codebuddy</code></td>
<td>Project-local <code>.codebuddy/</code> install</td>
</tr>
<tr>
<td>JoyCode</td>
<td><code>./install.sh --profile minimal --target joycode</code></td>
<td>Project-local <code>.joycode/</code> install</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">GitHub Copilot support is already included in this repository. <code>.github/copilot-instructions.md</code> provides the instruction layer, <code>.github/prompts/</code> contains the reusable <code>/plan</code>, <code>/tdd</code>, <code>/security-review</code>, <code>/build-fix</code>, and <code>/refactor</code> prompts, and <code>.vscode/settings.json</code> enables <code>chat.promptFiles</code>.</p>
<p dir="auto">For a harness without a native ECC target, use the <a href="/96loveslife/ECC/blob/main/docs/MANUAL-ADAPTATION-GUIDE.md">manual adaptation guide</a>. It explains how to carry a small set of ECC skills and workflow instructions into chat-style tools without pretending hooks or native skill discovery are available.</p>
<p dir="auto">Cursor installs agent definitions under <code>.cursor/agents/ecc-*.md</code>. Cursor-native loading behavior can vary by Cursor build. ECC does not install root <code>AGENTS.md</code> into <code>.cursor/</code>. The adapter keeps Cursor's context scoped to its native rules and agent surfaces.</p>
<p dir="auto">Deep per-harness notes (feature parity, hook adapters, limitations) live in <a href="#platform-support">Platform Support</a> below.</p>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Advanced Install Options</h2><a id="user-content-advanced-install-options" class="anchor" aria-label="Permalink: Advanced Install Options" href="#advanced-install-options"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<details>
<summary><strong>Low-context install with no hook runtime</strong></summary>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Low-context / no-hooks path</h3><a id="user-content-low-context--no-hooks-path" class="anchor" aria-label="Permalink: Low-context / no-hooks path" href="#low-context--no-hooks-path"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Use this when you want ECC's rules, agents, commands, platform config, and core workflows without runtime hooks:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 install --profile minimal --target claude"><pre>npx ecc-universal@2.2.2 install --profile minimal --target claude</pre></div>
<p dir="auto">From a source checkout, the equivalent command is:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="./install.sh --profile minimal --target claude"><pre>./install.sh --profile minimal --target claude</pre></div>
<p dir="auto">Windows:</p>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=".\install.ps1 --profile minimal --target claude"><pre>.\install.ps1 <span class="pl-k">--</span>profile minimal <span class="pl-k">--</span>target claude</pre></div>
<p dir="auto">This profile intentionally excludes <code>hooks-runtime</code>.</p>
<p dir="auto">Claude manual installs place each skill directly under <code>~/.claude/skills/&lt;skill-name&gt;/</code> (or <code>.claude/skills/&lt;skill-name&gt;/</code> for <code>claude-project</code>) so Claude Code can discover it. When upgrading an older ECC manual install, the installer migrates only nested <code>skills/ecc/</code> files recorded in ECC install-state. If a flat skill directory is user-owned, ECC preserves it, prints a conflict warning, and keeps any older managed copy tracked for a safe uninstall instead of overwriting user files.</p>
<p dir="auto">For the normal core profile with hooks disabled:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="./install.sh --profile core --without baseline:hooks --target claude
./install.sh --profile core --no-hooks --target claude"><pre>./install.sh --profile core --without baseline:hooks --target claude
./install.sh --profile core --no-hooks --target claude</pre></div>
<p dir="auto">Add the hook runtime later only if you want it:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="./install.sh --target claude --modules hooks-runtime --enable-hooks"><pre>./install.sh --target claude --modules hooks-runtime --enable-hooks</pre></div>
<p dir="auto">Any install whose profile or modules would materialize the hook runtime requires
an explicit decision. Without <code>--enable-hooks</code> or <code>--no-hooks</code>, the installer
prints what the hooks can do and stops before writing anything. The guided
installer (<code>ecc install --guided</code>) asks for this choice interactively.</p>
</details>
<details>
<summary><strong>Choose only the components you need</strong></summary>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Find the right components first</h3><a id="user-content-find-the-right-components-first" class="anchor" aria-label="Permalink: Find the right components first" href="#find-the-right-components-first"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Ask the packaged advisor which components match your work:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="node scripts/ecc.js consult &quot;security reviews&quot; --target claude"><pre>node scripts/ecc.js consult <span class="pl-s"><span class="pl-pds">"</span>security reviews<span class="pl-pds">"</span></span> --target claude</pre></div>
<p dir="auto">It returns matching components, related profiles, and preview/install commands. Use the preview command before installing if you want to inspect the exact file plan.</p>
<p dir="auto">You can also install explicit skills or capabilities:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="./install.sh --target claude --skills tdd-workflow,security-review
node scripts/ecc.js install --profile minimal --target claude --with capability:machine-learning"><pre>./install.sh --target claude --skills tdd-workflow,security-review
node scripts/ecc.js install --profile minimal --target claude --with capability:machine-learning</pre></div>
<p dir="auto">Manual component-by-component copying also works. Each component is fully independent:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Just agents
cp agents/*.md ~/.claude/agents/

# Rules directories (common + language-specific)
mkdir -p ~/.claude/rules/ecc
cp -r rules/common ~/.claude/rules/ecc/
cp -r rules/typescript ~/.claude/rules/ecc/   # pick your stack

# Core/general skills only (Claude Code loads skills from direct children
# of ~/.claude/skills; do not nest manual installs under ~/.claude/skills/ecc/)
mkdir -p ~/.claude/skills
cp -r .agents/skills/* ~/.claude/skills/
cp -r skills/search-first ~/.claude/skills/

# Optional: maintained slash-command compatibility during migration
mkdir -p ~/.claude/commands
cp commands/*.md ~/.claude/commands/"><pre><span class="pl-c"><span class="pl-c">#</span> Just agents</span>
cp agents/<span class="pl-k">*</span>.md <span class="pl-k">~</span>/.claude/agents/

<span class="pl-c"><span class="pl-c">#</span> Rules directories (common + language-specific)</span>
mkdir -p <span class="pl-k">~</span>/.claude/rules/ecc
cp -r rules/common <span class="pl-k">~</span>/.claude/rules/ecc/
cp -r rules/typescript <span class="pl-k">~</span>/.claude/rules/ecc/   <span class="pl-c"><span class="pl-c">#</span> pick your stack</span>

<span class="pl-c"><span class="pl-c">#</span> Core/general skills only (Claude Code loads skills from direct children</span>
<span class="pl-c"><span class="pl-c">#</span> of ~/.claude/skills; do not nest manual installs under ~/.claude/skills/ecc/)</span>
mkdir -p <span class="pl-k">~</span>/.claude/skills
cp -r .agents/skills/<span class="pl-k">*</span> <span class="pl-k">~</span>/.claude/skills/
cp -r skills/search-first <span class="pl-k">~</span>/.claude/skills/

<span class="pl-c"><span class="pl-c">#</span> Optional: maintained slash-command compatibility during migration</span>
mkdir -p <span class="pl-k">~</span>/.claude/commands
cp commands/<span class="pl-k">*</span>.md <span class="pl-k">~</span>/.claude/commands/</pre></div>
<p dir="auto">Retired shims live in <code>legacy-command-shims/</code>. Copy individual files from there only if you still need old names such as <code>/tdd</code>.</p>
</details>
<details>
<summary><strong>Project-local rules instead of global rules</strong></summary>
<p dir="auto">Use project-local rules when ECC's standards should apply to one repository rather than every Claude Code session:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cd your-project
mkdir -p .claude/rules/ecc
cp -R /path/to/ECC/rules/common .claude/rules/ecc/
cp -R /path/to/ECC/rules/typescript .claude/rules/ecc/"><pre><span class="pl-c1">cd</span> your-project
mkdir -p .claude/rules/ecc
cp -R /path/to/ECC/rules/common .claude/rules/ecc/
cp -R /path/to/ECC/rules/typescript .claude/rules/ecc/</pre></div>
<p dir="auto">Rules are always-loaded context, so begin with <code>common</code> and one pack for the stack you actually use. When copying rules manually, copy the whole language directory (for example <code>rules/common</code> or <code>rules/golang</code>), not the files inside it, so relative references keep working and filenames do not collide.</p>
</details>
<details>
<summary><strong>Fully manual Claude install</strong></summary>
<p dir="auto">Use this only when you are intentionally skipping the plugin path:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/affaan-m/ECC.git
cd ECC
./install.sh --profile full"><pre>git clone https://github.com/affaan-m/ECC.git
<span class="pl-c1">cd</span> ECC
./install.sh --profile full</pre></div>
<p dir="auto">Windows:</p>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/affaan-m/ECC.git
cd ECC
.\install.ps1 --profile full"><pre>git clone https:<span class="pl-k">//</span><span class="pl-c1">github.com</span><span class="pl-k">/</span>affaan<span class="pl-k">-</span>m<span class="pl-k">/</span>ECC.git
cd ECC
.\install.ps1 <span class="pl-k">--</span>profile full</pre></div>
<p dir="auto">If you choose this path, stop there. Do not also run <code>/plugin install</code>.</p>
<p dir="auto">For hand-picked manual installs, Claude discovers skills as direct children of <code>~/.claude/skills/</code>; do not nest them under <code>~/.claude/skills/ecc/</code>.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Install hooks</h4><a id="user-content-install-hooks" class="anchor" aria-label="Permalink: Install hooks" href="#install-hooks"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Do not copy the raw repo <code>hooks/hooks.json</code> into <code>~/.claude/settings.json</code> or <code>~/.claude/hooks/hooks.json</code>. That file is plugin/repo-oriented; use the installer so hook command paths are rewritten correctly:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="bash ./install.sh --target claude --modules hooks-runtime --enable-hooks"><pre>bash ./install.sh --target claude --modules hooks-runtime --enable-hooks</pre></div>
<p dir="auto">That installs the hook scripts under <code>~/.claude/</code> and registers the resolved
hook entries in <code>~/.claude/settings.json</code>. Existing user settings and hooks are
preserved; ECC-owned entries are tracked by stable ID for idempotent updates
and safe uninstall.</p>
<p dir="auto">If you installed ECC via <code>/plugin install</code>, do not copy those hooks into <code>settings.json</code>. Claude Code v2.1+ already auto-loads plugin <code>hooks/hooks.json</code>, and duplicating them in <code>settings.json</code> causes duplicate execution and cross-platform hook conflicts.</p>
<p dir="auto">On Windows, Claude's config root is <code>%USERPROFILE%\.claude</code>; install the hook runtime with:</p>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="pwsh -File .\install.ps1 --target claude --modules hooks-runtime --enable-hooks"><pre>pwsh <span class="pl-k">-</span>File .\install.ps1 <span class="pl-k">--</span>target claude <span class="pl-k">--</span>modules hooks<span class="pl-k">-</span>runtime <span class="pl-k">--</span><span class="pl-c1">enable-hooks</span></pre></div>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Configure MCPs</h4><a id="user-content-configure-mcps" class="anchor" aria-label="Permalink: Configure MCPs" href="#configure-mcps"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Claude plugin installs intentionally do not auto-enable ECC's bundled MCP server definitions. This avoids overlong plugin MCP tool names on strict third-party gateways while keeping manual MCP setup available.</p>
<p dir="auto">Use Claude Code's <code>/mcp</code> command or CLI-managed MCP setup for live Claude Code server changes; Claude Code persists those choices in <code>~/.claude.json</code>. For repo-local MCP access, copy desired MCP server definitions from <code>mcp-configs/mcp-servers.json</code> into a project-scoped <code>.mcp.json</code>.</p>
<p dir="auto">ECC ships exactly one default connector (<code>chrome-devtools</code>); everything else is a skill wrapping a CLI/REST API or an opt-in catalog entry. The rule and the June 2026 audit that retired the previous six defaults live in <a href="/96loveslife/ECC/blob/main/docs/MCP-CONNECTOR-POLICY.md">docs/MCP-CONNECTOR-POLICY.md</a>.</p>
<p dir="auto">If you already run your own copies of ECC-bundled MCPs, set:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export ECC_DISABLED_MCPS=&quot;chrome-devtools&quot;"><pre><span class="pl-k">export</span> ECC_DISABLED_MCPS=<span class="pl-s"><span class="pl-pds">"</span>chrome-devtools<span class="pl-pds">"</span></span></pre></div>
<p dir="auto">ECC-managed install and Codex sync flows will skip or remove those bundled servers instead of re-adding duplicates. <code>ECC_DISABLED_MCPS</code> is an ECC install/sync filter, not a live Claude Code toggle.</p>
<p dir="auto"><strong>Important:</strong> Replace <code>YOUR_*_HERE</code> placeholders with your actual API keys.</p>
</details>
<details>
<summary><strong>Multi-model commands require additional setup</strong></summary>
<p dir="auto"><code>multi-*</code> commands are <strong>not</strong> covered by the base plugin/rules install.</p>
<p dir="auto">To use <code>/multi-plan</code>, <code>/multi-execute</code>, <code>/multi-backend</code>, <code>/multi-frontend</code>, and <code>/multi-workflow</code>, you must also install the <code>ccg-workflow</code> runtime. Choose and review an exact release using the <a href="https://github.com/fengshao1227/ccg-workflow#readme">upstream CCG installation guide</a>, then initialize that installed runtime. ECC does not bundle CCG or attest to a compatible, audited CCG release; this guide does not bootstrap an unspecified registry version.</p>
<p dir="auto">That runtime provides the external dependencies these commands expect, including:</p>
<ul dir="auto">
<li><code>~/.claude/bin/codeagent-wrapper</code></li>
<li><code>~/.claude/.ccg/prompts/*</code></li>
</ul>
<p dir="auto">Without <code>ccg-workflow</code>, these <code>multi-*</code> commands will not run correctly.</p>
</details>
<details>
<summary><strong>Reset, repair, or uninstall</strong></summary>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Reset / Uninstall ECC</h3><a id="user-content-reset--uninstall-ecc" class="anchor" aria-label="Permalink: Reset / Uninstall ECC" href="#reset--uninstall-ecc"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">If you installed from the universal package, run these commands from the same
project directory used for installation:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npx ecc-universal@2.2.2 list-installed
npx ecc-universal@2.2.2 doctor
npx ecc-universal@2.2.2 repair
npx ecc-universal@2.2.2 uninstall --dry-run
npx ecc-universal@2.2.2 uninstall"><pre>npx ecc-universal@2.2.2 list-installed
npx ecc-universal@2.2.2 doctor
npx ecc-universal@2.2.2 repair
npx ecc-universal@2.2.2 uninstall --dry-run
npx ecc-universal@2.2.2 uninstall</pre></div>
<p dir="auto">From a source checkout, inspect the managed state before reinstalling:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="node scripts/ecc.js list-installed
node scripts/ecc.js doctor
node scripts/ecc.js repair
node scripts/ecc.js uninstall --dry-run"><pre>node scripts/ecc.js list-installed
node scripts/ecc.js doctor
node scripts/ecc.js repair
node scripts/ecc.js uninstall --dry-run</pre></div>
<p dir="auto">For a direct source-checkout uninstall:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="node scripts/uninstall.js --dry-run
node scripts/uninstall.js"><pre>node scripts/uninstall.js --dry-run
node scripts/uninstall.js</pre></div>
<p dir="auto">If you are leaving, the uninstall command prints an optional <a href="https://github.com/affaan-m/ECC/issues/new?template=quick-feedback.yml">20-second feedback form</a>. It is a public GitHub issue, never blocks uninstall, and ECC does not upload diagnostics. You can also run <code>ecc feedback</code> at any time to see the problem, feedback, and feature routes.</p>
<p dir="auto">Plugin users should remove the plugin from Claude Code, then delete only the rule folders they manually copied and no longer want. ECC only removes files recorded in its install-state. It does not claim unrelated files in your harness directories.</p>
<p dir="auto">If you stacked methods, clean up in this order:</p>
<ol dir="auto">
<li>Remove the Claude Code plugin install.</li>
<li>Run the ECC uninstall command from the project directory that contains the managed install-state.</li>
<li>Delete any extra rule folders you copied manually and no longer want.</li>
<li>Reinstall once, using a single path.</li>
</ol>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Start Using ECC</h2><a id="user-content-start-using-ecc" class="anchor" aria-label="Permalink: Start Using ECC" href="#start-using-ecc"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Start with the workflow you need, not the full catalog.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>What you are doing</th>
<th>Start here</th>
</tr>
</thead>
<tbody>
<tr>
<td>Building a feature</td>
<td><code>/ecc:plan "describe the feature"</code>, then <code>tdd-workflow</code></td>
</tr>
<tr>
<td>Fixing a bug</td>
<td>Reproduce it with a failing test, then use <code>tdd-workflow</code></td>
</tr>
<tr>
<td>Reviewing new code</td>
<td><code>/code-review</code> for a fresh-context review</td>
</tr>
<tr>
<td>Repairing a build</td>
<td><code>/build-fix</code></td>
</tr>
<tr>
<td>Cleaning a codebase</td>
<td><code>/refactor-clean</code></td>
</tr>
<tr>
<td>Checking context pressure</td>
<td><code>/context-budget</code></td>
</tr>
<tr>
<td>Ending a long session</td>
<td><code>/save-session</code> or <code>/learn-eval</code></td>
</tr>
<tr>
<td>Resuming later</td>
<td><code>/resume-session</code></td>
</tr>
<tr>
<td>Auditing agent config</td>
<td><code>/security-scan</code> with a reviewed scanner, or installed <code>agentshield scan --path .</code></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<details>
<summary><strong>Plugin commands and manual commands</strong></summary>
<p dir="auto">Claude Code plugin commands use the namespaced form:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/ecc:plan &quot;Add authentication&quot;"><pre lang="text" class="notranslate"><code>/ecc:plan "Add authentication"
</code></pre></div>
<p dir="auto">Manual installs may expose the shorter compatibility form:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/plan &quot;Add authentication&quot;"><pre lang="text" class="notranslate"><code>/plan "Add authentication"
</code></pre></div>
<p dir="auto">Skills are the primary workflow surface. Commands remain convenient entry points and compatibility shims. Check what is installed with:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="/plugin list ecc@ecc"><pre>/plugin list ecc@ecc</pre></div>
</details>
<details>
<summary><strong>Which agent should I use?</strong></summary>
<p dir="auto">Skills are the canonical workflow surface; maintained slash entries stay available for command-first workflows.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>I want to...</th>
<th>Use this surface</th>
<th>Agent used</th>
</tr>
</thead>
<tbody>
<tr>
<td>Plan a new feature</td>
<td><code>/ecc:plan "Add auth"</code></td>
<td>planner</td>
</tr>
<tr>
<td>Design system architecture</td>
<td><code>/ecc:plan</code> + architect agent</td>
<td>architect</td>
</tr>
<tr>
<td>Write code with tests first</td>
<td><code>tdd-workflow</code> skill</td>
<td>tdd-guide</td>
</tr>
<tr>
<td>Review code I just wrote</td>
<td><code>/code-review</code></td>
<td>code-reviewer</td>
</tr>
<tr>
<td>Fix a failing build</td>
<td><code>/build-fix</code></td>
<td>build-error-resolver</td>
</tr>
<tr>
<td>Run end-to-end tests</td>
<td><code>e2e-testing</code> skill</td>
<td>e2e-runner</td>
</tr>
<tr>
<td>Find security vulnerabilities</td>
<td><code>/security-scan</code></td>
<td>security-reviewer</td>
</tr>
<tr>
<td>Remove dead code</td>
<td><code>/refactor-clean</code></td>
<td>refactor-cleaner</td>
</tr>
<tr>
<td>Update documentation</td>
<td><code>/update-docs</code></td>
<td>doc-updater</td>
</tr>
<tr>
<td>Review Go code</td>
<td><code>/go-review</code></td>
<td>go-reviewer</td>
</tr>
<tr>
<td>Review Python code</td>
<td><code>/python-review</code></td>
<td>python-reviewer</td>
</tr>
<tr>
<td>Review F# code</td>
<td><em>(invoke <code>fsharp-reviewer</code> directly)</em></td>
<td>fsharp-reviewer</td>
</tr>
<tr>
<td>Review TypeScript/JavaScript code</td>
<td><em>(invoke <code>typescript-reviewer</code> directly)</em></td>
<td>typescript-reviewer</td>
</tr>
<tr>
<td>Develop HarmonyOS apps</td>
<td><em>(invoke <code>harmonyos-app-resolver</code> directly)</em></td>
<td>harmonyos-app-resolver</td>
</tr>
<tr>
<td>Audit database queries</td>
<td><em>(auto-delegated)</em></td>
<td>database-reviewer</td>
</tr>
<tr>
<td>Review production ML changes</td>
<td><code>mle-workflow</code> skill + <code>mle-reviewer</code> agent</td>
<td>mle-reviewer</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
</details>
<details>
<summary><strong>Common workflows</strong></summary>
<p dir="auto">Slash forms below are shown where they remain part of the maintained command surface. Retired short-name shims such as <code>/tdd</code> and <code>/eval</code> live in <code>legacy-command-shims/</code> for explicit opt-in only.</p>
<p dir="auto"><strong>Starting a new feature:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/ecc:plan &quot;Add user authentication with OAuth&quot;
                                              -&gt; planner creates implementation blueprint
tdd-workflow skill                            -&gt; tdd-guide enforces write-tests-first
/code-review                                  -&gt; code-reviewer checks your work"><pre class="notranslate"><code>/ecc:plan "Add user authentication with OAuth"
                                              -&gt; planner creates implementation blueprint
tdd-workflow skill                            -&gt; tdd-guide enforces write-tests-first
/code-review                                  -&gt; code-reviewer checks your work
</code></pre></div>
<p dir="auto"><strong>Fixing a bug:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="tdd-workflow skill                            -&gt; tdd-guide: write a failing test that reproduces it
                                              -&gt; implement the fix, verify test passes
/code-review                                  -&gt; code-reviewer: catch regressions"><pre class="notranslate"><code>tdd-workflow skill                            -&gt; tdd-guide: write a failing test that reproduces it
                                              -&gt; implement the fix, verify test passes
/code-review                                  -&gt; code-reviewer: catch regressions
</code></pre></div>
<p dir="auto"><strong>Preparing for production:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/security-scan                                -&gt; security-reviewer: OWASP Top 10 audit
e2e-testing skill                             -&gt; e2e-runner: critical user flow tests
/test-coverage                                -&gt; verify 80%+ coverage"><pre class="notranslate"><code>/security-scan                                -&gt; security-reviewer: OWASP Top 10 audit
e2e-testing skill                             -&gt; e2e-runner: critical user flow tests
/test-coverage                                -&gt; verify 80%+ coverage
</code></pre></div>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Self-Hosted Models and Custom Endpoints</h2><a id="user-content-self-hosted-models-and-custom-endpoints" class="anchor" aria-label="Permalink: Self-Hosted Models and Custom Endpoints" href="#self-hosted-models-and-custom-endpoints"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">ECC works through each harness's normal configuration, so you can use an official provider, a compatible custom API endpoint or model gateway, or a self-hosted model without changing ECC's workflows.</p>
<p dir="auto">For Claude Code, ECC does not hardcode Anthropic-hosted transport settings. Minimal gateway example:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export ANTHROPIC_BASE_URL=https://your-gateway.example.com
export ANTHROPIC_AUTH_TOKEN=your-token
claude"><pre><span class="pl-k">export</span> ANTHROPIC_BASE_URL=https://your-gateway.example.com
<span class="pl-k">export</span> ANTHROPIC_AUTH_TOKEN=your-token
claude</pre></div>
<p dir="auto">If your gateway remaps model names, configure that in Claude Code rather than in ECC. ECC's hooks, skills, commands, and rules are model-provider agnostic once the <code>claude</code> CLI is already working. See Anthropic's <a href="https://docs.anthropic.com/en/docs/claude-code/llm-gateway" rel="nofollow">LLM gateway documentation</a> and <a href="https://docs.anthropic.com/en/docs/claude-code/model-config" rel="nofollow">model configuration documentation</a>.</p>
<p dir="auto">Run or self-host any open-source model behind that gateway using separate compute and serving setup. If you need GPU capacity, <a href="https://compute.itomarkets.com" rel="nofollow">Itô</a> is ECC's preferred compute sponsor; any GPU provider works. The sponsorship link is passive: it does not invoke an RFQ, reserve capacity, provision compute, or configure serving. Separately, <code>ecc ito find</code> invokes the explicitly configured canonical Itô CLI and submits a live authenticated RFQ; it does not reserve capacity. Managed inference through Itô is not live yet.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Self-host Kimi with ECC + Itô compute</h3><a id="user-content-self-host-kimi-with-ecc--itô-compute" class="anchor" aria-label="Permalink: Self-host Kimi with ECC + Itô compute" href="#self-host-kimi-with-ecc--itô-compute"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The Kimi Code harness and the model-serving layer are separate. ECC configures the agent harness; you bring an API endpoint (<a href="https://platform.kimi.ai?aff=ecc" rel="nofollow">get a Kimi API key</a>) or self-host an open-weight Kimi model on your own GPU capacity. This adapter is verified against Kimi Code 0.31.x (<code>@moonshot-ai/kimi-code</code>):</p>
<markdown-accessiblity-table><table aria-label="Local Kimi model path" width="100%">
<tbody><tr>
<td width="33%" align="center">
  <a href="https://compute.itomarkets.com" rel="nofollow">
    <themed-picture data-catalyst-inline="true"><picture><source media="(prefers-color-scheme: light)" srcset="/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent-light.png"><img src="/96loveslife/ECC/raw/main/assets/images/sponsors/ito-transparent.png" width="92" alt="Itô Markets"></picture></themed-picture><br>
    <strong>1. Get GPU capacity</strong>
  </a><br>
  <sub>Use Itô or any GPU provider.</sub>
</td>
<td width="33%" align="center">
  <a href="https://www.moonshot.ai" rel="nofollow">
    <themed-picture data-catalyst-inline="true"><picture><source media="(prefers-color-scheme: dark)" srcset="/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot-dark.png"><img src="/96loveslife/ECC/raw/main/assets/images/sponsors/moonshot.png" width="126" alt="Moonshot AI - Kimi"></picture></themed-picture><br>
    <strong>2. Serve Kimi</strong>
  </a><br>
  <sub>Expose the chosen checkpoint through a compatible endpoint.</sub>
</td>
<td width="33%" align="center">
  <a href="/96loveslife/ECC/blob/main/.kimi/README.md">
    <img src="/96loveslife/ECC/raw/main/assets/images/community/ecc-tools-mark.svg" height="52" alt="ECC Tools" style="max-width: 100%; height: auto; max-height: 52px;"><br>
    <strong>3. Run Kimi Code with ECC</strong>
  </a><br>
  <sub>Install project instructions and skills, then start Kimi Code.</sub>
</td>
</tr>
</tbody></table></markdown-accessiblity-table>
<p dir="auto">Configure the endpoint with Kimi Code's <a href="https://moonshotai.github.io/kimi-cli/en/configuration/providers.html" rel="nofollow">official provider guide</a>, then install ECC:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="bash ./install.sh --target kimi --profile minimal
node scripts/ecc.js doctor --target kimi
kimi"><pre>bash ./install.sh --target kimi --profile minimal
node scripts/ecc.js doctor --target kimi
kimi</pre></div>
<p dir="auto">Kimi Code discovers the installed <code>.kimi-code/AGENTS.md</code> instructions and <code>.kimi-code/skills/</code> workflows natively; project-level <code>.agents/skills/</code> is also an official discovery location. ECC safely merges project MCP entries into <code>.kimi-code/mcp.json</code> and does not change the user-level <code>~/.kimi-code/config.toml</code>. Kimi Code supports native hooks, but ECC's current managed-project adapter does not configure them, so this installer does not offer Kimi hook profiles. The installer dry-run and regression suite verify that every managed Kimi write stays inside the project-local <code>.kimi-code/</code> root.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Itô compute CLI bridge</h3><a id="user-content-itô-compute-cli-bridge" class="anchor" aria-label="Permalink: Itô compute CLI bridge" href="#itô-compute-cli-bridge"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><code>ecc ito</code> delegates to the separately installed canonical Itô client; ECC does not maintain a second API client. <code>ecc ito login [--no-browser]</code> performs device authorization, opens the Itô verification page by default, and persists a device token in macOS Keychain; <code>--no-browser</code> suppresses the page handoff. ECC itself does no browser automation. <code>ecc ito auth</code> is validation-only and rejects <code>--no-browser</code>. The available operations are <code>ecc ito login</code>, <code>ecc ito auth</code>, <code>ecc ito find</code>, <code>ecc ito status</code>, and the separately gated <code>ecc ito evals</code>. The matching MCP tools remain <code>ito_auth</code>, <code>ito_find</code>, and <code>ito_status</code>; <code>ito_auth</code> validates existing credentials and node qualification is CLI-only.</p>
<p dir="auto">The <code>ito-compute-cli</code> package is currently unpublished. Build it locally from the Itô runtime repo (private while the desk hardens; design partners get access) under <code>cli/ito-compute-cli</code>, run <code>npm ci</code> and <code>npm run check</code>, then set <code>ECC_ITO_CLI_EXECUTABLE</code> to that build's absolute <code>dist/bin/ito.js</code> path. Login never inherits <code>ITO_API_KEY</code>; auth, find, and status forward <code>ITO_API_KEY</code> directly when configured, and <code>ITO_AUTH_MODE=legacy</code> is not required. <code>ecc ito logout</code> revokes the current device credential and retains its local copy if remote revocation cannot be confirmed. Device tokens use macOS Keychain by default; explicit file fallback must retain owner-only directory/file permissions. ECC does not discover this credential-bearing client through <code>PATH</code>. See the <a href="/96loveslife/ECC/blob/main/skills/ito-compute/SKILL.md"><code>ito-compute</code> skill</a> for the full RFQ authority and MCP setup contract.</p>
<p dir="auto"><code>find</code> submits a live authenticated RFQ. It does not reserve capacity. <code>evals</code> requires both <code>ITO_ENABLE_SIXTYTWO_LIVE=1</code> and <code>--live-sixtytwo</code>, a separately installed <code>sixtytwo-cli==0.3.33</code>, an explicit node list, and an existing absolute configuration directory. It cannot rent, launch, recover, repair, or purchase. ECC exposes no quote lock, purchase, workload, or inference path, and it never replaces a missing client or failed live call with a local result.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">What's New</h2><a id="user-content-whats-new" class="anchor" aria-label="Permalink: What's New" href="#whats-new"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Current release: <strong>2.2.2</strong> (2026-08-31). Highlights of the 2.2 line:</p>
<ul dir="auto">
<li>Guided, manifest-driven setup across Claude Code, Codex, and Kimi Code, with install-state ownership, doctor, repair, and uninstall.</li>
<li>Native Antigravity install, a thin Pi adapter, and the packed-artifact release gate tested on Linux, macOS, and Windows.</li>
<li>Plan Canvas browser review, the unified memory vault (<code>ecc memory</code>), and the Itô compute skill family.</li>
</ul>
<p dir="auto">Full history: <a href="/96loveslife/ECC/blob/main/CHANGELOG.md">CHANGELOG.md</a>. Per-release notes and evidence live under <a href="/96loveslife/ECC/blob/main/docs/releases">docs/releases/</a>.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v2.0.0: The Agent Harness Operating System (Jun 2026)</h3><a id="user-content-v200-the-agent-harness-operating-system-jun-2026" class="anchor" aria-label="Permalink: v2.0.0: The Agent Harness Operating System (Jun 2026)" href="#v200-the-agent-harness-operating-system-jun-2026"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Stable graduation of the 2.0 line: control-pane substrate, worktree lifecycle service, the <code>orch-*</code> orchestrator family, and the Discord community. Notes: <a href="/96loveslife/ECC/blob/main/docs/releases/2.0.0/release-notes.md">docs/releases/2.0.0/release-notes.md</a>.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">What's Inside</h2><a id="user-content-whats-inside" class="anchor" aria-label="Permalink: What's Inside" href="#whats-inside"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ECC/
|-- agents/           # 68 specialized subagents for delegation
|-- skills/           # 292 reusable workflows loaded on demand
|-- commands/         # 94 maintained slash-command shims
|-- rules/            # opt-in common and language standards
|-- hooks/            # runtime automation and enforcement
|-- scripts/          # install, repair, sync, orchestration, and checks
|-- .claude-plugin/   # Claude Code marketplace manifest
|-- .codex/           # Codex reference configuration and agent roles
|-- .opencode/        # OpenCode plugin, commands, and instructions
|-- .cursor/          # Cursor rules and hook adapter
|-- docs/             # public setup, architecture, and operating guides"><pre lang="text" class="notranslate"><code>ECC/
|-- agents/           # 68 specialized subagents for delegation
|-- skills/           # 292 reusable workflows loaded on demand
|-- commands/         # 94 maintained slash-command shims
|-- rules/            # opt-in common and language standards
|-- hooks/            # runtime automation and enforcement
|-- scripts/          # install, repair, sync, orchestration, and checks
|-- .claude-plugin/   # Claude Code marketplace manifest
|-- .codex/           # Codex reference configuration and agent roles
|-- .opencode/        # OpenCode plugin, commands, and instructions
|-- .cursor/          # Cursor rules and hook adapter
|-- docs/             # public setup, architecture, and operating guides
</code></pre></div>
<p dir="auto">The root is the source of truth. Platform adapters package or map these same workflows instead of maintaining separate copies.</p>
<details>
<summary><strong>Annotated component catalog</strong></summary>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ECC/
|-- .claude-plugin/   # Plugin and marketplace manifests
|   |-- plugin.json         # Plugin metadata and component paths
|   |-- marketplace.json    # Marketplace catalog for /plugin marketplace add
|
|-- agents/           # 67 specialized subagents for delegation
|   |-- planner.md           # Feature implementation planning
|   |-- architect.md         # System design decisions
|   |-- tdd-guide.md         # Test-driven development
|   |-- code-reviewer.md     # Quality and security review
|   |-- security-reviewer.md # Vulnerability analysis
|   |-- build-error-resolver.md
|   |-- e2e-runner.md        # Playwright E2E testing
|   |-- refactor-cleaner.md  # Dead code cleanup
|   |-- doc-updater.md       # Documentation sync
|   |-- docs-lookup.md       # Documentation/API lookup
|   |-- chief-of-staff.md    # Communication triage and drafts
|   |-- loop-operator.md     # Autonomous loop execution
|   |-- harness-optimizer.md # Harness config tuning
|   |-- cpp-reviewer.md      # C++ code review
|   |-- cpp-build-resolver.md # C++ build error resolution
|   |-- fsharp-reviewer.md   # F# functional code review
|   |-- go-reviewer.md       # Go code review
|   |-- go-build-resolver.md # Go build error resolution
|   |-- python-reviewer.md   # Python code review
|   |-- database-reviewer.md # Database/Supabase review
|   |-- typescript-reviewer.md # TypeScript/JavaScript code review
|   |-- java-reviewer.md     # Java/Spring Boot code review
|   |-- java-build-resolver.md # Java/Maven/Gradle build errors
|   |-- kotlin-reviewer.md   # Kotlin/Android/KMP code review
|   |-- kotlin-build-resolver.md # Kotlin/Gradle build errors
|   |-- harmonyos-app-resolver.md # HarmonyOS/ArkTS app development
|   |-- rust-reviewer.md     # Rust code review
|   |-- rust-build-resolver.md # Rust build error resolution
|   |-- pytorch-build-resolver.md # PyTorch/CUDA training errors
|   |-- mle-reviewer.md      # Production ML pipeline, eval, serving, and monitoring review
|
|-- skills/           # Workflow definitions and domain knowledge
|   |-- coding-standards/           # Language best practices
|   |-- clickhouse-io/              # ClickHouse analytics, queries, data engineering
|   |-- backend-patterns/           # API, database, caching patterns
|   |-- frontend-patterns/          # React, Next.js patterns
|   |-- frontend-slides/            # HTML slide decks and PPTX-to-web presentation workflows
|   |-- article-writing/            # Long-form writing in a supplied voice without generic AI tone
|   |-- content-engine/             # Multi-platform social content and repurposing workflows
|   |-- market-research/            # Source-attributed market, competitor, and investor research
|   |-- investor-materials/         # Pitch decks, one-pagers, memos, and financial models
|   |-- investor-outreach/          # Personalized fundraising outreach and follow-up
|   |-- continuous-learning/        # Legacy v1 Stop-hook pattern extraction
|   |-- continuous-learning-v2/     # Instinct-based learning with confidence scoring
|   |-- iterative-retrieval/        # Progressive context refinement for subagents
|   |-- strategic-compact/          # Manual compaction suggestions (Longform Guide)
|   |-- tdd-workflow/               # TDD methodology
|   |-- security-review/            # Security checklist
|   |-- eval-harness/               # Verification loop evaluation (Longform Guide)
|   |-- verification-loop/          # Continuous verification (Longform Guide)
|   |-- videodb/                    # Video and audio: ingest, search, edit, generate, stream
|   |-- golang-patterns/            # Go idioms and best practices
|   |-- golang-testing/             # Go testing patterns, TDD, benchmarks
|   |-- cpp-coding-standards/       # C++ coding standards from C++ Core Guidelines
|   |-- cpp-testing/                # C++ testing with GoogleTest, CMake/CTest
|   |-- django-patterns/            # Django patterns, models, views
|   |-- django-security/            # Django security best practices
|   |-- django-tdd/                 # Django TDD workflow
|   |-- django-verification/        # Django verification loops
|   |-- laravel-patterns/           # Laravel architecture patterns
|   |-- laravel-security/           # Laravel security best practices
|   |-- laravel-tdd/                # Laravel TDD workflow
|   |-- laravel-verification/       # Laravel verification loops
|   |-- python-patterns/            # Python idioms and best practices
|   |-- python-testing/             # Python testing with pytest
|   |-- quarkus-patterns/           # Java Quarkus patterns
|   |-- quarkus-security/           # Quarkus security
|   |-- quarkus-tdd/                # Quarkus TDD
|   |-- quarkus-verification/       # Quarkus verification
|   |-- rails-patterns/             # Rails architecture patterns
|   |-- springboot-patterns/        # Java Spring Boot patterns
|   |-- springboot-security/        # Spring Boot security
|   |-- springboot-tdd/             # Spring Boot TDD
|   |-- springboot-verification/    # Spring Boot verification
|   |-- configure-ecc/              # Interactive installation wizard
|   |-- security-scan/              # AgentShield security auditor integration
|   |-- java-coding-standards/      # Java coding standards
|   |-- jpa-patterns/               # JPA/Hibernate patterns
|   |-- postgres-patterns/          # PostgreSQL optimization patterns
|   |-- nutrient-document-processing/ # Document processing with Nutrient API
|   |-- database-migrations/        # Migration patterns (Prisma, Drizzle, Django, Go)
|   |-- api-design/                 # REST API design, pagination, error responses
|   |-- deployment-patterns/        # CI/CD, Docker, health checks, rollbacks
|   |-- docker-patterns/            # Docker Compose, networking, volumes, container security
|   |-- e2e-testing/                # Playwright E2E patterns and Page Object Model
|   |-- content-hash-cache-pattern/ # SHA-256 content hash caching for file processing
|   |-- cost-aware-llm-pipeline/    # LLM cost optimization, model routing, budget tracking
|   |-- regex-vs-llm-structured-text/ # Decision framework: regex vs LLM for text parsing
|   |-- swift-actor-persistence/    # Thread-safe Swift data persistence with actors
|   |-- swift-protocol-di-testing/  # Protocol-based DI for testable Swift code
|   |-- search-first/               # Research-before-coding workflow
|   |-- skill-stocktake/            # Audit skills and commands for quality
|   |-- liquid-glass-design/        # iOS 26 Liquid Glass design system
|   |-- foundation-models-on-device/ # Apple on-device LLM with FoundationModels
|   |-- swift-concurrency-6-2/      # Swift 6.2 Approachable Concurrency
|   |-- mle-workflow/               # Production ML data contracts, evals, deployment, monitoring
|   |-- perl-patterns/              # Modern Perl 5.36+ idioms and best practices
|   |-- perl-security/              # Perl security patterns, taint mode, safe I/O
|   |-- perl-testing/               # Perl TDD with Test2::V0, prove, Devel::Cover
|   |-- autonomous-loops/           # Autonomous loop patterns: sequential pipelines, PR loops, DAG orchestration
|   |-- plankton-code-quality/      # Write-time code quality enforcement with Plankton hooks
|   |-- codehealth-mcp/             # Optional CodeScene Code Health MCP skill (opt-in)
|   |-- docs/examples/project-guidelines-template.md  # Template for project-specific skills
|
|-- commands/         # Maintained slash-entry compatibility; prefer skills/
|   |-- plan.md             # /plan - Implementation planning
|   |-- code-review.md      # /code-review - Quality review
|   |-- build-fix.md        # /build-fix - Fix build errors
|   |-- refactor-clean.md   # /refactor-clean - Dead code removal
|   |-- quality-gate.md     # /quality-gate - Verification gate
|   |-- learn.md            # /learn - Extract patterns mid-session (Longform Guide)
|   |-- learn-eval.md       # /learn-eval - Extract, evaluate, and save patterns
|   |-- checkpoint.md       # /checkpoint - Save verification state (Longform Guide)
|   |-- setup-pm.md         # /setup-pm - Configure package manager
|   |-- go-review.md        # /go-review - Go code review
|   |-- go-test.md          # /go-test - Go TDD workflow
|   |-- go-build.md         # /go-build - Fix Go build errors
|   |-- skill-create.md     # /skill-create - Generate skills from git history
|   |-- instinct-status.md  # /instinct-status - View learned instincts
|   |-- instinct-import.md  # /instinct-import - Import instincts
|   |-- instinct-export.md  # /instinct-export - Export instincts
|   |-- evolve.md           # /evolve - Cluster instincts into skills
|   |-- prune.md            # /prune - Delete expired pending instincts
|   |-- pm2.md              # /pm2 - PM2 service lifecycle management
|   |-- multi-plan.md       # /multi-plan - Multi-agent task decomposition
|   |-- multi-execute.md    # /multi-execute - Orchestrated multi-agent workflows
|   |-- multi-backend.md    # /multi-backend - Backend multi-service orchestration
|   |-- multi-frontend.md   # /multi-frontend - Frontend multi-service orchestration
|   |-- multi-workflow.md   # /multi-workflow - General multi-service workflows
|   |-- sessions.md         # /sessions - Session history management
|   |-- test-coverage.md    # /test-coverage - Test coverage analysis
|   |-- update-docs.md      # /update-docs - Update documentation
|   |-- update-codemaps.md  # /update-codemaps - Update codemaps
|   |-- python-review.md    # /python-review - Python code review
|-- legacy-command-shims/   # Opt-in archive for retired shims such as /tdd and /eval
|   |-- tdd.md              # /tdd - Prefer the tdd-workflow skill
|   |-- e2e.md              # /e2e - Prefer the e2e-testing skill
|   |-- eval.md             # /eval - Prefer the eval-harness skill
|   |-- verify.md           # /verify - Prefer the verification-loop skill
|   |-- orchestrate.md      # /orchestrate - Prefer dmux-workflows or multi-workflow
|
|-- rules/            # Always-follow guidelines (copy to ~/.claude/rules/ecc/)
|   |-- README.md            # Structure overview and installation guide
|   |-- common/              # Language-agnostic principles
|   |   |-- coding-style.md    # Immutability, file organization
|   |   |-- git-workflow.md    # Commit format, PR process
|   |   |-- testing.md         # TDD, 80% coverage requirement
|   |   |-- performance.md     # Model selection, context management
|   |   |-- patterns.md        # Design patterns, skeleton projects
|   |   |-- hooks.md           # Hook architecture, TodoWrite
|   |   |-- agents.md          # When to delegate to subagents
|   |   |-- security.md        # Mandatory security checks
|   |-- typescript/          # TypeScript/JavaScript specific
|   |-- python/              # Python specific
|   |-- golang/              # Go specific
|   |-- swift/               # Swift specific
|   |-- php/                 # PHP specific
|   |-- arkts/               # HarmonyOS / ArkTS specific
|
|-- hooks/            # Trigger-based automations
|   |-- README.md                 # Hook documentation, recipes, and customization guide
|   |-- hooks.json                # All hooks config (PreToolUse, PostToolUse, Stop, etc.)
|   |-- memory-persistence/       # Session lifecycle hooks (Longform Guide)
|   |-- strategic-compact/        # Compaction suggestions (Longform Guide)
|
|-- scripts/          # Cross-platform Node.js scripts
|   |-- lib/                     # Shared utilities
|   |   |-- utils.js             # Cross-platform file/path/system utilities
|   |   |-- package-manager.js   # Package manager detection and selection
|   |-- hooks/                   # Hook implementations
|   |   |-- session-start.js     # Load context on session start
|   |   |-- session-end.js       # Save state on session end
|   |   |-- pre-compact.js       # Pre-compaction state saving
|   |   |-- suggest-compact.js   # Strategic compaction suggestions
|   |   |-- evaluate-session.js  # Extract patterns from sessions
|   |-- setup-package-manager.js # Interactive PM setup
|
|-- tests/            # Test suite
|   |-- lib/                     # Library tests
|   |-- hooks/                   # Hook tests
|   |-- run-all.js               # Run all tests
|
|-- contexts/         # Dynamic system prompt injection contexts (Longform Guide)
|   |-- dev.md              # Development mode context
|   |-- review.md           # Code review mode context
|   |-- research.md         # Research/exploration mode context
|
|-- examples/         # Example configurations and sessions
|   |-- CLAUDE.md             # Example project-level config
|   |-- user-CLAUDE.md        # Example user-level config
|   |-- saas-nextjs-CLAUDE.md   # Real-world SaaS (Next.js + Supabase + Stripe)
|   |-- go-microservice-CLAUDE.md # Real-world Go microservice (gRPC + PostgreSQL)
|   |-- django-api-CLAUDE.md      # Real-world Django REST API (DRF + Celery)
|   |-- laravel-api-CLAUDE.md     # Real-world Laravel API (PostgreSQL + Redis)
|   |-- rust-api-CLAUDE.md        # Real-world Rust API (Axum + SQLx + PostgreSQL)
|
|-- mcp-configs/      # MCP server configurations
|   |-- mcp-servers.json    # GitHub, Supabase, Vercel, Railway, etc.
|
|-- ecc_dashboard.py  # Desktop GUI dashboard (Tkinter)
|
|-- marketplace.json  # Self-hosted marketplace config (for /plugin marketplace add)"><pre class="notranslate"><code>ECC/
|-- .claude-plugin/   # Plugin and marketplace manifests
|   |-- plugin.json         # Plugin metadata and component paths
|   |-- marketplace.json    # Marketplace catalog for /plugin marketplace add
|
|-- agents/           # 67 specialized subagents for delegation
|   |-- planner.md           # Feature implementation planning
|   |-- architect.md         # System design decisions
|   |-- tdd-guide.md         # Test-driven development
|   |-- code-reviewer.md     # Quality and security review
|   |-- security-reviewer.md # Vulnerability analysis
|   |-- build-error-resolver.md
|   |-- e2e-runner.md        # Playwright E2E testing
|   |-- refactor-cleaner.md  # Dead code cleanup
|   |-- doc-updater.md       # Documentation sync
|   |-- docs-lookup.md       # Documentation/API lookup
|   |-- chief-of-staff.md    # Communication triage and drafts
|   |-- loop-operator.md     # Autonomous loop execution
|   |-- harness-optimizer.md # Harness config tuning
|   |-- cpp-reviewer.md      # C++ code review
|   |-- cpp-build-resolver.md # C++ build error resolution
|   |-- fsharp-reviewer.md   # F# functional code review
|   |-- go-reviewer.md       # Go code review
|   |-- go-build-resolver.md # Go build error resolution
|   |-- python-reviewer.md   # Python code review
|   |-- database-reviewer.md # Database/Supabase review
|   |-- typescript-reviewer.md # TypeScript/JavaScript code review
|   |-- java-reviewer.md     # Java/Spring Boot code review
|   |-- java-build-resolver.md # Java/Maven/Gradle build errors
|   |-- kotlin-reviewer.md   # Kotlin/Android/KMP code review
|   |-- kotlin-build-resolver.md # Kotlin/Gradle build errors
|   |-- harmonyos-app-resolver.md # HarmonyOS/ArkTS app development
|   |-- rust-reviewer.md     # Rust code review
|   |-- rust-build-resolver.md # Rust build error resolution
|   |-- pytorch-build-resolver.md # PyTorch/CUDA training errors
|   |-- mle-reviewer.md      # Production ML pipeline, eval, serving, and monitoring review
|
|-- skills/           # Workflow definitions and domain knowledge
|   |-- coding-standards/           # Language best practices
|   |-- clickhouse-io/              # ClickHouse analytics, queries, data engineering
|   |-- backend-patterns/           # API, database, caching patterns
|   |-- frontend-patterns/          # React, Next.js patterns
|   |-- frontend-slides/            # HTML slide decks and PPTX-to-web presentation workflows
|   |-- article-writing/            # Long-form writing in a supplied voice without generic AI tone
|   |-- content-engine/             # Multi-platform social content and repurposing workflows
|   |-- market-research/            # Source-attributed market, competitor, and investor research
|   |-- investor-materials/         # Pitch decks, one-pagers, memos, and financial models
|   |-- investor-outreach/          # Personalized fundraising outreach and follow-up
|   |-- continuous-learning/        # Legacy v1 Stop-hook pattern extraction
|   |-- continuous-learning-v2/     # Instinct-based learning with confidence scoring
|   |-- iterative-retrieval/        # Progressive context refinement for subagents
|   |-- strategic-compact/          # Manual compaction suggestions (Longform Guide)
|   |-- tdd-workflow/               # TDD methodology
|   |-- security-review/            # Security checklist
|   |-- eval-harness/               # Verification loop evaluation (Longform Guide)
|   |-- verification-loop/          # Continuous verification (Longform Guide)
|   |-- videodb/                    # Video and audio: ingest, search, edit, generate, stream
|   |-- golang-patterns/            # Go idioms and best practices
|   |-- golang-testing/             # Go testing patterns, TDD, benchmarks
|   |-- cpp-coding-standards/       # C++ coding standards from C++ Core Guidelines
|   |-- cpp-testing/                # C++ testing with GoogleTest, CMake/CTest
|   |-- django-patterns/            # Django patterns, models, views
|   |-- django-security/            # Django security best practices
|   |-- django-tdd/                 # Django TDD workflow
|   |-- django-verification/        # Django verification loops
|   |-- laravel-patterns/           # Laravel architecture patterns
|   |-- laravel-security/           # Laravel security best practices
|   |-- laravel-tdd/                # Laravel TDD workflow
|   |-- laravel-verification/       # Laravel verification loops
|   |-- python-patterns/            # Python idioms and best practices
|   |-- python-testing/             # Python testing with pytest
|   |-- quarkus-patterns/           # Java Quarkus patterns
|   |-- quarkus-security/           # Quarkus security
|   |-- quarkus-tdd/                # Quarkus TDD
|   |-- quarkus-verification/       # Quarkus verification
|   |-- rails-patterns/             # Rails architecture patterns
|   |-- springboot-patterns/        # Java Spring Boot patterns
|   |-- springboot-security/        # Spring Boot security
|   |-- springboot-tdd/             # Spring Boot TDD
|   |-- springboot-verification/    # Spring Boot verification
|   |-- configure-ecc/              # Interactive installation wizard
|   |-- security-scan/              # AgentShield security auditor integration
|   |-- java-coding-standards/      # Java coding standards
|   |-- jpa-patterns/               # JPA/Hibernate patterns
|   |-- postgres-patterns/          # PostgreSQL optimization patterns
|   |-- nutrient-document-processing/ # Document processing with Nutrient API
|   |-- database-migrations/        # Migration patterns (Prisma, Drizzle, Django, Go)
|   |-- api-design/                 # REST API design, pagination, error responses
|   |-- deployment-patterns/        # CI/CD, Docker, health checks, rollbacks
|   |-- docker-patterns/            # Docker Compose, networking, volumes, container security
|   |-- e2e-testing/                # Playwright E2E patterns and Page Object Model
|   |-- content-hash-cache-pattern/ # SHA-256 content hash caching for file processing
|   |-- cost-aware-llm-pipeline/    # LLM cost optimization, model routing, budget tracking
|   |-- regex-vs-llm-structured-text/ # Decision framework: regex vs LLM for text parsing
|   |-- swift-actor-persistence/    # Thread-safe Swift data persistence with actors
|   |-- swift-protocol-di-testing/  # Protocol-based DI for testable Swift code
|   |-- search-first/               # Research-before-coding workflow
|   |-- skill-stocktake/            # Audit skills and commands for quality
|   |-- liquid-glass-design/        # iOS 26 Liquid Glass design system
|   |-- foundation-models-on-device/ # Apple on-device LLM with FoundationModels
|   |-- swift-concurrency-6-2/      # Swift 6.2 Approachable Concurrency
|   |-- mle-workflow/               # Production ML data contracts, evals, deployment, monitoring
|   |-- perl-patterns/              # Modern Perl 5.36+ idioms and best practices
|   |-- perl-security/              # Perl security patterns, taint mode, safe I/O
|   |-- perl-testing/               # Perl TDD with Test2::V0, prove, Devel::Cover
|   |-- autonomous-loops/           # Autonomous loop patterns: sequential pipelines, PR loops, DAG orchestration
|   |-- plankton-code-quality/      # Write-time code quality enforcement with Plankton hooks
|   |-- codehealth-mcp/             # Optional CodeScene Code Health MCP skill (opt-in)
|   |-- docs/examples/project-guidelines-template.md  # Template for project-specific skills
|
|-- commands/         # Maintained slash-entry compatibility; prefer skills/
|   |-- plan.md             # /plan - Implementation planning
|   |-- code-review.md      # /code-review - Quality review
|   |-- build-fix.md        # /build-fix - Fix build errors
|   |-- refactor-clean.md   # /refactor-clean - Dead code removal
|   |-- quality-gate.md     # /quality-gate - Verification gate
|   |-- learn.md            # /learn - Extract patterns mid-session (Longform Guide)
|   |-- learn-eval.md       # /learn-eval - Extract, evaluate, and save patterns
|   |-- checkpoint.md       # /checkpoint - Save verification state (Longform Guide)
|   |-- setup-pm.md         # /setup-pm - Configure package manager
|   |-- go-review.md        # /go-review - Go code review
|   |-- go-test.md          # /go-test - Go TDD workflow
|   |-- go-build.md         # /go-build - Fix Go build errors
|   |-- skill-create.md     # /skill-create - Generate skills from git history
|   |-- instinct-status.md  # /instinct-status - View learned instincts
|   |-- instinct-import.md  # /instinct-import - Import instincts
|   |-- instinct-export.md  # /instinct-export - Export instincts
|   |-- evolve.md           # /evolve - Cluster instincts into skills
|   |-- prune.md            # /prune - Delete expired pending instincts
|   |-- pm2.md              # /pm2 - PM2 service lifecycle management
|   |-- multi-plan.md       # /multi-plan - Multi-agent task decomposition
|   |-- multi-execute.md    # /multi-execute - Orchestrated multi-agent workflows
|   |-- multi-backend.md    # /multi-backend - Backend multi-service orchestration
|   |-- multi-frontend.md   # /multi-frontend - Frontend multi-service orchestration
|   |-- multi-workflow.md   # /multi-workflow - General multi-service workflows
|   |-- sessions.md         # /sessions - Session history management
|   |-- test-coverage.md    # /test-coverage - Test coverage analysis
|   |-- update-docs.md      # /update-docs - Update documentation
|   |-- update-codemaps.md  # /update-codemaps - Update codemaps
|   |-- python-review.md    # /python-review - Python code review
|-- legacy-command-shims/   # Opt-in archive for retired shims such as /tdd and /eval
|   |-- tdd.md              # /tdd - Prefer the tdd-workflow skill
|   |-- e2e.md              # /e2e - Prefer the e2e-testing skill
|   |-- eval.md             # /eval - Prefer the eval-harness skill
|   |-- verify.md           # /verify - Prefer the verification-loop skill
|   |-- orchestrate.md      # /orchestrate - Prefer dmux-workflows or multi-workflow
|
|-- rules/            # Always-follow guidelines (copy to ~/.claude/rules/ecc/)
|   |-- README.md            # Structure overview and installation guide
|   |-- common/              # Language-agnostic principles
|   |   |-- coding-style.md    # Immutability, file organization
|   |   |-- git-workflow.md    # Commit format, PR process
|   |   |-- testing.md         # TDD, 80% coverage requirement
|   |   |-- performance.md     # Model selection, context management
|   |   |-- patterns.md        # Design patterns, skeleton projects
|   |   |-- hooks.md           # Hook architecture, TodoWrite
|   |   |-- agents.md          # When to delegate to subagents
|   |   |-- security.md        # Mandatory security checks
|   |-- typescript/          # TypeScript/JavaScript specific
|   |-- python/              # Python specific
|   |-- golang/              # Go specific
|   |-- swift/               # Swift specific
|   |-- php/                 # PHP specific
|   |-- arkts/               # HarmonyOS / ArkTS specific
|
|-- hooks/            # Trigger-based automations
|   |-- README.md                 # Hook documentation, recipes, and customization guide
|   |-- hooks.json                # All hooks config (PreToolUse, PostToolUse, Stop, etc.)
|   |-- memory-persistence/       # Session lifecycle hooks (Longform Guide)
|   |-- strategic-compact/        # Compaction suggestions (Longform Guide)
|
|-- scripts/          # Cross-platform Node.js scripts
|   |-- lib/                     # Shared utilities
|   |   |-- utils.js             # Cross-platform file/path/system utilities
|   |   |-- package-manager.js   # Package manager detection and selection
|   |-- hooks/                   # Hook implementations
|   |   |-- session-start.js     # Load context on session start
|   |   |-- session-end.js       # Save state on session end
|   |   |-- pre-compact.js       # Pre-compaction state saving
|   |   |-- suggest-compact.js   # Strategic compaction suggestions
|   |   |-- evaluate-session.js  # Extract patterns from sessions
|   |-- setup-package-manager.js # Interactive PM setup
|
|-- tests/            # Test suite
|   |-- lib/                     # Library tests
|   |-- hooks/                   # Hook tests
|   |-- run-all.js               # Run all tests
|
|-- contexts/         # Dynamic system prompt injection contexts (Longform Guide)
|   |-- dev.md              # Development mode context
|   |-- review.md           # Code review mode context
|   |-- research.md         # Research/exploration mode context
|
|-- examples/         # Example configurations and sessions
|   |-- CLAUDE.md             # Example project-level config
|   |-- user-CLAUDE.md        # Example user-level config
|   |-- saas-nextjs-CLAUDE.md   # Real-world SaaS (Next.js + Supabase + Stripe)
|   |-- go-microservice-CLAUDE.md # Real-world Go microservice (gRPC + PostgreSQL)
|   |-- django-api-CLAUDE.md      # Real-world Django REST API (DRF + Celery)
|   |-- laravel-api-CLAUDE.md     # Real-world Laravel API (PostgreSQL + Redis)
|   |-- rust-api-CLAUDE.md        # Real-world Rust API (Axum + SQLx + PostgreSQL)
|
|-- mcp-configs/      # MCP server configurations
|   |-- mcp-servers.json    # GitHub, Supabase, Vercel, Railway, etc.
|
|-- ecc_dashboard.py  # Desktop GUI dashboard (Tkinter)
|
|-- marketplace.json  # Self-hosted marketplace config (for /plugin marketplace add)
</code></pre></div>
</details>
<details>
<summary><strong>Dashboard GUI</strong></summary>
<p dir="auto">Launch the desktop dashboard to visually explore ECC components:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npm run dashboard
# or
python3 ./ecc_dashboard.py"><pre>npm run dashboard
<span class="pl-c"><span class="pl-c">#</span> or</span>
python3 ./ecc_dashboard.py</pre></div>
<p dir="auto"><strong>Features:</strong></p>
<ul dir="auto">
<li>Tabbed interface: Agents, Skills, Commands, Rules, Settings</li>
<li>Dark/Light theme toggle</li>
<li>Font customization (family and size)</li>
<li>Project logo in header and taskbar</li>
<li>Search and filter across all components</li>
</ul>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Key Concepts</h2><a id="user-content-key-concepts" class="anchor" aria-label="Permalink: Key Concepts" href="#key-concepts"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<details>
<summary><strong>Agents, skills, hooks, and rules explained</strong></summary>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Agents</h3><a id="user-content-agents" class="anchor" aria-label="Permalink: Agents" href="#agents"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Subagents handle delegated tasks with limited scope. Example:</p>
<div class="highlight highlight-text-md notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="---
name: code-reviewer
description: Reviews code for quality, security, and maintainability
tools: Read, Grep, Glob, Bash
model: opus
---

You are a senior code reviewer..."><pre><span class="pl-s">---</span>
<span class="pl-ent">name</span>: <span class="pl-s">code-reviewer</span>
<span class="pl-ent">description</span>: <span class="pl-s">Reviews code for quality, security, and maintainability</span>
<span class="pl-ent">tools</span>: <span class="pl-s">Read, Grep, Glob, Bash</span>
<span class="pl-ent">model</span>: <span class="pl-s">opus</span>
<span class="pl-s">---</span>

You are a senior code reviewer...</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Skills</h3><a id="user-content-skills" class="anchor" aria-label="Permalink: Skills" href="#skills"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Skills are the primary workflow surface. They can be invoked directly, suggested automatically, and reused by agents. ECC still ships maintained <code>commands/</code> during migration, while retired short-name shims live under <code>legacy-command-shims/</code> for explicit opt-in only. New workflow development should land in <code>skills/</code> first.</p>
<div class="highlight highlight-text-md notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# TDD Workflow

1. Define interfaces first
2. Write failing tests (RED)
3. Implement minimal code (GREEN)
4. Refactor (IMPROVE)
5. Verify 80%+ coverage"><pre><span class="pl-mh"># <span class="pl-en">TDD Workflow</span></span>

<span class="pl-s">1</span><span class="pl-v">.</span> Define interfaces first
<span class="pl-s">2</span><span class="pl-v">.</span> Write failing tests (RED)
<span class="pl-s">3</span><span class="pl-v">.</span> Implement minimal code (GREEN)
<span class="pl-s">4</span><span class="pl-v">.</span> Refactor (IMPROVE)
<span class="pl-s">5</span><span class="pl-v">.</span> Verify 80%+ coverage</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Hooks</h3><a id="user-content-hooks" class="anchor" aria-label="Permalink: Hooks" href="#hooks"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Hooks fire on tool events. Example: warn about console.log:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;matcher&quot;: &quot;tool == \&quot;Edit\&quot; &amp;&amp; tool_input.file_path matches \&quot;\\\\.(ts|tsx|js|jsx)$\&quot;&quot;,
  &quot;hooks&quot;: [{
    &quot;type&quot;: &quot;command&quot;,
    &quot;command&quot;: &quot;#!/bin/bash\ngrep -n 'console\\.log' \&quot;$file_path\&quot; &amp;&amp; echo '[Hook] Remove console.log' &gt;&amp;2&quot;
  }]
}"><pre>{
  <span class="pl-ent">"matcher"</span>: <span class="pl-s"><span class="pl-pds">"</span>tool == <span class="pl-cce">\"</span>Edit<span class="pl-cce">\"</span> &amp;&amp; tool_input.file_path matches <span class="pl-cce">\"\\\\</span>.(ts|tsx|js|jsx)$<span class="pl-cce">\"</span><span class="pl-pds">"</span></span>,
  <span class="pl-ent">"hooks"</span>: [{
    <span class="pl-ent">"type"</span>: <span class="pl-s"><span class="pl-pds">"</span>command<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"command"</span>: <span class="pl-s"><span class="pl-pds">"</span>#!/bin/bash<span class="pl-cce">\n</span>grep -n 'console<span class="pl-cce">\\</span>.log' <span class="pl-cce">\"</span>$file_path<span class="pl-cce">\"</span> &amp;&amp; echo '[Hook] Remove console.log' &gt;&amp;2<span class="pl-pds">"</span></span>
  }]
}</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Rules</h3><a id="user-content-rules" class="anchor" aria-label="Permalink: Rules" href="#rules"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Rules are always-follow guidelines, organized into <code>common/</code> (language-agnostic) + language-specific directories:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="rules/
  common/          # Universal principles (always install)
  typescript/      # TS/JS specific patterns and tools
  python/          # Python specific patterns and tools
  golang/          # Go specific patterns and tools
  swift/           # Swift specific patterns and tools
  php/             # PHP specific patterns and tools
  arkts/           # HarmonyOS / ArkTS patterns and constraints"><pre class="notranslate"><code>rules/
  common/          # Universal principles (always install)
  typescript/      # TS/JS specific patterns and tools
  python/          # Python specific patterns and tools
  golang/          # Go specific patterns and tools
  swift/           # Swift specific patterns and tools
  php/             # PHP specific patterns and tools
  arkts/           # HarmonyOS / ArkTS patterns and constraints
</code></pre></div>
<p dir="auto">See <a href="/96loveslife/ECC/blob/main/rules/README.md"><code>rules/README.md</code></a> for installation and structure details.</p>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Guides</h2><a id="user-content-guides" class="anchor" aria-label="Permalink: Guides" href="#guides"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">This repo is the raw code. The guides explain everything.</p>
<markdown-accessiblity-table><table aria-label="ECC guides" width="100%">
<tbody><tr>
<td width="33%" align="center">
<a href="/96loveslife/ECC/blob/main/the-shortform-guide.md">
<img src="/96loveslife/ECC/raw/main/assets/images/guides/shorthand-guide.png" width="213" height="120" alt="The Shorthand Guide to ECC" style="max-width: 100%; height: auto; max-height: 120px;"><br>
<strong>The Shorthand Guide</strong>
</a>
<br><sub>Setup, foundations, and day-one use. <b>Read this first.</b> (<a href="https://x.com/affaan/status/2012378465664745795" rel="nofollow">thread</a>)</sub>
</td>
<td width="33%" align="center">
<a href="/96loveslife/ECC/blob/main/the-longform-guide.md">
<img src="/96loveslife/ECC/raw/main/assets/images/guides/longform-guide.png" width="213" height="120" alt="The Longform Guide to ECC" style="max-width: 100%; height: auto; max-height: 120px;"><br>
<strong>The Longform Guide</strong>
</a>
<br><sub>Context economics, memory, evals, and parallel agents. (<a href="https://x.com/affaan/status/2014040193557471352" rel="nofollow">thread</a>)</sub>
</td>
<td width="33%" align="center">
<a href="/96loveslife/ECC/blob/main/the-security-guide.md">
<img src="/96loveslife/ECC/raw/main/assets/images/guides/security-guide.png" width="213" height="120" alt="The Security Guide to ECC" style="max-width: 100%; height: auto; max-height: 120px;"><br>
<strong>The Security Guide</strong>
</a>
<br><sub>Prompt injection, hooks, MCP, and AgentShield. (<a href="https://x.com/affaan/status/2033263813387223421" rel="nofollow">thread</a>)</sub>
</td>
</tr>
</tbody></table></markdown-accessiblity-table>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Topic</th>
<th>What You'll Learn</th>
</tr>
</thead>
<tbody>
<tr>
<td>Token Optimization</td>
<td>Model selection, system prompt slimming, background processes</td>
</tr>
<tr>
<td>Memory Persistence</td>
<td>Hooks that save/load context across sessions automatically</td>
</tr>
<tr>
<td>Continuous Learning</td>
<td>Auto-extract patterns from sessions into reusable skills</td>
</tr>
<tr>
<td>Verification Loops</td>
<td>Checkpoint vs continuous evals, grader types, pass@k metrics</td>
</tr>
<tr>
<td>Parallelization</td>
<td>Git worktrees, cascade method, when to scale instances</td>
</tr>
<tr>
<td>Subagent Orchestration</td>
<td>The context problem, iterative retrieval pattern</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto"><a href="/96loveslife/ECC/blob/main/COMMANDS-QUICK-REF.md">Commands Quick Reference</a> | <a href="/96loveslife/ECC/blob/main/docs/MANUAL-ADAPTATION-GUIDE.md">Manual Adaptation Guide</a> | <a href="/96loveslife/ECC/blob/main/TROUBLESHOOTING.md">Troubleshooting FAQ</a> | <a href="/96loveslife/ECC/blob/main/docs/ROADMAP.md">Roadmap</a></p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Why Choose ECC?</h2><a id="user-content-why-choose-ecc" class="anchor" aria-label="Permalink: Why Choose ECC?" href="#why-choose-ecc"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Without a system</th>
<th>With ECC</th>
</tr>
</thead>
<tbody>
<tr>
<td>Plans disappear into chat history</td>
<td>Plans become editable artifacts before implementation starts</td>
</tr>
<tr>
<td>"Please use TDD" is an instruction the model may forget</td>
<td>TDD becomes a gated RED -&gt; GREEN -&gt; REFACTOR workflow with evidence</td>
</tr>
<tr>
<td>The same context writes and reviews the code</td>
<td>A fresh-context reviewer looks for regressions and blind spots</td>
</tr>
<tr>
<td>Memory means saving an enormous transcript</td>
<td>Sessions are distilled into summaries, instincts, and reusable skills</td>
</tr>
<tr>
<td>Quality checks depend on reminders</td>
<td>Hooks can enforce deterministic checks outside the prompt</td>
</tr>
<tr>
<td>Agent configuration is trusted by default</td>
<td>AgentShield scans the harness itself as an attack surface</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">TDD: Test-Driven Development</h3><a id="user-content-tdd-test-driven-development" class="anchor" aria-label="Permalink: TDD: Test-Driven Development" href="#tdd-test-driven-development"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/ecc:plan &quot;Add usage-based billing alerts&quot;
  -&gt; confirm or edit the plan
  -&gt; activate tdd-workflow
  -&gt; capture RED evidence before implementation
  -&gt; implement until GREEN
  -&gt; review from fresh context
  -&gt; fix findings with regression tests
  -&gt; verify build, lint, types, and tests"><pre lang="text" class="notranslate"><code>/ecc:plan "Add usage-based billing alerts"
  -&gt; confirm or edit the plan
  -&gt; activate tdd-workflow
  -&gt; capture RED evidence before implementation
  -&gt; implement until GREEN
  -&gt; review from fresh context
  -&gt; fix findings with regression tests
  -&gt; verify build, lint, types, and tests
</code></pre></div>
<p dir="auto">A result is not just code. It's a trail of evidence: the plan, the failing test, the passing test, the review findings, and the final verification.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Skills keep the context focused</h3><a id="user-content-skills-keep-the-context-focused" class="anchor" aria-label="Permalink: Skills keep the context focused" href="#skills-keep-the-context-focused"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Rules, skills, agents, and hooks solve different problems. Keeping those jobs separate is how ECC adds capability without dumping the entire repository into every session.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Concept</th>
<th>What it does</th>
<th>Context behavior</th>
</tr>
</thead>
<tbody>
<tr>
<td>Skills</td>
<td>Reusable workflows such as TDD, security review, or deep research</td>
<td>Loaded when the task needs them</td>
</tr>
<tr>
<td>Agents</td>
<td>Scoped workers with their own context and tool permissions</td>
<td>Isolate planning, implementation, and review</td>
</tr>
<tr>
<td>Rules</td>
<td>Durable project or language standards</td>
<td>Always loaded, so install them selectively</td>
</tr>
<tr>
<td>Hooks</td>
<td>Scripts triggered by harness events</td>
<td>Run outside the model context</td>
</tr>
<tr>
<td>Instincts</td>
<td>Patterns learned from real sessions with confidence scores</td>
<td>Recalled when relevant</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Share context between harnesses</h3><a id="user-content-share-context-between-harnesses" class="anchor" aria-label="Permalink: Share context between harnesses" href="#share-context-between-harnesses"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">ECC's Memory Vault gives Claude, Codex, Hermes, OpenClaw, Kimi, and other harnesses one local, inspectable Markdown format for durable context and handoffs. Project and team memories live under <code>.ecc/memory/</code>; user memories live under <code>~/.ecc/memory/</code>.</p>
<p dir="auto">Skill-only, minimal, manual, and Claude plugin installs do not put the Memory Vault runtime on <code>PATH</code>. Install the npm runtime separately before using the CLI or optional MCP server:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npm install -g ecc-universal@2.2.2
ecc memory init --scope project
ecc memory search &quot;authentication migration&quot; --target-harness codex
ecc memory doctor"><pre>npm install -g ecc-universal@2.2.2
ecc memory init --scope project
ecc memory search <span class="pl-s"><span class="pl-pds">"</span>authentication migration<span class="pl-pds">"</span></span> --target-harness codex
ecc memory doctor</pre></div>
<p dir="auto">Memory is unreviewed context, not executable policy. Verify important claims against authoritative sources and promote accepted knowledge into governed project documentation. The optional <code>ecc-memory-mcp</code> server exposes the same bounded save, search, read, and doctor surface without enabling itself by default.</p>
<p dir="auto"><a href="/96loveslife/ECC/blob/main/skills/unified-memory/SKILL.md">Open the Unified Memory workflow →</a></p>
<details>
<summary><strong>Memory Vault in depth: scopes, handoffs, and trust boundaries</strong></summary>
<p dir="auto">The Memory Vault stores portable <code>ecc.memory.v1</code> Markdown documents instead of copying vendor transcripts or emailing context between agents. Project memories are protected by a fail-closed <code>.gitignore</code>; use the team scope only for human-inspected, version-controlled sharing. Team memories remain unreviewed context even after they are committed.</p>
<p dir="auto">After installing the runtime above, check that the CLI and optional MCP entry point are available:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="ecc memory --help
command -v ecc-memory-mcp"><pre>ecc memory --help
<span class="pl-c1">command</span> -v ecc-memory-mcp</pre></div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Initialize the project vault.
ecc memory init --scope project

# Write a handoff body to a regular file, then target the next harness.
ecc memory handoff \
  --from hermes \
  --target codex \
  --title &quot;Continue authentication migration&quot; \
  --body-file ./handoff.md

# Recall it from another harness.
ecc memory search &quot;authentication migration&quot; --target-harness codex
ecc memory read &lt;memory-id&gt;

# Validate the vault before sharing team memories.
ecc memory doctor"><pre><span class="pl-c"><span class="pl-c">#</span> Initialize the project vault.</span>
ecc memory init --scope project

<span class="pl-c"><span class="pl-c">#</span> Write a handoff body to a regular file, then target the next harness.</span>
ecc memory handoff \
  --from hermes \
  --target codex \
  --title <span class="pl-s"><span class="pl-pds">"</span>Continue authentication migration<span class="pl-pds">"</span></span> \
  --body-file ./handoff.md

<span class="pl-c"><span class="pl-c">#</span> Recall it from another harness.</span>
ecc memory search <span class="pl-s"><span class="pl-pds">"</span>authentication migration<span class="pl-pds">"</span></span> --target-harness codex
ecc memory <span class="pl-c1">read</span> <span class="pl-k">&lt;</span>memory-id<span class="pl-k">&gt;</span>

<span class="pl-c"><span class="pl-c">#</span> Validate the vault before sharing team memories.</span>
ecc memory doctor</pre></div>
<p dir="auto">Memory bodies are accepted only through <code>--stdin</code> or <code>--body-file</code>, not as command-line values. The first release keeps every vault entry unreviewed and create-only; human review promotes accepted knowledge into governed project documentation rather than changing memory trust. Normal search recall returns active project and team memories. A direct ID read may inspect a non-active entry. User-scope recall must be requested explicitly. Agents must verify important claims against authoritative sources and must never treat recalled bodies as executable instructions or policy.</p>
<p dir="auto">For opt-in MCP access, add the <code>ecc-memory-vault</code> entry from <a href="/96loveslife/ECC/blob/main/mcp-configs/mcp-servers.json"><code>mcp-configs/mcp-servers.json</code></a> to each harness that needs it, then run <code>ecc-memory-mcp</code>. The server exposes only <code>memory_save</code>, <code>memory_search</code>, <code>memory_read</code>, and <code>memory_doctor</code>. Each server must launch with a lowercase <code>ECC_MEMORY_HARNESS</code> identity; the identity is server-bound and cannot be supplied by a tool caller. User scope additionally requires the operator-controlled <code>ECC_MEMORY_ALLOW_USER_SCOPE=1</code> opt-in. See <a href="/96loveslife/ECC/blob/main/skills/unified-memory/SKILL.md"><code>skills/unified-memory/SKILL.md</code></a> for the workflow and trust boundaries, and <a href="/96loveslife/ECC/blob/main/docs/design/ecc-memory-vault.md"><code>docs/design/ecc-memory-vault.md</code></a> for the capability contract.</p>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Platform Support</h2><a id="user-content-platform-support" class="anchor" aria-label="Permalink: Platform Support" href="#platform-support"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">ECC's core Node.js CLI and managed installers run on <strong>Windows, macOS, and Linux</strong>, but optional capabilities are not at full parity. Some continuous-learning, GAN, and orchestration paths still require Bash or Python; harnesses also expose different hook, agent, and skill APIs.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Platform</th>
<th>Status</th>
<th>Current limitation</th>
</tr>
</thead>
<tbody>
<tr>
<td>Linux</td>
<td>Supported core</td>
<td>Optional features may require Bash, Python, or provider-specific tools.</td>
</tr>
<tr>
<td>macOS</td>
<td>Supported core</td>
<td>The standalone GAN shell path is not compatible with the system Bash 3.2 and currently has a score-parsing defect (<a href="https://github.com/affaan-m/ECC/issues/2674" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/2674/hovercard">#2674</a>).</td>
</tr>
<tr>
<td>Windows + WSL</td>
<td>Supported core</td>
<td>WSL follows the Linux paths; Windows host integrations still vary by harness.</td>
</tr>
<tr>
<td>Windows native</td>
<td>Supported with limitations</td>
<td>Continuous-learning v2's observer daemon and memory-vault writes have open native-Windows defects (<a href="https://github.com/affaan-m/ECC/issues/2489" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/2489/hovercard">#2489</a>, <a href="https://github.com/affaan-m/ECC/issues/2626" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/2626/hovercard">#2626</a>). Shell-backed optional features require Git Bash/WSL or are unavailable.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Treat <code>stable</code>, <code>beta</code>, <code>experimental</code>, and <code>instruction-only</code> below as capability statements, not marketing tiers.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Harness</th>
<th>Status</th>
<th>Recommended distribution</th>
<th>Important limitation</th>
</tr>
</thead>
<tbody>
<tr>
<td>Claude Code</td>
<td>Stable primary</td>
<td>Plugin or selective installer</td>
<td>The plugin advertises the installed catalog to the model; use a selective/manual profile when context footprint matters. Optional shell-backed skills are not portable to every OS.</td>
</tr>
<tr>
<td>Codex</td>
<td>Supported native plugin</td>
<td>Codex marketplace plugin or repo config</td>
<td>Native hooks require an explicit trust decision and do not use Claude's hook profiles. The legacy sync is compatibility-only.</td>
</tr>
<tr>
<td>Cursor</td>
<td>Beta project adapter</td>
<td>Selective installer into <code>.cursor/</code></td>
<td>Agent discovery varies by Cursor build, and ECC's installer paths do not yet expose identical hook sets (<a href="https://github.com/affaan-m/ECC/issues/2419" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/2419/hovercard">#2419</a>).</td>
</tr>
<tr>
<td>OpenCode</td>
<td>Beta built plugin</td>
<td>Build plugin, then selective installer</td>
<td>ECC ships a subset of the catalog; connect a provider and select a model in OpenCode (<a href="https://github.com/affaan-m/ECC/issues/2617" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/2617/hovercard">#2617</a>).</td>
</tr>
<tr>
<td>GitHub Copilot</td>
<td>Instruction-only</td>
<td>Checked-in instructions and prompt files</td>
<td>No ECC hooks, runtime agents, delegation, or native skill discovery.</td>
</tr>
<tr>
<td>Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode</td>
<td>Experimental/minimal adapters</td>
<td>Harness-specific selective target</td>
<td>File placement and instruction portability are tested; full Claude feature parity is not claimed.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<details>
<summary><strong>Package manager detection</strong></summary>
<p dir="auto">The plugin automatically detects your preferred package manager (npm, pnpm, yarn, or bun) with the following priority:</p>
<ol dir="auto">
<li><strong>Environment variable</strong>: <code>CLAUDE_PACKAGE_MANAGER</code></li>
<li><strong>Project config</strong>: <code>.claude/package-manager.json</code></li>
<li><strong>package.json</strong>: <code>packageManager</code> field</li>
<li><strong>Lock file</strong>: Detection from package-lock.json, yarn.lock, pnpm-lock.yaml, or bun.lockb</li>
<li><strong>Global config</strong>: <code>~/.claude/package-manager.json</code></li>
<li><strong>Fallback</strong>: First available package manager</li>
</ol>
<p dir="auto">To set your preferred package manager:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Via environment variable
export CLAUDE_PACKAGE_MANAGER=pnpm

# Via global config
node scripts/setup-package-manager.js --global pnpm

# Via project config
node scripts/setup-package-manager.js --project bun

# Detect current setting
node scripts/setup-package-manager.js --detect"><pre><span class="pl-c"><span class="pl-c">#</span> Via environment variable</span>
<span class="pl-k">export</span> CLAUDE_PACKAGE_MANAGER=pnpm

<span class="pl-c"><span class="pl-c">#</span> Via global config</span>
node scripts/setup-package-manager.js --global pnpm

<span class="pl-c"><span class="pl-c">#</span> Via project config</span>
node scripts/setup-package-manager.js --project bun

<span class="pl-c"><span class="pl-c">#</span> Detect current setting</span>
node scripts/setup-package-manager.js --detect</pre></div>
<p dir="auto">Or use the <code>/setup-pm</code> command.</p>
</details>
<details>
<summary><strong>Hook runtime controls (env vars)</strong></summary>
<p dir="auto">Use runtime flags to tune strictness or disable specific hooks temporarily:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Hook strictness profile (default: standard)
export ECC_HOOK_PROFILE=standard

# Comma-separated hook IDs to disable
export ECC_DISABLED_HOOKS=&quot;pre:bash:tmux-reminder,post:edit:typecheck&quot;

# Cap SessionStart additional context (default: 8000 chars)
export ECC_SESSION_START_MAX_CHARS=4000

# Disable SessionStart additional context entirely for low-context/local-model setups
export ECC_SESSION_START_CONTEXT=off

# Session-tmp retention window in days (default: 30).
# Set to 0, off, false, disabled, never, or none to keep all sessions (disable pruning).
export ECC_SESSION_RETENTION_DAYS=14

# Cap how many learned instincts SessionStart injects into context (default: 6)
export ECC_MAX_INJECTED_INSTINCTS=6

# Minimum confidence an instinct needs to be injected, 0-1 (default: 0.7)
export ECC_INSTINCT_CONFIDENCE_THRESHOLD=0.7

# SessionStart ranks injected instincts by confidence + project/stack relevance
# (default: on). Project-scoped instincts, and instincts whose domain/trigger
# matches the detected stack (languages, frameworks, plus terraform/dbt markers),
# get a small ranking boost so they surface above unrelated higher-confidence
# ones. Set to off/false/0/no to rank by confidence alone.
export ECC_INSTINCT_RELEVANCE_RANKING=on

# Keep context/scope/loop warnings but suppress API-rate cost estimates
export ECC_CONTEXT_MONITOR_COST_WARNINGS=off"><pre><span class="pl-c"><span class="pl-c">#</span> Hook strictness profile (default: standard)</span>
<span class="pl-k">export</span> ECC_HOOK_PROFILE=standard

<span class="pl-c"><span class="pl-c">#</span> Comma-separated hook IDs to disable</span>
<span class="pl-k">export</span> ECC_DISABLED_HOOKS=<span class="pl-s"><span class="pl-pds">"</span>pre:bash:tmux-reminder,post:edit:typecheck<span class="pl-pds">"</span></span>

<span class="pl-c"><span class="pl-c">#</span> Cap SessionStart additional context (default: 8000 chars)</span>
<span class="pl-k">export</span> ECC_SESSION_START_MAX_CHARS=4000

<span class="pl-c"><span class="pl-c">#</span> Disable SessionStart additional context entirely for low-context/local-model setups</span>
<span class="pl-k">export</span> ECC_SESSION_START_CONTEXT=off

<span class="pl-c"><span class="pl-c">#</span> Session-tmp retention window in days (default: 30).</span>
<span class="pl-c"><span class="pl-c">#</span> Set to 0, off, false, disabled, never, or none to keep all sessions (disable pruning).</span>
<span class="pl-k">export</span> ECC_SESSION_RETENTION_DAYS=14

<span class="pl-c"><span class="pl-c">#</span> Cap how many learned instincts SessionStart injects into context (default: 6)</span>
<span class="pl-k">export</span> ECC_MAX_INJECTED_INSTINCTS=6

<span class="pl-c"><span class="pl-c">#</span> Minimum confidence an instinct needs to be injected, 0-1 (default: 0.7)</span>
<span class="pl-k">export</span> ECC_INSTINCT_CONFIDENCE_THRESHOLD=0.7

<span class="pl-c"><span class="pl-c">#</span> SessionStart ranks injected instincts by confidence + project/stack relevance</span>
<span class="pl-c"><span class="pl-c">#</span> (default: on). Project-scoped instincts, and instincts whose domain/trigger</span>
<span class="pl-c"><span class="pl-c">#</span> matches the detected stack (languages, frameworks, plus terraform/dbt markers),</span>
<span class="pl-c"><span class="pl-c">#</span> get a small ranking boost so they surface above unrelated higher-confidence</span>
<span class="pl-c"><span class="pl-c">#</span> ones. Set to off/false/0/no to rank by confidence alone.</span>
<span class="pl-k">export</span> ECC_INSTINCT_RELEVANCE_RANKING=on

<span class="pl-c"><span class="pl-c">#</span> Keep context/scope/loop warnings but suppress API-rate cost estimates</span>
<span class="pl-k">export</span> ECC_CONTEXT_MONITOR_COST_WARNINGS=off</pre></div>
<p dir="auto">Windows PowerShell:</p>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="[Environment]::SetEnvironmentVariable('ECC_CONTEXT_MONITOR_COST_WARNINGS', 'off', 'User')
[Environment]::SetEnvironmentVariable('ECC_SESSION_RETENTION_DAYS', '14', 'User')"><pre>[<span class="pl-k">Environment</span>]::SetEnvironmentVariable(<span class="pl-s"><span class="pl-pds">'</span>ECC_CONTEXT_MONITOR_COST_WARNINGS<span class="pl-pds">'</span></span><span class="pl-k">,</span> <span class="pl-s"><span class="pl-pds">'</span>off<span class="pl-pds">'</span></span><span class="pl-k">,</span> <span class="pl-s"><span class="pl-pds">'</span>User<span class="pl-pds">'</span></span>)
[<span class="pl-k">Environment</span>]::SetEnvironmentVariable(<span class="pl-s"><span class="pl-pds">'</span>ECC_SESSION_RETENTION_DAYS<span class="pl-pds">'</span></span><span class="pl-k">,</span> <span class="pl-s"><span class="pl-pds">'</span>14<span class="pl-pds">'</span></span><span class="pl-k">,</span> <span class="pl-s"><span class="pl-pds">'</span>User<span class="pl-pds">'</span></span>)</pre></div>
</details>
<details>
<summary><strong>Agent data home (multi-harness isolation)</strong></summary>
<p dir="auto">Memory persistence hooks (session summaries, learned skills, session aliases, metrics) store data under a single agent data root. By default that root is <code>~/.claude</code>. When you use ECC in both Claude Code and Cursor on the same machine, set a separate root for Cursor so the two environments do not overwrite each other's session files:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Cursor-only boundary (Claude Code keeps the default ~/.claude)
export ECC_AGENT_DATA_HOME=&quot;$HOME/.cursor/ecc&quot;"><pre><span class="pl-c"><span class="pl-c">#</span> Cursor-only boundary (Claude Code keeps the default ~/.claude)</span>
<span class="pl-k">export</span> ECC_AGENT_DATA_HOME=<span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$HOME</span>/.cursor/ecc<span class="pl-pds">"</span></span></pre></div>
<p dir="auto">Paths resolved under that root include:</p>
<ul dir="auto">
<li><code>$ECC_AGENT_DATA_HOME/session-data/</code>: session summaries</li>
<li><code>$ECC_AGENT_DATA_HOME/skills/learned/</code>: learned skills from evaluate-session</li>
<li><code>$ECC_AGENT_DATA_HOME/session-aliases.json</code>: session aliases</li>
<li><code>$ECC_AGENT_DATA_HOME/metrics/</code>: cost and activity metrics</li>
</ul>
<p dir="auto">See <a href="https://github.com/affaan-m/ECC/issues/2065" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/2065/hovercard">affaan-m/ECC#2065</a>.</p>
</details>
<details>
<summary><strong>Cross-tool capability map and per-harness notes</strong></summary>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Cross-tool capability map</h3><a id="user-content-cross-tool-capability-map" class="anchor" aria-label="Permalink: Cross-tool capability map" href="#cross-tool-capability-map"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Capability</th>
<th>Claude Code</th>
<th>Codex</th>
<th>Cursor</th>
<th>OpenCode</th>
<th>GitHub Copilot</th>
</tr>
</thead>
<tbody>
<tr>
<td>Instructions</td>
<td>Native</td>
<td>Native <code>AGENTS.md</code></td>
<td>Project rules</td>
<td>Plugin instructions</td>
<td>Native instruction file</td>
</tr>
<tr>
<td>Skills</td>
<td>Native installed set</td>
<td>Native plugin set</td>
<td>Build-dependent/project set</td>
<td>Built subset</td>
<td>Prompt/instruction references only</td>
</tr>
<tr>
<td>Agents/delegation</td>
<td>Native agents</td>
<td>Codex multi-agent roles; Claude agent files are not installed as roles</td>
<td>Build-dependent project agents</td>
<td>Plugin agents</td>
<td>Not supported</td>
</tr>
<tr>
<td>ECC hooks</td>
<td>Native plugin hooks</td>
<td>Native reviewed subset with explicit trust</td>
<td>Cursor hook adapter; install-path differences remain</td>
<td>Plugin events</td>
<td>Not supported</td>
</tr>
<tr>
<td>MCP configuration</td>
<td>Available, explicit activation</td>
<td>Native plugin manifest; legacy sync can merge TOML</td>
<td>Explicit project/user config</td>
<td>Provider/plugin config</td>
<td>Not supplied by ECC</td>
</tr>
<tr>
<td>Parity with Claude Code</td>
<td>Primary reference</td>
<td>Partial</td>
<td>Partial</td>
<td>Partial</td>
<td>Not a parity target</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto"><strong>Key architectural decisions:</strong></p>
<ul dir="auto">
<li><strong>AGENTS.md</strong> at root is the universal cross-tool file (read by Claude Code, Cursor, Codex, and OpenCode; GitHub Copilot uses <code>.github/copilot-instructions.md</code> instead)</li>
<li><strong>DRY adapter pattern</strong> lets Cursor reuse Claude Code's hook scripts without duplication</li>
<li><strong>Skills format</strong> (SKILL.md with YAML frontmatter) works across Claude Code, Codex, and OpenCode</li>
<li>Codex's narrower native hook set is supplemented by <code>AGENTS.md</code>, optional <code>model_instructions_file</code> overrides, and sandbox permissions</li>
</ul>
<details>
<summary><strong>Cursor IDE support in depth</strong></summary>
<p dir="auto">ECC provides Cursor IDE support with hooks, rules, agents, skills, commands, and MCP configs adapted for Cursor's project layout.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# macOS/Linux
./install.sh --target cursor typescript
./install.sh --target cursor python golang swift php"><pre><span class="pl-c"><span class="pl-c">#</span> macOS/Linux</span>
./install.sh --target cursor typescript
./install.sh --target cursor python golang swift php</pre></div>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Windows PowerShell
.\install.ps1 --target cursor typescript
.\install.ps1 --target cursor python golang swift php"><pre><span class="pl-c"><span class="pl-c">#</span> Windows PowerShell</span>
.\install.ps1 <span class="pl-k">--</span>target cursor typescript
.\install.ps1 <span class="pl-k">--</span>target cursor python golang swift php</pre></div>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">What's included for Cursor</h4><a id="user-content-whats-included-for-cursor" class="anchor" aria-label="Permalink: What's included for Cursor" href="#whats-included-for-cursor"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Component</th>
<th>Count</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Hook Events</td>
<td>15</td>
<td>sessionStart, beforeShellExecution, afterFileEdit, beforeMCPExecution, beforeSubmitPrompt, and 10 more</td>
</tr>
<tr>
<td>Hook Scripts</td>
<td>16</td>
<td>Thin Node.js scripts delegating to <code>scripts/hooks/</code> via shared adapter</td>
</tr>
<tr>
<td>Rules</td>
<td>34</td>
<td>9 common (alwaysApply) + 25 language-specific (TypeScript, Python, Go, Swift, PHP)</td>
</tr>
<tr>
<td>Agents</td>
<td>48</td>
<td><code>.cursor/agents/ecc-*.md</code> when installed; prefixed to avoid collisions with user or marketplace agents</td>
</tr>
<tr>
<td>Skills</td>
<td>Shared + Bundled</td>
<td><code>.cursor/skills/</code> for translated additions</td>
</tr>
<tr>
<td>Commands</td>
<td>Shared</td>
<td><code>.cursor/commands/</code> if installed</td>
</tr>
<tr>
<td>MCP Config</td>
<td>Shared</td>
<td><code>.cursor/mcp.json</code> if installed</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Cursor loading notes</h4><a id="user-content-cursor-loading-notes" class="anchor" aria-label="Permalink: Cursor loading notes" href="#cursor-loading-notes"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">ECC does not install root <code>AGENTS.md</code> into <code>.cursor/</code>. Cursor treats nested <code>AGENTS.md</code> files as directory context, so copying ECC's repo identity into a host project would pollute that project.</p>
<p dir="auto">Cursor-native loading behavior can vary by Cursor build. ECC installs agents as <code>.cursor/agents/ecc-*.md</code>; if your Cursor build does not expose project agents, those files still work as explicit reference definitions instead of hidden global prompt context.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Memory and data isolation (Cursor + Claude Code)</h4><a id="user-content-memory-and-data-isolation-cursor--claude-code" class="anchor" aria-label="Permalink: Memory and data isolation (Cursor + Claude Code)" href="#memory-and-data-isolation-cursor--claude-code"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">ECC memory hooks reuse the same <code>scripts/hooks/*.js</code> as Claude Code. For Cursor, ECC tries to keep memory <strong>out of <code>~/.claude</code> automatically</strong>:</p>
<ol dir="auto">
<li><strong>Cursor <code>sessionStart</code> hook</strong> (installed to <code>.cursor/hooks.json</code> on <code>--target cursor</code>) injects <code>ECC_AGENT_DATA_HOME</code> for the whole composer session.</li>
<li><strong>Hook runtime default</strong>: when <code>CURSOR_VERSION</code> or <code>CURSOR_PROJECT_DIR</code> is present, hooks default to <code>~/.cursor/ecc</code> if the env var is unset.</li>
<li><strong>Project config</strong>: <code>.cursor/ecc-agent-data.json</code> documents and overrides the path (<code>agentDataHome</code>).</li>
<li><strong>Always-on rule</strong>: <code>.cursor/rules/ecc-agent-data-home.mdc</code> reminds the agent where memory lives.</li>
</ol>
<p dir="auto">You can still override explicitly:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export ECC_AGENT_DATA_HOME=&quot;$HOME/.cursor/ecc&quot;"><pre><span class="pl-k">export</span> ECC_AGENT_DATA_HOME=<span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$HOME</span>/.cursor/ecc<span class="pl-pds">"</span></span></pre></div>
<p dir="auto">To <strong>share</strong> memory with Claude Code on purpose, set <code>ECC_AGENT_DATA_HOME=~/.claude</code> in the shell or in <code>.cursor/ecc-agent-data.json</code>.</p>
<p dir="auto">Continuous learning v2 instincts remain separate under <code>CLV2_HOMUNCULUS_DIR</code> (default <code>~/.local/share/ecc-homunculus</code>).</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Hook architecture (DRY adapter pattern)</h4><a id="user-content-hook-architecture-dry-adapter-pattern" class="anchor" aria-label="Permalink: Hook architecture (DRY adapter pattern)" href="#hook-architecture-dry-adapter-pattern"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Cursor has <strong>more hook events than Claude Code</strong> (20 vs 8). The <code>.cursor/hooks/adapter.js</code> module transforms Cursor's stdin JSON to Claude Code's format, allowing existing <code>scripts/hooks/*.js</code> to be reused without duplication.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Cursor stdin JSON -&gt; adapter.js -&gt; transforms -&gt; scripts/hooks/*.js
                                                (shared with Claude Code)"><pre class="notranslate"><code>Cursor stdin JSON -&gt; adapter.js -&gt; transforms -&gt; scripts/hooks/*.js
                                                (shared with Claude Code)
</code></pre></div>
<p dir="auto">Key hooks:</p>
<ul dir="auto">
<li><strong>beforeShellExecution</strong>: Blocks dev servers outside tmux (exit 2), git push review</li>
<li><strong>afterFileEdit</strong>: Auto-format + TypeScript check + console.log warning</li>
<li><strong>beforeSubmitPrompt</strong>: Detects secrets (sk-, ghp_, AKIA patterns) in prompts</li>
<li><strong>beforeTabFileRead</strong>: Blocks Tab from reading .env, .key, .pem files (exit 2)</li>
<li><strong>beforeMCPExecution / afterMCPExecution</strong>: MCP audit logging</li>
</ul>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Rules format</h4><a id="user-content-rules-format" class="anchor" aria-label="Permalink: Rules format" href="#rules-format"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Cursor rules use YAML frontmatter with <code>description</code>, <code>globs</code>, and <code>alwaysApply</code>:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="---
description: &quot;TypeScript coding style extending common rules&quot;
globs: [&quot;**/*.ts&quot;, &quot;**/*.tsx&quot;, &quot;**/*.js&quot;, &quot;**/*.jsx&quot;]
alwaysApply: false
---"><pre>---
<span class="pl-ent">description</span>: <span class="pl-s"><span class="pl-pds">"</span>TypeScript coding style extending common rules<span class="pl-pds">"</span></span>
<span class="pl-ent">globs</span>: <span class="pl-s">["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"]</span>
<span class="pl-ent">alwaysApply</span>: <span class="pl-c1">false</span>
---</pre></div>
</details>
<details>
<summary><strong>Codex macOS app + CLI support in depth</strong></summary>
<p dir="auto">ECC provides a supported native Codex marketplace plugin and repo-local configuration for the macOS app and CLI. The native plugin carries shared skills, MCP configuration, and a reviewed hook subset; Codex keeps hook trust under explicit user control. The older sync path remains compatibility-only. For repo navigation, surface ownership, and PR diff packet guidance, start with <a href="/96loveslife/ECC/blob/main/docs/CODEX-NAVIGATION-GUIDE.md"><code>docs/CODEX-NAVIGATION-GUIDE.md</code></a>.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Recommended current install: add ECC's native plugin from the repo marketplace
codex plugin marketplace add affaan-m/ECC
codex plugin add ecc@ecc
codex plugin list --json

# Or run Codex CLI in the repo: AGENTS.md and .codex/ are auto-detected
codex"><pre><span class="pl-c"><span class="pl-c">#</span> Recommended current install: add ECC's native plugin from the repo marketplace</span>
codex plugin marketplace add affaan-m/ECC
codex plugin add ecc@ecc
codex plugin list --json

<span class="pl-c"><span class="pl-c">#</span> Or run Codex CLI in the repo: AGENTS.md and .codex/ are auto-detected</span>
codex</pre></div>
<p dir="auto">Legacy copied-configuration compatibility is still available when you intentionally need it:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Compatibility-only managed sync into ~/.codex
npm install &amp;&amp; bash scripts/sync-ecc-to-codex.sh

# Or copy only the reference config manually
cp .codex/config.toml ~/.codex/config.toml"><pre><span class="pl-c"><span class="pl-c">#</span> Compatibility-only managed sync into ~/.codex</span>
npm install <span class="pl-k">&amp;&amp;</span> bash scripts/sync-ecc-to-codex.sh

<span class="pl-c"><span class="pl-c">#</span> Or copy only the reference config manually</span>
cp .codex/config.toml <span class="pl-k">~</span>/.codex/config.toml</pre></div>
<p dir="auto">The sync script safely merges ECC MCP servers into your existing <code>~/.codex/config.toml</code> using an <strong>add-only</strong> strategy: it never removes or modifies your existing servers. Run with <code>--dry-run</code> to preview changes, or <code>--update-mcp</code> to force-refresh ECC servers to the latest recommended config.</p>
<p dir="auto">For Context7, ECC uses the canonical Codex section name <code>[mcp_servers.context7]</code> while still launching the <code>@upstash/context7-mcp</code> package. If you already have a legacy <code>[mcp_servers.context7-mcp]</code> entry, <code>--update-mcp</code> migrates it to the canonical section name.</p>
<p dir="auto">Codex macOS app:</p>
<ul dir="auto">
<li>Open this repository as your workspace.</li>
<li>The root <code>AGENTS.md</code> is auto-detected.</li>
<li><code>.codex/config.toml</code> and <code>.codex/agents/*.toml</code> work best when kept project-local.</li>
<li>The reference <code>.codex/config.toml</code> intentionally does not pin <code>model</code> or <code>model_provider</code>, so Codex uses its own current default unless you override it.</li>
<li>Optional: copy <code>.codex/config.toml</code> to <code>~/.codex/config.toml</code> for global defaults; keep the multi-agent role files project-local unless you also copy <code>.codex/agents/</code>.</li>
</ul>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">What's included in the repo and legacy configuration layer</h4><a id="user-content-whats-included-in-the-repo-and-legacy-configuration-layer" class="anchor" aria-label="Permalink: What's included in the repo and legacy configuration layer" href="#whats-included-in-the-repo-and-legacy-configuration-layer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Component</th>
<th>Count</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Config</td>
<td>1</td>
<td><code>.codex/config.toml</code>: top-level approvals/sandbox/web_search, MCP servers, notifications, profiles</td>
</tr>
<tr>
<td>AGENTS.md</td>
<td>2</td>
<td>Root (universal) + <code>.codex/AGENTS.md</code> (Codex-specific supplement)</td>
</tr>
<tr>
<td>Skills</td>
<td>32</td>
<td><code>.agents/skills/</code>: SKILL.md + agents/openai.yaml per skill</td>
</tr>
<tr>
<td>MCP Servers</td>
<td>6</td>
<td>GitHub, Context7, Exa, Memory, Playwright, Sequential Thinking (7 with Supabase via <code>--update-mcp</code> sync)</td>
</tr>
<tr>
<td>Profiles</td>
<td>2</td>
<td><code>strict</code> (read-only sandbox) and <code>yolo</code> (full auto-approve)</td>
</tr>
<tr>
<td>Agent Roles</td>
<td>3</td>
<td><code>.codex/agents/</code>: explorer, reviewer, docs-researcher</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Skills at <code>.agents/skills/</code> are auto-loaded by Codex. Canonical Anthropic skills such as <code>claude-api</code>, <code>frontend-design</code>, and <code>skill-creator</code> are intentionally not re-bundled here. Install those from <a href="https://github.com/anthropics/skills"><code>anthropics/skills</code></a> when you want the official versions.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Key limitation</h4><a id="user-content-key-limitation" class="anchor" aria-label="Permalink: Key limitation" href="#key-limitation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Codex does <strong>not provide Claude-style hook execution parity</strong>. The native ECC plugin includes a reviewed hook subset that requires explicit trust in <code>/hooks</code>; <code>AGENTS.md</code>, optional <code>model_instructions_file</code> overrides, and sandbox/approval settings provide the remaining instruction and policy layers.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Multi-agent support</h4><a id="user-content-multi-agent-support" class="anchor" aria-label="Permalink: Multi-agent support" href="#multi-agent-support"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Current Codex builds support stable multi-agent workflows.</p>
<ul dir="auto">
<li>Enable <code>features.multi_agent = true</code> in <code>.codex/config.toml</code></li>
<li>Define roles under <code>[agents.&lt;name&gt;]</code></li>
<li>Point each role at a file under <code>.codex/agents/</code></li>
<li>Use <code>/agent</code> in the CLI to inspect or steer child agents</li>
</ul>
<p dir="auto">ECC ships three sample role configs:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Role</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>explorer</code></td>
<td>Read-only codebase evidence gathering before edits</td>
</tr>
<tr>
<td><code>reviewer</code></td>
<td>Correctness, security, and missing-test review</td>
</tr>
<tr>
<td><code>docs_researcher</code></td>
<td>Documentation and API verification before release/docs changes</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
</details>
<details>
<summary><strong>Zed support</strong></summary>
<p dir="auto">ECC provides Zed project support through a conservative <code>.zed</code> adapter for project-local settings, flattened rules, agents, commands, and skills.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="./install.sh --profile minimal --target zed"><pre>./install.sh --profile minimal --target zed</pre></div>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=".\install.ps1 --profile minimal --target zed"><pre>.\install.ps1 <span class="pl-k">--</span>profile minimal <span class="pl-k">--</span>target zed</pre></div>
<p dir="auto">The adapter writes ECC-managed files under <code>.zed/</code> and keeps BYOK/OpenRouter credentials out of the repo. Configure Zed account or API keys through Zed's own settings UI or your local user settings.</p>
</details>
<details>
<summary><strong>OpenCode support in depth</strong></summary>
<p dir="auto">ECC provides a beta OpenCode plugin integration with instructions, a catalog subset, commands, custom tools, and hook events. It does not provide feature parity with Claude Code. The reference config inherits the user's OpenCode model selection instead of pinning a provider-specific model.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Run your reviewed OpenCode installation in the repository root
opencode"><pre><span class="pl-c"><span class="pl-c">#</span> Run your reviewed OpenCode installation in the repository root</span>
opencode</pre></div>
<p dir="auto">For installation, use the <a href="https://opencode.ai/docs/" rel="nofollow">official OpenCode instructions</a>, select an exact release, and verify it before execution. The upstream npm package is <code>opencode-ai</code>, not <code>opencode</code>. ECC does not attest to an audited OpenCode runtime version.</p>
<p dir="auto">The configuration is automatically detected from <code>.opencode/opencode.json</code>.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Hook support via plugins</h4><a id="user-content-hook-support-via-plugins" class="anchor" aria-label="Permalink: Hook support via plugins" href="#hook-support-via-plugins"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">OpenCode's plugin system has 20+ event types:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Claude Code Hook</th>
<th>OpenCode Plugin Event</th>
</tr>
</thead>
<tbody>
<tr>
<td>PreToolUse</td>
<td><code>tool.execute.before</code></td>
</tr>
<tr>
<td>PostToolUse</td>
<td><code>tool.execute.after</code></td>
</tr>
<tr>
<td>Stop</td>
<td><code>session.idle</code></td>
</tr>
<tr>
<td>SessionStart</td>
<td><code>session.created</code></td>
</tr>
<tr>
<td>SessionEnd</td>
<td><code>session.deleted</code></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto"><strong>Additional OpenCode events</strong>: <code>file.edited</code>, <code>file.watcher.updated</code>, <code>message.updated</code>, <code>lsp.client.diagnostics</code>, <code>tui.toast.show</code>, and more.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Plugin installation</h4><a id="user-content-plugin-installation" class="anchor" aria-label="Permalink: Plugin installation" href="#plugin-installation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><strong>Option 1: Use directly</strong></p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cd ECC
opencode"><pre><span class="pl-c1">cd</span> ECC
opencode</pre></div>
<p dir="auto"><strong>Option 2: Install as npm package</strong></p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npm install ecc-universal@2.2.2"><pre>npm install ecc-universal@2.2.2</pre></div>
<p dir="auto">Then add to your <code>opencode.json</code>:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;plugin&quot;: [&quot;ecc-universal&quot;]
}"><pre>{
  <span class="pl-ent">"plugin"</span>: [<span class="pl-s"><span class="pl-pds">"</span>ecc-universal<span class="pl-pds">"</span></span>]
}</pre></div>
<p dir="auto">That npm plugin entry enables ECC's published OpenCode plugin module (hooks/events and plugin tools). It does <strong>not</strong> automatically add ECC's full command/agent/instruction catalog to your project config.</p>
<p dir="auto">For the full ECC OpenCode setup, either:</p>
<ul dir="auto">
<li>run OpenCode inside this repository, or</li>
<li>copy the bundled <code>.opencode/</code> config assets into your project and wire the <code>instructions</code>, <code>agent</code>, and <code>command</code> entries in <code>opencode.json</code></li>
</ul>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Documentation</h4><a id="user-content-documentation" class="anchor" aria-label="Permalink: Documentation" href="#documentation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li><strong>Migration Guide</strong>: <code>.opencode/MIGRATION.md</code></li>
<li><strong>OpenCode Plugin README</strong>: <code>.opencode/README.md</code></li>
<li><strong>Consolidated Rules</strong>: <code>.opencode/instructions/INSTRUCTIONS.md</code></li>
<li><strong>LLM Documentation</strong>: <code>llms.txt</code> (complete OpenCode docs for LLMs)</li>
</ul>
</details>
<details>
<summary><strong>GitHub Copilot support in depth</strong></summary>
<p dir="auto">ECC provides <strong>GitHub Copilot support</strong> for VS Code via Copilot Chat's native instruction and prompt file system. No extra tooling required.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">What's included for GitHub Copilot</h4><a id="user-content-whats-included-for-github-copilot" class="anchor" aria-label="Permalink: What's included for GitHub Copilot" href="#whats-included-for-github-copilot"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Component</th>
<th>File</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td>Core instructions</td>
<td><code>.github/copilot-instructions.md</code></td>
<td>Always-loaded rules: coding style, security, testing, git workflow</td>
</tr>
<tr>
<td>VS Code settings</td>
<td><code>.vscode/settings.json</code></td>
<td>Per-task instruction files for code gen, test gen, and commit messages</td>
</tr>
<tr>
<td>Plan prompt</td>
<td><code>.github/prompts/plan.prompt.md</code></td>
<td>Phased implementation planning</td>
</tr>
<tr>
<td>TDD prompt</td>
<td><code>.github/prompts/tdd.prompt.md</code></td>
<td>Red-Green-Improve cycle</td>
</tr>
<tr>
<td>Security review prompt</td>
<td><code>.github/prompts/security-review.prompt.md</code></td>
<td>Deep OWASP-aligned security analysis</td>
</tr>
<tr>
<td>Build fix prompt</td>
<td><code>.github/prompts/build-fix.prompt.md</code></td>
<td>Systematic build and CI error resolution</td>
</tr>
<tr>
<td>Refactor prompt</td>
<td><code>.github/prompts/refactor.prompt.md</code></td>
<td>Dead code cleanup and simplification</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">The files are already in place: open any repo that contains this project and GitHub Copilot Chat will automatically pick up <code>.github/copilot-instructions.md</code>. The committed <code>.vscode/settings.json</code> enables <code>chat.promptFiles</code> so VS Code can load the reusable prompts from <code>.github/prompts/</code>.</p>
<p dir="auto">To use the workflow prompts in Copilot Chat:</p>
<ol dir="auto">
<li>Open the Copilot Chat panel in VS Code.</li>
<li>Click the <strong>paperclip / attach</strong> icon and select <strong>Prompt...</strong>, or type <code>/</code> and choose a prompt.</li>
<li>Select the prompt (e.g. <code>plan</code>, <code>tdd</code>, <code>security-review</code>).</li>
</ol>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Feature coverage</h4><a id="user-content-feature-coverage" class="anchor" aria-label="Permalink: Feature coverage" href="#feature-coverage"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ECC Feature</th>
<th>Copilot equivalent</th>
</tr>
</thead>
<tbody>
<tr>
<td>Coding standards</td>
<td>Always-on via <code>copilot-instructions.md</code></td>
</tr>
<tr>
<td>Security checklist</td>
<td>Always-on + <code>security-review</code> prompt</td>
</tr>
<tr>
<td>Testing / TDD</td>
<td>Always-on + <code>tdd</code> prompt</td>
</tr>
<tr>
<td>Implementation planning</td>
<td><code>plan</code> prompt</td>
</tr>
<tr>
<td>Code review</td>
<td>External PR review via CodeRabbit + Greptile</td>
</tr>
<tr>
<td>Build error resolution</td>
<td><code>build-fix</code> prompt</td>
</tr>
<tr>
<td>Refactoring</td>
<td><code>refactor</code> prompt</td>
</tr>
<tr>
<td>Commit message format</td>
<td>Per-task instruction in <code>settings.json</code></td>
</tr>
<tr>
<td>Hooks / automation</td>
<td>Not supported (Copilot has no hook system)</td>
</tr>
<tr>
<td>Agents / delegation</td>
<td>Not supported (Copilot has no subagent API)</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Limitations</h4><a id="user-content-limitations" class="anchor" aria-label="Permalink: Limitations" href="#limitations"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">GitHub Copilot does not have a hook system or a subagent API, so ECC's hook automations (auto-format, TypeScript check, session persistence, dev-server guard) and agent delegation are unavailable. The instruction and prompt layer still brings the full ECC coding philosophy (standards, security, TDD, and workflow) into every Copilot Chat session.</p>
</details>
<details>
<summary><strong>What changed in v2.0.0</strong></summary>
<p dir="auto">ECC v2.0.0 stabilizes the 2.0 line with the public Hermes operator story, 281 skills, 67 agents, 94 command shims, session adapters, MCP inventory, worktree lifecycle services, orchestrator workflows, and the ECC Discord community.</p>
<ul dir="auto">
<li><a href="/96loveslife/ECC/blob/main/docs/releases/2.0.0/release-notes.md">v2.0.0 release notes</a></li>
<li><a href="/96loveslife/ECC/blob/main/docs/ECC-2.0-REFERENCE-ARCHITECTURE.md">ECC 2.0 reference architecture</a></li>
<li><a href="/96loveslife/ECC/blob/main/docs/HERMES-SETUP.md">Hermes setup guide</a></li>
<li><a href="/96loveslife/ECC/blob/main/docs/MIGRATION-1X-TO-2.0.md">Migration guide from 1.x</a></li>
</ul>
</details>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Token Optimization</h2><a id="user-content-token-optimization" class="anchor" aria-label="Permalink: Token Optimization" href="#token-optimization"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Agent usage can be expensive if you don't manage token consumption. These settings significantly reduce costs without sacrificing quality. Full guide: <a href="/96loveslife/ECC/blob/main/docs/token-optimization.md">docs/token-optimization.md</a>.</p>
<details>
<summary><strong>Recommended settings</strong></summary>
<p dir="auto">Add to <code>~/.claude/settings.json</code>:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;model&quot;: &quot;sonnet&quot;,
  &quot;env&quot;: {
    &quot;MAX_THINKING_TOKENS&quot;: &quot;10000&quot;,
    &quot;CLAUDE_AUTOCOMPACT_PCT_OVERRIDE&quot;: &quot;50&quot;,
    &quot;CLAUDE_CODE_SUBAGENT_MODEL&quot;: &quot;haiku&quot;
  }
}"><pre>{
  <span class="pl-ent">"model"</span>: <span class="pl-s"><span class="pl-pds">"</span>sonnet<span class="pl-pds">"</span></span>,
  <span class="pl-ent">"env"</span>: {
    <span class="pl-ent">"MAX_THINKING_TOKENS"</span>: <span class="pl-s"><span class="pl-pds">"</span>10000<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE"</span>: <span class="pl-s"><span class="pl-pds">"</span>50<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"CLAUDE_CODE_SUBAGENT_MODEL"</span>: <span class="pl-s"><span class="pl-pds">"</span>haiku<span class="pl-pds">"</span></span>
  }
}</pre></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Setting</th>
<th>Default</th>
<th>Recommended</th>
<th>Impact</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>model</code></td>
<td>opus</td>
<td><strong>sonnet</strong></td>
<td>~60% cost reduction; handles 80%+ of coding tasks</td>
</tr>
<tr>
<td><code>MAX_THINKING_TOKENS</code></td>
<td>31,999</td>
<td><strong>10,000</strong></td>
<td>~70% reduction in hidden thinking cost per request</td>
</tr>
<tr>
<td><code>CLAUDE_AUTOCOMPACT_PCT_OVERRIDE</code></td>
<td>95</td>
<td><strong>50</strong></td>
<td>Compacts earlier, better quality in long sessions</td>
</tr>
<tr>
<td><code>ECC_CONTEXT_MONITOR_COST_WARNINGS</code></td>
<td>on</td>
<td><strong>off for subscription users</strong></td>
<td>Suppresses agent-facing API-rate estimate warnings while keeping context/scope/loop warnings</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Switch to Opus only when you need deep architectural reasoning:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="/model opus"><pre class="notranslate"><code>/model opus
</code></pre></div>
</details>
<details>
<summary><strong>Daily workflow commands</strong></summary>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Command</th>
<th>When to Use</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/model sonnet</code></td>
<td>Default for most tasks</td>
</tr>
<tr>
<td><code>/model opus</code></td>
<td>Complex architecture, debugging, deep reasoning</td>
</tr>
<tr>
<td><code>/clear</code></td>
<td>Between unrelated tasks (free, instant reset)</td>
</tr>
<tr>
<td><code>/compact</code></td>
<td>At logical task breakpoints (research done, milestone complete)</td>
</tr>
<tr>
<td><code>/cost</code></td>
<td>Monitor token spending during session</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">If you use a subscription and the context monitor's API-rate estimates are not useful, set <code>ECC_CONTEXT_MONITOR_COST_WARNINGS=off</code>. This only suppresses the agent-facing cost warnings; it does not disable context exhaustion, scope, or loop warnings.</p>
</details>
<details>
<summary><strong>Strategic compaction</strong></summary>
<p dir="auto">The <code>strategic-compact</code> skill suggests <code>/compact</code> at logical breakpoints instead of relying on auto-compaction at 95% context. See <code>skills/strategic-compact/SKILL.md</code> for the full decision guide.</p>
<p dir="auto"><strong>When to compact:</strong></p>
<ul dir="auto">
<li>After research/exploration, before implementation</li>
<li>After completing a milestone, before starting the next</li>
<li>After debugging, before continuing feature work</li>
<li>After a failed approach, before trying a new one</li>
</ul>
<p dir="auto"><strong>When NOT to compact:</strong></p>
<ul dir="auto">
<li>Mid-implementation (you'll lose variable names, file paths, partial state)</li>
</ul>
</details>
<details>
<summary><strong>Context window management</strong></summary>
<p dir="auto"><strong>Critical:</strong> Don't enable all MCPs at once. Each MCP tool description consumes tokens from your 200k window, potentially reducing it to ~70k.</p>
<ul dir="auto">
<li>Keep under 10 MCPs enabled per project</li>
<li>Keep under 80 tools active</li>
<li>Use <code>/mcp</code> to disable unused Claude Code MCP servers; those runtime choices persist in <code>~/.claude.json</code></li>
<li>Use <code>ECC_DISABLED_MCPS</code> only to filter ECC-generated MCP configs during install/sync flows</li>
<li>If context is getting heavy, run <code>/context-budget</code> and remove rules you do not need</li>
</ul>
<p dir="auto"><strong>Agent teams cost warning:</strong> Agent Teams spawns multiple context windows. Each teammate consumes tokens independently. Only use for tasks where parallelism provides clear value (multi-module work, parallel reviews). For simple sequential tasks, subagents are more token-efficient.</p>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Requirements</h2><a id="user-content-requirements" class="anchor" aria-label="Permalink: Requirements" href="#requirements"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<details>
<summary><strong>Claude Code CLI version + hooks auto-loading behavior</strong></summary>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Claude Code CLI version</h3><a id="user-content-claude-code-cli-version" class="anchor" aria-label="Permalink: Claude Code CLI version" href="#claude-code-cli-version"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><strong>Minimum version: v2.1.0 or later.</strong> The plugin requires Claude Code CLI v2.1.0+ due to changes in how the plugin system handles hooks.</p>
<p dir="auto">Check your version:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="claude --version"><pre>claude --version</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Important: hooks auto-loading behavior</h3><a id="user-content-important-hooks-auto-loading-behavior" class="anchor" aria-label="Permalink: Important: hooks auto-loading behavior" href="#important-hooks-auto-loading-behavior"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<blockquote>
<p dir="auto">WARNING: <strong>For Contributors:</strong> Do NOT add a <code>"hooks"</code> field to <code>.claude-plugin/plugin.json</code>. This is enforced by a regression test.</p>
</blockquote>
<p dir="auto">Claude Code v2.1+ <strong>automatically loads</strong> <code>hooks/hooks.json</code> from any installed plugin by convention. Explicitly declaring it in <code>plugin.json</code> causes a duplicate detection error:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Duplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file"><pre class="notranslate"><code>Duplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file
</code></pre></div>
<p dir="auto"><strong>History:</strong> This has caused repeated fix/revert cycles in this repo (<a href="https://github.com/affaan-m/ECC/issues/29" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/29/hovercard">#29</a>, <a href="https://github.com/affaan-m/ECC/issues/52" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/52/hovercard">#52</a>, <a href="https://github.com/affaan-m/ECC/issues/103" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/103/hovercard">#103</a>). The behavior changed between Claude Code versions, leading to confusion. There is now a regression test to prevent this from being reintroduced.</p>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Security</h2><a id="user-content-security" class="anchor" aria-label="Permalink: Security" href="#security"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Install ECC only from official sources:</p>
<ul dir="auto">
<li>GitHub repository: <a href="https://github.com/affaan-m/ECC">https://github.com/affaan-m/ECC</a></li>
<li>Claude Code plugin: <code>ecc@ecc</code></li>
<li>npm packages: <a href="https://www.npmjs.com/package/ecc-universal" rel="nofollow"><code>ecc-universal</code></a> and <a href="https://www.npmjs.com/package/ecc-agentshield" rel="nofollow"><code>ecc-agentshield</code></a></li>
<li>GitHub App: <a href="https://github.com/apps/ecc-tools">https://github.com/apps/ecc-tools</a></li>
<li>Website: <a href="https://ecc.tools" rel="nofollow">https://ecc.tools</a></li>
</ul>
<p dir="auto">Scan a project with an already installed, reviewed AgentShield binary (see <a href="#agentshield-runner-provenance">runner provenance</a>):</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="agentshield scan --path ."><pre>agentshield scan --path <span class="pl-c1">.</span></pre></div>
<ul dir="auto">
<li><strong>Report a vulnerability.</strong> Use the private process in <a href="/96loveslife/ECC/blob/main/SECURITY.md">SECURITY.md</a> (GitHub private vulnerability reporting). Please do not open public issues for security reports.</li>
<li><strong>Built-in guardrails.</strong> GateGuard gates destructive shell commands (including <code>rm</code>, force/path <code>git checkout</code>, and destructive <code>find -exec</code>) before they run; the supply-chain IOC scanner runs in CI; and AgentShield audits your own agent, hook, MCP, permission, and secret surfaces (<code>/security-scan</code>).</li>
</ul>
<details>
<summary><strong>Hooks, MCP servers, and context controls</strong></summary>
<p dir="auto">Hooks can run shell commands, MCP servers can hold credentials, and project instructions can enter an agent's context. Treat all three as executable configuration.</p>
<p dir="auto">Do not copy raw <code>hooks/hooks.json</code> into <code>~/.claude/settings.json</code> after a plugin install. Modern Claude Code versions load plugin hooks automatically, and a second copy can make them fire twice.</p>
<p dir="auto">Use <code>/mcp</code> for Claude Code runtime disables; Claude Code persists those choices in <code>~/.claude.json</code>.</p>
<p dir="auto"><code>ECC_DISABLED_MCPS</code> is an ECC install/sync filter, not a live Claude Code toggle.</p>
<p dir="auto">If context is getting heavy, run <code>/context-budget</code>, remove rules you do not need, and disable unused MCP servers. See the <a href="/96loveslife/ECC/blob/main/docs/token-optimization.md">token optimization guide</a>.</p>
</details>
<p dir="auto">Security references:</p>
<ul dir="auto">
<li><a href="/96loveslife/ECC/blob/main/SECURITY.md">Security policy</a></li>
<li><a href="/96loveslife/ECC/blob/main/the-security-guide.md">Security guide</a></li>
<li><a href="/96loveslife/ECC/blob/main/docs/MCP-CONNECTOR-POLICY.md">MCP connector policy</a></li>
<li><a href="/96loveslife/ECC/blob/main/docs/security/supply-chain-incident-response.md">Supply-chain incident response</a></li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Ecosystem Tools</h2><a id="user-content-ecosystem-tools" class="anchor" aria-label="Permalink: Ecosystem Tools" href="#ecosystem-tools"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<details>
<summary><strong>Skill Creator: generate skills from your git history</strong></summary>
<p dir="auto">Two ways to generate skills from your repository:</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Option A: Local Analysis (Built-in)</h3><a id="user-content-option-a-local-analysis-built-in" class="anchor" aria-label="Permalink: Option A: Local Analysis (Built-in)" href="#option-a-local-analysis-built-in"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Use the <code>/skill-create</code> command for local analysis without external services:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="/skill-create                    # Analyze current repo
/skill-create --instincts        # Also generate instincts for continuous-learning-v2"><pre>/skill-create                    <span class="pl-c"><span class="pl-c">#</span> Analyze current repo</span>
/skill-create --instincts        <span class="pl-c"><span class="pl-c">#</span> Also generate instincts for continuous-learning-v2</span></pre></div>
<p dir="auto">This analyzes your git history locally and generates SKILL.md files.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Option B: GitHub App (Advanced)</h3><a id="user-content-option-b-github-app-advanced" class="anchor" aria-label="Permalink: Option B: GitHub App (Advanced)" href="#option-b-github-app-advanced"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">For advanced features (10k+ commits, auto-PRs, team sharing):</p>
<p dir="auto"><a href="https://github.com/apps/ecc-tools">Install ECC Tools GitHub App</a> | <a href="https://ecc.tools" rel="nofollow">ecc.tools</a></p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Comment on any issue:
/ecc-tools analyze"><pre><span class="pl-c"><span class="pl-c">#</span> Comment on any issue:</span>
/ecc-tools analyze</pre></div>
<p dir="auto">Both options create:</p>
<ul dir="auto">
<li><strong>SKILL.md files</strong>: Ready-to-use skills for the active harness</li>
<li><strong>Instinct collections</strong>: For continuous-learning-v2</li>
<li><strong>Pattern extraction</strong>: Learns from your commit history</li>
</ul>
</details>
<details>
<summary><strong>AgentShield: security auditor for agent configs</strong></summary>
<blockquote>
<p dir="auto">Built at the Claude Code Hackathon (Cerebral Valley x Anthropic, Feb 2026). 1282 tests, 98% coverage, 102 static analysis rules.</p>
</blockquote>
<p dir="auto">Scan your agent configuration for vulnerabilities, misconfigurations, and injection risks.</p>
<p dir="auto"><a id="user-content-agentshield-runner-provenance"></a>
<strong>Runner provenance:</strong> these commands require an already installed, reviewed AgentShield binary from <code>ecc-agentshield</code>. The <a href="https://www.npmjs.com/package/ecc-agentshield" rel="nofollow">official package</a> documents the <code>agentshield</code> CLI. Record the selected release, reviewed source and verified package integrity in your installation record. Registry publication alone does not establish an audit; ECC does not supply an audited AgentShield pin here. Do not substitute an unversioned one-shot download. <code>/security-scan</code> is workflow guidance and has the same runner prerequisite.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Scan only the intended project directory
agentshield scan --path .

# Auto-fix safe issues
agentshield scan --path . --fix

# Deep analysis with three Opus 4.6 agents
agentshield scan --path . --opus --stream

# Generate secure config from scratch
agentshield init"><pre><span class="pl-c"><span class="pl-c">#</span> Scan only the intended project directory</span>
agentshield scan --path <span class="pl-c1">.</span>

<span class="pl-c"><span class="pl-c">#</span> Auto-fix safe issues</span>
agentshield scan --path <span class="pl-c1">.</span> --fix

<span class="pl-c"><span class="pl-c">#</span> Deep analysis with three Opus 4.6 agents</span>
agentshield scan --path <span class="pl-c1">.</span> --opus --stream

<span class="pl-c"><span class="pl-c">#</span> Generate secure config from scratch</span>
agentshield init</pre></div>
<p dir="auto"><strong>What it scans:</strong> CLAUDE.md, settings.json, MCP configs, hooks, agent definitions, and skills across 5 categories: secrets detection (14 patterns), permission auditing, hook injection analysis, MCP server risk profiling, and agent config review.</p>
<p dir="auto"><strong>The <code>--opus</code> flag</strong> runs three Claude Opus 4.6 agents in a red-team/blue-team/auditor pipeline. The attacker finds exploit chains, the defender evaluates protections, and the auditor synthesizes both into a prioritized risk assessment. Adversarial reasoning, not just pattern matching.</p>
<p dir="auto"><strong>Output formats:</strong> Terminal (color-graded A-F), JSON (CI pipelines), Markdown, HTML. Exit code 2 on critical findings for build gates.</p>
<p dir="auto">Use <code>/security-scan</code> in Claude Code to run it, or add to CI with the <a href="https://github.com/affaan-m/agentshield">GitHub Action</a>.</p>
<p dir="auto"><a href="https://github.com/affaan-m/agentshield">GitHub</a> | <a href="https://www.npmjs.com/package/ecc-agentshield" rel="nofollow">npm</a></p>
</details>
<details>
<summary><strong>Continuous Learning v2: instincts</strong></summary>
<p dir="auto">The instinct-based learning system automatically learns your patterns:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="/instinct-status        # Show learned instincts with confidence
/instinct-import &lt;file&gt; # Import instincts from others
/instinct-export        # Export your instincts for sharing
/evolve                 # Cluster related instincts into skills"><pre>/instinct-status        <span class="pl-c"><span class="pl-c">#</span> Show learned instincts with confidence</span>
/instinct-import <span class="pl-k">&lt;</span>file<span class="pl-k">&gt;</span> <span class="pl-c"><span class="pl-c">#</span> Import instincts from others</span>
/instinct-export        <span class="pl-c"><span class="pl-c">#</span> Export your instincts for sharing</span>
/evolve                 <span class="pl-c"><span class="pl-c">#</span> Cluster related instincts into skills</span></pre></div>
<p dir="auto">See <code>skills/continuous-learning-v2/</code> for full documentation. Keep <code>continuous-learning/</code> only when you explicitly want the legacy v1 Stop-hook learned-skill flow.</p>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Troubleshooting</h2><a id="user-content-troubleshooting" class="anchor" aria-label="Permalink: Troubleshooting" href="#troubleshooting"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<details>
<summary><strong>ECC appears twice or hooks fire twice</strong></summary>
<p dir="auto">The usual cause is installing the Claude plugin and then running <code>./install.sh --profile full</code> on top of it.</p>
<ol dir="auto">
<li>Remove the Claude Code plugin install.</li>
<li>Run <code>node scripts/ecc.js uninstall --dry-run</code> from the ECC checkout.</li>
<li>Remove extra rule folders you manually copied and no longer want.</li>
<li>Reinstall once, using one path.</li>
</ol>
<p dir="auto">For hook-specific checks, see the <a href="/96loveslife/ECC/blob/main/hooks/README.md">hooks README</a>.</p>
</details>
<details>
<summary><strong>My hooks aren't working / "Duplicate hooks file" errors</strong></summary>
<p dir="auto"><strong>Do NOT add a <code>"hooks"</code> field to <code>.claude-plugin/plugin.json</code>.</strong> Claude Code v2.1+ automatically loads <code>hooks/hooks.json</code> from installed plugins. Explicitly declaring it causes duplicate detection errors. See <a href="https://github.com/affaan-m/ECC/issues/29" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/29/hovercard">#29</a>, <a href="https://github.com/affaan-m/ECC/issues/52" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/52/hovercard">#52</a>, <a href="https://github.com/affaan-m/ECC/issues/103" data-hovercard-type="issue" data-hovercard-url="/affaan-m/ECC/issues/103/hovercard">#103</a>.</p>
</details>
<details>
<summary><strong>Codex marketplace installs but skills do not load</strong></summary>
<p dir="auto">Run the cache check from an ECC checkout:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="node scripts/codex/check-plugin-cache.js"><pre>node scripts/codex/check-plugin-cache.js</pre></div>
<p dir="auto">If it reports unresolved parent references, refresh the native cache with <code>codex plugin marketplace upgrade ecc</code>, run <code>codex plugin add ecc@ecc</code> again, and restart Codex. Registration in <code>codex plugin list</code> confirms the marketplace entry, while the cache check verifies that the installed manifest can resolve its skills, MCP configuration, and assets. Use <code>bash scripts/sync-ecc-to-codex.sh</code> only when you intentionally need the legacy copied-configuration compatibility path.</p>
</details>
<p dir="auto">More answers: <a href="/96loveslife/ECC/blob/main/TROUBLESHOOTING.md">TROUBLESHOOTING.md</a> covers memory, hooks, installation, performance, and common error messages. <a href="/96loveslife/ECC/blob/main/docs/TROUBLESHOOTING.md">docs/TROUBLESHOOTING.md</a> tracks workarounds for open Claude Code bugs.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Running Tests</h2><a id="user-content-running-tests" class="anchor" aria-label="Permalink: Running Tests" href="#running-tests"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The plugin includes a comprehensive test suite:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Run all tests
node tests/run-all.js

# Run individual test files
node tests/lib/utils.test.js
node tests/lib/package-manager.test.js
node tests/hooks/hooks.test.js"><pre><span class="pl-c"><span class="pl-c">#</span> Run all tests</span>
node tests/run-all.js

<span class="pl-c"><span class="pl-c">#</span> Run individual test files</span>
node tests/lib/utils.test.js
node tests/lib/package-manager.test.js
node tests/hooks/hooks.test.js</pre></div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Background</h2><a id="user-content-background" class="anchor" aria-label="Permalink: Background" href="#background"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">I've been using Claude Code since the experimental rollout. Won the Anthropic x Forum Ventures hackathon in Sep 2025 with <a href="https://x.com/DRodriguezFX" rel="nofollow">@DRodriguezFX</a>, built <a href="https://zenith.chat" rel="nofollow">zenith.chat</a> entirely with agentic workflows.</p>
<p dir="auto">These configs are battle-tested across multiple production applications.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Community and Project</h2><a id="user-content-community-and-project" class="anchor" aria-label="Permalink: Community and Project" href="#community-and-project"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<details>
<summary><strong>Sponsors and ECC Pro</strong></summary>
<p dir="auto">ECC stays free because sponsors and Pro users fund the work. Sponsor logos are at the top of this README; the full roster and tiers are in <a href="/96loveslife/ECC/blob/main/SPONSORS.md">SPONSORS.md</a>.</p>
<p dir="auto">ECC Pro adds private-repo analysis, PR-triggered audits, AgentShield-backed scanning, automatic push and PR checks, pooled team usage, and priority support through the hosted GitHub App.</p>
<markdown-accessiblity-table><table>
<tbody><tr>
<td width="25%" align="center"><a href="https://ecc.tools/pricing" rel="nofollow"><strong>ECC Pro</strong><br><sub>Hosted GitHub App for private repos</sub></a></td>
<td width="25%" align="center"><a href="https://github.com/sponsors/affaan-m"><strong>Sponsor ECC</strong><br><sub>Fund the OSS work</sub></a></td>
<td width="25%" align="center"><a href="https://github.com/affaan-m/ECC/discussions"><strong>Community</strong><br><sub>Q&amp;A, ideas, and Show and Tell</sub></a></td>
<td width="25%" align="center"><a href="https://github.com/apps/ecc-tools"><strong>GitHub App</strong><br><sub>PR audits and hosted workflows</sub></a></td>
</tr>
</tbody></table></markdown-accessiblity-table>
<p dir="auto"><a href="https://github.com/sponsors/affaan-m">Become a sponsor</a> | <a href="/96loveslife/ECC/blob/main/SPONSORS.md">Sponsor tiers</a> | <a href="/96loveslife/ECC/blob/main/SPONSORING.md">Sponsorship program</a></p>
</details>
<details>
<summary><strong>Contributing</strong></summary>
<p dir="auto">Contributions are welcome across skills, agents, rules, hooks, docs, tests, adapters, and security improvements.</p>
<ul dir="auto">
<li><a href="/96loveslife/ECC/blob/main/CONTRIBUTING.md">Contributing guide</a></li>
<li><a href="/96loveslife/ECC/blob/main/docs/SKILL-DEVELOPMENT-GUIDE.md">Skill development guide</a></li>
<li><a href="/96loveslife/ECC/blob/main/docs/SKILL-PLACEMENT-POLICY.md">Skill placement policy</a></li>
<li><a href="/96loveslife/ECC/blob/main/COMMANDS-QUICK-REF.md">Command quick reference</a></li>
</ul>
<p dir="auto">The short version:</p>
<ol dir="auto">
<li>Fork the repo</li>
<li>Create your skill in <code>skills/your-skill-name/SKILL.md</code> (with YAML frontmatter)</li>
<li>Or create an agent in <code>agents/your-agent.md</code></li>
<li>Submit a PR with a clear description of what it does and when to use it</li>
</ol>
<p dir="auto"><strong>Ideas for contributions:</strong></p>
<ul dir="auto">
<li>Language-specific skills (Rust, C#, Kotlin, Java): Go, Python, Perl, Swift, TypeScript, and HarmonyOS/ArkTS already included</li>
<li>Framework-specific configs (Rails, FastAPI): Django, NestJS, Spring Boot, and Laravel already included</li>
<li>DevOps agents (Kubernetes, Terraform, AWS, Docker)</li>
<li>Testing strategies (different frameworks, visual regression)</li>
<li>Domain-specific knowledge (ML, data engineering, mobile)</li>
</ul>
</details>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Links</h2><a id="user-content-links" class="anchor" aria-label="Permalink: Links" href="#links"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li><strong>Shorthand Guide (Start Here):</strong> <a href="https://x.com/affaan/status/2012378465664745795" rel="nofollow">The Shorthand Guide to ECC</a></li>
<li><strong>Longform Guide (Advanced):</strong> <a href="https://x.com/affaan/status/2014040193557471352" rel="nofollow">The Longform Guide to ECC</a></li>
<li><strong>Security Guide:</strong> <a href="/96loveslife/ECC/blob/main/the-security-guide.md">Security Guide</a> | <a href="https://x.com/affaan/status/2033263813387223421" rel="nofollow">Thread</a></li>
<li><strong>Follow:</strong> <a href="https://x.com/affaan" rel="nofollow">@affaan</a></li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">License</h2><a id="user-content-license" class="anchor" aria-label="Permalink: License" href="#license"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">MIT. Use it freely, adapt it to your workflow, and contribute back when you can.</p>
<p dir="auto"><strong>Star this repo if it helps. Read the guides. Build something great.</strong></p>
</article></div><div class="d-none"></div></section></div></div></div> </div> <!-- --> </div></div></div></div></div></div><div class="ScrollMarksContainer-module__scrollMarksContainer__Eu7uU" id="find-result-marks-container"></div><div class="d-none"></div><div class="d-none"></div></div> <!-- --> <!-- --> </div>
</react-app>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer f6 color-fg-muted color-border-subtle tmp-pt-7 tmp-pb-6 p-responsive" role="contentinfo"  >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
      <span>
        &copy; 2026 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">


          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>


            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
            </li>

            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
            </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          
<li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
      Manage cookies
    </button>
  </cookie-consent-link>
</li>

  <li class="mx-2">
    <cookie-consent-link>
      <button
        type="button"
        class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
        data-action="click:cookie-consent-link#showConsentManagement"
        data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
      >
        Do not share my personal information
      </button>
    </cookie-consent-link>
  </li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="true"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

